PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.4
Independent Analytics – WordPress Analytics Plugin v2.15.4
2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Independent_Analytics.php
independent-analytics / IAWP Last commit date
AJAX 1 day ago Admin_Page 2 weeks ago Click_Tracking 3 weeks ago ColumnOptions 6 months ago Cron 9 months ago Data_Pruning 6 days ago Date_Picker 4 months ago Date_Range 5 months ago Ecommerce 5 months ago Email_Reports 2 weeks ago Examiner 4 months ago Favicon 2 months ago Form_Submissions 3 weeks ago Integrations 3 weeks ago Journey 3 months ago Migrations 6 months ago Models 3 weeks ago Overview 2 months ago Public_API 5 months ago RealTime 1 week ago Rows 1 week ago Statistics 3 weeks ago Tables 2 weeks ago Utils 2 weeks ago Views 3 weeks ago ViewsColumn 3 weeks ago WooCommerceOrderMetaBox 5 months ago ActivationLifecycle.php 4 months ago Admin_Bar_Stats.php 3 weeks ago Appearance.php 1 year ago BreakdanceFormAction.php 3 weeks ago Campaign_Builder.php 3 weeks ago Capability_Manager.php 3 weeks ago Chart.php 2 months ago Chart_Data.php 1 year ago Click_Tracking.php 2 months ago ComplianzIntegration.php 4 months ago Cron_Job.php 5 months ago Cron_Manager.php 5 months ago Dashboard_Options.php 6 months ago Dashboard_Widget.php 2 months ago Database.php 9 months ago Database_Manager.php 3 weeks ago Empty_Report_Option.php 2 years ago Env.php 3 weeks ago Examiner_Config.php 11 months ago FetchFaviconsJob.php 5 months ago Filters.php 2 weeks ago Geo_Database_Health_Check_Job.php 9 months ago Geo_Database_Manager.php 6 months ago Geoposition.php 1 year ago Icon_Directory.php 6 months ago Icon_Directory_Factory.php 2 years ago Illuminate_Builder.php 11 months ago Independent_Analytics.php 1 day ago Interrupt.php 4 months ago Known_Referrers.php 3 weeks ago MainWP.php 2 months ago Map.php 9 months ago Map_Data.php 1 year ago Migration_Fixer_Job.php 5 months ago Patch.php 1 year ago Payload_Validator.php 9 months ago Plugin_Conflict_Detector.php 3 weeks ago Plugin_Group.php 6 months ago Plugin_Group_Option.php 2 years ago Query.php 1 year ago Query_Taps.php 4 months ago Quick_Stats.php 4 months ago REST_API.php 3 weeks ago Report.php 1 year ago Report_Finder.php 6 months ago Report_Options_Parser.php 9 months ago Resource_Identifier.php 2 months ago Settings.php 2 months ago Sort_Configuration.php 9 months ago Tables.php 9 months ago Track_Resource_Changes.php 1 year ago View_Counter.php 6 months ago VisitorSaltRefreshInterval.php 6 months ago WP_Option_Cache_Bust.php 2 years ago
Independent_Analytics.php
664 lines
1 <?php
2
3 namespace IAWP;
4
5 use IAWPSCOPED\Carbon\CarbonImmutable;
6 use IAWPSCOPED\Carbon\CarbonInterval;
7 use IAWP\Admin_Page\Analytics_Page;
8 use IAWP\Admin_Page\Campaign_Builder_Page;
9 use IAWP\Admin_Page\Click_Tracking_Page;
10 use IAWP\Admin_Page\Debug_Page;
11 use IAWP\Admin_Page\Integrations_Pages;
12 use IAWP\Admin_Page\Settings_Page;
13 use IAWP\Admin_Page\Support_Page;
14 use IAWP\Admin_Page\Updates_Page;
15 use IAWP\Admin_Page\Visitor_Page;
16 use IAWP\AJAX\AJAX_Manager;
17 use IAWP\Click_Tracking\Click_Processing_Job;
18 use IAWP\Data_Pruning\Pruner;
19 use IAWP\Ecommerce\EDD_Order;
20 use IAWP\Ecommerce\Fluent_Cart_Order;
21 use IAWP\Ecommerce\PMPro_Order;
22 use IAWP\Ecommerce\SureCart_Event_Sync_Job;
23 use IAWP\Ecommerce\SureCart_Order;
24 use IAWP\Ecommerce\SureCart_Store;
25 use IAWP\Ecommerce\WooCommerce_Order;
26 use IAWP\Email_Reports\Email_Reports;
27 use IAWP\Form_Submissions\Form;
28 use IAWP\Form_Submissions\Submission_Listener;
29 use IAWP\Journey\JourneyStatisticsJob;
30 use IAWP\Migrations\Migrations;
31 use IAWP\Overview\Module_Refresh_Job;
32 use IAWP\Overview\Modules\Module;
33 use IAWP\Utils\Format;
34 use IAWP\Utils\Plugin;
35 use IAWP\Utils\Request;
36 use IAWP\Utils\Singleton;
37 use IAWP\Utils\Timezone;
38 use IAWP\WooCommerceOrderMetaBox\WooCommerceOrderMetaBox;
39 use IAWPSCOPED\Illuminate\Support\Carbon;
40 use IAWPSCOPED\Illuminate\Support\Str;
41 /** @internal */
42 class Independent_Analytics
43 {
44 use Singleton;
45 public $settings;
46 public $email_reports;
47 public $cron_manager;
48 private $is_woocommerce_support_enabled;
49 private $is_surecart_support_enabled;
50 private $is_edd_support_enabled;
51 private $is_pmpro_support_enabled;
52 private $is_fluent_cart_support_enabled;
53 private $is_form_submission_support_enabled;
54 // This is where we attach functions to WP hooks
55 private function __construct()
56 {
57 $this->configure_carbon();
58 $this->settings = new \IAWP\Settings();
59 new \IAWP\REST_API();
60 new \IAWP\Dashboard_Widget();
61 new \IAWP\View_Counter();
62 new Submission_Listener();
63 Pruner::register_hook();
64 AJAX_Manager::getInstance();
65 if (!Migrations::is_migrating()) {
66 new \IAWP\Track_Resource_Changes();
67 \IAWP\Admin_Bar_Stats::register();
68 WooCommerce_Order::register_hooks();
69 EDD_Order::register_hooks();
70 PMPro_Order::register_hooks();
71 SureCart_Order::register_hooks();
72 Fluent_Cart_Order::register_hooks();
73 }
74 \IAWP\Cron_Job::register_custom_intervals();
75 \IAWP\Database_Manager::register_actions();
76 $this->cron_manager = new \IAWP\Cron_Manager();
77 (new SureCart_Event_Sync_Job())->register_handler();
78 (new JourneyStatisticsJob())->register_handler();
79 (new \IAWP\FetchFaviconsJob())->register_handler();
80 (new Click_Processing_Job())->register_handler();
81 (new Module_Refresh_Job())->register_handler();
82 (new \IAWP\Migration_Fixer_Job())->register_handler();
83 (new \IAWP\Geo_Database_Health_Check_Job())->register_handler();
84 if (\IAWPSCOPED\iawp_is_pro()) {
85 $this->email_reports = new Email_Reports();
86 new \IAWP\Campaign_Builder();
87 WooCommerceOrderMetaBox::register();
88 \add_action('iawp_module_refresh_now', function () {
89 Module::refresh_all_modules();
90 });
91 }
92 \add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts_and_styles'], 110);
93 // Called at 110 to dequeue other scripts
94 \add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts_and_styles_front_end']);
95 \add_action('admin_menu', [$this, 'add_admin_menu_pages']);
96 \add_action('admin_init', [$this, 'remove_freemius_pricing_menu']);
97 \add_filter('plugin_action_links_independent-analytics/iawp.php', [$this, 'plugin_action_links']);
98 \add_action('init', [$this, 'polylang_translations']);
99 \add_action('init', [$this, 'load_text_domain']);
100 // Freemius adjustments
101 \IAWP_FS()->add_filter('pricing_url', [$this, 'change_freemius_pricing_url'], 10);
102 \IAWP_FS()->add_filter('show_affiliate_program_notice', '__return_false');
103 \IAWP_FS()->add_filter('show_deactivation_feedback_form', function () {
104 return \false;
105 });
106 \IAWP_FS()->add_filter('plugin_icon', function () {
107 \IAWPSCOPED\iawp_url_to('img/plugin-icon.png');
108 });
109 \IAWP_FS()->add_filter('connect-header', [$this, 'freemius_optin_heading']);
110 \IAWP_FS()->add_filter('connect_message', [$this, 'freemius_optin_text']);
111 \add_action('admin_init', [$this, 'override_freemius_text']);
112 // Other hooks
113 \add_action('admin_init', [$this, 'maybe_delete_mu_plugin']);
114 \add_action('admin_body_class', [$this, 'add_body_class']);
115 \add_filter('sgs_whitelist_wp_content', [$this, 'whitelist_click_endpoint']);
116 \add_filter('cmplz_whitelisted_script_tags', [$this, 'whitelist_script_tag_for_complianz']);
117 \add_filter('plugin_action_links_independent-analytics/iawp.php', [$this, 'add_upgrade_link_in_plugins_menu'], 999);
118 \add_filter('plugin_row_meta', [$this, 'add_docs_link_in_plugins_menu'], 10, 2);
119 \add_action('admin_footer', [$this, 'attach_system_appearance_script'], 99, 0);
120 \add_filter('sgo_javascript_combine_excluded_inline_content', [$this, 'exclude_tracking_script_from_speed_optimizer'], 10, 1);
121 \add_action('admin_init', [$this, 'update_cookie']);
122 }
123 public function override_freemius_text()
124 {
125 if (\function_exists('IAWPSCOPED\\fs_override_i18n')) {
126 fs_override_i18n(['opt-in-connect' => \__('Subscribe & Go To Analytics', 'independent-analytics'), 'skip' => \__('No, thanks', 'independent-analytics')], 'independent-analytics');
127 }
128 }
129 public function add_upgrade_link_in_plugins_menu($links)
130 {
131 if (\IAWPSCOPED\iawp_is_pro()) {
132 return $links;
133 }
134 $upgrade_link = '<a target="_blank" style="color:#36B366;font-weight:700;"
135 href="https://independentwp.com/pro/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Plugin+Settings+Link"
136 >' . \esc_html__('Upgrade to Pro', 'independent-analytics') . '</a>';
137 \array_unshift($links, $upgrade_link);
138 return $links;
139 }
140 public function add_docs_link_in_plugins_menu($plugin_meta, $plugin_file)
141 {
142 if ($plugin_file == 'independent-analytics/iawp.php' || $plugin_file == 'independent-analytics-pro/iawp.php') {
143 $plugin_meta[] = '<a target="_blank" href="https://independentwp.com/knowledgebase/">' . \esc_html__('Knowledge Base', 'independent-analytics') . '</a>';
144 }
145 return $plugin_meta;
146 }
147 /**
148 * Attach some JavaScript to manage the color scheme for admin pages.
149 *
150 * @return void
151 */
152 public function attach_system_appearance_script() : void
153 {
154 ?>
155 <script>
156 ;(() => {
157 try {
158 const isLightMode = document.body.classList.contains('iawp-light-mode')
159 const isDarkMode = document.body.classList.contains('iawp-dark-mode')
160 const isSystem = !isLightMode && !isDarkMode
161
162 // Stop if they're not using the systems color scheme
163 if(!isSystem) {
164 return
165 }
166
167 // Switch to dark mode if dark is the system color scheme preference
168 if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
169 document.body.classList.add('iawp-dark-mode')
170 }
171
172 // Watching for changes is a nice idea, but it's more complicated than just
173 // adding or removing a class from the body. There are elements like
174 // charts that cannot adapt without a rendered. Holding off on this.
175
176 // window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
177 // if(event.matches) {
178 // document.body.classList.remove('iawp-light-mode')
179 // document.body.classList.add('iawp-dark-mode')
180 // } else {
181 // document.body.classList.remove('iawp-dark-mode')
182 // document.body.classList.add('iawp-light-mode')
183 // }
184 // });
185 } catch (error) {
186
187 }
188 })();
189
190 </script>
191 <?php
192 }
193 public function add_body_class(string $classes) : string
194 {
195 $newClasses = [];
196 if (\IAWP\Appearance::is_light()) {
197 $newClasses[] = 'iawp-light-mode';
198 } elseif (\IAWP\Appearance::is_dark()) {
199 $newClasses[] = 'iawp-dark-mode';
200 }
201 $page = \IAWP\Env::get_page();
202 if (\is_string($page)) {
203 $newClasses[] = $page;
204 }
205 if (\array_key_exists('examiner', $_GET)) {
206 $newClasses[] = 'iawp-in-examiner';
207 }
208 return $classes . ' ' . \implode(' ', $newClasses) . ' ';
209 }
210 /**
211 * At one point in time, there was a must-use plugin that was created. The plugin file and the
212 * option need to get cleaned up.
213 * @return void
214 */
215 public function maybe_delete_mu_plugin()
216 {
217 $already_attempted = \get_option('iawp_attempted_to_delete_mu_plugin', '0');
218 if ($already_attempted === '1') {
219 return;
220 }
221 if (\get_option('iawp_must_use_directory_not_writable', '0') === '1') {
222 \delete_option('iawp_must_use_directory_not_writable');
223 }
224 $mu_plugin_file = \trailingslashit(\WPMU_PLUGIN_DIR) . 'iawp-performance-boost.php';
225 if (\file_exists($mu_plugin_file)) {
226 \unlink($mu_plugin_file);
227 }
228 \update_option('iawp_attempted_to_delete_mu_plugin', '1', \true);
229 }
230 public function load_text_domain()
231 {
232 \load_plugin_textdomain('independent-analytics', \false, \IAWP_LANGUAGES_DIRECTORY);
233 // Freemius overrides must happen after the text domain is loaded
234 \IAWP_FS()->override_i18n(['yee-haw' => \__('Success', 'independent-analytics')]);
235 }
236 public function polylang_translations()
237 {
238 if (\function_exists('IAWPSCOPED\\pll_register_string')) {
239 pll_register_string('view_counter', 'Views:', 'Independent Analytics');
240 }
241 }
242 // Changes the URL for the "Upgrade" tab in the Account menu
243 public function change_freemius_pricing_url()
244 {
245 return 'https://independentwp.com/pro/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Upgrade+to+Pro&utm_content=Account';
246 }
247 public function freemius_optin_heading()
248 {
249 return '<h2>' . \esc_html__('Congratulations on Your New Analytics! 🎉', 'independent-analytics') . '</h2>';
250 }
251 public function freemius_optin_text()
252 {
253 $html = '<p>' . \esc_html__("You've just taken the first step towards building a better website.", "independent-analytics") . '</p>';
254 $html .= '<br />';
255 $html .= '<p>' . \esc_html__("If you signup for our free email course, we’ll walk you through each feature in Independent Analytics, so you can learn how to analyze and optimize your website for growth.", "independent-analytics") . '</p>';
256 $html .= '<br />';
257 $html .= '<p><strong>' . \esc_html_x("Subscribe now and you'll receive our:", "What follows is a list of benefits", "independent-analytics") . '</strong></p>';
258 $html .= '<ul>';
259 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('Free email tutorial series', 'independent-analytics') . '</li>';
260 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('Subscriber-only sales announcements', 'independent-analytics') . '</li>';
261 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('New feature updates', 'independent-analytics') . '</li>';
262 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('Security alerts', 'independent-analytics') . '</li>';
263 $html .= '</ul>';
264 $html .= '<p>' . \esc_html('Subscribing will also share some basic info about your WordPress site with us, which helps us make Independent Analytics an even better plugin for everyone.', 'independent-analytics') . '</p>';
265 $html .= '<p class="rating">' . \sprintf(\esc_html__('Rated %s and trusted by over 100,000+ WordPress websites.', 'independent-analytics'), '<span class="star-container"><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span></span>') . '</p>';
266 $html .= '<img src="' . \IAWPSCOPED\iawp_url_to('img/email-review.png') . '" />';
267 return $html;
268 }
269 public function add_admin_menu_pages()
270 {
271 $title = \IAWP\Capability_Manager::show_white_labeled_ui() ? \esc_html__('Analytics', 'independent-analytics') : 'Independent Analytics';
272 \add_menu_page($title, \esc_html__('Analytics', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics', function () {
273 $analytics_page = new Analytics_Page();
274 $analytics_page->render();
275 }, $this->get_menu_icon(), 3);
276 if (\IAWP\Capability_Manager::can_edit()) {
277 \add_submenu_page('independent-analytics', \esc_html__('Settings', 'independent-analytics'), \esc_html__('Settings', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-settings', function () {
278 $settings_page = new Settings_Page();
279 $settings_page->render(\false);
280 });
281 }
282 if (\IAWPSCOPED\iawp_is_pro()) {
283 \add_submenu_page('independent-analytics', \esc_html__('Campaign Builder', 'independent-analytics'), \esc_html__('Campaign Builder', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-campaign-builder', function () {
284 $campaign_builder_page = new Campaign_Builder_Page();
285 $campaign_builder_page->render(\false);
286 });
287 if (\IAWP\Capability_Manager::can_edit()) {
288 \add_submenu_page('independent-analytics', \esc_html__('Click Tracking', 'independent-analytics'), \esc_html__('Click Tracking', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-click-tracking', function () {
289 $click_tracking_page = new Click_Tracking_Page();
290 $click_tracking_page->render(\false);
291 });
292 }
293 }
294 // Only show Help & Support menu for Pro users.
295 if (\IAWPSCOPED\iawp_is_pro()) {
296 if (\IAWP\Capability_Manager::show_branded_ui()) {
297 \add_submenu_page('independent-analytics', \esc_html__('Help & Support', 'independent-analytics'), \esc_html__('Help & Support', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-support-center', function () {
298 $support_page = new Support_Page();
299 $support_page->render(\false);
300 });
301 }
302 } else {
303 if (\IAWP\Capability_Manager::show_branded_ui()) {
304 \add_submenu_page('independent-analytics', \esc_html__('Support Forum', 'independent-analytics'), \esc_html__('Support Forum', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), \esc_url('https://wordpress.org/support/plugin/independent-analytics/'));
305 }
306 }
307 if (\IAWP\Capability_Manager::show_branded_ui()) {
308 \add_submenu_page('independent-analytics', \esc_html__('Integrations', 'independent-analytics'), \esc_html__('Integrations', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-integrations', function () {
309 $integrations_page = new Integrations_Pages();
310 $integrations_page->render(\false);
311 });
312 }
313 if (\IAWP\Capability_Manager::show_branded_ui()) {
314 $menu_html = '<span class="menu-name">' . \esc_html__('Updates', 'independent-analytics') . '</span>';
315 $menu_html = $this->show_changelog_menu_label() ? $menu_html . ' <span class="menu-counter">' . \esc_html__('New', 'independent-analytics') . '</span>' : $menu_html;
316 \add_submenu_page('independent-analytics', \esc_html__('Updates', 'independent-analytics'), $menu_html, \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-updates', function () {
317 $updates_page = new Updates_Page();
318 $updates_page->render(\false);
319 });
320 }
321 if (\IAWPSCOPED\iawp_is_free() && \IAWP\Capability_Manager::show_branded_ui()) {
322 \add_submenu_page('independent-analytics', \esc_html__('Upgrade to Pro &rarr;', 'independent-analytics'), '<span style="color: #F69D0A;">' . \esc_html__('Upgrade to Pro &rarr;', 'independent-analytics') . '</span>', \IAWP\Capability_Manager::menu_page_capability_string(), \esc_url('https://independentwp.com/pro/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Upgrade+to+Pro&utm_content=Sidebar'));
323 }
324 if (\IAWP\Capability_Manager::can_edit()) {
325 \add_submenu_page('options.php', \__('Independent Analytics Debug'), \__('Independent Analytics Debug'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-debug', function () {
326 $debug_page = new Debug_Page();
327 $debug_page->render(\false);
328 });
329 }
330 if (\IAWPSCOPED\iawp_is_pro() && \IAWP\Capability_Manager::can_view()) {
331 \add_submenu_page('options.php', \__('Journey'), \__('Journey'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-visitor', function () {
332 $page = new Visitor_Page();
333 $page->render();
334 });
335 }
336 }
337 // The menu link is removed in the SDK setup, but this makes it completely inaccessible
338 public function remove_freemius_pricing_menu()
339 {
340 \remove_submenu_page('independent-analytics', 'independent-analytics-pricing');
341 }
342 public function register_scripts_and_styles() : void
343 {
344 \wp_register_style('iawp-styles', \IAWPSCOPED\iawp_url_to('dist/styles/style.css'), [], \IAWP_VERSION);
345 \wp_register_style('iawp-dashboard-widget-styles', \IAWPSCOPED\iawp_url_to('dist/styles/dashboard_widget.css'), [], \IAWP_VERSION);
346 \wp_register_style('iawp-freemius-notice-styles', \IAWPSCOPED\iawp_url_to('dist/styles/freemius_notice_styles.css'), [], \IAWP_VERSION);
347 \wp_register_style('iawp-posts-menu-styles', \IAWPSCOPED\iawp_url_to('dist/styles/posts_menu.css'), [], \IAWP_VERSION);
348 \wp_register_style('iawp-wc-order-box-styles', \IAWPSCOPED\iawp_url_to('dist/styles/wc_order_box.css'), [], \IAWP_VERSION);
349 \wp_register_script('iawp-javascript', \IAWPSCOPED\iawp_url_to('dist/js/index.js'), ['wp-i18n'], \IAWP_VERSION . 'wefwef');
350 \wp_set_script_translations('iawp-javascript', 'independent-analytics');
351 \wp_register_script('iawp-dashboard-widget-javascript', \IAWPSCOPED\iawp_url_to('dist/js/dashboard_widget.js'), ['wp-i18n'], \IAWP_VERSION);
352 \wp_set_script_translations('iawp-dashboard-widget-javascript', 'independent-analytics');
353 \wp_register_script('iawp-layout-javascript', \IAWPSCOPED\iawp_url_to('dist/js/layout.js'), ['wp-i18n'], \IAWP_VERSION);
354 \wp_set_script_translations('iawp-layout-javascript', 'independent-analytics');
355 \wp_register_script('iawp-settings-javascript', \IAWPSCOPED\iawp_url_to('dist/js/settings.js'), ['wp-color-picker', 'wp-i18n'], \IAWP_VERSION);
356 \wp_set_script_translations('iawp-settings-javascript', 'independent-analytics');
357 \wp_register_script('iawp-click-tracking-menu-javascript', \IAWPSCOPED\iawp_url_to('dist/js/click-tracking-menu.js'), ['wp-i18n'], \IAWP_VERSION);
358 \wp_set_script_translations('iawp-click-tracking-menu-javascript', 'independent-analytics');
359 if (\IAWP\Admin_Bar_Stats::is_feature_enabled()) {
360 \wp_register_style('iawp-admin-bar-stats', \IAWPSCOPED\iawp_url_to('dist/styles/admin_bar_stats.css'), [], \IAWP_VERSION);
361 }
362 if (\is_rtl()) {
363 \wp_register_style('iawp-styles-rtl', \IAWPSCOPED\iawp_url_to('dist/styles/rtl.css'), [], \IAWP_VERSION);
364 }
365 }
366 public function enqueue_scripts_and_styles($hook)
367 {
368 $this->register_scripts_and_styles();
369 $page = \IAWP\Env::get_page();
370 $this->enqueue_translations();
371 $this->enqueue_nonces();
372 \wp_enqueue_style('iawp-freemius-notice-styles');
373 if (\is_string($page)) {
374 \wp_enqueue_style('iawp-styles');
375 \wp_enqueue_script('iawp-javascript');
376 \wp_enqueue_script('iawp-layout-javascript');
377 $this->dequeue_bad_actors();
378 $this->maybe_override_adminify_styles();
379 if (\is_rtl()) {
380 \wp_enqueue_style('iawp-styles-rtl');
381 }
382 }
383 if ($page === 'independent-analytics-settings') {
384 \wp_enqueue_style('wp-color-picker');
385 \wp_enqueue_script('iawp-settings-javascript');
386 } elseif ($page === 'independent-analytics-click-tracking') {
387 \wp_enqueue_script('iawp-click-tracking-menu-javascript');
388 } elseif ($hook === 'index.php') {
389 \wp_enqueue_script('iawp-dashboard-widget-javascript');
390 \wp_enqueue_style('iawp-dashboard-widget-styles');
391 } elseif ($hook === 'edit.php') {
392 \wp_enqueue_style('iawp-posts-menu-styles');
393 } elseif (\IAWPSCOPED\iawp_is_pro() && $this->is_woocommerce_support_enabled() && $hook == 'woocommerce_page_wc-orders') {
394 \wp_enqueue_style('iawp-wc-order-box-styles');
395 }
396 if (\IAWP\Admin_Bar_Stats::is_feature_enabled()) {
397 \wp_enqueue_style('iawp-admin-bar-stats');
398 }
399 }
400 public function enqueue_scripts_and_styles_front_end()
401 {
402 if (\IAWP\Admin_Bar_Stats::is_feature_enabled()) {
403 \wp_register_style('iawp-admin-bar-stats', \IAWPSCOPED\iawp_url_to('dist/styles/admin_bar_stats.css'), [], \IAWP_VERSION);
404 \wp_enqueue_style('iawp-admin-bar-stats');
405 }
406 }
407 public function enqueue_translations()
408 {
409 \wp_register_script('iawp-translations', '');
410 \wp_enqueue_script('iawp-translations');
411 \wp_add_inline_script('iawp-translations', 'const iawpText = ' . \json_encode(['views' => \__('Views', 'independent-analytics'), 'visitors' => \__('Visitors', 'independent-analytics'), 'sessions' => \__('Sessions', 'independent-analytics'), 'orders' => \__('Orders', 'independent-analytics'), 'clicks' => \__('Clicks', 'independent-analytics'), 'formSubmissions' => \__('Form Submissions', 'independent-analytics'), 'exactDates' => \__('Apply Exact Dates', 'independent-analytics'), 'relativeDates' => \__('Apply Relative Dates', 'independent-analytics'), 'copied' => \__('Copied', 'independent-analytics'), 'exportingPages' => \__('Exporting Pages...', 'independent-analytics'), 'exportPages' => \__('Export Pages', 'independent-analytics'), 'exportingReferrers' => \__('Exporting Referrers...', 'independent-analytics'), 'exportReferrers' => \__('Export Referrers', 'independent-analytics'), 'exportingGeolocations' => \__('Exporting Geolocations...', 'independent-analytics'), 'exportGeolocations' => \__('Export Geolocations', 'independent-analytics'), 'exportingDevices' => \__('Exporting Devices...', 'independent-analytics'), 'exportDevices' => \__('Export Devices', 'independent-analytics'), 'exportingCampaigns' => \__('Exporting Campaigns...', 'independent-analytics'), 'exportCampaigns' => \__('Export Campaigns', 'independent-analytics'), 'exportingClicks' => \__('Exporting Clicks', 'independent-analytics'), 'exportClicks' => \__('Export Clicks', 'independent-analytics'), 'invalidReportArchive' => \__('This report archive is invalid. Please export your reports and try again.', 'independent-analytics'), 'openMobileMenu' => \__('Open menu', 'independent-analytics'), 'closeMobileMenu' => \__('Close menu', 'independent-analytics'), 'noComparison' => \__('No Comparison', 'independent-analytics')]), 'before');
412 }
413 public function enqueue_nonces()
414 {
415 \wp_register_script('iawp-nonces', '');
416 \wp_enqueue_script('iawp-nonces');
417 \wp_add_inline_script('iawp-nonces', 'const iawpActions = ' . \json_encode(AJAX_Manager::getInstance()->get_action_signatures()), 'before');
418 }
419 public function get_option($name, $default)
420 {
421 $option = \get_option($name, $default);
422 return $option === '' ? $default : $option;
423 }
424 public function date_i18n(string $format, \DateTime $date) : string
425 {
426 return \date_i18n($format, $date->setTimezone(Timezone::site_timezone())->getTimestamp() + Timezone::site_offset_in_seconds($date));
427 }
428 public function plugin_action_links($links)
429 {
430 // Create the link
431 $settings_link = '<a class="calendar-link" href="' . \esc_url(\IAWPSCOPED\iawp_dashboard_url()) . '">' . \esc_html__('Analytics Dashboard', 'independent-analytics') . '</a>';
432 // Add the link to the start of the array
433 \array_unshift($links, $settings_link);
434 return $links;
435 }
436 public function pagination_page_size()
437 {
438 return 50;
439 }
440 public function dequeue_bad_actors()
441 {
442 // https://wordpress.org/plugins/comment-link-remove/
443 \wp_dequeue_style('qc_clr_admin_style_css');
444 // https://wordpress.org/plugins/webappick-pdf-invoice-for-woocommerce/
445 \wp_dequeue_style('woo-invoice');
446 // https://wordpress.org/plugins/wp-media-files-name-rename/
447 \wp_dequeue_style('wpcmp_bootstrap_css');
448 // https://wordpress.org/plugins/morepuzzles/
449 \wp_dequeue_style('bscss');
450 \wp_dequeue_style('mypluginstyle');
451 }
452 public function maybe_override_adminify_styles()
453 {
454 if (\is_plugin_active('adminify/adminify.php')) {
455 $settings = \get_option('_wpadminify');
456 if ($settings) {
457 if (\array_key_exists('admin_ui', $settings)) {
458 if ($settings['admin_ui']) {
459 \wp_register_style('iawp-adminify-styles', \IAWPSCOPED\iawp_url_to('dist/styles/adminify.css'), [], \IAWP_VERSION);
460 \wp_enqueue_style('iawp-adminify-styles');
461 }
462 }
463 }
464 }
465 }
466 public function update_cookie()
467 {
468 $should_have_cookie = Request::is_blocked_user_role() && $this->get_option('iawp_ignore_via_cookie', \false);
469 $has_cookie = isset($_COOKIE['iawp_ignore_visitor']);
470 if ($should_have_cookie && !$has_cookie) {
471 \setcookie('iawp_ignore_visitor', '1', \time() + 365 * 24 * 60 * 60, \COOKIEPATH, \COOKIE_DOMAIN);
472 }
473 if (!$should_have_cookie && $has_cookie) {
474 // Delete cookie by using a non-zero time in the past
475 \setcookie('iawp_ignore_visitor', '1', \time() - 60, \COOKIEPATH, \COOKIE_DOMAIN);
476 }
477 }
478 // Note: We don't use version_compare because we only want to notify of major version updates
479 // Ex. Show notice for 2.14.5 => 2.15.0, but not for 2.15.0 => 2.15.1
480 public function show_changelog_menu_label() : bool
481 {
482 if (\floatval(\IAWP_VERSION) > \floatval($this->get_option('iawp_last_update_viewed', '0'))) {
483 return \true;
484 }
485 return \false;
486 }
487 public function is_form_submission_support_enabled() : bool
488 {
489 if (!\is_bool($this->is_form_submission_support_enabled)) {
490 $this->is_form_submission_support_enabled = \IAWPSCOPED\iawp_is_pro() && Form::has_active_form_plugin();
491 }
492 return $this->is_form_submission_support_enabled;
493 }
494 public function is_woocommerce_support_enabled() : bool
495 {
496 if (!\is_bool($this->is_woocommerce_support_enabled)) {
497 $this->is_woocommerce_support_enabled = $this->actually_check_if_woocommerce_support_is_enabled();
498 }
499 return $this->is_woocommerce_support_enabled;
500 }
501 public function is_surecart_support_enabled() : bool
502 {
503 if (!\is_bool($this->is_surecart_support_enabled)) {
504 $this->is_surecart_support_enabled = $this->actually_check_if_surecart_support_is_enabled();
505 }
506 return $this->is_surecart_support_enabled;
507 }
508 public function is_edd_support_enabled() : bool
509 {
510 if (!\is_bool($this->is_edd_support_enabled)) {
511 $this->is_edd_support_enabled = $this->actually_check_if_edd_support_is_enabled();
512 }
513 return $this->is_edd_support_enabled;
514 }
515 public function is_pmpro_support_enabled() : bool
516 {
517 if (!\is_bool($this->is_pmpro_support_enabled)) {
518 $this->is_pmpro_support_enabled = $this->actually_check_if_pmpro_support_is_enabled();
519 }
520 return $this->is_pmpro_support_enabled;
521 }
522 public function is_fluent_cart_support_enabled() : bool
523 {
524 if (!\is_bool($this->is_fluent_cart_support_enabled)) {
525 $this->is_fluent_cart_support_enabled = $this->actually_check_if_fluent_cart_support_is_enabled();
526 }
527 return $this->is_fluent_cart_support_enabled;
528 }
529 public function is_ecommerce_support_enabled() : bool
530 {
531 return $this->is_woocommerce_support_enabled() || $this->is_surecart_support_enabled() || $this->is_edd_support_enabled() || $this->is_pmpro_support_enabled() || $this->is_fluent_cart_support_enabled();
532 }
533 public function get_currency_code() : ?string
534 {
535 if ($this->is_woocommerce_support_enabled()) {
536 return get_woocommerce_currency();
537 }
538 if ($this->is_surecart_support_enabled()) {
539 return SureCart_Store::get_currency_code();
540 }
541 if ($this->is_edd_support_enabled()) {
542 return \edd_get_currency();
543 }
544 if ($this->is_pmpro_support_enabled()) {
545 global $pmpro_default_currency;
546 return $pmpro_default_currency;
547 }
548 if ($this->is_fluent_cart_support_enabled()) {
549 $settings = new \FluentCart\Api\StoreSettings();
550 return $settings->getCurrency();
551 }
552 return null;
553 }
554 // This is for compatibility with the "Lock and Protect System Folders" setting in the Security Optimizer plugin
555 public function whitelist_click_endpoint($whitelist)
556 {
557 if (\IAWPSCOPED\iawp_is_free()) {
558 return $whitelist;
559 }
560 $whitelist[] = 'iawp-click-endpoint.php';
561 return $whitelist;
562 }
563 public function exclude_tracking_script_from_speed_optimizer($exclude_list)
564 {
565 $exclude_list[] = '// Do not change this comment line otherwise Speed Optimizer won\'t be able to detect this script';
566 return $exclude_list;
567 }
568 // This whitelists our plugin with the "Complianz" plugin
569 public function whitelist_script_tag_for_complianz($scripts)
570 {
571 $scripts[] = '/wp-json/iawp/search';
572 return $scripts;
573 }
574 public function prefers_24_hour_clock() : bool
575 {
576 $time_format = Format::time();
577 if (Str::contains($time_format, 'a') || Str::contains($time_format, 'A')) {
578 return \false;
579 }
580 return \true;
581 }
582 private function actually_check_if_woocommerce_support_is_enabled() : bool
583 {
584 global $wpdb;
585 if (\IAWPSCOPED\iawp_is_free()) {
586 return \false;
587 }
588 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
589 return \false;
590 }
591 if (!\is_plugin_active('woocommerce/woocommerce.php')) {
592 return \false;
593 }
594 $table_name = $wpdb->prefix . 'wc_order_stats';
595 $order_stats_table = $wpdb->get_row($wpdb->prepare('
596 SELECT * FROM INFORMATION_SCHEMA.TABLES
597 WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
598 ', $wpdb->dbname, $table_name));
599 if (\is_null($order_stats_table)) {
600 return \false;
601 }
602 return \true;
603 }
604 private function actually_check_if_surecart_support_is_enabled() : bool
605 {
606 if (\IAWPSCOPED\iawp_is_free()) {
607 return \false;
608 }
609 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
610 return \false;
611 }
612 return \is_plugin_active('surecart/surecart.php');
613 }
614 private function actually_check_if_edd_support_is_enabled() : bool
615 {
616 if (\IAWPSCOPED\iawp_is_free()) {
617 return \false;
618 }
619 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
620 return \false;
621 }
622 return \is_plugin_active('easy-digital-downloads/easy-digital-downloads.php') || \is_plugin_active('easy-digital-downloads-pro/easy-digital-downloads.php');
623 }
624 private function actually_check_if_pmpro_support_is_enabled() : bool
625 {
626 if (\IAWPSCOPED\iawp_is_free()) {
627 return \false;
628 }
629 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
630 return \false;
631 }
632 return \is_plugin_active('paid-memberships-pro-dev/paid-memberships-pro.php') || \is_plugin_active('paid-memberships-pro/paid-memberships-pro.php');
633 }
634 private function actually_check_if_fluent_cart_support_is_enabled() : bool
635 {
636 if (\IAWPSCOPED\iawp_is_free()) {
637 return \false;
638 }
639 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
640 return \false;
641 }
642 return \is_plugin_active('fluent-cart/fluent-cart.php');
643 }
644 private function get_menu_icon()
645 {
646 if (\is_null(\IAWP\Env::get_page())) {
647 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNTEzcHgiIGhlaWdodD0iMjU0cHgiIHZpZXdCb3g9IjAgMCA1MTMgMjU0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPkljb248L3RpdGxlPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Ik1lbnUtSWNvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNiwgLTIyOCkiIGZpbGw9IiNBN0FBQUQiPgogICAgICAgICAgICA8ZyBpZD0iV2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgyLCA1NSkiPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0LjUsIDE3MykiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi44MDU3LCAxMDguNjEyNSkgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTQwMi44MDU3LCAtMTA4LjYxMjUpIiBwb2ludHM9IjM5MS4xNjkzNTYgNTYuMjQ4ODI1OSA0MTQuNDQyMDgzIDU2LjI0ODgyNTkgNDE0LjQ0MjA4MyAxNjAuOTc2MDk5IDM5MS4xNjkzNTYgMTYwLjk3NjA5OSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NiwgMTI1LjY3MjcpIHJvdGF0ZSgtNjApIHRyYW5zbGF0ZSgtMjU2LCAtMTI1LjY3MjcpIiBwb2ludHM9IjI0NC4zNjM2MzYgNzMuMzA5MDkwOSAyNjcuNjM2MzY0IDczLjMwOTA5MDkgMjY3LjYzNjM2NCAxNzguMDM2MzY0IDI0NC4zNjM2MzYgMTc4LjAzNjM2NCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOS41Njk0LCAxNDQuNjg1Mikgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTEwOS41Njk0LCAtMTQ0LjY4NTIpIiBwb2ludHM9Ijk3LjkzMjk5MjMgOTIuMzIxNTUzMiAxMjEuMjA1NzIgOTIuMzIxNTUzMiAxMjEuMjA1NzIgMTk3LjA0ODgyNiA5Ny45MzI5OTIzIDE5Ny4wNDg4MjYiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC00IiBjeD0iNDY4Ljk0NTQ1NSIgY3k9IjQzLjA1NDU0NTUiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9IlBvaW50LTMiIGN4PSIzMzYuMjkwOTA5IiBjeT0iMTczLjM4MTgxOCIgcj0iNDMuMDU0NTQ1NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iUG9pbnQtMiIgY3g9IjE3NS43MDkwOTEiIGN5PSI3OS4xMjcyNzI3IiByPSI0My4wNTQ1NDU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC0xIiBjeD0iNDMuMDU0NTQ1NSIgY3k9IjIxMC42MTgxODIiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=';
648 } else {
649 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNTEzcHgiIGhlaWdodD0iMjU0cHgiIHZpZXdCb3g9IjAgMCA1MTMgMjU0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPkljb248L3RpdGxlPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Ik1lbnUtSWNvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc3NSwgLTIyOSkiIGZpbGw9IiNGRkZGRkYiPgogICAgICAgICAgICA8ZyBpZD0iV2hpdGUtQ29weSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzMxLCA1NikiPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0LjUsIDE3MykiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi44MDU3LCAxMDguNjEyNSkgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTQwMi44MDU3LCAtMTA4LjYxMjUpIiBwb2ludHM9IjM5MS4xNjkzNTYgNTYuMjQ4ODI1OSA0MTQuNDQyMDgzIDU2LjI0ODgyNTkgNDE0LjQ0MjA4MyAxNjAuOTc2MDk5IDM5MS4xNjkzNTYgMTYwLjk3NjA5OSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NiwgMTI1LjY3MjcpIHJvdGF0ZSgtNjApIHRyYW5zbGF0ZSgtMjU2LCAtMTI1LjY3MjcpIiBwb2ludHM9IjI0NC4zNjM2MzYgNzMuMzA5MDkwOSAyNjcuNjM2MzY0IDczLjMwOTA5MDkgMjY3LjYzNjM2NCAxNzguMDM2MzY0IDI0NC4zNjM2MzYgMTc4LjAzNjM2NCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOS41Njk0LCAxNDQuNjg1Mikgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTEwOS41Njk0LCAtMTQ0LjY4NTIpIiBwb2ludHM9Ijk3LjkzMjk5MjMgOTIuMzIxNTUzMiAxMjEuMjA1NzIgOTIuMzIxNTUzMiAxMjEuMjA1NzIgMTk3LjA0ODgyNiA5Ny45MzI5OTIzIDE5Ny4wNDg4MjYiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC00IiBjeD0iNDY4Ljk0NTQ1NSIgY3k9IjQzLjA1NDU0NTUiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9IlBvaW50LTMiIGN4PSIzMzYuMjkwOTA5IiBjeT0iMTczLjM4MTgxOCIgcj0iNDMuMDU0NTQ1NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iUG9pbnQtMiIgY3g9IjE3NS43MDkwOTEiIGN5PSI3OS4xMjcyNzI3IiByPSI0My4wNTQ1NDU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC0xIiBjeD0iNDMuMDU0NTQ1NSIgY3k9IjIxMC42MTgxODIiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=';
650 }
651 }
652 private function configure_carbon()
653 {
654 $locale = \get_locale();
655 // Carbon will throw an error if de_DE_Formal is used
656 if ('de_de_formal' === \strtolower($locale)) {
657 $locale = 'de_DE';
658 }
659 Carbon::setLocale($locale);
660 CarbonImmutable::setLocale($locale);
661 CarbonInterval::setLocale($locale);
662 }
663 }
664