{"id":33,"date":"2026-08-10T18:35:45","date_gmt":"2026-08-10T14:35:45","guid":{"rendered":"https:\/\/markunox.com\/?page_id=33"},"modified":"2026-09-26T05:15:31","modified_gmt":"2026-09-26T01:15:31","slug":"home","status":"publish","type":"page","link":"https:\/\/markunox.com\/ar\/home\/","title":{"rendered":"\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"33\" class=\"elementor elementor-33\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-642f938 e-flex e-con-boxed e-con e-parent\" data-id=\"642f938\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-51b4d88 e-grid e-con-boxed e-con e-child\" data-id=\"51b4d88\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5460623 e-con-full e-flex e-con e-child\" data-id=\"5460623\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-df43387 elementor-widget elementor-widget-image\" data-id=\"df43387\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"116\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-1024x148.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1057\" alt=\"AvaTrade Broker Logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-1024x148.webp 1024w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-300x43.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-768x111.webp 768w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-1536x222.webp 1536w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-2048x296.webp 1920w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/site-logo-20y-on-light-1-18x3.webp 18w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f612a6b e-con-full elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child\" data-id=\"f612a6b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<h2 data-interaction-id=\"80831bd\" class=\"e-80831bd-e8d5823 e-heading-base e-default-h2\" data-e-type=\"widget\" data-id=\"80831bd\">Top Forex Brokers &amp; Cryptocurrency Exchanges<\/h2>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fc10eb elementor-widget elementor-widget-text-editor\" data-id=\"3fc10eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"232\" data-end=\"367\"><strong data-start=\"232\" data-end=\"367\">Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights.<\/strong><\/p><p data-start=\"369\" data-end=\"536\">\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1bfe2a5 e-con-full e-flex e-con e-child\" data-id=\"1bfe2a5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8676f41 elementor-widget elementor-widget-image\" data-id=\"8676f41\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"593\" height=\"187\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo_name_light.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1045\" alt=\"Volurr Brokerage logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo_name_light.webp 593w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo_name_light-300x95.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo_name_light-18x6.webp 18w\" sizes=\"(max-width: 593px) 100vw, 593px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5746991 e-con-full e-flex e-con e-child\" data-id=\"5746991\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0a8160b elementor-widget elementor-widget-image\" data-id=\"0a8160b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"259\" height=\"50\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/IC-logo-fsa.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1044\" alt=\"IC Markets broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/IC-logo-fsa.webp 259w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/IC-logo-fsa-18x3.webp 18w\" sizes=\"(max-width: 259px) 100vw, 259px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cb5700a e-con-full e-flex e-con e-child\" data-id=\"cb5700a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e317f6d elementor-widget elementor-widget-image\" data-id=\"e317f6d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"442\" height=\"204\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/download.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1043\" alt=\"CPT Markets broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/download.webp 442w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/download-300x138.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/download-18x8.webp 18w\" sizes=\"(max-width: 442px) 100vw, 442px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-202ed5a e-con-full e-flex e-con e-child\" data-id=\"202ed5a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2292eb0 elementor-widget elementor-widget-image\" data-id=\"2292eb0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"152\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/header-logo-white-1024x195.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1042\" alt=\"StarTrader broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/header-logo-white-1024x195.webp 1024w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/header-logo-white-300x57.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/header-logo-white-768x146.webp 768w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/header-logo-white-18x3.webp 18w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/header-logo-white.webp 1292w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-fc0eadb e-con-full e-flex e-con e-child\" data-id=\"fc0eadb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-91307c4 elementor-widget elementor-widget-image\" data-id=\"91307c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"506\" height=\"117\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1041\" alt=\"Vantage broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo.webp 506w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo-300x69.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo-18x4.webp 18w\" sizes=\"(max-width: 506px) 100vw, 506px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-76b5e31 e-con-full e-flex e-con e-child\" data-id=\"76b5e31\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-63b8ac6 elementor-widget elementor-widget-image\" data-id=\"63b8ac6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"155\" height=\"39\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/atfx_doe_logo_white.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1040\" alt=\"ATFX broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/atfx_doe_logo_white.webp 155w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/atfx_doe_logo_white-150x39.webp 150w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/atfx_doe_logo_white-18x5.webp 18w\" sizes=\"(max-width: 155px) 100vw, 155px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c7a3962 e-con-full e-flex e-con e-child\" data-id=\"c7a3962\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8a69705 elementor-widget elementor-widget-image\" data-id=\"8a69705\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"384\" height=\"138\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo-2024-new.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1038\" alt=\"FGTC broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo-2024-new.webp 384w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo-2024-new-300x108.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/logo-2024-new-18x6.webp 18w\" sizes=\"(max-width: 384px) 100vw, 384px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-55db1ed e-con-full e-flex e-con e-child\" data-id=\"55db1ed\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0f3af98 elementor-widget elementor-widget-image\" data-id=\"0f3af98\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"218\" src=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/fxcm-logo-plain-blue.webp\" class=\"elementor-animation-grow attachment-large size-large wp-image-1036\" alt=\"FXCM broker logo\" srcset=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/fxcm-logo-plain-blue.webp 917w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/fxcm-logo-plain-blue-300x82.webp 300w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/fxcm-logo-plain-blue-768x209.png 768w, https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/fxcm-logo-plain-blue-18x5.png 18w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\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\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5050e03 e-con e-atomic-element e-flexbox-base e-default-div e-d546a85 \" data-id=\"5050e03\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"5050e03\" data-e-type=\"e-flexbox\" data-id=\"5050e03\">\n    \t\t<div class=\"elementor-element elementor-element-895557c elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget elementor-widget-html\" data-id=\"895557c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"markunox-iframe-wrapper\" id=\"mx-broker-globe\">\r\n\r\n  <iframe\r\n    src=\"https:\/\/markunox.com\/markunox-globe\/index.html?v=20260926-4\"\r\n    title=\"MARKUNOX Global Financial Intelligence\"\r\n    scrolling=\"no\"\r\n    allow=\"fullscreen\">\r\n<\/iframe>\r\n\r\n\r\n  <div class=\"mx-search\">\r\n\r\n    <label class=\"mx-search-box\">\r\n\r\n      <svg\r\n        viewBox=\"0 0 24 24\"\r\n        fill=\"none\"\r\n        stroke=\"currentColor\"\r\n        stroke-width=\"1.7\"\r\n        aria-hidden=\"true\">\r\n\r\n        <circle cx=\"10.8\" cy=\"10.8\" r=\"6.8\"><\/circle>\r\n\r\n        <path d=\"m16 16 4.5 4.5\"><\/path>\r\n\r\n      <\/svg>\r\n\r\n\r\n      <input\r\n        type=\"search\"\r\n        aria-label=\"Search brokers and exchanges\"\r\n        placeholder=\"Search broker or exchange...\"\r\n        autocomplete=\"off\"\r\n        spellcheck=\"false\"\r\n        enterkeyhint=\"search\">\r\n\r\n\r\n      <span\r\n        class=\"mx-search-dot\"\r\n        aria-hidden=\"true\">\r\n      <\/span>\r\n\r\n    <\/label>\r\n\r\n\r\n    <div\r\n      class=\"mx-results\"\r\n      role=\"listbox\"\r\n      hidden>\r\n    <\/div>\r\n\r\n\r\n    <p\r\n      class=\"mx-status\"\r\n      role=\"status\"\r\n      aria-live=\"polite\">\r\n    <\/p>\r\n\r\n\r\n    <div\r\n      class=\"mx-card\"\r\n      hidden>\r\n\r\n      <button\r\n        class=\"mx-close\"\r\n        type=\"button\"\r\n        aria-label=\"Close profile details\">\r\n        \u00d7\r\n      <\/button>\r\n\r\n\r\n      <div class=\"mx-eyebrow\">\r\n        MARKUNOX INTELLIGENCE\r\n      <\/div>\r\n\r\n\r\n      <h3 class=\"mx-name\"><\/h3>\r\n\r\n\r\n      <div class=\"mx-location\"><\/div>\r\n\r\n\r\n      <p class=\"mx-description\"><\/p>\r\n\r\n\r\n      <a\r\n        class=\"mx-link\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n        hidden>\r\n\r\n        View profile\r\n\r\n        <span aria-hidden=\"true\">\r\n          \u2197\r\n        <\/span>\r\n\r\n      <\/a>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n\r\n\r\n\r\n<style id=\"mx-stable-antiflash-style\">\r\n#mx-broker-globe > iframe {\r\n    opacity: 0 !important;\r\n    visibility: hidden !important;\r\n}\r\n#mx-broker-globe.mx-stable-ready > iframe {\r\n    opacity: 1 !important;\r\n    visibility: visible !important;\r\n    transition: opacity .14s ease !important;\r\n}\r\n<\/style>\r\n\r\n<style>\r\n\r\n#mx-broker-globe {\r\n  position: relative;\r\n  display: block;\r\n\r\n  width: 100%;\r\n  min-height: 750px;\r\n  height: auto;\r\n\r\n  margin: 0;\r\n  padding: 0;\r\n\r\n  border: 0;\r\n\r\n  isolation: isolate;\r\n}\r\n\r\n\r\n#mx-broker-globe,\r\n#mx-broker-globe * {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\r\n#mx-broker-globe iframe {\r\n  display: block;\r\n\r\n  width: 100%;\r\n  height: 900px;\r\n  max-width: none !important;\r\n\r\n  margin: 0;\r\n  padding: 0;\r\n\r\n  border: 0;\r\n}\r\n\r\n\r\n#mx-broker-globe [hidden] {\r\n  display: none !important;\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   SEARCH\r\n========================================= *\/\r\n\r\n#mx-broker-globe .mx-search {\r\n  position: absolute;\r\n\r\n  top: 66px;\r\n  left: 18px;\r\n\r\n  z-index: 10;\r\n\r\n  width: 180px;\r\n  max-width: calc(100% - 36px);\r\n\r\n  direction: ltr;\r\n  text-align: left;\r\n\r\n  font-family: Arial, sans-serif;\r\n\r\n  color: #f3f7ff;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-search-box {\r\n  display: flex;\r\n\r\n  align-items: center;\r\n\r\n  gap: 7px;\r\n\r\n  width: 100%;\r\n  height: 32px;\r\n\r\n  padding: 0 9px;\r\n  margin: 0;\r\n\r\n  background: rgba(7, 13, 25, 0.94);\r\n\r\n  border: 1px solid rgba(7, 223, 226, 0.25);\r\n\r\n  border-radius: 8px;\r\n\r\n  backdrop-filter: blur(14px);\r\n\r\n  -webkit-backdrop-filter:\r\n    blur(14px);\r\n\r\n  box-shadow:\r\n    0 5px 18px rgba(0, 0, 0, 0.18);\r\n\r\n  transition:\r\n    border-color 0.2s ease,\r\n    box-shadow 0.2s ease;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-search-box:focus-within {\r\n  border-color: #07dfe2;\r\n\r\n  box-shadow:\r\n    0 0 0 1px rgba(7, 223, 226, 0.12),\r\n    0 5px 18px rgba(0, 0, 0, 0.18);\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-search-box svg {\r\n  width: 14px;\r\n  height: 14px;\r\n\r\n  flex-shrink: 0;\r\n\r\n  color: #07dfe2;\r\n}\r\n\r\n\r\n#mx-broker-globe input {\r\n  display: block;\r\n\r\n  flex: 1;\r\n\r\n  width: 100%;\r\n  min-width: 0;\r\n\r\n  height: 100%;\r\n  min-height: 0;\r\n\r\n  padding: 0;\r\n  margin: 0;\r\n\r\n  border: 0;\r\n  border-radius: 0;\r\n\r\n  outline: none;\r\n\r\n  background: transparent;\r\n\r\n  box-shadow: none;\r\n\r\n  color: #ffffff;\r\n\r\n  font: inherit;\r\n\r\n  font-size: 12px;\r\n\r\n  letter-spacing: normal;\r\n}\r\n\r\n\r\n#mx-broker-globe input::placeholder {\r\n  color: #8c9bb1;\r\n\r\n  opacity: 1;\r\n}\r\n\r\n\r\n#mx-broker-globe input::-webkit-search-cancel-button {\r\n  cursor: pointer;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-search-dot {\r\n  width: 4px;\r\n  height: 4px;\r\n\r\n  flex-shrink: 0;\r\n\r\n  border-radius: 50%;\r\n\r\n  background: #07dfe2;\r\n\r\n  box-shadow:\r\n    0 0 8px rgba(7, 223, 226, 0.65);\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   RESULTS + CARD\r\n========================================= *\/\r\n\r\n#mx-broker-globe .mx-results,\r\n#mx-broker-globe .mx-card {\r\n  width: 260px;\r\n\r\n  max-width: calc(100vw - 60px);\r\n\r\n  margin-top: 8px;\r\n\r\n  padding: 6px;\r\n\r\n  background: rgba(7, 13, 25, 0.97);\r\n\r\n  border:\r\n    1px solid rgba(85, 132, 197, 0.30);\r\n\r\n  border-radius: 12px;\r\n\r\n  box-shadow:\r\n    0 12px 32px rgba(0, 0, 0, 0.30);\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-results {\r\n  max-height: 220px;\r\n\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n\r\n  overscroll-behavior: contain;\r\n\r\n  scrollbar-width: none;\r\n\r\n  -ms-overflow-style: none;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-results::-webkit-scrollbar {\r\n  display: none;\r\n\r\n  width: 0;\r\n  height: 0;\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   RESULT ITEM\r\n========================================= *\/\r\n\r\n#mx-broker-globe .mx-result {\r\n  display: block;\r\n\r\n  width: 100%;\r\n\r\n  padding: 10px;\r\n\r\n  margin: 0;\r\n\r\n  border: 0;\r\n\r\n  border-radius: 8px;\r\n\r\n  background: transparent;\r\n\r\n  color: #ffffff;\r\n\r\n  text-align: left;\r\n\r\n  text-transform: none;\r\n\r\n  font: inherit;\r\n\r\n  font-size: 13px;\r\n  line-height: 1.4;\r\n\r\n  letter-spacing: normal;\r\n\r\n  cursor: pointer;\r\n\r\n  transition:\r\n    background 0.18s ease,\r\n    outline-color 0.18s ease;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-result:hover,\r\n#mx-broker-globe .mx-result:focus-visible {\r\n  background:\r\n    rgba(5, 97, 224, 0.20);\r\n\r\n  outline:\r\n    1px solid #07dfe2;\r\n\r\n  outline-offset: -1px;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-result-name {\r\n  display: block;\r\n\r\n  color: #ffffff;\r\n\r\n  font-size: 13px;\r\n\r\n  font-weight: 600;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-result small {\r\n  display: block;\r\n\r\n  margin-top: 4px;\r\n\r\n  color: #91a1b8;\r\n\r\n  font-size: 11px;\r\n\r\n  line-height: 1.4;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-result-score {\r\n  display: inline-block;\r\n\r\n  margin-top: 5px;\r\n\r\n  color: #07dfe2;\r\n\r\n  font-size: 10px;\r\n\r\n  font-weight: 600;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\/* =========================================\r\n   UNIFIED SEARCH RESULT CONTENT\r\n========================================= *\/\r\n\r\n#mx-broker-globe .mx-result-main {\r\n  display: grid;\r\n  grid-template-columns: 34px minmax(0, 1fr);\r\n  align-items: center;\r\n  gap: 9px;\r\n}\r\n\r\n#mx-broker-globe .mx-result-logo {\r\n  display: grid;\r\n  place-items: center;\r\n  width: 34px;\r\n  height: 34px;\r\n  overflow: hidden;\r\n  border: 1px solid rgba(85, 132, 197, 0.24);\r\n  border-radius: 8px;\r\n  background: rgba(255, 255, 255, 0.025);\r\n}\r\n\r\n#mx-broker-globe .mx-result-logo img {\r\n  display: block;\r\n  width: 28px;\r\n  height: 28px;\r\n  object-fit: contain;\r\n}\r\n\r\n#mx-broker-globe .mx-result-logo-fallback {\r\n  color: #07dfe2;\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n}\r\n\r\n#mx-broker-globe .mx-result-copy {\r\n  min-width: 0;\r\n}\r\n\r\n#mx-broker-globe .mx-result-topline {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  min-width: 0;\r\n}\r\n\r\n#mx-broker-globe .mx-result-name {\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n#mx-broker-globe .mx-result-type {\r\n  flex-shrink: 0;\r\n  padding: 2px 5px;\r\n  border: 1px solid rgba(7, 223, 226, 0.22);\r\n  border-radius: 999px;\r\n  color: #7cecee;\r\n  background: rgba(7, 223, 226, 0.055);\r\n  font-size: 8px;\r\n  font-weight: 700;\r\n  letter-spacing: 0.35px;\r\n  text-transform: uppercase;\r\n}\r\n\r\n#mx-broker-globe .mx-result-verified {\r\n  flex-shrink: 0;\r\n  width: 5px;\r\n  height: 5px;\r\n  border-radius: 50%;\r\n  background: #34d399;\r\n  box-shadow: 0 0 7px rgba(52, 211, 153, 0.6);\r\n}\r\n\r\n\r\n\/* =========================================\r\n   EMPTY \/ STATUS\r\n========================================= *\/\r\n\r\n#mx-broker-globe .mx-empty {\r\n  padding: 12px;\r\n\r\n  color: #91a1b8;\r\n\r\n  font-size: 12px;\r\n\r\n  line-height: 1.5;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-status {\r\n  margin: 6px 0 0;\r\n\r\n  color: #aab8cd;\r\n\r\n  font-size: 11px;\r\n\r\n  line-height: 1.5;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-status:empty {\r\n  display: none;\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   BROKER CARD\r\n========================================= *\/\r\n\r\n#mx-broker-globe .mx-card {\r\n  position: relative;\r\n\r\n  padding: 17px;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-close {\r\n  position: absolute;\r\n\r\n  top: 8px;\r\n  right: 8px;\r\n\r\n  z-index: 2;\r\n\r\n  display: grid;\r\n\r\n  place-items: center;\r\n\r\n  width: 28px;\r\n  height: 28px;\r\n\r\n  min-height: 0;\r\n\r\n  padding: 0;\r\n  margin: 0;\r\n\r\n  border: 0;\r\n\r\n  border-radius: 8px;\r\n\r\n  background: #141e30;\r\n\r\n  color: #aab8cd;\r\n\r\n  font-family: Arial, sans-serif;\r\n\r\n  font-size: 20px;\r\n\r\n  line-height: 1;\r\n\r\n  cursor: pointer;\r\n\r\n  transition:\r\n    background 0.18s ease,\r\n    color 0.18s ease;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-close:hover {\r\n  background: #20304a;\r\n\r\n  color: #ffffff;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-eyebrow {\r\n  padding-right: 20px;\r\n\r\n  color: #07dfe2;\r\n\r\n  font-size: 9px;\r\n\r\n  line-height: 1.5;\r\n\r\n  letter-spacing: 1.5px;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-name {\r\n  margin: 12px 0 5px;\r\n\r\n  color: #ffffff;\r\n\r\n  font-family: inherit;\r\n\r\n  font-size: 20px;\r\n\r\n  font-weight: 700;\r\n\r\n  line-height: 1.3;\r\n\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-location {\r\n  color: #93a6c2;\r\n\r\n  font-size: 12px;\r\n\r\n  line-height: 1.5;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-description {\r\n  margin: 12px 0;\r\n\r\n  color: #c0ccdd;\r\n\r\n  font-size: 12px;\r\n\r\n  line-height: 1.7;\r\n\r\n  white-space: pre-line;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-link {\r\n  position: relative;\r\n\r\n  display: flex;\r\n\r\n  justify-content: space-between;\r\n\r\n  align-items: center;\r\n\r\n  padding-top: 12px;\r\n\r\n  border-top:\r\n    1px solid #233047;\r\n\r\n  color: #07dfe2;\r\n\r\n  font-size: 12px;\r\n\r\n  text-decoration: none;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-link:hover {\r\n  color: #ffffff;\r\n}\r\n\r\n\r\n#mx-broker-globe .mx-link:focus-visible {\r\n  outline: 2px solid #07dfe2;\r\n\r\n  outline-offset: 4px;\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   TABLET\r\n========================================= *\/\r\n\r\n@media (max-width: 1024px) {\r\n\r\n  #mx-broker-globe {\r\n    min-height: 650px;\r\n    height: auto;\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   MOBILE\r\n========================================= *\/\r\n\r\n@media (max-width: 767px) {\r\n\r\n  #mx-broker-globe {\r\n    min-height: 720px;\r\n    height: auto;\r\n  }\r\n\r\n\r\n  #mx-broker-globe .mx-search {\r\n    top: 66px;\r\n    left: 16px;\r\n\r\n    width: 160px;\r\n\r\n    max-width:\r\n      calc(100% - 32px);\r\n  }\r\n\r\n\r\n  #mx-broker-globe input {\r\n    font-size: 16px;\r\n  }\r\n\r\n\r\n  #mx-broker-globe input::placeholder {\r\n    font-size: 11px;\r\n  }\r\n\r\n\r\n  #mx-broker-globe .mx-results,\r\n  #mx-broker-globe .mx-card {\r\n    width: min(\r\n      280px,\r\n      calc(100vw - 32px)\r\n    );\r\n\r\n    max-width:\r\n      calc(100vw - 32px);\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   MOBILE LANDSCAPE\r\n========================================= *\/\r\n\r\n@media\r\n(max-width: 767px)\r\nand\r\n(orientation: landscape) {\r\n\r\n  #mx-broker-globe {\r\n    min-height: 600px;\r\n    height: auto;\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\/* =========================================\r\n   REDUCED MOTION\r\n========================================= *\/\r\n\r\n@media\r\n(prefers-reduced-motion: reduce) {\r\n\r\n  #mx-broker-globe * {\r\n    scroll-behavior: auto !important;\r\n\r\n    transition-duration:\r\n      0.01ms !important;\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\/* =========================================================\r\n   GLOBE WHITE-SCREEN \/ WEBGL RECOVERY FIX\r\n   ========================================================= *\/\r\n\r\n#mx-broker-globe,\r\n#mx-broker-globe iframe {\r\n  background: #020408 !important;\r\n}\r\n\r\n#mx-broker-globe {\r\n  overflow: hidden;\r\n}\r\n\r\n#mx-broker-globe iframe {\r\n  opacity: 1;\r\n  visibility: visible;\r\n  color-scheme: dark;\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<script>\r\n\r\n(() => {\r\n\r\n  const root =\r\n    document.getElementById(\r\n      \"mx-broker-globe\"\r\n    );\r\n\r\n\r\n  if (\r\n    !root ||\r\n    root.dataset.initialized\r\n  ) {\r\n    return;\r\n  }\r\n\r\n\r\n  root.dataset.initialized =\r\n    \"true\";\r\n\r\n\r\n\r\n  \/* =========================================\r\n     CONFIG\r\n  ========================================= *\/\r\n\r\n  const API_URL =\r\n    \"https:\/\/api.markunox.com\/search.php\";\r\n\r\n  const BROKER_DETAILS_API =\r\n    \"https:\/\/api.markunox.com\/brokers\/\";\r\n\r\n  const GEOCODING_API_URL =\r\n    \"https:\/\/geocoding-api.open-meteo.com\/v1\/search\";\r\n\r\n  const SEARCH_DELAY =\r\n    250;\r\n\r\n  const MIN_QUERY_LENGTH =\r\n    2;\r\n\r\n  const MAX_RESULTS =\r\n    8;\r\n\r\n\r\n\r\n  \/* =========================================\r\n     ELEMENTS\r\n  ========================================= *\/\r\n\r\n  const frame =\r\n    root.querySelector(\r\n      \"iframe\"\r\n    );\r\n\r\n  const input =\r\n    root.querySelector(\r\n      \"input\"\r\n    );\r\n\r\n  const results =\r\n    root.querySelector(\r\n      \".mx-results\"\r\n    );\r\n\r\n  const card =\r\n    root.querySelector(\r\n      \".mx-card\"\r\n    );\r\n\r\n  const status =\r\n    root.querySelector(\r\n      \".mx-status\"\r\n    );\r\n\r\n  const link =\r\n    root.querySelector(\r\n      \".mx-link\"\r\n    );\r\n\r\n  const eyebrowElement =\r\n    root.querySelector(\r\n      \".mx-eyebrow\"\r\n    );\r\n\r\n\r\n  const nameElement =\r\n    root.querySelector(\r\n      \".mx-name\"\r\n    );\r\n\r\n  const locationElement =\r\n    root.querySelector(\r\n      \".mx-location\"\r\n    );\r\n\r\n  const descriptionElement =\r\n    root.querySelector(\r\n      \".mx-description\"\r\n    );\r\n\r\n  const closeButton =\r\n    root.querySelector(\r\n      \".mx-close\"\r\n    );\r\n\r\n\r\n  if (\r\n    !frame ||\r\n    !input ||\r\n    !results ||\r\n    !card ||\r\n    !status ||\r\n    !link\r\n  ) {\r\n    return;\r\n  }\r\n\r\n\r\n  const frameOrigin =\r\n    new URL(\r\n      frame.src\r\n    ).origin;\r\n\r\n\r\n\r\n  \/* =========================================\r\n     STATE\r\n  ========================================= *\/\r\n\r\n  let matches = [];\r\n\r\n  let pending = null;\r\n\r\n  let focusTimer = null;\r\n\r\n  let searchTimer = null;\r\n\r\n  let searchController = null;\r\n\r\n  let activeSearchId = 0;\r\n\r\n\r\n  const searchCache =\r\n    new Map();\r\n\r\n  const brokerDetailsCache =\r\n    new Map();\r\n\r\n  const brokerCityGeocodeCache =\r\n    new Map();\r\n\r\n  let activeBrokerSelectionId = 0;\r\n\r\n\r\n\r\n  \/* =========================================\r\n     HELPERS\r\n  ========================================= *\/\r\n\r\n  function clearPending() {\r\n\r\n    if (focusTimer) {\r\n\r\n      clearTimeout(\r\n        focusTimer\r\n      );\r\n\r\n      focusTimer = null;\r\n\r\n    }\r\n\r\n\r\n    pending = null;\r\n\r\n    status.textContent = \"\";\r\n\r\n  }\r\n\r\n\r\n\r\n  function abortSearch() {\r\n\r\n    if (searchController) {\r\n\r\n      searchController.abort();\r\n\r\n      searchController = null;\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n\r\n  function clearResults() {\r\n\r\n    matches = [];\r\n\r\n    results.replaceChildren();\r\n\r\n    results.hidden = true;\r\n\r\n  }\r\n\r\n\r\n\r\n  function normalizeEntity(raw) {\r\n\r\n    const lat =\r\n      raw.lat === null ||\r\n      raw.lat === undefined ||\r\n      raw.lat === \"\"\r\n        ? null\r\n        : Number(raw.lat);\r\n\r\n\r\n    const lng =\r\n      raw.lng === null ||\r\n      raw.lng === undefined ||\r\n      raw.lng === \"\"\r\n        ? null\r\n        : Number(raw.lng);\r\n\r\n\r\n    const type =\r\n      raw.type === \"exchange\"\r\n        ? \"exchange\"\r\n        : \"broker\";\r\n\r\n\r\n    return {\r\n\r\n      type,\r\n\r\n      id:\r\n        raw.id ?? null,\r\n\r\n      slug:\r\n        raw.slug || \"\",\r\n\r\n      name:\r\n        raw.name || \"\",\r\n\r\n      legalName:\r\n        raw.legal_name || \"\",\r\n\r\n      logoUrl:\r\n        raw.logo_url || \"\",\r\n\r\n      countryCode:\r\n        raw.country_code || \"\",\r\n\r\n      score:\r\n        raw.score === null ||\r\n        raw.score === undefined ||\r\n        raw.score === \"\"\r\n          ? null\r\n          : Number(raw.score),\r\n\r\n      verified:\r\n        raw.verified === true ||\r\n        Number(raw.verified) === 1,\r\n\r\n      detailsUrl:\r\n        raw.details_url || \"\",\r\n\r\n      websiteUrl:\r\n        raw.website_url ||\r\n        raw.website ||\r\n        raw.company_website ||\r\n        \"\",\r\n\r\n      partnerUrl:\r\n        raw.partner_url ||\r\n        raw.ib_url ||\r\n        raw.referral_url ||\r\n        \"\",\r\n\r\n      partnerAvailable:\r\n        Boolean(\r\n          raw.partner_available\r\n        ),\r\n\r\n      city:\r\n        raw.office_city ||\r\n        raw.city ||\r\n        \"\",\r\n\r\n      country:\r\n        raw.office_country ||\r\n        raw.country ||\r\n        \"\",\r\n\r\n      address:\r\n        raw.office_address ||\r\n        raw.address ||\r\n        \"\",\r\n\r\n      lat,\r\n\r\n      lng\r\n\r\n    };\r\n\r\n  }\r\n\r\n\r\n\r\n  function createLocationText(\r\n    entity\r\n  ) {\r\n\r\n    const locationParts = [\r\n      entity.city,\r\n      entity.country\r\n    ].filter(Boolean);\r\n\r\n\r\n    if (locationParts.length) {\r\n\r\n      return locationParts.join(\", \");\r\n\r\n    }\r\n\r\n\r\n    const typeLabel =\r\n      entity.type === \"exchange\"\r\n        ? \"Exchange\"\r\n        : \"Broker\";\r\n\r\n\r\n    return entity.countryCode\r\n      ? `${typeLabel} \u00b7 ${entity.countryCode}`\r\n      : typeLabel;\r\n\r\n  }\r\n\r\n\r\n\r\n  function createDescription(\r\n    entity\r\n  ) {\r\n\r\n    const parts = [];\r\n\r\n\r\n    if (entity.legalName) {\r\n\r\n      parts.push(\r\n        entity.legalName\r\n      );\r\n\r\n    }\r\n\r\n\r\n    if (\r\n      entity.score !== null &&\r\n      Number.isFinite(entity.score)\r\n    ) {\r\n\r\n      parts.push(\r\n        `MARKUNOX Score: ${entity.score.toFixed(2)}`\r\n      );\r\n\r\n    }\r\n\r\n\r\n    if (entity.verified) {\r\n\r\n      parts.push(\r\n        entity.type === \"exchange\"\r\n          ? \"Verified exchange profile\"\r\n          : \"Verified broker profile\"\r\n      );\r\n\r\n    }\r\n\r\n\r\n    if (!parts.length) {\r\n\r\n      return entity.type === \"exchange\"\r\n        ? \"Exchange intelligence profile.\"\r\n        : \"Broker intelligence profile.\";\r\n\r\n    }\r\n\r\n\r\n    return parts.join(\"\\\\n\");\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n  \/* =========================================\r\n     BROKER DETAILS \/ LOCATION\r\n     Uses MARKUNOX broker office records directly.\r\n  ========================================= *\/\r\n\r\n  async function fetchBrokerDetails(entity) {\r\n\r\n    const slug =\r\n      String(\r\n        entity?.slug || \"\"\r\n      ).trim();\r\n\r\n    const name =\r\n      String(\r\n        entity?.name || \"\"\r\n      ).trim();\r\n\r\n    const cacheKey =\r\n      slug ||\r\n      name.toLowerCase();\r\n\r\n    if (!cacheKey) {\r\n      return null;\r\n    }\r\n\r\n\r\n    if (\r\n      brokerDetailsCache.has(\r\n        cacheKey\r\n      )\r\n    ) {\r\n      return brokerDetailsCache.get(\r\n        cacheKey\r\n      );\r\n    }\r\n\r\n\r\n    async function fetchJson(url) {\r\n\r\n      try {\r\n\r\n        const response =\r\n          await fetch(\r\n            url.toString(),\r\n            {\r\n              method: \"GET\",\r\n              headers: {\r\n                Accept:\r\n                  \"application\/json\"\r\n              },\r\n              cache:\r\n                \"no-store\"\r\n            }\r\n          );\r\n\r\n        if (!response.ok) {\r\n          return null;\r\n        }\r\n\r\n        return await response.json();\r\n\r\n      }\r\n      catch (error) {\r\n\r\n        return null;\r\n\r\n      }\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * First try exact slug.\r\n     *\/\r\n    if (slug) {\r\n\r\n      const slugUrl =\r\n        new URL(\r\n          BROKER_DETAILS_API\r\n        );\r\n\r\n      slugUrl.searchParams.set(\r\n        \"slug\",\r\n        slug\r\n      );\r\n\r\n      const slugPayload =\r\n        await fetchJson(\r\n          slugUrl\r\n        );\r\n\r\n      if (\r\n        slugPayload &&\r\n        slugPayload.status === \"ok\" &&\r\n        slugPayload.data &&\r\n        typeof slugPayload.data === \"object\" &&\r\n        !Array.isArray(slugPayload.data)\r\n      ) {\r\n\r\n        brokerDetailsCache.set(\r\n          cacheKey,\r\n          slugPayload.data\r\n        );\r\n\r\n        return slugPayload.data;\r\n\r\n      }\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * Fallback by broker name.\r\n     * This fixes brokers whose search slug is different from\r\n     * the slug stored in the MARKUNOX brokers table.\r\n     *\/\r\n    if (name) {\r\n\r\n      const searchUrl =\r\n        new URL(\r\n          BROKER_DETAILS_API\r\n        );\r\n\r\n      searchUrl.searchParams.set(\r\n        \"search\",\r\n        name\r\n      );\r\n\r\n      const searchPayload =\r\n        await fetchJson(\r\n          searchUrl\r\n        );\r\n\r\n      const rows =\r\n        searchPayload &&\r\n        searchPayload.status === \"ok\" &&\r\n        Array.isArray(\r\n          searchPayload.data\r\n        )\r\n          ? searchPayload.data\r\n          : [];\r\n\r\n\r\n      if (rows.length) {\r\n\r\n        const wantedName =\r\n          name\r\n            .trim()\r\n            .toLowerCase();\r\n\r\n        const wantedSlug =\r\n          slug\r\n            .trim()\r\n            .toLowerCase();\r\n\r\n\r\n        const matched =\r\n          rows.find(\r\n            row =>\r\n              wantedSlug &&\r\n              String(\r\n                row?.slug || \"\"\r\n              )\r\n                .trim()\r\n                .toLowerCase() ===\r\n              wantedSlug\r\n          ) ||\r\n          rows.find(\r\n            row =>\r\n              String(\r\n                row?.name || \"\"\r\n              )\r\n                .trim()\r\n                .toLowerCase() ===\r\n              wantedName\r\n          ) ||\r\n          rows[0];\r\n\r\n\r\n        \/*\r\n         * The search response already includes the selected\r\n         * primary office fields: office_city, office_country,\r\n         * office_country_code, lat and lng.\r\n         *\/\r\n        brokerDetailsCache.set(\r\n          cacheKey,\r\n          matched\r\n        );\r\n\r\n        return matched;\r\n\r\n      }\r\n\r\n    }\r\n\r\n\r\n    brokerDetailsCache.set(\r\n      cacheKey,\r\n      null\r\n    );\r\n\r\n    return null;\r\n\r\n  }\r\n\r\n\r\n\r\n  function parseBrokerHeadquarters(details) {\r\n\r\n    const raw =\r\n      String(\r\n        details?.headquarters ||\r\n        details?.registered_region ||\r\n        details?.office_address ||\r\n        \"\"\r\n      )\r\n        .replace(\/\\s+\/g, \" \")\r\n        .trim();\r\n\r\n    if (!raw) {\r\n      return null;\r\n    }\r\n\r\n    const parts =\r\n      raw\r\n        .split(\",\")\r\n        .map(\r\n          part =>\r\n            String(part || \"\")\r\n              .trim()\r\n        )\r\n        .filter(Boolean);\r\n\r\n    if (!parts.length) {\r\n      return null;\r\n    }\r\n\r\n    return {\r\n      city:\r\n        parts[0] || \"\",\r\n      country:\r\n        parts.length > 1\r\n          ? parts[parts.length - 1]\r\n          : \"\",\r\n      raw\r\n    };\r\n\r\n  }\r\n\r\n\r\n  async function geocodeBrokerHeadquarters(details) {\r\n\r\n    const hq =\r\n      parseBrokerHeadquarters(\r\n        details\r\n      );\r\n\r\n    if (!hq || !hq.city) {\r\n      return null;\r\n    }\r\n\r\n    const cacheKey =\r\n      (\r\n        hq.city +\r\n        \"|\" +\r\n        hq.country\r\n      ).toLowerCase();\r\n\r\n    if (\r\n      brokerCityGeocodeCache.has(\r\n        cacheKey\r\n      )\r\n    ) {\r\n      return brokerCityGeocodeCache.get(\r\n        cacheKey\r\n      );\r\n    }\r\n\r\n    try {\r\n\r\n      const url =\r\n        new URL(\r\n          GEOCODING_API_URL\r\n        );\r\n\r\n      url.searchParams.set(\r\n        \"name\",\r\n        hq.city\r\n      );\r\n\r\n      url.searchParams.set(\r\n        \"count\",\r\n        \"10\"\r\n      );\r\n\r\n      url.searchParams.set(\r\n        \"language\",\r\n        \"en\"\r\n      );\r\n\r\n      url.searchParams.set(\r\n        \"format\",\r\n        \"json\"\r\n      );\r\n\r\n      const response =\r\n        await fetch(\r\n          url.toString(),\r\n          {\r\n            method: \"GET\",\r\n            headers: {\r\n              Accept:\r\n                \"application\/json\"\r\n            },\r\n            cache:\r\n              \"force-cache\"\r\n          }\r\n        );\r\n\r\n      if (!response.ok) {\r\n        return null;\r\n      }\r\n\r\n      const payload =\r\n        await response.json();\r\n\r\n      const rows =\r\n        Array.isArray(\r\n          payload?.results\r\n        )\r\n          ? payload.results\r\n          : [];\r\n\r\n      if (!rows.length) {\r\n        return null;\r\n      }\r\n\r\n      const wantedCountry =\r\n        String(\r\n          hq.country || \"\"\r\n        )\r\n          .trim()\r\n          .toLowerCase();\r\n\r\n      let match =\r\n        rows.find(\r\n          row =>\r\n            wantedCountry &&\r\n            String(\r\n              row?.country || \"\"\r\n            )\r\n              .trim()\r\n              .toLowerCase() ===\r\n            wantedCountry\r\n        ) ||\r\n        rows.find(\r\n          row =>\r\n            wantedCountry &&\r\n            String(\r\n              row?.country || \"\"\r\n            )\r\n              .trim()\r\n              .toLowerCase()\r\n              .includes(\r\n                wantedCountry\r\n              )\r\n        ) ||\r\n        rows[0];\r\n\r\n      const lat =\r\n        Number(\r\n          match?.latitude\r\n        );\r\n\r\n      const lng =\r\n        Number(\r\n          match?.longitude\r\n        );\r\n\r\n      if (\r\n        !Number.isFinite(lat) ||\r\n        !Number.isFinite(lng)\r\n      ) {\r\n        return null;\r\n      }\r\n\r\n      const resolved = {\r\n        city:\r\n          String(\r\n            match?.name ||\r\n            hq.city\r\n          ).trim(),\r\n        country:\r\n          String(\r\n            match?.country ||\r\n            hq.country\r\n          ).trim(),\r\n        countryCode:\r\n          String(\r\n            match?.country_code ||\r\n            details?.country_code ||\r\n            \"\"\r\n          )\r\n            .trim()\r\n            .toUpperCase(),\r\n        address:\r\n          hq.raw,\r\n        lat,\r\n        lng,\r\n        officeType:\r\n          \"headquarters\"\r\n      };\r\n\r\n      brokerCityGeocodeCache.set(\r\n        cacheKey,\r\n        resolved\r\n      );\r\n\r\n      return resolved;\r\n\r\n    }\r\n    catch (error) {\r\n\r\n      return null;\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  function pickBrokerOffice(details) {\r\n\r\n    if (\r\n      !details ||\r\n      typeof details !== \"object\"\r\n    ) {\r\n      return null;\r\n    }\r\n\r\n\r\n    \/*\r\n     * The Broker API already exposes the primary office at top level\r\n     * through office_city \/ office_country \/ lat \/ lng.\r\n     *\/\r\n    const topLat =\r\n      Number(\r\n        details.lat\r\n      );\r\n\r\n    const topLng =\r\n      Number(\r\n        details.lng\r\n      );\r\n\r\n\r\n    if (\r\n      Number.isFinite(topLat) &&\r\n      Number.isFinite(topLng)\r\n    ) {\r\n\r\n      return {\r\n        city:\r\n          details.office_city || \"\",\r\n        country:\r\n          details.office_country || \"\",\r\n        countryCode:\r\n          details.office_country_code ||\r\n          details.country_code ||\r\n          \"\",\r\n        address:\r\n          details.office_address || \"\",\r\n        lat:\r\n          topLat,\r\n        lng:\r\n          topLng,\r\n        officeType:\r\n          details.office_type || \"\"\r\n      };\r\n\r\n    }\r\n\r\n\r\n    const offices =\r\n      Array.isArray(\r\n        details.offices\r\n      )\r\n        ? details.offices\r\n        : [];\r\n\r\n\r\n    if (!offices.length) {\r\n      return null;\r\n    }\r\n\r\n\r\n    const selected =\r\n      offices.find(\r\n        office =>\r\n          Number(\r\n            office?.is_primary\r\n          ) === 1\r\n      ) ||\r\n      offices.find(\r\n        office =>\r\n          Number(\r\n            office?.is_verified\r\n          ) === 1\r\n      ) ||\r\n      offices[0];\r\n\r\n\r\n    if (!selected) {\r\n      return null;\r\n    }\r\n\r\n\r\n    const lat =\r\n      Number(\r\n        selected.lat\r\n      );\r\n\r\n    const lng =\r\n      Number(\r\n        selected.lng\r\n      );\r\n\r\n\r\n    if (\r\n      !Number.isFinite(lat) ||\r\n      !Number.isFinite(lng)\r\n    ) {\r\n      return null;\r\n    }\r\n\r\n\r\n    return {\r\n      city:\r\n        selected.city || \"\",\r\n      country:\r\n        selected.country || \"\",\r\n      countryCode:\r\n        selected.country_code || \"\",\r\n      address:\r\n        selected.address || \"\",\r\n      lat,\r\n      lng,\r\n      officeType:\r\n        selected.office_type || \"\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  function resolveBrokerExternalUrl(\r\n    entity,\r\n    details\r\n  ) {\r\n\r\n    const candidate =\r\n      details?.markunox_ib_url ||\r\n      details?.ib_url ||\r\n      details?.partner_url ||\r\n      details?.referral_url ||\r\n      details?.affiliate_url ||\r\n      entity?.partnerUrl ||\r\n      details?.website_url ||\r\n      details?.website ||\r\n      entity?.websiteUrl ||\r\n      \"\";\r\n\r\n\r\n    if (!candidate) {\r\n      return \"\";\r\n    }\r\n\r\n\r\n    try {\r\n\r\n      const url =\r\n        new URL(\r\n          candidate,\r\n          window.location.href\r\n        );\r\n\r\n\r\n      if (\r\n        url.protocol !== \"https:\" &&\r\n        url.protocol !== \"http:\"\r\n      ) {\r\n        return \"\";\r\n      }\r\n\r\n\r\n      return url.toString();\r\n\r\n    }\r\n    catch (error) {\r\n\r\n      return \"\";\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  function focusBrokerOffice(\r\n    entity,\r\n    office\r\n  ) {\r\n\r\n    if (\r\n      !office ||\r\n      !Number.isFinite(\r\n        office.lat\r\n      ) ||\r\n      !Number.isFinite(\r\n        office.lng\r\n      )\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n\r\n    clearPending();\r\n\r\n\r\n    pending = {\r\n\r\n      type:\r\n        \"MARKUNOX_FOCUS_BROKER\",\r\n\r\n      requestId:\r\n        Date.now() +\r\n        \"-\" +\r\n        Math.random()\r\n          .toString(36)\r\n          .slice(2),\r\n\r\n      lat:\r\n        office.lat,\r\n\r\n      lng:\r\n        office.lng,\r\n\r\n      city:\r\n        office.city || \"\",\r\n\r\n      country:\r\n        office.country || \"\",\r\n\r\n      brokerName:\r\n        entity.name || \"\",\r\n\r\n      brokerSlug:\r\n        entity.slug || \"\"\r\n\r\n    };\r\n\r\n\r\n    status.textContent =\r\n      \"Moving globe...\";\r\n\r\n\r\n    frame.contentWindow\r\n      .postMessage(\r\n        pending,\r\n        frameOrigin\r\n      );\r\n\r\n\r\n    \/*\r\n     * Send once more after a short delay.\r\n     * This covers the case where the iframe finished loading\r\n     * between search selection and the first postMessage.\r\n     *\/\r\n    setTimeout(\r\n      () => {\r\n\r\n        if (pending) {\r\n\r\n          frame.contentWindow\r\n            .postMessage(\r\n              pending,\r\n              frameOrigin\r\n            );\r\n\r\n        }\r\n\r\n      },\r\n      220\r\n    );\r\n\r\n\r\n    focusTimer =\r\n      setTimeout(\r\n        () => {\r\n\r\n          if (pending) {\r\n\r\n            frame.contentWindow\r\n              .postMessage(\r\n                pending,\r\n                frameOrigin\r\n              );\r\n\r\n          }\r\n\r\n        },\r\n        1100\r\n      );\r\n\r\n\r\n    return true;\r\n\r\n  }\r\n\r\n\r\n  \/* =========================================\r\n     RESULTS\r\n  ========================================= *\/\r\n\r\n  function renderResults() {\r\n\r\n    results.replaceChildren();\r\n\r\n\r\n    if (!matches.length) {\r\n\r\n      const empty =\r\n        document.createElement(\r\n          \"div\"\r\n        );\r\n\r\n\r\n      empty.className =\r\n        \"mx-empty\";\r\n\r\n\r\n      empty.textContent =\r\n        \"No brokers or exchanges found.\";\r\n\r\n\r\n      results.append(\r\n        empty\r\n      );\r\n\r\n\r\n      results.hidden =\r\n        false;\r\n\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    matches.forEach(\r\n      (entity, index) => {\r\n\r\n        const button =\r\n          document.createElement(\r\n            \"button\"\r\n          );\r\n\r\n\r\n        button.type =\r\n          \"button\";\r\n\r\n\r\n        button.className =\r\n          \"mx-result\";\r\n\r\n\r\n        button.setAttribute(\r\n          \"role\",\r\n          \"option\"\r\n        );\r\n\r\n\r\n        button.dataset.index =\r\n          String(index);\r\n\r\n\r\n        const main =\r\n          document.createElement(\r\n            \"span\"\r\n          );\r\n\r\n\r\n        main.className =\r\n          \"mx-result-main\";\r\n\r\n\r\n        const logo =\r\n          document.createElement(\r\n            \"span\"\r\n          );\r\n\r\n\r\n        logo.className =\r\n          \"mx-result-logo\";\r\n\r\n\r\n        if (entity.logoUrl) {\r\n\r\n          const image =\r\n            document.createElement(\r\n              \"img\"\r\n            );\r\n\r\n\r\n          image.src =\r\n            entity.logoUrl;\r\n\r\n\r\n          image.alt =\r\n            \"\";\r\n\r\n\r\n          image.loading =\r\n            \"lazy\";\r\n\r\n\r\n          logo.append(\r\n            image\r\n          );\r\n\r\n        }\r\n\r\n        else {\r\n\r\n          const fallback =\r\n            document.createElement(\r\n              \"span\"\r\n            );\r\n\r\n\r\n          fallback.className =\r\n            \"mx-result-logo-fallback\";\r\n\r\n\r\n          fallback.textContent =\r\n            (\r\n              entity.name\r\n                .trim()\r\n                .charAt(0) ||\r\n              \"M\"\r\n            ).toUpperCase();\r\n\r\n\r\n          logo.append(\r\n            fallback\r\n          );\r\n\r\n        }\r\n\r\n\r\n        const copy =\r\n          document.createElement(\r\n            \"span\"\r\n          );\r\n\r\n\r\n        copy.className =\r\n          \"mx-result-copy\";\r\n\r\n\r\n        const topLine =\r\n          document.createElement(\r\n            \"span\"\r\n          );\r\n\r\n\r\n        topLine.className =\r\n          \"mx-result-topline\";\r\n\r\n\r\n        const name =\r\n          document.createElement(\r\n            \"span\"\r\n          );\r\n\r\n\r\n        name.className =\r\n          \"mx-result-name\";\r\n\r\n\r\n        name.textContent =\r\n          entity.name;\r\n\r\n\r\n        const type =\r\n          document.createElement(\r\n            \"span\"\r\n          );\r\n\r\n\r\n        type.className =\r\n          \"mx-result-type\";\r\n\r\n\r\n        type.textContent =\r\n          entity.type;\r\n\r\n\r\n        topLine.append(\r\n          name,\r\n          type\r\n        );\r\n\r\n\r\n        if (entity.verified) {\r\n\r\n          const verified =\r\n            document.createElement(\r\n              \"span\"\r\n            );\r\n\r\n\r\n          verified.className =\r\n            \"mx-result-verified\";\r\n\r\n\r\n          verified.setAttribute(\r\n            \"aria-label\",\r\n            \"Verified\"\r\n          );\r\n\r\n\r\n          topLine.append(\r\n            verified\r\n          );\r\n\r\n        }\r\n\r\n\r\n        const location =\r\n          document.createElement(\r\n            \"small\"\r\n          );\r\n\r\n\r\n        location.textContent =\r\n          createLocationText(\r\n            entity\r\n          );\r\n\r\n\r\n        copy.append(\r\n          topLine,\r\n          location\r\n        );\r\n\r\n\r\n        if (\r\n          entity.score !== null &&\r\n          Number.isFinite(entity.score)\r\n        ) {\r\n\r\n          const score =\r\n            document.createElement(\r\n              \"span\"\r\n            );\r\n\r\n\r\n          score.className =\r\n            \"mx-result-score\";\r\n\r\n\r\n          score.textContent =\r\n            `Score ${entity.score.toFixed(2)}`;\r\n\r\n\r\n          copy.append(\r\n            score\r\n          );\r\n\r\n        }\r\n\r\n\r\n        main.append(\r\n          logo,\r\n          copy\r\n        );\r\n\r\n\r\n        button.append(\r\n          main\r\n        );\r\n\r\n\r\n        button.addEventListener(\r\n          \"click\",\r\n          () => {\r\n\r\n            selectEntity(\r\n              entity\r\n            );\r\n\r\n          }\r\n        );\r\n\r\n\r\n        results.append(\r\n          button\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n\r\n    results.hidden =\r\n      false;\r\n\r\n  }\r\n\r\n\r\n\r\n  \/* =========================================\r\n     API SEARCH\r\n  ========================================= *\/\r\n\r\n  async function searchEntities(\r\n    query\r\n  ) {\r\n\r\n    const cleanQuery =\r\n      query.trim();\r\n\r\n\r\n    const cacheKey =\r\n      cleanQuery.toLowerCase();\r\n\r\n\r\n    if (\r\n      cacheKey.length <\r\n      MIN_QUERY_LENGTH\r\n    ) {\r\n\r\n      clearResults();\r\n\r\n      status.textContent = \"\";\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    if (\r\n      searchCache.has(\r\n        cacheKey\r\n      )\r\n    ) {\r\n\r\n      matches =\r\n        searchCache.get(\r\n          cacheKey\r\n        );\r\n\r\n\r\n      status.textContent = \"\";\r\n\r\n\r\n      renderResults();\r\n\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    abortSearch();\r\n\r\n\r\n    searchController =\r\n      new AbortController();\r\n\r\n\r\n    const currentSearchId =\r\n      ++activeSearchId;\r\n\r\n\r\n    status.textContent =\r\n      \"Searching...\";\r\n\r\n\r\n    try {\r\n\r\n      const url =\r\n        new URL(\r\n          API_URL\r\n        );\r\n\r\n\r\n      url.searchParams.set(\r\n        \"q\",\r\n        cleanQuery\r\n      );\r\n\r\n\r\n      url.searchParams.set(\r\n        \"type\",\r\n        \"all\"\r\n      );\r\n\r\n\r\n      url.searchParams.set(\r\n        \"limit\",\r\n        String(MAX_RESULTS)\r\n      );\r\n\r\n\r\n      const response =\r\n        await fetch(\r\n\r\n          url.toString(),\r\n\r\n          {\r\n            method: \"GET\",\r\n\r\n            headers: {\r\n              Accept:\r\n                \"application\/json\"\r\n            },\r\n\r\n            signal:\r\n              searchController.signal,\r\n\r\n            cache:\r\n              \"no-store\"\r\n          }\r\n\r\n        );\r\n\r\n\r\n      if (\r\n        !response.ok\r\n      ) {\r\n\r\n        throw new Error(\r\n          \"Search request failed\"\r\n        );\r\n\r\n      }\r\n\r\n\r\n      const payload =\r\n        await response.json();\r\n\r\n\r\n      if (\r\n        currentSearchId !==\r\n        activeSearchId\r\n      ) {\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n      if (\r\n        !payload ||\r\n        payload.status !== \"ok\" ||\r\n        !Array.isArray(\r\n          payload.data\r\n        )\r\n      ) {\r\n\r\n        throw new Error(\r\n          \"Invalid API response\"\r\n        );\r\n\r\n      }\r\n\r\n\r\n      matches =\r\n        payload.data\r\n          .map(\r\n            normalizeEntity\r\n          )\r\n          .slice(\r\n            0,\r\n            MAX_RESULTS\r\n          );\r\n\r\n\r\n      searchCache.set(\r\n        cacheKey,\r\n        matches\r\n      );\r\n\r\n\r\n      status.textContent =\r\n        \"\";\r\n\r\n\r\n      renderResults();\r\n\r\n    }\r\n\r\n    catch (error) {\r\n\r\n      if (\r\n        error.name ===\r\n        \"AbortError\"\r\n      ) {\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n      matches = [];\r\n\r\n\r\n      results.hidden =\r\n        true;\r\n\r\n\r\n      status.textContent =\r\n        \"Search temporarily unavailable.\";\r\n\r\n    }\r\n\r\n    finally {\r\n\r\n      if (\r\n        currentSearchId ===\r\n        activeSearchId\r\n      ) {\r\n\r\n        searchController =\r\n          null;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n\r\n  \/* =========================================\r\n     SELECT ENTITY\r\n  ========================================= *\/\r\n\r\n  async function selectEntity(\r\n    entity\r\n  ) {\r\n\r\n    clearPending();\r\n\r\n    const selectionId =\r\n      ++activeBrokerSelectionId;\r\n\r\n\r\n    input.value =\r\n      entity.name;\r\n\r\n\r\n    results.hidden =\r\n      true;\r\n\r\n\r\n    if (eyebrowElement) {\r\n\r\n      eyebrowElement.textContent =\r\n        entity.type === \"exchange\"\r\n          ? \"EXCHANGE INTELLIGENCE\"\r\n          : \"BROKER INTELLIGENCE\";\r\n\r\n    }\r\n\r\n\r\n    nameElement.textContent =\r\n      entity.name;\r\n\r\n\r\n    locationElement.textContent =\r\n      createLocationText(\r\n        entity\r\n      );\r\n\r\n\r\n    descriptionElement.textContent =\r\n      createDescription(\r\n        entity\r\n      );\r\n\r\n\r\n    \/*\r\n     * Always open the information card immediately.\r\n     *\/\r\n    card.hidden =\r\n      false;\r\n\r\n\r\n    \/*\r\n     * The profile link is navigation only.\r\n     * Selecting the search result is what moves the globe.\r\n     *\/\r\n    link.hidden =\r\n      true;\r\n\r\n    link.removeAttribute(\r\n      \"href\"\r\n    );\r\n\r\n\r\n    if (\r\n      entity.type !== \"broker\"\r\n    ) {\r\n\r\n      status.textContent =\r\n        \"\";\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    status.textContent =\r\n      \"Locating broker...\";\r\n\r\n\r\n    const details =\r\n      await fetchBrokerDetails(\r\n        entity\r\n      );\r\n\r\n\r\n    if (\r\n      selectionId !==\r\n      activeBrokerSelectionId\r\n    ) {\r\n      return;\r\n    }\r\n\r\n\r\n    \/*\r\n     * VIEW PROFILE:\r\n     * Future MARKUNOX IB URL has priority.\r\n     * Until then, use the broker's official website.\r\n     *\/\r\n    const externalUrl =\r\n      resolveBrokerExternalUrl(\r\n        entity,\r\n        details\r\n      );\r\n\r\n\r\n    if (externalUrl) {\r\n\r\n      link.href =\r\n        externalUrl;\r\n\r\n      link.hidden =\r\n        false;\r\n\r\n      link.target =\r\n        \"_blank\";\r\n\r\n      link.rel =\r\n        \"noopener noreferrer sponsored\";\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * SEARCH SELECTION:\r\n     * Move the globe to the primary\/verified broker office.\r\n     *\/\r\n    \/*\r\n     * IMPORTANT:\r\n     * Use the broker HEADQUARTERS city first.\r\n     * Do not trust stored office lat\/lng as the primary source,\r\n     * because those records may point to a registered entity,\r\n     * island centroid or an outdated office.\r\n     *\/\r\n    let office =\r\n      await geocodeBrokerHeadquarters(\r\n        details\r\n      );\r\n\r\n\r\n    \/*\r\n     * Only if headquarters is unavailable, fall back to\r\n     * the primary broker_offices record.\r\n     *\/\r\n    if (!office) {\r\n\r\n      office =\r\n        pickBrokerOffice(\r\n          details\r\n        );\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * Final fallback:\r\n     * coordinates already returned by search.php.\r\n     *\/\r\n    if (\r\n      !office &&\r\n      Number.isFinite(\r\n        entity.lat\r\n      ) &&\r\n      Number.isFinite(\r\n        entity.lng\r\n      )\r\n    ) {\r\n\r\n      office = {\r\n        city:\r\n          entity.city || \"\",\r\n        country:\r\n          entity.country || \"\",\r\n        countryCode:\r\n          entity.countryCode || \"\",\r\n        address:\r\n          entity.address || \"\",\r\n        lat:\r\n          entity.lat,\r\n        lng:\r\n          entity.lng,\r\n        officeType:\r\n          \"\"\r\n      };\r\n\r\n    }\r\n\r\n\r\n    if (!office) {\r\n\r\n      status.textContent =\r\n        \"Location unavailable.\";\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    entity.city =\r\n      office.city ||\r\n      entity.city ||\r\n      \"\";\r\n\r\n    entity.country =\r\n      office.country ||\r\n      entity.country ||\r\n      \"\";\r\n\r\n    entity.lat =\r\n      office.lat;\r\n\r\n    entity.lng =\r\n      office.lng;\r\n\r\n\r\n    const locationText =\r\n      [\r\n        entity.city,\r\n        entity.country\r\n      ]\r\n        .filter(Boolean)\r\n        .join(\", \");\r\n\r\n\r\n    if (locationText) {\r\n\r\n      locationElement.textContent =\r\n        locationText;\r\n\r\n    }\r\n\r\n\r\n    focusBrokerOffice(\r\n      entity,\r\n      office\r\n    );\r\n\r\n  }\r\n\r\n\r\n\r\n  \/* =========================================\r\n     INPUT\r\n  ========================================= *\/\r\n\r\n  input.addEventListener(\r\n    \"input\",\r\n    () => {\r\n\r\n      clearTimeout(\r\n        searchTimer\r\n      );\r\n\r\n\r\n      clearPending();\r\n\r\n      activeBrokerSelectionId += 1;\r\n\r\n\r\n      card.hidden =\r\n        true;\r\n\r\n\r\n      results.hidden =\r\n        true;\r\n\r\n\r\n\r\n      const query =\r\n        input.value.trim();\r\n\r\n\r\n\r\n      if (!query) {\r\n\r\n        abortSearch();\r\n\r\n        clearResults();\r\n\r\n        status.textContent =\r\n          \"\";\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        query.length <\r\n        MIN_QUERY_LENGTH\r\n      ) {\r\n\r\n        abortSearch();\r\n\r\n        clearResults();\r\n\r\n        status.textContent =\r\n          \"\";\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n\r\n      searchTimer =\r\n        setTimeout(\r\n          () => {\r\n\r\n            searchEntities(\r\n              query\r\n            );\r\n\r\n          },\r\n          SEARCH_DELAY\r\n        );\r\n\r\n    }\r\n  );\r\n\r\n\r\n\r\n  \/* =========================================\r\n     INPUT KEYBOARD\r\n  ========================================= *\/\r\n\r\n  input.addEventListener(\r\n    \"keydown\",\r\n    event => {\r\n\r\n      if (\r\n        event.key ===\r\n          \"ArrowDown\" &&\r\n        !results.hidden\r\n      ) {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        results\r\n          .querySelector(\r\n            \".mx-result\"\r\n          )\r\n          ?.focus();\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        event.key ===\r\n          \"Enter\" &&\r\n        !results.hidden &&\r\n        matches.length\r\n      ) {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        selectEntity(\r\n          matches[0]\r\n        );\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        event.key ===\r\n        \"Escape\"\r\n      ) {\r\n\r\n        results.hidden =\r\n          true;\r\n\r\n        card.hidden =\r\n          true;\r\n\r\n        clearPending();\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n\r\n  \/* =========================================\r\n     RESULT KEYBOARD\r\n  ========================================= *\/\r\n\r\n  results.addEventListener(\r\n    \"keydown\",\r\n    event => {\r\n\r\n      const buttons =\r\n        Array.from(\r\n          results.querySelectorAll(\r\n            \".mx-result\"\r\n          )\r\n        );\r\n\r\n\r\n      const index =\r\n        buttons.indexOf(\r\n          document.activeElement\r\n        );\r\n\r\n\r\n      if (\r\n        index < 0\r\n      ) {\r\n        return;\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        event.key ===\r\n        \"ArrowDown\"\r\n      ) {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        buttons[\r\n          (index + 1) %\r\n          buttons.length\r\n        ].focus();\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        event.key ===\r\n        \"ArrowUp\"\r\n      ) {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        if (\r\n          index === 0\r\n        ) {\r\n\r\n          input.focus();\r\n\r\n        }\r\n\r\n        else {\r\n\r\n          buttons[\r\n            index - 1\r\n          ].focus();\r\n\r\n        }\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        event.key ===\r\n        \"Enter\"\r\n      ) {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        const entity =\r\n          matches[index];\r\n\r\n\r\n        if (entity) {\r\n\r\n          selectEntity(\r\n            entity\r\n          );\r\n\r\n        }\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        event.key ===\r\n        \"Escape\"\r\n      ) {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        results.hidden =\r\n          true;\r\n\r\n\r\n        input.focus();\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n\r\n  \/* =========================================\r\n     CLOSE CARD\r\n  ========================================= *\/\r\n\r\n  closeButton.addEventListener(\r\n    \"click\",\r\n    () => {\r\n\r\n      card.hidden =\r\n        true;\r\n\r\n\r\n      clearPending();\r\n\r\n\r\n      input.focus();\r\n\r\n    }\r\n  );\r\n\r\n\r\n\r\n  \/* =========================================\r\n     CLICK OUTSIDE\r\n  ========================================= *\/\r\n\r\n  document.addEventListener(\r\n    \"pointerdown\",\r\n    event => {\r\n\r\n      if (\r\n        !root.contains(\r\n          event.target\r\n        )\r\n      ) {\r\n\r\n        results.hidden =\r\n          true;\r\n\r\n      }\r\n\r\n    },\r\n    {\r\n      passive: true\r\n    }\r\n  );\r\n\r\n\r\n\r\n  \/* =========================================\r\n     GLOBE MESSAGE BRIDGE\r\n  ========================================= *\/\r\n\r\n  window.addEventListener(\r\n    \"message\",\r\n    event => {\r\n\r\n      if (\r\n        event.origin !==\r\n          frameOrigin ||\r\n        event.source !==\r\n          frame.contentWindow\r\n      ) {\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n\r\n      const data =\r\n        event.data;\r\n\r\n\r\n\r\n      if (\r\n        !data ||\r\n        typeof data !==\r\n          \"object\"\r\n      ) {\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        data.type ===\r\n          \"MARKUNOX_GLOBE_READY\" &&\r\n        pending\r\n      ) {\r\n\r\n        frame.contentWindow\r\n          .postMessage(\r\n            pending,\r\n            frameOrigin\r\n          );\r\n\r\n\r\n        return;\r\n\r\n      }\r\n\r\n\r\n\r\n      if (\r\n        data.type ===\r\n          \"MARKUNOX_FOCUS_RESULT\" &&\r\n        pending &&\r\n        data.requestId ===\r\n          pending.requestId\r\n      ) {\r\n\r\n        const ok =\r\n          Boolean(\r\n            data.ok\r\n          );\r\n\r\n\r\n        clearPending();\r\n\r\n\r\n        if (!ok) {\r\n\r\n          status.textContent =\r\n            \"Globe connection unavailable.\";\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n\r\n\r\n\r\n  \/* =========================================\r\n     GLOBE WHITE-SCREEN \/ WEBGL RECOVERY\r\n  ========================================= *\/\r\n\r\n  const GLOBE_RECOVERY = {\r\n    maxReloads: 2,\r\n    reloads: 0,\r\n    retryDelay: 900,\r\n    healthInterval: 5000,\r\n    healthTimer: null,\r\n    lastGoodAt: Date.now()\r\n  };\r\n\r\n\r\n  function getGlobeDocument() {\r\n    try {\r\n      return frame.contentDocument ||\r\n        frame.contentWindow?.document ||\r\n        null;\r\n    }\r\n    catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n\r\n  function applyDarkGlobeFallback() {\r\n    const doc = getGlobeDocument();\r\n\r\n    if (!doc) {\r\n      return false;\r\n    }\r\n\r\n    try {\r\n      const styleId = \"markunox-parent-recovery-style\";\r\n\r\n      if (!doc.getElementById(styleId)) {\r\n        const style = doc.createElement(\"style\");\r\n\r\n        style.id = styleId;\r\n\r\n        style.textContent = `\r\n          html,\r\n          body,\r\n          #markunox-app,\r\n          #globe-section,\r\n          #markunox-globe,\r\n          canvas {\r\n            background: #020408 !important;\r\n          }\r\n\r\n          html,\r\n          body {\r\n            margin: 0 !important;\r\n            min-height: 100% !important;\r\n          }\r\n\r\n          #markunox-globe,\r\n          #markunox-globe canvas {\r\n            display: block !important;\r\n          }\r\n\r\n          \/* Keep Global Market Sessions directly under its heading.\r\n             Prevent the cards\/country details from slipping below\r\n             the next container or being pushed by inherited heights. *\/\r\n          #market-sessions {\r\n            position: relative !important;\r\n            z-index: 20 !important;\r\n            min-height: 0 !important;\r\n            height: auto !important;\r\n            max-height: none !important;\r\n            margin-top: 0 !important;\r\n            padding-top: 14px !important;\r\n            padding-bottom: 18px !important;\r\n            overflow: visible !important;\r\n            transform: none !important;\r\n          }\r\n\r\n          #market-bar-items {\r\n            position: relative !important;\r\n            z-index: 21 !important;\r\n            margin-top: 0 !important;\r\n            margin-bottom: 0 !important;\r\n            top: auto !important;\r\n            bottom: auto !important;\r\n            transform: none !important;\r\n            visibility: visible !important;\r\n            opacity: 1 !important;\r\n          }\r\n\r\n          #market-sessions + section,\r\n          #market-sessions + div {\r\n            position: relative !important;\r\n            z-index: 1 !important;\r\n          }\r\n        `;\r\n\r\n        (doc.head || doc.documentElement)\r\n          .appendChild(style);\r\n      }\r\n\r\n      if (doc.documentElement) {\r\n        doc.documentElement.style.background =\r\n          \"#020408\";\r\n      }\r\n\r\n      if (doc.body) {\r\n        doc.body.style.background =\r\n          \"#020408\";\r\n      }\r\n\r\n      return true;\r\n    }\r\n    catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n\r\n  function getGlobeCanvas() {\r\n    const doc = getGlobeDocument();\r\n\r\n    if (!doc) {\r\n      return null;\r\n    }\r\n\r\n    return (\r\n      doc.querySelector(\r\n        \"#markunox-globe canvas\"\r\n      ) ||\r\n      doc.querySelector(\r\n        \"#globe-section canvas\"\r\n      ) ||\r\n      doc.querySelector(\r\n        \"canvas\"\r\n      )\r\n    );\r\n  }\r\n\r\n\r\n  function globeLooksHealthy() {\r\n    const doc = getGlobeDocument();\r\n\r\n    if (!doc || !doc.body) {\r\n      return false;\r\n    }\r\n\r\n    const globe =\r\n      doc.getElementById(\r\n        \"markunox-globe\"\r\n      ) ||\r\n      doc.getElementById(\r\n        \"globe-section\"\r\n      );\r\n\r\n    const canvas =\r\n      getGlobeCanvas();\r\n\r\n    if (!globe || !canvas) {\r\n      return false;\r\n    }\r\n\r\n    const rect =\r\n      canvas.getBoundingClientRect();\r\n\r\n    const sized =\r\n      rect.width > 80 &&\r\n      rect.height > 80 &&\r\n      canvas.width > 80 &&\r\n      canvas.height > 80;\r\n\r\n    if (!sized) {\r\n      return false;\r\n    }\r\n\r\n    try {\r\n      const contextLost =\r\n        typeof canvas.isContextLost ===\r\n        \"function\"\r\n          ? canvas.isContextLost()\r\n          : false;\r\n\r\n      if (contextLost) {\r\n        return false;\r\n      }\r\n    }\r\n    catch (error) {\r\n      \/* Ignore browser-specific canvas checks. *\/\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n\r\n  function nudgeGlobeRenderer() {\r\n    applyDarkGlobeFallback();\r\n\r\n    try {\r\n      const win =\r\n        frame.contentWindow;\r\n\r\n      if (!win) {\r\n        return;\r\n      }\r\n\r\n      win.dispatchEvent(\r\n        new Event(\r\n          \"resize\"\r\n        )\r\n      );\r\n\r\n      win.dispatchEvent(\r\n        new Event(\r\n          \"focus\"\r\n        )\r\n      );\r\n\r\n      win.document?.dispatchEvent(\r\n        new Event(\r\n          \"visibilitychange\"\r\n        )\r\n      );\r\n\r\n      win.postMessage(\r\n        {\r\n          type:\r\n            \"MARKUNOX_GLOBE_RECOVER\"\r\n        },\r\n        frameOrigin\r\n      );\r\n    }\r\n    catch (error) {\r\n      \/* Same-origin recovery is best-effort. *\/\r\n    }\r\n  }\r\n\r\n\r\n  function bindWebGLRecovery() {\r\n    const canvas =\r\n      getGlobeCanvas();\r\n\r\n    if (\r\n      !canvas ||\r\n      canvas.dataset.mxRecoveryBound ===\r\n        \"true\"\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    canvas.dataset.mxRecoveryBound =\r\n      \"true\";\r\n\r\n\r\n    canvas.addEventListener(\r\n      \"webglcontextlost\",\r\n      event => {\r\n\r\n        event.preventDefault();\r\n\r\n        applyDarkGlobeFallback();\r\n\r\n        setTimeout(\r\n          () => {\r\n            nudgeGlobeRenderer();\r\n\r\n            if (\r\n              !globeLooksHealthy()\r\n            ) {\r\n              reloadGlobeSafely();\r\n            }\r\n          },\r\n          GLOBE_RECOVERY.retryDelay\r\n        );\r\n\r\n      },\r\n      false\r\n    );\r\n\r\n\r\n    canvas.addEventListener(\r\n      \"webglcontextrestored\",\r\n      () => {\r\n\r\n        GLOBE_RECOVERY.lastGoodAt =\r\n          Date.now();\r\n\r\n        nudgeGlobeRenderer();\r\n\r\n      },\r\n      false\r\n    );\r\n  }\r\n\r\n\r\n  function reloadGlobeSafely() {\r\n    if (\r\n      GLOBE_RECOVERY.reloads >=\r\n      GLOBE_RECOVERY.maxReloads\r\n    ) {\r\n      applyDarkGlobeFallback();\r\n      return;\r\n    }\r\n\r\n    GLOBE_RECOVERY.reloads += 1;\r\n\r\n    try {\r\n      const url =\r\n        new URL(\r\n          frame.src,\r\n          window.location.href\r\n        );\r\n\r\n      url.searchParams.set(\r\n        \"mxRecover\",\r\n        String(\r\n          Date.now()\r\n        )\r\n      );\r\n\r\n      frame.src =\r\n        url.toString();\r\n    }\r\n    catch (error) {\r\n      try {\r\n        frame.contentWindow\r\n          ?.location.reload();\r\n      }\r\n      catch (reloadError) {\r\n        \/* Keep dark fallback instead of white. *\/\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  function recoverGlobeIfNeeded() {\r\n    applyDarkGlobeFallback();\r\n\r\n    if (\r\n      globeLooksHealthy()\r\n    ) {\r\n      GLOBE_RECOVERY.lastGoodAt =\r\n        Date.now();\r\n\r\n      bindWebGLRecovery();\r\n\r\n      nudgeGlobeRenderer();\r\n\r\n      return;\r\n    }\r\n\r\n    setTimeout(\r\n      () => {\r\n\r\n        applyDarkGlobeFallback();\r\n\r\n        nudgeGlobeRenderer();\r\n\r\n        setTimeout(\r\n          () => {\r\n\r\n            if (\r\n              globeLooksHealthy()\r\n            ) {\r\n              GLOBE_RECOVERY.lastGoodAt =\r\n                Date.now();\r\n\r\n              bindWebGLRecovery();\r\n\r\n              return;\r\n            }\r\n\r\n            reloadGlobeSafely();\r\n\r\n          },\r\n          GLOBE_RECOVERY.retryDelay\r\n        );\r\n\r\n      },\r\n      250\r\n    );\r\n  }\r\n\r\n\r\n  frame.addEventListener(\r\n    \"load\",\r\n    () => {\r\n\r\n      applyDarkGlobeFallback();\r\n\r\n      setTimeout(\r\n        recoverGlobeIfNeeded,\r\n        350\r\n      );\r\n\r\n      setTimeout(\r\n        recoverGlobeIfNeeded,\r\n        1200\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\n  window.addEventListener(\r\n    \"pageshow\",\r\n    () => {\r\n\r\n      setTimeout(\r\n        recoverGlobeIfNeeded,\r\n        120\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\n  window.addEventListener(\r\n    \"focus\",\r\n    () => {\r\n\r\n      setTimeout(\r\n        recoverGlobeIfNeeded,\r\n        100\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\n  document.addEventListener(\r\n    \"visibilitychange\",\r\n    () => {\r\n\r\n      if (!document.hidden) {\r\n        setTimeout(\r\n          recoverGlobeIfNeeded,\r\n          120\r\n        );\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n  window.addEventListener(\r\n    \"resize\",\r\n    () => {\r\n\r\n      requestAnimationFrame(\r\n        nudgeGlobeRenderer\r\n      );\r\n\r\n    },\r\n    {\r\n      passive: true\r\n    }\r\n  );\r\n\r\n\r\n  \/* =========================================\r\n     CLEANUP\r\n  ========================================= *\/\r\n\r\n  window.addEventListener(\r\n    \"pagehide\",\r\n    () => {\r\n\r\n      clearTimeout(\r\n        searchTimer\r\n      );\r\n\r\n\r\n      clearPending();\r\n\r\n\r\n      abortSearch();\r\n\r\n      if (GLOBE_RECOVERY.healthTimer) {\r\n\r\n        clearInterval(\r\n          GLOBE_RECOVERY.healthTimer\r\n        );\r\n\r\n        GLOBE_RECOVERY.healthTimer =\r\n          null;\r\n\r\n      }\r\n\r\n    },\r\n    {\r\n      once: true\r\n    }\r\n  );\r\n\r\n})();\r\n\r\n<\/script>\r\n\r\n\r\n<style>\r\n\/* =========================================================\r\n   FINAL IFRAME HEIGHT FIX\r\n   Keeps the complete Global Market Sessions cards visible\r\n   above the next Elementor section.\r\n========================================================= *\/\r\n\r\n#mx-broker-globe {\r\n    height: 1040px !important;\r\n    min-height: 1040px !important;\r\n    overflow: visible !important;\r\n}\r\n\r\n#mx-broker-globe > iframe {\r\n    height: 1040px !important;\r\n    min-height: 1040px !important;\r\n    overflow: hidden !important;\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n    #mx-broker-globe,\r\n    #mx-broker-globe > iframe {\r\n        height: 960px !important;\r\n        min-height: 960px !important;\r\n    }\r\n}\r\n\r\n@media (max-width: 767px) {\r\n    #mx-broker-globe,\r\n    #mx-broker-globe > iframe {\r\n        height: 880px !important;\r\n        min-height: 880px !important;\r\n    }\r\n}\r\n<\/style>\r\n\r\n<style>\r\n\/* =========================================================\r\n   COMPACT GLOBE HEIGHT\r\n   Keep ranking in place; shrink the globe block itself.\r\n========================================================= *\/\r\n\r\n#mx-broker-globe {\r\n    height: 820px !important;\r\n    min-height: 820px !important;\r\n    overflow: hidden !important;\r\n}\r\n\r\n#mx-broker-globe > iframe {\r\n    height: 820px !important;\r\n    min-height: 820px !important;\r\n    overflow: hidden !important;\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n    #mx-broker-globe,\r\n    #mx-broker-globe > iframe {\r\n        height: 760px !important;\r\n        min-height: 760px !important;\r\n    }\r\n}\r\n\r\n@media (max-width: 767px) {\r\n    #mx-broker-globe,\r\n    #mx-broker-globe > iframe {\r\n        height: 720px !important;\r\n        min-height: 720px !important;\r\n    }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n    const wrapper = document.getElementById('mx-broker-globe');\r\n    if (!wrapper) return;\r\n\r\n    const frame = wrapper.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    function compactInnerGlobe() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            const styleId = 'mx-compact-globe-height-fix';\r\n            let style = doc.getElementById(styleId);\r\n\r\n            if (!style) {\r\n                style = doc.createElement('style');\r\n                style.id = styleId;\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* Desktop: reduce only the globe section height *\/\r\n                #globe-section {\r\n                    height: 500px !important;\r\n                    min-height: 500px !important;\r\n                    max-height: 500px !important;\r\n                }\r\n\r\n                \/* Keep globe centered inside the shorter section *\/\r\n                #markunox-globe,\r\n                #markunox-globe canvas {\r\n                    height: 100% !important;\r\n                }\r\n\r\n                \/* Compact the market data title section *\/\r\n                #market-data-section {\r\n                    padding-top: 24px !important;\r\n                    padding-bottom: 20px !important;\r\n                }\r\n\r\n                .market-data-header {\r\n                    margin-bottom: 12px !important;\r\n                }\r\n\r\n                \/* Make Global Market Sessions fully visible *\/\r\n                #market-sessions {\r\n                    padding-top: 10px !important;\r\n                    padding-bottom: 12px !important;\r\n                    overflow: visible !important;\r\n                }\r\n\r\n                #market-bar-items {\r\n                    overflow-x: auto !important;\r\n                    overflow-y: visible !important;\r\n                }\r\n\r\n                .market-session {\r\n                    min-height: 58px !important;\r\n                    padding: 8px 9px !important;\r\n                }\r\n\r\n                @media screen and (max-width: 1024px) {\r\n                    #globe-section {\r\n                        height: 440px !important;\r\n                        min-height: 440px !important;\r\n                        max-height: 440px !important;\r\n                    }\r\n\r\n                    #market-data-section {\r\n                        padding-top: 20px !important;\r\n                        padding-bottom: 16px !important;\r\n                    }\r\n                }\r\n\r\n                @media screen and (max-width: 767px) {\r\n                    #globe-section {\r\n                        height: 390px !important;\r\n                        min-height: 390px !important;\r\n                        max-height: 390px !important;\r\n                    }\r\n\r\n                    #market-data-section {\r\n                        padding-top: 16px !important;\r\n                        padding-bottom: 14px !important;\r\n                    }\r\n\r\n                    #market-sessions {\r\n                        padding-top: 8px !important;\r\n                        padding-bottom: 10px !important;\r\n                    }\r\n                }\r\n            `;\r\n\r\n            \/* Force Three.js\/globe to recalculate after height change. *\/\r\n            setTimeout(() => {\r\n                try {\r\n                    frame.contentWindow?.dispatchEvent(new Event('resize'));\r\n                } catch (e) {}\r\n            }, 60);\r\n\r\n            setTimeout(() => {\r\n                try {\r\n                    frame.contentWindow?.dispatchEvent(new Event('resize'));\r\n                } catch (e) {}\r\n            }, 350);\r\n\r\n        } catch (e) {\r\n            \/\/ Same-origin access expected on markunox.com.\r\n        }\r\n    }\r\n\r\n    frame.addEventListener('load', compactInnerGlobe);\r\n    window.addEventListener('resize', compactInnerGlobe, { passive: true });\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        compactInnerGlobe();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<style>\r\n\/* =========================================================\r\n   FINAL CITY DETAILS + SESSION CARDS FIX\r\n========================================================= *\/\r\n#mx-broker-globe,\r\n#mx-broker-globe > iframe {\r\n    height: 860px !important;\r\n    min-height: 860px !important;\r\n    overflow: hidden !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n    const wrapper = document.getElementById('mx-broker-globe');\r\n    if (!wrapper) return;\r\n\r\n    const frame = wrapper.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    function applyFinalCityMarketFix() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            \/* -----------------------------\r\n               1) ONE CLEAN LAYOUT PATCH\r\n            ------------------------------ *\/\r\n            const styleId = 'mx-final-city-market-fix';\r\n            let style = doc.getElementById(styleId);\r\n\r\n            if (!style) {\r\n                style = doc.createElement('style');\r\n                style.id = styleId;\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                #globe-section {\r\n                    height: 455px !important;\r\n                    min-height: 455px !important;\r\n                    max-height: 455px !important;\r\n                    overflow: hidden !important;\r\n                }\r\n\r\n                #market-panel {\r\n                    top: 54px !important;\r\n                    right: 20px !important;\r\n                    bottom: auto !important;\r\n                    width: 275px !important;\r\n                    max-height: 370px !important;\r\n                    overflow-y: auto !important;\r\n                    overflow-x: hidden !important;\r\n                    z-index: 200 !important;\r\n                    scrollbar-width: none !important;\r\n                    -ms-overflow-style: none !important;\r\n                }\r\n\r\n                #market-panel::-webkit-scrollbar {\r\n                    display: none !important;\r\n                    width: 0 !important;\r\n                    height: 0 !important;\r\n                }\r\n\r\n                #market-data-section {\r\n                    padding: 18px 24px 14px !important;\r\n                }\r\n\r\n                .market-data-header {\r\n                    margin-bottom: 8px !important;\r\n                }\r\n\r\n                #market-sessions {\r\n                    position: relative !important;\r\n                    display: block !important;\r\n                    visibility: visible !important;\r\n                    opacity: 1 !important;\r\n                    min-height: 148px !important;\r\n                    height: auto !important;\r\n                    padding: 8px 24px 18px !important;\r\n                    overflow: visible !important;\r\n                    z-index: 40 !important;\r\n                }\r\n\r\n                #market-bar-items {\r\n                    display: flex !important;\r\n                    visibility: visible !important;\r\n                    opacity: 1 !important;\r\n                    align-items: stretch !important;\r\n                    gap: 10px !important;\r\n                    min-height: 92px !important;\r\n                    overflow-x: auto !important;\r\n                    overflow-y: visible !important;\r\n                    padding: 8px 4px 10px !important;\r\n                }\r\n\r\n                .market-session {\r\n                    display: block !important;\r\n                    visibility: visible !important;\r\n                    opacity: 1 !important;\r\n                    flex: 0 0 235px !important;\r\n                    width: 235px !important;\r\n                    min-width: 235px !important;\r\n                    min-height: 82px !important;\r\n                    height: auto !important;\r\n                    padding: 10px 12px !important;\r\n                    overflow: visible !important;\r\n                }\r\n\r\n                .session-name,\r\n                .session-time,\r\n                .session-status,\r\n                .session-change {\r\n                    overflow: visible !important;\r\n                    text-overflow: clip !important;\r\n                }\r\n\r\n                \/* Hide empty\/unavailable LIVE-only stat cells.\r\n                   Keep factual city information visible. *\/\r\n                #market-panel .mx-live-unavailable {\r\n                    display: none !important;\r\n                }\r\n\r\n                @media screen and (max-width: 1024px) {\r\n                    #globe-section {\r\n                        height: 425px !important;\r\n                        min-height: 425px !important;\r\n                        max-height: 425px !important;\r\n                    }\r\n\r\n                    #market-panel {\r\n                        top: 52px !important;\r\n                        right: 14px !important;\r\n                        width: 250px !important;\r\n                        max-height: 345px !important;\r\n                    }\r\n\r\n                    #market-sessions {\r\n                        min-height: 140px !important;\r\n                        padding-left: 16px !important;\r\n                        padding-right: 16px !important;\r\n                    }\r\n\r\n                    .market-session {\r\n                        flex-basis: 210px !important;\r\n                        width: 210px !important;\r\n                        min-width: 210px !important;\r\n                    }\r\n                }\r\n            `;\r\n\r\n            \/* -----------------------------\r\n               2) CLEAN N\/A VALUES\r\n               Do NOT invent live market data.\r\n               Hide only the unavailable live metrics.\r\n            ------------------------------ *\/\r\n            function markUnavailableLiveStats() {\r\n                const ids = [\r\n                    'panel-price',\r\n                    'panel-change',\r\n                    'panel-volume',\r\n                    'panel-volatility'\r\n                ];\r\n\r\n                ids.forEach(function (id) {\r\n                    const value = doc.getElementById(id);\r\n                    if (!value) return;\r\n\r\n                    const text = String(value.textContent || '').trim().toUpperCase();\r\n                    const statBox =\r\n                        value.closest('.financial-box') ||\r\n                        value.closest('.time-box') ||\r\n                        value.parentElement;\r\n\r\n                    if (!statBox) return;\r\n\r\n                    const unavailable =\r\n                        !text ||\r\n                        text === 'N\/A' ||\r\n                        text === 'NA' ||\r\n                        text === 'NULL' ||\r\n                        text === '--';\r\n\r\n                    statBox.classList.toggle(\r\n                        'mx-live-unavailable',\r\n                        unavailable\r\n                    );\r\n                });\r\n\r\n                \/* Bottom cards: don't display a meaningless N\/A line. *\/\r\n                doc.querySelectorAll('.market-session').forEach(function (card) {\r\n                    card.querySelectorAll('*').forEach(function (node) {\r\n                        if (node.children.length) return;\r\n\r\n                        const text = String(node.textContent || '').trim().toUpperCase();\r\n\r\n                        if (text === 'N\/A' || text === 'NA') {\r\n                            node.style.display = 'none';\r\n                        }\r\n                    });\r\n                });\r\n            }\r\n\r\n            markUnavailableLiveStats();\r\n\r\n            \/* Keep cleanup active after async API updates. *\/\r\n            const panel = doc.getElementById('market-panel');\r\n            const sessions = doc.getElementById('market-bar-items');\r\n\r\n            if (!doc.documentElement.dataset.mxFinalMarketObserver) {\r\n                doc.documentElement.dataset.mxFinalMarketObserver = '1';\r\n\r\n                const observer = new MutationObserver(function () {\r\n                    markUnavailableLiveStats();\r\n                });\r\n\r\n                if (panel) {\r\n                    observer.observe(panel, {\r\n                        childList: true,\r\n                        subtree: true,\r\n                        characterData: true\r\n                    });\r\n                }\r\n\r\n                if (sessions) {\r\n                    observer.observe(sessions, {\r\n                        childList: true,\r\n                        subtree: true,\r\n                        characterData: true\r\n                    });\r\n                }\r\n            }\r\n\r\n            \/* Force Three.js to recalculate against the compact section. *\/\r\n            setTimeout(function () {\r\n                try {\r\n                    frame.contentWindow?.dispatchEvent(new Event('resize'));\r\n                } catch (e) {}\r\n            }, 80);\r\n\r\n            setTimeout(function () {\r\n                try {\r\n                    frame.contentWindow?.dispatchEvent(new Event('resize'));\r\n                } catch (e) {}\r\n            }, 350);\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener('load', applyFinalCityMarketFix);\r\n    window.addEventListener('resize', applyFinalCityMarketFix, { passive: true });\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        applyFinalCityMarketFix();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById('mx-broker-globe');\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    function moveGlobalLiveUp() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            const candidates = Array.from(doc.querySelectorAll('body *'));\r\n\r\n            const liveBadge = candidates.find(function (el) {\r\n                const text = String(el.textContent || '')\r\n                    .replace(\/\\s+\/g, ' ')\r\n                    .trim()\r\n                    .toUpperCase();\r\n\r\n                return (\r\n                    text.includes('GLOBAL MARKETS') &&\r\n                    text.includes('LIVE') &&\r\n                    text.length <= 45\r\n                );\r\n            });\r\n\r\n            if (!liveBadge) return;\r\n\r\n            const target =\r\n                liveBadge.parentElement &&\r\n                liveBadge.parentElement.textContent.trim().length <= 60\r\n                    ? liveBadge.parentElement\r\n                    : liveBadge;\r\n\r\n            target.style.setProperty('position', 'absolute', 'important');\r\n            target.style.setProperty('top', '8px', 'important');\r\n            target.style.setProperty('right', '18px', 'important');\r\n            target.style.setProperty('bottom', 'auto', 'important');\r\n            target.style.setProperty('margin', '0', 'important');\r\n            target.style.setProperty('z-index', '320', 'important');\r\n            target.style.setProperty('transform', 'none', 'important');\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener('load', function () {\r\n        setTimeout(moveGlobalLiveUp, 250);\r\n        setTimeout(moveGlobalLiveUp, 800);\r\n        setTimeout(moveGlobalLiveUp, 1600);\r\n    });\r\n\r\n    window.addEventListener('resize', moveGlobalLiveUp, { passive: true });\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        moveGlobalLiveUp();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById('mx-broker-globe');\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    function installGlobeWheelGate() {\r\n        try {\r\n            const win = frame.contentWindow;\r\n            const doc = frame.contentDocument || win?.document;\r\n            if (!win || !doc) return;\r\n\r\n            if (doc.documentElement.dataset.mxWheelGateInstalled === '1') {\r\n                return;\r\n            }\r\n\r\n            doc.documentElement.dataset.mxWheelGateInstalled = '1';\r\n\r\n            let lastPointer = {\r\n                x: 0,\r\n                y: 0\r\n            };\r\n\r\n            function getGlobeCanvas() {\r\n                return (\r\n                    doc.querySelector('#markunox-globe canvas') ||\r\n                    doc.querySelector('#globe-section canvas') ||\r\n                    doc.querySelector('canvas')\r\n                );\r\n            }\r\n\r\n            function isPointerOnVisibleGlobe(clientX, clientY) {\r\n                const canvas = getGlobeCanvas();\r\n                if (!canvas) return false;\r\n\r\n                const rect = canvas.getBoundingClientRect();\r\n\r\n                if (\r\n                    clientX < rect.left ||\r\n                    clientX > rect.right ||\r\n                    clientY < rect.top ||\r\n                    clientY > rect.bottom\r\n                ) {\r\n                    return false;\r\n                }\r\n\r\n                \/*\r\n                 * The canvas covers the whole black scene, while the real globe\r\n                 * occupies only the center area. Treat only that circular area\r\n                 * as zoom-active.\r\n                 *\/\r\n                const centerX = rect.left + rect.width * 0.50;\r\n                const centerY = rect.top + rect.height * 0.49;\r\n\r\n                \/*\r\n                 * Visual globe radius tuned to the current MARKUNOX layout.\r\n                 * 0.33 keeps zoom available on the globe itself but not on the\r\n                 * surrounding black canvas.\r\n                 *\/\r\n                const radius = Math.min(rect.width, rect.height) * 0.33;\r\n\r\n                const dx = clientX - centerX;\r\n                const dy = clientY - centerY;\r\n\r\n                return (dx * dx + dy * dy) <= (radius * radius);\r\n            }\r\n\r\n            doc.addEventListener(\r\n                'pointermove',\r\n                function (event) {\r\n                    lastPointer.x = event.clientX;\r\n                    lastPointer.y = event.clientY;\r\n                },\r\n                true\r\n            );\r\n\r\n            \/*\r\n             * Capture wheel before Three\/Globe receives it.\r\n             * - On the globe: keep native zoom.\r\n             * - On black area: cancel globe zoom and scroll the parent page.\r\n             *\/\r\n            doc.addEventListener(\r\n                'wheel',\r\n                function (event) {\r\n                    \/* Allow the Market Intelligence panel to use its own scroll. *\/\r\n                    const marketPanel =\r\n                        event.target?.closest?.('#market-panel');\r\n\r\n                    if (marketPanel) {\r\n                        return;\r\n                    }\r\n\r\n                    const x =\r\n                        Number.isFinite(event.clientX)\r\n                            ? event.clientX\r\n                            : lastPointer.x;\r\n\r\n                    const y =\r\n                        Number.isFinite(event.clientY)\r\n                            ? event.clientY\r\n                            : lastPointer.y;\r\n\r\n                    if (isPointerOnVisibleGlobe(x, y)) {\r\n                        return;\r\n                    }\r\n\r\n                    event.preventDefault();\r\n                    event.stopPropagation();\r\n                    event.stopImmediatePropagation();\r\n\r\n                    try {\r\n                        window.scrollBy({\r\n                            top: event.deltaY,\r\n                            left: event.deltaX,\r\n                            behavior: 'auto'\r\n                        });\r\n                    } catch (error) {\r\n                        window.scrollBy(0, event.deltaY);\r\n                    }\r\n                },\r\n                {\r\n                    capture: true,\r\n                    passive: false\r\n                }\r\n            );\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener('load', function () {\r\n        setTimeout(installGlobeWheelGate, 250);\r\n        setTimeout(installGlobeWheelGate, 900);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        installGlobeWheelGate();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<style>\r\n\/* =========================================================\r\n   STABLE GLOBE HEIGHT \u2014 NO PAGE JUMP\r\n   Fixed height chosen to end immediately after market cards.\r\n========================================================= *\/\r\n#mx-broker-globe,\r\n#mx-broker-globe > iframe {\r\n    height: 705px !important;\r\n    min-height: 705px !important;\r\n    max-height: 705px !important;\r\n    overflow: hidden !important;\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n    #mx-broker-globe,\r\n    #mx-broker-globe > iframe {\r\n        height: 665px !important;\r\n        min-height: 665px !important;\r\n        max-height: 665px !important;\r\n    }\r\n}\r\n\r\n@media (max-width: 767px) {\r\n    #mx-broker-globe,\r\n    #mx-broker-globe > iframe {\r\n        height: 620px !important;\r\n        min-height: 620px !important;\r\n        max-height: 620px !important;\r\n    }\r\n}\r\n<\/style>\r\n\r\n<style>\r\n\/* =========================================================\r\n   HARD WHITE-SCREEN FALLBACK \u2014 SAFE \/ NO OBSERVER LOOPS\r\n========================================================= *\/\r\n#mx-broker-globe,\r\n#mx-broker-globe > iframe {\r\n    background: #020408 !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById('mx-broker-globe');\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    let recoveryLock = false;\r\n\r\n    function hardenChildBackground() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            let style = doc.getElementById('mx-hard-white-screen-fix');\r\n\r\n            if (!style) {\r\n                style = doc.createElement('style');\r\n                style.id = 'mx-hard-white-screen-fix';\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                html,\r\n                body,\r\n                #markunox-app,\r\n                #globe-section,\r\n                #markunox-globe {\r\n                    background: #020408 !important;\r\n                }\r\n\r\n                html,\r\n                body {\r\n                    margin: 0 !important;\r\n                }\r\n\r\n                #markunox-globe canvas {\r\n                    display: block !important;\r\n                    background: #020408 !important;\r\n                }\r\n            `;\r\n\r\n            if (doc.documentElement) {\r\n                doc.documentElement.style.background = '#020408';\r\n            }\r\n\r\n            if (doc.body) {\r\n                doc.body.style.background = '#020408';\r\n            }\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function nudgeRenderer() {\r\n        if (recoveryLock) return;\r\n\r\n        recoveryLock = true;\r\n\r\n        try {\r\n            hardenChildBackground();\r\n\r\n            const win = frame.contentWindow;\r\n            if (!win) return;\r\n\r\n            win.dispatchEvent(new Event('resize'));\r\n            win.dispatchEvent(new Event('focus'));\r\n\r\n        } catch (e) {}\r\n\r\n        setTimeout(function () {\r\n            recoveryLock = false;\r\n        }, 180);\r\n    }\r\n\r\n    function bindContextRecovery() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            const canvas =\r\n                doc.querySelector('#markunox-globe canvas') ||\r\n                doc.querySelector('#globe-section canvas') ||\r\n                doc.querySelector('canvas');\r\n\r\n            if (!canvas || canvas.dataset.mxContextRecovery === '1') {\r\n                return;\r\n            }\r\n\r\n            canvas.dataset.mxContextRecovery = '1';\r\n\r\n            canvas.addEventListener(\r\n                'webglcontextlost',\r\n                function (event) {\r\n                    event.preventDefault();\r\n                    hardenChildBackground();\r\n\r\n                    setTimeout(function () {\r\n                        nudgeRenderer();\r\n                    }, 250);\r\n                },\r\n                false\r\n            );\r\n\r\n            canvas.addEventListener(\r\n                'webglcontextrestored',\r\n                function () {\r\n                    setTimeout(function () {\r\n                        nudgeRenderer();\r\n                    }, 80);\r\n                },\r\n                false\r\n            );\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function safeInit() {\r\n        hardenChildBackground();\r\n\r\n        setTimeout(nudgeRenderer, 120);\r\n        setTimeout(bindContextRecovery, 300);\r\n        setTimeout(nudgeRenderer, 700);\r\n    }\r\n\r\n    frame.addEventListener('load', safeInit);\r\n\r\n    window.addEventListener(\r\n        'pageshow',\r\n        function () {\r\n            setTimeout(nudgeRenderer, 80);\r\n        }\r\n    );\r\n\r\n    window.addEventListener(\r\n        'focus',\r\n        function () {\r\n            setTimeout(nudgeRenderer, 80);\r\n        }\r\n    );\r\n\r\n    document.addEventListener(\r\n        'visibilitychange',\r\n        function () {\r\n            if (!document.hidden) {\r\n                setTimeout(nudgeRenderer, 100);\r\n            }\r\n        }\r\n    );\r\n\r\n    window.addEventListener(\r\n        'resize',\r\n        function () {\r\n            requestAnimationFrame(nudgeRenderer);\r\n        },\r\n        { passive: true }\r\n    );\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        safeInit();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById('mx-broker-globe');\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    function installVisibleStarfield() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc || !doc.body) return;\r\n\r\n            const section = doc.getElementById('globe-section');\r\n            if (!section) return;\r\n\r\n            if (doc.getElementById('mx-visible-starfield')) return;\r\n\r\n            const layer = doc.createElement('div');\r\n            layer.id = 'mx-visible-starfield';\r\n            layer.setAttribute('aria-hidden', 'true');\r\n\r\n            section.appendChild(layer);\r\n\r\n            const style = doc.createElement('style');\r\n            style.id = 'mx-visible-starfield-style';\r\n\r\n            style.textContent = `\r\n                #globe-section {\r\n                    position: relative !important;\r\n                    isolation: isolate !important;\r\n                    overflow: hidden !important;\r\n                    background: #020408 !important;\r\n                }\r\n\r\n                #markunox-globe {\r\n                    position: relative !important;\r\n                    z-index: 2 !important;\r\n                }\r\n\r\n                #markunox-globe canvas {\r\n                    position: relative !important;\r\n                    z-index: 2 !important;\r\n                    background: transparent !important;\r\n                }\r\n\r\n                #mx-visible-starfield {\r\n                    position: absolute !important;\r\n                    inset: 0 !important;\r\n                    z-index: 5 !important;\r\n                    pointer-events: none !important;\r\n                    opacity: .92 !important;\r\n\r\n                    background-image:\r\n                        radial-gradient(circle, rgba(255,255,255,.42) 0 1px, transparent 1.5px),\r\n                        radial-gradient(circle, rgba(7,223,226,.38) 0 1px, transparent 1.6px),\r\n                        radial-gradient(circle, rgba(5,97,224,.34) 0 1px, transparent 1.7px);\r\n\r\n                    background-size:\r\n                        73px 73px,\r\n                        119px 119px,\r\n                        181px 181px;\r\n\r\n                    background-position:\r\n                        11px 17px,\r\n                        41px 63px,\r\n                        83px 29px;\r\n\r\n                    -webkit-mask-image:\r\n                        radial-gradient(\r\n                            circle at 50% 47%,\r\n                            rgba(0,0,0,.10) 0 24%,\r\n                            rgba(0,0,0,.32) 34%,\r\n                            #000 52%\r\n                        );\r\n                    mask-image:\r\n                        radial-gradient(\r\n                            circle at 50% 47%,\r\n                            rgba(0,0,0,.10) 0 24%,\r\n                            rgba(0,0,0,.32) 34%,\r\n                            #000 52%\r\n                        );\r\n                }\r\n\r\n                #mx-visible-starfield::before {\r\n                    content: \"\";\r\n                    position: absolute;\r\n                    inset: 0;\r\n                    background:\r\n                        radial-gradient(circle at 15% 24%, rgba(7,223,226,.16), transparent 11%),\r\n                        radial-gradient(circle at 82% 20%, rgba(5,97,224,.14), transparent 12%),\r\n                        radial-gradient(circle at 78% 74%, rgba(7,223,226,.11), transparent 12%),\r\n                        radial-gradient(circle at 24% 76%, rgba(5,97,224,.10), transparent 12%);\r\n                    opacity: .75;\r\n                }\r\n\r\n                #mx-visible-starfield::after {\r\n                    content: \"\";\r\n                    position: absolute;\r\n                    inset: 0;\r\n                    opacity: .42;\r\n                    background:\r\n                        linear-gradient(22deg, transparent 0 29%, rgba(7,223,226,.11) 29.2%, transparent 29.5% 100%),\r\n                        linear-gradient(148deg, transparent 0 43%, rgba(5,97,224,.10) 43.2%, transparent 43.5% 100%),\r\n                        linear-gradient(78deg, transparent 0 69%, rgba(7,223,226,.08) 69.2%, transparent 69.5% 100%);\r\n                }\r\n\r\n                \/* Keep UI panels above the star layer *\/\r\n                #markunox-topbar,\r\n                #market-panel,\r\n                #mx-safe-live-snapshot,\r\n                .mx-search,\r\n                .mx-card,\r\n                #mx-city-top-brokers,\r\n                #mx-market-hover-tip {\r\n                    position: relative !important;\r\n                    z-index: 20 !important;\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #mx-visible-starfield {\r\n                        opacity: .72 !important;\r\n                        background-size:\r\n                            62px 62px,\r\n                            103px 103px,\r\n                            157px 157px;\r\n                    }\r\n                }\r\n            `;\r\n\r\n            (doc.head || doc.documentElement).appendChild(style);\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        installVisibleStarfield();\r\n        setTimeout(installVisibleStarfield, 400);\r\n        setTimeout(installVisibleStarfield, 1200);\r\n    }\r\n\r\n    frame.addEventListener('load', boot);\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById('mx-broker-globe');\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector('iframe');\r\n    if (!frame) return;\r\n\r\n    function restorePanels() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc || !doc.body) return;\r\n\r\n            \/* =====================================================\r\n               RESTORE RIGHT CITY PANEL + LEFT SNAPSHOT\r\n               Important: do NOT change original positioning model.\r\n            ====================================================== *\/\r\n\r\n            let style = doc.getElementById('mx-panel-restore-style');\r\n\r\n            if (!style) {\r\n                style = doc.createElement('style');\r\n                style.id = 'mx-panel-restore-style';\r\n\r\n                style.textContent = `\r\n                    \/* Right city details panel *\/\r\n                    #market-panel {\r\n                        position: absolute !important;\r\n                        top: 54px !important;\r\n                        right: 20px !important;\r\n                        left: auto !important;\r\n                        bottom: auto !important;\r\n\r\n                        width: 275px !important;\r\n                        max-height: 390px !important;\r\n\r\n                        display: block;\r\n                        z-index: 60 !important;\r\n\r\n                        overflow-y: auto !important;\r\n                        overflow-x: hidden !important;\r\n\r\n                        scrollbar-width: none !important;\r\n                        -ms-overflow-style: none !important;\r\n                    }\r\n\r\n                    #market-panel[hidden] {\r\n                        display: none !important;\r\n                    }\r\n\r\n                    #market-panel::-webkit-scrollbar {\r\n                        display: none !important;\r\n                        width: 0 !important;\r\n                        height: 0 !important;\r\n                    }\r\n\r\n                    \/* Star layer stays behind all information UI *\/\r\n                    #mx-visible-starfield {\r\n                        z-index: 3 !important;\r\n                        pointer-events: none !important;\r\n                    }\r\n\r\n                    #markunox-globe,\r\n                    #markunox-globe canvas {\r\n                        z-index: 2 !important;\r\n                    }\r\n\r\n                    #market-panel,\r\n                    #mx-restored-live-snapshot {\r\n                        z-index: 60 !important;\r\n                    }\r\n\r\n                    \/* Left snapshot *\/\r\n                    #mx-restored-live-snapshot {\r\n                        position: absolute !important;\r\n                        left: 30px !important;\r\n                        top: 160px !important;\r\n\r\n                        width: 230px !important;\r\n                        padding: 13px !important;\r\n\r\n                        border: 1px solid rgba(105,132,166,.24) !important;\r\n                        border-radius: 12px !important;\r\n\r\n                        background:\r\n                            linear-gradient(\r\n                                180deg,\r\n                                rgba(8,14,24,.92),\r\n                                rgba(5,10,18,.92)\r\n                            ) !important;\r\n\r\n                        box-shadow:\r\n                            0 16px 34px rgba(0,0,0,.20) !important;\r\n\r\n                        backdrop-filter: blur(8px);\r\n                        pointer-events: none;\r\n                    }\r\n\r\n                    #mx-restored-live-snapshot .mx-rs-kicker {\r\n                        margin-bottom: 10px;\r\n                        color: #5de4e2;\r\n                        font-size: 8px;\r\n                        font-weight: 900;\r\n                        letter-spacing: 1.55px;\r\n                        text-transform: uppercase;\r\n                    }\r\n\r\n                    #mx-restored-live-snapshot .mx-rs-grid {\r\n                        display: grid;\r\n                        grid-template-columns: 1fr 1fr;\r\n                        gap: 7px;\r\n                    }\r\n\r\n                    #mx-restored-live-snapshot .mx-rs-cell {\r\n                        min-height: 46px;\r\n                        padding: 8px 9px;\r\n                        border-radius: 8px;\r\n                        border: 1px solid rgba(112,137,170,.12);\r\n                        background: rgba(14,22,36,.72);\r\n                    }\r\n\r\n                    #mx-restored-live-snapshot .mx-rs-label {\r\n                        display: block;\r\n                        margin-bottom: 5px;\r\n                        color: #6e7d95;\r\n                        font-size: 7px;\r\n                        font-weight: 800;\r\n                        letter-spacing: .9px;\r\n                        text-transform: uppercase;\r\n                    }\r\n\r\n                    #mx-restored-live-snapshot .mx-rs-value {\r\n                        display: block;\r\n                        color: #f5f8ff;\r\n                        font-size: 12px;\r\n                        font-weight: 900;\r\n                        line-height: 1.15;\r\n                    }\r\n\r\n                    #mx-restored-live-snapshot .mx-rs-value.is-live {\r\n                        color: #4fe09d;\r\n                    }\r\n\r\n                    @media screen and (max-width: 1024px) {\r\n                        #market-panel {\r\n                            right: 14px !important;\r\n                            width: 250px !important;\r\n                            max-height: 350px !important;\r\n                        }\r\n\r\n                        #mx-restored-live-snapshot {\r\n                            left: 18px !important;\r\n                            top: 150px !important;\r\n                            width: 205px !important;\r\n                        }\r\n                    }\r\n\r\n                    @media screen and (max-width: 767px) {\r\n                        #mx-restored-live-snapshot {\r\n                            display: none !important;\r\n                        }\r\n\r\n                        #market-panel {\r\n                            top: 50px !important;\r\n                            right: 10px !important;\r\n                            width: 220px !important;\r\n                            max-height: 315px !important;\r\n                        }\r\n                    }\r\n                `;\r\n\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            \/* Create left snapshot once. *\/\r\n            const section = doc.getElementById('globe-section');\r\n\r\n            if (\r\n                section &&\r\n                !doc.getElementById('mx-restored-live-snapshot')\r\n            ) {\r\n                const cards = Array.from(\r\n                    doc.querySelectorAll('.market-session')\r\n                );\r\n\r\n                let openCount = 0;\r\n\r\n                cards.forEach(function (card) {\r\n                    const text = String(card.innerText || '').toUpperCase();\r\n\r\n                    const isOpen =\r\n                        text.includes('OPEN') &&\r\n                        !text.includes('CLOSED');\r\n\r\n                    if (isOpen) {\r\n                        openCount += 1;\r\n                    }\r\n                });\r\n\r\n                const total = cards.length;\r\n                const closedCount = Math.max(0, total - openCount);\r\n\r\n                const snapshot = doc.createElement('aside');\r\n                snapshot.id = 'mx-restored-live-snapshot';\r\n\r\n                snapshot.innerHTML = `\r\n                    <div class=\"mx-rs-kicker\">Live Global Snapshot<\/div>\r\n\r\n                    <div class=\"mx-rs-grid\">\r\n                        <div class=\"mx-rs-cell\">\r\n                            <span class=\"mx-rs-label\">Markets Open<\/span>\r\n                            <strong class=\"mx-rs-value is-live\">${openCount} \/ ${total}<\/strong>\r\n                        <\/div>\r\n\r\n                        <div class=\"mx-rs-cell\">\r\n                            <span class=\"mx-rs-label\">Markets Closed<\/span>\r\n                            <strong class=\"mx-rs-value\">${closedCount}<\/strong>\r\n                        <\/div>\r\n\r\n                        <div class=\"mx-rs-cell\">\r\n                            <span class=\"mx-rs-label\">Coverage<\/span>\r\n                            <strong class=\"mx-rs-value\">${total} Cities<\/strong>\r\n                        <\/div>\r\n\r\n                        <div class=\"mx-rs-cell\">\r\n                            <span class=\"mx-rs-label\">System<\/span>\r\n                            <strong class=\"mx-rs-value is-live\">LIVE<\/strong>\r\n                        <\/div>\r\n                    <\/div>\r\n                `;\r\n\r\n                section.appendChild(snapshot);\r\n            }\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        restorePanels();\r\n        setTimeout(restorePanels, 400);\r\n        setTimeout(restorePanels, 1100);\r\n    }\r\n\r\n    frame.addEventListener('load', boot);\r\n\r\n    if (frame.contentDocument?.readyState === 'complete') {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    const CONFIG = {\r\n        cityBrokersApi:\r\n            \"https:\/\/api.markunox.com\/city-top-brokers.php\",\r\n\r\n        optionalFeeds: {\r\n            news:\r\n                \"https:\/\/markunox.com\/wp-json\/markunox\/v1\/news\",\r\n            events:\r\n                \"https:\/\/markunox.com\/wp-json\/markunox\/v1\/economic-calendar\",\r\n            capitalFlow:\r\n                \"https:\/\/markunox.com\/wp-json\/markunox\/v1\/capital-flow\"\r\n        },\r\n\r\n        snapshotEveryMs:\r\n            60000,\r\n\r\n        maxSnapshots:\r\n            240,\r\n\r\n        storageKey:\r\n            \"markunox_globe_intelligence_history_v1\"\r\n    };\r\n\r\n\r\n    \/* =========================================================\r\n       STATIC FINANCIAL METADATA\r\n       Stable institutional metadata only.\r\n       No hard-coded live rates or live market claims.\r\n    ========================================================= *\/\r\n\r\n    const CITY_META = {\r\n\r\n        \"New York\": {\r\n            centralBank: \"Federal Reserve\",\r\n            regulators: [\"SEC\", \"CFTC\", \"NFA\"],\r\n            exchanges: [\"NYSE\", \"Nasdaq\"],\r\n            commodities: [\"COMEX access\", \"US energy markets\"],\r\n            digital: \"Major institutional digital-asset hub\",\r\n            institutional: \"Global banking, asset management and capital markets\"\r\n        },\r\n\r\n        \"Chicago\": {\r\n            centralBank: \"Federal Reserve\",\r\n            regulators: [\"CFTC\", \"NFA\"],\r\n            exchanges: [\"CME Group\", \"CBOE\"],\r\n            commodities: [\"Futures\", \"Rates\", \"Agriculture\", \"Energy\"],\r\n            digital: \"Derivatives-linked digital asset activity\",\r\n            institutional: \"Global derivatives and futures hub\"\r\n        },\r\n\r\n        \"San Francisco\": {\r\n            centralBank: \"Federal Reserve\",\r\n            regulators: [\"SEC\", \"CFTC\"],\r\n            exchanges: [\"Nasdaq ecosystem\"],\r\n            commodities: [\"Technology-linked markets\"],\r\n            digital: \"Major technology and digital-asset ecosystem\",\r\n            institutional: \"Technology, venture capital and asset management\"\r\n        },\r\n\r\n        \"Toronto\": {\r\n            centralBank: \"Bank of Canada\",\r\n            regulators: [\"CSA\", \"CIRO\"],\r\n            exchanges: [\"TSX\", \"TSX Venture\"],\r\n            commodities: [\"Mining\", \"Energy\", \"Metals\"],\r\n            digital: \"Canadian institutional digital-asset market\",\r\n            institutional: \"Banking, mining finance and asset management\"\r\n        },\r\n\r\n        \"Los Angeles\": {\r\n            centralBank: \"Federal Reserve\",\r\n            regulators: [\"SEC\", \"CFTC\"],\r\n            exchanges: [\"Nasdaq \/ US equities access\"],\r\n            commodities: [\"US energy and commodity markets\"],\r\n            digital: \"Large technology and digital-asset ecosystem\",\r\n            institutional: \"Asset management, private capital and technology finance\"\r\n        },\r\n\r\n        \"Boston\": {\r\n            centralBank: \"Federal Reserve\",\r\n            regulators: [\"SEC\", \"CFTC\"],\r\n            exchanges: [\"US equity markets\"],\r\n            commodities: [\"US institutional market access\"],\r\n            digital: \"Institutional digital-asset participation\",\r\n            institutional: \"Asset management, mutual funds and institutional investing\"\r\n        },\r\n\r\n        \"Mexico City\": {\r\n            centralBank: \"Bank of Mexico\",\r\n            regulators: [\"CNBV\", \"Banxico\"],\r\n            exchanges: [\"Bolsa Mexicana de Valores\"],\r\n            commodities: [\"Energy, metals and agriculture exposure\"],\r\n            digital: \"Developing regulated digital-finance ecosystem\",\r\n            institutional: \"Mexico banking, brokerage and capital-markets hub\"\r\n        },\r\n\r\n        \"London\": {\r\n            centralBank: \"Bank of England\",\r\n            regulators: [\"FCA\", \"PRA\"],\r\n            exchanges: [\"London Stock Exchange\"],\r\n            commodities: [\"Gold\", \"Metals\", \"Energy\", \"FX\"],\r\n            digital: \"Large regulated digital-asset market\",\r\n            institutional: \"Global FX, banking and asset-management centre\"\r\n        },\r\n\r\n        \"Frankfurt\": {\r\n            centralBank: \"European Central Bank\",\r\n            regulators: [\"BaFin\", \"ECB\"],\r\n            exchanges: [\"Deutsche B\u00f6rse\", \"Xetra\"],\r\n            commodities: [\"European rates and derivatives\"],\r\n            digital: \"EU regulated digital-finance market\",\r\n            institutional: \"Euro-area banking and monetary-policy centre\"\r\n        },\r\n\r\n        \"Paris\": {\r\n            centralBank: \"European Central Bank \/ Banque de France\",\r\n            regulators: [\"AMF\", \"ACPR\"],\r\n            exchanges: [\"Euronext Paris\"],\r\n            commodities: [\"European equities and derivatives\"],\r\n            digital: \"EU digital-finance ecosystem\",\r\n            institutional: \"Banking, insurance and asset management\"\r\n        },\r\n\r\n        \"Zurich\": {\r\n            centralBank: \"Swiss National Bank\",\r\n            regulators: [\"FINMA\"],\r\n            exchanges: [\"SIX Swiss Exchange\"],\r\n            commodities: [\"Precious metals\", \"FX\"],\r\n            digital: \"Swiss digital-asset and custody hub\",\r\n            institutional: \"Private banking, wealth management and FX\"\r\n        },\r\n\r\n        \"Dubai\": {\r\n            centralBank: \"Central Bank of the UAE\",\r\n            regulators: [\"SCA\", \"DFSA\", \"VARA\"],\r\n            exchanges: [\"DFM\", \"Nasdaq Dubai\"],\r\n            commodities: [\"Gold\", \"Energy\", \"Commodities trading\"],\r\n            digital: \"Major regional virtual-asset hub\",\r\n            institutional: \"MENA banking, brokerage and wealth-management hub\"\r\n        },\r\n\r\n        \"Doha\": {\r\n            centralBank: \"Qatar Central Bank\",\r\n            regulators: [\"QFMA\", \"QFC Regulatory Authority\"],\r\n            exchanges: [\"Qatar Stock Exchange\"],\r\n            commodities: [\"Energy-linked finance\"],\r\n            digital: \"Developing digital-finance ecosystem\",\r\n            institutional: \"Energy finance, sovereign capital and banking\"\r\n        },\r\n\r\n        \"Riyadh\": {\r\n            centralBank: \"Saudi Central Bank\",\r\n            regulators: [\"CMA\", \"SAMA\"],\r\n            exchanges: [\"Saudi Exchange (Tadawul)\"],\r\n            commodities: [\"Energy-linked capital markets\"],\r\n            digital: \"Developing institutional digital-finance market\",\r\n            institutional: \"GCC banking, sovereign capital and capital markets\"\r\n        },\r\n\r\n        \"Kuwait City\": {\r\n            centralBank: \"Central Bank of Kuwait\",\r\n            regulators: [\"CMA Kuwait\", \"CBK\"],\r\n            exchanges: [\"Boursa Kuwait\"],\r\n            commodities: [\"Energy-linked finance\"],\r\n            digital: \"Developing digital-finance ecosystem\",\r\n            institutional: \"GCC banking, investment companies and capital markets\"\r\n        },\r\n\r\n        \"Manama\": {\r\n            centralBank: \"Central Bank of Bahrain\",\r\n            regulators: [\"CBB\"],\r\n            exchanges: [\"Bahrain Bourse\"],\r\n            commodities: [\"Regional banking and energy-linked finance\"],\r\n            digital: \"Regional fintech and digital-asset ecosystem\",\r\n            institutional: \"GCC banking, asset management and Islamic finance\"\r\n        },\r\n\r\n        \"Mumbai\": {\r\n            centralBank: \"Reserve Bank of India\",\r\n            regulators: [\"SEBI\", \"RBI\"],\r\n            exchanges: [\"BSE\", \"NSE\"],\r\n            commodities: [\"MCX-linked commodities\"],\r\n            digital: \"Large retail digital-asset ecosystem\",\r\n            institutional: \"India banking, equities and derivatives hub\"\r\n        },\r\n\r\n        \"Singapore\": {\r\n            centralBank: \"Monetary Authority of Singapore\",\r\n            regulators: [\"MAS\"],\r\n            exchanges: [\"Singapore Exchange\"],\r\n            commodities: [\"FX\", \"Energy\", \"Shipping\", \"Commodities\"],\r\n            digital: \"Major regulated Asia-Pacific digital-asset hub\",\r\n            institutional: \"Asia-Pacific FX, banking and wealth management\"\r\n        },\r\n\r\n        \"Hong Kong\": {\r\n            centralBank: \"Hong Kong Monetary Authority\",\r\n            regulators: [\"SFC\", \"HKMA\"],\r\n            exchanges: [\"Hong Kong Exchanges and Clearing\"],\r\n            commodities: [\"China-linked capital markets\"],\r\n            digital: \"Regulated virtual-asset market\",\r\n            institutional: \"China gateway, banking and capital markets\"\r\n        },\r\n\r\n        \"Shanghai\": {\r\n            centralBank: \"People's Bank of China\",\r\n            regulators: [\"CSRC\", \"NFRA\"],\r\n            exchanges: [\"Shanghai Stock Exchange\"],\r\n            commodities: [\"Shanghai Futures Exchange\", \"Metals\"],\r\n            digital: \"Institutional digital-finance experimentation\",\r\n            institutional: \"Mainland China equities, banking and commodities\"\r\n        },\r\n\r\n        \"Tokyo\": {\r\n            centralBank: \"Bank of Japan\",\r\n            regulators: [\"JFSA\"],\r\n            exchanges: [\"Japan Exchange Group\", \"Tokyo Stock Exchange\"],\r\n            commodities: [\"Rates\", \"Equities\", \"FX\"],\r\n            digital: \"Regulated Japanese digital-asset market\",\r\n            institutional: \"Major global banking, equities and FX centre\"\r\n        },\r\n\r\n        \"Sydney\": {\r\n            centralBank: \"Reserve Bank of Australia\",\r\n            regulators: [\"ASIC\", \"APRA\"],\r\n            exchanges: [\"ASX\"],\r\n            commodities: [\"Mining\", \"Metals\", \"Energy\"],\r\n            digital: \"Australian digital-asset market\",\r\n            institutional: \"Banking, pension capital and commodities finance\"\r\n        },\r\n\r\n        \"S\u00e3o Paulo\": {\r\n            centralBank: \"Central Bank of Brazil\",\r\n            regulators: [\"CVM\", \"BCB\"],\r\n            exchanges: [\"B3\"],\r\n            commodities: [\"Agriculture\", \"Energy\", \"Metals\"],\r\n            digital: \"Large Latin American digital-asset market\",\r\n            institutional: \"Latin America banking and capital-markets hub\"\r\n        },\r\n\r\n        \"Kuala Lumpur\": {\r\n            centralBank: \"Bank Negara Malaysia\",\r\n            regulators: [\"Securities Commission Malaysia\", \"BNM\"],\r\n            exchanges: [\"Bursa Malaysia\"],\r\n            commodities: [\"Palm oil\", \"Islamic finance\"],\r\n            digital: \"Regulated Malaysian digital-asset ecosystem\",\r\n            institutional: \"Islamic finance, banking and regional capital markets\"\r\n        },\r\n\r\n        \"Bangkok\": {\r\n            centralBank: \"Bank of Thailand\",\r\n            regulators: [\"SEC Thailand\", \"Bank of Thailand\"],\r\n            exchanges: [\"Stock Exchange of Thailand\"],\r\n            commodities: [\"Agriculture, energy and regional commodities\"],\r\n            digital: \"Regulated Thai digital-asset ecosystem\",\r\n            institutional: \"Thailand banking, brokerage and regional capital markets\"\r\n        },\r\n\r\n        \"Taipei\": {\r\n            centralBank: \"Central Bank of the Republic of China (Taiwan)\",\r\n            regulators: [\"FSC Taiwan\"],\r\n            exchanges: [\"Taiwan Stock Exchange\"],\r\n            commodities: [\"Technology and semiconductor-linked markets\"],\r\n            digital: \"Developing regulated digital-asset market\",\r\n            institutional: \"Technology equities, banking and institutional investment\"\r\n        },\r\n\r\n        \"Auckland\": {\r\n            centralBank: \"Reserve Bank of New Zealand\",\r\n            regulators: [\"FMA\", \"RBNZ\"],\r\n            exchanges: [\"NZX\"],\r\n            commodities: [\"Agriculture and regional commodities\"],\r\n            digital: \"Developing digital-asset ecosystem\",\r\n            institutional: \"New Zealand banking, pensions and capital markets\"\r\n        },\r\n\r\n        \"Johannesburg\": {\r\n            centralBank: \"South African Reserve Bank\",\r\n            regulators: [\"FSCA\", \"SARB\"],\r\n            exchanges: [\"Johannesburg Stock Exchange\"],\r\n            commodities: [\"Gold\", \"Platinum\", \"Mining\"],\r\n            digital: \"Developing regulated digital-asset market\",\r\n            institutional: \"Southern Africa banking, mining finance and capital markets\"\r\n        },\r\n\r\n        \"Dublin\": {\r\n            centralBank: \"Central Bank of Ireland \/ European Central Bank\",\r\n            regulators: [\"Central Bank of Ireland\", \"ECB\"],\r\n            exchanges: [\"Euronext Dublin\"],\r\n            commodities: [\"European fund and capital-market access\"],\r\n            digital: \"EU digital-finance ecosystem\",\r\n            institutional: \"Funds, asset servicing, banking and European finance\"\r\n        }\r\n    };\r\n\r\n\r\n    const CURRENCY_BANK = {\r\n        USD: \"Federal Reserve\",\r\n        GBP: \"Bank of England\",\r\n        EUR: \"European Central Bank\",\r\n        CHF: \"Swiss National Bank\",\r\n        AED: \"Central Bank of the UAE\",\r\n        QAR: \"Qatar Central Bank\",\r\n        SAR: \"Saudi Central Bank\",\r\n        INR: \"Reserve Bank of India\",\r\n        SGD: \"Monetary Authority of Singapore\",\r\n        HKD: \"Hong Kong Monetary Authority\",\r\n        CNY: \"People's Bank of China\",\r\n        JPY: \"Bank of Japan\",\r\n        AUD: \"Reserve Bank of Australia\",\r\n        CAD: \"Bank of Canada\",\r\n        BRL: \"Central Bank of Brazil\",\r\n        MYR: \"Bank Negara Malaysia\",\r\n        MXN: \"Bank of Mexico\",\r\n        KWD: \"Central Bank of Kuwait\",\r\n        BHD: \"Central Bank of Bahrain\",\r\n        THB: \"Bank of Thailand\",\r\n        TWD: \"Central Bank of the Republic of China (Taiwan)\",\r\n        NZD: \"Reserve Bank of New Zealand\",\r\n        ZAR: \"South African Reserve Bank\"\r\n    };\r\n\r\n\r\n    let activeLayer = \"markets\";\r\n    let selectedCity = \"\";\r\n    let optionalFeedCache = new Map();\r\n    let commandRenderTimer = null;\r\n    let snapshotTimer = null;\r\n\r\n\r\n    \/* =========================================================\r\n       HELPERS\r\n    ========================================================= *\/\r\n\r\n    function clean(value) {\r\n        return String(value ?? \"\")\r\n            .replace(\/\\s+\/g, \" \")\r\n            .trim();\r\n    }\r\n\r\n\r\n    function num(value) {\r\n        const text =\r\n            clean(value)\r\n                .replace(\/,\/g, \"\")\r\n                .replace(\/%\/g, \"\");\r\n\r\n        if (!text) return null;\r\n\r\n        const parsed =\r\n            Number(text);\r\n\r\n        return Number.isFinite(parsed)\r\n            ? parsed\r\n            : null;\r\n    }\r\n\r\n\r\n    function escapeHtml(value) {\r\n        return clean(value)\r\n            .replace(\/&\/g, \"&amp;\")\r\n            .replace(\/<\/g, \"&lt;\")\r\n            .replace(\/>\/g, \"&gt;\")\r\n            .replace(\/\"\/g, \"&quot;\")\r\n            .replace(\/'\/g, \"&#039;\");\r\n    }\r\n\r\n\r\n    function getDoc() {\r\n        try {\r\n            return (\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document ||\r\n                null\r\n            );\r\n        }\r\n        catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n\r\n    function getText(doc, id) {\r\n        return clean(\r\n            doc.getElementById(id)?.textContent\r\n        );\r\n    }\r\n\r\n\r\n    function parsePercentFromCard(card) {\r\n        const text =\r\n            clean(card?.innerText);\r\n\r\n        const matches =\r\n            text.match(\r\n                \/[-+]?\\d+(?:\\.\\d+)?%\/g\r\n            );\r\n\r\n        if (!matches?.length) {\r\n            return null;\r\n        }\r\n\r\n        for (const match of matches) {\r\n            const value = num(match);\r\n\r\n            if (\r\n                value !== null &&\r\n                Math.abs(value) <= 50\r\n            ) {\r\n                return value;\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n\r\n    function sessionCards(doc) {\r\n        return Array.from(\r\n            doc.querySelectorAll(\r\n                \".market-session\"\r\n            )\r\n        );\r\n    }\r\n\r\n\r\n    function sessionInfo(card) {\r\n        const text =\r\n            clean(card?.innerText);\r\n\r\n        const name =\r\n            clean(\r\n                card.querySelector(\r\n                    \".session-name\"\r\n                )?.textContent\r\n            ) ||\r\n            text.split(\" \")[0] ||\r\n            \"Market\";\r\n\r\n        const time =\r\n            clean(\r\n                card.querySelector(\r\n                    \".session-time\"\r\n                )?.textContent\r\n            );\r\n\r\n        const isOpen =\r\n            \/\\bOPEN\\b\/i.test(text) &&\r\n            !\/\\bCLOSED\\b\/i.test(text);\r\n\r\n        return {\r\n            name,\r\n            time,\r\n            isOpen,\r\n            change:\r\n                parsePercentFromCard(card)\r\n        };\r\n    }\r\n\r\n\r\n    function getSelectedMarket(doc) {\r\n        return {\r\n            city:\r\n                getText(\r\n                    doc,\r\n                    \"panel-market-name\"\r\n                ),\r\n\r\n            country:\r\n                getText(\r\n                    doc,\r\n                    \"panel-market-country\"\r\n                ),\r\n\r\n            localTime:\r\n                getText(\r\n                    doc,\r\n                    \"panel-local-time\"\r\n                ),\r\n\r\n            timezone:\r\n                getText(\r\n                    doc,\r\n                    \"panel-timezone\"\r\n                ),\r\n\r\n            open:\r\n                getText(\r\n                    doc,\r\n                    \"panel-open\"\r\n                ),\r\n\r\n            close:\r\n                getText(\r\n                    doc,\r\n                    \"panel-close\"\r\n                ),\r\n\r\n            price:\r\n                getText(\r\n                    doc,\r\n                    \"panel-price\"\r\n                ),\r\n\r\n            change:\r\n                getText(\r\n                    doc,\r\n                    \"panel-change\"\r\n                ),\r\n\r\n            volume:\r\n                getText(\r\n                    doc,\r\n                    \"panel-volume\"\r\n                ),\r\n\r\n            volatility:\r\n                getText(\r\n                    doc,\r\n                    \"panel-volatility\"\r\n                ),\r\n\r\n            index:\r\n                getText(\r\n                    doc,\r\n                    \"panel-index\"\r\n                ),\r\n\r\n            currency:\r\n                getText(\r\n                    doc,\r\n                    \"panel-currency\"\r\n                ),\r\n\r\n            sentiment:\r\n                getText(\r\n                    doc,\r\n                    \"panel-sentiment\"\r\n                ),\r\n\r\n            currencyStrength:\r\n                getText(\r\n                    doc,\r\n                    \"panel-currency-strength\"\r\n                ),\r\n\r\n            status:\r\n                getText(\r\n                    doc,\r\n                    \"panel-status-text\"\r\n                ) ||\r\n                getText(\r\n                    doc,\r\n                    \"panel-market-status\"\r\n                )\r\n        };\r\n    }\r\n\r\n\r\n    function deriveStress(market) {\r\n        const change =\r\n            Math.abs(\r\n                num(market.change) || 0\r\n            );\r\n\r\n        const volText =\r\n            clean(\r\n                market.volatility\r\n            ).toLowerCase();\r\n\r\n        let volScore = 0;\r\n\r\n        if (\r\n            volText.includes(\"high\")\r\n        ) {\r\n            volScore = 55;\r\n        }\r\n        else if (\r\n            volText.includes(\"medium\") ||\r\n            volText.includes(\"moderate\")\r\n        ) {\r\n            volScore = 30;\r\n        }\r\n        else if (\r\n            volText.includes(\"low\")\r\n        ) {\r\n            volScore = 12;\r\n        }\r\n        else {\r\n            const numericVol =\r\n                num(\r\n                    market.volatility\r\n                );\r\n\r\n            if (numericVol !== null) {\r\n                volScore =\r\n                    Math.min(\r\n                        60,\r\n                        numericVol * 10\r\n                    );\r\n            }\r\n        }\r\n\r\n        const score =\r\n            Math.round(\r\n                Math.min(\r\n                    100,\r\n                    volScore +\r\n                    Math.min(\r\n                        40,\r\n                        change * 18\r\n                    )\r\n                )\r\n            );\r\n\r\n        let label = \"Low\";\r\n\r\n        if (score >= 70) {\r\n            label = \"High\";\r\n        }\r\n        else if (score >= 40) {\r\n            label = \"Elevated\";\r\n        }\r\n\r\n        return {\r\n            score,\r\n            label\r\n        };\r\n    }\r\n\r\n\r\n    function deriveGlobalScore(\r\n        market,\r\n        brokerCount\r\n    ) {\r\n        const stress =\r\n            deriveStress(market);\r\n\r\n        const sessionOpen =\r\n            \/OPEN\/i.test(\r\n                market.status\r\n            );\r\n\r\n        const dataQuality =\r\n            [\r\n                market.price,\r\n                market.change,\r\n                market.volatility\r\n            ]\r\n                .filter(\r\n                    value =>\r\n                        clean(value) &&\r\n                        !\/N\\\/A|^NA$|--\/i.test(\r\n                            clean(value)\r\n                        )\r\n                )\r\n                .length;\r\n\r\n        let score = 50;\r\n\r\n        score +=\r\n            sessionOpen\r\n                ? 10\r\n                : 0;\r\n\r\n        score +=\r\n            Math.min(\r\n                12,\r\n                brokerCount * 2\r\n            );\r\n\r\n        score +=\r\n            dataQuality * 4;\r\n\r\n        score -=\r\n            Math.round(\r\n                stress.score * 0.18\r\n            );\r\n\r\n        return Math.max(\r\n            0,\r\n            Math.min(\r\n                100,\r\n                Math.round(score)\r\n            )\r\n        );\r\n    }\r\n\r\n\r\n    function countdown(\r\n        localTime,\r\n        targetTime\r\n    ) {\r\n        const local =\r\n            clean(localTime)\r\n                .match(\r\n                    \/^(\\d{1,2}):(\\d{2})\/\r\n                );\r\n\r\n        const target =\r\n            clean(targetTime)\r\n                .match(\r\n                    \/^(\\d{1,2}):(\\d{2})\/\r\n                );\r\n\r\n        if (!local || !target) {\r\n            return \"\u2014\";\r\n        }\r\n\r\n        const nowMinutes =\r\n            Number(local[1]) * 60 +\r\n            Number(local[2]);\r\n\r\n        const targetMinutes =\r\n            Number(target[1]) * 60 +\r\n            Number(target[2]);\r\n\r\n        let diff =\r\n            targetMinutes -\r\n            nowMinutes;\r\n\r\n        if (diff < 0) {\r\n            diff += 24 * 60;\r\n        }\r\n\r\n        const hours =\r\n            Math.floor(\r\n                diff \/ 60\r\n            );\r\n\r\n        const minutes =\r\n            diff % 60;\r\n\r\n        return (\r\n            String(hours)\r\n                .padStart(2, \"0\") +\r\n            \":\" +\r\n            String(minutes)\r\n                .padStart(2, \"0\")\r\n        );\r\n    }\r\n\r\n\r\n    function ruleBasedInsight(\r\n        market,\r\n        stress\r\n    ) {\r\n        const city =\r\n            market.city ||\r\n            \"Selected market\";\r\n\r\n        const change =\r\n            num(\r\n                market.change\r\n            );\r\n\r\n        const open =\r\n            \/OPEN\/i.test(\r\n                market.status\r\n            );\r\n\r\n        if (change !== null) {\r\n\r\n            if (change >= 1) {\r\n                return (\r\n                    city +\r\n                    \" shows positive momentum with elevated price movement. \" +\r\n                    (\r\n                        stress.score >= 40\r\n                            ? \"Risk conditions are above normal.\"\r\n                            : \"Risk conditions remain contained.\"\r\n                    )\r\n                );\r\n            }\r\n\r\n            if (change <= -1) {\r\n                return (\r\n                    city +\r\n                    \" shows negative momentum and defensive conditions. \" +\r\n                    (\r\n                        stress.score >= 40\r\n                            ? \"Volatility pressure is elevated.\"\r\n                            : \"The move is currently moderate.\"\r\n                    )\r\n                );\r\n            }\r\n        }\r\n\r\n        return (\r\n            city +\r\n            \" is currently \" +\r\n            (\r\n                open\r\n                    ? \"in an active trading session\"\r\n                    : \"outside its main cash-market session\"\r\n            ) +\r\n            \". \" +\r\n            (\r\n                clean(\r\n                    market.currencyStrength\r\n                )\r\n                    ? (\r\n                        \"Currency signal: \" +\r\n                        market.currencyStrength +\r\n                        \".\"\r\n                    )\r\n                    : \"Live currency-strength data is limited.\"\r\n            )\r\n        );\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       HISTORY \/ REPLAY \/ CORRELATION\r\n    ========================================================= *\/\r\n\r\n    function readHistory() {\r\n        try {\r\n            const parsed =\r\n                JSON.parse(\r\n                    localStorage.getItem(\r\n                        CONFIG.storageKey\r\n                    ) ||\r\n                    \"[]\"\r\n                );\r\n\r\n            return Array.isArray(parsed)\r\n                ? parsed\r\n                : [];\r\n        }\r\n        catch (error) {\r\n            return [];\r\n        }\r\n    }\r\n\r\n\r\n    function writeHistory(history) {\r\n        try {\r\n            localStorage.setItem(\r\n                CONFIG.storageKey,\r\n                JSON.stringify(\r\n                    history.slice(\r\n                        -CONFIG.maxSnapshots\r\n                    )\r\n                )\r\n            );\r\n        }\r\n        catch (error) {}\r\n    }\r\n\r\n\r\n    function captureHistory(doc) {\r\n        const rows =\r\n            sessionCards(doc)\r\n                .map(sessionInfo)\r\n                .filter(\r\n                    item =>\r\n                        item.name\r\n                );\r\n\r\n        const snapshot = {\r\n            ts:\r\n                Date.now(),\r\n\r\n            rows:\r\n                rows.map(\r\n                    row => ({\r\n                        name:\r\n                            row.name,\r\n\r\n                        change:\r\n                            row.change,\r\n\r\n                        open:\r\n                            row.isOpen\r\n                    })\r\n                )\r\n        };\r\n\r\n        const history =\r\n            readHistory();\r\n\r\n        history.push(\r\n            snapshot\r\n        );\r\n\r\n        writeHistory(\r\n            history\r\n        );\r\n    }\r\n\r\n\r\n    function pearson(a, b) {\r\n        if (\r\n            a.length !== b.length ||\r\n            a.length < 4\r\n        ) {\r\n            return null;\r\n        }\r\n\r\n        const meanA =\r\n            a.reduce(\r\n                (sum, value) =>\r\n                    sum + value,\r\n                0\r\n            ) \/ a.length;\r\n\r\n        const meanB =\r\n            b.reduce(\r\n                (sum, value) =>\r\n                    sum + value,\r\n                0\r\n            ) \/ b.length;\r\n\r\n        let numerator = 0;\r\n        let denomA = 0;\r\n        let denomB = 0;\r\n\r\n        for (\r\n            let i = 0;\r\n            i < a.length;\r\n            i++\r\n        ) {\r\n            const da =\r\n                a[i] -\r\n                meanA;\r\n\r\n            const db =\r\n                b[i] -\r\n                meanB;\r\n\r\n            numerator +=\r\n                da * db;\r\n\r\n            denomA +=\r\n                da * da;\r\n\r\n            denomB +=\r\n                db * db;\r\n        }\r\n\r\n        const denominator =\r\n            Math.sqrt(\r\n                denomA *\r\n                denomB\r\n            );\r\n\r\n        if (!denominator) {\r\n            return null;\r\n        }\r\n\r\n        return (\r\n            numerator \/\r\n            denominator\r\n        );\r\n    }\r\n\r\n\r\n    function correlationFor(\r\n        city\r\n    ) {\r\n        const history =\r\n            readHistory();\r\n\r\n        const series =\r\n            new Map();\r\n\r\n        history.forEach(\r\n            snapshot => {\r\n\r\n                snapshot.rows\r\n                    ?.forEach(\r\n                        row => {\r\n\r\n                            if (\r\n                                row.change === null ||\r\n                                !Number.isFinite(\r\n                                    Number(\r\n                                        row.change\r\n                                    )\r\n                                )\r\n                            ) {\r\n                                return;\r\n                            }\r\n\r\n                            if (\r\n                                !series.has(\r\n                                    row.name\r\n                                )\r\n                            ) {\r\n                                series.set(\r\n                                    row.name,\r\n                                    []\r\n                                );\r\n                            }\r\n\r\n                            series.get(\r\n                                row.name\r\n                            ).push({\r\n                                ts:\r\n                                    snapshot.ts,\r\n\r\n                                value:\r\n                                    Number(\r\n                                        row.change\r\n                                    )\r\n                            });\r\n                        }\r\n                    );\r\n            }\r\n        );\r\n\r\n        const target =\r\n            series.get(city);\r\n\r\n        if (\r\n            !target ||\r\n            target.length < 4\r\n        ) {\r\n            return [];\r\n        }\r\n\r\n        const result = [];\r\n\r\n        for (\r\n            const [\r\n                otherCity,\r\n                values\r\n            ]\r\n            of series.entries()\r\n        ) {\r\n            if (\r\n                otherCity === city\r\n            ) {\r\n                continue;\r\n            }\r\n\r\n            const byTs =\r\n                new Map(\r\n                    values.map(\r\n                        item => [\r\n                            item.ts,\r\n                            item.value\r\n                        ]\r\n                    )\r\n                );\r\n\r\n            const a = [];\r\n            const b = [];\r\n\r\n            target.forEach(\r\n                item => {\r\n\r\n                    if (\r\n                        byTs.has(\r\n                            item.ts\r\n                        )\r\n                    ) {\r\n                        a.push(\r\n                            item.value\r\n                        );\r\n\r\n                        b.push(\r\n                            byTs.get(\r\n                                item.ts\r\n                            )\r\n                        );\r\n                    }\r\n                }\r\n            );\r\n\r\n            const corr =\r\n                pearson(\r\n                    a,\r\n                    b\r\n                );\r\n\r\n            if (\r\n                corr !== null\r\n            ) {\r\n                result.push({\r\n                    city:\r\n                        otherCity,\r\n\r\n                    corr\r\n                });\r\n            }\r\n        }\r\n\r\n        return result\r\n            .sort(\r\n                (a, b) =>\r\n                    Math.abs(\r\n                        b.corr\r\n                    ) -\r\n                    Math.abs(\r\n                        a.corr\r\n                    )\r\n            )\r\n            .slice(\r\n                0,\r\n                3\r\n            );\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       OPTIONAL FEEDS\r\n       Safe adapters: no fake data if endpoint is unavailable.\r\n    ========================================================= *\/\r\n\r\n    async function optionalFeed(\r\n        type,\r\n        city\r\n    ) {\r\n        const base =\r\n            CONFIG.optionalFeeds[\r\n                type\r\n            ];\r\n\r\n        if (\r\n            !base ||\r\n            !city\r\n        ) {\r\n            return null;\r\n        }\r\n\r\n        const key =\r\n            type +\r\n            \"|\" +\r\n            city;\r\n\r\n        if (\r\n            optionalFeedCache.has(\r\n                key\r\n            )\r\n        ) {\r\n            return optionalFeedCache.get(\r\n                key\r\n            );\r\n        }\r\n\r\n        try {\r\n            const url =\r\n                new URL(base);\r\n\r\n            url.searchParams.set(\r\n                \"city\",\r\n                city\r\n            );\r\n\r\n            const controller =\r\n                new AbortController();\r\n\r\n            const timer =\r\n                setTimeout(\r\n                    () =>\r\n                        controller.abort(),\r\n                    2500\r\n                );\r\n\r\n            const response =\r\n                await fetch(\r\n                    url.toString(),\r\n                    {\r\n                        headers: {\r\n                            Accept:\r\n                                \"application\/json\"\r\n                        },\r\n                        cache:\r\n                            \"no-store\",\r\n                        signal:\r\n                            controller.signal\r\n                    }\r\n                );\r\n\r\n            clearTimeout(\r\n                timer\r\n            );\r\n\r\n            if (!response.ok) {\r\n                optionalFeedCache.set(\r\n                    key,\r\n                    null\r\n                );\r\n\r\n                return null;\r\n            }\r\n\r\n            const payload =\r\n                await response.json();\r\n\r\n            optionalFeedCache.set(\r\n                key,\r\n                payload\r\n            );\r\n\r\n            return payload;\r\n        }\r\n        catch (error) {\r\n            optionalFeedCache.set(\r\n                key,\r\n                null\r\n            );\r\n\r\n            return null;\r\n        }\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       BROKERS\r\n    ========================================================= *\/\r\n\r\n    async function cityBrokers(\r\n        city\r\n    ) {\r\n        if (\r\n    !city ||\r\n    \/^(market|select city|global|n\\\/a|--|null|undefined)$\/i\r\n        .test(String(city).trim())\r\n) {\r\n    return [];\r\n}\r\n\r\n        const key =\r\n            \"brokers|\" +\r\n            city;\r\n\r\n        if (\r\n            optionalFeedCache.has(\r\n                key\r\n            )\r\n        ) {\r\n            return (\r\n                optionalFeedCache.get(\r\n                    key\r\n                ) ||\r\n                []\r\n            );\r\n        }\r\n\r\n        try {\r\n            const url =\r\n                new URL(\r\n                    CONFIG.cityBrokersApi\r\n                );\r\n\r\n            url.searchParams.set(\r\n                \"city\",\r\n                city\r\n            );\r\n\r\n            const response =\r\n                await fetch(\r\n                    url.toString(),\r\n                    {\r\n                        headers: {\r\n                            Accept:\r\n                                \"application\/json\"\r\n                        },\r\n                        cache:\r\n                            \"no-store\"\r\n                    }\r\n                );\r\n\r\n            if (!response.ok) {\r\n                return [];\r\n            }\r\n\r\n            const payload =\r\n                await response.json();\r\n\r\n            const data =\r\n                payload?.status === \"ok\" &&\r\n                Array.isArray(\r\n                    payload.data\r\n                )\r\n                    ? payload.data\r\n                    : [];\r\n\r\n            optionalFeedCache.set(\r\n                key,\r\n                data\r\n            );\r\n\r\n            return data;\r\n        }\r\n        catch (error) {\r\n            return [];\r\n        }\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       UI\r\n    ========================================================= *\/\r\n\r\n    function installStyles(doc) {\r\n        if (\r\n            doc.getElementById(\r\n                \"mx-command-center-style\"\r\n            )\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        const style =\r\n            doc.createElement(\r\n                \"style\"\r\n            );\r\n\r\n        style.id =\r\n            \"mx-command-center-style\";\r\n\r\n        style.textContent = `\r\n            #mx-intelligence-layers {\r\n                position: absolute;\r\n                left: 50%;\r\n                bottom: 18px;\r\n                transform: translateX(-50%);\r\n                z-index: 75;\r\n                display: flex;\r\n                align-items: center;\r\n                gap: 5px;\r\n                padding: 5px;\r\n                border: 1px solid rgba(102,128,165,.22);\r\n                border-radius: 11px;\r\n                background: rgba(5,10,18,.82);\r\n                backdrop-filter: blur(10px);\r\n                box-shadow: 0 12px 28px rgba(0,0,0,.18);\r\n                max-width: calc(100% - 620px);\r\n                overflow-x: auto;\r\n                scrollbar-width: none;\r\n            }\r\n\r\n            #mx-intelligence-layers::-webkit-scrollbar {\r\n                display: none;\r\n            }\r\n\r\n            #mx-intelligence-layers button {\r\n                flex: 0 0 auto;\r\n                border: 1px solid transparent;\r\n                border-radius: 7px;\r\n                background: transparent;\r\n                color: #7f8ca2;\r\n                padding: 6px 8px;\r\n                font: inherit;\r\n                font-size: 8px;\r\n                font-weight: 850;\r\n                letter-spacing: .35px;\r\n                cursor: pointer;\r\n                transition:\r\n                    color .14s ease,\r\n                    background .14s ease,\r\n                    border-color .14s ease;\r\n            }\r\n\r\n            #mx-intelligence-layers button:hover {\r\n                color: #f7fbff;\r\n                background: rgba(255,255,255,.035);\r\n            }\r\n\r\n            #mx-intelligence-layers button.active {\r\n                color: #69e8e6;\r\n                border-color: rgba(7,223,226,.34);\r\n                background: rgba(7,223,226,.075);\r\n            }\r\n\r\n            #mx-command-center {\r\n                margin-top: 12px;\r\n                padding-top: 12px;\r\n                border-top: 1px solid rgba(120,145,178,.14);\r\n            }\r\n\r\n            #mx-command-center .mx-cc-head {\r\n                display: flex;\r\n                align-items: center;\r\n                justify-content: space-between;\r\n                gap: 8px;\r\n                margin-bottom: 9px;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-head strong {\r\n                color: #f6f9ff;\r\n                font-size: 9px;\r\n                font-weight: 900;\r\n                letter-spacing: .75px;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-head span {\r\n                color: #58e4e2;\r\n                font-size: 7px;\r\n                font-weight: 900;\r\n                letter-spacing: 1px;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-grid {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 6px;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-card {\r\n                min-width: 0;\r\n                padding: 8px;\r\n                border-radius: 8px;\r\n                border: 1px solid rgba(109,135,169,.14);\r\n                background: rgba(12,19,31,.76);\r\n            }\r\n\r\n            #mx-command-center .mx-cc-card.wide {\r\n                grid-column: 1 \/ -1;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-label {\r\n                display: block;\r\n                margin-bottom: 4px;\r\n                color: #697990;\r\n                font-size: 6.5px;\r\n                font-weight: 850;\r\n                letter-spacing: .85px;\r\n                text-transform: uppercase;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-value {\r\n                display: block;\r\n                color: #f6f9ff;\r\n                font-size: 9px;\r\n                font-weight: 850;\r\n                line-height: 1.35;\r\n                overflow-wrap: anywhere;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-value.good {\r\n                color: #56df9d;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-value.warn {\r\n                color: #f4c95d;\r\n            }\r\n\r\n            #mx-command-center .mx-cc-value.bad {\r\n                color: #ff7d7d;\r\n            }\r\n\r\n            #mx-command-center .mx-meter {\r\n                height: 3px;\r\n                margin-top: 6px;\r\n                overflow: hidden;\r\n                border-radius: 999px;\r\n                background: rgba(255,255,255,.07);\r\n            }\r\n\r\n            #mx-command-center .mx-meter > span {\r\n                display: block;\r\n                height: 100%;\r\n                border-radius: inherit;\r\n                background:\r\n                    linear-gradient(\r\n                        90deg,\r\n                        #56df9d,\r\n                        #f4c95d,\r\n                        #ff7d7d\r\n                    );\r\n            }\r\n\r\n            #mx-command-center .mx-chip-row {\r\n                display: flex;\r\n                flex-wrap: wrap;\r\n                gap: 4px;\r\n                margin-top: 5px;\r\n            }\r\n\r\n            #mx-command-center .mx-chip {\r\n                padding: 3px 5px;\r\n                border: 1px solid rgba(7,223,226,.22);\r\n                border-radius: 5px;\r\n                color: #69e8e6;\r\n                font-size: 6.5px;\r\n                font-weight: 800;\r\n                background: rgba(7,223,226,.045);\r\n            }\r\n\r\n            #mx-command-center .mx-list {\r\n                display: grid;\r\n                gap: 5px;\r\n            }\r\n\r\n            #mx-command-center .mx-list-row {\r\n                display: flex;\r\n                justify-content: space-between;\r\n                gap: 8px;\r\n                padding-bottom: 5px;\r\n                border-bottom: 1px solid rgba(255,255,255,.05);\r\n                color: #8a98ad;\r\n                font-size: 7.5px;\r\n            }\r\n\r\n            #mx-command-center .mx-list-row:last-child {\r\n                padding-bottom: 0;\r\n                border-bottom: 0;\r\n            }\r\n\r\n            #mx-command-center .mx-list-row b {\r\n                color: #f3f7ff;\r\n                font-size: 7.5px;\r\n            }\r\n\r\n            #mx-command-center .mx-feed-waiting {\r\n                color: #718097;\r\n                font-size: 7.5px;\r\n                line-height: 1.45;\r\n            }\r\n\r\n            #mx-command-center .mx-replay-controls {\r\n                display: flex;\r\n                gap: 5px;\r\n                align-items: center;\r\n            }\r\n\r\n            #mx-command-center .mx-replay-controls input[type=\"range\"] {\r\n                width: 100%;\r\n                accent-color: #07dfe2;\r\n            }\r\n\r\n            #globe-section.mx-risk-mode .market-session {\r\n                filter: saturate(.75);\r\n            }\r\n\r\n            #globe-section.mx-risk-mode .market-session[data-mx-risk=\"high\"] {\r\n                border-color: rgba(255,125,125,.52) !important;\r\n                box-shadow: 0 0 18px rgba(255,125,125,.07);\r\n            }\r\n\r\n            #globe-section.mx-market-heat .market-session[data-mx-heat=\"up\"] {\r\n                border-color: rgba(86,223,157,.35) !important;\r\n            }\r\n\r\n            #globe-section.mx-market-heat .market-session[data-mx-heat=\"down\"] {\r\n                border-color: rgba(255,125,125,.35) !important;\r\n            }\r\n\r\n            #globe-section.mx-event-shock::after {\r\n                content: \"\";\r\n                position: absolute;\r\n                inset: 0;\r\n                pointer-events: none;\r\n                z-index: 6;\r\n                border: 1px solid rgba(255,125,125,.28);\r\n                box-shadow: inset 0 0 42px rgba(255,125,125,.05);\r\n                animation: mxShock 1.2s ease-out;\r\n            }\r\n\r\n            @keyframes mxShock {\r\n                from {\r\n                    opacity: 1;\r\n                }\r\n                to {\r\n                    opacity: 0;\r\n                }\r\n            }\r\n\r\n            @media (max-width: 1180px) {\r\n                #mx-intelligence-layers {\r\n                    max-width: calc(100% - 500px);\r\n                }\r\n            }\r\n\r\n            @media (max-width: 900px) {\r\n                #mx-intelligence-layers {\r\n                    left: 12px;\r\n                    right: 12px;\r\n                    bottom: 10px;\r\n                    transform: none;\r\n                    max-width: none;\r\n                }\r\n            }\r\n\r\n            @media (max-width: 767px) {\r\n                #mx-intelligence-layers {\r\n                    display: none !important;\r\n                }\r\n\r\n                #mx-command-center {\r\n                    display: none !important;\r\n                }\r\n            }\r\n        `;\r\n\r\n        (\r\n            doc.head ||\r\n            doc.documentElement\r\n        )\r\n            .appendChild(style);\r\n    }\r\n\r\n\r\n    function installLayerBar(doc) {\r\n        if (\r\n            doc.getElementById(\r\n                \"mx-intelligence-layers\"\r\n            )\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        const section =\r\n            doc.getElementById(\r\n                \"globe-section\"\r\n            );\r\n\r\n        if (!section) {\r\n            return;\r\n        }\r\n\r\n        const bar =\r\n            doc.createElement(\r\n                \"div\"\r\n            );\r\n\r\n        bar.id =\r\n            \"mx-intelligence-layers\";\r\n\r\n        const layers = [\r\n            [\"markets\", \"Markets\"],\r\n            [\"risk\", \"Risk\"],\r\n            [\"regulation\", \"Regulation\"],\r\n            [\"brokers\", \"Brokers\"],\r\n            [\"flow\", \"Flow\"],\r\n            [\"fx\", \"FX\"],\r\n            [\"events\", \"Events\"],\r\n            [\"exchanges\", \"Exchanges\"],\r\n            [\"digital\", \"Digital\"],\r\n            [\"replay\", \"Replay\"]\r\n        ];\r\n\r\n        layers.forEach(\r\n            ([key, label]) => {\r\n\r\n                const button =\r\n                    doc.createElement(\r\n                        \"button\"\r\n                    );\r\n\r\n                button.type =\r\n                    \"button\";\r\n\r\n                button.dataset.layer =\r\n                    key;\r\n\r\n                button.textContent =\r\n                    label;\r\n\r\n                button.classList.toggle(\r\n                    \"active\",\r\n                    key ===\r\n                    activeLayer\r\n                );\r\n\r\n                button.addEventListener(\r\n                    \"click\",\r\n                    function () {\r\n\r\n                        activeLayer =\r\n                            key;\r\n\r\n                        bar.querySelectorAll(\r\n                            \"button\"\r\n                        )\r\n                            .forEach(\r\n                                item =>\r\n                                    item.classList.toggle(\r\n                                        \"active\",\r\n                                        item ===\r\n                                        button\r\n                                    )\r\n                            );\r\n\r\n                        applyLayerVisuals(\r\n                            doc\r\n                        );\r\n\r\n                        scheduleRender(\r\n                            doc\r\n                        );\r\n                    }\r\n                );\r\n\r\n                bar.appendChild(\r\n                    button\r\n                );\r\n            }\r\n        );\r\n\r\n        section.appendChild(\r\n            bar\r\n        );\r\n    }\r\n\r\n\r\n    function ensureCommandCenter(doc) {\r\n        let center =\r\n            doc.getElementById(\r\n                \"mx-command-center\"\r\n            );\r\n\r\n        if (center) {\r\n            return center;\r\n        }\r\n\r\n        const panel =\r\n            doc.getElementById(\r\n                \"market-panel\"\r\n            );\r\n\r\n        if (!panel) {\r\n            return null;\r\n        }\r\n\r\n        center =\r\n            doc.createElement(\r\n                \"section\"\r\n            );\r\n\r\n        center.id =\r\n            \"mx-command-center\";\r\n\r\n        panel.appendChild(\r\n            center\r\n        );\r\n\r\n        return center;\r\n    }\r\n\r\n\r\n    function applyLayerVisuals(doc) {\r\n        const section =\r\n            doc.getElementById(\r\n                \"globe-section\"\r\n            );\r\n\r\n        if (!section) {\r\n            return;\r\n        }\r\n\r\n        section.classList.toggle(\r\n            \"mx-risk-mode\",\r\n            activeLayer ===\r\n            \"risk\"\r\n        );\r\n\r\n        section.classList.toggle(\r\n            \"mx-market-heat\",\r\n            activeLayer ===\r\n            \"markets\"\r\n        );\r\n\r\n        sessionCards(doc)\r\n            .forEach(\r\n                card => {\r\n\r\n                    const info =\r\n                        sessionInfo(\r\n                            card\r\n                        );\r\n\r\n                    card.dataset.mxHeat =\r\n                        info.change === null\r\n                            ? \"neutral\"\r\n                            : (\r\n                                info.change > 0\r\n                                    ? \"up\"\r\n                                    : (\r\n                                        info.change < 0\r\n                                            ? \"down\"\r\n                                            : \"neutral\"\r\n                                    )\r\n                            );\r\n\r\n                    card.dataset.mxRisk =\r\n                        (\r\n                            info.change !== null &&\r\n                            Math.abs(\r\n                                info.change\r\n                            ) >= 1.5\r\n                        )\r\n                            ? \"high\"\r\n                            : \"normal\";\r\n                }\r\n            );\r\n    }\r\n\r\n\r\n    async function renderMarkets(\r\n        doc,\r\n        center,\r\n        market,\r\n        brokers\r\n    ) {\r\n        const stress =\r\n            deriveStress(\r\n                market\r\n            );\r\n\r\n        const score =\r\n            deriveGlobalScore(\r\n                market,\r\n                brokers.length\r\n            );\r\n\r\n        const statusOpen =\r\n            \/OPEN\/i.test(\r\n                market.status\r\n            );\r\n\r\n        const nextLabel =\r\n            statusOpen\r\n                ? \"Closes in\"\r\n                : \"Opens in\";\r\n\r\n        const nextTime =\r\n            statusOpen\r\n                ? countdown(\r\n                    market.localTime,\r\n                    market.close\r\n                )\r\n                : countdown(\r\n                    market.localTime,\r\n                    market.open\r\n                );\r\n\r\n        const movers =\r\n            sessionCards(doc)\r\n                .map(sessionInfo)\r\n                .filter(\r\n                    item =>\r\n                        item.change !== null\r\n                )\r\n                .sort(\r\n                    (a, b) =>\r\n                        Math.abs(\r\n                            b.change\r\n                        ) -\r\n                        Math.abs(\r\n                            a.change\r\n                        )\r\n                )\r\n                .slice(\r\n                    0,\r\n                    3\r\n                );\r\n\r\n        const corr =\r\n            correlationFor(\r\n                market.city\r\n            );\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>MARKUNOX MARKET INTELLIGENCE<\/strong>\r\n                <span>LIVE<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">MARKUNOX Global Score<\/span>\r\n                    <strong class=\"mx-cc-value\">${score}\/100<\/strong>\r\n                    <div class=\"mx-meter\">\r\n                        <span style=\"width:${score}%\"><\/span>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">${nextLabel}<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(nextTime)}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Index Performance<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(market.index || \"\u2014\")} \u00b7 ${escapeHtml(market.change || \"\u2014\")}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Volatility<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(market.volatility || \"\u2014\")}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">MARKUNOX AI Insight<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(ruleBasedInsight(market, stress))}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Top Movers<\/span>\r\n                    ${\r\n                        movers.length\r\n                            ? `\r\n                                <div class=\"mx-list\">\r\n                                    ${movers.map(item => `\r\n                                        <div class=\"mx-list-row\">\r\n                                            <span>${escapeHtml(item.name)}<\/span>\r\n                                            <b>${item.change > 0 ? \"+\" : \"\"}${item.change.toFixed(2)}%<\/b>\r\n                                        <\/div>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `\r\n                                <span class=\"mx-feed-waiting\">\r\n                                    Waiting for live percentage-change data.\r\n                                <\/span>\r\n                              `\r\n                    }\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Cross-Market Correlation<\/span>\r\n                    ${\r\n                        corr.length\r\n                            ? `\r\n                                <div class=\"mx-list\">\r\n                                    ${corr.map(item => `\r\n                                        <div class=\"mx-list-row\">\r\n                                            <span>${escapeHtml(item.city)}<\/span>\r\n                                            <b>${item.corr.toFixed(2)}<\/b>\r\n                                        <\/div>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `\r\n                                <span class=\"mx-feed-waiting\">\r\n                                    Correlation activates automatically after enough local history is collected.\r\n                                <\/span>\r\n                              `\r\n                    }\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderRisk(\r\n        center,\r\n        market\r\n    ) {\r\n        const stress =\r\n            deriveStress(\r\n                market\r\n            );\r\n\r\n        const className =\r\n            stress.score >= 70\r\n                ? \"bad\"\r\n                : (\r\n                    stress.score >= 40\r\n                        ? \"warn\"\r\n                        : \"good\"\r\n                );\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>GLOBAL RISK MODE<\/strong>\r\n                <span>RISK<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Market Stress Index<\/span>\r\n                    <strong class=\"mx-cc-value ${className}\">\r\n                        ${stress.score}\/100 \u00b7 ${stress.label}\r\n                    <\/strong>\r\n                    <div class=\"mx-meter\">\r\n                        <span style=\"width:${stress.score}%\"><\/span>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Sentiment<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(market.sentiment || \"Neutral\")}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Price Shock<\/span>\r\n                    <strong class=\"mx-cc-value ${\r\n                        Math.abs(num(market.change) || 0) >= 1.5\r\n                            ? \"bad\"\r\n                            : \"good\"\r\n                    }\">\r\n                        ${\r\n                            Math.abs(num(market.change) || 0) >= 1.5\r\n                                ? \"Detected\"\r\n                                : \"Normal\"\r\n                        }\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Risk Context<\/span>\r\n                    <strong class=\"mx-cc-value\">\r\n                        ${escapeHtml(ruleBasedInsight(market, stress))}\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderRegulation(\r\n        center,\r\n        market\r\n    ) {\r\n        const meta =\r\n            CITY_META[\r\n                market.city\r\n            ] ||\r\n            {};\r\n\r\n        const regulators =\r\n            meta.regulators ||\r\n            [];\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>REGULATION MAP<\/strong>\r\n                <span>JURISDICTION<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Primary Regulators<\/span>\r\n\r\n                    ${\r\n                        regulators.length\r\n                            ? `\r\n                                <div class=\"mx-chip-row\">\r\n                                    ${regulators.map(item => `\r\n                                        <span class=\"mx-chip\">${escapeHtml(item)}<\/span>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `\r\n                                <span class=\"mx-feed-waiting\">\r\n                                    Regulatory metadata is not mapped for this city yet.\r\n                                <\/span>\r\n                              `\r\n                    }\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Jurisdiction<\/span>\r\n                    <strong class=\"mx-cc-value\">\r\n                        ${escapeHtml(market.country || \"\u2014\")}\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderBrokers(\r\n        center,\r\n        market,\r\n        brokers\r\n    ) {\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>BROKER INTELLIGENCE<\/strong>\r\n                <span>TOP 5<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Broker Presence<\/span>\r\n                    <strong class=\"mx-cc-value\">${brokers.length} Top Ranked<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">City<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(market.city || \"\u2014\")}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">MARKUNOX Top Brokers<\/span>\r\n\r\n                    ${\r\n                        brokers.length\r\n                            ? `\r\n                                <div class=\"mx-list\">\r\n                                    ${brokers.map(item => `\r\n                                        <div class=\"mx-list-row\">\r\n                                            <span>${escapeHtml(item.name)}<\/span>\r\n                                            <b>${item.rank ? \"#\" + item.rank : \"\u2014\"}<\/b>\r\n                                        <\/div>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `\r\n                                <span class=\"mx-feed-waiting\">\r\n                                    No ranked broker office is available for this city yet.\r\n                                <\/span>\r\n                              `\r\n                    }\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderFlow(\r\n        doc,\r\n        center,\r\n        market\r\n    ) {\r\n        const open =\r\n            sessionCards(doc)\r\n                .map(sessionInfo)\r\n                .filter(\r\n                    item =>\r\n                        item.isOpen\r\n                );\r\n\r\n        const upcoming =\r\n            sessionCards(doc)\r\n                .map(sessionInfo)\r\n                .filter(\r\n                    item =>\r\n                        !item.isOpen\r\n                )\r\n                .slice(\r\n                    0,\r\n                    4\r\n                );\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>GLOBAL LIQUIDITY & FLOW<\/strong>\r\n                <span>FLOW<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Active Liquidity Centres<\/span>\r\n\r\n                    ${\r\n                        open.length\r\n                            ? `\r\n                                <div class=\"mx-chip-row\">\r\n                                    ${open.map(item => `\r\n                                        <span class=\"mx-chip\">${escapeHtml(item.name)}<\/span>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `\r\n                                <span class=\"mx-feed-waiting\">\r\n                                    No main cash-market session is currently marked open.\r\n                                <\/span>\r\n                              `\r\n                    }\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Liquidity Clock \u00b7 Next Sessions<\/span>\r\n\r\n                    <div class=\"mx-list\">\r\n                        ${upcoming.map(item => `\r\n                            <div class=\"mx-list-row\">\r\n                                <span>${escapeHtml(item.name)}<\/span>\r\n                                <b>${escapeHtml(item.time || \"Closed\")}<\/b>\r\n                            <\/div>\r\n                        `).join(\"\")}\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Capital Flow Feed<\/span>\r\n                    <span class=\"mx-feed-waiting\" data-mx-capital-feed>\r\n                        Checking MARKUNOX capital-flow feed\u2026\r\n                    <\/span>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n\r\n        optionalFeed(\r\n            \"capitalFlow\",\r\n            market.city\r\n        )\r\n            .then(\r\n                payload => {\r\n\r\n                    const node =\r\n                        center.querySelector(\r\n                            \"[data-mx-capital-feed]\"\r\n                        );\r\n\r\n                    if (!node) {\r\n                        return;\r\n                    }\r\n\r\n                    if (!payload) {\r\n                        node.textContent =\r\n                            \"Live capital-flow feed is not connected; no synthetic flow is shown.\";\r\n                        return;\r\n                    }\r\n\r\n                    node.textContent =\r\n                        clean(\r\n                            payload.summary ||\r\n                            payload.data?.summary ||\r\n                            \"Live capital-flow data connected.\"\r\n                        );\r\n                }\r\n            );\r\n    }\r\n\r\n\r\n    function renderFX(\r\n        center,\r\n        market\r\n    ) {\r\n        const meta =\r\n            CITY_META[\r\n                market.city\r\n            ] ||\r\n            {};\r\n\r\n        const bank =\r\n            meta.centralBank ||\r\n            CURRENCY_BANK[\r\n                market.currency\r\n            ] ||\r\n            \"\u2014\";\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>FX & CENTRAL BANK<\/strong>\r\n                <span>${escapeHtml(market.currency || \"FX\")}<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Currency<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(market.currency || \"\u2014\")}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Currency Strength<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(market.currencyStrength || \"Neutral\")}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Central Bank<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(bank)}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Policy Rate<\/span>\r\n                    <span class=\"mx-feed-waiting\">\r\n                        Live policy-rate feed is intentionally not hard-coded.\r\n                    <\/span>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderEvents(\r\n        doc,\r\n        center,\r\n        market\r\n    ) {\r\n        const statusOpen =\r\n            \/OPEN\/i.test(\r\n                market.status\r\n            );\r\n\r\n        const nextLabel =\r\n            statusOpen\r\n                ? \"Cash Market Close\"\r\n                : \"Cash Market Open\";\r\n\r\n        const nextTime =\r\n            statusOpen\r\n                ? countdown(\r\n                    market.localTime,\r\n                    market.close\r\n                )\r\n                : countdown(\r\n                    market.localTime,\r\n                    market.open\r\n                );\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>EVENT & NEWS PULSE<\/strong>\r\n                <span>LIVE ADAPTER<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">${nextLabel}<\/span>\r\n                    <strong class=\"mx-cc-value\">${escapeHtml(nextTime)}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card\">\r\n                    <span class=\"mx-cc-label\">Shock Monitor<\/span>\r\n                    <strong class=\"mx-cc-value ${\r\n                        Math.abs(num(market.change) || 0) >= 1.5\r\n                            ? \"bad\"\r\n                            : \"good\"\r\n                    }\">\r\n                        ${\r\n                            Math.abs(num(market.change) || 0) >= 1.5\r\n                                ? \"ACTIVE\"\r\n                                : \"NORMAL\"\r\n                        }\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Next Economic Event<\/span>\r\n                    <span class=\"mx-feed-waiting\" data-mx-event-feed>\r\n                        Checking MARKUNOX economic calendar\u2026\r\n                    <\/span>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">News Pulse<\/span>\r\n                    <span class=\"mx-feed-waiting\" data-mx-news-feed>\r\n                        Checking MARKUNOX news feed\u2026\r\n                    <\/span>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n\r\n        optionalFeed(\r\n            \"events\",\r\n            market.city\r\n        )\r\n            .then(\r\n                payload => {\r\n\r\n                    const node =\r\n                        center.querySelector(\r\n                            \"[data-mx-event-feed]\"\r\n                        );\r\n\r\n                    if (!node) return;\r\n\r\n                    if (!payload) {\r\n                        node.textContent =\r\n                            \"Economic-event feed is not connected yet; no fabricated event is displayed.\";\r\n                        return;\r\n                    }\r\n\r\n                    const event =\r\n                        payload.data?.[0] ||\r\n                        payload.events?.[0] ||\r\n                        payload.event ||\r\n                        null;\r\n\r\n                    node.textContent =\r\n                        event\r\n                            ? clean(\r\n                                event.title ||\r\n                                event.name ||\r\n                                event.event ||\r\n                                \"Economic event available\"\r\n                            )\r\n                            : \"No upcoming event returned by the feed.\";\r\n                }\r\n            );\r\n\r\n        optionalFeed(\r\n            \"news\",\r\n            market.city\r\n        )\r\n            .then(\r\n                payload => {\r\n\r\n                    const node =\r\n                        center.querySelector(\r\n                            \"[data-mx-news-feed]\"\r\n                        );\r\n\r\n                    if (!node) return;\r\n\r\n                    if (!payload) {\r\n                        node.textContent =\r\n                            \"News feed is not connected yet; no fabricated headline is displayed.\";\r\n                        return;\r\n                    }\r\n\r\n                    const item =\r\n                        payload.data?.[0] ||\r\n                        payload.news?.[0] ||\r\n                        payload.items?.[0] ||\r\n                        null;\r\n\r\n                    node.textContent =\r\n                        item\r\n                            ? clean(\r\n                                item.title ||\r\n                                item.headline ||\r\n                                \"Market news available\"\r\n                            )\r\n                            : \"No current headline returned by the feed.\";\r\n                }\r\n            );\r\n    }\r\n\r\n\r\n    function renderExchanges(\r\n        center,\r\n        market\r\n    ) {\r\n        const meta =\r\n            CITY_META[\r\n                market.city\r\n            ] ||\r\n            {};\r\n\r\n        const exchanges =\r\n            meta.exchanges ||\r\n            [];\r\n\r\n        const commodities =\r\n            meta.commodities ||\r\n            [];\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>EXCHANGE & INSTITUTIONAL LAYER<\/strong>\r\n                <span>HUB<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Major Exchanges<\/span>\r\n                    ${\r\n                        exchanges.length\r\n                            ? `\r\n                                <div class=\"mx-chip-row\">\r\n                                    ${exchanges.map(item => `\r\n                                        <span class=\"mx-chip\">${escapeHtml(item)}<\/span>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `<span class=\"mx-feed-waiting\">Exchange metadata not mapped yet.<\/span>`\r\n                    }\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Commodities Layer<\/span>\r\n                    ${\r\n                        commodities.length\r\n                            ? `\r\n                                <div class=\"mx-chip-row\">\r\n                                    ${commodities.map(item => `\r\n                                        <span class=\"mx-chip\">${escapeHtml(item)}<\/span>\r\n                                    `).join(\"\")}\r\n                                <\/div>\r\n                              `\r\n                            : `<span class=\"mx-feed-waiting\">Commodity-hub metadata not mapped yet.<\/span>`\r\n                    }\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Institutional Presence<\/span>\r\n                    <strong class=\"mx-cc-value\">\r\n                        ${escapeHtml(meta.institutional || \"Institutional metadata not mapped yet.\")}\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderDigital(\r\n        center,\r\n        market\r\n    ) {\r\n        const meta =\r\n            CITY_META[\r\n                market.city\r\n            ] ||\r\n            {};\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>DIGITAL ASSET LAYER<\/strong>\r\n                <span>CRYPTO<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Digital-Asset Hub<\/span>\r\n                    <strong class=\"mx-cc-value\">\r\n                        ${escapeHtml(meta.digital || \"Digital-asset metadata not mapped yet.\")}\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Risk Note<\/span>\r\n                    <span class=\"mx-feed-waiting\">\r\n                        Digital-asset regulation and market risk vary by jurisdiction; this layer does not infer legal availability.\r\n                    <\/span>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    function renderReplay(\r\n        center,\r\n        market\r\n    ) {\r\n        const history =\r\n            readHistory();\r\n\r\n        const max =\r\n            Math.max(\r\n                0,\r\n                history.length - 1\r\n            );\r\n\r\n        const latest =\r\n            history[\r\n                max\r\n            ];\r\n\r\n        center.innerHTML = `\r\n            <div class=\"mx-cc-head\">\r\n                <strong>HISTORICAL REPLAY<\/strong>\r\n                <span>LOCAL HISTORY<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mx-cc-grid\">\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Recorded Snapshots<\/span>\r\n                    <strong class=\"mx-cc-value\">${history.length}<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Replay Timeline<\/span>\r\n\r\n                    <div class=\"mx-replay-controls\">\r\n                        <input\r\n                            type=\"range\"\r\n                            min=\"0\"\r\n                            max=\"${max}\"\r\n                            value=\"${max}\"\r\n                            step=\"1\"\r\n                            ${history.length ? \"\" : \"disabled\"}\r\n                            data-mx-replay\r\n                        >\r\n                    <\/div>\r\n\r\n                    <div\r\n                        class=\"mx-feed-waiting\"\r\n                        data-mx-replay-label\r\n                        style=\"margin-top:6px;\"\r\n                    >\r\n                        ${\r\n                            latest\r\n                                ? new Date(\r\n                                    latest.ts\r\n                                  ).toLocaleString()\r\n                                : \"History starts collecting after this version is deployed.\"\r\n                        }\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"mx-cc-card wide\">\r\n                    <span class=\"mx-cc-label\">Replay Note<\/span>\r\n                    <span class=\"mx-feed-waiting\">\r\n                        Snapshots are collected locally without changing live globe behavior.\r\n                    <\/span>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n\r\n        const slider =\r\n            center.querySelector(\r\n                \"[data-mx-replay]\"\r\n            );\r\n\r\n        const label =\r\n            center.querySelector(\r\n                \"[data-mx-replay-label]\"\r\n            );\r\n\r\n        slider?.addEventListener(\r\n            \"input\",\r\n            function () {\r\n\r\n                const snapshot =\r\n                    history[\r\n                        Number(\r\n                            slider.value\r\n                        )\r\n                    ];\r\n\r\n                if (\r\n                    !snapshot ||\r\n                    !label\r\n                ) {\r\n                    return;\r\n                }\r\n\r\n                const row =\r\n                    snapshot.rows\r\n                        ?.find(\r\n                            item =>\r\n                                item.name ===\r\n                                market.city\r\n                        );\r\n\r\n                label.textContent =\r\n                    new Date(\r\n                        snapshot.ts\r\n                    )\r\n                        .toLocaleString() +\r\n                    (\r\n                        row &&\r\n                        row.change !== null\r\n                            ? (\r\n                                \" \u00b7 \" +\r\n                                market.city +\r\n                                \" \" +\r\n                                (\r\n                                    row.change > 0\r\n                                        ? \"+\"\r\n                                        : \"\"\r\n                                ) +\r\n                                Number(\r\n                                    row.change\r\n                                )\r\n                                    .toFixed(2) +\r\n                                \"%\"\r\n                            )\r\n                            : \"\"\r\n                    );\r\n            }\r\n        );\r\n    }\r\n\r\n\r\n    async function renderCommand(\r\n        doc\r\n    ) {\r\n        const center =\r\n            ensureCommandCenter(\r\n                doc\r\n            );\r\n\r\n        if (!center) {\r\n            return;\r\n        }\r\n\r\n        const market =\r\n            getSelectedMarket(\r\n                doc\r\n            );\r\n\r\n        selectedCity =\r\n            market.city;\r\n\r\n        if (!market.city) {\r\n            center.innerHTML = \"\";\r\n            return;\r\n        }\r\n\r\n        const brokers =\r\n            await cityBrokers(\r\n                market.city\r\n            );\r\n\r\n        if (\r\n            market.city !==\r\n            selectedCity\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        if (\r\n            activeLayer ===\r\n            \"markets\"\r\n        ) {\r\n            await renderMarkets(\r\n                doc,\r\n                center,\r\n                market,\r\n                brokers\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"risk\"\r\n        ) {\r\n            renderRisk(\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"regulation\"\r\n        ) {\r\n            renderRegulation(\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"brokers\"\r\n        ) {\r\n            renderBrokers(\r\n                center,\r\n                market,\r\n                brokers\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"flow\"\r\n        ) {\r\n            renderFlow(\r\n                doc,\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"fx\"\r\n        ) {\r\n            renderFX(\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"events\"\r\n        ) {\r\n            renderEvents(\r\n                doc,\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"exchanges\"\r\n        ) {\r\n            renderExchanges(\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"digital\"\r\n        ) {\r\n            renderDigital(\r\n                center,\r\n                market\r\n            );\r\n        }\r\n        else if (\r\n            activeLayer ===\r\n            \"replay\"\r\n        ) {\r\n            renderReplay(\r\n                center,\r\n                market\r\n            );\r\n        }\r\n\r\n        const change =\r\n            Math.abs(\r\n                num(\r\n                    market.change\r\n                ) ||\r\n                0\r\n            );\r\n\r\n        if (\r\n            change >= 2\r\n        ) {\r\n            const section =\r\n                doc.getElementById(\r\n                    \"globe-section\"\r\n                );\r\n\r\n            section\r\n                ?.classList.remove(\r\n                    \"mx-event-shock\"\r\n                );\r\n\r\n            void section?.offsetWidth;\r\n\r\n            section\r\n                ?.classList.add(\r\n                    \"mx-event-shock\"\r\n                );\r\n        }\r\n    }\r\n\r\n\r\n    function scheduleRender(\r\n        doc\r\n    ) {\r\n        clearTimeout(\r\n            commandRenderTimer\r\n        );\r\n\r\n        commandRenderTimer =\r\n            setTimeout(\r\n                () =>\r\n                    renderCommand(\r\n                        doc\r\n                    ),\r\n                80\r\n            );\r\n    }\r\n\r\n\r\n    function bindSpecificObservers(\r\n        doc\r\n    ) {\r\n        const ids = [\r\n            \"panel-market-name\",\r\n            \"panel-status-text\",\r\n            \"panel-change\",\r\n            \"panel-volatility\",\r\n            \"panel-currency-strength\"\r\n        ];\r\n\r\n        ids.forEach(\r\n            id => {\r\n\r\n                const element =\r\n                    doc.getElementById(\r\n                        id\r\n                    );\r\n\r\n                if (\r\n                    !element ||\r\n                    element.dataset\r\n                        .mxCommandObserved ===\r\n                        \"1\"\r\n                ) {\r\n                    return;\r\n                }\r\n\r\n                element.dataset\r\n                    .mxCommandObserved =\r\n                    \"1\";\r\n\r\n                const observer =\r\n                    new MutationObserver(\r\n                        () => {\r\n                            applyLayerVisuals(\r\n                                doc\r\n                            );\r\n\r\n                            scheduleRender(\r\n                                doc\r\n                            );\r\n                        }\r\n                    );\r\n\r\n                observer.observe(\r\n                    element,\r\n                    {\r\n                        childList:\r\n                            true,\r\n\r\n                        subtree:\r\n                            true,\r\n\r\n                        characterData:\r\n                            true\r\n                    }\r\n                );\r\n            }\r\n        );\r\n    }\r\n\r\n\r\n        if (\r\n            snapshotTimer\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        captureHistory(\r\n            doc\r\n        );\r\n\r\n        snapshotTimer =\r\n            setInterval(\r\n                () =>\r\n                    captureHistory(\r\n                        doc\r\n                    ),\r\n                CONFIG.snapshotEveryMs\r\n            );\r\n    }\r\n\r\n\r\n    function boot() {\r\n        const doc =\r\n            getDoc();\r\n\r\n        if (!doc) {\r\n            return;\r\n        }\r\n\r\n        installStyles(\r\n            doc\r\n        );\r\n\r\n        installLayerBar(\r\n            doc\r\n        );\r\n\r\n        ensureCommandCenter(\r\n            doc\r\n        );\r\n\r\n        applyLayerVisuals(\r\n            doc\r\n        );\r\n\r\n        bindSpecificObservers(\r\n            doc\r\n        );\r\n\r\n        startSnapshotTimer(\r\n            doc\r\n        );\r\n\r\n        scheduleRender(\r\n            doc\r\n        );\r\n    }\r\n\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        function () {\r\n\r\n            setTimeout(\r\n                boot,\r\n                500\r\n            );\r\n\r\n            setTimeout(\r\n                boot,\r\n                1400\r\n            );\r\n        }\r\n    );\r\n\r\n\r\n    if (\r\n        frame.contentDocument\r\n            ?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function getDoc() {\r\n        try {\r\n            return frame.contentDocument || frame.contentWindow?.document || null;\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    function clean(value) {\r\n        return String(value ?? \"\").replace(\/\\s+\/g, \" \").trim();\r\n    }\r\n\r\n    function getSessionCards(doc) {\r\n        return Array.from(doc.querySelectorAll(\".market-session\"));\r\n    }\r\n\r\n    function parseCard(card) {\r\n        const text = clean(card?.innerText);\r\n        const name =\r\n            clean(card?.querySelector(\".session-name\")?.textContent) ||\r\n            text.split(\" \")[0] ||\r\n            \"Market\";\r\n\r\n        const isOpen =\r\n            \/\\bOPEN\\b\/i.test(text) &&\r\n            !\/\\bCLOSED\\b\/i.test(text);\r\n\r\n        const changeMatch = text.match(\/[-+]?\\d+(?:\\.\\d+)?%\/);\r\n        const change = changeMatch ? Number(changeMatch[0].replace(\"%\",\"\")) : null;\r\n\r\n        return { name, isOpen, change };\r\n    }\r\n\r\n    function ensureLayerPanel(doc) {\r\n        let panel = doc.getElementById(\"mx-layer-intelligence-panel\");\r\n        if (panel) return panel;\r\n\r\n        const section = doc.getElementById(\"globe-section\");\r\n        if (!section) return null;\r\n\r\n        panel = doc.createElement(\"section\");\r\n        panel.id = \"mx-layer-intelligence-panel\";\r\n\r\n        section.appendChild(panel);\r\n\r\n        if (!doc.getElementById(\"mx-layer-panel-style\")) {\r\n            const style = doc.createElement(\"style\");\r\n            style.id = \"mx-layer-panel-style\";\r\n            style.textContent = `\r\n                #mx-layer-intelligence-panel{\r\n                    position:absolute;\r\n                    left:30px;\r\n                    bottom:78px;\r\n                    width:300px;\r\n                    z-index:74;\r\n                    padding:14px;\r\n                    border:1px solid rgba(106,132,165,.23);\r\n                    border-radius:12px;\r\n                    background:linear-gradient(180deg,rgba(8,14,24,.94),rgba(5,10,18,.94));\r\n                    box-shadow:0 18px 42px rgba(0,0,0,.22);\r\n                    backdrop-filter:blur(10px);\r\n                    display:none;\r\n                }\r\n                #mx-layer-intelligence-panel.show{\r\n                    display:block;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-head{\r\n                    display:flex;\r\n                    justify-content:space-between;\r\n                    gap:12px;\r\n                    align-items:center;\r\n                    margin-bottom:10px;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-title{\r\n                    color:#f7fbff;\r\n                    font-size:11px;\r\n                    font-weight:900;\r\n                    letter-spacing:.6px;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-badge{\r\n                    color:#5ce5e3;\r\n                    font-size:7px;\r\n                    font-weight:900;\r\n                    letter-spacing:1px;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-grid{\r\n                    display:grid;\r\n                    grid-template-columns:1fr 1fr;\r\n                    gap:7px;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-card{\r\n                    padding:9px;\r\n                    min-height:52px;\r\n                    border-radius:8px;\r\n                    background:rgba(14,22,36,.72);\r\n                    border:1px solid rgba(112,137,170,.12);\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-card.wide{\r\n                    grid-column:1\/-1;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-label{\r\n                    display:block;\r\n                    margin-bottom:5px;\r\n                    color:#6d7d94;\r\n                    font-size:7px;\r\n                    font-weight:800;\r\n                    letter-spacing:.85px;\r\n                    text-transform:uppercase;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-value{\r\n                    display:block;\r\n                    color:#f5f8ff;\r\n                    font-size:11px;\r\n                    font-weight:850;\r\n                    line-height:1.35;\r\n                }\r\n                #mx-layer-intelligence-panel .mx-lp-note{\r\n                    color:#8492a8;\r\n                    font-size:8px;\r\n                    line-height:1.45;\r\n                }\r\n                @media(max-width:900px){\r\n                    #mx-layer-intelligence-panel{\r\n                        left:16px;\r\n                        bottom:68px;\r\n                        width:260px;\r\n                    }\r\n                }\r\n                @media(max-width:767px){\r\n                    #mx-layer-intelligence-panel{\r\n                        display:none!important;\r\n                    }\r\n                }\r\n            `;\r\n            (doc.head || doc.documentElement).appendChild(style);\r\n        }\r\n\r\n        return panel;\r\n    }\r\n\r\n    function globalStats(doc) {\r\n        const cards = getSessionCards(doc).map(parseCard);\r\n        const open = cards.filter(x => x.isOpen).length;\r\n        const closed = Math.max(0, cards.length - open);\r\n        const priced = cards.filter(x => Number.isFinite(x.change));\r\n        const movers = [...priced]\r\n            .sort((a, b) => Math.abs(b.change) - Math.abs(a.change))\r\n            .slice(0, 3);\r\n        const strongest = priced.length\r\n            ? [...priced].sort((a, b) => b.change - a.change)[0]\r\n            : null;\r\n        const weakest = priced.length\r\n            ? [...priced].sort((a, b) => a.change - b.change)[0]\r\n            : null;\r\n        const avgChange = priced.length\r\n            ? priced.reduce((sum, item) => sum + item.change, 0) \/ priced.length\r\n            : null;\r\n        const maxVol = priced.length\r\n            ? Math.max(...priced.map(item => Math.abs(item.change)))\r\n            : null;\r\n\r\n        let bias = \"Neutral\";\r\n        if (Number.isFinite(avgChange)) {\r\n            if (avgChange >= 0.35) bias = \"Risk-On\";\r\n            else if (avgChange <= -0.35) bias = \"Risk-Off\";\r\n        } else if (open === 0) {\r\n            bias = \"Sessions Closed\";\r\n        }\r\n\r\n        let volatility = \"Feed Pending\";\r\n        if (Number.isFinite(maxVol)) {\r\n            volatility = maxVol >= 2 ? \"High\" : maxVol >= 1 ? \"Medium\" : \"Low\";\r\n        }\r\n\r\n        return { cards, open, closed, priced, movers, strongest, weakest, avgChange, maxVol, bias, volatility };\r\n    }\r\n\r\n    function renderGlobalLayer(doc, layer) {\r\n        const panel = ensureLayerPanel(doc);\r\n        if (!panel) return;\r\n\r\n        const s = globalStats(doc);\r\n\r\n        const titles = {\r\n            markets: \"GLOBAL MARKET PULSE\",\r\n            risk: \"GLOBAL RISK\",\r\n            regulation: \"REGULATION MAP\",\r\n            brokers: \"BROKER INTELLIGENCE\",\r\n            flow: \"CAPITAL & LIQUIDITY FLOW\",\r\n            fx: \"GLOBAL FX\",\r\n            events: \"EVENTS & NEWS PULSE\",\r\n            exchanges: \"EXCHANGES & HUBS\",\r\n            digital: \"DIGITAL ASSETS\",\r\n            replay: \"HISTORICAL REPLAY\"\r\n        };\r\n\r\n        let body = \"\";\r\n\r\n        if (layer === \"markets\") {\r\n            const strongestText = s.strongest\r\n                ? `${s.strongest.name} ${s.strongest.change > 0 ? \"+\" : \"\"}${s.strongest.change.toFixed(2)}%`\r\n                : \"Feed Pending\";\r\n            const weakestText = s.weakest\r\n                ? `${s.weakest.name} ${s.weakest.change > 0 ? \"+\" : \"\"}${s.weakest.change.toFixed(2)}%`\r\n                : \"Feed Pending\";\r\n            const moversText = s.movers.length\r\n                ? s.movers.map(x => `${x.name} ${x.change > 0 ? \"+\" : \"\"}${x.change.toFixed(2)}%`).join(\" \u00b7 \")\r\n                : \"Waiting for live percentage-change data.\";\r\n\r\n            body = `\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Markets Open<\/span><strong class=\"mx-lp-value\">${s.open}\/${s.cards.length}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Coverage<\/span><strong class=\"mx-lp-value\">${s.cards.length} Cities<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Strongest Market<\/span><strong class=\"mx-lp-value\">${strongestText}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Weakest Market<\/span><strong class=\"mx-lp-value\">${weakestText}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Global Bias<\/span><strong class=\"mx-lp-value\">${s.bias}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Volatility<\/span><strong class=\"mx-lp-value\">${s.volatility}<\/strong><\/div>\r\n                \r\n            `;\r\n        } else if (layer === \"risk\") {\r\n            const shocks = s.cards.filter(x => Number.isFinite(x.change) && Math.abs(x.change) >= 1.5);\r\n            body = `\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Shock Markets<\/span><strong class=\"mx-lp-value\">${shocks.length}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Coverage<\/span><strong class=\"mx-lp-value\">${s.cards.length} Cities<\/strong><\/div>\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Risk Monitor<\/span><span class=\"mx-lp-note\">${\r\n                    shocks.length\r\n                    ? shocks.map(x => `${x.name} ${x.change > 0 ? \"+\" : \"\"}${x.change.toFixed(2)}%`).join(\" \u00b7 \")\r\n                    : \"No large move detected from the currently available session data.\"\r\n                }<\/span><\/div>\r\n            `;\r\n        } else if (layer === \"regulation\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">How to use<\/span><span class=\"mx-lp-note\">\r\n                    Click any financial city on the globe. The right-side Market Intelligence panel will open and this layer will show the regulators mapped to that jurisdiction.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Live Status<\/span><strong class=\"mx-lp-value\">Layer active<\/strong><\/div>\r\n            `;\r\n        } else if (layer === \"brokers\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">MARKUNOX Top Brokers by City<\/span><span class=\"mx-lp-note\">\r\n                    Click a city to load the ranked brokers registered or operating from that financial centre.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Coverage<\/span><strong class=\"mx-lp-value\">${s.cards.length} Cities<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Ranking<\/span><strong class=\"mx-lp-value\">MARKUNOX<\/strong><\/div>\r\n            `;\r\n        } else if (layer === \"flow\") {\r\n            body = `\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Open Liquidity Centres<\/span><strong class=\"mx-lp-value\">${s.open}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Next Centres<\/span><strong class=\"mx-lp-value\">${s.closed}<\/strong><\/div>\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Capital Flow<\/span><span class=\"mx-lp-note\">\r\n                    City selection shows liquidity context. Live institutional capital-flow lines will populate when the MARKUNOX capital-flow feed is connected.\r\n                <\/span><\/div>\r\n            `;\r\n        } else if (layer === \"fx\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Currency Intelligence<\/span><span class=\"mx-lp-note\">\r\n                    Click a city to see its local currency, currency-strength signal and mapped central bank.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Mode<\/span><strong class=\"mx-lp-value\">FX<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Status<\/span><strong class=\"mx-lp-value\">Active<\/strong><\/div>\r\n            `;\r\n        } else if (layer === \"events\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Economic Events<\/span><span class=\"mx-lp-note\">\r\n                    City click activates the economic-calendar and news adapters for that market. Missing feeds are never replaced with fabricated headlines.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Shock Monitor<\/span><strong class=\"mx-lp-value\">Active<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">News Pulse<\/span><strong class=\"mx-lp-value\">Adapter Ready<\/strong><\/div>\r\n            `;\r\n        } else if (layer === \"exchanges\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Exchange Layer<\/span><span class=\"mx-lp-note\">\r\n                    Click a city to reveal its mapped stock exchanges, commodities hub and institutional-market role.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Cities<\/span><strong class=\"mx-lp-value\">${s.cards.length}<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Layer<\/span><strong class=\"mx-lp-value\">Active<\/strong><\/div>\r\n            `;\r\n        } else if (layer === \"digital\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Digital Asset Layer<\/span><span class=\"mx-lp-note\">\r\n                    Select a city to see its digital-asset \/ crypto-market role and jurisdiction context.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Mode<\/span><strong class=\"mx-lp-value\">Digital<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Status<\/span><strong class=\"mx-lp-value\">Active<\/strong><\/div>\r\n            `;\r\n        } else if (layer === \"replay\") {\r\n            body = `\r\n                <div class=\"mx-lp-card wide\"><span class=\"mx-lp-label\">Historical Replay<\/span><span class=\"mx-lp-note\">\r\n                    The page records lightweight local snapshots over time. Select a city to replay its collected market changes.\r\n                <\/span><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Storage<\/span><strong class=\"mx-lp-value\">Local<\/strong><\/div>\r\n                <div class=\"mx-lp-card\"><span class=\"mx-lp-label\">Mode<\/span><strong class=\"mx-lp-value\">Replay<\/strong><\/div>\r\n            `;\r\n        }\r\n\r\n        panel.innerHTML = `\r\n            <div class=\"mx-lp-head\">\r\n                <div class=\"mx-lp-title\">${titles[layer] || \"MARKUNOX INTELLIGENCE\"}<\/div>\r\n                <div class=\"mx-lp-badge\">ACTIVE<\/div>\r\n            <\/div>\r\n            <div class=\"mx-lp-grid\">${body}<\/div>\r\n        `;\r\n\r\n        panel.classList.add(\"show\");\r\n    }\r\n\r\n    function bindLayerButtons(doc) {\r\n        const bar = doc.getElementById(\"mx-intelligence-layers\");\r\n        if (!bar || bar.dataset.mxFixedLayerBinding === \"1\") return;\r\n\r\n        bar.dataset.mxFixedLayerBinding = \"1\";\r\n\r\n        bar.addEventListener(\"click\", function(event) {\r\n            const button = event.target.closest(\"button[data-layer]\");\r\n            if (!button) return;\r\n\r\n            const layer = button.dataset.layer || \"markets\";\r\n\r\n            renderGlobalLayer(doc, layer);\r\n\r\n            \/*\r\n             * If a city is already selected, trigger the existing command-center\r\n             * refresh by touching the selected-city text node. This keeps the\r\n             * old city panel logic intact.\r\n             *\/\r\n            const cityName = clean(doc.getElementById(\"panel-market-name\")?.textContent);\r\n            if (cityName) {\r\n                const node = doc.getElementById(\"panel-market-name\");\r\n                if (node) {\r\n                    node.dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    function boot() {\r\n        const doc = getDoc();\r\n        if (!doc) return;\r\n\r\n        bindLayerButtons(doc);\r\n\r\n        \/*\r\n         * Show Markets summary immediately so the bar never looks dead.\r\n         *\/\r\n        if (!doc.getElementById(\"mx-layer-intelligence-panel\")) {\r\n            renderGlobalLayer(doc, \"markets\");\r\n        }\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function() {\r\n        setTimeout(boot, 650);\r\n        setTimeout(boot, 1500);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function fixCommandPanelPosition() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            let style = doc.getElementById(\"mx-command-panel-position-fix\");\r\n            if (!style) {\r\n                style = doc.createElement(\"style\");\r\n                style.id = \"mx-command-panel-position-fix\";\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* Keep the left Live Global Snapshot untouched *\/\r\n                #mx-layer-intelligence-panel {\r\n                    left: 30px !important;\r\n                    top: 355px !important;\r\n                    bottom: auto !important;\r\n\r\n                    width: 300px !important;\r\n                    max-height: 225px\r\nHide Panel (Ctrl + P)\r\n !important;\r\n                    overflow-y: auto !important;\r\n                    overflow-x: hidden !important;\r\n\r\n                    transform: none !important;\r\n                    z-index: 76 !important;\r\n\r\n                    scrollbar-width: none !important;\r\n                    -ms-overflow-style: none !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel::-webkit-scrollbar {\r\n                    display: none !important;\r\n                    width: 0 !important;\r\n                    height: 0 !important;\r\n                }\r\n\r\n                \/* Tabs stay centered at the bottom *\/\r\n                #mx-intelligence-layers {\r\n                    left: 50% !important;\r\n                    right: auto !important;\r\n                    bottom: 18px !important;\r\n                    transform: translateX(-50%) !important;\r\n                    z-index: 75 !important;\r\n                }\r\n\r\n                \/* Extra separation from the snapshot card *\/\r\n                #mx-restored-live-snapshot,\r\n                #mx-safe-live-snapshot {\r\n                    z-index: 80 !important;\r\n                }\r\n\r\n                @media (max-width: 1180px) {\r\n                    #mx-layer-intelligence-panel {\r\n                        left: 18px !important;\r\n                        top: 340px !important;\r\n                        width: 275px !important;\r\n                        max-height: 205px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 900px) {\r\n                    #mx-layer-intelligence-panel {\r\n                        left: 16px !important;\r\n                        top: 330px !important;\r\n                        width: 255px !important;\r\n                        max-height: 190px !important;\r\n                    }\r\n\r\n                    #mx-intelligence-layers {\r\n                        left: 12px !important;\r\n                        right: 12px !important;\r\n                        bottom: 10px !important;\r\n                        transform: none !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #mx-layer-intelligence-panel,\r\n                    #mx-intelligence-layers {\r\n                        display: none !important;\r\n                    }\r\n                }\r\n            `;\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function () {\r\n        setTimeout(fixCommandPanelPosition, 400);\r\n        setTimeout(fixCommandPanelPosition, 1200);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        fixCommandPanelPosition();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function elegantPanelLayout() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            let style = doc.getElementById(\"mx-elegant-command-layout\");\r\n            if (!style) {\r\n                style = doc.createElement(\"style\");\r\n                style.id = \"mx-elegant-command-layout\";\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* =================================================\r\n                   ELEGANT COMMAND PANEL LAYOUT\r\n                   Keep both left cards fully inside the globe area.\r\n                ================================================= *\/\r\n\r\n                #mx-restored-live-snapshot,\r\n                #mx-safe-live-snapshot {\r\n                    left: 30px !important;\r\n                    top: 150px !important;\r\n                    width: 230px !important;\r\n                    z-index: 82 !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel {\r\n                    left: 285px !important;\r\n                    top: 150px !important;\r\n                    bottom: auto !important;\r\n\r\n                    width: 330px !important;\r\n                    max-height: 230px !important;\r\n\r\n                    overflow-y: auto !important;\r\n                    overflow-x: hidden !important;\r\n\r\n                    transform: none !important;\r\n                    z-index: 81 !important;\r\n\r\n                    border-radius: 13px !important;\r\n                    box-shadow:\r\n                        0 18px 44px rgba(0,0,0,.24),\r\n                        0 0 0 1px rgba(7,223,226,.025) inset !important;\r\n\r\n                    scrollbar-width: none !important;\r\n                    -ms-overflow-style: none !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel::-webkit-scrollbar {\r\n                    display: none !important;\r\n                    width: 0 !important;\r\n                    height: 0 !important;\r\n                }\r\n\r\n                \/* Slightly tighter contents so the panel stays elegant *\/\r\n                #mx-layer-intelligence-panel .mx-lp-card {\r\n                    min-height: 46px !important;\r\n                    padding: 8px 9px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-head {\r\n                    margin-bottom: 8px !important;\r\n                }\r\n\r\n                \/* Tabs remain centered at the bottom and never collide *\/\r\n                #mx-intelligence-layers {\r\n                    left: 50% !important;\r\n                    right: auto !important;\r\n                    bottom: 18px !important;\r\n                    transform: translateX(-50%) !important;\r\n                    z-index: 78 !important;\r\n                }\r\n\r\n                \/* Keep the lower section cleanly separated *\/\r\n                #market-data-section {\r\n                    position: relative !important;\r\n                    z-index: 10 !important;\r\n                }\r\n\r\n                @media (max-width: 1450px) {\r\n                    #mx-layer-intelligence-panel {\r\n                        left: 275px !important;\r\n                        width: 300px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 1180px) {\r\n                    #mx-restored-live-snapshot,\r\n                    #mx-safe-live-snapshot {\r\n                        left: 18px !important;\r\n                        top: 140px !important;\r\n                        width: 205px !important;\r\n                    }\r\n\r\n                    #mx-layer-intelligence-panel {\r\n                        left: 238px !important;\r\n                        top: 140px !important;\r\n                        width: 275px !important;\r\n                        max-height: 215px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 980px) {\r\n                    #mx-layer-intelligence-panel {\r\n                        left: 18px !important;\r\n                        top: 355px !important;\r\n                        width: 290px !important;\r\n                        max-height: 150px !important;\r\n                    }\r\n\r\n                    #mx-intelligence-layers {\r\n                        left: 325px !important;\r\n                        right: 12px !important;\r\n                        bottom: 12px !important;\r\n                        transform: none !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #mx-layer-intelligence-panel,\r\n                    #mx-intelligence-layers {\r\n                        display: none !important;\r\n                    }\r\n                }\r\n            `;\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function () {\r\n        setTimeout(elegantPanelLayout, 350);\r\n        setTimeout(elegantPanelLayout, 1100);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        elegantPanelLayout();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function fixFullPanelVisibility() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            let style = doc.getElementById(\"mx-full-panel-visibility-fix\");\r\n\r\n            if (!style) {\r\n                style = doc.createElement(\"style\");\r\n                style.id = \"mx-full-panel-visibility-fix\";\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* Keep the layer panel fully inside the globe section *\/\r\n                #globe-section #mx-layer-intelligence-panel {\r\n                    position: absolute !important;\r\n\r\n                    left: 430px !important;\r\n                    top: 42px !important;\r\n                    right: auto !important;\r\n                    bottom: auto !important;\r\n\r\n                    width: 420px !important;\r\n                    max-width: 420px !important;\r\n\r\n                    height: auto !important;\r\n                    max-height: 250px !important;\r\n\r\n                    overflow-y: auto !important;\r\n                    overflow-x: hidden !important;\r\n\r\n                    opacity: 1 !important;\r\n                    visibility: visible !important;\r\n\r\n                    transform: none !important;\r\n                    z-index: 95 !important;\r\n\r\n                    scrollbar-width: none !important;\r\n                    -ms-overflow-style: none !important;\r\n                }\r\n\r\n                #globe-section #mx-layer-intelligence-panel::-webkit-scrollbar {\r\n                    display: none !important;\r\n                    width: 0 !important;\r\n                    height: 0 !important;\r\n                }\r\n\r\n                \/* Snapshot remains in its original left position *\/\r\n                #globe-section #mx-restored-live-snapshot,\r\n                #globe-section #mx-safe-live-snapshot {\r\n                    left: 30px !important;\r\n                    top: 42px !important;\r\n                    z-index: 96 !important;\r\n                }\r\n\r\n                \/* Make sure no parent clips the intelligence panel *\/\r\n                #globe-section {\r\n                    overflow: hidden !important;\r\n                }\r\n\r\n                \/* Keep tabs independent at bottom *\/\r\n                #globe-section #mx-intelligence-layers {\r\n                    left: 50% !important;\r\n                    bottom: 18px !important;\r\n                    transform: translateX(-50%) !important;\r\n                    z-index: 94 !important;\r\n                }\r\n\r\n                @media (max-width: 1450px) {\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        left: 390px !important;\r\n                        width: 360px !important;\r\n                        max-width: 360px !important;\r\n                        max-height: 235px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 1180px) {\r\n                    #globe-section #mx-restored-live-snapshot,\r\n                    #globe-section #mx-safe-live-snapshot {\r\n                        left: 18px !important;\r\n                        top: 34px !important;\r\n                        width: 205px !important;\r\n                    }\r\n\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        left: 240px !important;\r\n                        top: 34px !important;\r\n                        width: 300px !important;\r\n                        max-width: 300px !important;\r\n                        max-height: 220px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 900px) {\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        left: 18px !important;\r\n                        top: 270px !important;\r\n                        width: 290px !important;\r\n                        max-width: 290px !important;\r\n                        max-height: 165px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #globe-section #mx-layer-intelligence-panel,\r\n                    #globe-section #mx-intelligence-layers {\r\n                        display: none !important;\r\n                    }\r\n                }\r\n            `;\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function () {\r\n        setTimeout(fixFullPanelVisibility, 300);\r\n        setTimeout(fixFullPanelVisibility, 1000);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        fixFullPanelVisibility();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function applyNoOverlapLayout() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            let style = doc.getElementById(\"mx-no-overlap-layout-v2\");\r\n\r\n            if (!style) {\r\n                style = doc.createElement(\"style\");\r\n                style.id = \"mx-no-overlap-layout-v2\";\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* =========================================================\r\n                   FINAL NO-OVERLAP LAYOUT\r\n                   Search stays top-left.\r\n                   Snapshot + Layer panel sit side-by-side below it.\r\n                   Globe remains clear on the right.\r\n                   Tabs stay at bottom center.\r\n                ========================================================= *\/\r\n\r\n                #globe-section {\r\n                    position: relative !important;\r\n                    overflow: hidden !important;\r\n                }\r\n\r\n                \/* Search stays above all left-side cards *\/\r\n                #globe-section .mx-search,\r\n                #globe-section .mx-search-box {\r\n                    position: absolute !important;\r\n                    left: 30px !important;\r\n                    top: 34px !important;\r\n                    z-index: 120 !important;\r\n                }\r\n\r\n                \/* Left Snapshot *\/\r\n                #globe-section #mx-restored-live-snapshot,\r\n                #globe-section #mx-safe-live-snapshot {\r\n                    position: absolute !important;\r\n\r\n                    left: 30px !important;\r\n                    top: 110px !important;\r\n\r\n                    width: 300px !important;\r\n                    max-width: 300px !important;\r\n\r\n                    height: auto !important;\r\n                    max-height: 245px !important;\r\n\r\n                    margin: 0 !important;\r\n                    transform: none !important;\r\n\r\n                    overflow: hidden !important;\r\n\r\n                    z-index: 90 !important;\r\n                }\r\n\r\n                \/* Intelligence panel sits NEXT TO snapshot, not above\/below it *\/\r\n                #globe-section #mx-layer-intelligence-panel {\r\n                    position: absolute !important;\r\n\r\n                    left: 355px !important;\r\n                    top: 110px !important;\r\n                    right: auto !important;\r\n                    bottom: auto !important;\r\n\r\n                    width: 465px !important;\r\n                    max-width: 465px !important;\r\n\r\n                    height: auto !important;\r\n                    max-height: 245px !important;\r\n\r\n                    margin: 0 !important;\r\n                    transform: none !important;\r\n\r\n                    overflow-y: auto !important;\r\n                    overflow-x: hidden !important;\r\n\r\n                    opacity: 1 !important;\r\n                    visibility: visible !important;\r\n\r\n                    z-index: 89 !important;\r\n\r\n                    scrollbar-width: none !important;\r\n                    -ms-overflow-style: none !important;\r\n                }\r\n\r\n                #globe-section #mx-layer-intelligence-panel::-webkit-scrollbar {\r\n                    display: none !important;\r\n                    width: 0 !important;\r\n                    height: 0 !important;\r\n                }\r\n\r\n                \/* Keep the card content compact and elegant *\/\r\n                #mx-layer-intelligence-panel .mx-lp-head {\r\n                    margin-bottom: 8px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-card {\r\n                    min-height: 44px !important;\r\n                    padding: 8px 10px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-value {\r\n                    font-size: 10px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-note {\r\n                    font-size: 7.5px !important;\r\n                    line-height: 1.4 !important;\r\n                }\r\n\r\n                \/* Keep globe visually independent *\/\r\n                #globe-section #markunox-globe {\r\n                    position: relative !important;\r\n                    z-index: 10 !important;\r\n                }\r\n\r\n                #globe-section #markunox-globe canvas {\r\n                    z-index: 10 !important;\r\n                }\r\n\r\n                \/* Tabs remain bottom-center and do not touch cards *\/\r\n                #globe-section #mx-intelligence-layers {\r\n                    position: absolute !important;\r\n\r\n                    left: 50% !important;\r\n                    right: auto !important;\r\n                    bottom: 18px !important;\r\n\r\n                    transform: translateX(-50%) !important;\r\n\r\n                    max-width: 760px !important;\r\n                    z-index: 95 !important;\r\n                }\r\n\r\n                \/* City detail panel stays on the right *\/\r\n                #globe-section #market-panel {\r\n                    z-index: 110 !important;\r\n                }\r\n\r\n                \/* ---------------------------------------------------------\r\n                   Responsive desktop\r\n                --------------------------------------------------------- *\/\r\n                @media (max-width: 1500px) {\r\n                    #globe-section #mx-restored-live-snapshot,\r\n                    #globe-section #mx-safe-live-snapshot {\r\n                        width: 270px !important;\r\n                        max-width: 270px !important;\r\n                    }\r\n\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        left: 325px !important;\r\n                        width: 400px !important;\r\n                        max-width: 400px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 1280px) {\r\n                    #globe-section #mx-restored-live-snapshot,\r\n                    #globe-section #mx-safe-live-snapshot {\r\n                        left: 20px !important;\r\n                        top: 105px !important;\r\n                        width: 235px !important;\r\n                        max-width: 235px !important;\r\n                        max-height: 225px !important;\r\n                    }\r\n\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        left: 270px !important;\r\n                        top: 105px !important;\r\n                        width: 330px !important;\r\n                        max-width: 330px !important;\r\n                        max-height: 225px !important;\r\n                    }\r\n\r\n                    #globe-section #mx-intelligence-layers {\r\n                        max-width: 650px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 1024px) {\r\n                    #globe-section #mx-restored-live-snapshot,\r\n                    #globe-section #mx-safe-live-snapshot {\r\n                        left: 16px !important;\r\n                        top: 102px !important;\r\n                        width: 215px !important;\r\n                        max-width: 215px !important;\r\n                        max-height: 205px !important;\r\n                    }\r\n\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        left: 245px !important;\r\n                        top: 102px !important;\r\n                        width: 285px !important;\r\n                        max-width: 285px !important;\r\n                        max-height: 205px !important;\r\n                    }\r\n\r\n                    #globe-section #mx-intelligence-layers {\r\n                        left: 16px !important;\r\n                        right: 16px !important;\r\n                        bottom: 12px !important;\r\n                        transform: none !important;\r\n                        max-width: none !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #globe-section #mx-layer-intelligence-panel,\r\n                    #globe-section #mx-intelligence-layers {\r\n                        display: none !important;\r\n                    }\r\n                }\r\n            `;\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function () {\r\n        setTimeout(applyNoOverlapLayout, 300);\r\n        setTimeout(applyNoOverlapLayout, 1000);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        applyNoOverlapLayout();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function restorePreviousBackgroundExactly() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            let style =\r\n                doc.getElementById(\r\n                    \"mx-previous-background-restore\"\r\n                );\r\n\r\n            if (!style) {\r\n                style =\r\n                    doc.createElement(\"style\");\r\n\r\n                style.id =\r\n                    \"mx-previous-background-restore\";\r\n\r\n                (\r\n                    doc.head ||\r\n                    doc.documentElement\r\n                ).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* Restore the previous star \/ AI background exactly *\/\r\n                #globe-section {\r\n                    position: relative !important;\r\n                    isolation: isolate !important;\r\n                    overflow: hidden !important;\r\n                    background: #020408 !important;\r\n                }\r\n\r\n                #mx-visible-starfield {\r\n                    position: absolute !important;\r\n                    inset: 0 !important;\r\n\r\n                    z-index: 14 !important;\r\n                    pointer-events: none !important;\r\n\r\n                    opacity: .92 !important;\r\n\r\n                    display: block !important;\r\n                    visibility: visible !important;\r\n\r\n                    background-image:\r\n                        radial-gradient(circle, rgba(255,255,255,.42) 0 1px, transparent 1.5px),\r\n                        radial-gradient(circle, rgba(7,223,226,.38) 0 1px, transparent 1.6px),\r\n                        radial-gradient(circle, rgba(5,97,224,.34) 0 1px, transparent 1.7px);\r\n\r\n                    background-size:\r\n                        73px 73px,\r\n                        119px 119px,\r\n                        181px 181px;\r\n\r\n                    background-position:\r\n                        11px 17px,\r\n                        41px 63px,\r\n                        83px 29px;\r\n\r\n                    -webkit-mask-image:\r\n                        radial-gradient(\r\n                            circle at 50% 47%,\r\n                            rgba(0,0,0,.10) 0 24%,\r\n                            rgba(0,0,0,.32) 34%,\r\n                            #000 52%\r\n                        );\r\n\r\n                    mask-image:\r\n                        radial-gradient(\r\n                            circle at 50% 47%,\r\n                            rgba(0,0,0,.10) 0 24%,\r\n                            rgba(0,0,0,.32) 34%,\r\n                            #000 52%\r\n                        );\r\n                }\r\n\r\n                #mx-visible-starfield::before {\r\n                    content: \"\";\r\n                    position: absolute;\r\n                    inset: 0;\r\n\r\n                    background:\r\n                        radial-gradient(circle at 15% 24%, rgba(7,223,226,.16), transparent 11%),\r\n                        radial-gradient(circle at 82% 20%, rgba(5,97,224,.14), transparent 12%),\r\n                        radial-gradient(circle at 78% 74%, rgba(7,223,226,.11), transparent 12%),\r\n                        radial-gradient(circle at 24% 76%, rgba(5,97,224,.10), transparent 12%);\r\n\r\n                    opacity: .75;\r\n                }\r\n\r\n                #mx-visible-starfield::after {\r\n                    content: \"\";\r\n                    position: absolute;\r\n                    inset: 0;\r\n\r\n                    opacity: .42;\r\n\r\n                    background:\r\n                        linear-gradient(\r\n                            22deg,\r\n                            transparent 0 29%,\r\n                            rgba(7,223,226,.11) 29.2%,\r\n                            transparent 29.5% 100%\r\n                        ),\r\n                        linear-gradient(\r\n                            148deg,\r\n                            transparent 0 43%,\r\n                            rgba(5,97,224,.10) 43.2%,\r\n                            transparent 43.5% 100%\r\n                        ),\r\n                        linear-gradient(\r\n                            78deg,\r\n                            transparent 0 69%,\r\n                            rgba(7,223,226,.08) 69.2%,\r\n                            transparent 69.5% 100%\r\n                        );\r\n                }\r\n\r\n                \/* Globe stays under the star layer *\/\r\n                #markunox-globe,\r\n                #markunox-globe canvas {\r\n                    z-index: 8 !important;\r\n                    background: transparent !important;\r\n                }\r\n\r\n                \/* All UI stays above the stars *\/\r\n                .mx-search,\r\n                #mx-restored-live-snapshot,\r\n                #mx-safe-live-snapshot,\r\n                #mx-layer-intelligence-panel,\r\n                #mx-intelligence-layers,\r\n                #market-panel,\r\n                #markunox-topbar,\r\n                .mx-card,\r\n                #mx-city-top-brokers {\r\n                    z-index: 40 !important;\r\n                }\r\n            `;\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        function () {\r\n            setTimeout(\r\n                restorePreviousBackgroundExactly,\r\n                250\r\n            );\r\n\r\n            setTimeout(\r\n                restorePreviousBackgroundExactly,\r\n                900\r\n            );\r\n        }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        restorePreviousBackgroundExactly();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function moveGlobalMarketsPanelBottomRight() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            let style =\r\n                doc.getElementById(\r\n                    \"mx-global-markets-bottom-right\"\r\n                );\r\n\r\n            if (!style) {\r\n                style =\r\n                    doc.createElement(\"style\");\r\n\r\n                style.id =\r\n                    \"mx-global-markets-bottom-right\";\r\n\r\n                (\r\n                    doc.head ||\r\n                    doc.documentElement\r\n                ).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                #globe-section #mx-layer-intelligence-panel {\r\n                    position: absolute !important;\r\n\r\n                    left: auto !important;\r\n                    top: auto !important;\r\n                    right: 30px !important;\r\n                    bottom: 82px !important;\r\n\r\n                    width: 420px !important;\r\n                    max-width: 420px !important;\r\n\r\n                    height: auto !important;\r\n                    max-height: 235px !important;\r\n\r\n                    transform: none !important;\r\n\r\n                    overflow-y: auto !important;\r\n                    overflow-x: hidden !important;\r\n\r\n                    z-index: 92 !important;\r\n\r\n                    scrollbar-width: none !important;\r\n                    -ms-overflow-style: none !important;\r\n                }\r\n\r\n                #globe-section #mx-layer-intelligence-panel::-webkit-scrollbar {\r\n                    display: none !important;\r\n                    width: 0 !important;\r\n                    height: 0 !important;\r\n                }\r\n\r\n                @media (max-width: 1280px) {\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        right: 20px !important;\r\n                        bottom: 78px !important;\r\n                        width: 360px !important;\r\n                        max-width: 360px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 1024px) {\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        right: 16px !important;\r\n                        bottom: 72px !important;\r\n                        width: 320px !important;\r\n                        max-width: 320px !important;\r\n                        max-height: 210px !important;\r\n                    }\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        display: none !important;\r\n                    }\r\n                }\r\n            `;\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        function () {\r\n            setTimeout(\r\n                moveGlobalMarketsPanelBottomRight,\r\n                250\r\n            );\r\n\r\n            setTimeout(\r\n                moveGlobalMarketsPanelBottomRight,\r\n                900\r\n            );\r\n        }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        moveGlobalMarketsPanelBottomRight();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function placeGlobalMarketsPanel() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            const panel =\r\n                doc.getElementById(\r\n                    \"mx-layer-intelligence-panel\"\r\n                );\r\n\r\n            if (!panel) return;\r\n\r\n            panel.style.setProperty(\r\n                \"position\",\r\n                \"absolute\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"left\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"top\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"right\",\r\n                \"28px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"bottom\",\r\n                \"72px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"width\",\r\n                \"420px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"max-width\",\r\n                \"420px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"max-height\",\r\n                \"235px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"transform\",\r\n                \"none\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"z-index\",\r\n                \"120\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"overflow-y\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"overflow-x\",\r\n                \"hidden\",\r\n                \"important\"\r\n            );\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        placeGlobalMarketsPanel();\r\n\r\n        setTimeout(\r\n            placeGlobalMarketsPanel,\r\n            300\r\n        );\r\n\r\n        setTimeout(\r\n            placeGlobalMarketsPanel,\r\n            900\r\n        );\r\n\r\n        setTimeout(\r\n            placeGlobalMarketsPanel,\r\n            1800\r\n        );\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        boot\r\n    );\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        placeGlobalMarketsPanel,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function moveGlobalMarketsAboveLiveData() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            const panel =\r\n                doc.getElementById(\r\n                    \"mx-layer-intelligence-panel\"\r\n                );\r\n\r\n            if (!panel) return;\r\n\r\n            \/* GLOBAL MARKETS: directly above MARKUNOX LIVE DATA *\/\r\n            panel.style.setProperty(\r\n                \"position\",\r\n                \"absolute\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"left\",\r\n                \"30px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"right\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"top\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"bottom\",\r\n                \"0px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"width\",\r\n                \"420px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"max-width\",\r\n                \"420px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"max-height\",\r\n                \"225px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"transform\",\r\n                \"none\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"z-index\",\r\n                \"120\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"overflow-y\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"overflow-x\",\r\n                \"hidden\",\r\n                \"important\"\r\n            );\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        moveGlobalMarketsAboveLiveData();\r\n\r\n        setTimeout(\r\n            moveGlobalMarketsAboveLiveData,\r\n            300\r\n        );\r\n\r\n        setTimeout(\r\n            moveGlobalMarketsAboveLiveData,\r\n            900\r\n        );\r\n\r\n        setTimeout(\r\n            moveGlobalMarketsAboveLiveData,\r\n            1800\r\n        );\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        boot\r\n    );\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        moveGlobalMarketsAboveLiveData,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function movePanelSlightlyLower() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            const panel =\r\n                doc.getElementById(\r\n                    \"mx-layer-intelligence-panel\"\r\n                );\r\n\r\n            if (!panel) return;\r\n\r\n            panel.style.setProperty(\r\n                \"bottom\",\r\n                \"16px\",\r\n                \"important\"\r\n            );\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        function () {\r\n            setTimeout(movePanelSlightlyLower, 250);\r\n            setTimeout(movePanelSlightlyLower, 900);\r\n        }\r\n    );\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        movePanelSlightlyLower,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        movePanelSlightlyLower();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function alignGlobalMarketsWithMarketsTab() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            const panel =\r\n                doc.getElementById(\r\n                    \"mx-layer-intelligence-panel\"\r\n                );\r\n\r\n            const tabs =\r\n                doc.getElementById(\r\n                    \"mx-intelligence-layers\"\r\n                );\r\n\r\n            if (!panel || !tabs) return;\r\n\r\n            const marketsButton =\r\n                tabs.querySelector(\r\n                    'button[data-layer=\"markets\"]'\r\n                );\r\n\r\n            if (!marketsButton) return;\r\n\r\n            const section =\r\n                doc.getElementById(\r\n                    \"globe-section\"\r\n                );\r\n\r\n            if (!section) return;\r\n\r\n            const sectionRect =\r\n                section.getBoundingClientRect();\r\n\r\n            const buttonRect =\r\n                marketsButton.getBoundingClientRect();\r\n\r\n            const panelHeight =\r\n                panel.offsetHeight || 220;\r\n\r\n            const top =\r\n                Math.max(\r\n                    20,\r\n                    (\r\n                        buttonRect.top -\r\n                        sectionRect.top +\r\n                        (buttonRect.height \/ 2) -\r\n                        (panelHeight \/ 2) -\r\n                        32\r\n                    )\r\n                );\r\n\r\n            panel.style.setProperty(\r\n                \"position\",\r\n                \"absolute\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"left\",\r\n                \"30px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"right\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"top\",\r\n                top + \"px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"bottom\",\r\n                \"auto\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"width\",\r\n                \"420px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"max-width\",\r\n                \"420px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"max-height\",\r\n                \"225px\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"transform\",\r\n                \"none\",\r\n                \"important\"\r\n            );\r\n\r\n            panel.style.setProperty(\r\n                \"z-index\",\r\n                \"120\",\r\n                \"important\"\r\n            );\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        alignGlobalMarketsWithMarketsTab();\r\n\r\n        setTimeout(\r\n            alignGlobalMarketsWithMarketsTab,\r\n            300\r\n        );\r\n\r\n        setTimeout(\r\n            alignGlobalMarketsWithMarketsTab,\r\n            900\r\n        );\r\n\r\n        setTimeout(\r\n            alignGlobalMarketsWithMarketsTab,\r\n            1800\r\n        );\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        boot\r\n    );\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        alignGlobalMarketsWithMarketsTab,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function removeLiveGlobalSnapshot() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            [\r\n                \"mx-restored-live-snapshot\",\r\n                \"mx-safe-live-snapshot\",\r\n                \"mx-live-global-snapshot\"\r\n            ].forEach(function (id) {\r\n                const el = doc.getElementById(id);\r\n                if (el) {\r\n                    el.remove();\r\n                }\r\n            });\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        removeLiveGlobalSnapshot();\r\n\r\n        setTimeout(\r\n            removeLiveGlobalSnapshot,\r\n            300\r\n        );\r\n\r\n        setTimeout(\r\n            removeLiveGlobalSnapshot,\r\n            900\r\n        );\r\n\r\n        setTimeout(\r\n            removeLiveGlobalSnapshot,\r\n            1800\r\n        );\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        boot\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function moveGlobalMarketsPanelHigherAgain() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            const panel = doc.getElementById(\"mx-layer-intelligence-panel\");\r\n            const tabs = doc.getElementById(\"mx-intelligence-layers\");\r\n            const section = doc.getElementById(\"globe-section\");\r\n            if (!panel || !tabs || !section) return;\r\n\r\n            const sectionRect = section.getBoundingClientRect();\r\n            const tabsRect = tabs.getBoundingClientRect();\r\n            const panelHeight = panel.offsetHeight || 220;\r\n\r\n            const top = Math.max(\r\n                20,\r\n                (tabsRect.top - sectionRect.top) - panelHeight - 14\r\n            );\r\n\r\n            panel.style.setProperty(\"position\", \"absolute\", \"important\");\r\n            panel.style.setProperty(\"left\", \"30px\", \"important\");\r\n            panel.style.setProperty(\"right\", \"auto\", \"important\");\r\n            panel.style.setProperty(\"top\", top + \"px\", \"important\");\r\n            panel.style.setProperty(\"bottom\", \"auto\", \"important\");\r\n            panel.style.setProperty(\"width\", \"420px\", \"important\");\r\n            panel.style.setProperty(\"max-width\", \"420px\", \"important\");\r\n            panel.style.setProperty(\"max-height\", \"225px\", \"important\");\r\n            panel.style.setProperty(\"transform\", \"none\", \"important\");\r\n            panel.style.setProperty(\"z-index\", \"120\", \"important\");\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        moveGlobalMarketsPanelHigherAgain();\r\n        setTimeout(moveGlobalMarketsPanelHigherAgain, 300);\r\n        setTimeout(moveGlobalMarketsPanelHigherAgain, 900);\r\n        setTimeout(moveGlobalMarketsPanelHigherAgain, 1800);\r\n    }\r\n\r\n    frame.addEventListener(\"load\", boot);\r\n    window.addEventListener(\"resize\", moveGlobalMarketsPanelHigherAgain, { passive: true });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function applyFadedDivider() {\r\n        try {\r\n            const doc = frame.contentDocument || frame.contentWindow?.document;\r\n            if (!doc) return;\r\n\r\n            const styleId = \"mx-faded-divider-line\";\r\n            let style = doc.getElementById(styleId);\r\n\r\n            if (!style) {\r\n                style = doc.createElement(\"style\");\r\n                style.id = styleId;\r\n                (doc.head || doc.documentElement).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                \/* So the separator becomes soft\/faded instead of a hard line *\/\r\n                #market-data-section {\r\n                    position: relative !important;\r\n                    border-top: none !important;\r\n                    box-shadow: none !important;\r\n                }\r\n\r\n                #globe-section {\r\n                    border-bottom: none !important;\r\n                }\r\n\r\n                #market-data-section::before {\r\n                    content: \"\" !important;\r\n                    position: absolute !important;\r\n                    left: 20px !important;\r\n                    right: 20px !important;\r\n                    top: 0 !important;\r\n                    height: 1px !important;\r\n                    pointer-events: none !important;\r\n                    background:\r\n                        linear-gradient(\r\n                            90deg,\r\n                            rgba(7,223,226,0) 0%,\r\n                            rgba(120,145,178,.08) 12%,\r\n                            rgba(120,145,178,.18) 28%,\r\n                            rgba(7,223,226,.16) 50%,\r\n                            rgba(120,145,178,.18) 72%,\r\n                            rgba(120,145,178,.08) 88%,\r\n                            rgba(7,223,226,0) 100%\r\n                        ) !important;\r\n                    box-shadow:\r\n                        0 0 10px rgba(7,223,226,.05) !important;\r\n                    opacity: .95 !important;\r\n                    z-index: 2 !important;\r\n                }\r\n\r\n                @media (max-width: 767px) {\r\n                    #market-data-section::before {\r\n                        left: 12px !important;\r\n                        right: 12px !important;\r\n                    }\r\n                }\r\n            `;\r\n        } catch (e) {}\r\n    }\r\n\r\n    frame.addEventListener(\"load\", applyFadedDivider);\r\n    window.addEventListener(\"resize\", applyFadedDivider, { passive: true });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        applyFadedDivider();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function fixPulsePanelHeight() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            const panel =\r\n                doc.getElementById(\r\n                    \"mx-layer-intelligence-panel\"\r\n                );\r\n\r\n            const tabs =\r\n                doc.getElementById(\r\n                    \"mx-intelligence-layers\"\r\n                );\r\n\r\n            const section =\r\n                doc.getElementById(\r\n                    \"globe-section\"\r\n                );\r\n\r\n            if (!panel || !tabs || !section) return;\r\n\r\n            let style =\r\n                doc.getElementById(\r\n                    \"mx-pulse-full-content-fix\"\r\n                );\r\n\r\n            if (!style) {\r\n                style =\r\n                    doc.createElement(\"style\");\r\n\r\n                style.id =\r\n                    \"mx-pulse-full-content-fix\";\r\n\r\n                (\r\n                    doc.head ||\r\n                    doc.documentElement\r\n                ).appendChild(style);\r\n            }\r\n\r\n            style.textContent = `\r\n                #mx-layer-intelligence-panel {\r\n                    height: auto !important;\r\n                    max-height: none !important;\r\n                    overflow: visible !important;\r\n                    padding: 12px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-head {\r\n                    margin-bottom: 8px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-grid {\r\n                    gap: 6px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-card {\r\n                    min-height: 42px !important;\r\n                    padding: 8px 10px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-card.wide {\r\n                    min-height: 46px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-label {\r\n                    margin-bottom: 4px !important;\r\n                }\r\n\r\n                #mx-layer-intelligence-panel .mx-lp-note {\r\n                    display: block !important;\r\n                    white-space: normal !important;\r\n                    overflow: visible !important;\r\n                }\r\n            `;\r\n\r\n            requestAnimationFrame(function () {\r\n                const sectionRect =\r\n                    section.getBoundingClientRect();\r\n\r\n                const tabsRect =\r\n                    tabs.getBoundingClientRect();\r\n\r\n                const panelHeight =\r\n                    panel.scrollHeight;\r\n\r\n                const targetTop =\r\n                    Math.max(\r\n                        14,\r\n                        (\r\n                            tabsRect.top -\r\n                            sectionRect.top -\r\n                            panelHeight -\r\n                            12\r\n                        )\r\n                    );\r\n\r\n                panel.style.setProperty(\r\n                    \"top\",\r\n                    targetTop + \"px\",\r\n                    \"important\"\r\n                );\r\n\r\n                panel.style.setProperty(\r\n                    \"bottom\",\r\n                    \"auto\",\r\n                    \"important\"\r\n                );\r\n\r\n                panel.style.setProperty(\r\n                    \"left\",\r\n                    \"30px\",\r\n                    \"important\"\r\n                );\r\n\r\n                panel.style.setProperty(\r\n                    \"width\",\r\n                    \"420px\",\r\n                    \"important\"\r\n                );\r\n\r\n                panel.style.setProperty(\r\n                    \"max-width\",\r\n                    \"420px\",\r\n                    \"important\"\r\n                );\r\n            });\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        fixPulsePanelHeight();\r\n\r\n        setTimeout(\r\n            fixPulsePanelHeight,\r\n            250\r\n        );\r\n\r\n        setTimeout(\r\n            fixPulsePanelHeight,\r\n            700\r\n        );\r\n\r\n        setTimeout(\r\n            fixPulsePanelHeight,\r\n            1400\r\n        );\r\n    }\r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        boot\r\n    );\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        boot,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    const CITY_BROKERS_API =\r\n        \"https:\/\/api.markunox.com\/city-top-brokers.php\";\r\n\r\n    const EVENTS_API =\r\n        \"https:\/\/markunox.com\/wp-json\/markunox\/v1\/economic-calendar\";\r\n\r\n    let refreshTimer = null;\r\n    let eventTimer = null;\r\n    let selectedCity = \"\";\r\n    let lastShockKey = \"\";\r\n\r\n    function clean(value) {\r\n        return String(value ?? \"\")\r\n            .replace(\/\\s+\/g, \" \")\r\n            .trim();\r\n    }\r\n\r\n    function getDoc() {\r\n        try {\r\n            return (\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document ||\r\n                null\r\n            );\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    function parsePercent(text) {\r\n        const match =\r\n            clean(text).match(\r\n                \/[-+]?\\d+(?:\\.\\d+)?%\/\r\n            );\r\n\r\n        if (!match) return null;\r\n\r\n        const value =\r\n            Number(\r\n                match[0].replace(\"%\", \"\")\r\n            );\r\n\r\n        return Number.isFinite(value)\r\n            ? value\r\n            : null;\r\n    }\r\n\r\n    function getSessions(doc) {\r\n        return Array.from(\r\n            doc.querySelectorAll(\r\n                \".market-session\"\r\n            )\r\n        ).map(card => {\r\n            const text =\r\n                clean(card.innerText);\r\n\r\n            const city =\r\n    clean(\r\n        card.querySelector(\r\n            \".session-name\"\r\n        )?.textContent\r\n    ) || \"\";\r\n\r\n            const isOpen =\r\n                \/\\bOPEN\\b\/i.test(text) &&\r\n                !\/\\bCLOSED\\b\/i.test(text);\r\n\r\n            return {\r\n                city,\r\n                isOpen,\r\n                change:\r\n                    parsePercent(text)\r\n            };\r\n        });\r\n    }\r\n\r\n    function getSelectedCity(doc) {\r\n    const city =\r\n        clean(\r\n            doc.getElementById(\r\n                \"panel-market-name\"\r\n            )?.textContent\r\n        );\r\n\r\n    if (\r\n        !city ||\r\n        \/^(market|select city|global|n\\\/a|--|null|undefined)$\/i\r\n            .test(city)\r\n    ) {\r\n        return \"\";\r\n    }\r\n\r\n    return city;\r\n}\r\n    function ensureStyles(doc) {\r\n        if (\r\n            doc.getElementById(\r\n                \"mx-signature-globe-style\"\r\n            )\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        const style =\r\n            doc.createElement(\"style\");\r\n\r\n        style.id =\r\n            \"mx-signature-globe-style\";\r\n\r\n        style.textContent = `\r\n            #mx-signature-overlay {\r\n                position: absolute;\r\n                inset: 0;\r\n                z-index: 32;\r\n                pointer-events: none;\r\n                overflow: hidden;\r\n            }\r\n\r\n            #mx-signature-overlay .mx-heat-halo {\r\n                position: absolute;\r\n                left: 50%;\r\n                top: 46%;\r\n                width: 410px;\r\n                height: 410px;\r\n                transform: translate(-50%, -50%);\r\n                border-radius: 50%;\r\n                opacity: .34;\r\n                filter: blur(18px);\r\n                transition:\r\n                    box-shadow .45s ease,\r\n                    opacity .45s ease;\r\n            }\r\n\r\n            #mx-signature-overlay[data-bias=\"up\"] .mx-heat-halo {\r\n                box-shadow:\r\n                    0 0 55px rgba(79,227,155,.28),\r\n                    0 0 110px rgba(79,227,155,.14);\r\n            }\r\n\r\n            #mx-signature-overlay[data-bias=\"down\"] .mx-heat-halo {\r\n                box-shadow:\r\n                    0 0 55px rgba(255,101,120,.26),\r\n                    0 0 110px rgba(255,101,120,.12);\r\n            }\r\n\r\n            #mx-signature-overlay[data-bias=\"neutral\"] .mx-heat-halo {\r\n                box-shadow:\r\n                    0 0 55px rgba(7,223,226,.20),\r\n                    0 0 110px rgba(5,97,224,.09);\r\n            }\r\n\r\n            #mx-capital-flow-svg {\r\n                position: absolute;\r\n                left: 50%;\r\n                top: 46%;\r\n                width: 620px;\r\n                height: 430px;\r\n                transform: translate(-50%, -50%);\r\n                overflow: visible;\r\n                opacity: .68;\r\n            }\r\n\r\n            #mx-capital-flow-svg path {\r\n                fill: none;\r\n                stroke: rgba(72,120,255,.62);\r\n                stroke-width: 1.35;\r\n                stroke-linecap: round;\r\n                stroke-dasharray: 7 12;\r\n                animation: mxFlowDash 7s linear infinite;\r\n                filter: drop-shadow(0 0 4px rgba(49,100,255,.22));\r\n            }\r\n\r\n            #mx-capital-flow-svg path:nth-child(2) {\r\n                animation-duration: 9s;\r\n                stroke: rgba(7,223,226,.52);\r\n            }\r\n\r\n            #mx-capital-flow-svg path:nth-child(3) {\r\n                animation-duration: 11s;\r\n                stroke: rgba(87,151,255,.48);\r\n            }\r\n\r\n            @keyframes mxFlowDash {\r\n                to {\r\n                    stroke-dashoffset: -76;\r\n                }\r\n            }\r\n\r\n            #mx-market-shock-ring {\r\n                position: absolute;\r\n                left: 50%;\r\n                top: 46%;\r\n                width: 330px;\r\n                height: 330px;\r\n                transform: translate(-50%, -50%);\r\n                border: 1px solid rgba(255,118,118,.0);\r\n                border-radius: 50%;\r\n                opacity: 0;\r\n            }\r\n\r\n            #mx-market-shock-ring.active {\r\n                animation:\r\n                    mxShockRing 1.35s ease-out 3;\r\n            }\r\n\r\n            @keyframes mxShockRing {\r\n                0% {\r\n                    opacity: 0;\r\n                    transform:\r\n                        translate(-50%, -50%)\r\n                        scale(.68);\r\n                    border-color:\r\n                        rgba(255,118,118,.82);\r\n                    box-shadow:\r\n                        0 0 18px rgba(255,118,118,.30);\r\n                }\r\n\r\n                70% {\r\n                    opacity: .42;\r\n                }\r\n\r\n                100% {\r\n                    opacity: 0;\r\n                    transform:\r\n                        translate(-50%, -50%)\r\n                        scale(1.28);\r\n                    border-color:\r\n                        rgba(255,118,118,0);\r\n                    box-shadow:\r\n                        0 0 50px rgba(255,118,118,0);\r\n                }\r\n            }\r\n\r\n            #mx-globe-intel-strip {\r\n                position: absolute;\r\n                left: 50%;\r\n                bottom: 78px;\r\n                transform: translateX(-50%);\r\n                z-index: 36;\r\n                display: flex;\r\n                align-items: stretch;\r\n                gap: 7px;\r\n                pointer-events: none;\r\n                max-width: 800px;\r\n            }\r\n\r\n            #mx-globe-intel-strip .mx-si {\r\n                min-width: 122px;\r\n                padding: 8px 10px;\r\n                border: 1px solid rgba(105,130,165,.16);\r\n                border-radius: 9px;\r\n                background:\r\n                    linear-gradient(\r\n                        180deg,\r\n                        rgba(10,17,28,.88),\r\n                        rgba(6,12,21,.88)\r\n                    );\r\n                backdrop-filter: blur(8px);\r\n                box-shadow:\r\n                    0 10px 28px rgba(0,0,0,.15);\r\n            }\r\n\r\n            #mx-globe-intel-strip .mx-si.ai {\r\n                min-width: 290px;\r\n            }\r\n\r\n            #mx-globe-intel-strip .mx-si-label {\r\n                display: block;\r\n                color: #6f7d92;\r\n                font-size: 6.5px;\r\n                font-weight: 900;\r\n                letter-spacing: .9px;\r\n                text-transform: uppercase;\r\n                margin-bottom: 4px;\r\n            }\r\n\r\n            #mx-globe-intel-strip .mx-si-value {\r\n                display: block;\r\n                color: #f5f8ff;\r\n                font-size: 9px;\r\n                font-weight: 850;\r\n                line-height: 1.35;\r\n                white-space: normal;\r\n            }\r\n\r\n            #mx-globe-intel-strip .mx-si-value.live {\r\n                color: #63e5a4;\r\n            }\r\n\r\n            #mx-globe-intel-strip .mx-si-value.cyan {\r\n                color: #68e8e6;\r\n            }\r\n\r\n            @media (max-width: 1180px) {\r\n                #mx-globe-intel-strip {\r\n                    max-width: 650px;\r\n                    gap: 5px;\r\n                }\r\n\r\n                #mx-globe-intel-strip .mx-si {\r\n                    min-width: 102px;\r\n                }\r\n\r\n                #mx-globe-intel-strip .mx-si.ai {\r\n                    min-width: 220px;\r\n                }\r\n\r\n                #mx-capital-flow-svg {\r\n                    width: 520px;\r\n                    height: 380px;\r\n                }\r\n            }\r\n\r\n            @media (max-width: 900px) {\r\n                #mx-globe-intel-strip {\r\n                    display: none !important;\r\n                }\r\n\r\n                #mx-capital-flow-svg {\r\n                    opacity: .42;\r\n                }\r\n            }\r\n\r\n            @media (max-width: 767px) {\r\n                #mx-signature-overlay {\r\n                    display: none !important;\r\n                }\r\n            }\r\n        `;\r\n\r\n        (\r\n            doc.head ||\r\n            doc.documentElement\r\n        ).appendChild(style);\r\n    }\r\n\r\n    function ensureOverlay(doc) {\r\n        const section =\r\n            doc.getElementById(\r\n                \"globe-section\"\r\n            );\r\n\r\n        if (!section) return null;\r\n\r\n        let overlay =\r\n            doc.getElementById(\r\n                \"mx-signature-overlay\"\r\n            );\r\n\r\n        if (!overlay) {\r\n            overlay =\r\n                doc.createElement(\"div\");\r\n\r\n            overlay.id =\r\n                \"mx-signature-overlay\";\r\n\r\n            overlay.dataset.bias =\r\n                \"neutral\";\r\n\r\n            overlay.innerHTML = `\r\n                <div class=\"mx-heat-halo\"><\/div>\r\n\r\n                <svg\r\n                    id=\"mx-capital-flow-svg\"\r\n                    viewBox=\"0 0 620 430\"\r\n                    aria-hidden=\"true\"\r\n                >\r\n                    <path d=\"M70 240 C160 95 420 75 550 205\"><\/path>\r\n                    <path d=\"M95 310 C210 385 425 360 545 245\"><\/path>\r\n                    <path d=\"M115 145 C245 40 410 165 520 315\"><\/path>\r\n                <\/svg>\r\n\r\n                <div id=\"mx-market-shock-ring\"><\/div>\r\n            `;\r\n\r\n            section.appendChild(\r\n                overlay\r\n            );\r\n        }\r\n\r\n        return overlay;\r\n    }\r\n\r\n    function ensureIntelStrip(doc) {\r\n        const section =\r\n            doc.getElementById(\r\n                \"globe-section\"\r\n            );\r\n\r\n        if (!section) return null;\r\n\r\n        let strip =\r\n            doc.getElementById(\r\n                \"mx-globe-intel-strip\"\r\n            );\r\n\r\n        if (!strip) {\r\n            strip =\r\n                doc.createElement(\"div\");\r\n\r\n            strip.id =\r\n                \"mx-globe-intel-strip\";\r\n\r\n            strip.innerHTML = `\r\n                <div class=\"mx-si\">\r\n                    <span class=\"mx-si-label\">\r\n                        Market Heat\r\n                    <\/span>\r\n\r\n                    <strong\r\n                        class=\"mx-si-value cyan\"\r\n                        data-mx-heat\r\n                    >\r\n                        Neutral\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-si\">\r\n                    <span class=\"mx-si-label\">\r\n                        Broker Density\r\n                    <\/span>\r\n\r\n                    <strong\r\n                        class=\"mx-si-value\"\r\n                        data-mx-density\r\n                    >\r\n                        Select City\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-si\">\r\n                    <span class=\"mx-si-label\">\r\n                        Event Shock\r\n                    <\/span>\r\n\r\n                    <strong\r\n                        class=\"mx-si-value live\"\r\n                        data-mx-event\r\n                    >\r\n                        Monitoring\r\n                    <\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-si ai\">\r\n                    <span class=\"mx-si-label\">\r\n                        MARKUNOX AI Insight\r\n                    <\/span>\r\n\r\n                    <strong\r\n                        class=\"mx-si-value\"\r\n                        data-mx-insight\r\n                    >\r\n                        Global session intelligence active.\r\n                    <\/strong>\r\n                <\/div>\r\n            `;\r\n\r\n            section.appendChild(\r\n                strip\r\n            );\r\n        }\r\n\r\n        return strip;\r\n    }\r\n\r\n    function computeMarketHeat(sessions) {\r\n        const priced =\r\n            sessions.filter(\r\n                item =>\r\n                    Number.isFinite(\r\n                        item.change\r\n                    )\r\n            );\r\n\r\n        if (!priced.length) {\r\n            return {\r\n                bias: \"neutral\",\r\n                label: \"Neutral\",\r\n                avg: null\r\n            };\r\n        }\r\n\r\n        const avg =\r\n            priced.reduce(\r\n                (sum, item) =>\r\n                    sum + item.change,\r\n                0\r\n            ) \/ priced.length;\r\n\r\n        if (avg >= .30) {\r\n            return {\r\n                bias: \"up\",\r\n                label: \"Risk-On\",\r\n                avg\r\n            };\r\n        }\r\n\r\n        if (avg <= -.30) {\r\n            return {\r\n                bias: \"down\",\r\n                label: \"Risk-Off\",\r\n                avg\r\n            };\r\n        }\r\n\r\n        return {\r\n            bias: \"neutral\",\r\n            label: \"Balanced\",\r\n            avg\r\n        };\r\n    }\r\n\r\n    function buildInsight(\r\n        sessions,\r\n        heat,\r\n        city\r\n    ) {\r\n        const open =\r\n            sessions.filter(\r\n                item =>\r\n                    item.isOpen\r\n            );\r\n\r\n        const priced =\r\n            sessions.filter(\r\n                item =>\r\n                    Number.isFinite(\r\n                        item.change\r\n                    )\r\n            );\r\n\r\n        let strongest = null;\r\n        let weakest = null;\r\n\r\n        if (priced.length) {\r\n            strongest =\r\n                [...priced].sort(\r\n                    (a, b) =>\r\n                        b.change -\r\n                        a.change\r\n                )[0];\r\n\r\n            weakest =\r\n                [...priced].sort(\r\n                    (a, b) =>\r\n                        a.change -\r\n                        b.change\r\n                )[0];\r\n        }\r\n\r\n        if (\r\n            strongest &&\r\n            weakest\r\n        ) {\r\n            return (\r\n                `${heat.label} tone. ` +\r\n                `${strongest.city} leads at ` +\r\n                `${strongest.change > 0 ? \"+\" : \"\"}` +\r\n                `${strongest.change.toFixed(2)}%, ` +\r\n                `while ${weakest.city} is weakest at ` +\r\n                `${weakest.change > 0 ? \"+\" : \"\"}` +\r\n                `${weakest.change.toFixed(2)}%.`\r\n            );\r\n        }\r\n\r\n        if (city) {\r\n            return (\r\n                `${city} selected. ` +\r\n                `${open.length} of ${sessions.length} ` +\r\n                `tracked market sessions are open.`\r\n            );\r\n        }\r\n\r\n        return (\r\n            `${open.length} of ${sessions.length} ` +\r\n            `tracked market sessions are open. ` +\r\n            `Live change feed is still building global direction.`\r\n        );\r\n    }\r\n\r\n    async function getBrokerDensity(city) {\r\n        if (!city) return null;\r\n\r\n        try {\r\n            const url =\r\n                new URL(\r\n                    CITY_BROKERS_API\r\n                );\r\n\r\n            url.searchParams.set(\r\n                \"city\",\r\n                city\r\n            );\r\n\r\n            const response =\r\n                await fetch(\r\n                    url.toString(),\r\n                    {\r\n                        headers: {\r\n                            Accept:\r\n                                \"application\/json\"\r\n                        },\r\n                        cache:\r\n                            \"no-store\"\r\n                    }\r\n                );\r\n\r\n            if (!response.ok) {\r\n                return null;\r\n            }\r\n\r\n            const payload =\r\n                await response.json();\r\n\r\n            if (\r\n                payload?.status === \"ok\" &&\r\n                Array.isArray(\r\n                    payload.data\r\n                )\r\n            ) {\r\n                return payload.data.length;\r\n            }\r\n\r\n            return null;\r\n\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    async function checkEconomicShock(\r\n        doc,\r\n        city\r\n    ) {\r\n        const eventNode =\r\n            doc.querySelector(\r\n                \"[data-mx-event]\"\r\n            );\r\n\r\n        if (!eventNode) return;\r\n\r\n        if (!city) {\r\n            eventNode.textContent =\r\n                \"Monitoring\";\r\n            return;\r\n        }\r\n\r\n        try {\r\n            const url =\r\n                new URL(EVENTS_API);\r\n\r\n            url.searchParams.set(\r\n                \"city\",\r\n                city\r\n            );\r\n\r\n            const controller =\r\n                new AbortController();\r\n\r\n            const timeout =\r\n                setTimeout(\r\n                    () =>\r\n                        controller.abort(),\r\n                    3000\r\n                );\r\n\r\n            const response =\r\n                await fetch(\r\n                    url.toString(),\r\n                    {\r\n                        headers: {\r\n                            Accept:\r\n                                \"application\/json\"\r\n                        },\r\n                        cache:\r\n                            \"no-store\",\r\n                        signal:\r\n                            controller.signal\r\n                    }\r\n                );\r\n\r\n            clearTimeout(\r\n                timeout\r\n            );\r\n\r\n            if (!response.ok) {\r\n                eventNode.textContent =\r\n                    \"Monitoring\";\r\n                return;\r\n            }\r\n\r\n            const payload =\r\n                await response.json();\r\n\r\n            const event =\r\n                payload?.data?.[0] ||\r\n                payload?.events?.[0] ||\r\n                payload?.event ||\r\n                null;\r\n\r\n            if (!event) {\r\n                eventNode.textContent =\r\n                    \"No Major Event\";\r\n                return;\r\n            }\r\n\r\n            const eventTitle =\r\n                clean(\r\n                    event.title ||\r\n                    event.name ||\r\n                    event.event ||\r\n                    \"Market Event\"\r\n                );\r\n\r\n            eventNode.textContent =\r\n                eventTitle;\r\n\r\n            const shockKey =\r\n                city +\r\n                \"|\" +\r\n                eventTitle;\r\n\r\n            if (\r\n                shockKey !==\r\n                lastShockKey\r\n            ) {\r\n                lastShockKey =\r\n                    shockKey;\r\n\r\n                const ring =\r\n                    doc.getElementById(\r\n                        \"mx-market-shock-ring\"\r\n                    );\r\n\r\n                if (ring) {\r\n                    ring.classList.remove(\r\n                        \"active\"\r\n                    );\r\n\r\n                    void ring.offsetWidth;\r\n\r\n                    ring.classList.add(\r\n                        \"active\"\r\n                    );\r\n                }\r\n            }\r\n\r\n        } catch (e) {\r\n            eventNode.textContent =\r\n                \"Monitoring\";\r\n        }\r\n    }\r\n\r\n    async function updateIntelligence() {\r\n        const doc =\r\n            getDoc();\r\n\r\n        if (!doc) return;\r\n\r\n        ensureStyles(doc);\r\n\r\n        const overlay =\r\n            ensureOverlay(doc);\r\n\r\n        const strip =\r\n            ensureIntelStrip(doc);\r\n\r\n        if (\r\n            !overlay ||\r\n            !strip\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        const sessions =\r\n            getSessions(doc);\r\n\r\n        const city =\r\n            getSelectedCity(doc);\r\n\r\n        selectedCity =\r\n            city;\r\n\r\n        const heat =\r\n            computeMarketHeat(\r\n                sessions\r\n            );\r\n\r\n        overlay.dataset.bias =\r\n            heat.bias;\r\n\r\n        const heatNode =\r\n            strip.querySelector(\r\n                \"[data-mx-heat]\"\r\n            );\r\n\r\n        if (heatNode) {\r\n            heatNode.textContent =\r\n                heat.avg === null\r\n                    ? heat.label\r\n                    : (\r\n                        `${heat.label} ` +\r\n                        `${heat.avg > 0 ? \"+\" : \"\"}` +\r\n                        `${heat.avg.toFixed(2)}%`\r\n                    );\r\n        }\r\n\r\n        const insightNode =\r\n            strip.querySelector(\r\n                \"[data-mx-insight]\"\r\n            );\r\n\r\n        if (insightNode) {\r\n            insightNode.textContent =\r\n                buildInsight(\r\n                    sessions,\r\n                    heat,\r\n                    city\r\n                );\r\n        }\r\n\r\n        const densityNode =\r\n            strip.querySelector(\r\n                \"[data-mx-density]\"\r\n            );\r\n\r\n        if (densityNode) {\r\n            if (!city) {\r\n                densityNode.textContent =\r\n                    \"Select City\";\r\n            } else {\r\n                densityNode.textContent =\r\n                    \"Loading\u2026\";\r\n\r\n                const density =\r\n                    await getBrokerDensity(\r\n                        city\r\n                    );\r\n\r\n                if (\r\n                    city !==\r\n                    selectedCity\r\n                ) {\r\n                    return;\r\n                }\r\n\r\n                densityNode.textContent =\r\n                    density === null\r\n                        ? \"Feed Pending\"\r\n                        : (\r\n                            density +\r\n                            \" Ranked Brokers\"\r\n                        );\r\n            }\r\n        }\r\n\r\n        await checkEconomicShock(\r\n            doc,\r\n            city\r\n        );\r\n    }\r\n\r\n    function bindLayerVisibility(doc) {\r\n        const bar =\r\n            doc.getElementById(\r\n                \"mx-intelligence-layers\"\r\n            );\r\n\r\n        const overlay =\r\n            doc.getElementById(\r\n                \"mx-signature-overlay\"\r\n            );\r\n\r\n        if (\r\n            !bar ||\r\n            !overlay ||\r\n            bar.dataset.mxSignatureBound === \"1\"\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        bar.dataset.mxSignatureBound =\r\n            \"1\";\r\n\r\n        bar.addEventListener(\r\n            \"click\",\r\n            function (event) {\r\n                const button =\r\n                    event.target.closest(\r\n                        \"button[data-layer]\"\r\n                    );\r\n\r\n                if (!button) return;\r\n\r\n                const layer =\r\n                    button.dataset.layer ||\r\n                    \"markets\";\r\n\r\n                const flow =\r\n                    doc.getElementById(\r\n                        \"mx-capital-flow-svg\"\r\n                    );\r\n\r\n                const halo =\r\n                    overlay.querySelector(\r\n                        \".mx-heat-halo\"\r\n                    );\r\n\r\n                if (flow) {\r\n                    flow.style.opacity =\r\n                        layer === \"flow\"\r\n                            ? \".95\"\r\n                            : \".42\";\r\n                }\r\n\r\n                if (halo) {\r\n                    halo.style.opacity =\r\n                        (\r\n                            layer === \"markets\" ||\r\n                            layer === \"risk\"\r\n                        )\r\n                            ? \".48\"\r\n                            : \".20\";\r\n                }\r\n            }\r\n        );\r\n    }\r\n\r\n    function observeCity(doc) {\r\n        const cityNode =\r\n            doc.getElementById(\r\n                \"panel-market-name\"\r\n            );\r\n\r\n        if (\r\n            !cityNode ||\r\n            cityNode.dataset\r\n                .mxSignatureObserved ===\r\n                \"1\"\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        cityNode.dataset\r\n            .mxSignatureObserved =\r\n            \"1\";\r\n\r\n        const observer =\r\n            new MutationObserver(\r\n                () => {\r\n                    updateIntelligence();\r\n                }\r\n            );\r\n\r\n        observer.observe(\r\n            cityNode,\r\n            {\r\n                childList:\r\n                    true,\r\n                subtree:\r\n                    true,\r\n                characterData:\r\n                    true\r\n            }\r\n        );\r\n    }\r\n\r\n    function boot() {\r\n        const doc =\r\n            getDoc();\r\n\r\n        if (!doc) return;\r\n\r\n        ensureStyles(doc);\r\n        ensureOverlay(doc);\r\n        ensureIntelStrip(doc);\r\n        bindLayerVisibility(doc);\r\n        observeCity(doc);\r\n\r\n        updateIntelligence();\r\n\r\n        if (refreshTimer) {\r\n            clearInterval(\r\n                refreshTimer\r\n            );\r\n        }\r\n\r\n        \r\n        if (eventTimer) {\r\n            clearInterval(\r\n                eventTimer\r\n            );\r\n        }\r\n        \r\n\r\n    frame.addEventListener(\r\n        \"load\",\r\n        function () {\r\n            setTimeout(\r\n                boot,\r\n                650\r\n            );\r\n\r\n            setTimeout(\r\n                boot,\r\n                1600\r\n            );\r\n        }\r\n    );\r\n\r\n    window.addEventListener(\r\n        \"focus\",\r\n        updateIntelligence\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function getDoc() {\r\n        try {\r\n            return frame.contentDocument || frame.contentWindow?.document || null;\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    function installOnGlobeUI() {\r\n        const doc = getDoc();\r\n        if (!doc) return;\r\n\r\n        const section = doc.getElementById(\"globe-section\");\r\n        const globe = doc.getElementById(\"markunox-globe\");\r\n        if (!section || !globe) return;\r\n\r\n        \/* Remove the lower intelligence strip completely. *\/\r\n        const strip = doc.getElementById(\"mx-globe-intel-strip\");\r\n        if (strip) {\r\n            strip.style.setProperty(\"display\", \"none\", \"important\");\r\n        }\r\n\r\n        let style = doc.getElementById(\"mx-on-globe-intelligence-style\");\r\n\r\n        if (!style) {\r\n            style = doc.createElement(\"style\");\r\n            style.id = \"mx-on-globe-intelligence-style\";\r\n            (doc.head || doc.documentElement).appendChild(style);\r\n        }\r\n\r\n        style.textContent = `\r\n            \/* =========================================================\r\n               MARKUNOX INTELLIGENCE \u2014 ON THE GLOBE\r\n               No lower strip. Intelligence stays visually attached\r\n               to the sphere itself.\r\n            ========================================================= *\/\r\n\r\n            #mx-globe-intel-strip {\r\n                display: none !important;\r\n            }\r\n\r\n            #mx-signature-overlay {\r\n                position: absolute !important;\r\n                left: 50% !important;\r\n                top: 46% !important;\r\n                width: 590px !important;\r\n                height: 590px !important;\r\n                transform: translate(-50%, -50%) !important;\r\n                inset: auto !important;\r\n                z-index: 33 !important;\r\n                pointer-events: none !important;\r\n                overflow: visible !important;\r\n            }\r\n\r\n            #mx-signature-overlay .mx-heat-halo {\r\n                position: absolute !important;\r\n                left: 50% !important;\r\n                top: 50% !important;\r\n                width: 430px !important;\r\n                height: 430px !important;\r\n                transform: translate(-50%, -50%) !important;\r\n                border-radius: 50% !important;\r\n                opacity: .46 !important;\r\n                filter: blur(13px) !important;\r\n            }\r\n\r\n            #mx-capital-flow-svg {\r\n                position: absolute !important;\r\n                left: 50% !important;\r\n                top: 50% !important;\r\n                width: 520px !important;\r\n                height: 520px !important;\r\n                transform: translate(-50%, -50%) !important;\r\n                overflow: visible !important;\r\n                opacity: .88 !important;\r\n            }\r\n\r\n            #mx-market-shock-ring {\r\n                position: absolute !important;\r\n                left: 50% !important;\r\n                top: 50% !important;\r\n                width: 390px !important;\r\n                height: 390px !important;\r\n                transform: translate(-50%, -50%) !important;\r\n            }\r\n\r\n            #mx-on-globe-intel {\r\n                position: absolute;\r\n                inset: 0;\r\n                pointer-events: none;\r\n                z-index: 5;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-chip {\r\n                position: absolute;\r\n                min-width: 112px;\r\n                max-width: 180px;\r\n                padding: 7px 9px;\r\n                border: 1px solid rgba(99,229,227,.22);\r\n                border-radius: 8px;\r\n                background: rgba(5,10,18,.72);\r\n                backdrop-filter: blur(7px);\r\n                box-shadow:\r\n                    0 8px 24px rgba(0,0,0,.18),\r\n                    0 0 18px rgba(7,223,226,.035);\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-chip::after {\r\n                content: \"\";\r\n                position: absolute;\r\n                width: 22px;\r\n                height: 1px;\r\n                background:\r\n                    linear-gradient(\r\n                        90deg,\r\n                        rgba(7,223,226,.5),\r\n                        rgba(7,223,226,0)\r\n                    );\r\n                top: 50%;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-chip.left::after {\r\n                right: -22px;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-chip.right::after {\r\n                left: -22px;\r\n                transform: rotate(180deg);\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-label {\r\n                display: block;\r\n                color: #6d7d94;\r\n                font-size: 6px;\r\n                font-weight: 900;\r\n                letter-spacing: .8px;\r\n                text-transform: uppercase;\r\n                margin-bottom: 3px;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-value {\r\n                display: block;\r\n                color: #f6f9ff;\r\n                font-size: 8px;\r\n                font-weight: 900;\r\n                line-height: 1.3;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-value.cyan {\r\n                color: #69e8e6;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-value.green {\r\n                color: #61e2a2;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-heat {\r\n                left: 26px;\r\n                top: 120px;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-density {\r\n                right: 18px;\r\n                top: 128px;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-event {\r\n                right: 42px;\r\n                bottom: 128px;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-ai {\r\n                left: 36px;\r\n                bottom: 118px;\r\n                max-width: 205px;\r\n            }\r\n\r\n            #mx-on-globe-intel .mx-og-center-pulse {\r\n                position: absolute;\r\n                left: 50%;\r\n                top: 50%;\r\n                width: 18px;\r\n                height: 18px;\r\n                transform: translate(-50%, -50%);\r\n                border-radius: 50%;\r\n                border: 1px solid rgba(95,231,229,.64);\r\n                box-shadow:\r\n                    0 0 0 0 rgba(95,231,229,.35),\r\n                    0 0 18px rgba(95,231,229,.22);\r\n                animation: mxOnGlobePulse 2.3s ease-out infinite;\r\n            }\r\n\r\n            @keyframes mxOnGlobePulse {\r\n                0% {\r\n                    box-shadow:\r\n                        0 0 0 0 rgba(95,231,229,.34),\r\n                        0 0 15px rgba(95,231,229,.22);\r\n                }\r\n\r\n                70% {\r\n                    box-shadow:\r\n                        0 0 0 18px rgba(95,231,229,0),\r\n                        0 0 24px rgba(95,231,229,.10);\r\n                }\r\n\r\n                100% {\r\n                    box-shadow:\r\n                        0 0 0 20px rgba(95,231,229,0),\r\n                        0 0 24px rgba(95,231,229,0);\r\n                }\r\n            }\r\n\r\n            @media (max-width: 1180px) {\r\n                #mx-signature-overlay {\r\n                    width: 500px !important;\r\n                    height: 500px !important;\r\n                }\r\n\r\n                #mx-capital-flow-svg {\r\n                    width: 450px !important;\r\n                    height: 450px !important;\r\n                }\r\n\r\n                #mx-signature-overlay .mx-heat-halo {\r\n                    width: 370px !important;\r\n                    height: 370px !important;\r\n                }\r\n\r\n                #mx-on-globe-intel .mx-og-chip {\r\n                    transform: scale(.9);\r\n                }\r\n            }\r\n\r\n            @media (max-width: 900px) {\r\n                #mx-on-globe-intel .mx-og-chip {\r\n                    display: none !important;\r\n                }\r\n            }\r\n        `;\r\n\r\n        let ui = doc.getElementById(\"mx-on-globe-intel\");\r\n\r\n        if (!ui) {\r\n            ui = doc.createElement(\"div\");\r\n            ui.id = \"mx-on-globe-intel\";\r\n\r\n            ui.innerHTML = `\r\n                <div class=\"mx-og-chip mx-og-heat left\">\r\n                    <span class=\"mx-og-label\">Market Heat<\/span>\r\n                    <strong class=\"mx-og-value cyan\" data-og-heat>Neutral<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-og-chip mx-og-density right\">\r\n                    <span class=\"mx-og-label\">Broker Density<\/span>\r\n                    <strong class=\"mx-og-value\" data-og-density>Select City<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-og-chip mx-og-event right\">\r\n                    <span class=\"mx-og-label\">Event Shock<\/span>\r\n                    <strong class=\"mx-og-value green\" data-og-event>Monitoring<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-og-chip mx-og-ai left\">\r\n                    <span class=\"mx-og-label\">MARKUNOX AI Insight<\/span>\r\n                    <strong class=\"mx-og-value\" data-og-ai>Global market intelligence active.<\/strong>\r\n                <\/div>\r\n\r\n                <div class=\"mx-og-center-pulse\"><\/div>\r\n            `;\r\n\r\n            const overlay = doc.getElementById(\"mx-signature-overlay\");\r\n\r\n            if (overlay) {\r\n                overlay.appendChild(ui);\r\n            }\r\n        }\r\n\r\n        syncValues(doc);\r\n    }\r\n\r\n    function syncValues(doc) {\r\n        const oldStrip = doc.getElementById(\"mx-globe-intel-strip\");\r\n        const ui = doc.getElementById(\"mx-on-globe-intel\");\r\n        if (!ui) return;\r\n\r\n        const getOld = selector =>\r\n            oldStrip?.querySelector(selector)?.textContent?.trim() || \"\";\r\n\r\n        const heat =\r\n            getOld(\"[data-mx-heat]\") ||\r\n            \"Neutral\";\r\n\r\n        const density =\r\n            getOld(\"[data-mx-density]\") ||\r\n            \"Select City\";\r\n\r\n        const event =\r\n            getOld(\"[data-mx-event]\") ||\r\n            \"Monitoring\";\r\n\r\n        const insight =\r\n            getOld(\"[data-mx-insight]\") ||\r\n            \"Global market intelligence active.\";\r\n\r\n        const heatNode = ui.querySelector(\"[data-og-heat]\");\r\n        const densityNode = ui.querySelector(\"[data-og-density]\");\r\n        const eventNode = ui.querySelector(\"[data-og-event]\");\r\n        const aiNode = ui.querySelector(\"[data-og-ai]\");\r\n\r\n        if (heatNode) heatNode.textContent = heat;\r\n        if (densityNode) densityNode.textContent = density;\r\n        if (eventNode) eventNode.textContent = event;\r\n        if (aiNode) aiNode.textContent = insight;\r\n    }\r\n\r\n    function bindLiveSync(doc) {\r\n        const oldStrip = doc.getElementById(\"mx-globe-intel-strip\");\r\n\r\n        if (\r\n            !oldStrip ||\r\n            oldStrip.dataset.mxOnGlobeSync === \"1\"\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        oldStrip.dataset.mxOnGlobeSync = \"1\";\r\n\r\n        const observer =\r\n            new MutationObserver(\r\n                () => syncValues(doc)\r\n            );\r\n\r\n        observer.observe(\r\n            oldStrip,\r\n            {\r\n                childList: true,\r\n                subtree: true,\r\n                characterData: true\r\n            }\r\n        );\r\n    }\r\n\r\n    function boot() {\r\n        const doc = getDoc();\r\n        if (!doc) return;\r\n\r\n        installOnGlobeUI();\r\n        bindLiveSync(doc);\r\n\r\n        setTimeout(() => {\r\n            installOnGlobeUI();\r\n            bindLiveSync(doc);\r\n        }, 700);\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function () {\r\n        setTimeout(boot, 550);\r\n        setTimeout(boot, 1500);\r\n    });\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        boot,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n<script id=\"mx-stable-no-flicker\">\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    function getDoc() {\r\n        try {\r\n            return frame.contentDocument || frame.contentWindow?.document || null;\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    function installLegacyHideCSS(doc) {\r\n        if (!doc) return;\r\n\r\n        let style = doc.getElementById(\"mx-stable-legacy-hide\");\r\n\r\n        if (!style) {\r\n            style = doc.createElement(\"style\");\r\n            style.id = \"mx-stable-legacy-hide\";\r\n            (doc.head || doc.documentElement).appendChild(style);\r\n        }\r\n\r\n        \/*\r\n         * IMPORTANT:\r\n         * We HIDE old UI instead of deleting it.\r\n         * Some newer MARKUNOX features still read data from those nodes.\r\n         *\/\r\n        style.textContent = `\r\n            #mx-restored-live-snapshot,\r\n            #mx-safe-live-snapshot,\r\n            #mx-live-global-snapshot,\r\n            #mx-globe-intel-strip,\r\n            #mx-on-globe-intel .mx-og-density {\r\n                display: none !important;\r\n                opacity: 0 !important;\r\n                visibility: hidden !important;\r\n                pointer-events: none !important;\r\n            }\r\n        `;\r\n    }\r\n\r\n    function reveal() {\r\n        root.classList.add(\"mx-stable-ready\");\r\n    }\r\n\r\n    function prepareAndReveal() {\r\n        const doc = getDoc();\r\n\r\n        if (!doc) {\r\n            \/* Guaranteed reveal fallback: never leave the globe blank. *\/\r\n            setTimeout(reveal, 350);\r\n            return;\r\n        }\r\n\r\n        try {\r\n            installLegacyHideCSS(doc);\r\n\r\n            \/*\r\n             * Give any immediate legacy constructors one frame to run,\r\n             * then re-assert the hide CSS before showing the iframe.\r\n             *\/\r\n            requestAnimationFrame(function () {\r\n                try {\r\n                    installLegacyHideCSS(doc);\r\n                } catch (e) {}\r\n\r\n                requestAnimationFrame(function () {\r\n                    try {\r\n                        installLegacyHideCSS(doc);\r\n                    } catch (e) {}\r\n\r\n                    reveal();\r\n                });\r\n            });\r\n\r\n            \/*\r\n             * Some old scripts create their nodes on short timers.\r\n             * Re-asserting CSS is safe because it doesn't remove anything.\r\n             *\/\r\n            setTimeout(function () {\r\n                try { installLegacyHideCSS(doc); } catch (e) {}\r\n            }, 250);\r\n\r\n            setTimeout(function () {\r\n                try { installLegacyHideCSS(doc); } catch (e) {}\r\n            }, 700);\r\n\r\n            setTimeout(function () {\r\n                try { installLegacyHideCSS(doc); } catch (e) {}\r\n            }, 1500);\r\n\r\n        } catch (e) {\r\n            reveal();\r\n        }\r\n    }\r\n\r\n    frame.addEventListener(\"load\", function () {\r\n        root.classList.remove(\"mx-stable-ready\");\r\n        prepareAndReveal();\r\n\r\n        \/* Hard safety fallback regardless of any script error. *\/\r\n        setTimeout(reveal, 800);\r\n    });\r\n\r\n    if (frame.contentDocument?.readyState === \"complete\") {\r\n        prepareAndReveal();\r\n        setTimeout(reveal, 500);\r\n    } else {\r\n        \/* Never allow Elementor to remain blank if load fires oddly. *\/\r\n        setTimeout(reveal, 1600);\r\n    }\r\n})();\r\n<\/script>\r\n\r\n\r\n<!-- =========================================================\r\n     MARKUNOX - FIXED GLOBAL MARKET PULSE POSITION\r\n     Keeps the panel anchored in its original place during\r\n     broker search\/result\/profile open\/close.\r\n========================================================= -->\r\n\r\n\r\n\r\n<!-- =========================================================\r\n     MARKUNOX - GLOBAL MARKET PULSE HARD POSITION LOCK\r\n     Search\/results\/profile never move this panel.\r\n========================================================= -->\r\n\r\n\r\n<!-- =========================================================\r\n     MARKUNOX - GLOBAL MARKET PULSE FINAL POSITION LOCK\r\n     Keeps the panel in its original visual position.\r\n========================================================= -->\r\n\r\n\r\n<!-- =========================================================\r\n     MARKUNOX - SEARCH ATTACHED PANEL + LOWER GLOBAL PULSE\r\n========================================================= -->\r\n<style>\r\n\/*\r\n * Keep search results\/profile physically attached to the\r\n * right edge of the search bar, with only a small gap.\r\n *\/\r\n#mx-broker-globe .mx-search {\r\n    overflow: visible !important;\r\n}\r\n\r\n#mx-broker-globe .mx-results,\r\n#mx-broker-globe .mx-card {\r\n    position: absolute !important;\r\n\r\n    top: 0 !important;\r\n    left: calc(100% + 10px) !important;\r\n    right: auto !important;\r\n\r\n    width: 390px !important;\r\n    max-width: min(390px, calc(100vw - 340px)) !important;\r\n\r\n    margin: 0 !important;\r\n\r\n    z-index: 12060 !important;\r\n}\r\n\r\n\/* Results stay slightly above profile card when both states transition. *\/\r\n#mx-broker-globe .mx-results {\r\n    z-index: 12070 !important;\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n    #mx-broker-globe .mx-results,\r\n    #mx-broker-globe .mx-card {\r\n        left: calc(100% + 8px) !important;\r\n\r\n        width: 350px !important;\r\n        max-width: min(350px, calc(100vw - 315px)) !important;\r\n    }\r\n}\r\n\r\n\/*\r\n * On phones there isn't enough horizontal room, so keep the\r\n * safe stacked layout.\r\n *\/\r\n@media (max-width: 767px) {\r\n    #mx-broker-globe .mx-results,\r\n    #mx-broker-globe .mx-card {\r\n        position: relative !important;\r\n\r\n        top: auto !important;\r\n        left: auto !important;\r\n        right: auto !important;\r\n\r\n        width: 100% !important;\r\n        max-width: none !important;\r\n\r\n        margin-top: 10px !important;\r\n    }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n    \"use strict\";\r\n\r\n    const root = document.getElementById(\"mx-broker-globe\");\r\n    if (!root) return;\r\n\r\n    const frame = root.querySelector(\"iframe\");\r\n    if (!frame) return;\r\n\r\n    let panelObserver = null;\r\n    let raf = 0;\r\n\r\n    function applyPulseLock() {\r\n        try {\r\n            const doc =\r\n                frame.contentDocument ||\r\n                frame.contentWindow?.document;\r\n\r\n            if (!doc) return;\r\n\r\n            const section =\r\n                doc.getElementById(\"globe-section\");\r\n\r\n            const panel =\r\n                doc.getElementById(\"mx-layer-intelligence-panel\");\r\n\r\n            if (!section || !panel) return;\r\n\r\n            let style =\r\n                doc.getElementById(\"mx-pulse-final-lock-v5\");\r\n\r\n            if (!style) {\r\n                style = doc.createElement(\"style\");\r\n                style.id = \"mx-pulse-final-lock-v5\";\r\n\r\n                style.textContent = `\r\n                    #globe-section {\r\n                        position: relative !important;\r\n                    }\r\n\r\n                    #globe-section #mx-layer-intelligence-panel {\r\n                        position: absolute !important;\r\n\r\n                        left: 30px !important;\r\n                        right: auto !important;\r\n\r\n                        \/* Lower than the previous version *\/\r\n                        top: 255px !important;\r\n                        bottom: auto !important;\r\n\r\n                        width: 420px !important;\r\n                        max-width: 420px !important;\r\n\r\n                        height: auto !important;\r\n                        max-height: 245px !important;\r\n\r\n                        margin: 0 !important;\r\n                        transform: none !important;\r\n\r\n                        overflow-y: auto !important;\r\n                        overflow-x: hidden !important;\r\n\r\n                        opacity: 1 !important;\r\n                        visibility: visible !important;\r\n\r\n                        z-index: 92 !important;\r\n\r\n                        scrollbar-width: none !important;\r\n                        -ms-overflow-style: none !important;\r\n                    }\r\n\r\n                    #globe-section #mx-layer-intelligence-panel::-webkit-scrollbar {\r\n                        display: none !important;\r\n                        width: 0 !important;\r\n                        height: 0 !important;\r\n                    }\r\n\r\n                    @media (max-width: 1024px) {\r\n                        #globe-section #mx-layer-intelligence-panel {\r\n                            left: 20px !important;\r\n                            top: 245px !important;\r\n\r\n                            width: 390px !important;\r\n                            max-width: calc(100% - 40px) !important;\r\n\r\n                            max-height: 235px !important;\r\n                        }\r\n                    }\r\n\r\n                    @media (max-width: 767px) {\r\n                        #globe-section #mx-layer-intelligence-panel {\r\n                            left: 16px !important;\r\n                            top: 235px !important;\r\n\r\n                            width: calc(100% - 32px) !important;\r\n                            max-width: none !important;\r\n\r\n                            max-height: 220px !important;\r\n                        }\r\n                    }\r\n                `;\r\n\r\n                (doc.head || doc.documentElement)\r\n                    .appendChild(style);\r\n            }\r\n\r\n            const width = window.innerWidth;\r\n\r\n            const left =\r\n                width <= 767\r\n                    ? \"16px\"\r\n                    : (\r\n                        width <= 1024\r\n                            ? \"20px\"\r\n                            : \"30px\"\r\n                    );\r\n\r\n            const top =\r\n                width <= 767\r\n                    ? \"235px\"\r\n                    : (\r\n                        width <= 1024\r\n                            ? \"245px\"\r\n                            : \"255px\"\r\n                    );\r\n\r\n            const maxHeight =\r\n                width <= 767\r\n                    ? \"220px\"\r\n                    : (\r\n                        width <= 1024\r\n                            ? \"235px\"\r\n                            : \"245px\"\r\n                    );\r\n\r\n            const values = {\r\n                position: \"absolute\",\r\n                left: left,\r\n                right: \"auto\",\r\n                top: top,\r\n                bottom: \"auto\",\r\n                width:\r\n                    width <= 767\r\n                        ? \"calc(100% - 32px)\"\r\n                        : (\r\n                            width <= 1024\r\n                                ? \"390px\"\r\n                                : \"420px\"\r\n                        ),\r\n                \"max-width\":\r\n                    width <= 767\r\n                        ? \"none\"\r\n                        : (\r\n                            width <= 1024\r\n                                ? \"calc(100% - 40px)\"\r\n                                : \"420px\"\r\n                        ),\r\n                height: \"auto\",\r\n                \"max-height\": maxHeight,\r\n                margin: \"0\",\r\n                transform: \"none\",\r\n                \"overflow-y\": \"auto\",\r\n                \"overflow-x\": \"hidden\",\r\n                opacity: \"1\",\r\n                visibility: \"visible\",\r\n                \"z-index\": \"92\"\r\n            };\r\n\r\n            Object.keys(values).forEach(function (prop) {\r\n                panel.style.setProperty(\r\n                    prop,\r\n                    values[prop],\r\n                    \"important\"\r\n                );\r\n            });\r\n\r\n            if (!panelObserver) {\r\n                panelObserver =\r\n                    new MutationObserver(function () {\r\n                        cancelAnimationFrame(raf);\r\n\r\n                        raf =\r\n                            requestAnimationFrame(\r\n                                applyPulseLock\r\n                            );\r\n                    });\r\n\r\n                panelObserver.observe(\r\n                    panel,\r\n                    {\r\n                        attributes: true,\r\n                        attributeFilter: [\"style\", \"class\"]\r\n                    }\r\n                );\r\n            }\r\n\r\n        } catch (e) {}\r\n    }\r\n\r\n    function boot() {\r\n        applyPulseLock();\r\n\r\n        [80, 220, 500, 900, 1500].forEach(function (ms) {\r\n            setTimeout(applyPulseLock, ms);\r\n        });\r\n    }\r\n\r\n    frame.addEventListener(\"load\", boot);\r\n\r\n    window.addEventListener(\r\n        \"resize\",\r\n        applyPulseLock,\r\n        { passive: true }\r\n    );\r\n\r\n    if (\r\n        frame.contentDocument?.readyState ===\r\n        \"complete\"\r\n    ) {\r\n        boot();\r\n    }\r\n    \r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<section class=\"elementor-element elementor-element-1312814 e-con e-atomic-element e-flexbox-base e-default-section e-a6111dc \" data-id=\"1312814\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"1312814\" data-e-type=\"e-flexbox\" data-id=\"1312814\">\n    <div class=\"elementor-element elementor-element-13f04c5 e-con-full e-flex e-con e-parent\" data-id=\"13f04c5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3420f06 e-con-full e-flex e-con e-child\" data-id=\"3420f06\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1138a92 elementor-widget elementor-widget-heading\" data-id=\"1138a92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">MARKUNOX Ranking<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3b73745 elementor-widget elementor-widget-text-editor\" data-id=\"3b73745\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Global Broker &amp; Exchange Intelligence<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1d47bd2 elementor-widget elementor-widget-html\" data-id=\"1d47bd2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"mx-ranking-app\">\n\n    <!-- =====================================================\n         RANKING TABS\n    ====================================================== -->\n\n    <div class=\"mx-rank-tabs\">\n\n        <button type=\"button\" data-mode=\"overall\" class=\"active\">\n            \ud83c\udfc6 MARKUNOX Ranking\n        <\/button>\n\n        <button type=\"button\" data-mode=\"brand\">\n            \u2605 Brand Ranking\n        <\/button>\n\n        <button type=\"button\" data-mode=\"popular\">\n            \u2668 Popular Ranking\n        <\/button>\n\n        <button type=\"button\" data-mode=\"trading\">\n            \u25a5 Trading ENV\n        <\/button>\n\n        <button type=\"button\" data-mode=\"scam\">\n            \u2620 Scam Broker\n        <\/button>\n\n    <\/div>\n\n\n    <!-- =====================================================\n         TOOLBAR\n    ====================================================== -->\n\n    <div class=\"mx-rank-toolbar\">\n\n        <div class=\"mx-category-custom\">\n            <select id=\"mx-rank-category\" aria-hidden=\"true\" tabindex=\"-1\">\n                <option value=\"all\">All Categories<\/option>\n            <\/select>\n\n            <button\n                type=\"button\"\n                id=\"mx-category-button\"\n                class=\"mx-category-button\"\n                aria-haspopup=\"listbox\"\n                aria-expanded=\"false\"\n            >\n                <span id=\"mx-category-label\">All Categories<\/span>\n                <span class=\"mx-category-chevron\">\u2304<\/span>\n            <\/button>\n\n            <div\n                id=\"mx-category-menu\"\n                class=\"mx-category-menu\"\n                role=\"listbox\"\n            ><\/div>\n        <\/div>\n\n        <div id=\"mx-last-update\" class=\"mx-last-update\">\n            Last Update: LIVE\n        <\/div>\n\n        <button\n            type=\"button\"\n            id=\"mx-filter-toggle\"\n            class=\"mx-filter-button\"\n        >\n            \u26b2 Filter\n        <\/button>\n\n    <\/div>\n\n\n    <!-- =====================================================\n         FILTER PANEL\n    ====================================================== -->\n\n    <div id=\"mx-filter-panel\" class=\"mx-filter-panel\">\n\n        <div class=\"mx-filter-grid\">\n\n            <label>\n                <span>Search Broker<\/span>\n\n                <input\n                    id=\"mx-filter-search\"\n                    type=\"text\"\n                    placeholder=\"Broker name...\"\n                    autocomplete=\"off\"\n                >\n            <\/label>\n\n\n            <label>\n                <span>Country<\/span>\n\n                <div class=\"mx-custom-select\" data-select-id=\"mx-filter-country\">\n                    <select id=\"mx-filter-country\" class=\"mx-native-hidden-select\" aria-hidden=\"true\" tabindex=\"-1\">\n                        <option value=\"\">All Countries<\/option>\n                    <\/select>\n\n                    <button type=\"button\" class=\"mx-custom-select-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"mx-custom-select-label\">All Countries<\/span>\n                        <span class=\"mx-custom-select-chevron\">\u2304<\/span>\n                    <\/button>\n\n                    <div class=\"mx-custom-select-menu\" role=\"listbox\"><\/div>\n                <\/div>\n            <\/label>\n\n\n            <label>\n                <span>Minimum Score<\/span>\n\n                <div class=\"mx-custom-select\" data-select-id=\"mx-filter-score\">\n                    <select id=\"mx-filter-score\" class=\"mx-native-hidden-select\" aria-hidden=\"true\" tabindex=\"-1\">\n                        <option value=\"\">Any Score<\/option>\n                        <option value=\"5\">5.0+<\/option>\n                        <option value=\"6\">6.0+<\/option>\n                        <option value=\"7\">7.0+<\/option>\n                        <option value=\"8\">8.0+<\/option>\n                        <option value=\"9\">9.0+<\/option>\n                    <\/select>\n\n                    <button type=\"button\" class=\"mx-custom-select-button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                        <span class=\"mx-custom-select-label\">Any Score<\/span>\n                        <span class=\"mx-custom-select-chevron\">\u2304<\/span>\n                    <\/button>\n\n                    <div class=\"mx-custom-select-menu\" role=\"listbox\"><\/div>\n                <\/div>\n            <\/label>\n\n\n            <label class=\"mx-check\">\n\n                <input\n                    id=\"mx-filter-verified\"\n                    type=\"checkbox\"\n                >\n\n                <span class=\"mx-check-box\" aria-hidden=\"true\"><\/span>\n\n                <span class=\"mx-check-label\">\n                    Verified Only\n                <\/span>\n\n            <\/label>\n\n\n            <label class=\"mx-check\">\n\n                <input\n                    id=\"mx-filter-islamic\"\n                    type=\"checkbox\"\n                >\n\n                <span class=\"mx-check-box\" aria-hidden=\"true\"><\/span>\n\n                <span class=\"mx-check-label\">\n                    Islamic Account\n                <\/span>\n\n            <\/label>\n\n        <\/div>\n\n\n        <div class=\"mx-filter-actions\">\n\n            <button\n                type=\"button\"\n                id=\"mx-filter-reset\"\n            >\n                Reset\n            <\/button>\n\n            <button\n                type=\"button\"\n                id=\"mx-filter-apply\"\n                class=\"primary\"\n            >\n                Apply Filters\n            <\/button>\n\n        <\/div>\n\n    <\/div>\n\n\n    <!-- =====================================================\n         COLUMN HEADER\n    ====================================================== -->\n\n    <div class=\"mx-ranking-header\">\n\n        <div>RANK<\/div>\n\n        <div>Broker<\/div>\n\n        <div>Score<\/div>\n\n        <div>Regulation<\/div>\n\n        <div>Trading ENV<\/div>\n\n        <div>Popularity<\/div>\n\n        <div>Action<\/div>\n\n    <\/div>\n\n\n    <!-- =====================================================\n         DYNAMIC ROWS\n    ====================================================== -->\n\n    <div id=\"mx-ranking-rows\">\n\n        <div class=\"mx-ranking-state\">\n            Loading MARKUNOX Ranking...\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n\n<script>\n(function () {\n\n    \"use strict\";\n\n\n    \/* =====================================================\n       CONFIG\n    ====================================================== *\/\n\n    const API =\n        \"https:\/\/api.markunox.com\/ranking.php\";\n\n\n    const CLIENT_CACHE_TTL = 5 * 60 * 1000;\n\n    const PERSISTENT_CACHE_TTL = 24 * 60 * 60 * 1000;\n\n    const PERSISTENT_CACHE_PREFIX =\n        \"markunox_ranking_v21_\";\n\n    const responseCache = new Map();\n\n    let requestSequence = 0;\n\n    let enrichmentSequence = 0;\n\n    const DETAIL_CACHE_TTL = 24 * 60 * 60 * 1000;\n\n    const DETAIL_CACHE_PREFIX =\n        \"markunox_ranking_detail_v21_\";\n\n    const detailMemoryCache = new Map();\n\n    const canonicalBrokerMemory = new Map();\n\n    const detailInflight = new Map();\n\n\n    const app =\n        document.getElementById(\n            \"mx-ranking-app\"\n        );\n\n\n    if (!app) {\n        return;\n    }\n\n\n    const rows =\n        document.getElementById(\n            \"mx-ranking-rows\"\n        );\n\n\n    const categorySelect =\n        document.getElementById(\n            \"mx-rank-category\"\n        );\n\n\n    const categoryButton =\n        document.getElementById(\n            \"mx-category-button\"\n        );\n\n\n    const categoryLabel =\n        document.getElementById(\n            \"mx-category-label\"\n        );\n\n\n    const categoryMenu =\n        document.getElementById(\n            \"mx-category-menu\"\n        );\n\n\n    const countrySelect =\n        document.getElementById(\n            \"mx-filter-country\"\n        );\n\n\n    const searchInput =\n        document.getElementById(\n            \"mx-filter-search\"\n        );\n\n\n    const scoreSelect =\n        document.getElementById(\n            \"mx-filter-score\"\n        );\n\n\n    const verifiedInput =\n        document.getElementById(\n            \"mx-filter-verified\"\n        );\n\n\n    const islamicInput =\n        document.getElementById(\n            \"mx-filter-islamic\"\n        );\n\n\n    const filterPanel =\n        document.getElementById(\n            \"mx-filter-panel\"\n        );\n\n\n    const filterToggle =\n        document.getElementById(\n            \"mx-filter-toggle\"\n        );\n\n\n    const lastUpdate =\n        document.getElementById(\n            \"mx-last-update\"\n        );\n\n\n    let controller = null;\n\n\n    const state = {\n\n        mode: \"overall\",\n\n        category: \"all\",\n\n        country: \"\",\n\n        q: \"\",\n\n        verified: false,\n\n        islamic: false,\n\n        minScore: \"\"\n\n    };\n\n\n    \/* =====================================================\n       SAFE HTML\n    ====================================================== *\/\n\n    function escapeHtml(value) {\n\n        const div =\n            document.createElement(\"div\");\n\n\n        div.textContent =\n            value === null ||\n            value === undefined\n                ? \"\"\n                : String(value);\n\n\n        return div.innerHTML;\n    }\n\n\n    \/* =====================================================\n       NUMBER\n    ====================================================== *\/\n\n    function getNumber(value) {\n\n        if (\n            value === null ||\n            value === undefined ||\n            value === \"\"\n        ) {\n            return null;\n        }\n\n\n        const number =\n            Number(value);\n\n\n        return Number.isFinite(number)\n            ? number\n            : null;\n    }\n\n\n    function formatScore(value) {\n\n        const number =\n            getNumber(value);\n\n\n        return number === null\n            ? \"\u2014\"\n            : number.toFixed(2);\n    }\n\n\n    \/* =====================================================\n       STARS\n    ====================================================== *\/\n\n    function renderStars(value) {\n\n        const number =\n            getNumber(value);\n\n\n        if (number === null) {\n            return \"\";\n        }\n\n\n        const filled =\n            Math.max(\n                0,\n                Math.min(\n                    5,\n                    Math.round(\n                        number \/ 2\n                    )\n                )\n            );\n\n\n        return (\n            \"\u2605\".repeat(filled) +\n            \"\u2606\".repeat(\n                5 - filled\n            )\n        );\n    }\n\n\n    \/* =====================================================\n       RANK COLORS\n    ====================================================== *\/\n\n    function rankClass(rank) {\n\n        if (rank === 1) {\n            return \"gold\";\n        }\n\n\n        if (rank === 2) {\n            return \"silver\";\n        }\n\n\n        if (rank === 3) {\n            return \"bronze\";\n        }\n\n\n        return \"\";\n    }\n\n\n    \/* =====================================================\n       TRADING LABEL\n    ====================================================== *\/\n\n    function tradingLabel(value) {\n\n        const number =\n            getNumber(value);\n\n\n        if (number === null) {\n            return \"N\/A\";\n        }\n\n\n        if (number >= 8) {\n            return \"Excellent\";\n        }\n\n\n        if (number >= 6.5) {\n            return \"Good\";\n        }\n\n\n        if (number >= 5) {\n            return \"Average\";\n        }\n\n\n        return \"Weak\";\n    }\n\n\n    \/* =====================================================\n       POPULARITY LABEL\n    ====================================================== *\/\n\n    function popularityLabel(value) {\n\n        const number =\n            getNumber(value);\n\n\n        if (number === null) {\n            return \"N\/A\";\n        }\n\n\n        if (number >= 8) {\n            return \"Very High\";\n        }\n\n\n        if (number >= 6) {\n            return \"High\";\n        }\n\n\n        if (number >= 4) {\n            return \"Medium\";\n        }\n\n\n        return \"Low\";\n    }\n\n\n    \/* =====================================================\n       METRIC BAR\n    ====================================================== *\/\n\n    function renderMeter(\n        value,\n        type\n    ) {\n\n        const number =\n            getNumber(value);\n\n\n        if (number === null) {\n\n            return `\n                <div class=\"mx-meter ${type}\">\n                    <span style=\"width:0%\"><\/span>\n                <\/div>\n            `;\n        }\n\n\n        const width =\n            Math.max(\n                0,\n                Math.min(\n                    100,\n                    number * 10\n                )\n            );\n\n\n        return `\n            <div class=\"mx-meter ${type}\">\n                <span style=\"width:${width}%\"><\/span>\n            <\/div>\n        `;\n    }\n\n\n    \/* =====================================================\n       SOURCE-NATIVE METRICS\n    ====================================================== *\/\n\n    function getSourceNative(broker) {\n\n        const native =\n            broker &&\n            broker.source_native &&\n            typeof broker.source_native === \"object\"\n                ? broker.source_native\n                : {};\n\n        const legacy =\n            broker &&\n            broker.source_metrics &&\n            typeof broker.source_metrics === \"object\"\n                ? broker.source_metrics\n                : {};\n\n        function firstNumber(values) {\n\n            for (const value of values) {\n\n                const number =\n                    getNumber(value);\n\n                if (number !== null) {\n                    return number;\n                }\n            }\n\n            return null;\n        }\n\n        function firstText(values) {\n\n            for (const value of values) {\n\n                const clean =\n                    String(\n                        value === null ||\n                        value === undefined\n                            ? \"\"\n                            : value\n                    )\n                        .trim()\n                        .toUpperCase();\n\n                if (clean) {\n                    return clean;\n                }\n            }\n\n            return \"\";\n        }\n\n        const ratingIndex =\n            firstNumber([\n                native.rating_index,\n                native.wikifx_score,\n                native.wikifx_rating_score,\n                broker.wikifx_score,\n                broker.wikifx_rating_score,\n                broker.rating_index,\n                legacy.rating_index,\n                legacy.wikifx_score,\n                legacy.wikifx_rating_score,\n                broker.display_score,\n                broker.score,\n                broker.markunox_score\n            ]);\n\n        const influenceIndex =\n            firstNumber([\n                native.influence_index,\n                native.wikifx_influence_index,\n                broker.wikifx_influence_index,\n                broker.influence_index,\n                legacy.influence_index,\n                legacy.wikifx_influence_index,\n                broker.popularity_score\n            ]);\n\n        let licenseCount =\n            firstNumber([\n                native.license_count,\n                native.wikifx_license_count,\n                broker.wikifx_license_count,\n                broker.license_count,\n                legacy.license_count,\n                legacy.wikifx_license_count\n            ]);\n\n        if (\n            licenseCount === null &&\n            Array.isArray(native.license_details) &&\n            native.license_details.length\n        ) {\n            licenseCount =\n                native.license_details.length;\n        }\n\n        if (\n            licenseCount === null &&\n            Array.isArray(broker.licenses) &&\n            broker.licenses.length\n        ) {\n            licenseCount =\n                broker.licenses.length;\n        }\n\n        if (licenseCount === null) {\n\n            const regulatorList =\n                String(\n                    broker &&\n                    broker.regulators\n                        ? broker.regulators\n                        : \"\"\n                )\n                    .split(\"\/\")\n                    .map(function (item) {\n                        return item.trim();\n                    })\n                    .filter(Boolean);\n\n            if (regulatorList.length) {\n                licenseCount =\n                    regulatorList.length;\n            }\n        }\n\n        const tradingGrade =\n            firstText([\n                native.trading_environment_grade,\n                native.trading_grade,\n                native.wikifx_trading_grade,\n                broker.wikifx_trading_grade,\n                broker.trading_environment_grade,\n                broker.trading_grade,\n                legacy.trading_environment_grade,\n                legacy.trading_grade,\n                legacy.wikifx_trading_grade\n            ]);\n\n        const influenceGrade =\n            firstText([\n                native.influence_grade,\n                native.wikifx_influence_grade,\n                broker.wikifx_influence_grade,\n                broker.influence_grade,\n                legacy.influence_grade,\n                legacy.wikifx_influence_grade\n            ]);\n\n        return {\n            ratingIndex,\n            influenceIndex,\n            licenseCount,\n            tradingGrade,\n            influenceGrade\n        };\n    }\n\n\n    function getNativeDetails(broker) {\n\n        const native =\n            broker &&\n            broker.source_native &&\n            typeof broker.source_native === \"object\"\n                ? broker.source_native\n                : {};\n\n\n        const source =\n            getSourceNative(broker);\n\n\n        return {\n            ...source,\n\n            companyName:\n                String(native.company_name || \"\").trim(),\n\n            registeredRegion:\n                String(native.registered_region || \"\").trim(),\n\n            establishedYear:\n                String(native.established_year || \"\").trim(),\n\n            operatingPeriod:\n                String(native.operating_period || \"\").trim(),\n\n            companyWebsite:\n                String(native.company_website || \"\").trim(),\n\n            contactEmail:\n                String(native.contact_email || \"\").trim(),\n\n            contactPhone:\n                String(native.contact_phone || \"\").trim(),\n\n            companyAddress:\n                String(native.company_address || \"\").trim(),\n\n            minimumDeposit:\n                String(native.minimum_deposit || \"\").trim(),\n\n            maximumLeverage:\n                String(native.maximum_leverage || \"\").trim(),\n\n            accountNames:\n                Array.isArray(native.account_names)\n                    ? native.account_names.filter(Boolean)\n                    : [],\n\n            tradingPlatforms:\n                Array.isArray(native.trading_platforms)\n                    ? native.trading_platforms.filter(Boolean)\n                    : [],\n\n            fundingMethods:\n                Array.isArray(native.funding_methods)\n                    ? native.funding_methods.filter(Boolean)\n                    : [],\n\n            regulatorCountries:\n                Array.isArray(native.regulator_countries)\n                    ? native.regulator_countries.filter(Boolean)\n                    : [],\n\n            executionSpeed:\n                getNumber(native.execution_speed_ms),\n\n            mt4Servers:\n                getNumber(native.mt4_servers),\n\n            mt5Servers:\n                getNumber(native.mt5_servers),\n\n            signals:\n                Array.isArray(native.signals)\n                    ? native.signals.filter(Boolean)\n                    : [],\n\n            sourceUrl:\n                String(native.source_url || \"\").trim(),\n\n            observedAt:\n                String(native.observed_at || \"\").trim()\n        };\n    }\n\n\n    function detailValue(value) {\n\n        const cleaned =\n            String(value || \"\").trim();\n\n        return cleaned !== \"\"\n            ? escapeHtml(cleaned)\n            : \"N\/A\";\n    }\n\n\n    function detailList(items) {\n\n        if (!Array.isArray(items) || !items.length) {\n            return \"N\/A\";\n        }\n\n        return items\n            .map(function (item) {\n                return escapeHtml(String(item));\n            })\n            .join(\", \");\n    }\n\n\n    function formatLicenseCount(value) {\n\n        const number =\n            getNumber(value);\n\n\n        if (number === null) {\n            return \"\u2014\";\n        }\n\n\n        const count =\n            Math.max(0, Math.round(number));\n\n\n        return `${count} LIC`;\n    }\n\n\n    function sourceGradeLabel(grade) {\n\n        const value =\n            String(grade || \"\")\n                .trim()\n                .toUpperCase();\n\n\n        return value\n            ? `Grade ${escapeHtml(value)}`\n            : \"N\/A\";\n    }\n\n\n    \/* =====================================================\n       BROKER FEATURES\n    ====================================================== *\/\n\n    function brokerFeatures(broker) {\n\n        const raw = [];\n\n\n        if (\n            broker.has_islamic_account\n        ) {\n\n            raw.push(\n                \"Islamic\"\n            );\n        }\n\n\n        if (broker.broker_type) {\n\n            raw.push(\n                String(\n                    broker.broker_type\n                )\n            );\n        }\n\n\n        if (broker.instruments) {\n\n            String(\n                broker.instruments\n            )\n                .split(\",\")\n                .forEach(function (item) {\n\n                    const clean =\n                        item.trim();\n\n\n                    if (clean) {\n\n                        raw.push(\n                            clean\n                                .charAt(0)\n                                .toUpperCase() +\n                            clean.slice(1)\n                        );\n                    }\n\n                });\n        }\n\n\n        \/*\n         * REMOVE DUPLICATES\n         *\/\n\n        const seen =\n            new Set();\n\n\n        const unique =\n            raw.filter(function (item) {\n\n                const key =\n                    item.toLowerCase();\n\n\n                if (seen.has(key)) {\n                    return false;\n                }\n\n\n                seen.add(key);\n\n                return true;\n            });\n\n\n        return unique\n            .slice(0, 3)\n            .map(function (item) {\n\n                return `\n                    <span>\n                        ${escapeHtml(item)}\n                    <\/span>\n                `;\n\n            })\n            .join(\"\");\n    }\n\n    \/* =====================================================\n       REGULATORS\n       Exactly 4 visible slots. Real names only; missing data\n       stays as an empty placeholder until the importer fills it.\n    ====================================================== *\/\n\n    function renderRegulators(value) {\n\n        const regulators = value\n            ? String(value)\n                .split(\/\\s*\\\/\\s*\/)\n                .map(function (item) {\n                    return item.trim();\n                })\n                .filter(Boolean)\n                .slice(0, 4)\n            : [];\n\n        while (regulators.length < 4) {\n            regulators.push(\"\");\n        }\n\n        return regulators\n            .map(function (item) {\n\n                if (!item) {\n                    return `\n                        <span class=\"mx-regulator-chip mx-regulator-placeholder\">\n                            \u2014\n                        <\/span>\n                    `;\n                }\n\n                return `\n                    <span class=\"mx-regulator-chip\">\n                        ${escapeHtml(item)}\n                    <\/span>\n                `;\n\n            })\n            .join(\"\");\n    }\n\n\n    \/* =====================================================\n       CUSTOM CATEGORY MENU\n    ====================================================== *\/\n\n    function categoryText(value) {\n\n        if (!value || value === \"all\") {\n            return \"All Categories\";\n        }\n\n        return String(value)\n            .charAt(0)\n            .toUpperCase() +\n            String(value)\n                .slice(1);\n    }\n\n\n    function refreshCategoryMenu() {\n\n        if (\n            !categoryMenu ||\n            !categoryButton ||\n            !categoryLabel\n        ) {\n            return;\n        }\n\n        const options =\n            Array.from(\n                categorySelect.options\n            );\n\n        categoryMenu.innerHTML =\n            options\n                .map(function (option) {\n\n                    const selected =\n                        option.value ===\n                        categorySelect.value;\n\n                    return `\n                        <button\n                            type=\"button\"\n                            class=\"mx-category-option${selected ? \" active\" : \"\"}\"\n                            data-value=\"${escapeHtml(option.value)}\"\n                            role=\"option\"\n                            aria-selected=\"${selected ? \"true\" : \"false\"}\"\n                        >\n                            ${escapeHtml(option.textContent || categoryText(option.value))}\n                        <\/button>\n                    `;\n                })\n                .join(\"\");\n\n        categoryLabel.textContent =\n            categoryText(\n                categorySelect.value\n            );\n    }\n\n\n    function closeCategoryMenu() {\n\n        if (\n            !categoryMenu ||\n            !categoryButton\n        ) {\n            return;\n        }\n\n        categoryMenu.classList.remove(\n            \"open\"\n        );\n\n        categoryButton.setAttribute(\n            \"aria-expanded\",\n            \"false\"\n        );\n    }\n\n\n    \/* =====================================================\n       META\n    ====================================================== *\/\n\n    function populateMeta(meta) {\n\n        if (!meta) {\n            return;\n        }\n\n\n        \/*\n         * CATEGORY\n         *\/\n\n        if (\n            Array.isArray(\n                meta.categories\n            )\n        ) {\n\n            const current =\n                categorySelect.value;\n\n\n            categorySelect.innerHTML =\n                `\n                <option value=\"all\">\n                    All Categories\n                <\/option>\n                ` +\n\n                meta.categories\n                    .map(function (category) {\n\n                        const value =\n                            escapeHtml(\n                                category\n                            );\n\n\n                        const text =\n                            String(category)\n                                .charAt(0)\n                                .toUpperCase() +\n\n                            String(category)\n                                .slice(1);\n\n\n                        return `\n                            <option value=\"${value}\">\n                                ${escapeHtml(text)}\n                            <\/option>\n                        `;\n\n                    })\n                    .join(\"\");\n\n\n            categorySelect.value =\n                current || \"all\";\n        }\n\n\n        \/*\n         * COUNTRY\n         *\/\n\n        if (\n            Array.isArray(\n                meta.countries\n            )\n        ) {\n\n            const current =\n                countrySelect.value;\n\n\n            countrySelect.innerHTML =\n                `\n                <option value=\"\">\n                    All Countries\n                <\/option>\n                ` +\n\n                meta.countries\n                    .map(function (country) {\n\n                        const value =\n                            escapeHtml(\n                                country\n                            );\n\n\n                        return `\n                            <option value=\"${value}\">\n                                ${value}\n                            <\/option>\n                        `;\n\n                    })\n                    .join(\"\");\n\n\n            countrySelect.value =\n                current || \"\";\n        }\n\n\n        refreshCategoryMenu();\n\n        if (\n            typeof customSelectControllers !== \"undefined\"\n        ) {\n            customSelectControllers\n                .forEach(function (instance) {\n                    instance.refresh();\n                });\n        }\n\n    }\n\n\n   \/* =====================================================\n   BROKER LOGO + NAME + VERIFIED\n===================================================== *\/\n\nfunction renderBrokerIdentity(\n    broker,\n    brokerName\n) {\n\n    return `\n        <div class=\"mx-broker-layout\">\n\n            <div class=\"mx-broker-logo-wrap\">\n\n                ${\n                    broker.logo_url\n                        ? `\n                            <img decoding=\"async\"\n                                class=\"mx-broker-logo\"\n                                src=\"${escapeHtml(broker.logo_url)}\"\n                                alt=\"${brokerName}\"\n                                loading=\"lazy\"\n                            >\n                          `\n                        : `\n                            <div class=\"mx-broker-logo-placeholder\">\n                                ${brokerName.charAt(0)}\n                            <\/div>\n                          `\n                }\n\n            <\/div>\n\n\n            <div class=\"mx-broker-content\">\n\n                <div class=\"mx-broker-title-row\">\n\n                    <strong class=\"mx-broker-name\">\n                        ${brokerName}\n                    <\/strong>\n\n                    ${\n                        broker.verified\n                            ? `\n                                <span class=\"mx-broker-verified\">\n                                    VERIFIED\n                                <\/span>\n                              `\n                            : \"\"\n                    }\n\n                <\/div>\n\n\n                <div class=\"mx-broker-features\">\n\n                    ${brokerFeatures(broker)}\n\n                <\/div>\n\n            <\/div>\n\n        <\/div>\n    `;\n}\n\n\n    \/* =====================================================\n       RENDER ROWS\n    ====================================================== *\/\n\n    function render(data) {\n\n        if (\n            !Array.isArray(data) ||\n            !data.length\n        ) {\n\n            if (\n                state.mode === \"scam\"\n            ) {\n\n                rows.innerHTML = `\n                    <div class=\"mx-ranking-state\">\n                        No verified scam broker records are available.\n                    <\/div>\n                `;\n\n            } else {\n\n                rows.innerHTML = `\n                    <div class=\"mx-ranking-state\">\n                        No brokers match the selected filters.\n                    <\/div>\n                `;\n            }\n\n\n            return;\n        }\n\n\n        rows.innerHTML =\n            data.map(function (broker) {\n\n                const rank =\n                    Number(\n                        broker.rank || 0\n                    );\n\n\n                const brokerName =\n                    escapeHtml(\n                        broker.name ||\n                        \"Unknown Broker\"\n                    );\n\n\n                const slug =\n                    encodeURIComponent(\n                        broker.slug || \"\"\n                    );\n\n\n                const sourceNative =\n                    getSourceNative(broker);\n\n\n                const markunoxScore =\n                    broker.display_score !==\n                    undefined\n                        ? broker.display_score\n                        : broker.score;\n\n\n                const markunoxScoreNumber =\n                    getNumber(markunoxScore);\n\n\n                const effectiveScore =\n                    markunoxScoreNumber !== null\n                        ? markunoxScoreNumber\n                        : sourceNative.ratingIndex;\n\n\n                const scoreSource =\n                    markunoxScoreNumber !== null\n                        ? \"MARKUNOX AI\"\n                        : (\n                            sourceNative.ratingIndex !== null\n                                ? \"AI Ranking\"\n                                : \"\"\n                          );\n\n\n                const hasRegulation =\n                    String(\n                        broker.regulators ||\n                        \"\"\n                    ).trim() !== \"\" ||\n                    sourceNative.licenseCount !== null;\n\n\n                return `\n\n                    <div class=\"mx-ranking-row\">\n\n\n                        <!-- =====================\n                             RANK\n                        ====================== -->\n\n                        <div class=\"mx-col-rank\">\n\n                            <span\n                                class=\"\n                                    mx-rank-circle\n                                    ${rankClass(rank)}\n                                \"\n                            >\n                                ${rank}\n                            <\/span>\n\n                        <\/div>\n\n\n                        <!-- =====================\n                             BROKER\n                        ====================== -->\n\n                        <div class=\"mx-col-broker\">\n\n                            ${renderBrokerIdentity(\n                                broker,\n                                brokerName\n                            )}\n\n                        <\/div>\n\n\n                        <!-- =====================\n                             SCORE\n                        ====================== -->\n\n                        <div class=\"mx-col-score\">\n\n                            <strong>\n                                ${formatScore(\n                                    effectiveScore\n                                )}\n                            <\/strong>\n\n\n                            <div class=\"mx-stars\">\n\n                                ${renderStars(\n                                    effectiveScore\n                                )}\n\n                            <\/div>\n\n\n                            ${\n                                scoreSource\n                                    ? `\n                                        <span class=\"mx-source-native-note\">\n                                            ${escapeHtml(scoreSource)}\n                                        <\/span>\n                                      `\n                                    : `\n                                        <span class=\"mx-source-native-note\">\n                                            N\/A\n                                        <\/span>\n                                      `\n                            }\n\n                        <\/div>\n\n\n                        <!-- =====================\n                             REGULATION\n                        ====================== -->\n\n                        <div class=\"mx-col-regulation\">\n\n                            <strong class=\"mx-metric-score\">\n\n                                ${formatLicenseCount(\n                                    sourceNative.licenseCount\n                                )}\n\n                            <\/strong>\n\n\n                            ${\n                                hasRegulation\n                                    ? `\n                                        <span class=\"mx-regulated\">\n                                            REGULATED\n                                        <\/span>\n                                      `\n                                    : `\n                                        <span class=\"mx-regulation-na\">\n                                            N\/A\n                                        <\/span>\n                                      `\n                            }\n\n\n                            <div class=\"mx-regulator-chips\">\n\n                                ${renderRegulators(\n                                    broker.regulators\n                                )}\n\n                            <\/div>\n\n                        <\/div>\n\n\n                        <!-- =====================\n                             TRADING ENV\n                        ====================== -->\n\n                        <div class=\"mx-col-trading\">\n\n                            <strong class=\"mx-metric-score\">\n\n                                ${\n                                    sourceNative.tradingGrade\n                                        ? escapeHtml(sourceNative.tradingGrade)\n                                        : \"\u2014\"\n                                }\n\n                            <\/strong>\n\n\n                            <span class=\"mx-source-native-note\">\n                                WikiFX Trading ENV\n                            <\/span>\n\n\n                            <span class=\"mx-quality green\">\n\n                                ${sourceGradeLabel(\n                                    sourceNative.tradingGrade\n                                )}\n\n                            <\/span>\n\n                        <\/div>\n\n\n                        <!-- =====================\n                             POPULARITY\n                        ====================== -->\n\n                        <div class=\"mx-col-popularity\">\n\n                            <strong class=\"mx-metric-score\">\n\n                                ${formatScore(\n                                    sourceNative.influenceIndex\n                                )}\n\n                            <\/strong>\n\n\n                            ${renderMeter(\n                                sourceNative.influenceIndex,\n                                \"blue\"\n                            )}\n\n\n                            <span class=\"mx-quality blue\">\n\n                                ${\n                                    sourceNative.influenceGrade\n                                        ? `Influence ${escapeHtml(sourceNative.influenceGrade)}`\n                                        : sourceNative.influenceIndex !== null\n                                            ? \"WikiFX Influence\"\n                                            : \"N\/A\"\n                                }\n\n                            <\/span>\n\n                        <\/div>\n\n\n                        <!-- =====================\n                             ACTION\n                        ====================== -->\n\n                        <div class=\"mx-col-action\">\n\n                            <a\n                                class=\"mx-action-details\"\n                                href=\"\/broker\/${slug}\/\"\n                            >\n                                Details\n                            <\/a>\n\n                            <a\n                                class=\"mx-action-compare\"\n                                href=\"\/compare\/?broker1=${slug}&broker2=${slug === \"avatrade\" ? \"fxcm\" : \"avatrade\"}\"\n                            >\n                                Compare\n                            <\/a>\n\n                        <\/div>\n\n\n                    <\/div>\n                `;\n\n            })\n            .join(\"\");\n    }\n\n\n    \/* =====================================================\n       BUILD API URL\n    ====================================================== *\/\n\n    function buildUrlForMode(mode) {\n\n        const url =\n            new URL(API);\n\n\n        url.searchParams.set(\n            \"mode\",\n            mode || state.mode\n        );\n\n\n        if (\n            state.category &&\n            state.category !== \"all\"\n        ) {\n\n            url.searchParams.set(\n                \"category\",\n                state.category\n            );\n        }\n\n\n        if (state.country) {\n\n            url.searchParams.set(\n                \"country\",\n                state.country\n            );\n        }\n\n\n        if (state.q) {\n\n            url.searchParams.set(\n                \"q\",\n                state.q\n            );\n        }\n\n\n        if (state.verified) {\n\n            url.searchParams.set(\n                \"verified\",\n                \"1\"\n            );\n        }\n\n\n        if (state.islamic) {\n\n            url.searchParams.set(\n                \"islamic\",\n                \"1\"\n            );\n        }\n\n\n        if (state.minScore) {\n\n            url.searchParams.set(\n                \"min_score\",\n                state.minScore\n            );\n        }\n\n\n        return url.toString();\n    }\n\n\n    function buildUrl() {\n        return buildUrlForMode(state.mode);\n    }\n\n\n    \/* =====================================================\n       LOADING SKELETON\n    ====================================================== *\/\n\n    function renderSkeleton(count = 6) {\n\n        rows.innerHTML =\n            Array.from({ length: count })\n                .map(function () {\n                    return `\n                        <div class=\"mx-ranking-row mx-ranking-skeleton\" aria-hidden=\"true\">\n                            <div class=\"mx-col-rank\">\n                                <span class=\"mx-skeleton-circle\"><\/span>\n                            <\/div>\n\n                            <div class=\"mx-col-broker\">\n                                <div class=\"mx-skeleton-broker\">\n                                    <span class=\"mx-skeleton-logo\"><\/span>\n                                    <div class=\"mx-skeleton-lines\">\n                                        <span class=\"mx-skeleton-line wide\"><\/span>\n                                        <span class=\"mx-skeleton-line short\"><\/span>\n                                    <\/div>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"mx-col-score\">\n                                <span class=\"mx-skeleton-line medium center\"><\/span>\n                            <\/div>\n\n                            <div class=\"mx-col-regulation\">\n                                <span class=\"mx-skeleton-line medium center\"><\/span>\n                                <span class=\"mx-skeleton-line short center\"><\/span>\n                            <\/div>\n\n                            <div class=\"mx-col-trading\">\n                                <span class=\"mx-skeleton-line medium center\"><\/span>\n                            <\/div>\n\n                            <div class=\"mx-col-popularity\">\n                                <span class=\"mx-skeleton-line medium center\"><\/span>\n                            <\/div>\n\n                            <div class=\"mx-col-action\">\n                                <span class=\"mx-skeleton-button\"><\/span>\n                            <\/div>\n                        <\/div>\n                    `;\n                })\n                .join(\"\");\n    }\n\n\n    function cacheStorageKey(url) {\n\n        return (\n            PERSISTENT_CACHE_PREFIX +\n            encodeURIComponent(url)\n        );\n    }\n\n\n    function getCachedResult(url) {\n\n        const now =\n            Date.now();\n\n        const memoryEntry =\n            responseCache.get(url);\n\n\n        if (memoryEntry) {\n\n            return {\n                result: memoryEntry.result,\n                savedAt: memoryEntry.savedAt,\n                fresh:\n                    (now - memoryEntry.savedAt) <=\n                    CLIENT_CACHE_TTL\n            };\n        }\n\n\n        try {\n\n            const raw =\n                window.localStorage.getItem(\n                    cacheStorageKey(url)\n                );\n\n            if (!raw) {\n                return null;\n            }\n\n            const entry =\n                JSON.parse(raw);\n\n            if (\n                !entry ||\n                !entry.result ||\n                !Number.isFinite(\n                    Number(entry.savedAt)\n                )\n            ) {\n                return null;\n            }\n\n            const age =\n                now -\n                Number(entry.savedAt);\n\n\n            if (\n                age >\n                PERSISTENT_CACHE_TTL\n            ) {\n\n                window.localStorage.removeItem(\n                    cacheStorageKey(url)\n                );\n\n                return null;\n            }\n\n\n            responseCache.set(\n                url,\n                {\n                    savedAt:\n                        Number(entry.savedAt),\n                    result:\n                        entry.result\n                }\n            );\n\n\n            return {\n                result: entry.result,\n                savedAt:\n                    Number(entry.savedAt),\n                fresh:\n                    age <=\n                    CLIENT_CACHE_TTL\n            };\n\n        }\n\n        catch (error) {\n\n            return null;\n        }\n    }\n\n\n    function setCachedResult(url, result) {\n\n        const entry = {\n            savedAt: Date.now(),\n            result\n        };\n\n\n        responseCache.set(\n            url,\n            entry\n        );\n\n\n        try {\n\n            window.localStorage.setItem(\n                cacheStorageKey(url),\n                JSON.stringify(entry)\n            );\n\n        }\n\n        catch (error) {\n\n            \/*\n             * Memory cache remains available even when persistent\n             * browser storage is unavailable.\n             *\/\n        }\n    }\n\n\n\n    \/* =====================================================\n       ISOLATED FULL-DATA ENRICHMENT\n       Keeps tab order\/rank intact and only fills missing broker data.\n       Full broker metrics are always requested from OVERALL mode because\n       that endpoint contains the complete source_native payload.\n    ====================================================== *\/\n\n    const brokerSlugAliases = {\n        \"ic-markets\": [\"ic-markets\", \"icmarkets\", \"icmarkets-global\", \"ic-markets-global\"],\n        \"icmarkets\": [\"icmarkets\", \"ic-markets\", \"icmarkets-global\", \"ic-markets-global\"],\n        \"startrader\": [\"startrader\", \"star-trader\"],\n        \"star-trader\": [\"star-trader\", \"startrader\"],\n        \"fp-markets\": [\"fp-markets\", \"fpmarkets\"],\n        \"fpmarkets\": [\"fpmarkets\", \"fp-markets\"],\n        \"ec-markets\": [\"ec-markets\", \"ecmarkets\"],\n        \"ecmarkets\": [\"ecmarkets\", \"ec-markets\"],\n        \"gtcfx\": [\"gtcfx\", \"gtc-fx\"],\n        \"gtc-fx\": [\"gtc-fx\", \"gtcfx\"],\n        \"avatrade\": [\"avatrade\", \"ava-trade\"],\n        \"ava-trade\": [\"ava-trade\", \"avatrade\"],\n        \"vantage\": [\"vantage\", \"vantage-markets\"],\n        \"lmax-group\": [\"lmax-group\", \"lmax\"],\n        \"bcr\": [\"bcr\", \"bcr-markets\"]\n    };\n\n\n    function normalizeBrokerSlug(value) {\n\n        return String(value || \"\")\n            .trim()\n            .toLowerCase()\n            .replace(\/[^a-z0-9]+\/g, \"-\")\n            .replace(\/^-+|-+$\/g, \"\");\n    }\n\n\n    function brokerCandidates(value) {\n\n        const clean =\n            normalizeBrokerSlug(value);\n\n        const list = [\n            clean,\n            ...(brokerSlugAliases[clean] || []),\n            clean.replace(\/-\/g, \"\")\n        ];\n\n        return Array.from(\n            new Set(\n                list\n                    .map(normalizeBrokerSlug)\n                    .filter(Boolean)\n            )\n        );\n    }\n\n\n    function hasUsefulValue(value) {\n\n        if (\n            value === null ||\n            value === undefined ||\n            value === \"\"\n        ) {\n            return false;\n        }\n\n        if (Array.isArray(value)) {\n            return value.length > 0;\n        }\n\n        return true;\n    }\n\n\n    function mergeObjectPreferUseful(\n        fallback,\n        preferred\n    ) {\n\n        const result =\n            Object.assign(\n                {},\n                fallback || {}\n            );\n\n        Object.entries(\n            preferred || {}\n        ).forEach(function (entry) {\n\n            const key = entry[0];\n            const value = entry[1];\n\n            if (hasUsefulValue(value)) {\n                result[key] = value;\n            }\n        });\n\n        return result;\n    }\n\n\n    function mergeBrokerFullData(\n        baseBroker,\n        fullBroker\n    ) {\n\n        if (!fullBroker) {\n            return baseBroker;\n        }\n\n        const originalRank =\n            baseBroker.rank;\n\n        const originalId =\n            baseBroker.id;\n\n        const merged =\n            mergeObjectPreferUseful(\n                fullBroker,\n                baseBroker\n            );\n\n        merged.source_native =\n            mergeObjectPreferUseful(\n                fullBroker.source_native || {},\n                baseBroker.source_native || {}\n            );\n\n        merged.source_metrics =\n            mergeObjectPreferUseful(\n                fullBroker.source_metrics || {},\n                baseBroker.source_metrics || {}\n            );\n\n        \/*\n         * Regulation must be canonical across ALL tabs.\n         * Trading\/Popular\/Brand responses can contain reduced or stale\n         * regulation snapshots, so the broker-specific OVERALL detail\n         * is authoritative only for regulation-related fields.\n         *\/\n        [\n            \"regulators\",\n            \"licenses\",\n            \"license_count\",\n            \"wikifx_license_count\",\n            \"regulation_status\",\n            \"verified\",\n            \"verification_status\"\n        ].forEach(function (key) {\n            if (hasUsefulValue(fullBroker[key])) {\n                merged[key] = fullBroker[key];\n            }\n        });\n\n        const fullNative =\n            fullBroker.source_native &&\n            typeof fullBroker.source_native === \"object\"\n                ? fullBroker.source_native\n                : {};\n\n        [\n            \"license_count\",\n            \"wikifx_license_count\",\n            \"license_details\",\n            \"regulator_countries\",\n            \"regulators\"\n        ].forEach(function (key) {\n            if (hasUsefulValue(fullNative[key])) {\n                merged.source_native[key] = fullNative[key];\n            }\n        });\n\n        \/*\n         * Ranking order belongs to the selected tab and must never be\n         * overwritten by the OVERALL detail lookup.\n         *\/\n        merged.rank = originalRank;\n\n        if (originalId !== undefined) {\n            merged.id = originalId;\n        }\n\n        return merged;\n    }\n\n\n    function detailCacheKey(slug) {\n\n        return (\n            DETAIL_CACHE_PREFIX +\n            encodeURIComponent(\n                normalizeBrokerSlug(slug)\n            )\n        );\n    }\n\n\n    function readBrokerDetailCache(slug) {\n\n        const key =\n            normalizeBrokerSlug(slug);\n\n        if (!key) {\n            return null;\n        }\n\n        if (detailMemoryCache.has(key)) {\n            return detailMemoryCache.get(key);\n        }\n\n        try {\n\n            const raw =\n                window.localStorage.getItem(\n                    detailCacheKey(key)\n                );\n\n            if (!raw) {\n                return null;\n            }\n\n            const parsed =\n                JSON.parse(raw);\n\n            if (\n                !parsed ||\n                !parsed.data ||\n                !Number.isFinite(Number(parsed.savedAt)) ||\n                (Date.now() - Number(parsed.savedAt)) > DETAIL_CACHE_TTL\n            ) {\n                window.localStorage.removeItem(\n                    detailCacheKey(key)\n                );\n                return null;\n            }\n\n            detailMemoryCache.set(\n                key,\n                parsed.data\n            );\n\n            return parsed.data;\n\n        } catch (error) {\n            return null;\n        }\n    }\n\n\n    function writeBrokerDetailCache(\n        slug,\n        broker\n    ) {\n\n        const key =\n            normalizeBrokerSlug(slug);\n\n        if (!key || !broker) {\n            return;\n        }\n\n        detailMemoryCache.set(\n            key,\n            broker\n        );\n\n        try {\n            window.localStorage.setItem(\n                detailCacheKey(key),\n                JSON.stringify({\n                    savedAt: Date.now(),\n                    data: broker\n                })\n            );\n        } catch (error) {\n            \/* Memory cache still works. *\/\n        }\n    }\n\n\n    function brokerDetailQuality(broker) {\n\n        if (!broker) {\n            return 0;\n        }\n\n        const metrics =\n            getSourceNative(broker);\n\n        let score = 0;\n\n        if (metrics.ratingIndex !== null) {\n            score++;\n        }\n\n        if (metrics.influenceIndex !== null) {\n            score++;\n        }\n\n        if (metrics.licenseCount !== null) {\n            score++;\n        }\n\n        if (metrics.tradingGrade) {\n            score++;\n        }\n\n        return score;\n    }\n\n\n\n\n    function mergeCanonicalBrokerData(existing, incoming) {\n\n        if (!existing) {\n            return incoming;\n        }\n\n        if (!incoming) {\n            return existing;\n        }\n\n        const merged =\n            mergeObjectPreferUseful(\n                existing,\n                incoming\n            );\n\n        merged.source_native =\n            mergeObjectPreferUseful(\n                existing.source_native || {},\n                incoming.source_native || {}\n            );\n\n        merged.source_metrics =\n            mergeObjectPreferUseful(\n                existing.source_metrics || {},\n                incoming.source_metrics || {}\n            );\n\n        return merged;\n    }\n\n\n    function promoteBrokerToCanonicalCache(broker) {\n\n        if (!broker || !broker.slug) {\n            return;\n        }\n\n        const key =\n            normalizeBrokerSlug(\n                broker.slug\n            );\n\n        if (!key) {\n            return;\n        }\n\n        const current =\n            canonicalBrokerMemory.get(key) || null;\n\n        const merged =\n            mergeCanonicalBrokerData(\n                current,\n                broker\n            );\n\n        canonicalBrokerMemory.set(\n            key,\n            merged\n        );\n    }\n\n\n    function absorbCanonicalBrokerData(list) {\n\n        if (!Array.isArray(list)) {\n            return;\n        }\n\n        list.forEach(function (broker) {\n            promoteBrokerToCanonicalCache(\n                broker\n            );\n        });\n    }\n\n\n    function hydrateRankingFromDetailCache(list) {\n\n        if (!Array.isArray(list)) {\n            return list;\n        }\n\n        list.forEach(function (broker, index) {\n\n            if (!broker || !broker.slug) {\n                return;\n            }\n\n            const key =\n                normalizeBrokerSlug(\n                    broker.slug\n                );\n\n            const canonical =\n                canonicalBrokerMemory.get(key) || null;\n\n            if (canonical) {\n                list[index] =\n                    mergeCanonicalBrokerData(\n                        list[index],\n                        canonical\n                    );\n            }\n\n            const fullDetail =\n                readBrokerDetailCache(key);\n\n            if (fullDetail) {\n                list[index] =\n                    mergeBrokerFullData(\n                        list[index],\n                        fullDetail\n                    );\n            }\n        });\n\n        return list;\n    }\n\n\n    async function fetchBrokerDetailOnce(query) {\n\n        const controller =\n            new AbortController();\n\n        const timeout =\n            window.setTimeout(\n                function () {\n                    controller.abort();\n                },\n                6500\n            );\n\n        const url =\n            new URL(API);\n\n        url.searchParams.set(\n            \"mode\",\n            \"overall\"\n        );\n\n        url.searchParams.set(\n            \"q\",\n            query\n        );\n\n        try {\n\n            const headers = {\n                Accept: \"application\/json\"\n            };\n\n            if (\n                window.MarkunoxAccess &&\n                window.MarkunoxAccess.token\n            ) {\n                headers[\"X-Markunox-Auth\"] =\n                    window.MarkunoxAccess.token;\n            }\n\n            const response =\n                await fetch(\n                    url.toString(),\n                    {\n                        headers: headers,\n                        cache: \"no-store\",\n                        signal: controller.signal\n                    }\n                );\n\n            if (!response.ok) {\n                return null;\n            }\n\n            const result =\n                await response.json();\n\n            if (\n                !result ||\n                result.status !== \"ok\" ||\n                !Array.isArray(result.data) ||\n                !result.data.length\n            ) {\n                return null;\n            }\n\n            const querySlug =\n                normalizeBrokerSlug(query);\n\n            return (\n                result.data.find(function (item) {\n                    return normalizeBrokerSlug(item.slug) === querySlug;\n                }) ||\n                result.data[0] ||\n                null\n            );\n\n        } catch (error) {\n            return null;\n        } finally {\n            window.clearTimeout(timeout);\n        }\n    }\n\n\n    async function getFullBrokerDetail(slug) {\n\n        const key =\n            normalizeBrokerSlug(slug);\n\n        if (!key) {\n            return null;\n        }\n\n        const cached =\n            readBrokerDetailCache(key);\n\n        \/*\n         * v21 detail cache is reserved ONLY for broker-specific OVERALL\n         * responses. Tab payloads never write here, so regulation remains\n         * identical when switching Brand \/ Popular \/ Trading ENV.\n         *\/\n        if (cached) {\n            return cached;\n        }\n\n        if (detailInflight.has(key)) {\n            return detailInflight.get(key);\n        }\n\n        const task =\n            (async function () {\n\n                const candidates =\n                    brokerCandidates(key);\n\n                let bestBroker = null;\n                let bestQuality = -1;\n\n                for (const candidate of candidates) {\n\n                    const broker =\n                        await fetchBrokerDetailOnce(\n                            candidate\n                        );\n\n                    if (!broker) {\n                        continue;\n                    }\n\n                    const quality =\n                        brokerDetailQuality(\n                            broker\n                        );\n\n                    if (quality > bestQuality) {\n                        bestQuality = quality;\n                        bestBroker = broker;\n                    }\n\n                    \/* All four ranking metrics are present. *\/\n                    if (quality >= 4) {\n                        break;\n                    }\n                }\n\n                if (bestBroker) {\n                    writeBrokerDetailCache(\n                        key,\n                        bestBroker\n                    );\n                    return bestBroker;\n                }\n\n                return null;\n\n            })()\n                .finally(function () {\n                    detailInflight.delete(key);\n                });\n\n        detailInflight.set(\n            key,\n            task\n        );\n\n        return task;\n    }\n\n\n    async function enrichRankingData(\n        result,\n        url,\n        runId\n    ) {\n\n        if (\n            !result ||\n            !Array.isArray(result.data) ||\n            !result.data.length\n        ) {\n            return;\n        }\n\n        const list =\n            result.data;\n\n        \/* Capture every useful metric already present in this tab first. *\/\n        absorbCanonicalBrokerData(list);\n\n        \/* Apply the richest known broker data before any network work. *\/\n        hydrateRankingFromDetailCache(list);\n\n        if (runId === enrichmentSequence) {\n            render(list);\n        }\n\n        let cursor = 0;\n        let completed = 0;\n\n        const concurrency =\n            Math.min(\n                5,\n                list.length\n            );\n\n        async function worker() {\n\n            while (true) {\n\n                const index = cursor++;\n\n                if (index >= list.length) {\n                    return;\n                }\n\n                const baseBroker =\n                    list[index];\n\n                if (!baseBroker || !baseBroker.slug) {\n                    continue;\n                }\n\n                const fullBroker =\n                    await getFullBrokerDetail(\n                        baseBroker.slug\n                    );\n\n                if (fullBroker) {\n                    list[index] =\n                        mergeBrokerFullData(\n                            baseBroker,\n                            fullBroker\n                        );\n\n                    promoteBrokerToCanonicalCache(\n                        list[index]\n                    );\n                }\n\n                completed++;\n\n                \/*\n                 * Progressive paint keeps the page responsive, but only\n                 * the currently active tab is allowed to repaint.\n                 *\/\n                if (\n                    runId === enrichmentSequence &&\n                    completed % 3 === 0\n                ) {\n                    render(list);\n                }\n            }\n        }\n\n        await Promise.all(\n            Array.from(\n                { length: concurrency },\n                worker\n            )\n        );\n\n        if (runId !== enrichmentSequence) {\n            return;\n        }\n\n        render(list);\n\n        setCachedResult(\n            url,\n            result\n        );\n    }\n\n\n    function startRankingEnrichment(\n        result,\n        url\n    ) {\n\n        const runId =\n            ++enrichmentSequence;\n\n        enrichRankingData(\n            result,\n            url,\n            runId\n        ).catch(function (error) {\n            console.warn(\n                \"MARKUNOX Ranking enrichment:\",\n                error\n            );\n        });\n    }\n\n\n    function renderCachedRanking(\n        entry,\n        url\n    ) {\n\n        if (\n            !entry ||\n            !entry.result\n        ) {\n            return false;\n        }\n\n\n        populateMeta(\n            entry.result.meta\n        );\n\n\n        absorbCanonicalBrokerData(\n            entry.result.data\n        );\n\n\n        hydrateRankingFromDetailCache(\n            entry.result.data\n        );\n\n\n        render(\n            entry.result.data\n        );\n\n\n        startRankingEnrichment(\n            entry.result,\n            url\n        );\n\n\n        if (lastUpdate) {\n\n            lastUpdate.textContent =\n                \"Last Update: LIVE\";\n        }\n\n\n        return true;\n    }\n\n\n    \/* =====================================================\n       LOAD API\n    ====================================================== *\/\n\n    async function loadRanking(options = {}) {\n\n        const force =\n            options &&\n            options.force === true;\n\n        const requestId =\n            ++requestSequence;\n\n        const url =\n            buildUrl();\n\n        const cached =\n            force\n                ? null\n                : getCachedResult(url);\n\n        const renderedFromCache =\n            cached\n                ? renderCachedRanking(\n                    cached,\n                    url\n                )\n                : false;\n\n\n        \/*\n         * Fresh cached data renders immediately and avoids\n         * another request. Stale-but-valid cached data also\n         * renders immediately, then refreshes in the background.\n         *\/\n        if (\n            cached &&\n            cached.fresh &&\n            !force\n        ) {\n            return;\n        }\n\n\n        if (controller) {\n            controller.abort();\n        }\n\n\n        controller =\n            new AbortController();\n\n\n        \/*\n         * Faster tab switching:\n         * Keep the current rows visible while a new ranking mode loads.\n         * Skeleton is used only on the very first load when there are no rows yet.\n         *\/\n        if (!renderedFromCache) {\n            const hasRealRows =\n                rows &&\n                rows.querySelector(\".mx-ranking-row:not(.mx-ranking-skeleton)\");\n\n            if (!hasRealRows) {\n                renderSkeleton(6);\n            }\n        }\n\n\n        const headers = {\n\n            Accept:\n                \"application\/json\"\n\n        };\n\n\n        if (\n            window.MarkunoxAccess &&\n            window.MarkunoxAccess.token\n        ) {\n\n            headers[\n                \"X-Markunox-Auth\"\n            ] =\n                window.MarkunoxAccess.token;\n        }\n\n\n        try {\n\n            const response =\n                await fetch(\n\n                    url,\n\n                    {\n\n                        headers:\n                            headers,\n\n                        cache:\n                            \"default\",\n\n                        signal:\n                            controller.signal\n\n                    }\n                );\n\n\n            const result =\n                await response.json();\n\n\n            if (\n                requestId !== requestSequence\n            ) {\n                return;\n            }\n\n\n            if (\n                !response.ok ||\n                !result ||\n                result.status !== \"ok\"\n            ) {\n\n                throw new Error(\n                    result.debug ||\n                    result.message ||\n                    \"Ranking request failed\"\n                );\n            }\n\n\n            absorbCanonicalBrokerData(\n                result.data\n            );\n\n\n            hydrateRankingFromDetailCache(\n                result.data\n            );\n\n\n            setCachedResult(\n                url,\n                result\n            );\n\n\n            populateMeta(\n                result.meta\n            );\n\n\n            render(\n                result.data\n            );\n\n\n            startRankingEnrichment(\n                result,\n                url\n            );\n\n\n            if (lastUpdate) {\n\n                lastUpdate.textContent =\n                    \"Last Update: LIVE\";\n            }\n\n        }\n\n        catch (error) {\n\n            if (\n                error.name ===\n                \"AbortError\"\n            ) {\n\n                return;\n            }\n\n\n            console.error(\n                \"MARKUNOX Ranking Error:\",\n                error\n            );\n\n\n            \/*\n             * Keep previously cached rows visible if the\n             * background refresh fails.\n             *\/\n            if (\n                !renderedFromCache &&\n                requestId === requestSequence\n            ) {\n\n                rows.innerHTML = `\n                    <div class=\"mx-ranking-state\">\n                        Unable to load ranking.\n                    <\/div>\n                `;\n            }\n        }\n\n        finally {\n\n            if (\n                requestId === requestSequence\n            ) {\n                controller = null;\n            }\n        }\n\n    }\n\n\n    \/* =====================================================\n       TABS\n    ====================================================== *\/\n\n    app\n        .querySelectorAll(\n            \".mx-rank-tabs button\"\n        )\n        .forEach(function (button) {\n\n            button.addEventListener(\n                \"click\",\n                function () {\n\n                    app\n                        .querySelectorAll(\n                            \".mx-rank-tabs button\"\n                        )\n                        .forEach(\n                            function (item) {\n\n                                item\n                                    .classList\n                                    .remove(\n                                        \"active\"\n                                    );\n                            }\n                        );\n\n\n                    button\n                        .classList\n                        .add(\n                            \"active\"\n                        );\n\n\n                    state.mode =\n                        button.dataset.mode;\n\n\n                    loadRanking();\n\n                }\n            );\n\n        });\n\n\n    \/* =====================================================\n       CATEGORY\n    ====================================================== *\/\n\n    if (\n        categoryButton &&\n        categoryMenu\n    ) {\n\n        categoryButton.addEventListener(\n            \"click\",\n            function () {\n\n                const opening =\n                    !categoryMenu\n                        .classList\n                        .contains(\"open\");\n\n                categoryMenu\n                    .classList\n                    .toggle(\n                        \"open\",\n                        opening\n                    );\n\n                categoryButton.setAttribute(\n                    \"aria-expanded\",\n                    opening\n                        ? \"true\"\n                        : \"false\"\n                );\n            }\n        );\n\n\n        categoryMenu.addEventListener(\n            \"click\",\n            function (event) {\n\n                const option =\n                    event.target.closest(\n                        \".mx-category-option\"\n                    );\n\n                if (!option) {\n                    return;\n                }\n\n                const value =\n                    option.dataset.value ||\n                    \"all\";\n\n                categorySelect.value =\n                    value;\n\n                state.category =\n                    value;\n\n                refreshCategoryMenu();\n\n                closeCategoryMenu();\n\n                loadRanking();\n            }\n        );\n\n\n        document.addEventListener(\n            \"click\",\n            function (event) {\n\n                if (\n                    !event.target.closest(\n                        \".mx-category-custom\"\n                    )\n                ) {\n                    closeCategoryMenu();\n                }\n            }\n        );\n\n\n        document.addEventListener(\n            \"keydown\",\n            function (event) {\n\n                if (\n                    event.key ===\n                    \"Escape\"\n                ) {\n                    closeCategoryMenu();\n                }\n            }\n        );\n    }\n\n\n    \/* =====================================================\n       FILTER OPEN\n    ====================================================== *\/\n\n    filterToggle\n        .addEventListener(\n            \"click\",\n            function () {\n\n                filterPanel\n                    .classList\n                    .toggle(\n                        \"open\"\n                    );\n\n            }\n        );\n\n\n    \/* =====================================================\n       APPLY FILTERS\n    ====================================================== *\/\n\n    document\n        .getElementById(\n            \"mx-filter-apply\"\n        )\n        .addEventListener(\n            \"click\",\n            function () {\n\n                state.q =\n                    searchInput\n                        .value\n                        .trim();\n\n\n                state.country =\n                    countrySelect.value;\n\n\n                state.minScore =\n                    scoreSelect.value;\n\n\n                state.verified =\n                    verifiedInput.checked;\n\n\n                state.islamic =\n                    islamicInput.checked;\n\n\n                filterPanel\n                    .classList\n                    .remove(\n                        \"open\"\n                    );\n\n\n                loadRanking();\n\n            }\n        );\n\n\n    \/* =====================================================\n       RESET FILTER\n    ====================================================== *\/\n\n    document\n        .getElementById(\n            \"mx-filter-reset\"\n        )\n        .addEventListener(\n            \"click\",\n            function () {\n\n                searchInput.value =\n                    \"\";\n\n\n                countrySelect.value =\n                    \"\";\n\n\n                scoreSelect.value =\n                    \"\";\n\n\n                verifiedInput.checked =\n                    false;\n\n\n                islamicInput.checked =\n                    false;\n\n\n                state.q =\n                    \"\";\n\n\n                state.country =\n                    \"\";\n\n\n                state.minScore =\n                    \"\";\n\n\n                state.verified =\n                    false;\n\n\n                state.islamic =\n                    false;\n\n\n                loadRanking();\n\n            }\n        );\n\n\n    \/* =====================================================\n       ENTER SEARCH\n    ====================================================== *\/\n\n    searchInput\n        .addEventListener(\n            \"keydown\",\n            function (event) {\n\n                if (\n                    event.key !==\n                    \"Enter\"\n                ) {\n                    return;\n                }\n\n\n                state.q =\n                    searchInput\n                        .value\n                        .trim();\n\n\n                loadRanking();\n\n            }\n        );\n\n\n    \/* =====================================================\n       FILTER CUSTOM SELECTS\n    ====================================================== *\/\n\n    function setupCustomSelect(wrapper) {\n\n        const selectId =\n            wrapper.dataset.selectId;\n\n        const select =\n            document.getElementById(\n                selectId\n            );\n\n        const button =\n            wrapper.querySelector(\n                \".mx-custom-select-button\"\n            );\n\n        const label =\n            wrapper.querySelector(\n                \".mx-custom-select-label\"\n            );\n\n        const menu =\n            wrapper.querySelector(\n                \".mx-custom-select-menu\"\n            );\n\n\n        if (\n            !select ||\n            !button ||\n            !label ||\n            !menu\n        ) {\n            return null;\n        }\n\n\n        function refresh() {\n\n            const options =\n                Array.from(\n                    select.options\n                );\n\n            const selected =\n                options.find(function (option) {\n                    return option.value === select.value;\n                }) ||\n                options[0];\n\n\n            label.textContent =\n                selected\n                    ? selected.textContent.trim()\n                    : \"\";\n\n\n            menu.innerHTML =\n                options\n                    .map(function (option) {\n\n                        const active =\n                            option.value ===\n                            select.value;\n\n                        return `\n                            <button\n                                type=\"button\"\n                                class=\"mx-custom-select-option${active ? \" active\" : \"\"}\"\n                                data-value=\"${escapeHtml(option.value)}\"\n                                role=\"option\"\n                                aria-selected=\"${active ? \"true\" : \"false\"}\"\n                            >\n                                ${escapeHtml(option.textContent.trim())}\n                            <\/button>\n                        `;\n                    })\n                    .join(\"\");\n        }\n\n\n        function close() {\n\n            menu.classList.remove(\n                \"open\"\n            );\n\n            button.setAttribute(\n                \"aria-expanded\",\n                \"false\"\n            );\n        }\n\n\n        button.addEventListener(\n            \"click\",\n            function () {\n\n                document\n                    .querySelectorAll(\n                        \"#mx-ranking-app .mx-custom-select-menu.open\"\n                    )\n                    .forEach(function (otherMenu) {\n\n                        if (otherMenu !== menu) {\n                            otherMenu\n                                .classList\n                                .remove(\"open\");\n                        }\n                    });\n\n\n                const opening =\n                    !menu\n                        .classList\n                        .contains(\"open\");\n\n                menu\n                    .classList\n                    .toggle(\n                        \"open\",\n                        opening\n                    );\n\n                button.setAttribute(\n                    \"aria-expanded\",\n                    opening\n                        ? \"true\"\n                        : \"false\"\n                );\n            }\n        );\n\n\n        menu.addEventListener(\n            \"click\",\n            function (event) {\n\n                const option =\n                    event.target.closest(\n                        \".mx-custom-select-option\"\n                    );\n\n                if (!option) {\n                    return;\n                }\n\n\n                select.value =\n                    option.dataset.value || \"\";\n\n                select.dispatchEvent(\n                    new Event(\n                        \"change\",\n                        {\n                            bubbles: true\n                        }\n                    )\n                );\n\n                refresh();\n                close();\n            }\n        );\n\n\n        return {\n            refresh,\n            close\n        };\n    }\n\n\n    const customSelectControllers =\n        Array.from(\n            app.querySelectorAll(\n                \".mx-custom-select\"\n            )\n        )\n            .map(setupCustomSelect)\n            .filter(Boolean);\n\n\n    document.addEventListener(\n        \"click\",\n        function (event) {\n\n            if (\n                event.target.closest(\n                    \".mx-custom-select\"\n                )\n            ) {\n                return;\n            }\n\n            customSelectControllers\n                .forEach(function (instance) {\n                    instance.close();\n                });\n        }\n    );\n\n\n    \/* =====================================================\n       CUSTOM CHECKBOX INTERACTION\n    ====================================================== *\/\n\n    app\n        .querySelectorAll(\n            \".mx-check\"\n        )\n        .forEach(function (check) {\n\n            const input =\n                check.querySelector(\n                    'input[type=\"checkbox\"]'\n                );\n\n            if (!input) {\n                return;\n            }\n\n            check.addEventListener(\n                \"click\",\n                function (event) {\n\n                    event.preventDefault();\n\n                    input.checked =\n                        !input.checked;\n\n                    input.dispatchEvent(\n                        new Event(\n                            \"change\",\n                            {\n                                bubbles: true\n                            }\n                        )\n                    );\n                }\n            );\n        });\n\nasync function prefetchRankingModes() {\n    const modes = [\n        \"overall\",\n        \"brand\",\n        \"popular\",\n        \"trading\",\n        \"scam\"\n    ];\n\n    const jobs = modes.map(async function (mode) {\n\n        \/* Never mutate state.mode while prefetching. *\/\n        const url = buildUrlForMode(mode);\n\n        if (getCachedResult(url)) {\n            return;\n        }\n\n        const headers = {\n            Accept: \"application\/json\"\n        };\n\n        if (\n            window.MarkunoxAccess &&\n            window.MarkunoxAccess.token\n        ) {\n            headers[\"X-Markunox-Auth\"] =\n                window.MarkunoxAccess.token;\n        }\n\n        try {\n            const response = await fetch(\n                url,\n                {\n                    headers: headers,\n                    cache: \"force-cache\"\n                }\n            );\n\n            if (!response.ok) {\n                return;\n            }\n\n            const result =\n                await response.json();\n\n            if (\n                result &&\n                result.status === \"ok\"\n            ) {\n                absorbCanonicalBrokerData(\n                    result.data\n                );\n\n                hydrateRankingFromDetailCache(\n                    result.data\n                );\n\n                setCachedResult(\n                    url,\n                    result\n                );\n            }\n\n        } catch (error) {\n        }\n    });\n\n    await Promise.allSettled(jobs);\n}\n\n    \/* =====================================================\n       INITIAL LOAD\n    ====================================================== *\/\n\nrefreshCategoryMenu();\n\n    loadRanking();\n\n    \/*\n     * Preload the other ranking tabs in the background.\n     * This makes subsequent tab switches render from cache immediately.\n     * requestIdleCallback keeps the first visible load fast.\n     *\/\n    const startRankingPrefetch = function () {\n        prefetchRankingModes();\n    };\n\n    if (\"requestIdleCallback\" in window) {\n        window.requestIdleCallback(\n            startRankingPrefetch,\n            { timeout: 1200 }\n        );\n    } else {\n        setTimeout(\n            startRankingPrefetch,\n            450\n        );\n    }\n\n})();\n<\/script>\n\n\n<style>\n\n\/* =========================================================\n   BASE\n========================================================= *\/\n\n#mx-ranking-app {\n\n    width: 100%;\n\n    position: relative;\n\n    color: #F8FAFC;\n}\n\n\n\/* =========================================================\n   TABS\n========================================================= *\/\n\n.mx-rank-tabs {\n\n    display: grid;\n\n    grid-template-columns:\n        repeat(5, 1fr);\n\n    gap: 16px;\n\n    padding: 10px;\n\n    border:\n        1px solid #172333;\n\n    border-radius: 9px;\n}\n\n\n.mx-rank-tabs button {\n\n    min-height: 46px;\n\n    padding: 8px 12px;\n\n    border:\n        1px solid #16243A;\n\n    border-radius: 7px;\n\n    background:\n        transparent;\n\n    color: #FFFFFF;\n\n    font-size: 12px;\n\n    font-weight: 700;\n\n    cursor: pointer;\n\n    transition:\n        .2s ease;\n}\n\n\n.mx-rank-tabs button:hover {\n\n    border-color:\n        rgba(\n            52,\n            211,\n            153,\n            .45\n        );\n}\n\n\n.mx-rank-tabs button.active {\n\n    border-color:\n        #34D399;\n\n    background:\n        rgba(\n            52,\n            211,\n            153,\n            .045\n        );\n}\n\n\n\/* =========================================================\n   TOOLBAR\n========================================================= *\/\n\n.mx-rank-toolbar {\n\n    display: grid;\n\n    grid-template-columns:\n        150px\n        1fr\n        110px;\n\n    align-items: center;\n\n    gap: 16px;\n\n    margin:\n        12px 0 18px;\n}\n\n\n.mx-rank-toolbar select,\n.mx-filter-button {\n\n    height: 42px;\n\n    padding:\n        0 13px;\n\n    border:\n        1px solid #172333;\n\n    border-radius:\n        7px;\n\n    outline: none;\n\n    background:\n        #02060C;\n\n    color:\n        #E2E8F0;\n\n    font-size:\n        11px;\n}\n\n\n.mx-last-update {\n\n    text-align: center;\n\n    color:\n        #34D399;\n\n    font-size:\n        10px;\n\n    font-weight:\n        700;\n}\n\n\n.mx-filter-button {\n\n    cursor:\n        pointer;\n}\n\n\n\/* =========================================================\n   FILTER PANEL\n========================================================= *\/\n\n.mx-filter-panel {\n\n    display: none;\n\n    position: absolute;\n\n    top: 116px;\n\n    right: 0;\n\n    z-index: 9999;\n\n    width: 440px;\n\n    max-width:\n        100%;\n\n    padding: 18px;\n\n    border:\n        1px solid #1A2B40;\n\n    border-radius:\n        10px;\n\n    background:\n        #07101B;\n\n    box-shadow:\n        0 18px 50px\n        rgba(\n            0,\n            0,\n            0,\n            .55\n        );\n}\n\n\n.mx-filter-panel.open {\n\n    display:\n        block;\n}\n\n#mx-ranking-app .mx-category-menu,\n#mx-ranking-app .mx-filter-panel {\n    transition: none !important;\n    animation: none !important;\n}\n\n\n.mx-filter-grid {\n\n    display:\n        grid;\n\n    grid-template-columns:\n        repeat(2,1fr);\n\n    gap:\n        14px;\n}\n\n\n.mx-filter-grid label > span {\n\n    display:\n        block;\n\n    margin-bottom:\n        6px;\n\n    color:\n        #94A3B8;\n\n    font-size:\n        9px;\n}\n\n\n.mx-filter-grid input[type=\"text\"],\n.mx-filter-grid select {\n\n    width: 100%;\n\n    height: 38px;\n\n    padding:\n        0 10px;\n\n    border:\n        1px solid #1A2B40;\n\n    border-radius:\n        7px;\n\n    outline:\n        none;\n\n    background:\n        #02060C;\n\n    color:\n        #FFFFFF;\n\n    font-size:\n        10px;\n}\n\n\n.mx-check {\n\n    display:\n        flex;\n\n    align-items:\n        center;\n\n    gap:\n        8px;\n\n    padding-top:\n        20px;\n\n    cursor:\n        pointer;\n}\n\n\n.mx-check span {\n\n    margin:\n        0 !important;\n}\n\n\n.mx-filter-actions {\n\n    display:\n        flex;\n\n    justify-content:\n        flex-end;\n\n    gap:\n        10px;\n\n    margin-top:\n        18px;\n}\n\n\n.mx-filter-actions button {\n\n    min-width:\n        100px;\n\n    min-height:\n        36px;\n\n    padding:\n        7px 14px;\n\n    border:\n        1px solid #253B59;\n\n    border-radius:\n        7px;\n\n    background:\n        transparent;\n\n    color:\n        #CBD5E1;\n\n    cursor:\n        pointer;\n}\n\n\n.mx-filter-actions .primary {\n\n    color:\n        #02060C;\n\n    background:\n        #07DFE2;\n\n    border-color:\n        #07DFE2;\n\n    font-weight:\n        800;\n}\n\n\n\/* =========================================================\n   IMPORTANT:\n   SAME GRID FOR HEADER + ROW\n========================================================= *\/\n\n.mx-ranking-header,\n.mx-ranking-row {\n\n    display:\n        grid;\n\n    grid-template-columns:\n        58px\n        minmax(250px, 1.75fr)\n        95px\n        165px\n        135px\n        135px\n        90px;\n\n    align-items:\n        center;\n\n    column-gap:\n        14px;\n}\n\n\n\/* =========================================================\n   HEADER\n========================================================= *\/\n\n.mx-ranking-header {\n\n    min-height:\n        56px;\n\n    padding:\n        0 18px;\n\n    color:\n        #D5DEEB;\n\n    font-size:\n        10px;\n\n    text-align:\n        center;\n}\n\n\n.mx-ranking-header > div:nth-child(2) {\n\n    text-align:\n        left;\n}\n\n\n\/* =========================================================\n   ROW\n========================================================= *\/\n\n.mx-ranking-row {\n\n    min-height:\n        118px;\n\n    margin-bottom:\n        14px;\n\n    padding:\n        16px 18px;\n\n    border:\n        1px solid #172333;\n\n    border-radius:\n        12px;\n\n    background:\n        #080E17;\n\n    transition:\n        .2s ease;\n}\n\n\n.mx-ranking-row:hover {\n\n    border-color:\n        rgba(\n            7,\n            223,\n            226,\n            .22\n        );\n\n    background:\n        #09111C;\n}\n\n\n\/* =========================================================\n   RANK\n========================================================= *\/\n\n.mx-col-rank {\n\n    display:\n        flex;\n\n    justify-content:\n        center;\n}\n\n\n.mx-rank-circle {\n\n    width:\n        34px;\n\n    height:\n        34px;\n\n    display:\n        flex;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    border:\n        2px solid\n        #64748B;\n\n    border-radius:\n        50%;\n\n    color:\n        #94A3B8;\n\n    font-size:\n        13px;\n\n    font-weight:\n        800;\n}\n\n\n.mx-rank-circle.gold {\n\n    color:\n        #FFD84D;\n\n    border-color:\n        #FFD84D;\n\n    box-shadow:\n        0 0 7px\n        rgba(\n            255,\n            216,\n            77,\n            .45\n        ),\n        0 0 17px\n        rgba(\n            255,\n            216,\n            77,\n            .20\n        );\n}\n\n\n.mx-rank-circle.silver {\n\n    color:\n        #E8EDF3;\n\n    border-color:\n        #D9E1EA;\n}\n\n\n.mx-rank-circle.bronze {\n\n    color:\n        #F09A52;\n\n    border-color:\n        #D9823B;\n}\n\n\n\/* =========================================================\n   BROKER\n   Logo on the left + Name\/Verified\/Categories on the right\n========================================================= *\/\n\n.mx-col-broker {\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n    min-width: 0;\n}\n\n.mx-broker-layout {\n    width: 100%;\n\n    display: grid;\n\n    grid-template-columns:\n        108px\n        minmax(0, 1fr);\n\n    align-items: center;\n\n    column-gap: 14px;\n}\n\n.mx-broker-logo-wrap {\n    width: 108px;\n    height: 56px;\n\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n\n    flex-shrink: 0;\n}\n\n.mx-broker-logo {\n    width: 102px;\n    height: 48px;\n\n    display: block;\n\n    object-fit: contain;\n    object-position: left center;\n}\n\n.mx-broker-logo-placeholder {\n    width: 48px;\n    height: 48px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    border: 1px solid #253B59;\n    border-radius: 8px;\n\n    color: #07DFE2;\n    background: rgba(7, 223, 226, .05);\n\n    font-size: 18px;\n    font-weight: 900;\n}\n\n.mx-broker-content {\n    min-width: 0;\n\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    justify-content: center;\n\n    gap: 6px;\n}\n\n.mx-broker-title-row {\n    min-width: 0;\n\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n\n    gap: 7px;\n}\n\n.mx-broker-name {\n    color: #F8FAFC;\n\n    font-size: 14px;\n    font-weight: 800;\n    line-height: 1;\n\n    white-space: nowrap;\n}\n\n.mx-broker-verified {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 3px 6px;\n\n    border: 1px solid rgba(52, 211, 153, .22);\n    border-radius: 5px;\n\n    color: #34D399;\n    background: rgba(52, 211, 153, .08);\n\n    font-size: 7px;\n    font-weight: 800;\n    line-height: 1;\n\n    white-space: nowrap;\n}\n\n.mx-broker-features {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n\n    gap: 1px;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    color: #64748B;\n\n    font-size: 9px;\n    line-height: 1.3;\n}\n\n.mx-broker-features span {\n    display: block;\n    margin: 0;\n    padding: 0;\n}\n\n\/* Rank circle and broker block stay vertically centered on the same row *\/\n.mx-col-rank,\n.mx-col-broker {\n    align-self: center;\n}\n\n.mx-col-rank {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n\n\/* =========================================================\n   SCORE\n========================================================= *\/\n\n.mx-col-score {\n\n    text-align:\n        center;\n}\n\n\n.mx-col-score strong {\n\n    color:\n        #07DFE2;\n\n    font-size:\n        17px;\n\n    font-weight:\n        900;\n}\n\n\n.mx-stars {\n\n    margin-top:\n        5px;\n\n    color:\n        #F5C542;\n\n    font-size:\n        11px;\n\n    letter-spacing:\n        1px;\n}\n\n\n\/* =========================================================\n   METRIC SCORE\n========================================================= *\/\n\n.mx-metric-score {\n\n    display:\n        block;\n\n    color:\n        #E2E8F0;\n\n    font-size:\n        11px;\n\n    font-weight:\n        800;\n\n    line-height:\n        1;\n}\n\n\n\/* =========================================================\n   REGULATION\n========================================================= *\/\n\n.mx-col-regulation {\n\n    display:\n        flex;\n\n    flex-direction:\n        column;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    gap:\n        7px;\n\n    text-align:\n        center;\n}\n\n\n.mx-regulated {\n\n    display:\n        inline-flex;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    padding:\n        5px 9px;\n\n    border-radius:\n        6px;\n\n    color:\n        #FFFFFF;\n\n    background:\n        #34D399;\n\n    box-shadow:\n        0 0 10px\n        rgba(\n            52,\n            211,\n            153,\n            .45\n        );\n\n    font-size:\n        9px;\n\n    font-weight:\n        800;\n}\n\n\n.mx-regulation-na {\n\n    color:\n        #64748B;\n\n    font-size:\n        9px;\n}\n\n\n.mx-regulator-chips {\n\n    display:\n        flex;\n\n    flex-wrap:\n        wrap;\n\n    justify-content:\n        center;\n\n    gap:\n        4px;\n\n    max-width:\n        150px;\n}\n\n\n.mx-regulator-chip {\n\n    display:\n        inline-flex;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    min-height:\n        20px;\n\n    padding:\n        3px 6px;\n\n    border:\n        1px solid\n        rgba(\n            7,\n            223,\n            226,\n            .25\n        );\n\n    border-radius:\n        5px;\n\n    color:\n        #67E8F9;\n\n    background:\n        rgba(\n            7,\n            223,\n            226,\n            .06\n        );\n\n    font-size:\n        6.5px;\n\n    font-weight:\n        700;\n\n    white-space:\n        nowrap;\n}\n\n\n.mx-regulator-empty {\n\n    color:\n        #475569;\n\n    font-size:\n        9px;\n}\n\n\n\/* =========================================================\n   TRADING + POPULARITY\n========================================================= *\/\n\n.mx-col-trading,\n.mx-col-popularity {\n\n    display:\n        flex;\n\n    flex-direction:\n        column;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    gap:\n        8px;\n\n    text-align:\n        center;\n}\n\n\n.mx-meter {\n\n    width:\n        92px;\n\n    height:\n        5px;\n\n    overflow:\n        hidden;\n\n    border-radius:\n        999px;\n\n    background:\n        #172333;\n}\n\n\n.mx-meter span {\n\n    display:\n        block;\n\n    height:\n        100%;\n\n    border-radius:\n        inherit;\n}\n\n\n.mx-meter.green span {\n\n    background:\n        #34D399;\n}\n\n\n.mx-meter.blue span {\n\n    background:\n        #3B82F6;\n}\n\n\n.mx-quality {\n\n    display:\n        inline-flex;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    min-height:\n        26px;\n\n    padding:\n        5px 10px;\n\n    border-radius:\n        7px;\n\n    color:\n        #FFFFFF;\n\n    font-size:\n        9px;\n\n    font-weight:\n        650;\n}\n\n\n.mx-quality.green {\n\n    background:\n        rgba(\n            16,\n            185,\n            129,\n            .08\n        );\n\n    border:\n        1px solid\n        rgba(\n            16,\n            185,\n            129,\n            .20\n        );\n}\n\n\n.mx-quality.blue {\n\n    background:\n        rgba(\n            56,\n            189,\n            248,\n            .08\n        );\n\n    border:\n        1px solid\n        rgba(\n            56,\n            189,\n            248,\n            .25\n        );\n}\n\n\n\/* =========================================================\n   SOURCE-NATIVE LABEL\n========================================================= *\/\n\n.mx-source-native-note {\n\n    display:\n        inline-flex;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    min-height:\n        18px;\n\n    padding:\n        3px 6px;\n\n    border:\n        1px solid\n        rgba(\n            148,\n            163,\n            184,\n            .16\n        );\n\n    border-radius:\n        5px;\n\n    color:\n        #94A3B8;\n\n    background:\n        rgba(\n            15,\n            23,\n            42,\n            .35\n        );\n\n    font-size:\n        8px;\n\n    font-weight:\n        700;\n\n    line-height:\n        1;\n\n    white-space:\n        nowrap;\n}\n\n\n\/* =========================================================\n   ACTION\n========================================================= *\/\n\n.mx-col-action {\n\n    text-align:\n        center;\n}\n\n\n.mx-col-action a {\n\n    display:\n        inline-flex;\n\n    align-items:\n        center;\n\n    justify-content:\n        center;\n\n    min-width:\n        68px;\n\n    min-height:\n        32px;\n\n    border:\n        1px solid\n        #253B59;\n\n    border-radius:\n        7px;\n\n    color:\n        #CBD5E1;\n\n    text-decoration:\n        none;\n\n    font-size:\n        10px;\n\n    cursor:\n        pointer;\n}\n\n\n.mx-col-action a:hover {\n\n    border-color:\n        #07DFE2;\n\n    color:\n        #FFFFFF;\n}\n\n\n\/* =========================================================\n   LOADING \/ EMPTY\n========================================================= *\/\n\n.mx-ranking-state {\n\n    padding:\n        24px;\n\n    border:\n        1px solid\n        #172333;\n\n    border-radius:\n        10px;\n\n    background:\n        #080E17;\n\n    color:\n        #64748B;\n\n    text-align:\n        center;\n\n    font-size:\n        11px;\n}\n\n\n\/* =========================================================\n   MEDIUM DESKTOP \/ TABLET\n========================================================= *\/\n\n@media (max-width: 1250px) {\n\n    .mx-ranking-header,\n    .mx-ranking-row {\n\n        grid-template-columns:\n            48px\n            minmax(200px,1.5fr)\n            75px\n            135px\n            110px\n            110px\n            75px;\n\n        column-gap:\n            8px;\n    }\n\n\n    .mx-broker-logo {\n\n        width:\n            80px;\n    }\n\n\n    .mx-meter {\n\n        width:\n            78px;\n    }\n\n}\n\n\n\/* =========================================================\n   MOBILE\n========================================================= *\/\n\n@media (max-width: 767px) {\n\n    .mx-rank-tabs {\n\n        grid-template-columns:\n            repeat(2,1fr);\n\n        gap:\n            8px;\n    }\n\n\n    .mx-rank-toolbar {\n\n        grid-template-columns:\n            1fr 90px;\n    }\n\n\n    .mx-last-update {\n\n        display:\n            none;\n    }\n\n\n    .mx-filter-panel {\n\n        width:\n            calc(\n                100vw - 30px\n            );\n\n        right:\n            0;\n    }\n\n\n    .mx-filter-grid {\n\n        grid-template-columns:\n            1fr;\n    }\n\n\n    .mx-ranking-header,\n    .mx-ranking-row {\n\n        grid-template-columns:\n            42px\n            minmax(115px,1fr)\n            65px\n            78px;\n\n        column-gap:\n            7px;\n    }\n\n\n    .mx-ranking-header\n    > div:nth-child(5),\n\n    .mx-ranking-header\n    > div:nth-child(6),\n\n    .mx-ranking-header\n    > div:nth-child(7),\n\n    .mx-col-trading,\n\n    .mx-col-popularity,\n\n    .mx-col-action {\n\n        display:\n            none;\n    }\n\n\n    .mx-ranking-row {\n\n        min-height:\n            90px;\n\n        padding:\n            12px 10px;\n    }\n\n\n    .mx-broker-layout {\n        grid-template-columns:\n            68px\n            minmax(0, 1fr);\n\n        column-gap:\n            8px;\n    }\n\n\n    .mx-broker-logo-wrap {\n        width:\n            68px;\n\n        height:\n            34px;\n    }\n\n\n    .mx-broker-logo {\n        width:\n            64px;\n\n        height:\n            30px;\n    }\n\n\n    .mx-broker-name {\n        font-size:\n            10px;\n    }\n\n\n    .mx-broker-content {\n        gap:\n            4px;\n    }\n\n\n    .mx-broker-features {\n        font-size:\n            7px;\n    }\n\n\n    .mx-broker-verified {\n\n        font-size:\n            6px;\n\n        padding:\n            2px 4px;\n    }\n\n\n    .mx-regulator-chips {\n\n        max-width:\n            75px;\n    }\n\n\n    .mx-regulator-chip {\n\n        font-size:\n            5.5px;\n\n        padding:\n            2px 4px;\n    }\n\n}\n\n\n\n\n\n\/* =========================================================\n   MARKUNOX FINAL GRID FIX\n   Uses the actual widget width, not the browser viewport.\n========================================================= *\/\n\n#mx-ranking-app {\n    width: 100%;\n    max-width: 100%;\n    container-type: inline-size;\n    overflow: visible;\n\n    --mx-ranking-grid:\n        46px\n        minmax(210px, 1.55fr)\n        minmax(72px, .72fr)\n        minmax(108px, .95fr)\n        minmax(102px, .88fr)\n        minmax(102px, .88fr)\n        minmax(72px, .68fr);\n\n    --mx-ranking-gap: 8px;\n}\n\n#mx-ranking-app,\n#mx-ranking-app * {\n    box-sizing: border-box;\n}\n\n\/* Header and every dynamic row use exactly the same tracks. *\/\n#mx-ranking-app .mx-ranking-header,\n#mx-ranking-app .mx-ranking-row {\n    width: 100%;\n    max-width: 100%;\n\n    grid-template-columns: var(--mx-ranking-grid) !important;\n    column-gap: var(--mx-ranking-gap) !important;\n\n    align-items: center;\n}\n\n#mx-ranking-app .mx-ranking-row {\n    overflow: hidden;\n}\n\n\/* Broker *\/\n#mx-ranking-app .mx-col-broker,\n#mx-ranking-app .mx-broker-layout,\n#mx-ranking-app .mx-broker-content,\n#mx-ranking-app .mx-broker-title-row {\n    min-width: 0;\n}\n\n#mx-ranking-app .mx-broker-layout {\n    width: 100%;\n    max-width: 100%;\n\n    grid-template-columns:\n        96px\n        minmax(0, 1fr) !important;\n\n    gap: 10px !important;\n    align-items: center;\n}\n\n#mx-ranking-app .mx-broker-logo-wrap {\n    width: 96px;\n    max-width: 96px;\n}\n\n#mx-ranking-app .mx-broker-logo {\n    width: 92px;\n    max-width: 92px;\n}\n\n\/* Keep Score visually closer to Broker. *\/\n#mx-ranking-app .mx-col-score {\n    min-width: 0;\n    justify-self: center;\n}\n\n\/* Details must always stay inside the card. *\/\n#mx-ranking-app .mx-col-action {\n    width: 100%;\n    min-width: 0;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 5px;\n}\n\n#mx-ranking-app .mx-col-action a {\n    width: 66px;\n    max-width: 100%;\n    min-width: 0;\n\n    padding: 7px 6px;\n    margin: 0;\n\n    white-space: nowrap;\n}\n\n#mx-ranking-app .mx-col-action .mx-action-compare {\n    color: #001315;\n    background: #07dfe2;\n    border-color: #07dfe2;\n}\n\n#mx-ranking-app .mx-col-action .mx-action-compare:hover {\n    color: #001315;\n    background: #07dfe2;\n    border-color: #07dfe2;\n}\n\n\/* Four regulation positions, 2 \u00d7 2. *\/\n#mx-ranking-app .mx-regulator-chips {\n    width: 104px;\n    max-width: 104px;\n\n    display: grid !important;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n\n    gap: 4px;\n}\n\n#mx-ranking-app .mx-regulator-chip {\n    width: 100%;\n    min-width: 0;\n\n    padding: 3px 4px;\n\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n\n\/* Ranking tabs:\n   transparent on normal \/ active \/ hover.\n   Only the border becomes MARKUNOX green. *\/\n#mx-ranking-app .mx-rank-tabs button,\n#mx-ranking-app .mx-rank-tabs button.active,\n#mx-ranking-app .mx-rank-tabs button:hover,\n#mx-ranking-app .mx-rank-tabs button:focus,\n#mx-ranking-app .mx-rank-tabs button:focus-visible {\n    background: transparent !important;\n    box-shadow: none !important;\n}\n\n#mx-ranking-app .mx-rank-tabs button.active,\n#mx-ranking-app .mx-rank-tabs button:hover,\n#mx-ranking-app .mx-rank-tabs button:focus,\n#mx-ranking-app .mx-rank-tabs button:focus-visible {\n    border-color: #34D399 !important;\n}\n\n\/* =========================================================\n   IMPORTANT:\n   Elementor can show this widget at ~800\u2013900px wide even on\n   a large desktop viewport. Container queries handle that.\n========================================================= *\/\n\n@container (max-width: 1000px) {\n\n    #mx-ranking-app {\n        --mx-ranking-grid:\n            42px\n            minmax(195px, 1.5fr)\n            66px\n            96px\n            88px\n            88px\n            60px;\n\n        --mx-ranking-gap: 6px;\n    }\n\n    #mx-ranking-app .mx-ranking-header,\n    #mx-ranking-app .mx-ranking-row {\n        padding-left: 10px;\n        padding-right: 10px;\n    }\n\n    #mx-ranking-app .mx-broker-layout {\n        grid-template-columns:\n            82px\n            minmax(0, 1fr) !important;\n\n        gap: 7px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 82px;\n        max-width: 82px;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 78px;\n        max-width: 78px;\n    }\n\n    #mx-ranking-app .mx-broker-name {\n        font-size: 11px;\n    }\n\n    #mx-ranking-app .mx-broker-features {\n        font-size: 8px;\n    }\n\n    #mx-ranking-app .mx-regulator-chips {\n        width: 90px;\n        max-width: 90px;\n    }\n\n    #mx-ranking-app .mx-meter {\n        width: 76px;\n    }\n\n    #mx-ranking-app .mx-col-action a {\n        width: 56px;\n        font-size: 8px;\n        padding-left: 4px;\n        padding-right: 4px;\n    }\n}\n\n\/* =========================================================\n   Narrow widget \/ mobile\n========================================================= *\/\n\n@container (max-width: 720px) {\n\n    #mx-ranking-app {\n        --mx-ranking-grid:\n            38px\n            minmax(128px, 1fr)\n            58px\n            72px;\n\n        --mx-ranking-gap: 5px;\n    }\n\n    #mx-ranking-app .mx-ranking-header > div:nth-child(5),\n    #mx-ranking-app .mx-ranking-header > div:nth-child(6),\n    #mx-ranking-app .mx-ranking-header > div:nth-child(7),\n    #mx-ranking-app .mx-col-trading,\n    #mx-ranking-app .mx-col-popularity,\n    #mx-ranking-app .mx-col-action {\n        display: none !important;\n    }\n\n    #mx-ranking-app .mx-broker-layout {\n        grid-template-columns:\n            58px\n            minmax(0, 1fr) !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 58px;\n        max-width: 58px;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 55px;\n        max-width: 55px;\n        height: 28px;\n    }\n\n    #mx-ranking-app .mx-regulator-chips {\n        width: 68px;\n        max-width: 68px;\n        grid-template-columns: 1fr;\n    }\n}\n\n\n\n\/* =========================================================\n   FINAL DESKTOP ALIGNMENT FIX\n========================================================= *\/\n\n@media (min-width: 1251px) {\n\n    #mx-ranking-app .mx-ranking-header,\n    #mx-ranking-app .mx-ranking-row {\n\n        grid-template-columns:\n            5%\n            18%\n            11%\n            18%\n            17%\n            16%\n            9% !important;\n\n        column-gap: 1% !important;\n    }\n\n\n    \/* Header labels centered exactly on their columns *\/\n\n    #mx-ranking-app .mx-ranking-header > div {\n        text-align: center !important;\n        justify-self: center !important;\n    }\n\n\n    \/* Broker content stays safely inside its column *\/\n\n    #mx-ranking-app .mx-col-broker {\n        min-width: 0;\n        overflow: hidden;\n    }\n\n\n    #mx-ranking-app .mx-broker-layout {\n\n        grid-template-columns:\n            92px\n            minmax(0, 1fr) !important;\n\n        gap: 10px !important;\n    }\n\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 92px !important;\n        max-width: 92px !important;\n    }\n\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 88px !important;\n        max-width: 88px !important;\n    }\n\n}\n    #mx-ranking-app .mx-broker-layout {\n        grid-template-columns:\n            92px\n            minmax(0, 1fr) !important;\n\n        gap: 9px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 92px !important;\n        max-width: 92px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 88px !important;\n        max-width: 88px !important;\n    }\n\n    #mx-ranking-app .mx-col-score,\n    #mx-ranking-app .mx-col-regulation,\n    #mx-ranking-app .mx-col-trading,\n    #mx-ranking-app .mx-col-popularity,\n    #mx-ranking-app .mx-col-action {\n        justify-self: stretch;\n        width: 100%;\n    }\n\n    #mx-ranking-app .mx-col-action a {\n        width: 72px !important;\n        max-width: 100% !important;\n    }\n}\n\n\/* =========================================\n   FINAL BROKER NAME + VERIFIED FIX\n========================================= *\/\n\n@media (min-width: 1251px) {\n\n    #mx-ranking-app .mx-col-broker {\n        overflow: visible !important;\n    }\n\n    #mx-ranking-app .mx-broker-layout {\n        grid-template-columns:\n            70px\n            minmax(0, 1fr) !important;\n\n        gap: 6px !important;\n\n        overflow: visible !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 70px !important;\n        max-width: 70px !important;\n\n        overflow: visible !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 68px !important;\n        max-width: 68px !important;\n        height: 42px !important;\n    }\n\n    #mx-ranking-app .mx-broker-content {\n        min-width: 0 !important;\n        overflow: visible !important;\n    }\n\n    #mx-ranking-app .mx-broker-title-row {\n        display: flex !important;\n        align-items: center !important;\n\n        width: max-content !important;\n        max-width: none !important;\n\n        gap: 5px !important;\n\n        white-space: nowrap !important;\n        overflow: visible !important;\n    }\n\n    #mx-ranking-app .mx-broker-name {\n        flex: none !important;\n\n        font-size: 13px !important;\n\n        white-space: nowrap !important;\n    }\n\n    #mx-ranking-app .mx-broker-verified {\n        flex: none !important;\n\n        width: auto !important;\n        max-width: none !important;\n\n        padding: 3px 5px !important;\n\n        font-size: 6px !important;\n        line-height: 1 !important;\n\n        white-space: nowrap !important;\n        overflow: visible !important;\n    }\n}\n\n\n\n\n\n\n\/* =========================================================\n   PERFORMANCE + SKELETON\n========================================================= *\/\n\n#mx-ranking-app .mx-ranking-row {\n    content-visibility: auto;\n    contain-intrinsic-size: 118px;\n}\n\n#mx-ranking-app .mx-ranking-skeleton {\n    pointer-events: none;\n    user-select: none;\n}\n\n#mx-ranking-app .mx-ranking-skeleton,\n#mx-ranking-app .mx-ranking-skeleton * {\n    overflow: hidden;\n}\n\n#mx-ranking-app .mx-skeleton-circle,\n#mx-ranking-app .mx-skeleton-logo,\n#mx-ranking-app .mx-skeleton-line,\n#mx-ranking-app .mx-skeleton-button {\n    display: block;\n    position: relative;\n    background: #111B28;\n    background-image:\n        linear-gradient(\n            90deg,\n            rgba(255,255,255,0) 0%,\n            rgba(255,255,255,.055) 50%,\n            rgba(255,255,255,0) 100%\n        );\n    background-size: 220% 100%;\n    animation: mxRankingSkeleton 1.35s linear infinite;\n}\n\n#mx-ranking-app .mx-skeleton-circle {\n    width: 34px;\n    height: 34px;\n    border-radius: 50%;\n}\n\n#mx-ranking-app .mx-skeleton-broker {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    min-width: 0;\n}\n\n#mx-ranking-app .mx-skeleton-logo {\n    width: 68px;\n    height: 38px;\n    border-radius: 7px;\n    flex: 0 0 auto;\n}\n\n#mx-ranking-app .mx-skeleton-lines {\n    width: 100%;\n    max-width: 110px;\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n}\n\n#mx-ranking-app .mx-skeleton-line {\n    height: 8px;\n    border-radius: 999px;\n}\n\n#mx-ranking-app .mx-skeleton-line.wide {\n    width: 88px;\n}\n\n#mx-ranking-app .mx-skeleton-line.medium {\n    width: 52px;\n}\n\n#mx-ranking-app .mx-skeleton-line.short {\n    width: 36px;\n}\n\n#mx-ranking-app .mx-skeleton-line.center {\n    margin-left: auto;\n    margin-right: auto;\n}\n\n#mx-ranking-app .mx-skeleton-button {\n    width: 58px;\n    height: 28px;\n    margin: 0 auto;\n    border-radius: 7px;\n}\n\n@keyframes mxRankingSkeleton {\n    0% {\n        background-position: 200% 0;\n    }\n\n    100% {\n        background-position: -20% 0;\n    }\n}\n\n@media (prefers-reduced-motion: reduce) {\n    #mx-ranking-app .mx-skeleton-circle,\n    #mx-ranking-app .mx-skeleton-logo,\n    #mx-ranking-app .mx-skeleton-line,\n    #mx-ranking-app .mx-skeleton-button {\n        animation: none;\n    }\n}\n\n\n\n\/* =========================================================\n   READABILITY UPGRADE\n========================================================= *\/\n\n#mx-ranking-app {\n    font-size: 13px;\n}\n\n#mx-ranking-app .mx-rank-tabs button {\n    font-size: 14px !important;\n    font-weight: 800 !important;\n    min-height: 50px;\n}\n\n#mx-ranking-app .mx-rank-toolbar select,\n#mx-ranking-app .mx-filter-button {\n    font-size: 13px !important;\n    font-weight: 700;\n}\n\n#mx-ranking-app .mx-last-update {\n    font-size: 12px !important;\n}\n\n#mx-ranking-app .mx-ranking-header {\n    font-size: 12px !important;\n    font-weight: 800;\n    letter-spacing: .15px;\n}\n\n#mx-ranking-app .mx-broker-name {\n    font-size: 15px !important;\n    font-weight: 900 !important;\n    line-height: 1.15 !important;\n}\n\n#mx-ranking-app .mx-broker-verified {\n    font-size: 8px !important;\n    font-weight: 900 !important;\n    padding: 4px 6px !important;\n}\n\n#mx-ranking-app .mx-broker-features {\n    font-size: 10px !important;\n    line-height: 1.45 !important;\n}\n\n#mx-ranking-app .mx-col-score strong {\n    font-size: 19px !important;\n}\n\n#mx-ranking-app .mx-stars {\n    font-size: 12px !important;\n}\n\n#mx-ranking-app .mx-metric-score {\n    font-size: 13px !important;\n    line-height: 1.15 !important;\n}\n\n#mx-ranking-app .mx-regulated,\n#mx-ranking-app .mx-regulation-na {\n    font-size: 10px !important;\n    font-weight: 900 !important;\n}\n\n#mx-ranking-app .mx-regulator-chip {\n    font-size: 8px !important;\n    font-weight: 800 !important;\n    min-height: 22px;\n}\n\n#mx-ranking-app .mx-quality {\n    font-size: 10px !important;\n    font-weight: 800 !important;\n}\n\n#mx-ranking-app .mx-source-native-note {\n    font-size: 9px !important;\n    font-weight: 800 !important;\n}\n\n#mx-ranking-app .mx-col-action a {\n    font-size: 11px !important;\n    font-weight: 800 !important;\n}\n\n#mx-ranking-app .mx-ranking-state {\n    font-size: 13px !important;\n}\n\n#mx-ranking-app .mx-filter-grid label > span {\n    font-size: 11px !important;\n    font-weight: 700;\n}\n\n#mx-ranking-app .mx-filter-grid input[type=\"text\"],\n#mx-ranking-app .mx-filter-grid select,\n#mx-ranking-app .mx-filter-actions button {\n    font-size: 12px !important;\n}\n\n@container (max-width: 1000px) {\n    #mx-ranking-app .mx-broker-name {\n        font-size: 13px !important;\n    }\n\n    #mx-ranking-app .mx-broker-features {\n        font-size: 9px !important;\n    }\n\n    #mx-ranking-app .mx-ranking-header {\n        font-size: 11px !important;\n    }\n\n    #mx-ranking-app .mx-regulator-chip {\n        font-size: 7px !important;\n    }\n}\n\n@container (max-width: 720px) {\n    #mx-ranking-app .mx-rank-tabs button {\n        font-size: 12px !important;\n    }\n\n    #mx-ranking-app .mx-broker-name {\n        font-size: 12px !important;\n    }\n\n    #mx-ranking-app .mx-broker-features {\n        font-size: 8px !important;\n    }\n\n    #mx-ranking-app .mx-col-score strong {\n        font-size: 16px !important;\n    }\n\n    #mx-ranking-app .mx-metric-score {\n        font-size: 11px !important;\n    }\n\n    #mx-ranking-app .mx-ranking-header {\n        font-size: 10px !important;\n    }\n}\n\n\n\n\/* =========================================================\n   CATEGORY + FILTER HOVER\n========================================================= *\/\n\n#mx-ranking-app #mx-rank-category,\n#mx-ranking-app #mx-filter-toggle {\n    transition:\n        background-color .18s ease,\n        border-color .18s ease,\n        color .18s ease;\n}\n\n#mx-ranking-app #mx-rank-category:hover,\n#mx-ranking-app #mx-filter-toggle:hover {\n    background: #07DFE2 !important;\n    border-color: #07DFE2 !important;\n    color: #02060C !important;\n}\n\n#mx-ranking-app #mx-filter-toggle:focus,\n#mx-ranking-app #mx-filter-toggle:focus-visible,\n#mx-ranking-app #mx-rank-category:focus {\n    border-color: #07DFE2 !important;\n}\n\n\n\n\/* =========================================================\n   CATEGORY DROPDOWN FINAL COLORS\n========================================================= *\/\n\n#mx-ranking-app #mx-rank-category {\n    background: #02060C !important;\n    color: #E2E8F0 !important;\n    border-color: #172333 !important;\n}\n\n#mx-ranking-app #mx-rank-category:hover {\n    background: #02060C !important;\n    color: #E2E8F0 !important;\n    border-color: #07DFE2 !important;\n}\n\n#mx-ranking-app #mx-rank-category option {\n    background: #02060C !important;\n    color: #E2E8F0 !important;\n}\n\n#mx-ranking-app #mx-rank-category option:hover,\n#mx-ranking-app #mx-rank-category option:focus,\n#mx-ranking-app #mx-rank-category option:checked {\n    background: #07DFE2 !important;\n    color: #02060C !important;\n}\n\n#mx-ranking-app #mx-filter-toggle {\n    background: #02060C !important;\n    color: #E2E8F0 !important;\n}\n\n#mx-ranking-app #mx-filter-toggle:hover {\n    background: #07DFE2 !important;\n    border-color: #07DFE2 !important;\n    color: #02060C !important;\n}\n\n\n\n\/* =========================================================\n   CUSTOM CATEGORY DROPDOWN\n   No native blue selection state\n========================================================= *\/\n\n#mx-ranking-app .mx-category-custom {\n    position: relative;\n    width: 150px;\n}\n\n#mx-ranking-app #mx-rank-category {\n    position: absolute !important;\n    width: 1px !important;\n    height: 1px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n}\n\n#mx-ranking-app .mx-category-button {\n    width: 100%;\n    height: 42px;\n    padding: 0 13px;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 10px;\n    border: 1px solid #172333;\n    border-radius: 7px;\n    background: #02060C;\n    color: #E2E8F0;\n    font-size: 13px;\n    font-weight: 700;\n    cursor: pointer;\n    transition:\n        border-color .18s ease,\n        background-color .18s ease,\n        color .18s ease;\n}\n\n#mx-ranking-app .mx-category-button:hover,\n#mx-ranking-app .mx-category-button:focus,\n#mx-ranking-app .mx-category-button:focus-visible {\n    background: #02060C !important;\n    color: #E2E8F0 !important;\n    border-color: #07DFE2 !important;\n    outline: none;\n}\n\n#mx-ranking-app .mx-category-chevron {\n    color: #E2E8F0;\n    font-size: 15px;\n    line-height: 1;\n}\n\n#mx-ranking-app .mx-category-menu {\n    display: none;\n    position: absolute;\n    top: calc(100% + 1px);\n    left: 0;\n    z-index: 10020;\n    width: 100%;\n    max-height: 360px;\n    overflow-y: auto;\n    padding: 0;\n    border: 1px solid #253B59;\n    border-radius: 0;\n    background: #02060C;\n    box-shadow: 0 16px 40px rgba(0,0,0,.45);\n}\n\n#mx-ranking-app .mx-category-menu.open {\n    display: block;\n}\n\n#mx-ranking-app .mx-category-option {\n    width: 100%;\n    min-height: 36px;\n    padding: 8px 16px;\n    display: block;\n    border: 0;\n    border-radius: 0;\n    background: #02060C !important;\n    color: #FFFFFF !important;\n    text-align: left;\n    font-size: 12px;\n    font-weight: 500;\n    cursor: pointer;\n    box-shadow: none !important;\n    outline: none !important;\n}\n\n#mx-ranking-app .mx-category-option:hover,\n#mx-ranking-app .mx-category-option:focus,\n#mx-ranking-app .mx-category-option:focus-visible,\n#mx-ranking-app .mx-category-option.active {\n    background: #07DFE2 !important;\n    color: #02060C !important;\n}\n\n#mx-ranking-app .mx-category-menu::-webkit-scrollbar {\n    width: 6px;\n}\n\n#mx-ranking-app .mx-category-menu::-webkit-scrollbar-track {\n    background: #02060C;\n}\n\n#mx-ranking-app .mx-category-menu::-webkit-scrollbar-thumb {\n    background: #172333;\n    border-radius: 999px;\n}\n\n@container (max-width: 720px) {\n    #mx-ranking-app .mx-category-custom {\n        width: 100%;\n    }\n}\n\n\n\n\/* =========================================================\n   REMOVE BLUE INTERACTION STATES\n========================================================= *\/\n\n#mx-ranking-app {\n    --mx-accent: #07DFE2;\n    --mx-dark: #02060C;\n}\n\n#mx-ranking-app button,\n#mx-ranking-app select,\n#mx-ranking-app input {\n    -webkit-tap-highlight-color: transparent;\n}\n\n#mx-ranking-app input[type=\"checkbox\"] {\n    accent-color: #07DFE2;\n}\n\n\/* Reset is no longer blue. *\/\n#mx-ranking-app #mx-filter-reset {\n    background: #02060C !important;\n    border-color: #253B59 !important;\n    color: #CBD5E1 !important;\n}\n\n#mx-ranking-app #mx-filter-reset:hover,\n#mx-ranking-app #mx-filter-reset:focus,\n#mx-ranking-app #mx-filter-reset:focus-visible,\n#mx-ranking-app #mx-filter-reset:active {\n    background: #07DFE2 !important;\n    border-color: #07DFE2 !important;\n    color: #02060C !important;\n    outline: none !important;\n    box-shadow: none !important;\n}\n\n\/* Apply keeps the MARKUNOX turquoise, never browser blue. *\/\n#mx-ranking-app #mx-filter-apply,\n#mx-ranking-app #mx-filter-apply:hover,\n#mx-ranking-app #mx-filter-apply:focus,\n#mx-ranking-app #mx-filter-apply:focus-visible,\n#mx-ranking-app #mx-filter-apply:active {\n    background: #07DFE2 !important;\n    border-color: #07DFE2 !important;\n    color: #02060C !important;\n    outline: none !important;\n    box-shadow: none !important;\n}\n\n\/* Hidden native selects remove OS\/browser blue dropdown states. *\/\n#mx-ranking-app .mx-native-hidden-select {\n    position: absolute !important;\n    width: 1px !important;\n    height: 1px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n}\n\n\/* Country + Score custom dropdowns. *\/\n#mx-ranking-app .mx-custom-select {\n    position: relative;\n    width: 100%;\n}\n\n#mx-ranking-app .mx-custom-select-button {\n    width: 100%;\n    height: 38px;\n    padding: 0 10px;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 8px;\n    border: 1px solid #1A2B40;\n    border-radius: 7px;\n    background: #02060C !important;\n    color: #FFFFFF !important;\n    font-size: 12px;\n    cursor: pointer;\n    outline: none !important;\n    box-shadow: none !important;\n}\n\n#mx-ranking-app .mx-custom-select-button:hover,\n#mx-ranking-app .mx-custom-select-button:focus,\n#mx-ranking-app .mx-custom-select-button:focus-visible,\n#mx-ranking-app .mx-custom-select-button:active {\n    background: #02060C !important;\n    border-color: #07DFE2 !important;\n    color: #FFFFFF !important;\n    outline: none !important;\n    box-shadow: none !important;\n}\n\n#mx-ranking-app .mx-custom-select-menu {\n    display: none;\n    position: absolute;\n    top: calc(100% + 2px);\n    left: 0;\n    z-index: 10030;\n    width: 100%;\n    max-height: 260px;\n    overflow-y: auto;\n    border: 1px solid #253B59;\n    background: #02060C;\n    box-shadow: 0 16px 40px rgba(0,0,0,.45);\n}\n\n#mx-ranking-app .mx-custom-select-menu.open {\n    display: block;\n}\n\n#mx-ranking-app .mx-custom-select-option {\n    width: 100%;\n    min-height: 36px;\n    padding: 8px 12px;\n    border: 0;\n    border-radius: 0;\n    background: #02060C !important;\n    color: #FFFFFF !important;\n    text-align: left;\n    font-size: 12px;\n    cursor: pointer;\n    outline: none !important;\n    box-shadow: none !important;\n}\n\n#mx-ranking-app .mx-custom-select-option:hover,\n#mx-ranking-app .mx-custom-select-option:focus,\n#mx-ranking-app .mx-custom-select-option:focus-visible,\n#mx-ranking-app .mx-custom-select-option.active {\n    background: #07DFE2 !important;\n    color: #02060C !important;\n}\n\n\/* Remove any blue focus\/background from category custom dropdown too. *\/\n#mx-ranking-app .mx-category-option,\n#mx-ranking-app .mx-category-option:active {\n    box-shadow: none !important;\n    outline: none !important;\n}\n\n#mx-ranking-app .mx-category-option:hover,\n#mx-ranking-app .mx-category-option:focus,\n#mx-ranking-app .mx-category-option:focus-visible,\n#mx-ranking-app .mx-category-option.active {\n    background: #07DFE2 !important;\n    color: #02060C !important;\n}\n\n\n\n\/* =========================================================\n   CUSTOM CHECKBOXES\n========================================================= *\/\n\n#mx-ranking-app .mx-check {\n    position: relative;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    cursor: pointer;\n    user-select: none;\n}\n\n#mx-ranking-app .mx-check input[type=\"checkbox\"] {\n    position: absolute !important;\n    opacity: 0 !important;\n    width: 1px !important;\n    height: 1px !important;\n    pointer-events: none !important;\n}\n\n#mx-ranking-app .mx-check-box {\n    width: 16px;\n    height: 16px;\n    flex: 0 0 16px;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    border: 1px solid #64748B;\n    border-radius: 3px;\n    background: #02060C;\n    transition:\n        background-color .15s ease,\n        border-color .15s ease,\n        box-shadow .15s ease;\n}\n\n#mx-ranking-app .mx-check-box::after {\n    content: \"\u2713\";\n    display: block;\n    color: #02060C;\n    font-size: 12px;\n    font-weight: 900;\n    line-height: 1;\n    opacity: 0;\n    transform: scale(.7);\n    transition:\n        opacity .12s ease,\n        transform .12s ease;\n}\n\n#mx-ranking-app .mx-check input[type=\"checkbox\"]:checked + .mx-check-box {\n    background: #07DFE2;\n    border-color: #07DFE2;\n    box-shadow: 0 0 0 2px rgba(7,223,226,.08);\n}\n\n#mx-ranking-app .mx-check input[type=\"checkbox\"]:checked + .mx-check-box::after {\n    opacity: 1;\n    transform: scale(1);\n}\n\n#mx-ranking-app .mx-check:hover .mx-check-box {\n    border-color: #07DFE2;\n}\n\n#mx-ranking-app .mx-check input[type=\"checkbox\"]:focus-visible + .mx-check-box {\n    outline: 2px solid rgba(7,223,226,.35);\n    outline-offset: 2px;\n}\n\n#mx-ranking-app .mx-check-label {\n    margin: 0 !important;\n    color: #94A3B8;\n    font-size: 11px;\n    font-weight: 700;\n    line-height: 1.2;\n}\n\n#mx-ranking-app .mx-check input[type=\"checkbox\"]:checked ~ .mx-check-label {\n    color: #E2E8F0;\n}\n\n\n\n\/* =========================================================\n   VERIFIED BADGE COLUMN ALIGNMENT\n========================================================= *\/\n\n#mx-ranking-app .mx-broker-title-row {\n    display: grid !important;\n    grid-template-columns: 110px auto !important;\n    align-items: center !important;\n    justify-content: start !important;\n    column-gap: 6px !important;\n    width: max-content !important;\n    max-width: none !important;\n    white-space: nowrap !important;\n    overflow: visible !important;\n}\n\n#mx-ranking-app .mx-broker-name {\n    width: 110px !important;\n    min-width: 110px !important;\n    max-width: 110px !important;\n    white-space: nowrap !important;\n    overflow: visible !important;\n}\n\n#mx-ranking-app .mx-broker-verified {\n    margin: 0 !important;\n    justify-self: start !important;\n    flex: none !important;\n    white-space: nowrap !important;\n}\n\n@container (max-width: 720px) {\n    #mx-ranking-app .mx-broker-title-row {\n        grid-template-columns: 92px auto !important;\n        column-gap: 5px !important;\n    }\n\n    #mx-ranking-app .mx-broker-name {\n        width: 92px !important;\n        min-width: 92px !important;\n        max-width: 92px !important;\n        font-size: 12px !important;\n    }\n\n    #mx-ranking-app .mx-broker-verified {\n        font-size: 6px !important;\n        padding: 3px 4px !important;\n    }\n}\n\n\n\n\/* =========================================================\n   VERIFIED BADGE RESPONSIVE CONTAINMENT FIX\n   Keeps badge on the same line without crossing into Score.\n========================================================= *\/\n\n#mx-ranking-app .mx-broker-content {\n    min-width: 0 !important;\n    max-width: 100% !important;\n    overflow: hidden !important;\n}\n\n#mx-ranking-app .mx-broker-title-row {\n    display: grid !important;\n    grid-template-columns: minmax(0, 1fr) auto !important;\n    align-items: center !important;\n    column-gap: 5px !important;\n\n    width: 100% !important;\n    max-width: 100% !important;\n    min-width: 0 !important;\n\n    white-space: nowrap !important;\n    overflow: hidden !important;\n}\n\n#mx-ranking-app .mx-broker-name {\n    width: auto !important;\n    min-width: 0 !important;\n    max-width: 100% !important;\n\n    overflow: hidden !important;\n    text-overflow: ellipsis !important;\n    white-space: nowrap !important;\n}\n\n#mx-ranking-app .mx-broker-verified {\n    width: auto !important;\n    min-width: max-content !important;\n    max-width: max-content !important;\n\n    margin: 0 !important;\n    justify-self: end !important;\n\n    white-space: nowrap !important;\n    overflow: visible !important;\n}\n\n\n\/* Medium widget widths *\/\n@container (max-width: 1250px) {\n\n    #mx-ranking-app .mx-broker-title-row {\n        column-gap: 4px !important;\n    }\n\n    #mx-ranking-app .mx-broker-verified {\n        font-size: 6px !important;\n        padding: 3px 4px !important;\n    }\n}\n\n\n\/* Compact widget widths *\/\n@container (max-width: 1000px) {\n\n    #mx-ranking-app .mx-broker-layout {\n        grid-template-columns:\n            72px\n            minmax(0, 1fr) !important;\n\n        gap: 6px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 72px !important;\n        max-width: 72px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 68px !important;\n        max-width: 68px !important;\n    }\n\n    #mx-ranking-app .mx-broker-name {\n        font-size: 10px !important;\n    }\n\n    #mx-ranking-app .mx-broker-verified {\n        font-size: 5px !important;\n        padding: 2px 3px !important;\n    }\n}\n\n\n\/* Narrow\/mobile widget widths *\/\n@container (max-width: 720px) {\n\n    #mx-ranking-app .mx-broker-layout {\n        grid-template-columns:\n            54px\n            minmax(0, 1fr) !important;\n\n        gap: 5px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo-wrap {\n        width: 54px !important;\n        max-width: 54px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        width: 51px !important;\n        max-width: 51px !important;\n    }\n\n    #mx-ranking-app .mx-broker-name {\n        font-size: 10px !important;\n    }\n\n    #mx-ranking-app .mx-broker-verified {\n        font-size: 5px !important;\n        padding: 2px 3px !important;\n    }\n}\n\n<\/style>\n\n<!-- =========================================================\n     MARKUNOX - FINAL BROKER NAME + ACTION SPACING FIX\n     Only fixes:\n     1) Full broker names (no ellipsis\/truncation)\n     2) Details \/ Compare spacing and containment\n========================================================= -->\n<style>\n\n\/* FULL BROKER NAME *\/\n#mx-ranking-app .mx-broker-content,\n#mx-ranking-app .mx-broker-title-row,\n#mx-ranking-app .mx-broker-name {\n    overflow: visible !important;\n}\n\n#mx-ranking-app .mx-broker-title-row {\n    width: 100% !important;\n    max-width: 100% !important;\n    min-width: 0 !important;\n\n    display: grid !important;\n    grid-template-columns: minmax(0, 1fr) auto !important;\n    align-items: start !important;\n    column-gap: 6px !important;\n\n    white-space: normal !important;\n}\n\n#mx-ranking-app .mx-broker-name {\n    width: auto !important;\n    min-width: 0 !important;\n    max-width: 100% !important;\n\n    white-space: normal !important;\n    overflow: visible !important;\n    text-overflow: clip !important;\n    overflow-wrap: anywhere !important;\n    word-break: normal !important;\n\n    line-height: 1.2 !important;\n}\n\n#mx-ranking-app .mx-broker-verified {\n    align-self: start !important;\n    justify-self: start !important;\n    flex: none !important;\n    white-space: nowrap !important;\n}\n\n\n\/* DESKTOP: more real width for Action *\/\n@media (min-width: 1251px) {\n\n    #mx-ranking-app .mx-ranking-header,\n    #mx-ranking-app .mx-ranking-row {\n        grid-template-columns:\n            5%\n            19%\n            9%\n            17%\n            16%\n            14%\n            14% !important;\n\n        column-gap: 1% !important;\n    }\n\n    #mx-ranking-app .mx-col-action {\n        width: 100% !important;\n        min-width: 0 !important;\n\n        display: flex !important;\n        align-items: center !important;\n        justify-content: center !important;\n\n        gap: 10px !important;\n\n        padding-left: 4px !important;\n        padding-right: 8px !important;\n\n        overflow: visible !important;\n    }\n\n    #mx-ranking-app .mx-col-action a {\n        flex: 0 0 auto !important;\n\n        width: auto !important;\n        min-width: 66px !important;\n        max-width: none !important;\n\n        min-height: 32px !important;\n\n        padding: 7px 10px !important;\n        margin: 0 !important;\n\n        white-space: nowrap !important;\n    }\n\n    #mx-ranking-app .mx-col-action .mx-action-compare {\n        margin-right: 2px !important;\n    }\n}\n\n\n\/* MEDIUM WIDGET WIDTHS *\/\n@container (min-width: 721px) and (max-width: 1250px) {\n\n    #mx-ranking-app {\n        --mx-ranking-grid:\n            42px\n            minmax(210px, 1.55fr)\n            66px\n            96px\n            88px\n            88px\n            132px !important;\n    }\n\n    #mx-ranking-app .mx-col-action {\n        display: flex !important;\n        align-items: center !important;\n        justify-content: center !important;\n\n        gap: 6px !important;\n\n        width: 100% !important;\n        min-width: 0 !important;\n\n        padding-right: 4px !important;\n    }\n\n    #mx-ranking-app .mx-col-action a {\n        width: auto !important;\n        min-width: 56px !important;\n        max-width: none !important;\n\n        padding-left: 6px !important;\n        padding-right: 6px !important;\n\n        margin: 0 !important;\n        white-space: nowrap !important;\n    }\n}\n\n<\/style>\n\n\n<!-- =========================================================\n     MARKUNOX - BROKER LOGO NEUTRAL BACKGROUND\n     Makes both dark and light broker logos readable.\n========================================================= -->\n<style>\n#mx-ranking-app .mx-broker-logo-wrap {\n    background:\n        linear-gradient(\n            145deg,\n            #AEB5BF 0%,\n            #929AA6 100%\n        ) !important;\n\n    border: 1px solid rgba(255, 255, 255, .14) !important;\n    border-radius: 9px !important;\n\n    padding: 6px 8px !important;\n\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n\n    overflow: hidden !important;\n\n    box-shadow:\n        inset 0 1px 0 rgba(255,255,255,.12),\n        0 3px 10px rgba(0,0,0,.12) !important;\n}\n\n#mx-ranking-app .mx-broker-logo {\n    width: 100% !important;\n    max-width: 92px !important;\n    height: 100% !important;\n    max-height: 44px !important;\n\n    object-fit: contain !important;\n    object-position: center center !important;\n\n    filter: none !important;\n}\n\n\/* Slightly more compact at medium widget widths *\/\n@container (max-width: 1000px) {\n    #mx-ranking-app .mx-broker-logo-wrap {\n        padding: 5px 6px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        max-width: 64px !important;\n        max-height: 38px !important;\n    }\n}\n\n\/* Mobile *\/\n@container (max-width: 720px) {\n    #mx-ranking-app .mx-broker-logo-wrap {\n        padding: 4px 5px !important;\n        border-radius: 7px !important;\n    }\n\n    #mx-ranking-app .mx-broker-logo {\n        max-width: 48px !important;\n        max-height: 27px !important;\n    }\n}\n<\/style>\n\n\n<!-- =========================================================\n     MARKUNOX - FAST TAB INTERACTION\n========================================================= -->\n<style>\n#mx-ranking-app .mx-rank-tabs button {\n    transition:\n        border-color .08s ease,\n        color .08s ease !important;\n}\n\n#mx-ranking-app .mx-rank-tabs button:active {\n    transform: none !important;\n}\n<\/style>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/section>\n<div class=\"elementor-element elementor-element-2e7fed9 e-con e-atomic-element e-flexbox-base e-default-div e-c74f968 \" data-id=\"2e7fed9\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"2e7fed9\" data-e-type=\"e-flexbox\" data-id=\"2e7fed9\">\n    <div class=\"elementor-element elementor-element-e9490e6 e-con-full e-flex e-con e-parent\" data-id=\"e9490e6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6b4a667 elementor-widget elementor-widget-html\" data-id=\"6b4a667\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"mx-ai-hub\">\r\n\r\n  <div class=\"mxah-head\">\r\n\r\n    <div>\r\n\r\n      <span class=\"mxah-eyebrow\">\r\n        MARKUNOX AI\r\n      <\/span>\r\n\r\n      <h2>\r\n        Financial Intelligence Suite\r\n      <\/h2>\r\n\r\n      <p>\r\n        Professional AI tools for market analysis, trading scenarios,\r\n        strategy building and broker intelligence.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"mxah-live\">\r\n      <span><\/span>\r\n      AI SYSTEMS\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n\r\n  <div class=\"mxah-grid\">\r\n\r\n\r\n    <!-- CHART ANALYZER -->\r\n\r\n    <article\r\n      class=\"mxah-card mxah-card-chart\"\r\n      data-tool=\"chart\"\r\n    >\r\n\r\n      <div class=\"mxah-card-glow\"><\/div>\r\n\r\n      <div class=\"mxah-card-top\">\r\n\r\n        <div class=\"mxah-icon\">\r\n          \u2301\r\n        <\/div>\r\n\r\n        <span class=\"mxah-tool-number\">\r\n          AI 01\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"mxah-card-body\">\r\n\r\n        <span class=\"mxah-card-kicker\">\r\n          VISUAL MARKET INTELLIGENCE\r\n        <\/span>\r\n\r\n        <h3>\r\n          AI Chart Analyzer\r\n        <\/h3>\r\n\r\n        <p>\r\n          Upload a trading chart and receive a structured technical\r\n          scenario with market bias, entry zones, risk levels,\r\n          targets and invalidation logic.\r\n        <\/p>\r\n\r\n        <div class=\"mxah-tags\">\r\n\r\n          <span>Chart Vision<\/span>\r\n          <span>Entry<\/span>\r\n          <span>SL \/ TP<\/span>\r\n          <span>Risk<\/span>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <button\r\n        class=\"mxah-open\"\r\n        type=\"button\"\r\n        data-open=\"chart\"\r\n      >\r\n        Analyze Chart\r\n        <b>\u2197<\/b>\r\n      <\/button>\r\n\r\n    <\/article>\r\n\r\n\r\n    <!-- STRATEGY INTERVIEW -->\r\n\r\n    <article\r\n      class=\"mxah-card mxah-card-strategy\"\r\n      data-tool=\"strategy\"\r\n    >\r\n\r\n      <div class=\"mxah-card-glow\"><\/div>\r\n\r\n      <div class=\"mxah-card-top\">\r\n\r\n        <div class=\"mxah-icon\">\r\n          \u25c8\r\n        <\/div>\r\n\r\n        <span class=\"mxah-tool-number\">\r\n          AI 02\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"mxah-card-body\">\r\n\r\n        <span class=\"mxah-card-kicker\">\r\n          PERSONALIZED STRATEGY ENGINE\r\n        <\/span>\r\n\r\n        <h3>\r\n          AI Strategy Interview\r\n        <\/h3>\r\n\r\n        <p>\r\n          Answer a focused set of trading questions and generate\r\n          a scenario tailored to your experience, capital, risk\r\n          tolerance and preferred market style.\r\n        <\/p>\r\n\r\n        <div class=\"mxah-tags\">\r\n\r\n          <span>Adaptive<\/span>\r\n          <span>Risk Profile<\/span>\r\n          <span>Strategy<\/span>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <button\r\n        class=\"mxah-open\"\r\n        type=\"button\"\r\n        data-open=\"strategy\"\r\n      >\r\n        Start Interview\r\n        <b>\u2197<\/b>\r\n      <\/button>\r\n\r\n    <\/article>\r\n\r\n\r\n    <!-- TRADE SCENARIO -->\r\n\r\n    <article\r\n      class=\"mxah-card mxah-card-scenario\"\r\n      data-tool=\"scenario\"\r\n    >\r\n\r\n      <div class=\"mxah-card-glow\"><\/div>\r\n\r\n      <div class=\"mxah-card-top\">\r\n\r\n        <div class=\"mxah-icon\">\r\n          \u27c1\r\n        <\/div>\r\n\r\n        <span class=\"mxah-tool-number\">\r\n          AI 03\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"mxah-card-body\">\r\n\r\n        <span class=\"mxah-card-kicker\">\r\n          STRUCTURED TRADE ENGINE\r\n        <\/span>\r\n\r\n        <h3>\r\n          AI Trade Scenario\r\n        <\/h3>\r\n\r\n        <p>\r\n          Generate an instant trading scenario using symbol,\r\n          timeframe, direction, trading style and risk preference.\r\n        <\/p>\r\n\r\n        <div class=\"mxah-tags\">\r\n\r\n          <span>Bias<\/span>\r\n          <span>Entry<\/span>\r\n          <span>Targets<\/span>\r\n          <span>R:R<\/span>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <button\r\n        class=\"mxah-open\"\r\n        type=\"button\"\r\n        data-open=\"scenario\"\r\n      >\r\n        Generate Scenario\r\n        <b>\u2197<\/b>\r\n      <\/button>\r\n\r\n    <\/article>\r\n\r\n\r\n    <!-- BROKER FINDER -->\r\n\r\n    <article\r\n      class=\"mxah-card mxah-card-finder\"\r\n      data-tool=\"finder\"\r\n    >\r\n\r\n      <div class=\"mxah-card-glow\"><\/div>\r\n\r\n      <div class=\"mxah-card-top\">\r\n\r\n        <div class=\"mxah-icon\">\r\n          \u25ce\r\n        <\/div>\r\n\r\n        <span class=\"mxah-tool-number\">\r\n          AI 04\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"mxah-card-body\">\r\n\r\n        <span class=\"mxah-card-kicker\">\r\n          BROKER INTELLIGENCE MATCHING\r\n        <\/span>\r\n\r\n        <h3>\r\n          AI Broker & Exchange Finder\r\n        <\/h3>\r\n\r\n        <p>\r\n          Find brokers and exchanges that match your region,\r\n          asset class, platform, regulation preference,\r\n          deposit size and trading requirements.\r\n        <\/p>\r\n\r\n        <div class=\"mxah-tags\">\r\n\r\n          <span>Matching<\/span>\r\n          <span>Regulation<\/span>\r\n          <span>Compare<\/span>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <button\r\n        class=\"mxah-open\"\r\n        type=\"button\"\r\n        data-open=\"finder\"\r\n      >\r\n        Find My Match\r\n        <b>\u2197<\/b>\r\n      <\/button>\r\n\r\n    <\/article>\r\n\r\n  <\/div>\r\n\r\n\r\n  <div\r\n    id=\"mxah-modal\"\r\n    class=\"mxah-modal\"\r\n    aria-hidden=\"true\"\r\n  >\r\n\r\n    <div\r\n      class=\"mxah-modal-backdrop\"\r\n      data-close\r\n    ><\/div>\r\n\r\n    <div class=\"mxah-panel\">\r\n\r\n      <div class=\"mxah-panel-head\">\r\n\r\n        <div>\r\n\r\n          <span\r\n            id=\"mxah-modal-label\"\r\n            class=\"mxah-eyebrow\"\r\n          >\r\n            MARKUNOX AI\r\n          <\/span>\r\n\r\n          <h3 id=\"mxah-modal-title\">\r\n            AI Tool\r\n          <\/h3>\r\n\r\n        <\/div>\r\n\r\n        <button\r\n          class=\"mxah-close\"\r\n          type=\"button\"\r\n          data-close\r\n          aria-label=\"Close\"\r\n        >\u00d7<\/button>\r\n\r\n      <\/div>\r\n\r\n      <div id=\"mxah-panel-content\"><\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<link\r\n  rel=\"preconnect\"\r\n  href=\"https:\/\/fonts.googleapis.com\"\r\n>\r\n\r\n<link\r\n  rel=\"preconnect\"\r\n  href=\"https:\/\/fonts.gstatic.com\"\r\n  crossorigin\r\n>\r\n\r\n<link\r\n  href=\"https:\/\/fonts.googleapis.com\/css2?family=Noto+Rashi+Hebrew:wght@400;500;600;700&amp;display=swap\"\r\n  rel=\"stylesheet\"\r\n>\r\n\r\n\r\n<style>\r\n\r\n#mx-ai-hub{\r\n  --mx-bg:#020408;\r\n  --mx-card:#07101a;\r\n  --mx-card2:#09131f;\r\n  --mx-line:#18283a;\r\n  --mx-line2:#28425d;\r\n  --mx-text:#FFFFFF;\r\n  --mx-muted:#DFF8FA;\r\n  --mx-soft:#BDEFF1;\r\n  --mx-cyan:#07DFE2;\r\n  --mx-green:#4BE49D;\r\n  --mx-gold:#F4C95D;\r\n  --mx-purple:#07DFE2;\r\n\r\n  position:relative;\r\n  width:100%;\r\n  color:var(--mx-text);\r\n\r\n  font-family:\r\n    \"Noto Rashi Hebrew\",\r\n    Arial,\r\n    sans-serif;\r\n}\r\n\r\n#mx-ai-hub *,\r\n#mxah-modal,\r\n#mxah-modal *{\r\n  box-sizing:border-box;\r\n\r\n  font-family:\r\n    \"Noto Rashi Hebrew\",\r\n    Arial,\r\n    sans-serif !important;\r\n}\r\n\r\n\r\n.mxah-head{\r\n  display:flex;\r\n  align-items:flex-end;\r\n  justify-content:space-between;\r\n  gap:30px;\r\n\r\n  margin-bottom:22px;\r\n}\r\n\r\n\r\n.mxah-eyebrow{\r\n  display:block;\r\n\r\n  margin-bottom:7px;\r\n\r\n  color:#7AF7F9;\r\n\r\n  font-size:9px;\r\n  font-weight:700;\r\n  letter-spacing:1.4px;\r\n}\r\n\r\n\r\n.mxah-head h2{\r\n  margin:0;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-size:25px;\r\n  line-height:1.15;\r\n\r\n  font-weight:700;\r\n}\r\n\r\n\r\n.mxah-head p{\r\n  max-width:680px;\r\n\r\n  margin:10px 0 0;\r\n\r\n  color:#D7F4F6;\r\n\r\n  font-size:11px;\r\n  line-height:1.7;\r\n}\r\n\r\n\r\n.mxah-live{\r\n  display:flex;\r\n  align-items:center;\r\n\r\n  gap:7px;\r\n\r\n  color:#7AF7F9;\r\n\r\n  font-size:8px;\r\n  font-weight:700;\r\n  letter-spacing:1px;\r\n}\r\n\r\n\r\n.mxah-live span{\r\n  width:7px;\r\n  height:7px;\r\n\r\n  border-radius:50%;\r\n\r\n  background:#07DFE2;\r\n\r\n  box-shadow:\r\n    0 0 14px\r\n    rgba(7,223,226,.80);\r\n}\r\n\r\n\r\n.mxah-grid{\r\n  display:grid;\r\n\r\n  grid-template-columns:\r\n    repeat(2,minmax(0,1fr));\r\n\r\n  gap:22px;\r\n}\r\n\r\n\r\n.mxah-card{\r\n  position:relative;\r\n\r\n  min-height:278px;\r\n\r\n  padding:21px;\r\n\r\n  overflow:hidden;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.25);\r\n\r\n  border-radius:15px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      #07131D 0%,\r\n      #040B12 100%\r\n    );\r\n\r\n  box-shadow:\r\n    0 0 0 1px\r\n    rgba(255,255,255,.02),\r\n    0 18px 42px\r\n    rgba(0,0,0,.34);\r\n\r\n  transition:\r\n    border-color .18s ease,\r\n    transform .18s ease,\r\n    box-shadow .18s ease;\r\n}\r\n\r\n\r\n.mxah-card:hover{\r\n  transform:\r\n    translateY(-2px);\r\n\r\n  border-color:\r\n    #07DFE2;\r\n\r\n  box-shadow:\r\n    0 0 0 1px\r\n    rgba(7,223,226,.10),\r\n    0 0 24px\r\n    rgba(7,223,226,.14),\r\n    0 22px 50px\r\n    rgba(0,0,0,.40);\r\n}\r\n\r\n\r\n.mxah-card-glow{\r\n  position:absolute;\r\n\r\n  width:190px;\r\n  height:190px;\r\n\r\n  top:-95px;\r\n  right:-90px;\r\n\r\n  border-radius:50%;\r\n\r\n  pointer-events:none;\r\n\r\n  opacity:.16;\r\n\r\n  filter:\r\n    blur(12px);\r\n\r\n  background:\r\n    #07DFE2 !important;\r\n}\r\n\r\n\r\n.mxah-card-top{\r\n  position:relative;\r\n\r\n  z-index:2;\r\n\r\n  display:flex;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:\r\n    space-between;\r\n}\r\n\r\n\r\n.mxah-icon{\r\n  width:42px;\r\n  height:42px;\r\n\r\n  display:flex;\r\n\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.34);\r\n\r\n  border-radius:11px;\r\n\r\n  background:\r\n    rgba(7,223,226,.08);\r\n\r\n  color:#07DFE2;\r\n\r\n  font-size:19px;\r\n\r\n  font-weight:700;\r\n}\r\n\r\n\r\n.mxah-tool-number{\r\n  color:#7AF7F9;\r\n\r\n  font-size:8px;\r\n\r\n  font-weight:700;\r\n\r\n  letter-spacing:1.1px;\r\n}\r\n\r\n\r\n.mxah-card-body{\r\n  position:relative;\r\n\r\n  z-index:2;\r\n\r\n  margin-top:30px;\r\n}\r\n\r\n\r\n.mxah-card-kicker{\r\n  display:block;\r\n\r\n  margin-bottom:8px;\r\n\r\n  color:#7AF7F9;\r\n\r\n  font-size:8px;\r\n\r\n  font-weight:700;\r\n\r\n  letter-spacing:1.1px;\r\n}\r\n\r\n\r\n.mxah-card h3{\r\n  margin:0;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-size:20px;\r\n\r\n  line-height:1.2;\r\n\r\n  font-weight:700;\r\n}\r\n\r\n\r\n.mxah-card p{\r\n  max-width:94%;\r\n\r\n  min-height:48px;\r\n\r\n  margin:\r\n    10px 0 15px;\r\n\r\n  color:#D7F4F6;\r\n\r\n  font-size:10px;\r\n\r\n  line-height:1.65;\r\n}\r\n\r\n\r\n.mxah-tags{\r\n  display:flex;\r\n\r\n  flex-wrap:wrap;\r\n\r\n  gap:8px;\r\n}\r\n\r\n\r\n.mxah-tags span{\r\n  display:inline-flex;\r\n\r\n  align-items:center;\r\n\r\n  min-height:24px;\r\n\r\n  padding:\r\n    5px 9px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.24);\r\n\r\n  border-radius:6px;\r\n\r\n  background:\r\n    rgba(7,223,226,.05);\r\n\r\n  color:#E9FEFF;\r\n\r\n  font-size:8px;\r\n\r\n  font-weight:600;\r\n}\r\n\r\n\r\n.mxah-open{\r\n  position:absolute;\r\n\r\n  left:21px;\r\n  bottom:19px;\r\n\r\n  z-index:3;\r\n\r\n  display:inline-flex;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:center;\r\n\r\n  gap:9px;\r\n\r\n  min-height:40px;\r\n\r\n  padding:\r\n    0 17px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.46);\r\n\r\n  border-radius:8px;\r\n\r\n  background:\r\n    #07171D;\r\n\r\n  background-image:none;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-size:9px;\r\n\r\n  font-weight:700;\r\n\r\n  cursor:pointer;\r\n\r\n  box-shadow:none;\r\n\r\n  outline:none;\r\n\r\n  -webkit-tap-highlight-color:\r\n    transparent;\r\n\r\n  transition:\r\n    border-color .18s ease,\r\n    background .18s ease,\r\n    color .18s ease,\r\n    box-shadow .18s ease,\r\n    transform .18s ease;\r\n}\r\n\r\n\r\n.mxah-open:hover,\r\n.mxah-open:focus,\r\n.mxah-open:active{\r\n  background:\r\n    rgba(7,223,226,.16);\r\n\r\n  background-image:none;\r\n\r\n  border-color:\r\n    #07DFE2;\r\n\r\n  color:#FFFFFF;\r\n\r\n  box-shadow:\r\n    0 0 0 3px\r\n    rgba(7,223,226,.08),\r\n    0 0 18px\r\n    rgba(7,223,226,.15);\r\n\r\n  outline:none;\r\n}\r\n\r\n\r\n.mxah-open:hover{\r\n  transform:\r\n    translateY(-1px);\r\n}\r\n\r\n\r\n.mxah-open b{\r\n  color:#07DFE2;\r\n}\r\n\r\n\r\n.mxah-modal{\r\n  position:fixed;\r\n\r\n  inset:0;\r\n\r\n  z-index:999999;\r\n\r\n  display:none;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:center;\r\n\r\n  padding:20px;\r\n}\r\n\r\n\r\n.mxah-modal.is-open{\r\n  display:flex;\r\n}\r\n\r\n\r\n.mxah-modal-backdrop{\r\n  position:absolute;\r\n\r\n  inset:0;\r\n\r\n  background:\r\n    rgba(0,3,7,.84);\r\n\r\n  backdrop-filter:\r\n    blur(7px);\r\n}\r\n\r\n\r\n.mxah-panel{\r\n  position:relative;\r\n\r\n  z-index:2;\r\n\r\n  width:min(850px,100%);\r\n\r\n  max-height:88vh;\r\n\r\n  overflow:auto;\r\n\r\n  padding:23px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.36);\r\n\r\n  border-radius:16px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      #07141E,\r\n      #03090F\r\n    );\r\n\r\n  box-shadow:\r\n    0 30px 100px\r\n    rgba(0,0,0,.75),\r\n    0 0 35px\r\n    rgba(7,223,226,.07);\r\n\r\n  scrollbar-width:none;\r\n}\r\n\r\n\r\n.mxah-panel::-webkit-scrollbar{\r\n  display:none;\r\n}\r\n\r\n\r\n.mxah-panel-head{\r\n  display:flex;\r\n\r\n  align-items:flex-start;\r\n\r\n  justify-content:\r\n    space-between;\r\n\r\n  gap:20px;\r\n\r\n  margin-bottom:22px;\r\n}\r\n\r\n\r\n.mxah-panel-head h3{\r\n  margin:0;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-size:22px;\r\n\r\n  font-weight:700;\r\n}\r\n\r\n.mxah-close{\r\n  all:unset;\r\n\r\n  box-sizing:border-box;\r\n\r\n  width:44px;\r\n  height:44px;\r\n\r\n  min-width:44px;\r\n  min-height:44px;\r\n\r\n  flex:\r\n    0 0 44px;\r\n\r\n  display:flex;\r\n\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  padding:0;\r\n  margin:0;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.44);\r\n\r\n  border-radius:10px;\r\n\r\n  background:\r\n    #06151B;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-family:\r\n    Arial,\r\n    sans-serif !important;\r\n\r\n  font-size:28px;\r\n\r\n  font-weight:300;\r\n\r\n  line-height:1;\r\n\r\n  text-align:center;\r\n\r\n  cursor:pointer;\r\n\r\n  box-shadow:none;\r\n\r\n  transform:none;\r\n\r\n  -webkit-tap-highlight-color:\r\n    transparent;\r\n}\r\n\r\n\r\n.mxah-close:hover,\r\n.mxah-close:focus,\r\n.mxah-close:active{\r\n  background:\r\n    rgba(7,223,226,.16);\r\n\r\n  border-color:\r\n    #07DFE2;\r\n\r\n  color:#07DFE2;\r\n\r\n  box-shadow:\r\n    0 0 18px\r\n    rgba(7,223,226,.16);\r\n\r\n  outline:none;\r\n}\r\n\r\n\r\n.mxah-form-grid{\r\n  display:grid;\r\n\r\n  grid-template-columns:\r\n    repeat(2,minmax(0,1fr));\r\n\r\n  gap:16px;\r\n}\r\n\r\n\r\n.mxah-field{\r\n  display:flex;\r\n\r\n  flex-direction:column;\r\n\r\n  gap:9px;\r\n}\r\n\r\n\r\n.mxah-field.full{\r\n  grid-column:1\/-1;\r\n}\r\n\r\n\r\n.mxah-field label{\r\n  color:#D7F4F6;\r\n\r\n  font-size:8px;\r\n\r\n  font-weight:600;\r\n\r\n  letter-spacing:.8px;\r\n\r\n  text-transform:\r\n    uppercase;\r\n}\r\n\r\n\r\n.mxah-field input,\r\n.mxah-field select,\r\n.mxah-field textarea{\r\n  width:100%;\r\n\r\n  min-height:42px;\r\n\r\n  padding:\r\n    10px 12px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.22);\r\n\r\n  border-radius:9px;\r\n\r\n  outline:none;\r\n\r\n  background:\r\n    #040C12;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font:inherit;\r\n\r\n  font-size:11px;\r\n\r\n  color-scheme:dark;\r\n\r\n  box-shadow:none;\r\n}\r\n\r\n\r\n.mxah-field input:hover,\r\n.mxah-field select:hover,\r\n.mxah-field textarea:hover{\r\n  border-color:\r\n    rgba(7,223,226,.60);\r\n}\r\n\r\n\r\n.mxah-field input:focus,\r\n.mxah-field select:focus,\r\n.mxah-field textarea:focus{\r\n  border-color:\r\n    #07DFE2;\r\n\r\n  outline:none;\r\n\r\n  box-shadow:\r\n    0 0 0 3px\r\n    rgba(7,223,226,.09);\r\n}\r\n\r\n\r\n.mxah-field textarea{\r\n  min-height:90px;\r\n\r\n  resize:vertical;\r\n}\r\n\r\n\r\n.mxah-drop{\r\n  position:relative;\r\n\r\n  min-height:210px;\r\n\r\n  display:flex;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:center;\r\n\r\n  padding:20px;\r\n\r\n  border:\r\n    1px dashed\r\n    rgba(7,223,226,.58);\r\n\r\n  border-radius:12px;\r\n\r\n  background:\r\n    rgba(7,223,226,.03);\r\n\r\n  text-align:center;\r\n\r\n  cursor:pointer;\r\n}\r\n\r\n\r\n.mxah-drop:hover,\r\n.mxah-drop.drag{\r\n  border-color:\r\n    #07DFE2;\r\n\r\n  background:\r\n    rgba(7,223,226,.08);\r\n}\r\n\r\n\r\n.mxah-drop input{\r\n  position:absolute;\r\n\r\n  inset:0;\r\n\r\n  width:100%;\r\n  height:100%;\r\n\r\n  opacity:0;\r\n\r\n  cursor:pointer;\r\n}\r\n\r\n\r\n.mxah-drop-icon{\r\n  margin-bottom:8px;\r\n\r\n  color:#07DFE2;\r\n\r\n  font-size:28px;\r\n}\r\n\r\n\r\n.mxah-drop strong{\r\n  display:block;\r\n\r\n  margin-bottom:5px;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-size:13px;\r\n\r\n  font-weight:700;\r\n}\r\n\r\n\r\n.mxah-drop small{\r\n  color:#D7F4F6;\r\n\r\n  font-size:9px;\r\n}\r\n\r\n\r\n.mxah-preview{\r\n  display:none;\r\n\r\n  margin-top:12px;\r\n\r\n  padding:9px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.22);\r\n\r\n  border-radius:10px;\r\n\r\n  background:#03080e;\r\n}\r\n\r\n\r\n.mxah-preview.active{\r\n  display:block;\r\n}\r\n\r\n\r\n.mxah-preview img{\r\n  display:block;\r\n\r\n  width:100%;\r\n\r\n  max-height:350px;\r\n\r\n  object-fit:contain;\r\n\r\n  border-radius:7px;\r\n}\r\n\r\n\r\n.mxah-action-row{\r\n  display:flex;\r\n\r\n  align-items:center;\r\n\r\n  gap:14px;\r\n\r\n  margin-top:16px;\r\n\r\n  flex-wrap:wrap;\r\n}\r\n\r\n\r\n.mxah-primary{\r\n  appearance:none;\r\n\r\n  -webkit-appearance:none;\r\n\r\n  min-height:42px;\r\n\r\n  padding:\r\n    0 18px;\r\n\r\n  border:\r\n    1px solid\r\n    #07DFE2;\r\n\r\n  border-radius:8px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      #07DFE2,\r\n      #72F7F9\r\n    );\r\n\r\n  color:#001113;\r\n\r\n  font-size:9px;\r\n\r\n  font-weight:800;\r\n\r\n  box-shadow:none;\r\n\r\n  cursor:pointer;\r\n\r\n  -webkit-tap-highlight-color:\r\n    transparent;\r\n}\r\n\r\n\r\n.mxah-primary:hover,\r\n.mxah-primary:focus,\r\n.mxah-primary:active{\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      #2BEAED,\r\n      #9CFCFD\r\n    );\r\n\r\n  border-color:\r\n    #78F8FA;\r\n\r\n  color:#001113;\r\n\r\n  box-shadow:\r\n    0 0 20px\r\n    rgba(7,223,226,.18);\r\n\r\n  outline:none;\r\n}\r\n\r\n\r\n.mxah-primary:disabled{\r\n  opacity:.45;\r\n\r\n  cursor:wait;\r\n}\r\n\r\n\r\n.mxah-status{\r\n  color:#D7F4F6;\r\n\r\n  font-size:9px;\r\n\r\n  line-height:1.5;\r\n}\r\n\r\n\r\n.mxah-result{\r\n  display:none;\r\n\r\n  margin-top:16px;\r\n\r\n  padding:15px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.24);\r\n\r\n  border-radius:11px;\r\n\r\n  background:#041018;\r\n}\r\n\r\n\r\n.mxah-result.show{\r\n  display:block;\r\n}\r\n\r\n\r\n.mxah-result h4{\r\n  margin:\r\n    0 0 11px;\r\n\r\n  color:#FFFFFF;\r\n\r\n  font-size:12px;\r\n}\r\n\r\n\r\n.mxah-result-grid{\r\n  display:grid;\r\n\r\n  grid-template-columns:\r\n    repeat(3,minmax(0,1fr));\r\n\r\n  gap:10px;\r\n}\r\n\r\n\r\n.mxah-result-card{\r\n  padding:12px;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(7,223,226,.20);\r\n\r\n  border-radius:9px;\r\n\r\n  background:#07131C;\r\n}\r\n\r\n\r\n.mxah-result-card span{\r\n  display:block;\r\n\r\n  margin-bottom:6px;\r\n\r\n  color:#D7F4F6;\r\n\r\n  font-size:8px;\r\n\r\n  font-weight:600;\r\n\r\n  text-transform:\r\n    uppercase;\r\n}\r\n\r\n\r\n.mxah-result-card strong{\r\n  color:#FFFFFF;\r\n\r\n  font-size:13px;\r\n}\r\n\r\n\r\n#mx-ai-hub button:focus-visible,\r\n#mxah-modal button:focus-visible{\r\n  outline:\r\n    2px solid\r\n    #07DFE2;\r\n\r\n  outline-offset:\r\n    2px;\r\n}\r\n\r\n\r\n@media(max-width:700px){\r\n\r\n  .mxah-grid{\r\n    grid-template-columns:\r\n      1fr;\r\n\r\n    gap:16px;\r\n  }\r\n\r\n  .mxah-head{\r\n    align-items:\r\n      flex-start;\r\n\r\n    flex-direction:\r\n      column;\r\n  }\r\n\r\n  .mxah-form-grid,\r\n  .mxah-result-grid{\r\n    grid-template-columns:\r\n      1fr;\r\n  }\r\n\r\n  .mxah-field.full{\r\n    grid-column:auto;\r\n  }\r\n\r\n  .mxah-card{\r\n    padding:18px;\r\n  }\r\n}\r\n\/* =========================================================\r\n   MARKUNOX AI HUB - BUTTON POSITION + TURQUOISE STATES\r\n========================================================= *\/\r\n\r\n\/* Keep action buttons away from tags *\/\r\n\r\n#mx-ai-hub .mxah-card{\r\n  display:flex !important;\r\n  flex-direction:column !important;\r\n}\r\n\r\n#mx-ai-hub .mxah-card-body{\r\n  flex:1 1 auto !important;\r\n}\r\n\r\n#mx-ai-hub button.mxah-open{\r\n  position:relative !important;\r\n\r\n  left:auto !important;\r\n  right:auto !important;\r\n  top:auto !important;\r\n  bottom:auto !important;\r\n\r\n  align-self:flex-start !important;\r\n\r\n  margin-top:22px !important;\r\n  margin-bottom:0 !important;\r\n\r\n  z-index:5 !important;\r\n}\r\n\r\n\r\n\/* Extra space between tags and main button *\/\r\n\r\n#mx-ai-hub .mxah-tags{\r\n  margin-bottom:4px !important;\r\n}\r\n\r\n#mx-ai-hub .mxah-tags span{\r\n  margin:0 !important;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   REMOVE ALL BLUE BUTTON HOVER \/ FOCUS \/ ACTIVE\r\n========================================================= *\/\r\n\r\nbody #mx-ai-hub button.mxah-open,\r\nbody #mx-ai-hub button.mxah-open:link,\r\nbody #mx-ai-hub button.mxah-open:visited{\r\n  background:#07171D !important;\r\n  background-color:#07171D !important;\r\n  background-image:none !important;\r\n\r\n  border:1px solid rgba(7,223,226,.48) !important;\r\n\r\n  color:#FFFFFF !important;\r\n\r\n  box-shadow:none !important;\r\n\r\n  outline:none !important;\r\n\r\n  filter:none !important;\r\n\r\n  text-shadow:none !important;\r\n\r\n  -webkit-tap-highlight-color:transparent !important;\r\n}\r\n\r\n\r\nbody #mx-ai-hub button.mxah-open:hover,\r\nbody #mx-ai-hub button.mxah-open:focus,\r\nbody #mx-ai-hub button.mxah-open:focus-visible,\r\nbody #mx-ai-hub button.mxah-open:active{\r\n  background:#0B2A30 !important;\r\n  background-color:#0B2A30 !important;\r\n  background-image:none !important;\r\n\r\n  border-color:#07DFE2 !important;\r\n\r\n  color:#FFFFFF !important;\r\n\r\n  outline:none !important;\r\n\r\n  filter:none !important;\r\n\r\n  box-shadow:\r\n    0 0 0 3px rgba(7,223,226,.10),\r\n    0 0 20px rgba(7,223,226,.20) !important;\r\n}\r\n\r\n\r\nbody #mx-ai-hub button.mxah-open b{\r\n  color:#07DFE2 !important;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PRIMARY MODAL BUTTONS\r\n========================================================= *\/\r\n\r\nbody #mxah-modal button.mxah-primary{\r\n  background:#07DFE2 !important;\r\n  background-color:#07DFE2 !important;\r\n  background-image:none !important;\r\n\r\n  border:1px solid #07DFE2 !important;\r\n\r\n  color:#001315 !important;\r\n\r\n  box-shadow:none !important;\r\n\r\n  outline:none !important;\r\n}\r\n\r\n\r\nbody #mxah-modal button.mxah-primary:hover,\r\nbody #mxah-modal button.mxah-primary:focus,\r\nbody #mxah-modal button.mxah-primary:focus-visible,\r\nbody #mxah-modal button.mxah-primary:active{\r\n  background:#63F2F4 !important;\r\n  background-color:#63F2F4 !important;\r\n  background-image:none !important;\r\n\r\n  border-color:#63F2F4 !important;\r\n\r\n  color:#001315 !important;\r\n\r\n  outline:none !important;\r\n\r\n  box-shadow:\r\n    0 0 20px rgba(7,223,226,.24) !important;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CLOSE BUTTON - EXACT CENTER + NO BLUE\r\n========================================================= *\/\r\n\r\nbody #mxah-modal button.mxah-close{\r\n  all:unset !important;\r\n\r\n  box-sizing:border-box !important;\r\n\r\n  width:44px !important;\r\n  height:44px !important;\r\n\r\n  min-width:44px !important;\r\n  min-height:44px !important;\r\n\r\n  flex:0 0 44px !important;\r\n\r\n  display:flex !important;\r\n\r\n  align-items:center !important;\r\n  justify-content:center !important;\r\n\r\n  padding:0 !important;\r\n  margin:0 !important;\r\n\r\n  border:\r\n    1px solid rgba(7,223,226,.48) !important;\r\n\r\n  border-radius:10px !important;\r\n\r\n  background:#07171D !important;\r\n  background-color:#07171D !important;\r\n  background-image:none !important;\r\n\r\n  color:#FFFFFF !important;\r\n\r\n  font-family:Arial,sans-serif !important;\r\n\r\n  font-size:28px !important;\r\n  font-weight:300 !important;\r\n\r\n  line-height:1 !important;\r\n\r\n  text-align:center !important;\r\n\r\n  cursor:pointer !important;\r\n\r\n  box-shadow:none !important;\r\n\r\n  outline:none !important;\r\n\r\n  filter:none !important;\r\n\r\n  -webkit-tap-highlight-color:transparent !important;\r\n}\r\n\r\n\r\nbody #mxah-modal button.mxah-close:hover,\r\nbody #mxah-modal button.mxah-close:focus,\r\nbody #mxah-modal button.mxah-close:focus-visible,\r\nbody #mxah-modal button.mxah-close:active{\r\n  background:#0B2A30 !important;\r\n  background-color:#0B2A30 !important;\r\n  background-image:none !important;\r\n\r\n  border-color:#07DFE2 !important;\r\n\r\n  color:#07DFE2 !important;\r\n\r\n  outline:none !important;\r\n\r\n  filter:none !important;\r\n\r\n  box-shadow:\r\n    0 0 18px rgba(7,223,226,.20) !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n\"use strict\";\r\n\r\n\r\nconst CHART_ENDPOINT =\r\n  \"\/wp-json\/markunox\/v1\/ai-chart-analyzer\";\r\n\r\n\r\nconst STRATEGY_ENDPOINT =\r\n  \"\/wp-json\/markunox\/v1\/ai-strategy-interview\";\r\n\r\n\r\nconst SCENARIO_ENDPOINT =\r\n  \"\/wp-json\/markunox\/v1\/ai-trade-scenario\";\r\n\r\n\r\nconst FINDER_ENDPOINT =\r\n  \"\/wp-json\/markunox\/v1\/ai-broker-finder\";\r\n\r\n\r\nconst MARKET_ENDPOINT =\r\n  \"\/wp-json\/markunox\/v1\/market\";\r\n\r\n\r\nconst modal =\r\n  document.getElementById(\r\n    \"mxah-modal\"\r\n  );\r\n\r\n\r\nconst content =\r\n  document.getElementById(\r\n    \"mxah-panel-content\"\r\n  );\r\n\r\n\r\nconst title =\r\n  document.getElementById(\r\n    \"mxah-modal-title\"\r\n  );\r\n\r\n\r\nlet activePreviewUrl =\r\n  null;\r\n\r\n\r\n\/* =========================================================\r\n   HELPERS\r\n========================================================= *\/\r\n\r\nfunction esc(value){\r\n\r\n  return String(\r\n    value ?? \"\"\r\n  ).replace(\r\n    \/[&<>\"']\/g,\r\n    function(char){\r\n\r\n      return {\r\n\r\n        \"&\":\"&amp;\",\r\n        \"<\":\"&lt;\",\r\n        \">\":\"&gt;\",\r\n        '\"':\"&quot;\",\r\n        \"'\":\"&#039;\"\r\n\r\n      }[char];\r\n    }\r\n  );\r\n}\r\n\r\n\r\nfunction cleanValue(value){\r\n\r\n  if(\r\n    value === null ||\r\n    value === undefined ||\r\n    value === \"\"\r\n  ){\r\n    return \"Not available\";\r\n  }\r\n\r\n  return String(value);\r\n}\r\n\r\n\r\nfunction setStatus(\r\n  id,\r\n  message\r\n){\r\n\r\n  const element =\r\n    document.getElementById(\r\n      id\r\n    );\r\n\r\n  if(element){\r\n\r\n    element.textContent =\r\n      message;\r\n  }\r\n}\r\n\r\n\r\nasync function fetchWithTimeout(\r\n  url,\r\n  options = {},\r\n  timeoutMs = 30000\r\n){\r\n\r\n  const controller =\r\n    new AbortController();\r\n\r\n\r\n  const timer =\r\n    setTimeout(\r\n      function(){\r\n\r\n        controller.abort();\r\n\r\n      },\r\n      timeoutMs\r\n    );\r\n\r\n\r\n  try{\r\n\r\n    const response =\r\n      await fetch(\r\n        url,\r\n        {\r\n          ...options,\r\n          signal:\r\n            controller.signal\r\n        }\r\n      );\r\n\r\n    return response;\r\n\r\n  }finally{\r\n\r\n    clearTimeout(\r\n      timer\r\n    );\r\n  }\r\n}\r\n\r\n\r\nasync function readJson(\r\n  response\r\n){\r\n\r\n  try{\r\n\r\n    return await response.json();\r\n\r\n  }catch(error){\r\n\r\n    return null;\r\n  }\r\n}\r\n\r\n\r\nfunction getPayloadData(\r\n  payload\r\n){\r\n\r\n  if(\r\n    payload &&\r\n    payload.data &&\r\n    typeof payload.data ===\r\n      \"object\"\r\n  ){\r\n\r\n    return payload.data;\r\n  }\r\n\r\n\r\n  if(\r\n    payload &&\r\n    payload.result &&\r\n    typeof payload.result ===\r\n      \"object\"\r\n  ){\r\n\r\n    return payload.result;\r\n  }\r\n\r\n\r\n  if(\r\n    payload &&\r\n    payload.scenario &&\r\n    typeof payload.scenario ===\r\n      \"object\"\r\n  ){\r\n\r\n    return payload.scenario;\r\n  }\r\n\r\n\r\n  return payload || {};\r\n}\r\n\r\n\r\nfunction errorMessage(\r\n  payload,\r\n  fallback\r\n){\r\n\r\n  return (\r\n    payload?.message ||\r\n    payload?.error ||\r\n    payload?.data?.message ||\r\n    fallback\r\n  );\r\n}\r\n\r\n\r\nfunction formatLabel(\r\n  key\r\n){\r\n\r\n  return String(\r\n    key || \"\"\r\n  )\r\n    .replace(\r\n      \/_\/g,\r\n      \" \"\r\n    )\r\n    .replace(\r\n      \/([a-z])([A-Z])\/g,\r\n      \"$1 $2\"\r\n    )\r\n    .replace(\r\n      \/\\b\\w\/g,\r\n      function(char){\r\n\r\n        return char.toUpperCase();\r\n      }\r\n    );\r\n}\r\n\r\n\r\nfunction renderGenericObject(\r\n  target,\r\n  heading,\r\n  object\r\n){\r\n\r\n  if(\r\n    !target ||\r\n    !object ||\r\n    typeof object !==\r\n      \"object\"\r\n  ){\r\n    return;\r\n  }\r\n\r\n\r\n  const skip =\r\n    new Set([\r\n      \"ok\",\r\n      \"status\",\r\n      \"success\",\r\n      \"message\"\r\n    ]);\r\n\r\n\r\n  const cards =\r\n    Object.entries(\r\n      object\r\n    )\r\n      .filter(\r\n        function(entry){\r\n\r\n          const key =\r\n            entry[0];\r\n\r\n          const value =\r\n            entry[1];\r\n\r\n          return (\r\n            !skip.has(key) &&\r\n            value !== null &&\r\n            value !== undefined &&\r\n            typeof value !==\r\n              \"object\"\r\n          );\r\n        }\r\n      )\r\n      .slice(\r\n        0,\r\n        12\r\n      );\r\n\r\n\r\n  let html = `\r\n\r\n    <h4>\r\n      ${esc(heading)}\r\n    <\/h4>\r\n  `;\r\n\r\n\r\n  if(cards.length){\r\n\r\n    html +=\r\n      '<div class=\"mxah-result-grid\">';\r\n\r\n\r\n    cards.forEach(\r\n      function(entry){\r\n\r\n        html += `\r\n\r\n          <div class=\"mxah-result-card\">\r\n\r\n            <span>\r\n              ${esc(\r\n                formatLabel(\r\n                  entry[0]\r\n                )\r\n              )}\r\n            <\/span>\r\n\r\n            <strong>\r\n              ${esc(\r\n                cleanValue(\r\n                  entry[1]\r\n                )\r\n              )}\r\n            <\/strong>\r\n\r\n          <\/div>\r\n        `;\r\n      }\r\n    );\r\n\r\n\r\n    html +=\r\n      \"<\/div>\";\r\n  }\r\n\r\n\r\n  const text =\r\n    object.analysis ||\r\n    object.reasoning ||\r\n    object.summary ||\r\n    object.strategy ||\r\n    object.explanation ||\r\n    object.rationale ||\r\n    \"\";\r\n\r\n\r\n  if(text){\r\n\r\n    html += `\r\n\r\n      <div\r\n        class=\"mxah-result-card\"\r\n        style=\"margin-top:10px\"\r\n      >\r\n\r\n        <span>\r\n          Analysis\r\n        <\/span>\r\n\r\n        <strong\r\n          style=\"\r\n            font-size:11px;\r\n            line-height:1.7;\r\n            font-weight:500;\r\n          \"\r\n        >\r\n          ${esc(text)}\r\n        <\/strong>\r\n\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n\r\n  target.innerHTML =\r\n    html;\r\n\r\n\r\n  target.classList.add(\r\n    \"show\"\r\n  );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MODAL\r\n========================================================= *\/\r\n\r\nfunction openModal(\r\n  tool\r\n){\r\n\r\n  if(\r\n    !modal ||\r\n    !content ||\r\n    !title\r\n  ){\r\n    return;\r\n  }\r\n\r\n\r\n  modal.classList.add(\r\n    \"is-open\"\r\n  );\r\n\r\n\r\n  modal.setAttribute(\r\n    \"aria-hidden\",\r\n    \"false\"\r\n  );\r\n\r\n\r\n  document.body.style.overflow =\r\n    \"hidden\";\r\n\r\n\r\n  if(\r\n    tool === \"chart\"\r\n  ){\r\n\r\n    renderChartTool();\r\n\r\n  }else if(\r\n    tool === \"strategy\"\r\n  ){\r\n\r\n    renderStrategyTool();\r\n\r\n  }else if(\r\n    tool === \"scenario\"\r\n  ){\r\n\r\n    renderScenarioTool();\r\n\r\n  }else if(\r\n    tool === \"finder\"\r\n  ){\r\n\r\n    renderFinderTool();\r\n  }\r\n}\r\n\r\n\r\nfunction closeModal(){\r\n\r\n  if(\r\n    !modal\r\n  ){\r\n    return;\r\n  }\r\n\r\n\r\n  modal.classList.remove(\r\n    \"is-open\"\r\n  );\r\n\r\n\r\n  modal.setAttribute(\r\n    \"aria-hidden\",\r\n    \"true\"\r\n  );\r\n\r\n\r\n  document.body.style.overflow =\r\n    \"\";\r\n\r\n\r\n  if(activePreviewUrl){\r\n\r\n    URL.revokeObjectURL(\r\n      activePreviewUrl\r\n    );\r\n\r\n    activePreviewUrl =\r\n      null;\r\n  }\r\n}\r\n\r\n\r\ndocument\r\n  .querySelectorAll(\r\n    \"[data-open]\"\r\n  )\r\n  .forEach(\r\n    function(button){\r\n\r\n      button.addEventListener(\r\n        \"click\",\r\n        function(){\r\n\r\n          openModal(\r\n            button.dataset.open\r\n          );\r\n        }\r\n      );\r\n    }\r\n  );\r\n\r\n\r\ndocument\r\n  .querySelectorAll(\r\n    \"[data-close]\"\r\n  )\r\n  .forEach(\r\n    function(button){\r\n\r\n      button.addEventListener(\r\n        \"click\",\r\n        closeModal\r\n      );\r\n    }\r\n  );\r\n\r\n\r\ndocument.addEventListener(\r\n  \"keydown\",\r\n  function(event){\r\n\r\n    if(\r\n      event.key ===\r\n      \"Escape\"\r\n    ){\r\n\r\n      closeModal();\r\n    }\r\n  }\r\n);\r\n\r\n\r\n\/* =========================================================\r\n   IMAGE COMPRESSION\r\n========================================================= *\/\r\n\r\nfunction loadImageFile(\r\n  file\r\n){\r\n\r\n  return new Promise(\r\n    function(resolve,reject){\r\n\r\n      const image =\r\n        new Image();\r\n\r\n\r\n      const url =\r\n        URL.createObjectURL(\r\n          file\r\n        );\r\n\r\n\r\n      image.onload =\r\n        function(){\r\n\r\n          URL.revokeObjectURL(\r\n            url\r\n          );\r\n\r\n          resolve(\r\n            image\r\n          );\r\n        };\r\n\r\n\r\n      image.onerror =\r\n        function(){\r\n\r\n          URL.revokeObjectURL(\r\n            url\r\n          );\r\n\r\n          reject(\r\n            new Error(\r\n              \"Unable to read the selected image.\"\r\n            )\r\n          );\r\n        };\r\n\r\n\r\n      image.src =\r\n        url;\r\n    }\r\n  );\r\n}\r\n\r\n\r\nasync function compressImage(\r\n  file\r\n){\r\n\r\n  if(\r\n    !file ||\r\n    !String(\r\n      file.type || \"\"\r\n    ).startsWith(\r\n      \"image\/\"\r\n    )\r\n  ){\r\n\r\n    throw new Error(\r\n      \"Please upload a valid image.\"\r\n    );\r\n  }\r\n\r\n\r\n  if(\r\n    file.size >\r\n    12 * 1024 * 1024\r\n  ){\r\n\r\n    throw new Error(\r\n      \"Maximum image size is 12MB.\"\r\n    );\r\n  }\r\n\r\n\r\n  let source = null;\r\n\r\n  let sourceWidth = 0;\r\n\r\n  let sourceHeight = 0;\r\n\r\n\r\n  if(\r\n    typeof createImageBitmap ===\r\n      \"function\"\r\n  ){\r\n\r\n    source =\r\n      await createImageBitmap(\r\n        file\r\n      );\r\n\r\n    sourceWidth =\r\n      source.width;\r\n\r\n    sourceHeight =\r\n      source.height;\r\n\r\n  }else{\r\n\r\n    source =\r\n      await loadImageFile(\r\n        file\r\n      );\r\n\r\n    sourceWidth =\r\n      source.naturalWidth;\r\n\r\n    sourceHeight =\r\n      source.naturalHeight;\r\n  }\r\n\r\n\r\n  const maxWidth =\r\n    1600;\r\n\r\n\r\n  const ratio =\r\n    Math.min(\r\n      1,\r\n      maxWidth \/\r\n      sourceWidth\r\n    );\r\n\r\n\r\n  const width =\r\n    Math.max(\r\n      1,\r\n      Math.round(\r\n        sourceWidth *\r\n        ratio\r\n      )\r\n    );\r\n\r\n\r\n  const height =\r\n    Math.max(\r\n      1,\r\n      Math.round(\r\n        sourceHeight *\r\n        ratio\r\n      )\r\n    );\r\n\r\n\r\n  const canvas =\r\n    document.createElement(\r\n      \"canvas\"\r\n    );\r\n\r\n\r\n  canvas.width =\r\n    width;\r\n\r\n\r\n  canvas.height =\r\n    height;\r\n\r\n\r\n  const ctx =\r\n    canvas.getContext(\r\n      \"2d\",\r\n      {\r\n        alpha:false\r\n      }\r\n    );\r\n\r\n\r\n  if(!ctx){\r\n\r\n    throw new Error(\r\n      \"Image processing is unavailable in this browser.\"\r\n    );\r\n  }\r\n\r\n\r\n  ctx.drawImage(\r\n    source,\r\n    0,\r\n    0,\r\n    width,\r\n    height\r\n  );\r\n\r\n\r\n  if(\r\n    source &&\r\n    typeof source.close ===\r\n      \"function\"\r\n  ){\r\n\r\n    source.close();\r\n  }\r\n\r\n\r\n  const blob =\r\n    await new Promise(\r\n      function(resolve){\r\n\r\n        canvas.toBlob(\r\n          resolve,\r\n          \"image\/jpeg\",\r\n          .88\r\n        );\r\n      }\r\n    );\r\n\r\n\r\n  if(!blob){\r\n\r\n    throw new Error(\r\n      \"Unable to prepare the chart image.\"\r\n    );\r\n  }\r\n\r\n\r\n  return blob;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   CHART ANALYZER\r\n========================================================= *\/\r\n\r\nfunction renderChartTool(){\r\n\r\n  title.textContent =\r\n    \"AI Chart Analyzer\";\r\n\r\n\r\n  content.innerHTML = `\r\n\r\n    <div\r\n      id=\"mxah-drop\"\r\n      class=\"mxah-drop\"\r\n    >\r\n\r\n      <input\r\n        id=\"mxah-chart-file\"\r\n        type=\"file\"\r\n        accept=\"image\/png,image\/jpeg,image\/webp\"\r\n      >\r\n\r\n      <div>\r\n\r\n        <div class=\"mxah-drop-icon\">\r\n          \u21e7\r\n        <\/div>\r\n\r\n        <strong>\r\n          Drop your chart screenshot here\r\n        <\/strong>\r\n\r\n        <small>\r\n          PNG \u00b7 JPG \u00b7 WEBP \u00b7 Maximum 12MB\r\n        <\/small>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n      id=\"mxah-chart-preview\"\r\n      class=\"mxah-preview\"\r\n    >\r\n\r\n      <img\r\n        id=\"mxah-chart-image\"\r\n        alt=\"Chart preview\"\r\n      >\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n      class=\"mxah-form-grid\"\r\n      style=\"margin-top:12px\"\r\n    >\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Symbol\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"mxah-chart-symbol\"\r\n          placeholder=\"XAUUSD\"\r\n          autocomplete=\"off\"\r\n        >\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Timeframe\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-chart-timeframe\"\r\n        >\r\n\r\n          <option value=\"auto\">\r\n            Auto Detect\r\n          <\/option>\r\n\r\n          <option value=\"M15\">\r\n            M15\r\n          <\/option>\r\n\r\n          <option value=\"H1\">\r\n            H1\r\n          <\/option>\r\n\r\n          <option value=\"H4\">\r\n            H4\r\n          <\/option>\r\n\r\n          <option value=\"D1\">\r\n            D1\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"mxah-action-row\">\r\n\r\n      <button\r\n        id=\"mxah-chart-submit\"\r\n        class=\"mxah-primary\"\r\n        type=\"button\"\r\n      >\r\n        Analyze Chart\r\n      <\/button>\r\n\r\n      <span\r\n        id=\"mxah-chart-status\"\r\n        class=\"mxah-status\"\r\n      >\r\n        The image is compressed locally before upload.\r\n      <\/span>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n      id=\"mxah-chart-result\"\r\n      class=\"mxah-result\"\r\n    ><\/div>\r\n  `;\r\n\r\n\r\n  let compressedBlob =\r\n    null;\r\n\r\n\r\n  const input =\r\n    document.getElementById(\r\n      \"mxah-chart-file\"\r\n    );\r\n\r\n\r\n  const drop =\r\n    document.getElementById(\r\n      \"mxah-drop\"\r\n    );\r\n\r\n\r\n  const preview =\r\n    document.getElementById(\r\n      \"mxah-chart-preview\"\r\n    );\r\n\r\n\r\n  const image =\r\n    document.getElementById(\r\n      \"mxah-chart-image\"\r\n    );\r\n\r\n\r\n  const status =\r\n    document.getElementById(\r\n      \"mxah-chart-status\"\r\n    );\r\n\r\n\r\n  async function processFile(\r\n    file\r\n  ){\r\n\r\n    try{\r\n\r\n      status.textContent =\r\n        \"Optimizing chart image...\";\r\n\r\n\r\n      compressedBlob =\r\n        await compressImage(\r\n          file\r\n        );\r\n\r\n\r\n      if(activePreviewUrl){\r\n\r\n        URL.revokeObjectURL(\r\n          activePreviewUrl\r\n        );\r\n      }\r\n\r\n\r\n      activePreviewUrl =\r\n        URL.createObjectURL(\r\n          compressedBlob\r\n        );\r\n\r\n\r\n      image.src =\r\n        activePreviewUrl;\r\n\r\n\r\n      preview.classList.add(\r\n        \"active\"\r\n      );\r\n\r\n\r\n      status.textContent =\r\n        \"Chart ready for analysis.\";\r\n\r\n\r\n    }catch(error){\r\n\r\n      compressedBlob =\r\n        null;\r\n\r\n\r\n      status.textContent =\r\n        error.message ||\r\n        \"Unable to prepare image.\";\r\n    }\r\n  }\r\n\r\n\r\n  input.addEventListener(\r\n    \"change\",\r\n    function(){\r\n\r\n      const file =\r\n        input.files &&\r\n        input.files[0];\r\n\r\n\r\n      if(file){\r\n\r\n        processFile(\r\n          file\r\n        );\r\n      }\r\n    }\r\n  );\r\n\r\n\r\n  [\r\n    \"dragenter\",\r\n    \"dragover\"\r\n  ].forEach(\r\n    function(name){\r\n\r\n      drop.addEventListener(\r\n        name,\r\n        function(event){\r\n\r\n          event.preventDefault();\r\n\r\n          drop.classList.add(\r\n            \"drag\"\r\n          );\r\n        }\r\n      );\r\n    }\r\n  );\r\n\r\n\r\n  [\r\n    \"dragleave\",\r\n    \"drop\"\r\n  ].forEach(\r\n    function(name){\r\n\r\n      drop.addEventListener(\r\n        name,\r\n        function(event){\r\n\r\n          event.preventDefault();\r\n\r\n          drop.classList.remove(\r\n            \"drag\"\r\n          );\r\n        }\r\n      );\r\n    }\r\n  );\r\n\r\n\r\n  drop.addEventListener(\r\n    \"drop\",\r\n    function(event){\r\n\r\n      const file =\r\n        event.dataTransfer &&\r\n        event.dataTransfer.files &&\r\n        event.dataTransfer.files[0];\r\n\r\n\r\n      if(file){\r\n\r\n        processFile(\r\n          file\r\n        );\r\n      }\r\n    }\r\n  );\r\n\r\n\r\n  document\r\n    .getElementById(\r\n      \"mxah-chart-submit\"\r\n    )\r\n    .addEventListener(\r\n      \"click\",\r\n      async function(){\r\n\r\n        if(!compressedBlob){\r\n\r\n          status.textContent =\r\n            \"Upload a chart screenshot first.\";\r\n\r\n          return;\r\n        }\r\n\r\n\r\n        const button =\r\n          this;\r\n\r\n\r\n        button.disabled =\r\n          true;\r\n\r\n\r\n        status.textContent =\r\n          \"Analyzing chart...\";\r\n\r\n\r\n        try{\r\n\r\n          const form =\r\n            new FormData();\r\n\r\n\r\n          form.append(\r\n            \"chart\",\r\n            compressedBlob,\r\n            \"chart.jpg\"\r\n          );\r\n\r\n\r\n          form.append(\r\n            \"symbol\",\r\n            document\r\n              .getElementById(\r\n                \"mxah-chart-symbol\"\r\n              )\r\n              .value\r\n              .trim()\r\n              .toUpperCase()\r\n          );\r\n\r\n\r\n          form.append(\r\n            \"timeframe\",\r\n            document\r\n              .getElementById(\r\n                \"mxah-chart-timeframe\"\r\n              )\r\n              .value\r\n          );\r\n\r\n\r\n          const response =\r\n            await fetchWithTimeout(\r\n              CHART_ENDPOINT,\r\n              {\r\n                method:\r\n                  \"POST\",\r\n\r\n                body:\r\n                  form\r\n              },\r\n              45000\r\n            );\r\n\r\n\r\n          const data =\r\n            await readJson(\r\n              response\r\n            );\r\n\r\n\r\n          if(\r\n            !response.ok ||\r\n            !data\r\n          ){\r\n\r\n            throw new Error(\r\n              errorMessage(\r\n                data,\r\n                \"Unable to analyze chart.\"\r\n              )\r\n            );\r\n          }\r\n\r\n\r\n          const result =\r\n            document.getElementById(\r\n              \"mxah-chart-result\"\r\n            );\r\n\r\n\r\n          renderGenericObject(\r\n            result,\r\n            \"AI Chart Analysis\",\r\n            getPayloadData(\r\n              data\r\n            )\r\n          );\r\n\r\n\r\n          status.textContent =\r\n            \"Analysis completed.\";\r\n\r\n\r\n        }catch(error){\r\n\r\n          status.textContent =\r\n            error.name ===\r\n              \"AbortError\"\r\n              ? \"Chart analysis timed out. Please try again.\"\r\n              : (\r\n                  error.message ||\r\n                  \"Unable to analyze chart.\"\r\n                );\r\n\r\n        }finally{\r\n\r\n          button.disabled =\r\n            false;\r\n        }\r\n      }\r\n    );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   STRATEGY INTERVIEW\r\n========================================================= *\/\r\n\r\nfunction renderStrategyTool(){\r\n\r\n  title.textContent =\r\n    \"AI Strategy Interview\";\r\n\r\n\r\n  content.innerHTML = `\r\n\r\n    <div class=\"mxah-form-grid\">\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Experience\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-st-experience\"\r\n        >\r\n\r\n          <option value=\"beginner\">\r\n            Beginner\r\n          <\/option>\r\n\r\n          <option\r\n            value=\"intermediate\"\r\n            selected\r\n          >\r\n            Intermediate\r\n          <\/option>\r\n\r\n          <option value=\"advanced\">\r\n            Advanced\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Preferred Market\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-st-market\"\r\n        >\r\n\r\n          <option value=\"forex\">\r\n            Forex\r\n          <\/option>\r\n\r\n          <option value=\"gold\">\r\n            Gold\r\n          <\/option>\r\n\r\n          <option value=\"indices\">\r\n            Indices\r\n          <\/option>\r\n\r\n          <option value=\"crypto\">\r\n            Crypto\r\n          <\/option>\r\n\r\n          <option value=\"stocks\">\r\n            Stocks\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Trading Style\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-st-style\"\r\n        >\r\n\r\n          <option value=\"scalping\">\r\n            Scalping\r\n          <\/option>\r\n\r\n          <option\r\n            value=\"intraday\"\r\n            selected\r\n          >\r\n            Intraday\r\n          <\/option>\r\n\r\n          <option value=\"swing\">\r\n            Swing\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Risk Tolerance\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-st-risk\"\r\n        >\r\n\r\n          <option value=\"low\">\r\n            Low\r\n          <\/option>\r\n\r\n          <option\r\n            value=\"medium\"\r\n            selected\r\n          >\r\n            Medium\r\n          <\/option>\r\n\r\n          <option value=\"high\">\r\n            High\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Trading Capital\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"mxah-st-capital\"\r\n          type=\"number\"\r\n          min=\"0\"\r\n          step=\"any\"\r\n          placeholder=\"10000\"\r\n        >\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Preferred Session\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-st-session\"\r\n        >\r\n\r\n          <option value=\"any\">\r\n            Any\r\n          <\/option>\r\n\r\n          <option value=\"asia\">\r\n            Asia\r\n          <\/option>\r\n\r\n          <option value=\"london\">\r\n            London\r\n          <\/option>\r\n\r\n          <option value=\"new-york\">\r\n            New York\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field full\">\r\n\r\n        <label>\r\n          Main Objective\r\n        <\/label>\r\n\r\n        <textarea\r\n          id=\"mxah-st-goal\"\r\n          placeholder=\"Describe your trading objective...\"\r\n        ><\/textarea>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"mxah-action-row\">\r\n\r\n      <button\r\n        id=\"mxah-st-submit\"\r\n        class=\"mxah-primary\"\r\n        type=\"button\"\r\n      >\r\n        Build My Strategy\r\n      <\/button>\r\n\r\n      <span\r\n        id=\"mxah-st-status\"\r\n        class=\"mxah-status\"\r\n      >\r\n        Your answers will be used to build a personalized trading framework.\r\n      <\/span>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n      id=\"mxah-st-result\"\r\n      class=\"mxah-result\"\r\n    ><\/div>\r\n  `;\r\n\r\n\r\n  document\r\n    .getElementById(\r\n      \"mxah-st-submit\"\r\n    )\r\n    .addEventListener(\r\n      \"click\",\r\n      async function(){\r\n\r\n        const button =\r\n          this;\r\n\r\n\r\n        const status =\r\n          document.getElementById(\r\n            \"mxah-st-status\"\r\n          );\r\n\r\n\r\n        const capital =\r\n          Number(\r\n            document.getElementById(\r\n              \"mxah-st-capital\"\r\n            ).value\r\n          );\r\n\r\n\r\n        const goal =\r\n          document\r\n            .getElementById(\r\n              \"mxah-st-goal\"\r\n            )\r\n            .value\r\n            .trim();\r\n\r\n\r\n        if(\r\n          !Number.isFinite(\r\n            capital\r\n          ) ||\r\n          capital <= 0\r\n        ){\r\n\r\n          status.textContent =\r\n            \"Enter your trading capital.\";\r\n\r\n          return;\r\n        }\r\n\r\n\r\n        button.disabled =\r\n          true;\r\n\r\n\r\n        status.textContent =\r\n          \"Building your strategy...\";\r\n\r\n\r\n        try{\r\n\r\n          const response =\r\n            await fetchWithTimeout(\r\n              STRATEGY_ENDPOINT,\r\n              {\r\n\r\n                method:\r\n                  \"POST\",\r\n\r\n                headers:{\r\n\r\n                  \"Content-Type\":\r\n                    \"application\/json\",\r\n\r\n                  \"Accept\":\r\n                    \"application\/json\"\r\n                },\r\n\r\n                body:\r\n                  JSON.stringify({\r\n\r\n                    experience:\r\n                      document.getElementById(\r\n                        \"mxah-st-experience\"\r\n                      ).value,\r\n\r\n                    market:\r\n                      document.getElementById(\r\n                        \"mxah-st-market\"\r\n                      ).value,\r\n\r\n                    style:\r\n                      document.getElementById(\r\n                        \"mxah-st-style\"\r\n                      ).value,\r\n\r\n                    risk:\r\n                      document.getElementById(\r\n                        \"mxah-st-risk\"\r\n                      ).value,\r\n\r\n                    capital:\r\n                      capital,\r\n\r\n                    session:\r\n                      document.getElementById(\r\n                        \"mxah-st-session\"\r\n                      ).value,\r\n\r\n                    objective:\r\n                      goal\r\n                  })\r\n              },\r\n              40000\r\n            );\r\n\r\n\r\n          const data =\r\n            await readJson(\r\n              response\r\n            );\r\n\r\n\r\n          if(\r\n            !response.ok ||\r\n            !data\r\n          ){\r\n\r\n            throw new Error(\r\n              errorMessage(\r\n                data,\r\n                \"Unable to build strategy.\"\r\n              )\r\n            );\r\n          }\r\n\r\n\r\n          renderGenericObject(\r\n            document.getElementById(\r\n              \"mxah-st-result\"\r\n            ),\r\n            \"Personalized Strategy\",\r\n            getPayloadData(\r\n              data\r\n            )\r\n          );\r\n\r\n\r\n          status.textContent =\r\n            \"Strategy generated.\";\r\n\r\n\r\n        }catch(error){\r\n\r\n          status.textContent =\r\n            error.name ===\r\n              \"AbortError\"\r\n              ? \"Strategy generation timed out. Please try again.\"\r\n              : (\r\n                  error.message ||\r\n                  \"Unable to build strategy.\"\r\n                );\r\n\r\n        }finally{\r\n\r\n          button.disabled =\r\n            false;\r\n        }\r\n      }\r\n    );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MARKET PRICE\r\n========================================================= *\/\r\n\r\nfunction extractMarketPrice(\r\n  payload\r\n){\r\n\r\n  const values = [\r\n\r\n    payload?.price,\r\n    payload?.last,\r\n    payload?.close,\r\n    payload?.current_price,\r\n\r\n    payload?.data?.price,\r\n    payload?.data?.last,\r\n    payload?.data?.close,\r\n    payload?.data?.current_price,\r\n\r\n    payload?.result?.price,\r\n    payload?.result?.last,\r\n    payload?.result?.close\r\n  ];\r\n\r\n\r\n  for(\r\n    const value of values\r\n  ){\r\n\r\n    const number =\r\n      Number(\r\n        value\r\n      );\r\n\r\n\r\n    if(\r\n      Number.isFinite(\r\n        number\r\n      ) &&\r\n      number > 0\r\n    ){\r\n\r\n      return number;\r\n    }\r\n  }\r\n\r\n\r\n  return null;\r\n}\r\n\r\n\r\nasync function fetchCurrentPrice(\r\n  symbol\r\n){\r\n\r\n  const url =\r\n    new URL(\r\n      MARKET_ENDPOINT,\r\n      window.location.origin\r\n    );\r\n\r\n\r\n  url.searchParams.set(\r\n    \"symbol\",\r\n    symbol\r\n  );\r\n\r\n\r\n  const response =\r\n    await fetchWithTimeout(\r\n      url.toString(),\r\n      {\r\n        headers:{\r\n          Accept:\r\n            \"application\/json\"\r\n        },\r\n\r\n        cache:\r\n          \"no-store\"\r\n      },\r\n      7000\r\n    );\r\n\r\n\r\n  if(\r\n    !response.ok\r\n  ){\r\n\r\n    return null;\r\n  }\r\n\r\n\r\n  return extractMarketPrice(\r\n    await readJson(\r\n      response\r\n    )\r\n  );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   TRADE SCENARIO\r\n========================================================= *\/\r\n\r\nfunction renderScenarioTool(){\r\n\r\n  title.textContent =\r\n    \"AI Trade Scenario\";\r\n\r\n\r\n  content.innerHTML = `\r\n\r\n    <div class=\"mxah-form-grid\">\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Symbol\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"mxah-sc-symbol\"\r\n          placeholder=\"XAUUSD\"\r\n          autocomplete=\"off\"\r\n        >\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Current Price\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"mxah-sc-price\"\r\n          type=\"number\"\r\n          step=\"any\"\r\n          placeholder=\"Auto \/ Manual\"\r\n        >\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Timeframe\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-sc-timeframe\"\r\n        >\r\n\r\n          <option value=\"M15\">\r\n            M15\r\n          <\/option>\r\n\r\n          <option\r\n            value=\"H1\"\r\n            selected\r\n          >\r\n            H1\r\n          <\/option>\r\n\r\n          <option value=\"H4\">\r\n            H4\r\n          <\/option>\r\n\r\n          <option value=\"D1\">\r\n            D1\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Trading Style\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-sc-style\"\r\n        >\r\n\r\n          <option value=\"scalping\">\r\n            Scalping\r\n          <\/option>\r\n\r\n          <option\r\n            value=\"intraday\"\r\n            selected\r\n          >\r\n            Intraday\r\n          <\/option>\r\n\r\n          <option value=\"swing\">\r\n            Swing\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Direction\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-sc-direction\"\r\n        >\r\n\r\n          <option\r\n            value=\"auto\"\r\n            selected\r\n          >\r\n            Auto\r\n          <\/option>\r\n\r\n          <option value=\"buy\">\r\n            Buy\r\n          <\/option>\r\n\r\n          <option value=\"sell\">\r\n            Sell\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Risk Level\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-sc-risk\"\r\n        >\r\n\r\n          <option value=\"low\">\r\n            Low\r\n          <\/option>\r\n\r\n          <option\r\n            value=\"medium\"\r\n            selected\r\n          >\r\n            Medium\r\n          <\/option>\r\n\r\n          <option value=\"high\">\r\n            High\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"mxah-action-row\">\r\n\r\n      <button\r\n        id=\"mxah-sc-submit\"\r\n        class=\"mxah-primary\"\r\n        type=\"button\"\r\n      >\r\n        Generate Scenario\r\n      <\/button>\r\n\r\n      <span\r\n        id=\"mxah-sc-status\"\r\n        class=\"mxah-status\"\r\n      >\r\n        Live price will be requested automatically when available.\r\n      <\/span>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n      id=\"mxah-sc-result\"\r\n      class=\"mxah-result\"\r\n    ><\/div>\r\n  `;\r\n\r\n\r\n  document\r\n    .getElementById(\r\n      \"mxah-sc-submit\"\r\n    )\r\n    .addEventListener(\r\n      \"click\",\r\n      async function(){\r\n\r\n        const button =\r\n          this;\r\n\r\n\r\n        const status =\r\n          document.getElementById(\r\n            \"mxah-sc-status\"\r\n          );\r\n\r\n\r\n        const priceInput =\r\n          document.getElementById(\r\n            \"mxah-sc-price\"\r\n          );\r\n\r\n\r\n        const symbol =\r\n          document\r\n            .getElementById(\r\n              \"mxah-sc-symbol\"\r\n            )\r\n            .value\r\n            .trim()\r\n            .toUpperCase();\r\n\r\n\r\n        if(!symbol){\r\n\r\n          status.textContent =\r\n            \"Enter a symbol.\";\r\n\r\n          return;\r\n        }\r\n\r\n\r\n        button.disabled =\r\n          true;\r\n\r\n\r\n        status.textContent =\r\n          \"Preparing market data...\";\r\n\r\n\r\n        try{\r\n\r\n          let price =\r\n            Number(\r\n              priceInput.value\r\n            );\r\n\r\n\r\n          if(\r\n            !Number.isFinite(\r\n              price\r\n            ) ||\r\n            price <= 0\r\n          ){\r\n\r\n            price =\r\n              await fetchCurrentPrice(\r\n                symbol\r\n              );\r\n          }\r\n\r\n\r\n          if(\r\n            !Number.isFinite(\r\n              price\r\n            ) ||\r\n            price <= 0\r\n          ){\r\n\r\n            status.textContent =\r\n              \"Live price is unavailable. Enter Current Price manually.\";\r\n\r\n            return;\r\n          }\r\n\r\n\r\n          priceInput.value =\r\n            String(\r\n              price\r\n            );\r\n\r\n\r\n          status.textContent =\r\n            \"Generating scenario...\";\r\n\r\n\r\n          const response =\r\n            await fetchWithTimeout(\r\n              SCENARIO_ENDPOINT,\r\n              {\r\n\r\n                method:\r\n                  \"POST\",\r\n\r\n                headers:{\r\n\r\n                  \"Content-Type\":\r\n                    \"application\/json\",\r\n\r\n                  \"Accept\":\r\n                    \"application\/json\"\r\n                },\r\n\r\n                body:\r\n                  JSON.stringify({\r\n\r\n                    symbol:\r\n                      symbol,\r\n\r\n                    current_price:\r\n                      price,\r\n\r\n                    timeframe:\r\n                      document.getElementById(\r\n                        \"mxah-sc-timeframe\"\r\n                      ).value,\r\n\r\n                    style:\r\n                      document.getElementById(\r\n                        \"mxah-sc-style\"\r\n                      ).value,\r\n\r\n                    bias:\r\n                      document.getElementById(\r\n                        \"mxah-sc-direction\"\r\n                      ).value,\r\n\r\n                    risk:\r\n                      document.getElementById(\r\n                        \"mxah-sc-risk\"\r\n                      ).value\r\n                  })\r\n              },\r\n              40000\r\n            );\r\n\r\n\r\n          const data =\r\n            await readJson(\r\n              response\r\n            );\r\n\r\n\r\n          if(\r\n            !response.ok ||\r\n            !data\r\n          ){\r\n\r\n            throw new Error(\r\n              errorMessage(\r\n                data,\r\n                \"Unable to generate scenario.\"\r\n              )\r\n            );\r\n          }\r\n\r\n\r\n          const scenario =\r\n            getPayloadData(\r\n              data\r\n            );\r\n\r\n\r\n          const result =\r\n            document.getElementById(\r\n              \"mxah-sc-result\"\r\n            );\r\n\r\n\r\n          const entryLow =\r\n            scenario.entry_low ??\r\n            scenario.entryLow ??\r\n            scenario.entry ??\r\n            \"N\/A\";\r\n\r\n\r\n          const entryHigh =\r\n            scenario.entry_high ??\r\n            scenario.entryHigh ??\r\n            scenario.entry ??\r\n            \"N\/A\";\r\n\r\n\r\n          result.innerHTML = `\r\n\r\n            <h4>\r\n              AI Scenario\r\n            <\/h4>\r\n\r\n            <div class=\"mxah-result-grid\">\r\n\r\n              <div class=\"mxah-result-card\">\r\n\r\n                <span>\r\n                  Bias\r\n                <\/span>\r\n\r\n                <strong>\r\n                  ${esc(\r\n                    scenario.bias ??\r\n                    scenario.direction ??\r\n                    \"N\/A\"\r\n                  )}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n\r\n\r\n              <div class=\"mxah-result-card\">\r\n\r\n                <span>\r\n                  Entry\r\n                <\/span>\r\n\r\n                <strong>\r\n                  ${esc(\r\n                    entryLow ===\r\n                    entryHigh\r\n                      ? entryLow\r\n                      : (\r\n                          entryLow +\r\n                          \" - \" +\r\n                          entryHigh\r\n                        )\r\n                  )}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n\r\n\r\n              <div class=\"mxah-result-card\">\r\n\r\n                <span>\r\n                  Stop Loss\r\n                <\/span>\r\n\r\n                <strong>\r\n                  ${esc(\r\n                    scenario.stop_loss ??\r\n                    scenario.stopLoss ??\r\n                    \"N\/A\"\r\n                  )}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n\r\n\r\n              <div class=\"mxah-result-card\">\r\n\r\n                <span>\r\n                  Target 1\r\n                <\/span>\r\n\r\n                <strong>\r\n                  ${esc(\r\n                    scenario.take_profit_1 ??\r\n                    scenario.takeProfit1 ??\r\n                    scenario.tp1 ??\r\n                    \"N\/A\"\r\n                  )}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n\r\n\r\n              <div class=\"mxah-result-card\">\r\n\r\n                <span>\r\n                  Target 2\r\n                <\/span>\r\n\r\n                <strong>\r\n                  ${esc(\r\n                    scenario.take_profit_2 ??\r\n                    scenario.takeProfit2 ??\r\n                    scenario.tp2 ??\r\n                    \"N\/A\"\r\n                  )}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n\r\n\r\n              <div class=\"mxah-result-card\">\r\n\r\n                <span>\r\n                  Risk \/ Reward\r\n                <\/span>\r\n\r\n                <strong>\r\n                  ${esc(\r\n                    scenario.risk_reward ??\r\n                    scenario.riskReward ??\r\n                    \"N\/A\"\r\n                  )}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n\r\n            <\/div>\r\n          `;\r\n\r\n\r\n          const reasoning =\r\n            scenario.reasoning ||\r\n            scenario.rationale ||\r\n            scenario.analysis ||\r\n            \"\";\r\n\r\n\r\n          if(reasoning){\r\n\r\n            result.innerHTML += `\r\n\r\n              <div\r\n                class=\"mxah-result-card\"\r\n                style=\"margin-top:10px\"\r\n              >\r\n\r\n                <span>\r\n                  Scenario Reasoning\r\n                <\/span>\r\n\r\n                <strong\r\n                  style=\"\r\n                    font-size:11px;\r\n                    line-height:1.7;\r\n                    font-weight:500;\r\n                  \"\r\n                >\r\n                  ${esc(reasoning)}\r\n                <\/strong>\r\n\r\n              <\/div>\r\n            `;\r\n          }\r\n\r\n\r\n          result.classList.add(\r\n            \"show\"\r\n          );\r\n\r\n\r\n          status.textContent =\r\n            \"Scenario generated.\";\r\n\r\n\r\n        }catch(error){\r\n\r\n          status.textContent =\r\n            error.name ===\r\n              \"AbortError\"\r\n              ? \"Scenario generation timed out. Please try again.\"\r\n              : (\r\n                  error.message ||\r\n                  \"Unable to generate scenario.\"\r\n                );\r\n\r\n        }finally{\r\n\r\n          button.disabled =\r\n            false;\r\n        }\r\n      }\r\n    );\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BROKER FINDER\r\n========================================================= *\/\r\n\r\nfunction renderFinderTool(){\r\n\r\n  title.textContent =\r\n    \"AI Broker & Exchange Finder\";\r\n\r\n\r\n  content.innerHTML = `\r\n\r\n    <div class=\"mxah-form-grid\">\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Region\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-fi-region\"\r\n        >\r\n\r\n          <option value=\"uae\">\r\n            UAE\r\n          <\/option>\r\n\r\n          <option value=\"uk\">\r\n            United Kingdom\r\n          <\/option>\r\n\r\n          <option value=\"eu\">\r\n            Europe\r\n          <\/option>\r\n\r\n          <option value=\"asia\">\r\n            Asia\r\n          <\/option>\r\n\r\n          <option value=\"international\">\r\n            International\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Market\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-fi-market\"\r\n        >\r\n\r\n          <option value=\"forex\">\r\n            Forex\r\n          <\/option>\r\n\r\n          <option value=\"crypto\">\r\n            Crypto\r\n          <\/option>\r\n\r\n          <option value=\"stocks\">\r\n            Stocks\r\n          <\/option>\r\n\r\n          <option value=\"indices\">\r\n            Indices\r\n          <\/option>\r\n\r\n          <option value=\"multi\">\r\n            Multi Asset\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Deposit Size\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-fi-deposit\"\r\n        >\r\n\r\n          <option value=\"under-500\">\r\n            Under $500\r\n          <\/option>\r\n\r\n          <option value=\"500-5000\">\r\n            $500 \u2013 $5,000\r\n          <\/option>\r\n\r\n          <option value=\"5000-25000\">\r\n            $5,000 \u2013 $25,000\r\n          <\/option>\r\n\r\n          <option value=\"25000-plus\">\r\n            $25,000+\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Platform\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-fi-platform\"\r\n        >\r\n\r\n          <option value=\"any\">\r\n            Any\r\n          <\/option>\r\n\r\n          <option value=\"mt4\">\r\n            MetaTrader 4\r\n          <\/option>\r\n\r\n          <option value=\"mt5\">\r\n            MetaTrader 5\r\n          <\/option>\r\n\r\n          <option value=\"ctrader\">\r\n            cTrader\r\n          <\/option>\r\n\r\n          <option value=\"tradingview\">\r\n            TradingView\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Regulation Priority\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-fi-regulation\"\r\n        >\r\n\r\n          <option value=\"highest\">\r\n            Highest Priority\r\n          <\/option>\r\n\r\n          <option value=\"balanced\">\r\n            Balanced\r\n          <\/option>\r\n\r\n          <option value=\"flexible\">\r\n            Flexible\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"mxah-field\">\r\n\r\n        <label>\r\n          Leverage Preference\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"mxah-fi-leverage\"\r\n        >\r\n\r\n          <option value=\"low\">\r\n            Conservative\r\n          <\/option>\r\n\r\n          <option value=\"medium\">\r\n            Medium\r\n          <\/option>\r\n\r\n          <option value=\"high\">\r\n            High\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"mxah-action-row\">\r\n\r\n      <button\r\n        id=\"mxah-fi-submit\"\r\n        class=\"mxah-primary\"\r\n        type=\"button\"\r\n      >\r\n        Find My Best Match\r\n      <\/button>\r\n\r\n      <span\r\n        id=\"mxah-fi-status\"\r\n        class=\"mxah-status\"\r\n      >\r\n        MARKUNOX will compare your preferences against broker intelligence data.\r\n      <\/span>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n      id=\"mxah-fi-result\"\r\n      class=\"mxah-result\"\r\n    ><\/div>\r\n  `;\r\n\r\n\r\n  document\r\n    .getElementById(\r\n      \"mxah-fi-submit\"\r\n    )\r\n    .addEventListener(\r\n      \"click\",\r\n      async function(){\r\n\r\n        const button =\r\n          this;\r\n\r\n\r\n        const status =\r\n          document.getElementById(\r\n            \"mxah-fi-status\"\r\n          );\r\n\r\n\r\n        button.disabled =\r\n          true;\r\n\r\n\r\n        status.textContent =\r\n          \"Matching your preferences...\";\r\n\r\n\r\n        try{\r\n\r\n          const response =\r\n            await fetchWithTimeout(\r\n              FINDER_ENDPOINT,\r\n              {\r\n\r\n                method:\r\n                  \"POST\",\r\n\r\n                headers:{\r\n\r\n                  \"Content-Type\":\r\n                    \"application\/json\",\r\n\r\n                  \"Accept\":\r\n                    \"application\/json\"\r\n                },\r\n\r\n                body:\r\n                  JSON.stringify({\r\n\r\n                    region:\r\n                      document.getElementById(\r\n                        \"mxah-fi-region\"\r\n                      ).value,\r\n\r\n                    market:\r\n                      document.getElementById(\r\n                        \"mxah-fi-market\"\r\n                      ).value,\r\n\r\n                    deposit:\r\n                      document.getElementById(\r\n                        \"mxah-fi-deposit\"\r\n                      ).value,\r\n\r\n                    platform:\r\n                      document.getElementById(\r\n                        \"mxah-fi-platform\"\r\n                      ).value,\r\n\r\n                    regulation_priority:\r\n                      document.getElementById(\r\n                        \"mxah-fi-regulation\"\r\n                      ).value,\r\n\r\n                    leverage:\r\n                      document.getElementById(\r\n                        \"mxah-fi-leverage\"\r\n                      ).value\r\n                  })\r\n              },\r\n              40000\r\n            );\r\n\r\n\r\n          const data =\r\n            await readJson(\r\n              response\r\n            );\r\n\r\n\r\n          if(\r\n            !response.ok ||\r\n            !data\r\n          ){\r\n\r\n            throw new Error(\r\n              errorMessage(\r\n                data,\r\n                \"Unable to find a match.\"\r\n              )\r\n            );\r\n          }\r\n\r\n\r\n          const payload =\r\n            getPayloadData(\r\n              data\r\n            );\r\n\r\n\r\n          const result =\r\n            document.getElementById(\r\n              \"mxah-fi-result\"\r\n            );\r\n\r\n\r\n          const matches =\r\n            payload.matches ||\r\n            payload.brokers ||\r\n            payload.results ||\r\n            (\r\n              Array.isArray(payload)\r\n                ? payload\r\n                : []\r\n            );\r\n\r\n\r\n          if(\r\n            Array.isArray(matches) &&\r\n            matches.length\r\n          ){\r\n\r\n            let html = `\r\n\r\n              <h4>\r\n                Best Matches\r\n              <\/h4>\r\n\r\n              <div class=\"mxah-result-grid\">\r\n            `;\r\n\r\n\r\n            matches\r\n              .slice(\r\n                0,\r\n                6\r\n              )\r\n              .forEach(\r\n                function(match){\r\n\r\n                  const name =\r\n                    match.name ||\r\n                    match.broker_name ||\r\n                    match.exchange_name ||\r\n                    \"Match\";\r\n\r\n\r\n                  const score =\r\n                    match.match_score ??\r\n                    match.score ??\r\n                    match.rating ??\r\n                    \"\";\r\n\r\n\r\n                  const reason =\r\n                    match.reason ||\r\n                    match.summary ||\r\n                    match.why ||\r\n                    \"\";\r\n\r\n\r\n                  html += `\r\n\r\n                    <div class=\"mxah-result-card\">\r\n\r\n                      <span>\r\n                        ${esc(name)}\r\n                      <\/span>\r\n\r\n                      <strong>\r\n                        ${\r\n                          score !== \"\"\r\n                            ? esc(score) +\r\n                              \"% Match\"\r\n                            : \"Matched\"\r\n                        }\r\n                      <\/strong>\r\n\r\n                      ${\r\n                        reason\r\n                          ? `\r\n                            <div\r\n                              style=\"\r\n                                margin-top:8px;\r\n                                color:#D7F4F6;\r\n                                font-size:9px;\r\n                                line-height:1.55;\r\n                              \"\r\n                            >\r\n                              ${esc(reason)}\r\n                            <\/div>\r\n                          `\r\n                          : \"\"\r\n                      }\r\n\r\n                    <\/div>\r\n                  `;\r\n                }\r\n              );\r\n\r\n\r\n            html +=\r\n              \"<\/div>\";\r\n\r\n\r\n            result.innerHTML =\r\n              html;\r\n\r\n\r\n            result.classList.add(\r\n              \"show\"\r\n            );\r\n\r\n          }else{\r\n\r\n            renderGenericObject(\r\n              result,\r\n              \"Broker & Exchange Match\",\r\n              payload\r\n            );\r\n          }\r\n\r\n\r\n          status.textContent =\r\n            \"Matching completed.\";\r\n\r\n\r\n        }catch(error){\r\n\r\n          status.textContent =\r\n            error.name ===\r\n              \"AbortError\"\r\n              ? \"Matching timed out. Please try again.\"\r\n              : (\r\n                  error.message ||\r\n                  \"Unable to find a match.\"\r\n                );\r\n\r\n        }finally{\r\n\r\n          button.disabled =\r\n            false;\r\n        }\r\n      }\r\n    );\r\n}\r\n\r\n\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Top Forex Brokers &amp; Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00a0 \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker &amp; Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-33","page","type-page","status-publish","hentry"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Top Forex Brokers &amp; Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker &amp; Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/markunox.com\/ar\/home\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ar_AR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"markunox - MARKUNOX \u2014 Global financial markets, advanced trading analysis, broker intelligence, AI-powered insights, real-time data and professional trading tools.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Home - markunox\" \/>\n\t\t<meta property=\"og:description\" content=\"Top Forex Brokers &amp; Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker &amp; Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/markunox.com\/ar\/home\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-08-10T14:35:45+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-26T01:15:31+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Home - markunox\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Top Forex Brokers &amp; Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker &amp; Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/markunox.com\\\/ar\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#listItem\",\"position\":2,\"name\":\"Home\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/#organization\",\"name\":\"markunox\",\"description\":\"MARKUNOX \\u2014 Global financial markets, advanced trading analysis, broker intelligence, AI-powered insights, real-time data and professional trading tools.\",\"url\":\"https:\\\/\\\/markunox.com\\\/ar\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/markunox.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#organizationLogo\",\"width\":1122,\"height\":1402,\"caption\":\"Markunox \\u2013 Global Financial Intelligence\"},\"image\":{\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#organizationLogo\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#webpage\",\"url\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/\",\"name\":\"Home - markunox\",\"description\":\"Top Forex Brokers & Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \\u00d7 MARKUNOX INTELLIGENCE View profile \\u2197 MARKUNOX Ranking Global Broker & Exchange Intelligence \\ud83c\\udfc6 MARKUNOX Ranking \\u2605 Brand Ranking \\u2668 Popular Ranking \\u25a5 Trading ENV \\u2620 Scam Broker All Categories All Categories \\u2304\",\"inLanguage\":\"ar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/home\\\/#breadcrumblist\"},\"datePublished\":\"2026-08-10T18:35:45+04:00\",\"dateModified\":\"2026-09-26T05:15:31+04:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/#website\",\"url\":\"https:\\\/\\\/markunox.com\\\/ar\\\/\",\"name\":\"markunox\",\"description\":\"MARKUNOX \\u2014 Global financial markets, advanced trading analysis, broker intelligence, AI-powered insights, real-time data and professional trading tools.\",\"inLanguage\":\"ar\",\"publisher\":{\"@id\":\"https:\\\/\\\/markunox.com\\\/ar\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Home - markunox","description":"Top Forex Brokers & Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker & Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304","canonical_url":"https:\/\/markunox.com\/ar\/home\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/markunox.com\/ar\/home\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/markunox.com\/ar#listItem","position":1,"name":"Home","item":"https:\/\/markunox.com\/ar","nextItem":{"@type":"ListItem","@id":"https:\/\/markunox.com\/ar\/home\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/markunox.com\/ar\/home\/#listItem","position":2,"name":"Home","previousItem":{"@type":"ListItem","@id":"https:\/\/markunox.com\/ar#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/markunox.com\/ar\/#organization","name":"markunox","description":"MARKUNOX \u2014 Global financial markets, advanced trading analysis, broker intelligence, AI-powered insights, real-time data and professional trading tools.","url":"https:\/\/markunox.com\/ar\/","logo":{"@type":"ImageObject","url":"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp","@id":"https:\/\/markunox.com\/ar\/home\/#organizationLogo","width":1122,"height":1402,"caption":"Markunox \u2013 Global Financial Intelligence"},"image":{"@id":"https:\/\/markunox.com\/ar\/home\/#organizationLogo"}},{"@type":"WebPage","@id":"https:\/\/markunox.com\/ar\/home\/#webpage","url":"https:\/\/markunox.com\/ar\/home\/","name":"Home - markunox","description":"Top Forex Brokers & Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker & Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304","inLanguage":"ar","isPartOf":{"@id":"https:\/\/markunox.com\/ar\/#website"},"breadcrumb":{"@id":"https:\/\/markunox.com\/ar\/home\/#breadcrumblist"},"datePublished":"2026-08-10T18:35:45+04:00","dateModified":"2026-09-26T05:15:31+04:00"},{"@type":"WebSite","@id":"https:\/\/markunox.com\/ar\/#website","url":"https:\/\/markunox.com\/ar\/","name":"markunox","description":"MARKUNOX \u2014 Global financial markets, advanced trading analysis, broker intelligence, AI-powered insights, real-time data and professional trading tools.","inLanguage":"ar","publisher":{"@id":"https:\/\/markunox.com\/ar\/#organization"}}]},"og:locale":"ar_AR","og:site_name":"markunox - MARKUNOX \u2014 Global financial markets, advanced trading analysis, broker intelligence, AI-powered insights, real-time data and professional trading tools.","og:type":"article","og:title":"Home - markunox","og:description":"Top Forex Brokers &amp; Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker &amp; Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304","og:url":"https:\/\/markunox.com\/ar\/home\/","og:image":"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp","og:image:secure_url":"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp","article:published_time":"2026-08-10T14:35:45+00:00","article:modified_time":"2026-09-26T01:15:31+00:00","twitter:card":"summary_large_image","twitter:title":"Home - markunox","twitter:description":"Top Forex Brokers &amp; Cryptocurrency Exchanges Explore trusted brokers and leading cryptocurrency exchanges with independent ratings, reviews, regulation data, and risk insights. \u00d7 MARKUNOX INTELLIGENCE View profile \u2197 MARKUNOX Ranking Global Broker &amp; Exchange Intelligence \ud83c\udfc6 MARKUNOX Ranking \u2605 Brand Ranking \u2668 Popular Ranking \u25a5 Trading ENV \u2620 Scam Broker All Categories All Categories \u2304","twitter:image":"https:\/\/markunox.com\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Sep-22-2026-12_58_01-AM.webp"},"aioseo_meta_data":{"post_id":"33","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":"","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_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"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":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-08-10 14:35:46","updated":"2026-09-26 01:53:43"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/markunox.com\/ar\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tHome\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/markunox.com\/ar"},{"label":"Home","link":"https:\/\/markunox.com\/ar\/home\/"}],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/pages\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/comments?post=33"}],"version-history":[{"count":84,"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/pages\/33\/revisions"}],"predecessor-version":[{"id":3227,"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/pages\/33\/revisions\/3227"}],"wp:attachment":[{"href":"https:\/\/markunox.com\/ar\/wp-json\/wp\/v2\/media?parent=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}