Version Description
Download this release
Release Info
Developer | pross |
Plugin | ![]() |
Version | 2.4.1.2 |
Comparing to | |
See all releases |
Code changes from version 2.4.0.5 to 2.4.1.2
- changelog.txt +68 -1
- classes/class-fl-builder-admin-settings.php +4 -4
- classes/class-fl-builder-admin.php +30 -0
- classes/class-fl-builder-ajax.php +1 -0
- classes/class-fl-builder-compatibility.php +166 -0
- classes/class-fl-builder-css.php +4 -1
- classes/class-fl-builder-debug.php +8 -0
- classes/class-fl-builder-importer.php +15 -5
- classes/class-fl-builder-loader.php +4 -2
- classes/class-fl-builder-loop.php +3 -2
- classes/class-fl-builder-model.php +73 -2
- classes/class-fl-builder-service-mailjet.php +331 -0
- classes/class-fl-builder-services.php +5 -0
- classes/class-fl-builder-shortcodes.php +1 -1
- classes/class-fl-builder-utils.php +17 -0
- classes/class-fl-builder-wp-blocks-layout.php +17 -2
- classes/class-fl-builder.php +10 -3
- css/fl-builder-layout.css +9 -1
- css/fl-builder.css +20 -0
- css/fl-builder.min.css +1 -1
- css/fl-slideshow.min.css +1 -1
- css/jquery.magnificpopup.min.css +1 -1
- extensions/fl-builder-cache-helper/classes/class-fl-builder-cache-helper.php +0 -1
- extensions/fl-builder-cache-helper/plugins/wordpress.php +10 -0
- extensions/fl-builder-seo-plugins/classes/class-fl-builder-seo-plugins.php +2 -2
- extensions/fl-builder-seo-plugins/js/plugin-rankmath.js +21 -13
- extensions/fl-builder-seo-plugins/js/plugin-yoast.js +49 -15
- fl-builder.php +1 -1
- fonts/fontawesome/5.14.0/css/all.min.css +0 -5
- fonts/fontawesome/5.14.0/webfonts/fa-brands-400.woff +0 -0
- fonts/fontawesome/5.14.0/webfonts/fa-brands-400.woff2 +0 -0
- fonts/fontawesome/5.14.0/webfonts/fa-regular-400.woff2 +0 -0
- fonts/fontawesome/5.14.0/webfonts/fa-solid-900.woff +0 -0
- fonts/fontawesome/5.14.0/webfonts/fa-solid-900.woff2 +0 -0
- fonts/fontawesome/5.15.1/css/all.min.css +5 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/css/v4-shims.min.css +1 -1
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-brands-400.eot +0 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-brands-400.svg +111 -31
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-brands-400.ttf +0 -0
- fonts/fontawesome/5.15.1/webfonts/fa-brands-400.woff +0 -0
- fonts/fontawesome/5.15.1/webfonts/fa-brands-400.woff2 +0 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.eot +0 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.svg +2 -6
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.ttf +0 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.woff +0 -0
- fonts/fontawesome/5.15.1/webfonts/fa-regular-400.woff2 +0 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-solid-900.eot +0 -0
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-solid-900.svg +19 -6
- fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-solid-900.ttf +0 -0
- fonts/fontawesome/5.15.1/webfonts/fa-solid-900.woff +0 -0
- fonts/fontawesome/5.15.1/webfonts/fa-solid-900.woff2 +0 -0
- includes/admin-settings-license.php +3 -0
- includes/compatibility.php +11 -8
- includes/ui-field-photo.php +1 -1
- includes/ui-js-config.php +13 -1
- includes/updater-config.php +1 -1
- includes/updater/updater.php +7 -0
- includes/vendor/mailchimp/mailchimp.php +2 -1
- includes/vendor/mailjet/autoload.php +7 -0
- includes/vendor/mailjet/composer/ClassLoader.php +445 -0
- includes/vendor/mailjet/composer/LICENSE +21 -0
- includes/vendor/mailjet/composer/autoload_classmap.php +9 -0
- includes/vendor/mailjet/composer/autoload_files.php +16 -0
- includes/vendor/mailjet/composer/autoload_namespaces.php +10 -0
- includes/vendor/mailjet/composer/autoload_psr4.php +16 -0
- includes/vendor/mailjet/composer/autoload_real.php +70 -0
- includes/vendor/mailjet/composer/autoload_static.php +88 -0
- includes/vendor/mailjet/composer/installed.json +525 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/.php_cs +23 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/CHANGELOG.md +1327 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/Dockerfile +18 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/LICENSE +19 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/README.md +90 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/UPGRADING.md +1203 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Client.php +502 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/ClientInterface.php +87 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/CookieJar.php +316 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php +84 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php +91 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php +72 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/SetCookie.php +403 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/BadResponseException.php +27 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/ClientException.php +9 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/ConnectException.php +37 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/GuzzleException.php +23 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php +7 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/RequestException.php +192 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/SeekException.php +27 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/ServerException.php +9 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php +6 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/TransferException.php +6 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlFactory.php +585 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php +27 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlHandler.php +45 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php +220 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/EasyHandle.php +92 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/MockHandler.php +195 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/Proxy.php +55 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/StreamHandler.php +545 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/HandlerStack.php +277 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/MessageFormatter.php +185 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Middleware.php +254 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Pool.php +134 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php +111 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/RedirectMiddleware.php +255 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/RequestOptions.php +263 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/RetryMiddleware.php +128 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/TransferStats.php +126 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/UriTemplate.php +237 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/Utils.php +67 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/functions.php +334 -0
- includes/vendor/mailjet/guzzlehttp/guzzle/src/functions_include.php +6 -0
- includes/vendor/mailjet/guzzlehttp/promises/CHANGELOG.md +65 -0
- includes/vendor/mailjet/guzzlehttp/promises/LICENSE +19 -0
- includes/vendor/mailjet/guzzlehttp/promises/Makefile +13 -0
- includes/vendor/mailjet/guzzlehttp/promises/README.md +504 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/AggregateException.php +16 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/CancellationException.php +9 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/Coroutine.php +151 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/EachPromise.php +229 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/FulfilledPromise.php +82 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/Promise.php +280 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/PromiseInterface.php +93 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/PromisorInterface.php +15 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/RejectedPromise.php +87 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/RejectionException.php +47 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/TaskQueue.php +66 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/TaskQueueInterface.php +25 -0
- includes/vendor/mailjet/guzzlehttp/promises/src/functions.php +210 -0
changelog.txt
CHANGED
@@ -1,4 +1,71 @@
|
|
1 |
-
<h4>2.4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
<strong>Hot Fix</strong>
|
3 |
<ul>
|
4 |
<li>Button Module: Fix lightbox not working if ID specified in module settings</li>
|
1 |
+
<h4>2.4.1.2 - 12/03/2020</h4>
|
2 |
+
<strong>Hot Fix</strong>
|
3 |
+
<ul>
|
4 |
+
<li>Gallery Module: Captions do not show when image source is SmugMug (#891)</li>
|
5 |
+
<li>List Module: Fix Duplicate Heading and Content tag options (#879)</li>
|
6 |
+
<li>Posts Modules: Fix "match all posts except" option not working properly with TEC Events(#874)</li>
|
7 |
+
<li>Fix Fatal errors when using PHP 5.4 and WP 4.9 and below (#875)</li>
|
8 |
+
<li>Notifications Area: Fix background transparency (#898)</li>
|
9 |
+
<li>Sensitive code protection: allow some improper HTML and when triggered, try to highlight the problem code (#872)</li>
|
10 |
+
<li>Agency Version: Fix issue with Branding filter where icon doesn't work if you previously changed that value in WP admin (#849)</li>
|
11 |
+
</ul>
|
12 |
+
|
13 |
+
<h4>2.4.1.1 - 11/18/2020</h4>
|
14 |
+
<strong>Hot Fix</strong>
|
15 |
+
<ul>
|
16 |
+
<li>Fix RankMath integration (#866)</li>
|
17 |
+
<li>Tweak sensitive code fix so that it doesn't prevent allowed HTML (#840)</li>
|
18 |
+
<li>Fix updating global element does not update CSS (#838)</li>
|
19 |
+
<li>Fix attribute preview not selecting all matching elements (#864)</li>
|
20 |
+
<li>Fix Content Slider button padding applying to other Content Slider modules on the same page (#850)</li>
|
21 |
+
<li>More UI Style hardening for letter-spacing in CSS (#842)</li>
|
22 |
+
</ul>
|
23 |
+
|
24 |
+
<h4>2.4.1 - 11/5/2020</h4>
|
25 |
+
<strong>Enhancements</strong>
|
26 |
+
<ul>
|
27 |
+
<li>Button Group: Convert Button Spacing to a dimension field and make it responsive for more control (#791)</li>
|
28 |
+
<li>Button Group: Add group name option for Accessibility</li>
|
29 |
+
<li>The Events Calendar: Posts Module now respects the Events Calendar "Hide from Event" Listings checkbox (#495)</li>
|
30 |
+
<li>List Module: Add Icon Width Field (#576)</li>
|
31 |
+
<li>Add Object Cache to Cache Helper Tool (#691)</li>
|
32 |
+
<li>Subscribe Module: Add integration with Mailjet</li>
|
33 |
+
<li>Update FontAwesome to 5.15.1 (#784)</li>
|
34 |
+
<li>Do not clear cache on upgrader_process_complete as cache is already cleared when BB is updated</li>
|
35 |
+
<li>Use wp_kses_post for photo captions (#448)</li>
|
36 |
+
<li>Make sure users who enter sensitive code have WordPress' unfiltered html capability (#448)</li>
|
37 |
+
</ul>
|
38 |
+
|
39 |
+
<strong>Bug Fix</strong>
|
40 |
+
<ul>
|
41 |
+
<li>Accordion Module: Fix RTL issue with labels (#414)
|
42 |
+
<li>Button Group: Fix Button Spacing not working on Safari (#791)</li>
|
43 |
+
<li>Button Group: Fix responsive alignment (#690)</li>
|
44 |
+
<li>Content Slider: Fix button padding not working (#625)</li>
|
45 |
+
<li>Text Editor Module: Add compatibility with the HappyFoxChat plugin (#445)</li>
|
46 |
+
<li>Layout Shortcodes: fix issue where an empty slug attribute can load all posts for the layout (#608)</li>
|
47 |
+
<li>Posts Module: Move Post Grid Sizer to the bottom (#497)</li>
|
48 |
+
<li>Posts Module: Fix compatibility with WOOF WooCommerce Products Filter (#649)</li>
|
49 |
+
<li>Posts Module: Fix pagination on Polylang translated pages or on the WooCommerce Shop Layout when more than one module is on the page (#718 & #752)</li>
|
50 |
+
<li>Search Module: Fix bug with the $settings variable (#779)</li>
|
51 |
+
<li>Fix PHP notice on a 404 layout when using layout shortcodes (#693)</li>
|
52 |
+
<li>Fix fixed background images showing as zoomed in on iPadOS (#686)</li>
|
53 |
+
<li>Fix UI not opening on Themer Header Layout when Klaviyo plugin is active (#791)</li>
|
54 |
+
<li>Fix Yoast Integration not reading BB content (#788)</li>
|
55 |
+
<li>Fix Tooltips issue in User Access area of settings when WooCommerce is active (#748)</li>
|
56 |
+
<li>Fix broken serialization during import and the "Invalid Content" dialog in some cases when editing a page or a post (#834)</li>
|
57 |
+
</ul>
|
58 |
+
|
59 |
+
<h4>2.4.0.6 - 10/12/2020</h4>
|
60 |
+
<strong>Hot Fix</strong>
|
61 |
+
<ul>
|
62 |
+
<li>Fixed PHP notice that appears when dropping a Menu module on the page (Issue #775)</li>
|
63 |
+
<li>Fixed Callout modules not working in Pre-Built Rows (Issue #767)</li>
|
64 |
+
<li>Fixed importer line break issue with imported css/js in layouts (Issue #758)</li>
|
65 |
+
<li>Fixed fatal on Flywheel Cloud hosting when you have Lite installed and then activate a Premium version (Issue #770)</li>
|
66 |
+
</ul>
|
67 |
+
|
68 |
+
<h4>2.4.0.5 - 09/28/2020</h4>
|
69 |
<strong>Hot Fix</strong>
|
70 |
<ul>
|
71 |
<li>Button Module: Fix lightbox not working if ID specified in module settings</li>
|
classes/class-fl-builder-admin-settings.php
CHANGED
@@ -90,7 +90,7 @@ final class FLBuilderAdminSettings {
|
|
90 |
// Styles
|
91 |
wp_enqueue_style( 'fl-builder-admin-settings', FL_BUILDER_URL . 'css/fl-builder-admin-settings.css', array(), FL_BUILDER_VERSION );
|
92 |
wp_enqueue_style( 'jquery-multiselect', FL_BUILDER_URL . 'css/jquery.multiselect.css', array(), FL_BUILDER_VERSION );
|
93 |
-
wp_enqueue_style( 'jquery-tiptip', FL_BUILDER_URL . 'css/jquery.tiptip.css', array(), FL_BUILDER_VERSION );
|
94 |
|
95 |
if ( FLBuilder::fa5_pro_enabled() ) {
|
96 |
if ( '' !== get_option( '_fl_builder_kit_fa_pro' ) ) {
|
@@ -101,10 +101,10 @@ final class FLBuilderAdminSettings {
|
|
101 |
}
|
102 |
}
|
103 |
// Scripts
|
104 |
-
wp_enqueue_script( 'fl-builder-admin-settings', FL_BUILDER_URL . 'js/fl-builder-admin-settings.js', array( 'jquery-tiptip' ), FL_BUILDER_VERSION );
|
105 |
wp_enqueue_script( 'jquery-actual', FL_BUILDER_URL . 'js/jquery.actual.min.js', array( 'jquery' ), FL_BUILDER_VERSION );
|
106 |
wp_enqueue_script( 'jquery-multiselect', FL_BUILDER_URL . 'js/jquery.multiselect.js', array( 'jquery' ), FL_BUILDER_VERSION );
|
107 |
-
wp_enqueue_script( 'jquery-tiptip', FL_BUILDER_URL . 'js/jquery.tiptip.min.js', array( 'jquery' ), FL_BUILDER_VERSION, true );
|
108 |
|
109 |
// Media Uploader
|
110 |
wp_enqueue_media();
|
@@ -205,7 +205,7 @@ final class FLBuilderAdminSettings {
|
|
205 |
),
|
206 |
'license' => array(
|
207 |
'title' => __( 'License', 'fl-builder' ),
|
208 |
-
'show' =>
|
209 |
'priority' => 100,
|
210 |
),
|
211 |
'upgrade' => array(
|
90 |
// Styles
|
91 |
wp_enqueue_style( 'fl-builder-admin-settings', FL_BUILDER_URL . 'css/fl-builder-admin-settings.css', array(), FL_BUILDER_VERSION );
|
92 |
wp_enqueue_style( 'jquery-multiselect', FL_BUILDER_URL . 'css/jquery.multiselect.css', array(), FL_BUILDER_VERSION );
|
93 |
+
wp_enqueue_style( 'fl-jquery-tiptip', FL_BUILDER_URL . 'css/jquery.tiptip.css', array(), FL_BUILDER_VERSION );
|
94 |
|
95 |
if ( FLBuilder::fa5_pro_enabled() ) {
|
96 |
if ( '' !== get_option( '_fl_builder_kit_fa_pro' ) ) {
|
101 |
}
|
102 |
}
|
103 |
// Scripts
|
104 |
+
wp_enqueue_script( 'fl-builder-admin-settings', FL_BUILDER_URL . 'js/fl-builder-admin-settings.js', array( 'fl-jquery-tiptip' ), FL_BUILDER_VERSION );
|
105 |
wp_enqueue_script( 'jquery-actual', FL_BUILDER_URL . 'js/jquery.actual.min.js', array( 'jquery' ), FL_BUILDER_VERSION );
|
106 |
wp_enqueue_script( 'jquery-multiselect', FL_BUILDER_URL . 'js/jquery.multiselect.js', array( 'jquery' ), FL_BUILDER_VERSION );
|
107 |
+
wp_enqueue_script( 'fl-jquery-tiptip', FL_BUILDER_URL . 'js/jquery.tiptip.min.js', array( 'jquery' ), FL_BUILDER_VERSION, true );
|
108 |
|
109 |
// Media Uploader
|
110 |
wp_enqueue_media();
|
205 |
),
|
206 |
'license' => array(
|
207 |
'title' => __( 'License', 'fl-builder' ),
|
208 |
+
'show' => ( is_network_admin() || ! self::multisite_support() ),
|
209 |
'priority' => 100,
|
210 |
),
|
211 |
'upgrade' => array(
|
classes/class-fl-builder-admin.php
CHANGED
@@ -290,6 +290,36 @@ final class FLBuilderAdmin {
|
|
290 |
}
|
291 |
}
|
292 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
293 |
/**
|
294 |
* @since 1.0
|
295 |
* @deprecated 1.8
|
290 |
}
|
291 |
}
|
292 |
|
293 |
+
static public function render_form_lite() {
|
294 |
+
|
295 |
+
if ( ! function_exists( 'get_plugins' ) ) {
|
296 |
+
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
297 |
+
}
|
298 |
+
$plugin_slug = 'bb-plugin/fl-builder.php';
|
299 |
+
$installed_plugins = get_plugins();
|
300 |
+
$installed = array_key_exists( $plugin_slug, $installed_plugins ) || in_array( $plugin_slug, $installed_plugins, true );
|
301 |
+
$plugins_link = sprintf( "<a href='%s'>%s</a>", admin_url( 'plugins.php' ), __( 'Plugins Page' ) );
|
302 |
+
$docs_link = sprintf( "<a target='_blank' href='%s'>%s</a>", 'https://docs.wpbeaverbuilder.com/beaver-builder/getting-started/install-beaver-builder', __( 'Documentation' ) );
|
303 |
+
?>
|
304 |
+
<div id="fl-upgrade-lite-form" class="fl-upgrade-page-content">
|
305 |
+
|
306 |
+
<h3 class="fl-settings-form-header"><?php _e( 'Beaver Builder (Lite version)', 'fl-builder' ); ?></h3>
|
307 |
+
<?php if ( $installed ) : ?>
|
308 |
+
<p><?php _e( "We have detected that a premium version of Beaver Builder plugin is installed but not activated, so you're still using the free version of Beaver Builder.", 'fl-builder' ); ?></p>
|
309 |
+
<?php // translators: %s: Link to plugins page ?>
|
310 |
+
<p><?php printf( __( 'You can activate the premium version on the %s.', 'fl-builder' ), $plugins_link ); ?></p>
|
311 |
+
<?php // translators: %s: Link to docs page ?>
|
312 |
+
<p><?php printf( __( 'For detailed instructions to activate and license the premium version, see the %s.', 'fl-builder' ), $docs_link ); ?></p>
|
313 |
+
|
314 |
+
<?php else : ?>
|
315 |
+
<p><?php _e( 'You currently have the free Beaver Builder plugin activated, no license is required.', 'fl-builder' ); ?></p>
|
316 |
+
<?php // translators: %s: Link to docs page ?>
|
317 |
+
<p><?php printf( __( 'If you have purchased a premium version of Beaver Builder, see our %s for step-by-step upgrade instructions.', 'fl-builder' ), $docs_link ); ?></p>
|
318 |
+
<?php endif; ?>
|
319 |
+
</div>
|
320 |
+
<?php
|
321 |
+
}
|
322 |
+
|
323 |
/**
|
324 |
* @since 1.0
|
325 |
* @deprecated 1.8
|
classes/class-fl-builder-ajax.php
CHANGED
@@ -93,6 +93,7 @@ final class FLBuilderAJAX {
|
|
93 |
self::add_action( 'reset_col_widths', 'FLBuilderModel::reset_col_widths', array( 'group_id' ) );
|
94 |
self::add_action( 'resize_row_content', 'FLBuilderModel::resize_row_content', array( 'node', 'width' ) );
|
95 |
self::add_action( 'save_settings', 'FLBuilderModel::save_settings', array( 'node_id', 'settings' ) );
|
|
|
96 |
self::add_action( 'save_layout_settings', 'FLBuilderModel::save_layout_settings', array( 'settings' ) );
|
97 |
self::add_action( 'save_global_settings', 'FLBuilderModel::save_global_settings', array( 'settings' ) );
|
98 |
self::add_action( 'save_color_presets', 'FLBuilderModel::save_color_presets', array( 'presets' ) );
|
93 |
self::add_action( 'reset_col_widths', 'FLBuilderModel::reset_col_widths', array( 'group_id' ) );
|
94 |
self::add_action( 'resize_row_content', 'FLBuilderModel::resize_row_content', array( 'node', 'width' ) );
|
95 |
self::add_action( 'save_settings', 'FLBuilderModel::save_settings', array( 'node_id', 'settings' ) );
|
96 |
+
self::add_action( 'verify_settings', 'FLBuilderModel::verify_settings', array( 'settings' ) );
|
97 |
self::add_action( 'save_layout_settings', 'FLBuilderModel::save_layout_settings', array( 'settings' ) );
|
98 |
self::add_action( 'save_global_settings', 'FLBuilderModel::save_global_settings', array( 'settings' ) );
|
99 |
self::add_action( 'save_color_presets', 'FLBuilderModel::save_color_presets', array( 'presets' ) );
|
classes/class-fl-builder-compatibility.php
CHANGED
@@ -11,6 +11,7 @@ final class FLBuilderCompatibility {
|
|
11 |
|
12 |
// Actions
|
13 |
add_action( 'after_setup_theme', array( __CLASS__, 'pro_icons_enable' ) );
|
|
|
14 |
add_action( 'fl_builder_photo_cropped', array( __CLASS__, 'tinypng_support' ), 10, 2 );
|
15 |
add_action( 'plugins_loaded', array( __CLASS__, 'wc_memberships_support' ), 11 );
|
16 |
add_action( 'plugins_loaded', array( __CLASS__, 'admin_ssl_upload_fix' ), 11 );
|
@@ -31,7 +32,9 @@ final class FLBuilderCompatibility {
|
|
31 |
add_action( 'template_redirect', array( __CLASS__, 'fix_frontend_dashboard_plugin' ), 1000 );
|
32 |
add_action( 'template_redirect', array( __CLASS__, 'fix_um_switcher' ) );
|
33 |
add_action( 'template_redirect', array( __CLASS__, 'fix_pipedrive' ) );
|
|
|
34 |
add_action( 'template_redirect', array( __CLASS__, 'aggiungi_script_instafeed_owl' ), 1000 );
|
|
|
35 |
add_action( 'tribe_events_pro_widget_render', array( __CLASS__, 'tribe_events_pro_widget_render_fix' ), 10, 3 );
|
36 |
add_action( 'wp_footer', array( __CLASS__, 'fix_woo_short_description_footer' ) );
|
37 |
add_action( 'save_post', array( __CLASS__, 'fix_seopress' ), 9 );
|
@@ -44,6 +47,8 @@ final class FLBuilderCompatibility {
|
|
44 |
add_action( 'fl_theme_builder_after_render_header', array( __CLASS__, 'fix_lazyload_header_end' ) );
|
45 |
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'ee_remove_stylesheet' ), 99999 );
|
46 |
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'fix_woocommerce_products_filter' ), 12 );
|
|
|
|
|
47 |
|
48 |
// Filters
|
49 |
add_filter( 'fl_builder_is_post_editable', array( __CLASS__, 'bp_pages_support' ), 11, 2 );
|
@@ -66,6 +71,9 @@ final class FLBuilderCompatibility {
|
|
66 |
add_filter( 'option_wp-smush-lazy_load', array( __CLASS__, 'fix_smush' ) );
|
67 |
add_filter( 'fl_row_bg_video_wrapper_class', array( __CLASS__, 'fix_twenty_twenty_video' ) );
|
68 |
add_filter( 'fl_builder_loop_rewrite_rules', array( __CLASS__, 'fix_wpseo_category_pagination_rule' ) );
|
|
|
|
|
|
|
69 |
}
|
70 |
|
71 |
/**
|
@@ -242,6 +250,22 @@ final class FLBuilderCompatibility {
|
|
242 |
}
|
243 |
}
|
244 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
/**
|
246 |
* Fix icon issues with Frontend Dashboard version 1.3.4+
|
247 |
* @since 2.2.3
|
@@ -327,6 +351,16 @@ final class FLBuilderCompatibility {
|
|
327 |
return $content;
|
328 |
}
|
329 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
330 |
/**
|
331 |
* Remove Popup-Maker post-type from admin settings post-types.
|
332 |
* @since 2.1.7
|
@@ -821,6 +855,31 @@ final class FLBuilderCompatibility {
|
|
821 |
|
822 |
return $rewrite_rules;
|
823 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
824 |
/**
|
825 |
* Fix compatibility issue Woocommerce Products Filter Add-on
|
826 |
*
|
@@ -834,5 +893,112 @@ final class FLBuilderCompatibility {
|
|
834 |
wp_deregister_script( 'wcpf-plugin-polyfills-script' );
|
835 |
}
|
836 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
837 |
}
|
838 |
FLBuilderCompatibility::init();
|
11 |
|
12 |
// Actions
|
13 |
add_action( 'after_setup_theme', array( __CLASS__, 'pro_icons_enable' ) );
|
14 |
+
add_action( 'after_setup_theme', array( __CLASS__, 'fix_woof_posts_module' ) );
|
15 |
add_action( 'fl_builder_photo_cropped', array( __CLASS__, 'tinypng_support' ), 10, 2 );
|
16 |
add_action( 'plugins_loaded', array( __CLASS__, 'wc_memberships_support' ), 11 );
|
17 |
add_action( 'plugins_loaded', array( __CLASS__, 'admin_ssl_upload_fix' ), 11 );
|
32 |
add_action( 'template_redirect', array( __CLASS__, 'fix_frontend_dashboard_plugin' ), 1000 );
|
33 |
add_action( 'template_redirect', array( __CLASS__, 'fix_um_switcher' ) );
|
34 |
add_action( 'template_redirect', array( __CLASS__, 'fix_pipedrive' ) );
|
35 |
+
add_action( 'template_redirect', array( __CLASS__, 'fix_klaviyo_themer_layout' ) );
|
36 |
add_action( 'template_redirect', array( __CLASS__, 'aggiungi_script_instafeed_owl' ), 1000 );
|
37 |
+
add_action( 'template_redirect', array( __CLASS__, 'fix_happyfoxchat' ) );
|
38 |
add_action( 'tribe_events_pro_widget_render', array( __CLASS__, 'tribe_events_pro_widget_render_fix' ), 10, 3 );
|
39 |
add_action( 'wp_footer', array( __CLASS__, 'fix_woo_short_description_footer' ) );
|
40 |
add_action( 'save_post', array( __CLASS__, 'fix_seopress' ), 9 );
|
47 |
add_action( 'fl_theme_builder_after_render_header', array( __CLASS__, 'fix_lazyload_header_end' ) );
|
48 |
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'ee_remove_stylesheet' ), 99999 );
|
49 |
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'fix_woocommerce_products_filter' ), 12 );
|
50 |
+
add_action( 'pre_get_posts', array( __CLASS__, 'fix_woo_archive_loop' ), 99 );
|
51 |
+
add_action( 'pre_get_posts', array( __CLASS__, 'fix_tribe_events_hide_from_listings_archive' ) );
|
52 |
|
53 |
// Filters
|
54 |
add_filter( 'fl_builder_is_post_editable', array( __CLASS__, 'bp_pages_support' ), 11, 2 );
|
71 |
add_filter( 'option_wp-smush-lazy_load', array( __CLASS__, 'fix_smush' ) );
|
72 |
add_filter( 'fl_row_bg_video_wrapper_class', array( __CLASS__, 'fix_twenty_twenty_video' ) );
|
73 |
add_filter( 'fl_builder_loop_rewrite_rules', array( __CLASS__, 'fix_wpseo_category_pagination_rule' ) );
|
74 |
+
add_filter( 'fl_builder_loop_rewrite_rules', array( __CLASS__, 'fix_polylang_pagination_rule' ) );
|
75 |
+
add_filter( 'fl_builder_loop_query_args', array( __CLASS__, 'fix_tribe_events_hide_from_listings' ) );
|
76 |
+
add_filter( 'tribe_events_rewrite_rules_custom', array( __CLASS__, 'fix_tribe_events_pagination_rule' ), 10, 3 );
|
77 |
}
|
78 |
|
79 |
/**
|
250 |
}
|
251 |
}
|
252 |
|
253 |
+
/**
|
254 |
+
* Fix broken Themer Header Layout when Klaviyo is active.
|
255 |
+
* @since 2.4.1
|
256 |
+
*/
|
257 |
+
public static function fix_klaviyo_themer_layout() {
|
258 |
+
if ( is_admin() || ! class_exists( 'WPKlaviyoAnalytics' ) || ! class_exists( 'FLThemeBuilder' ) ) {
|
259 |
+
return;
|
260 |
+
}
|
261 |
+
|
262 |
+
global $klaviyowp_analytics, $wp_the_query;
|
263 |
+
if ( ! empty( $wp_the_query->post->post_type ) && 'fl-theme-layout' == $wp_the_query->post->post_type ) {
|
264 |
+
remove_action( 'wp_enqueue_scripts', array( $klaviyowp_analytics, 'insert_analytics' ), 0 );
|
265 |
+
remove_action( 'wp_enqueue_scripts', array( $klaviyowp_analytics, 'identify_browser' ) );
|
266 |
+
}
|
267 |
+
}
|
268 |
+
|
269 |
/**
|
270 |
* Fix icon issues with Frontend Dashboard version 1.3.4+
|
271 |
* @since 2.2.3
|
351 |
return $content;
|
352 |
}
|
353 |
|
354 |
+
/**
|
355 |
+
* Fix HappyFoxChat issue with the Text Editor image button.
|
356 |
+
* @since 2.4.1
|
357 |
+
*/
|
358 |
+
public static function fix_happyfoxchat() {
|
359 |
+
if ( isset( $_GET['fl_builder'] ) ) {
|
360 |
+
remove_action( 'wp_footer', 'hfc_add_visitor_widget' );
|
361 |
+
}
|
362 |
+
}
|
363 |
+
|
364 |
/**
|
365 |
* Remove Popup-Maker post-type from admin settings post-types.
|
366 |
* @since 2.1.7
|
855 |
|
856 |
return $rewrite_rules;
|
857 |
}
|
858 |
+
|
859 |
+
/**
|
860 |
+
* Fix pagination compatibility with Polylang pages.
|
861 |
+
*
|
862 |
+
* @since 2.4
|
863 |
+
*/
|
864 |
+
public static function fix_polylang_pagination_rule( $rewrite_rules ) {
|
865 |
+
if ( ! isset( $GLOBALS['polylang'] ) ) {
|
866 |
+
return $rewrite_rules;
|
867 |
+
}
|
868 |
+
|
869 |
+
if ( ! function_exists( 'pll_languages_list' ) ) {
|
870 |
+
return $rewrite_rules;
|
871 |
+
}
|
872 |
+
|
873 |
+
$langs = pll_languages_list();
|
874 |
+
if ( ! empty( $langs ) ) {
|
875 |
+
$lang_rules = '(' . implode( '|', $langs ) . ')';
|
876 |
+
$paged_rules = $lang_rules . '/(.?.+?)/paged-[0-9]{1,}/?([0-9]{1,})/?$';
|
877 |
+
$new_rules[ $paged_rules ] = 'index.php?lang=$matches[1]&pagename=$matches[2]&flpaged=$matches[3]';
|
878 |
+
$rewrite_rules = array_merge( $new_rules, $rewrite_rules );
|
879 |
+
}
|
880 |
+
|
881 |
+
return $rewrite_rules;
|
882 |
+
}
|
883 |
/**
|
884 |
* Fix compatibility issue Woocommerce Products Filter Add-on
|
885 |
*
|
893 |
wp_deregister_script( 'wcpf-plugin-polyfills-script' );
|
894 |
}
|
895 |
}
|
896 |
+
|
897 |
+
/**
|
898 |
+
* Fix compatibility issue in Woo archive product sorting.
|
899 |
+
*
|
900 |
+
* @since 2.4
|
901 |
+
*/
|
902 |
+
public static function fix_woo_archive_loop( $q ) {
|
903 |
+
if ( ! class_exists( 'WooCommerce' ) ) {
|
904 |
+
return;
|
905 |
+
}
|
906 |
+
|
907 |
+
if ( is_admin() || ! $q->get( 'fl_builder_loop' ) || 'product_query' != $q->get( 'wc_query' ) ) {
|
908 |
+
return;
|
909 |
+
}
|
910 |
+
|
911 |
+
if ( ! $q->is_post_type_archive( 'product' ) && ! $q->is_tax( get_object_taxonomies( 'product' ) ) ) {
|
912 |
+
return;
|
913 |
+
}
|
914 |
+
|
915 |
+
// Add woo sorting to posts module query.
|
916 |
+
$ordering = WC()->query->get_catalog_ordering_args();
|
917 |
+
$q->set( 'orderby', $ordering['orderby'] );
|
918 |
+
$q->set( 'order', $ordering['order'] );
|
919 |
+
|
920 |
+
if ( isset( $ordering['meta_key'] ) ) {
|
921 |
+
$q->set( 'meta_key', $ordering['meta_key'] );
|
922 |
+
}
|
923 |
+
}
|
924 |
+
|
925 |
+
/**
|
926 |
+
* Fix compatibility when paginating TEC events archive.
|
927 |
+
*
|
928 |
+
* @since 2.4
|
929 |
+
*/
|
930 |
+
public static function fix_tribe_events_pagination_rule( $rules, $tribe_rewrite, $wp_rewrite ) {
|
931 |
+
$bases = $tribe_rewrite->get_bases();
|
932 |
+
|
933 |
+
// Archive
|
934 |
+
$tec_archive_rules = $bases->archive . '/paged-[0-9]{1,}/?([0-9]{1,})/?$';
|
935 |
+
$rules[ $tec_archive_rules ] = 'index.php?post_type=tribe_events&eventDisplay=default&flpaged=$matches[1]';
|
936 |
+
|
937 |
+
// Category
|
938 |
+
$tec_cat_rules = $bases->archive . '/(?:category)/(?:[^/]+/)*([^/]+)/paged-[0-9]{1,}/?([0-9]{1,})/?$';
|
939 |
+
$rules[ $tec_cat_rules ] = 'index.php?post_type=tribe_events&tribe_events_cat=$matches[1]&eventDisplay=list&flpaged=$matches[2]';
|
940 |
+
|
941 |
+
// Tag
|
942 |
+
$tec_tag_rules = $bases->archive . '/(?:tag)/([^/]+)/paged-[0-9]{1,}/?([0-9]{1,})/?$';
|
943 |
+
$rules[ $tec_tag_rules ] = 'index.php?post_type=tribe_events&tag=$matches[1]&eventDisplay=list&flpaged=$matches[2]';
|
944 |
+
|
945 |
+
return $rules;
|
946 |
+
}
|
947 |
+
/**
|
948 |
+
* Fix 'Hide From Event Listings' from the Event Options under the Event Edit Screen
|
949 |
+
* not being picked up by the Posts Grid module such as when used in a Themer Archive Layout.
|
950 |
+
*
|
951 |
+
* @since 2.4.1
|
952 |
+
*/
|
953 |
+
public static function fix_tribe_events_hide_from_listings_archive( $query ) {
|
954 |
+
if ( ! class_exists( 'Tribe__Events__Query' ) || ! class_exists( 'FLThemeBuilder' ) || is_admin() ) {
|
955 |
+
return;
|
956 |
+
}
|
957 |
+
|
958 |
+
if ( ( $query->is_main_query() && is_post_type_archive( 'tribe_events' ) ) || ( 'fl-theme-layout' === get_post_type() ) ) {
|
959 |
+
$hide_upcoming_events = Tribe__Events__Query::getHideFromUpcomingEvents();
|
960 |
+
if ( ! empty( $hide_upcoming_events ) ) {
|
961 |
+
$current_post_not_in = $query->get( 'post__not_in' );
|
962 |
+
$query->set( 'post__not_in', array_merge( $current_post_not_in, $hide_upcoming_events ) );
|
963 |
+
}
|
964 |
+
}
|
965 |
+
}
|
966 |
+
|
967 |
+
/**
|
968 |
+
* Fix 'Hide From Event Listings' from the Event Options under the Event Edit Screen
|
969 |
+
* not being picked up by the Posts Grid module set to 'custom_query'.
|
970 |
+
*
|
971 |
+
* @since 2.4.1
|
972 |
+
*/
|
973 |
+
public static function fix_tribe_events_hide_from_listings( $args ) {
|
974 |
+
if ( ! class_exists( 'Tribe__Events__Query' ) || is_admin() ) {
|
975 |
+
return $args;
|
976 |
+
}
|
977 |
+
|
978 |
+
if ( empty( $args['settings']->post_type ) || empty( $args['settings']->data_source ) ) {
|
979 |
+
return $args;
|
980 |
+
}
|
981 |
+
|
982 |
+
if ( 'tribe_events' !== $args['settings']->post_type || 'custom_query' !== $args['settings']->data_source ) {
|
983 |
+
return $args;
|
984 |
+
}
|
985 |
+
|
986 |
+
$hide_upcoming_events = Tribe__Events__Query::getHideFromUpcomingEvents();
|
987 |
+
if ( ! empty( $hide_upcoming_events ) ) {
|
988 |
+
$args['post__not_in'] = array_merge( $args['post__not_in'], $hide_upcoming_events );
|
989 |
+
}
|
990 |
+
|
991 |
+
return $args;
|
992 |
+
}
|
993 |
+
|
994 |
+
/**
|
995 |
+
* Fix nodes below Posts module not editable when it's set to the Products post type.
|
996 |
+
* @since 2.4.1
|
997 |
+
*/
|
998 |
+
public static function fix_woof_posts_module() {
|
999 |
+
if ( class_exists( 'WOOF' ) && isset( $_GET['fl_builder'] ) ) {
|
1000 |
+
remove_action( 'init', array( $GLOBALS['WOOF'], 'init' ), 1 );
|
1001 |
+
}
|
1002 |
+
}
|
1003 |
}
|
1004 |
FLBuilderCompatibility::init();
|
classes/class-fl-builder-css.php
CHANGED
@@ -308,7 +308,10 @@ final class FLBuilderCSS {
|
|
308 |
}
|
309 |
}
|
310 |
if ( isset( $setting['line_height'] ) && ! empty( $setting['line_height']['length'] ) ) {
|
311 |
-
$props['line-height'] = $setting['line_height']['length']
|
|
|
|
|
|
|
312 |
}
|
313 |
if ( isset( $setting['letter_spacing'] ) && ! empty( $setting['letter_spacing']['length'] ) ) {
|
314 |
$props['letter-spacing'] = $setting['letter_spacing']['length'] . 'px';
|
308 |
}
|
309 |
}
|
310 |
if ( isset( $setting['line_height'] ) && ! empty( $setting['line_height']['length'] ) ) {
|
311 |
+
$props['line-height'] = $setting['line_height']['length'];
|
312 |
+
if ( isset( $setting['line_height']['unit'] ) && ! empty( $setting['line_height']['unit'] ) ) {
|
313 |
+
$props['line-height'] .= $setting['line_height']['unit'];
|
314 |
+
}
|
315 |
}
|
316 |
if ( isset( $setting['letter_spacing'] ) && ! empty( $setting['letter_spacing']['length'] ) ) {
|
317 |
$props['letter-spacing'] = $setting['letter_spacing']['length'] . 'px';
|
classes/class-fl-builder-debug.php
CHANGED
@@ -178,6 +178,14 @@ final class FL_Debug {
|
|
178 |
self::register( 'wp_media_upload_path', $args );
|
179 |
}
|
180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
181 |
$args = array(
|
182 |
'name' => 'Post Counts',
|
183 |
'data' => self::divider(),
|
178 |
self::register( 'wp_media_upload_path', $args );
|
179 |
}
|
180 |
|
181 |
+
if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) {
|
182 |
+
$args = array(
|
183 |
+
'name' => 'Unfiltered HTML is globally disabled! ( DISALLOW_UNFILTERED_HTML )',
|
184 |
+
'data' => 'Yes',
|
185 |
+
);
|
186 |
+
self::register( 'is_multi', $args );
|
187 |
+
}
|
188 |
+
|
189 |
$args = array(
|
190 |
'name' => 'Post Counts',
|
191 |
'data' => self::divider(),
|
classes/class-fl-builder-importer.php
CHANGED
@@ -284,10 +284,20 @@ final class FLBuilderImporterDataFix {
|
|
284 |
return $data;
|
285 |
}
|
286 |
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
291 |
$data = maybe_unserialize( $data );
|
292 |
|
293 |
// return if maybe_unserialize() returns an object or array, this is good.
|
@@ -311,7 +321,7 @@ final class FLBuilderImporterDataFix {
|
|
311 |
'–' => '-',
|
312 |
'—' => '-',
|
313 |
'…' => '…',
|
314 |
-
"\n" => '<br />',
|
315 |
);
|
316 |
|
317 |
if ( ! $linebreaks ) {
|
284 |
return $data;
|
285 |
}
|
286 |
|
287 |
+
if ( $linebreaks ) {
|
288 |
+
$data = preg_replace_callback('!([a-z-_0-9]+)";s:(\d+):"(.*?)";!', function( $m ) {
|
289 |
+
// new replace logic.
|
290 |
+
if ( 'css' === $m[1] || 'js' === $m[1] || 'html' === $m[1] ) {
|
291 |
+
$m[3] = str_replace( '<br data-fl-fixed=true />', "\n", $m[3] );
|
292 |
+
}
|
293 |
+
$m[3] = str_replace( '<br data-fl-fixed=true />', '<br />', $m[3] );
|
294 |
+
return $m[1] . '";s:' . strlen( $m[3] ) . ':"' . $m[3] . '";';
|
295 |
+
}, self::sanitize_from_word( $data, $linebreaks ) );
|
296 |
+
} else {
|
297 |
+
$data = preg_replace_callback('!s:(\d+):"(.*?)";!', function( $m ) {
|
298 |
+
return 's:' . strlen( $m[2] ) . ':"' . $m[2] . '";';
|
299 |
+
}, self::sanitize_from_word( $data, $linebreaks ) );
|
300 |
+
}
|
301 |
$data = maybe_unserialize( $data );
|
302 |
|
303 |
// return if maybe_unserialize() returns an object or array, this is good.
|
321 |
'–' => '-',
|
322 |
'—' => '-',
|
323 |
'…' => '…',
|
324 |
+
"\n" => '<br data-fl-fixed=true />',
|
325 |
);
|
326 |
|
327 |
if ( ! $linebreaks ) {
|
classes/class-fl-builder-loader.php
CHANGED
@@ -26,7 +26,9 @@ if ( ! class_exists( 'FLBuilderLoader' ) ) {
|
|
26 |
$plugin_dirname = basename( dirname( dirname( __FILE__ ) ) );
|
27 |
|
28 |
if ( $lite_active && $plugin_dirname != $lite_dirname ) {
|
29 |
-
|
|
|
|
|
30 |
return;
|
31 |
} elseif ( class_exists( 'FLBuilder' ) ) {
|
32 |
add_action( 'admin_notices', __CLASS__ . '::double_install_admin_notice' );
|
@@ -46,7 +48,7 @@ if ( ! class_exists( 'FLBuilderLoader' ) ) {
|
|
46 |
* @return void
|
47 |
*/
|
48 |
static private function define_constants() {
|
49 |
-
define( 'FL_BUILDER_VERSION', '2.4.
|
50 |
define( 'FL_BUILDER_FILE', trailingslashit( dirname( dirname( __FILE__ ) ) ) . 'fl-builder.php' );
|
51 |
define( 'FL_BUILDER_DIR', plugin_dir_path( FL_BUILDER_FILE ) );
|
52 |
define( 'FL_BUILDER_URL', plugins_url( '/', FL_BUILDER_FILE ) );
|
26 |
$plugin_dirname = basename( dirname( dirname( __FILE__ ) ) );
|
27 |
|
28 |
if ( $lite_active && $plugin_dirname != $lite_dirname ) {
|
29 |
+
add_action( 'admin_init', function() {
|
30 |
+
deactivate_plugins( array( 'beaver-builder-lite-version/fl-builder.php' ), false, is_network_admin() );
|
31 |
+
});
|
32 |
return;
|
33 |
} elseif ( class_exists( 'FLBuilder' ) ) {
|
34 |
add_action( 'admin_notices', __CLASS__ . '::double_install_admin_notice' );
|
48 |
* @return void
|
49 |
*/
|
50 |
static private function define_constants() {
|
51 |
+
define( 'FL_BUILDER_VERSION', '2.4.1.2' );
|
52 |
define( 'FL_BUILDER_FILE', trailingslashit( dirname( dirname( __FILE__ ) ) ) . 'fl-builder.php' );
|
53 |
define( 'FL_BUILDER_DIR', plugin_dir_path( FL_BUILDER_FILE ) );
|
54 |
define( 'FL_BUILDER_URL', plugins_url( '/', FL_BUILDER_FILE ) );
|
classes/class-fl-builder-loop.php
CHANGED
@@ -511,10 +511,11 @@ final class FLBuilderLoop {
|
|
511 |
return;
|
512 |
}
|
513 |
|
514 |
-
$
|
|
|
515 |
|
516 |
// Check if it's a CPT archive or CPT single.
|
517 |
-
if ( $custom_paged['current_page'] != $post_type ) {
|
518 |
|
519 |
// Is a child post of the current post type?
|
520 |
$post_object = get_page_by_path( $custom_paged['current_page'], OBJECT, $post_type );
|
511 |
return;
|
512 |
}
|
513 |
|
514 |
+
$has_archive = is_string( $args->has_archive ) ? $args->has_archive : false;
|
515 |
+
$is_single = false;
|
516 |
|
517 |
// Check if it's a CPT archive or CPT single.
|
518 |
+
if ( $custom_paged['current_page'] != $post_type && $has_archive != $custom_paged['current_page'] ) {
|
519 |
|
520 |
// Is a child post of the current post type?
|
521 |
$post_object = get_page_by_path( $custom_paged['current_page'], OBJECT, $post_type );
|
classes/class-fl-builder-model.php
CHANGED
@@ -790,7 +790,7 @@ final class FLBuilderModel {
|
|
790 |
* @since 1.0
|
791 |
* @return string
|
792 |
*/
|
793 |
-
static public function get_asset_version() {
|
794 |
$post_id = self::get_post_id();
|
795 |
$active = self::is_builder_active();
|
796 |
$preview = self::is_builder_draft_preview();
|
@@ -798,10 +798,11 @@ final class FLBuilderModel {
|
|
798 |
if ( $active || $preview ) {
|
799 |
return md5( uniqid() );
|
800 |
} else {
|
801 |
-
return md5( get_post_modified_time( 'U', false, $post_id ) );
|
802 |
}
|
803 |
}
|
804 |
|
|
|
805 |
/**
|
806 |
* Returns an array of paths for the CSS and JS assets
|
807 |
* of the current post.
|
@@ -4046,6 +4047,76 @@ final class FLBuilderModel {
|
|
4046 |
);
|
4047 |
}
|
4048 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4049 |
/**
|
4050 |
* Sanitizes settings for a form.
|
4051 |
*
|
790 |
* @since 1.0
|
791 |
* @return string
|
792 |
*/
|
793 |
+
static public function get_asset_version( $path = false ) {
|
794 |
$post_id = self::get_post_id();
|
795 |
$active = self::is_builder_active();
|
796 |
$preview = self::is_builder_draft_preview();
|
798 |
if ( $active || $preview ) {
|
799 |
return md5( uniqid() );
|
800 |
} else {
|
801 |
+
return $path ? md5( file_get_contents( $path ) ) : md5( get_post_modified_time( 'U', false, $post_id ) );
|
802 |
}
|
803 |
}
|
804 |
|
805 |
+
|
806 |
/**
|
807 |
* Returns an array of paths for the CSS and JS assets
|
808 |
* of the current post.
|
4047 |
);
|
4048 |
}
|
4049 |
|
4050 |
+
/**
|
4051 |
+
* Verify the settings for a node to make sure they
|
4052 |
+
* can be saved safely.
|
4053 |
+
*
|
4054 |
+
* @since 2.4.1
|
4055 |
+
* @param object $settings The settings to verify.
|
4056 |
+
* @return bool
|
4057 |
+
*/
|
4058 |
+
static public function verify_settings( $settings ) {
|
4059 |
+
return self::verify_settings_kses( $settings );
|
4060 |
+
}
|
4061 |
+
|
4062 |
+
/**
|
4063 |
+
* Verify the settings for a node by running them through wp_kses.
|
4064 |
+
* Any settings that have changed mean unallowed code was entered.
|
4065 |
+
*
|
4066 |
+
* @since 2.4.1
|
4067 |
+
* @param object $settings The settings to verify.
|
4068 |
+
* @return bool
|
4069 |
+
*/
|
4070 |
+
public static function verify_settings_kses( $settings ) {
|
4071 |
+
|
4072 |
+
if ( ! has_filter( 'safe_style_css', '__return_empty_array' ) ) {
|
4073 |
+
add_filter( 'safe_style_css', '__return_empty_array' );
|
4074 |
+
}
|
4075 |
+
|
4076 |
+
foreach ( $settings as $key => $value ) {
|
4077 |
+
if ( is_string( $value ) ) {
|
4078 |
+
$value = stripslashes( $value );
|
4079 |
+
$sanitized = wp_kses_post( $value );
|
4080 |
+
if ( json_encode( $sanitized ) !== json_encode( self::fix_kses( $value ) ) ) {
|
4081 |
+
remove_filter( 'safe_style_css', '__return_empty_array' );
|
4082 |
+
$output = array(
|
4083 |
+
'diff' => wp_text_diff( $value, $sanitized, array( 'show_split_view' => false ) ),
|
4084 |
+
'value' => self::fix_kses( $value ),
|
4085 |
+
'parsed' => $sanitized,
|
4086 |
+
'key' => $key,
|
4087 |
+
);
|
4088 |
+
return $output;
|
4089 |
+
}
|
4090 |
+
} else {
|
4091 |
+
if ( is_object( $value ) || is_array( $value ) ) {
|
4092 |
+
if ( ! self::verify_settings_kses( $value ) ) {
|
4093 |
+
remove_filter( 'safe_style_css', '__return_empty_array' );
|
4094 |
+
return false;
|
4095 |
+
}
|
4096 |
+
}
|
4097 |
+
}
|
4098 |
+
}
|
4099 |
+
|
4100 |
+
remove_filter( 'safe_style_css', '__return_empty_array' );
|
4101 |
+
return true;
|
4102 |
+
}
|
4103 |
+
|
4104 |
+
/**
|
4105 |
+
* Add a space to self closing tags and other things if there isnt one because kses will and checks will fail.
|
4106 |
+
* @since 2.4.2
|
4107 |
+
*/
|
4108 |
+
static public function fix_kses( $value ) {
|
4109 |
+
|
4110 |
+
// fix & -> &
|
4111 |
+
$value = str_replace( '&', '&', $value );
|
4112 |
+
|
4113 |
+
// fix <br/> -> <br />
|
4114 |
+
$value = preg_replace( '#(<[a-z]+)(\/>)#', '$1 $2', $value );
|
4115 |
+
|
4116 |
+
return $value;
|
4117 |
+
}
|
4118 |
+
|
4119 |
+
|
4120 |
/**
|
4121 |
* Sanitizes settings for a form.
|
4122 |
*
|
classes/class-fl-builder-service-mailjet.php
ADDED
@@ -0,0 +1,331 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( ! class_exists( '\Mailjet\Config' ) ) {
|
4 |
+
/**
|
5 |
+
* Autoloader is generated via Composer.
|
6 |
+
*
|
7 |
+
* For details, check here:
|
8 |
+
* https://github.com/mailjet/mailjet-apiv3-php
|
9 |
+
*
|
10 |
+
*/
|
11 |
+
require_once FL_BUILDER_DIR . 'includes/vendor/mailjet/autoload.php';
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Helper class for the A API.
|
16 |
+
*
|
17 |
+
* @since 2.4
|
18 |
+
*/
|
19 |
+
final class FLBuilderServiceMailjet extends FLBuilderService {
|
20 |
+
|
21 |
+
/**
|
22 |
+
* The ID for this service.
|
23 |
+
*
|
24 |
+
* @since 2.4
|
25 |
+
* @var string $id
|
26 |
+
*/
|
27 |
+
public $id = 'mailjet';
|
28 |
+
|
29 |
+
/**
|
30 |
+
* The API URL
|
31 |
+
*
|
32 |
+
* @since 2.4
|
33 |
+
* @var string $api_url
|
34 |
+
*/
|
35 |
+
public $api_url = 'https://api.mailjet.com/v3/';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @since 2.4
|
39 |
+
* @var object $api_instance
|
40 |
+
* @access private
|
41 |
+
*/
|
42 |
+
private $api_instance = null;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Get an instance of the API.
|
46 |
+
*
|
47 |
+
* @since 2.4
|
48 |
+
* @param string $api_key A valid API token.
|
49 |
+
* @return object The API instance.
|
50 |
+
*/
|
51 |
+
public function get_api( $api_key, $secret_key ) {
|
52 |
+
|
53 |
+
if ( $this->api_instance ) {
|
54 |
+
return $this->api_instance;
|
55 |
+
}
|
56 |
+
|
57 |
+
$this->api_instance = new \Mailjet\Client( $api_key, $secret_key );
|
58 |
+
|
59 |
+
return $this->api_instance;
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Test the API connection.
|
64 |
+
*
|
65 |
+
* @since 1.9
|
66 |
+
* @param array $fields {
|
67 |
+
* @type string $api_key A valid API key.
|
68 |
+
* }
|
69 |
+
* @return array{
|
70 |
+
* @type bool|string $error The error message or false if no error.
|
71 |
+
* @type array $data An array of data used to make the connection.
|
72 |
+
* }
|
73 |
+
*/
|
74 |
+
public function connect( $fields = array() ) {
|
75 |
+
$response = array(
|
76 |
+
'error' => false,
|
77 |
+
'data' => array(),
|
78 |
+
);
|
79 |
+
|
80 |
+
// Make sure both API and Secret Keys are provided.
|
81 |
+
if ( empty( $fields['api_key'] ) || empty( $fields['secret_key'] ) ) {
|
82 |
+
$response['error'] = __( 'Error: Both Mailjet API and Secret Keys are required.', 'fl-builder' );
|
83 |
+
return $response;
|
84 |
+
}
|
85 |
+
|
86 |
+
try {
|
87 |
+
|
88 |
+
$api = $this->get_api( $fields['api_key'], $fields['secret_key'] );
|
89 |
+
// phpcs:disable
|
90 |
+
$mj_response = $api->get( \Mailjet\Resources::$Contactmetadata, array(
|
91 |
+
'filters' => array(
|
92 |
+
'Limit' => '1',
|
93 |
+
),
|
94 |
+
));
|
95 |
+
// phpcs:enable
|
96 |
+
|
97 |
+
if ( $mj_response->success() ) {
|
98 |
+
$response['data'] = array(
|
99 |
+
'api_key' => $fields['api_key'],
|
100 |
+
'secret_key' => $fields['secret_key'],
|
101 |
+
);
|
102 |
+
} else {
|
103 |
+
$mj_status = $mj_response->getStatus();
|
104 |
+
|
105 |
+
/* translators: %s: Mailjet Error Code */
|
106 |
+
$response['error'] = sprintf( __( 'Error Code %s: Could not connect to Mailerjet.', 'fl-builder' ), $mj_status );
|
107 |
+
|
108 |
+
if ( 401 == $mj_status ) {
|
109 |
+
/* translators: %s: Mailjet Error Code */
|
110 |
+
$response['error'] = sprintf( __( 'Error Code %s: You have specified an incorrect API Key / API Secret Key pair.', 'fl-builder' ), $mj_status );
|
111 |
+
}
|
112 |
+
}
|
113 |
+
} catch ( ConnectException $e ) {
|
114 |
+
$response['error'] = $e->getMessage();
|
115 |
+
|
116 |
+
return $response;
|
117 |
+
}
|
118 |
+
|
119 |
+
return $response;
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Renders the markup for the connection settings.
|
124 |
+
*
|
125 |
+
* @since 2.4
|
126 |
+
* @return string The connection settings markup.
|
127 |
+
*/
|
128 |
+
public function render_connect_settings() {
|
129 |
+
ob_start();
|
130 |
+
|
131 |
+
FLBuilder::render_settings_field( 'api_key', array(
|
132 |
+
'row_class' => 'fl-builder-service-connect-row',
|
133 |
+
'class' => 'fl-builder-service-connect-input',
|
134 |
+
'type' => 'text',
|
135 |
+
'label' => __( 'API Key', 'fl-builder' ),
|
136 |
+
'help' => __( 'Found in your Mailjet account under Account Settings > Rest API > Master API Key & Sub API Key Management.', 'fl-builder' ),
|
137 |
+
'description' => sprintf( '<a target="_blank" href="https://app.mailjet.com/account/api_keys">%s</a>', __( 'Mailjet API settings', 'fl-builder' ) ),
|
138 |
+
'preview' => array(
|
139 |
+
'type' => 'none',
|
140 |
+
),
|
141 |
+
));
|
142 |
+
|
143 |
+
FLBuilder::render_settings_field( 'secret_key', array(
|
144 |
+
'row_class' => 'fl-builder-service-connect-row',
|
145 |
+
'class' => 'fl-builder-service-connect-input',
|
146 |
+
'type' => 'text',
|
147 |
+
'label' => __( 'Secret Key', 'fl-builder' ),
|
148 |
+
'help' => __( 'Found in your Mailjet account under Account Settings > Rest API > Master API Key & Sub API Key Management.', 'fl-builder' ),
|
149 |
+
'preview' => array(
|
150 |
+
'type' => 'none',
|
151 |
+
),
|
152 |
+
));
|
153 |
+
|
154 |
+
return ob_get_clean();
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Render the markup for service specific fields.
|
159 |
+
*
|
160 |
+
* @since 2.4
|
161 |
+
* @param string $account The name of the saved account.
|
162 |
+
* @param object $settings Saved module settings.
|
163 |
+
* @return array {
|
164 |
+
* @type bool|string $error The error message or false if no error.
|
165 |
+
* @type string $html The field markup.
|
166 |
+
* }
|
167 |
+
*/
|
168 |
+
public function render_fields( $account, $settings ) {
|
169 |
+
$mj_contact_list = array();
|
170 |
+
|
171 |
+
try {
|
172 |
+
$account_data = $this->get_account_data( $account );
|
173 |
+
$api = $this->get_api( $account_data['api_key'], $account_data['secret_key'] );
|
174 |
+
// phpcs:disable
|
175 |
+
$mj_response = $api->get( \Mailjet\Resources::$Contactslist );
|
176 |
+
// phpcs:enable
|
177 |
+
|
178 |
+
if ( $mj_response->success() ) {
|
179 |
+
$lists = $mj_response->getData();
|
180 |
+
foreach ( $lists as $list ) {
|
181 |
+
$mj_contact_list[] = (object) $list;
|
182 |
+
}
|
183 |
+
}
|
184 |
+
} catch ( ConnectionException $e ) {
|
185 |
+
$response = array(
|
186 |
+
'error' => $e->getMessage(),
|
187 |
+
);
|
188 |
+
}
|
189 |
+
|
190 |
+
$response = array(
|
191 |
+
'error' => false,
|
192 |
+
'html' => $this->render_list_field( $mj_contact_list, $settings ),
|
193 |
+
);
|
194 |
+
|
195 |
+
return $response;
|
196 |
+
}
|
197 |
+
|
198 |
+
/**
|
199 |
+
* Render markup for the list field.
|
200 |
+
*
|
201 |
+
* @since 2.4
|
202 |
+
* @param array $lists List data from the API.
|
203 |
+
* @param object $settings Saved module settings.
|
204 |
+
* @return string The markup for the list field.
|
205 |
+
* @access private
|
206 |
+
*/
|
207 |
+
private function render_list_field( $lists, $settings ) {
|
208 |
+
ob_start();
|
209 |
+
|
210 |
+
$options = array(
|
211 |
+
'' => __( 'Choose...', 'fl-builder' ),
|
212 |
+
);
|
213 |
+
|
214 |
+
if ( $lists ) {
|
215 |
+
foreach ( $lists as $list ) {
|
216 |
+
// phpcs:disable
|
217 |
+
$options[ $list->ID ] = esc_attr( $list->Name );
|
218 |
+
// phpcs:enable
|
219 |
+
}
|
220 |
+
}
|
221 |
+
|
222 |
+
FLBuilder::render_settings_field( 'list_id', array(
|
223 |
+
'row_class' => 'fl-builder-service-field-row',
|
224 |
+
'class' => 'fl-builder-service-list-select',
|
225 |
+
'type' => 'select',
|
226 |
+
'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
|
227 |
+
'options' => $options,
|
228 |
+
'preview' => array(
|
229 |
+
'type' => 'none',
|
230 |
+
),
|
231 |
+
), $settings);
|
232 |
+
|
233 |
+
return ob_get_clean();
|
234 |
+
}
|
235 |
+
|
236 |
+
/**
|
237 |
+
* Subscribe an email address to Mailjet.
|
238 |
+
*
|
239 |
+
* @since 2.4
|
240 |
+
* @param object $settings A module settings object.
|
241 |
+
* @param string $email The email to subscribe.
|
242 |
+
* @param string $name Optional. The full name of the person subscribing.
|
243 |
+
* @return array {
|
244 |
+
* @type bool|string $error The error message or false if no error.
|
245 |
+
* }
|
246 |
+
*/
|
247 |
+
public function subscribe( $settings, $email, $name = '' ) {
|
248 |
+
$data = array(
|
249 |
+
'email' => $email,
|
250 |
+
'name' => '',
|
251 |
+
'last_name' => '',
|
252 |
+
'list_id' => $settings->list_id,
|
253 |
+
);
|
254 |
+
|
255 |
+
$response = array(
|
256 |
+
'error' => false,
|
257 |
+
);
|
258 |
+
|
259 |
+
$account_data = $this->get_account_data( $settings->service_account );
|
260 |
+
|
261 |
+
if ( ! $account_data ) {
|
262 |
+
$response['error'] = __( 'There was an error subscribing to Mailerjet. The account is no longer connected.', 'fl-builder' );
|
263 |
+
} else {
|
264 |
+
|
265 |
+
$api = $this->get_api( $account_data['api_key'], $account_data['secret_key'] );
|
266 |
+
|
267 |
+
// Add the name to the data array if we have one.
|
268 |
+
if ( $name ) {
|
269 |
+
|
270 |
+
$names = explode( ' ', $name );
|
271 |
+
|
272 |
+
if ( isset( $names[0] ) ) {
|
273 |
+
$data['name'] = $names[0];
|
274 |
+
}
|
275 |
+
if ( isset( $names[1] ) ) {
|
276 |
+
$data['last_name'] = $names[1];
|
277 |
+
}
|
278 |
+
}
|
279 |
+
|
280 |
+
try {
|
281 |
+
$exists = false;
|
282 |
+
$exists_subscribed = false;
|
283 |
+
|
284 |
+
// phpcs:disable
|
285 |
+
$mj_response = $api->get(\Mailjet\Resources::$Listrecipient, array(
|
286 |
+
'filters' => array(
|
287 |
+
'ContactEmail' => $data['email'],
|
288 |
+
'ContactsList' => $data['list_id'],
|
289 |
+
),
|
290 |
+
));
|
291 |
+
// phpcs:enable
|
292 |
+
|
293 |
+
if ( $mj_response->success() && $mj_response->getCount() > 0 ) {
|
294 |
+
$mj_data = $mj_response->getData();
|
295 |
+
$exists = true;
|
296 |
+
|
297 |
+
if ( isset( $mj_data[0]['IsUnsubscribed'] ) && false == $mj_data[0]['IsUnsubscribed'] ) {
|
298 |
+
$exists_subscribed = true;
|
299 |
+
}
|
300 |
+
}
|
301 |
+
|
302 |
+
if ( $exists && $exists_subscribed ) {
|
303 |
+
/* translators: %1$s for email address %2$s for list_id */
|
304 |
+
$response['error'] = sprintf( __( 'Email address (%1$s) already exists and subscribed to the list (%2$s).', 'fl-builder' ), $data['email'], $data['list_id'] );
|
305 |
+
} else {
|
306 |
+
|
307 |
+
// phpcs:disable
|
308 |
+
$mj_response = $api->post(\Mailjet\Resources::$ContactslistManagecontact, array(
|
309 |
+
'id' => $data['list_id'],
|
310 |
+
'body' => array(
|
311 |
+
'Name' => $data['name'],
|
312 |
+
'Properties' => 'object',
|
313 |
+
'Action' => 'addnoforce',
|
314 |
+
'Email' => $data['email'],
|
315 |
+
),
|
316 |
+
));
|
317 |
+
// phpcs:enable
|
318 |
+
|
319 |
+
if ( ! $mj_response->success() ) {
|
320 |
+
/* translators: %1$s for email address %2$s for list_id */
|
321 |
+
$response['error'] = sprintf( __( 'Mailjet subscription failed. Email address = %1$s; List ID = %2$s. ', 'fl-builder' ), $data['email'], $data['list_id'] );
|
322 |
+
}
|
323 |
+
}
|
324 |
+
} catch ( ConnectException $e ) {
|
325 |
+
$response['error'] = $e->getMessage();
|
326 |
+
}
|
327 |
+
}
|
328 |
+
|
329 |
+
return $response;
|
330 |
+
}
|
331 |
+
}
|
classes/class-fl-builder-services.php
CHANGED
@@ -111,6 +111,11 @@ final class FLBuilderServices {
|
|
111 |
'name' => 'MailerLite',
|
112 |
'class' => 'FLBuilderServiceMailerLite',
|
113 |
),
|
|
|
|
|
|
|
|
|
|
|
114 |
'mailpoet' => array(
|
115 |
'type' => 'autoresponder',
|
116 |
'name' => 'MailPoet',
|
111 |
'name' => 'MailerLite',
|
112 |
'class' => 'FLBuilderServiceMailerLite',
|
113 |
),
|
114 |
+
'mailjet' => array(
|
115 |
+
'type' => 'autoresponder',
|
116 |
+
'name' => 'Mailjet',
|
117 |
+
'class' => 'FLBuilderServiceMailjet',
|
118 |
+
),
|
119 |
'mailpoet' => array(
|
120 |
'type' => 'autoresponder',
|
121 |
'name' => 'MailPoet',
|
classes/class-fl-builder-shortcodes.php
CHANGED
@@ -45,7 +45,7 @@ final class FLBuilderShortcodes {
|
|
45 |
} else {
|
46 |
$args['post__in'] = explode( ',', $attrs['id'] );
|
47 |
}
|
48 |
-
} elseif ( isset( $attrs['slug'] ) ) {
|
49 |
$args['orderby'] = 'name';
|
50 |
$args['name'] = $attrs['slug'];
|
51 |
} else {
|
45 |
} else {
|
46 |
$args['post__in'] = explode( ',', $attrs['id'] );
|
47 |
}
|
48 |
+
} elseif ( isset( $attrs['slug'] ) && '' !== $attrs['slug'] ) {
|
49 |
$args['orderby'] = 'name';
|
50 |
$args['name'] = $attrs['slug'];
|
51 |
} else {
|
classes/class-fl-builder-utils.php
CHANGED
@@ -306,4 +306,21 @@ final class FLBuilderUtils {
|
|
306 |
return apply_filters( 'fl_lazyload', "loading='$loading'" );
|
307 |
}
|
308 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
309 |
}
|
306 |
return apply_filters( 'fl_lazyload', "loading='$loading'" );
|
307 |
}
|
308 |
|
309 |
+
/**
|
310 |
+
* @since 2.4.1
|
311 |
+
*/
|
312 |
+
public static function get_current_user_role() {
|
313 |
+
if ( is_user_logged_in() ) {
|
314 |
+
global $wp_roles;
|
315 |
+
$user = wp_get_current_user();
|
316 |
+
$role = (array) $user->roles;
|
317 |
+
if ( isset( $role[0] ) && isset( $wp_roles->roles[ $role[0] ] ) ) {
|
318 |
+
return esc_attr( $wp_roles->roles[ $role[0] ]['name'] );
|
319 |
+
}
|
320 |
+
if ( isset( $role[0] ) ) {
|
321 |
+
return $role[0];
|
322 |
+
}
|
323 |
+
return 'Unknown';
|
324 |
+
}
|
325 |
+
}
|
326 |
}
|
classes/class-fl-builder-wp-blocks-layout.php
CHANGED
@@ -130,9 +130,9 @@ final class FLBuilderWPBlocksLayout {
|
|
130 |
$post_id = FLBuilderModel::get_post_id();
|
131 |
$post = get_post( $post_id );
|
132 |
|
133 |
-
$block =
|
134 |
$block .= self::remove_broken_p_tags( $content );
|
135 |
-
$block .=
|
136 |
|
137 |
return $block;
|
138 |
}
|
@@ -161,9 +161,24 @@ final class FLBuilderWPBlocksLayout {
|
|
161 |
* @return string
|
162 |
*/
|
163 |
static public function remove_broken_p_tags( $content ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
$content = preg_replace( '/<p>(.*)<\/p>/i', '<fl-p-placeholder>$1</fl-p-placeholder>', $content );
|
165 |
$content = preg_replace( '/<\/?p[^>]*\>/i', '', $content );
|
166 |
$content = preg_replace( '/fl-p-placeholder/i', 'p', $content );
|
|
|
|
|
|
|
|
|
167 |
return $content;
|
168 |
}
|
169 |
}
|
130 |
$post_id = FLBuilderModel::get_post_id();
|
131 |
$post = get_post( $post_id );
|
132 |
|
133 |
+
$block = "<!-- wp:fl-builder/layout -->\n";
|
134 |
$block .= self::remove_broken_p_tags( $content );
|
135 |
+
$block .= "\n<!-- /wp:fl-builder/layout -->";
|
136 |
|
137 |
return $block;
|
138 |
}
|
161 |
* @return string
|
162 |
*/
|
163 |
static public function remove_broken_p_tags( $content ) {
|
164 |
+
// Convert microsoft special characters
|
165 |
+
$replace = array(
|
166 |
+
'‘' => "'",
|
167 |
+
'’' => "'",
|
168 |
+
'”' => '"',
|
169 |
+
'“' => '"',
|
170 |
+
'–' => '-',
|
171 |
+
'—' => '-',
|
172 |
+
'…' => '…',
|
173 |
+
);
|
174 |
+
$content = preg_replace( '@<p.*?></p>@', '', $content );
|
175 |
$content = preg_replace( '/<p>(.*)<\/p>/i', '<fl-p-placeholder>$1</fl-p-placeholder>', $content );
|
176 |
$content = preg_replace( '/<\/?p[^>]*\>/i', '', $content );
|
177 |
$content = preg_replace( '/fl-p-placeholder/i', 'p', $content );
|
178 |
+
foreach ( $replace as $k => $v ) {
|
179 |
+
$content = str_replace( $k, $v, $content );
|
180 |
+
}
|
181 |
+
$content = force_balance_tags( $content );
|
182 |
return $content;
|
183 |
}
|
184 |
}
|
classes/class-fl-builder.php
CHANGED
@@ -68,7 +68,7 @@ final class FLBuilder {
|
|
68 |
* @since 2.1
|
69 |
*/
|
70 |
static public $fa4_url = '';
|
71 |
-
static public $fa5_pro_url = 'https://pro.fontawesome.com/releases/v5.
|
72 |
|
73 |
/**
|
74 |
* Initializes hooks.
|
@@ -737,6 +737,10 @@ final class FLBuilder {
|
|
737 |
return;
|
738 |
}
|
739 |
|
|
|
|
|
|
|
|
|
740 |
// Enqueue.
|
741 |
if ( 'css' == $type ) {
|
742 |
wp_enqueue_style( $handle, $url, $css_deps, $asset_ver, $css_media );
|
@@ -791,7 +795,7 @@ final class FLBuilder {
|
|
791 |
wp_enqueue_style( 'foundation-icons' );
|
792 |
wp_enqueue_style( 'jquery-nanoscroller', $css_url . 'jquery.nanoscroller.css', array(), $ver );
|
793 |
wp_enqueue_style( 'jquery-autosuggest', $css_url . 'jquery.autoSuggest.min.css', array(), $ver );
|
794 |
-
wp_enqueue_style( 'jquery-tiptip', $css_url . 'jquery.tiptip.css', array(), $ver );
|
795 |
wp_enqueue_style( 'bootstrap-tour', $css_url . 'bootstrap-tour-standalone.min.css', array(), $ver );
|
796 |
if ( true === apply_filters( 'fl_select2_enabled', true ) ) {
|
797 |
wp_enqueue_style( 'select2', $css_url . 'select2.min.css', array(), $ver );
|
@@ -860,7 +864,7 @@ final class FLBuilder {
|
|
860 |
wp_enqueue_script( 'jquery-ui-sortable', $js_url . 'jquery.ui.sortable.js', array( 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse' ), $ver );
|
861 |
wp_enqueue_script( 'jquery-nanoscroller', $js_url . 'jquery.nanoscroller.min.js', array(), $ver );
|
862 |
wp_enqueue_script( 'jquery-autosuggest', $js_url . 'jquery.autoSuggest.min.js', array(), $ver );
|
863 |
-
wp_enqueue_script( 'jquery-tiptip', $js_url . 'jquery.tiptip.min.js', array(), $ver );
|
864 |
wp_enqueue_script( 'jquery-showhideevents', $js_url . 'jquery.showhideevents.js', array(), $ver );
|
865 |
wp_enqueue_script( 'jquery-simulate', $js_url . 'jquery.simulate.js', array(), $ver );
|
866 |
wp_enqueue_script( 'jquery-validate', $js_url . 'jquery.validate.min.js', array(), $ver );
|
@@ -2246,6 +2250,9 @@ final class FLBuilder {
|
|
2246 |
if ( ! empty( $row->settings->top_edge_shape ) || ! empty( $row->settings->bottom_edge_shape ) ) {
|
2247 |
$attrs['class'][] = 'fl-row-has-layers';
|
2248 |
}
|
|
|
|
|
|
|
2249 |
|
2250 |
// Data
|
2251 |
if ( 'parallax' == $row->settings->bg_type && ! empty( $row->settings->bg_parallax_image_src ) ) {
|
68 |
* @since 2.1
|
69 |
*/
|
70 |
static public $fa4_url = '';
|
71 |
+
static public $fa5_pro_url = 'https://pro.fontawesome.com/releases/v5.15.1/css/all.css';
|
72 |
|
73 |
/**
|
74 |
* Initializes hooks.
|
737 |
return;
|
738 |
}
|
739 |
|
740 |
+
if ( $global ) {
|
741 |
+
$asset_ver = FLBuilderModel::get_asset_version( $path );
|
742 |
+
}
|
743 |
+
|
744 |
// Enqueue.
|
745 |
if ( 'css' == $type ) {
|
746 |
wp_enqueue_style( $handle, $url, $css_deps, $asset_ver, $css_media );
|
795 |
wp_enqueue_style( 'foundation-icons' );
|
796 |
wp_enqueue_style( 'jquery-nanoscroller', $css_url . 'jquery.nanoscroller.css', array(), $ver );
|
797 |
wp_enqueue_style( 'jquery-autosuggest', $css_url . 'jquery.autoSuggest.min.css', array(), $ver );
|
798 |
+
wp_enqueue_style( 'fl-jquery-tiptip', $css_url . 'jquery.tiptip.css', array(), $ver );
|
799 |
wp_enqueue_style( 'bootstrap-tour', $css_url . 'bootstrap-tour-standalone.min.css', array(), $ver );
|
800 |
if ( true === apply_filters( 'fl_select2_enabled', true ) ) {
|
801 |
wp_enqueue_style( 'select2', $css_url . 'select2.min.css', array(), $ver );
|
864 |
wp_enqueue_script( 'jquery-ui-sortable', $js_url . 'jquery.ui.sortable.js', array( 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse' ), $ver );
|
865 |
wp_enqueue_script( 'jquery-nanoscroller', $js_url . 'jquery.nanoscroller.min.js', array(), $ver );
|
866 |
wp_enqueue_script( 'jquery-autosuggest', $js_url . 'jquery.autoSuggest.min.js', array(), $ver );
|
867 |
+
wp_enqueue_script( 'fl-jquery-tiptip', $js_url . 'jquery.tiptip.min.js', array(), $ver );
|
868 |
wp_enqueue_script( 'jquery-showhideevents', $js_url . 'jquery.showhideevents.js', array(), $ver );
|
869 |
wp_enqueue_script( 'jquery-simulate', $js_url . 'jquery.simulate.js', array(), $ver );
|
870 |
wp_enqueue_script( 'jquery-validate', $js_url . 'jquery.validate.min.js', array(), $ver );
|
2250 |
if ( ! empty( $row->settings->top_edge_shape ) || ! empty( $row->settings->bottom_edge_shape ) ) {
|
2251 |
$attrs['class'][] = 'fl-row-has-layers';
|
2252 |
}
|
2253 |
+
if ( ( 'photo' === $row->settings->bg_type ) && ( 'fixed' === $row->settings->bg_attachment ) ) {
|
2254 |
+
$attrs['class'][] = 'fl-row-bg-fixed';
|
2255 |
+
}
|
2256 |
|
2257 |
// Data
|
2258 |
if ( 'parallax' == $row->settings->bg_type && ! empty( $row->settings->bg_parallax_image_src ) ) {
|
css/fl-builder-layout.css
CHANGED
@@ -843,8 +843,16 @@ https://core.trac.wordpress.org/ticket/49285
|
|
843 |
https://github.com/WordPress/gutenberg/issues/17718
|
844 |
*/
|
845 |
@supports (-webkit-touch-callout: inherit) {
|
846 |
-
.fl-row.fl-row-bg-parallax .fl-row-content-wrap
|
|
|
847 |
background-position: center !important;
|
848 |
background-attachment: scroll !important;
|
849 |
}
|
850 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
843 |
https://github.com/WordPress/gutenberg/issues/17718
|
844 |
*/
|
845 |
@supports (-webkit-touch-callout: inherit) {
|
846 |
+
.fl-row.fl-row-bg-parallax .fl-row-content-wrap,
|
847 |
+
.fl-row.fl-row-bg-fixed .fl-row-content-wrap {
|
848 |
background-position: center !important;
|
849 |
background-attachment: scroll !important;
|
850 |
}
|
851 |
}
|
852 |
+
|
853 |
+
@supports (-webkit-touch-callout: none) {
|
854 |
+
.fl-row.fl-row-bg-fixed .fl-row-content-wrap {
|
855 |
+
background-position: center !important;
|
856 |
+
background-attachment: scroll !important;
|
857 |
+
}
|
858 |
+
}
|
css/fl-builder.css
CHANGED
@@ -487,6 +487,7 @@ body .fl-builder-bar .fl-builder-bar-content {
|
|
487 |
transition-property: background-color, opacity, transform;
|
488 |
transition-duration: .35s;
|
489 |
pointer-events: auto;
|
|
|
490 |
}
|
491 |
body .fl-builder-bar .fl-builder-bar-content.is-muted {
|
492 |
pointer-events: none;
|
@@ -1987,6 +1988,7 @@ span.fl-builder-block-no-node-templates:hover {
|
|
1987 |
}
|
1988 |
.fl-builder--panel-view.is-showing {
|
1989 |
display: block;
|
|
|
1990 |
}
|
1991 |
|
1992 |
.fl-builder--content-library-panel.ui-draggable-dragging {
|
@@ -2916,6 +2918,7 @@ button.fl-builder-button.fl-builder-bar-title-caret:focus {
|
|
2916 |
padding: 6px 0;
|
2917 |
position: absolute;
|
2918 |
text-align: left;
|
|
|
2919 |
top: 100%;
|
2920 |
width: 165px;
|
2921 |
z-index: 100008;
|
@@ -3035,6 +3038,7 @@ button.fl-builder-button.fl-builder-bar-title-caret:focus {
|
|
3035 |
flex-direction: column;
|
3036 |
padding: 25px;
|
3037 |
text-align: center;
|
|
|
3038 |
}
|
3039 |
.fl-builder-actions-title {
|
3040 |
color: #333 !important;
|
@@ -3072,6 +3076,7 @@ button.fl-builder-button.fl-builder-bar-title-caret:focus {
|
|
3072 |
color: #333 !important;
|
3073 |
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
3074 |
font-size: 16px !important;
|
|
|
3075 |
line-height: 24px;
|
3076 |
padding: 30px;
|
3077 |
}
|
@@ -3358,6 +3363,7 @@ form.fl-builder-settings {
|
|
3358 |
padding: 0;
|
3359 |
display: flex;
|
3360 |
flex-direction: column;
|
|
|
3361 |
}
|
3362 |
.fl-builder-settings-message {
|
3363 |
font-size: 15px !important;
|
@@ -4808,6 +4814,9 @@ input[type=number].fl-field-popup-slider-focus {
|
|
4808 |
-webkit-backface-visibility: hidden;
|
4809 |
backface-visibility: hidden;
|
4810 |
}
|
|
|
|
|
|
|
4811 |
.fl-builder-edit .media-modal-content h1 {
|
4812 |
font-family: inherit;
|
4813 |
}
|
@@ -5450,6 +5459,7 @@ li.as-result-item em {
|
|
5450 |
#tiptip_content {
|
5451 |
background: #333;
|
5452 |
box-shadow: none;
|
|
|
5453 |
}
|
5454 |
/* @endgroup Settings Lightboxes */
|
5455 |
|
@@ -6285,3 +6295,13 @@ Rules to ensure compatibility with v2.0.
|
|
6285 |
.fl-builder-ui-skin--light .select2-search__field:-moz-placeholder {
|
6286 |
color: #808080 !important;
|
6287 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
487 |
transition-property: background-color, opacity, transform;
|
488 |
transition-duration: .35s;
|
489 |
pointer-events: auto;
|
490 |
+
letter-spacing: normal;
|
491 |
}
|
492 |
body .fl-builder-bar .fl-builder-bar-content.is-muted {
|
493 |
pointer-events: none;
|
1988 |
}
|
1989 |
.fl-builder--panel-view.is-showing {
|
1990 |
display: block;
|
1991 |
+
letter-spacing: normal;
|
1992 |
}
|
1993 |
|
1994 |
.fl-builder--content-library-panel.ui-draggable-dragging {
|
2918 |
padding: 6px 0;
|
2919 |
position: absolute;
|
2920 |
text-align: left;
|
2921 |
+
letter-spacing: normal;
|
2922 |
top: 100%;
|
2923 |
width: 165px;
|
2924 |
z-index: 100008;
|
3038 |
flex-direction: column;
|
3039 |
padding: 25px;
|
3040 |
text-align: center;
|
3041 |
+
letter-spacing: normal;
|
3042 |
}
|
3043 |
.fl-builder-actions-title {
|
3044 |
color: #333 !important;
|
3076 |
color: #333 !important;
|
3077 |
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
3078 |
font-size: 16px !important;
|
3079 |
+
letter-spacing: normal;
|
3080 |
line-height: 24px;
|
3081 |
padding: 30px;
|
3082 |
}
|
3363 |
padding: 0;
|
3364 |
display: flex;
|
3365 |
flex-direction: column;
|
3366 |
+
letter-spacing: normal;
|
3367 |
}
|
3368 |
.fl-builder-settings-message {
|
3369 |
font-size: 15px !important;
|
4814 |
-webkit-backface-visibility: hidden;
|
4815 |
backface-visibility: hidden;
|
4816 |
}
|
4817 |
+
.fl-builder-edit .media-modal-content {
|
4818 |
+
letter-spacing: normal;
|
4819 |
+
}
|
4820 |
.fl-builder-edit .media-modal-content h1 {
|
4821 |
font-family: inherit;
|
4822 |
}
|
5459 |
#tiptip_content {
|
5460 |
background: #333;
|
5461 |
box-shadow: none;
|
5462 |
+
letter-spacing: normal;
|
5463 |
}
|
5464 |
/* @endgroup Settings Lightboxes */
|
5465 |
|
6295 |
.fl-builder-ui-skin--light .select2-search__field:-moz-placeholder {
|
6296 |
color: #808080 !important;
|
6297 |
}
|
6298 |
+
|
6299 |
+
.fl-diff td.diff-addedline,
|
6300 |
+
.fl-diff td.diff-context,
|
6301 |
+
.fl-diff td.diff-deletedline span {
|
6302 |
+
display: none;
|
6303 |
+
}
|
6304 |
+
|
6305 |
+
.fl-diff table.diff {
|
6306 |
+
width: 100%;
|
6307 |
+
}
|
css/fl-builder.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.fl-color-picker-ui{width:300px}.fl-color-picker-ui.fl-color-alpha-enabled{width:334px}.fl-color-picker-ui .iris-picker{float:left;width:100%;height:224px;display:block;position:relative;border-top:1px solid rgba(0,0,0,.1)}.fl-color-picker-ui .iris-picker .iris-square-inner,.fl-color-picker-ui .iris-picker-inner{position:absolute;left:0;top:0;bottom:0;right:0}.fl-color-picker-ui .iris-picker,.iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.fl-color-picker-ui .iris-error{background-color:#ffafaf}.fl-color-picker-ui .iris-picker .iris-square{width:300px;height:200px}.fl-color-picker-ui .iris-picker .iris-palette,.fl-color-picker-ui .iris-picker .iris-slider,.fl-color-picker-ui .iris-picker .iris-square-inner{height:100%;width:12.5%}.fl-color-picker-ui .iris-picker .iris-placeholder,.fl-color-picker-ui .iris-picker .iris-square{position:relative}.fl-color-picker-ui .iris-picker .iris-square-inner{width:auto;margin:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square,.fl-color-picker-ui .iris-ie-9 .iris-square-inner{box-shadow:none;border-radius:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square{outline:rgba(0,0,0,.1) solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-palette,.fl-color-picker-ui .iris-ie-lt9 .iris-slider,.fl-color-picker-ui .iris-ie-lt9 .iris-square,.fl-color-picker-ui .iris-ie-lt9 .iris-square-inner{outline:#999 solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-square .ui-slider-handle{outline:#999 solid 1px;background-color:#fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.fl-color-picker-ui .iris-ie-lt9 .iris-square .iris-square-handle{background:0 0;border:3px solid #fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.fl-color-picker-ui .iris-picker .iris-strip{box-sizing:border-box;width:calc(300px - 12px);margin:5px 6px 6px;border-radius:4px;position:relative;height:22px;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle{width:6px;position:absolute;right:0;top:-2px;bottom:-2px;margin:0;border-radius:3px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.5);z-index:5;cursor:ew-resize}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle:focus{outline:#00a0d2 solid 2px}.fl-color-picker-ui .iris-picker .iris-slider-offset{position:absolute;top:0;left:6px;right:0;bottom:0;width:auto;height:auto;background:0 0;border:none;border-radius:0;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-square-handle{background:0 0;border:5px solid #999;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.fl-color-picker-ui .iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover{border-color:#999}.fl-color-picker-ui .iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover::after{border-color:#fff}.fl-color-picker-ui .iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.fl-color-picker-ui .iris-picker .iris-square-value{width:0;height:0;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.fl-color-picker-wrapper{position:relative;width:48px;height:32px}.fl-color-picker{box-shadow:0 2px 4px 0 rgba(0,0,0,.12);background:url(../img/transp_bg.png) #fff;border-radius:4px;width:120px;height:36px;display:flex;flex-direction:row}.fl-color-picker-color{flex:1 1 100%;box-sizing:border-box!important;position:relative;border-radius:4px;background-color:transparent;cursor:pointer;border:2px solid transparent;padding:0;justify-content:center;display:flex}.fl-color-picker-clear:hover,.fl-color-picker-color:hover{background:0 0;border:2px solid transparent}.fl-color-picker-clear:focus,.fl-color-picker-color.fl-color-picker-empty:focus,.fl-color-picker-color:focus{outline:0;top:0;border:2px solid #00a0d2;background:0 0}.fl-color-picker.fl-color-picker-has-reset .fl-color-picker-color:not(.fl-color-picker-empty){border-top-right-radius:0;border-bottom-right-radius:0}.fl-color-picker-icon{display:none;margin:auto}.fl-color-picker-color.fl-color-picker-empty{border-color:transparent;background-color:transparent}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon{display:block}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon path{fill:inherit}.fl-color-picker-clear{box-sizing:border-box;position:relative;display:flex!important;flex:0 0 36px;justify-content:center;padding:0;border:2px solid transparent;fill:#A2AABE;background-color:#E7EBEF!important;cursor:pointer;align-items:center;border-radius:0 4px 4px 0}.fl-color-picker-clear:hover{fill:#6B6E75;background-color:#E7EBEF}.fl-color-picker-color.fl-color-picker-empty+.fl-color-picker-clear{display:none}.fl-color-picker-ui{display:inline-block;font-family:Helvetica,Verdana,sans-serif;z-index:1;position:fixed;overflow:hidden;padding-bottom:45px;border:1px solid rgba(0,0,0,.1);color:#999;background-color:#FAFAFA;border-radius:3px;-webkit-box-shadow:0 9px 20px rgba(0,0,0,.17);box-shadow:0 9px 20px rgba(0,0,0,.17);-webkit-transition:opacity .2s,visibility .2s;-moz-transition:opacity .2s,visibility .2s;-ms-transition:opacity .2s,visibility .2s;-o-transition:opacity .2s,visibility .2s;transition:opacity .2s,visibility .2s;visibility:hidden;opacity:0;-webkit-transform:translate3d(0,0,0)}.fl-color-picker-ui.fl-color-picker-active{visibility:visible;opacity:1;z-index:999999}.fl-color-picker-ui .fl-color-picker-input,.fl-color-picker-ui .fl-color-picker-input:focus{width:100%;height:30px;border:none!important;font-size:14px!important;padding:0 8px;vertical-align:middle;color:#656c6e;background-color:#fff;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.fl-color-picker-ui .iris-square-value{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.fl-color-picker-preset-add{position:absolute;top:8px;right:8px;width:14px;height:14px;background-color:#656c6e;border-radius:50%;cursor:pointer;-webkit-transition:all .2s;-moz-transition:all .2s;-ms-transition:all .2s;-o-transition:all .2s;transition:all .2s}.fl-color-picker-preset-add:hover{background-color:#333}.fl-color-picker-preset-add:after,.fl-color-picker-preset-add:before{content:'';display:block;position:relative;background-color:#fff}.fl-color-picker-preset-add:before{top:6px;left:3px;width:8px;height:2px}.fl-color-picker-preset-add:after{left:6px;top:1px;width:2px;height:8px}.fl-color-picker-presets{position:absolute;left:0;bottom:0;width:100%;z-index:15;overflow:auto;border-top:1px solid rgba(0,0,0,.1);background-color:#FAFAFA}.fl-color-picker-presets-list .fl-color-picker-preset:hover,.fl-color-picker-presets-toggle:hover{background-color:#EDEDED}.fl-color-picker-presets-toggle{position:relative;overflow:hidden;width:100%;height:35px;text-align:center;line-height:35px;font-size:12px;font-weight:700;cursor:pointer;-webkit-transition:all .1s;-moz-transition:all .1s;-ms-transition:all .1s;-o-transition:all .1s;transition:all .1s}.fl-color-picker-presets-close-label,.fl-color-picker-presets-open-label{position:absolute;top:50%;left:50%;visibility:hidden;color:#999;-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;width:100%}.fl-color-picker-presets-close-label.fl-color-picker-active,.fl-color-picker-presets-open-label.fl-color-picker-active{color:#656c6e;visibility:visible;opacity:1;z-index:999999}.fl-color-picker-presets-list{width:100%;list-style:none;margin:0;padding:0;overflow:auto}.fl-color-picker-presets-list .fl-color-picker-no-preset,.fl-color-picker-presets-list .fl-color-picker-preset{position:relative;padding:5px;font-size:12px;border-top:1px solid rgba(0,0,0,.1);-webkit-transition:all .1s;-moz-transition:all .1s;-ms-transition:all .1s;-o-transition:all .1s;transition:all .1s}.fl-color-picker-presets-list .fl-color-picker-no-preset{padding:18px 5px;text-align:center}.fl-color-picker-presets-list .fl-color-picker-preset-color{display:inline-block;width:40px;height:20px;margin-right:3px;vertical-align:middle;border:1px solid rgba(0,0,0,.1);border-radius:2px;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-label{vertical-align:middle;color:#333;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-remove{position:absolute;top:50%;cursor:pointer;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}.fl-color-picker-clear .fl-color-picker-icon-remove{right:auto;top:auto;margin:auto}.fl-color-picker-presets-list .fl-color-picker-preset-remove{right:5px}.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:after,.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:before{background-color:#333}.fl-color-picker-added{position:absolute;width:100%;top:0;left:0;right:0;bottom:35px;z-index:10;color:#fff;text-align:center;background-color:rgba(0,0,0,.8)}.fl-color-picker-added-text{position:absolute;top:50%;left:50%;width:80%;font-size:14px;color:#fff!important;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.fl-color-picker-icon-check{position:relative;width:50px;height:50px;margin:5px auto}.fl-color-picker-icon-check:before{content:'';display:block;position:relative;width:15px;height:30px;margin-left:14px;border:7px solid #fff;border-left:none;border-top:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.fl-color-picker-icon-arrow-down,.fl-color-picker-icon-arrow-up{display:inline-block;position:relative;width:10px;height:10px;margin-left:5px}.fl-color-picker-icon-arrow-down:before,.fl-color-picker-icon-arrow-up:before{content:'';display:block;position:relative;width:6px;height:6px;border:2px solid #999;border-left:none;border-top:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.fl-color-picker-icon-arrow-up{top:2px;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fl-color-picker-icon-remove{width:15px;height:15px}.fl-color-picker-icon-remove:after,.fl-color-picker-icon-remove:before{content:'';display:block;position:relative;background-color:#6f7881}.fl-color-picker-icon-remove:before{left:6px;width:2px;height:10px;margin-top:3px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.fl-color-picker-icon-remove:after{left:6px;width:2px;height:10px;margin-top:-10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.fl-alpha-wrap{position:absolute;width:32px;height:215px;padding:0 5px;right:4px;border-top:none}.fl-alpha-slider{height:190px;position:absolute;top:12px;width:28px}.fl-alpha-slider .ui-slider-handle{background:rgba(0,0,0,0);border-color:#aaa;border-radius:4px;border-style:solid;border-width:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);cursor:ns-resize;height:12px;left:0;opacity:.9;position:absolute;right:0;width:30px;z-index:14}.fl-alpha-slider .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.fl-alpha-slider-offset{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAASCAYAAAAe/ZHXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQUQ0ODM4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQUQ0ODQ4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RBRDQ4MThFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RBRDQ4MjhFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/r/N8AAAWYSURBVHjarFvvR3VBEN45JZGIPkREHyIiIhJJf3qUSERE9CGiDxERkcg9z9u92uucvTszz5z7xnHPj93Z2d359cxscn5+jpTS+EoiMr3/+51cZ2dn4+e29i2/u7y8RKf/pO3vc+o+n5ycoNK31+f6+jrfZ37yuG2mf3R01H3fa5N/b29vU6dP5qft0G4PDg5MGuPr/v4+jz1t27mfvN/b21P75+fHx8eZfiV/Ozs7rUJnSu/5+RlFv+m6ZJpbW1s1PnrvXl9fZ/qX89zY2LB4mfy+v7/nsdV1XltbK/dr5vnz87OcV5bJabuVlRVLBifjfX9/l/xkGtM+S0tLNXnu0szfU/P3IMn/k0678h6ddqjQFGccVL6hoCsVfsq+NZ5QtCv5rfFS41sq37W+UPhMyhxEWTetvce3NR8oewqD39qalXuGAK/WPltjajIC4x2c9Ye1f43SGcqGwRBeTZjhMNntL4pCWZMQYhE05RVl02EovRgC4RkCbUNSQAGhGB/GsKG4h6FQoigDa2i8fRBy3uLMXYIG3Vr3aZvRaCRdBYlYIMZywhBGCVhgzzOlgRuUSOvC0GMEWxOM/+EtQFh1OIIXtfwg1tRaayGjg5px0jyZKEaTle3e+AsLCygVRAh3FlEgKbReE3oYGj9EgIR00QiEgKw3ZBQbRGjBeAMtDETQmHiKDsezJNLgCTFGItZXlAgCSiQggblP+9c8SDI0lXWlFv5g3K63KZ51FOcZzthQ3LomoNHwJmKIQISI3vqzSpwIQ8liSjGMFQjDpoVgaQ6cWgvLhOC7qiAwiHrWbEg4JMSmeUrBuHoYwioOQNXmhmAcrs096s1gJCGi3hSEVU8DQxYElYHhKwUUGAa+NqOBMsSSAQJuhQhCAH4vxozExsxiihPuaIrjCVYKWlYEsjSM52G8Kxxryngl5j0j+EyGTIiED4s1Itm0ZGWxMFCLJaBAcEI6OBkmFgNBoc8Cait2ZnENE/6wQN8LJSJeSMNAjKVm+LUMAIt3PR5AQgIGp1Z5zxhE8PtXUYReYeXi4mKmOPNXBMzt2tPT07LIUtJqr66uusXEbkFnWiQ6Pj72ikrtzc1NKopuvbbj58PDwxqNHp27u7tuYWumUDV+v7+/Xyu6pc59+/DwUCsC9ujt7u6qRbt8//T01C3elbyN70fb29uZ/1FSincvLy/lPGb42tzc9IqJeHt7q61Pr2C6vr7u7tfHx8fMPhV0sLq6WhZtU0n36+uru8elPE7aLi8v1wqJPXn++fmZKYgX8ozFxcXJb0NaQTHClZT8+gBjsYdaFc+zWcUkGTCWENY66ta92oSVzo3WI6IZKGtukeyfBLFKBNAj6bUOBgaoe9wE4n04IBNkLMoC7+Skj630ZlTJMYdyMsU2T8AwpzALkVFilZgJcT2l9PCWDDSAMBSjVlJgZNk0lE1AIby0qCiCnBQNj6aBGQslZIZJ5hB6D/AzQHto5Z9Nk8tARdN4q2ExBnsyIJ311EymShyjan2rKk0zh1Ay1oQVWAZQRnkUA8RFw7TahjBnmNgMVMQrsCGZJezRtGlU0cUZ1zuaxGZPpbhApM+ZpFQqQ6xadoMtBrEKpBVo4GRXvNSxpaRixKiR+TChCYhsDwZkfFj8IkErjAHejcUI0XQrgwehhNSMHAz21E0wZ23FcCAmj8Sd/PXy2xLYLAuwRw4IMsqjFaWYOpMEhDySAPFCWyFkgAHrEcA+BNeJ4UE8HCzJPpCrerUmQIx1pWJkjqxJD8EikUo2c5aI8ZYgsAkM4WQtnHd0ns0ORgVTBghy5ISy928SGsbTMqYg523RUY8oNYG4FIYiyRyZCnFCJC87IoRAIMVOqQ7BKexxCS2hYVl9JhvlpYjnAe4MhmRPMWhhvLfXINaI9WKM0Zu0+SfAAFLE1EgfVSv7AAAAAElFTkSuQmCC) center;box-shadow:0 0 5px rgba(0,0,0,.4) inset;-moz-box-shadow:0 0 5px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 5px rgba(0,0,0,.4) inset;width:200px;height:22px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg);bottom:48%;left:-80px;position:absolute}.fl-alpha-text{width:30px;font-size:12px;text-align:center;color:#999;position:absolute;bottom:-5px}.fl-lightbox-mask,.fl-lightbox-wrap{bottom:0;position:fixed;right:0;z-index:100010;left:0}@keyframes fl-lightbox-zoom{from{transform:scale(.4)}to{transform:scale(1)}}.fl-lightbox-wrap{display:none;overflow:auto;padding:0;top:43px;-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);pointer-events:none}.fl-builder-draggable-is-dragging .fl-lightbox-wrap,.fl-builder-resizable-is-resizing .fl-lightbox-wrap,.fl-lightbox,.fl-lightbox-mask{pointer-events:auto}.fl-lightbox-mask{background:#000;opacity:.7;filter:alpha(opacity=70);top:0}.fl-lightbox{background:#F5F7F9;border-radius:4px;box-shadow:rgba(0,0,0,1) 0 4px 30px;-moz-box-shadow:rgba(0,0,0,1) 0 4px 30px;-webkit-box-shadow:rgba(0,0,0,1) 0 4px 30px;position:relative;display:flex;z-index:100011;transform-origin:center;animation-name:fl-lightbox-zoom;animation-duration:.25s}.fl-lightbox.fl-lightbox-prevent-animation{animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-lightbox :not(i){color:#333;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;line-height:14px;text-decoration:none;text-transform:none}.fl-lightbox *,.fl-lightbox :after,.fl-lightbox :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}#fl-ui-root .fl-nanoscroller-pane,.fl-builder--content-library-panel .fl-nanoscroller-pane,.fl-lightbox .fl-nanoscroller-pane{bottom:2px;right:2px;width:6px}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#bac0ca;transition-property:height,background-color;transition-duration:.25s}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider:hover{background-color:#c8cdd4}.fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#029fd2}.fl-lightbox .dashicons{font-family:dashicons}.fl-lightbox-header h1,.fl-responsive-preview-message{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-lightbox.ui-draggable{box-shadow:rgba(0,0,0,.2) 0 7px 30px;-moz-box-shadow:rgba(0,0,0,.2) 0 7px 30px;-webkit-box-shadow:rgba(0,0,0,.2) 0 7px 30px}.fl-lightbox-resizable{height:500px;width:380px}@media (max-width:500px){.fl-lightbox-resizable{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-resizable .ui-resizable-handle{display:none!important}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:default!important}.fl-lightbox-controls{display:none}}.fl-lightbox-width-full{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-width-full .fl-lightbox-header{cursor:inherit!important}.fl-lightbox-controls{position:absolute;right:10px;top:10px;z-index:5}.fl-lightbox-controls .fa{color:#bdbdbd;font-size:14px;padding:5px}.fl-lightbox-controls .fa:hover{color:#aaa;cursor:pointer}.fl-lightbox-header-wrap{border-top-left-radius:4px;border-top-right-radius:4px}.fl-lightbox-header{position:relative}.fl-builder-settings-lightbox .fl-lightbox-header h1:before{content:none!important}.fl-lightbox-header h1{color:#333!important;font-size:16px!important;font-weight:400!important;margin:0!important;padding:14px 34px 15px 28px!important;text-align:left!important;display:flex;flex-direction:row;align-items:center;line-height:1;letter-spacing:0}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:move}.fl-lightbox-header h1 .fl-builder-badge{margin-left:10px;color:#fff;background-color:#F7A408}.fl-lightbox-content,.fl-lightbox-content-wrap{display:flex;flex-direction:column;flex:1 100%;max-width:100%}.fl-lightbox-footer{box-sizing:border-box;display:flex;flex-direction:row;justify-content:flex-end;flex:0 0;flex-basis:44px;padding:4px;text-align:right}.fl-lightbox-footer .fl-builder-button{height:36px;margin-left:5px!important;flex:0 0 0%;justify-content:center}.fl-lightbox-width-slim .fl-lightbox-footer{justify-content:stretch;padding:4px 5px}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button{flex:1 1 100%;display:block;text-align:center}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button:first-child{margin-left:0!important}.fl-lightbox table,.fl-lightbox td,.fl-lightbox th,.fl-lightbox tr{border:none}.fl-lightbox-wrap.fl-icon-selector{z-index:1000111}.fl-icon-selector .fl-lightbox{height:100%}.fl-icons-filter{height:auto!important;margin:0!important;position:absolute!important;right:0;top:0;padding:10px 16px;display:flex;flex-direction:row}.fl-icons-filter select{vertical-align:middle;width:195px;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;color:#000;border:2px solid #e4e7ea!important;border-right:none!important;margin:0;padding:2px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;flex:1 1 195px;border-radius:0}.fl-icons-filter input[type=text]{line-height:18px;vertical-align:middle;width:160px;flex:1 1 160px;border:2px solid #e4e7ea!important;border-radius:0!important;padding:2px 10px!important}.fl-icons-filter input[type=text]:focus,.fl-icons-filter select:focus{border:2px solid #00A0D2!important}.fl-icons-list{bottom:52px;left:0;overflow:auto;padding:20px;position:absolute;right:0;top:48px}.fl-icons-list::-webkit-scrollbar{background-color:#ccc;-webkit-appearance:none;width:10px}.fl-icons-list::-webkit-scrollbar-thumb{background-color:#666;border:1px solid #ccc}.fl-icons-section{text-align:center}.fl-icons-section h2{border-bottom:1px solid #dfdfdf;color:#333!important;font-family:Helvetica,Verdana,sans-serif!important;font-size:16px!important;font-weight:700!important;margin:0 0 20px!important;padding:0 0 10px!important;text-align:left}.fl-icons-list i{cursor:pointer;display:inline-block;font-size:40px;height:60px;line-height:60px;width:60px;background:0 0}.fl-icons-list .dashicons-before:before{font-size:40px;vertical-align:unset;width:40px}.fl-icons-list i:hover{background:#fff;box-shadow:0 10px 20px rgba(0,0,0,.15);border-radius:4px}.fl-icon-selector-footer{bottom:0;left:0;position:absolute;right:0}html{transition-property:margin;transition-duration:.35s}html.fl-builder-is-showing-toolbar{margin-top:calc(44px + 1px)!important}.fl-builder-edit body{position:static!important}.fl-builder-edit:after,.fl-builder-edit:before{z-index:0!important}.fl-builder-edit .fl-builder-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}#wpadminbar{transition-property:transform,opacity;transition-duration:.35s;transform-origin:bottom;transform-style:preserve-3d;transform:rotateX(89deg) translateY(46px);opacity:0;pointer-events:none;will-change:transform}html.fl-builder-show-admin-bar{margin-top:32px}html.fl-builder-show-admin-bar #wpadminbar{transform:rotateX(0) translateY(0);pointer-events:auto;opacity:1}@media screen and (max-width:782px){html.fl-builder-show-admin-bar{margin-top:46px}}.fl-clear{clear:both}.screen-reader-text{position:absolute;left:-1000em;top:-1000em;height:1px;width:1px;overflow:hidden}.fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(240,240,240,.8);bottom:0;display:none;left:0;position:fixed;right:0;text-align:center;top:0;z-index:12000000}.fl-builder-settings .fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(255,255,255,.8);display:block;position:absolute}.fl-field-loader{color:#B3B3B3!important;font-style:italic}.fl-builder-node-loading{opacity:.35!important}.fl-builder-node-loading-placeholder{background:url(../img/ajax-loader.svg) center center no-repeat;height:50px}.fl-col-group-has-child-loading{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.fl-col-group-has-child-loading>.fl-builder-node-loading-placeholder{width:50px}.fl-node-hidden{display:none}.fl-builder-edit .fl-node-hidden{display:block}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-mobile{display:block!important}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-mobile{display:flex!important}.fl-responsive-preview-enabled body{overflow:hidden!important}.fl-responsive-preview-mask{background:#F7F7F7;bottom:0;left:0;position:fixed;right:0;top:0;z-index:99999}.fl-responsive-preview{bottom:0;left:0;position:fixed;right:0;top:0;margin-top:50px;z-index:100000}.fl-builder-preview .fl-responsive-preview{margin:0!important}.fl-responsive-preview-content{background:#F5F7F9;padding:20px 20px 45px;overflow:scroll;position:absolute;top:45px;right:0;bottom:0;left:0}.fl-responsive-preview-content .fl-builder-content-editing{overflow:visible!important}.fl-responsive-preview-message{background:#F5F7F9;color:#b3b3b3;font-size:14px;font-weight:400;padding:15px;text-align:center;position:absolute;top:0;left:0;right:0;z-index:999999}.fl-responsive-preview-message span{display:inline-block;margin-right:8px}.fl-responsive-preview-message .size{position:absolute;right:30px;font-size:16px}.fl-responsive-preview-message .fl-builder-button{display:inline-block;margin-left:2px;padding:0 10px}.fl-responsive-preview-message .fl-builder-button i{font-size:14px;height:14px;width:14px}.fl-responsive-preview .fl-builder-content{box-shadow:0 0 8px rgba(0,0,0,.2);margin-left:auto;margin-right:auto;max-width:100%;overflow:visible;position:relative}#fl-builder-preview-frame,#fl-builder-preview-mask{bottom:0;height:100%;position:fixed;top:0;width:100%;right:0}.fl-responsive-preview .fl-block-col-resize{display:none}#fl-builder-preview-mask{background:url(../img/ajax-loader.svg) center center no-repeat #F7F7F7;left:0;z-index:999999}#fl-builder-preview-frame{left:50%;transform:translateX(-50%);-moz-transform:translateX(-50%);-webkit-transform:translateX(-50%);z-index:1000000}body button[class*=fl-builder],body button[class*=fl-builder]:focus,body button[class*=fl-builder]:hover{box-shadow:none;max-height:none;max-width:none;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;letter-spacing:normal}.fl-builder--tabs button,.fl-builder--tabs button:active,.fl-builder--tabs button:focus,.fl-builder--tabs button:hover,.fl-builder-button,a.fl-builder-button,button.fl-builder-button{letter-spacing:normal!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-builder-button,a.fl-builder-button,button.fl-builder-button{-webkit-appearance:none;align-items:center;background:#e7ebef;border:2px solid transparent;border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;color:#676F7A!important;cursor:pointer;display:flex;fill:#676F7A!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:33px;line-height:1!important;margin:0;padding:0 12px;text-align:center;transition-property:background-color,width;transition-duration:.2s;white-space:nowrap;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fl-builder--main-menu-panel,.fl-builder--search-results-panel,.fl-builder-bar,.fl-builder-panel{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none}.fl-builder-button:hover{background:#dadfe5;color:#222;border:2px solid transparent!important}.fl-builder-button:active{background:#DCDCDC}button.fl-builder-button:focus{position:static;top:auto;outline:0;background:#E4E7EA;border:2px solid #00A0D0!important}.fl-builder-button-primary,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button{background:#00A0D2;color:#fff!important;text-decoration:none;border:2px solid transparent!important}.fl-builder-button.fl-builder-button-primary:focus,body.fl-builder--layout-has-drafted-changes .fl-builder-button.fl-builder-done-button:focus{background:#00A0D2;border:2px solid #ffc217!important}.fl-builder-button-primary:hover,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:hover{background:#0197C6;color:#fff!important}.fl-builder-button-primary:active,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:active{background:#0484AC}.fl-builder-button-large{height:30px}.fl-builder-button-small{font-size:11px!important;line-height:1!important}.fl-builder-help-button{color:#b3b3b3;font-size:16px!important}.fl-builder-help-button i{position:relative;top:-1px}.fl-builder-help-button:hover{color:#666}.fl-builder-publish-button{line-height:45px!important}button.fl-builder-content-panel-button,button.fl-builder-content-panel-button:hover{fill:#00A0D2!important;font-size:30px!important;padding:2px 4px!important}.fl-builder-button-silent,.fl-builder-button-silent:hover{min-width:40px;padding:0 4px!important;background:0 0!important;border:2px solid transparent!important;box-shadow:none!important;display:inline-flex;flex-direction:row;justify-content:center}.fl-builder-done-button,.fl-builder-done-button:hover{font-weight:600}.fl-field .fl-builder-button{display:inline-block;height:auto;padding:11px 12px;vertical-align:middle;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-builder-button svg{max-width:none}.fl-builder-edit .media-modal-content button,.fl-builder-settings-fields button{letter-spacing:normal}.fl-builder-badge{background:#333;border-radius:2px;color:#fff!important;display:inline;font-size:11px!important;font-weight:400;letter-spacing:1px;margin-left:2px;padding:2px 4px;vertical-align:middle}.fl-builder-badge-global{background:#ff9600;transform:translateY(0);transition-duration:.25s;transition-property:transform}.fl-builder-blocks-node-template .fl-builder-badge-global{position:absolute;right:0;top:0}.fl-builder-block:hover .fl-builder-badge-global{display:none}.fl-builder-bar{left:0;position:fixed;right:0;top:0;z-index:999999;-khtml-user-select:none;-ms-user-select:none;user-select:none;transition-property:transform opacity;transition-duration:.35s;transform-style:preserve-3d;-webkit-perspective:1100px;-moz-perspective:1100px;perspective:1100px}.fl-builder-bar.is-hidden{pointer-events:none}.fl-builder-bar.is-hidden .fl-builder-bar-content{transform:translateY(-100%) rotateX(90deg)}.fl-builder--category-select.is-showing .fl-builder-bar-title-caret i,.fl-builder-bar-title.is-showing-menu .fl-builder-bar-title-caret>svg,.fl-builder-blocks-pro-expand-rotate svg{transform:rotate(180deg)}body .fl-builder-bar .fl-builder-bar-content{display:flex;box-sizing:border-box;background:#fff;border-bottom:1px solid #eceef1;color:#999;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;font-size:14px!important;height:calc(44px + 1px);transition-property:background-color,opacity,transform;transition-duration:.35s;pointer-events:auto}.fl-builder--selector-menu:before,.fl-builder-draggable-is-dragging .fl-builder-content,.fl-builder-draggable-is-dragging .fl-builder-panel .fl-lightbox,.fl-builder-resizable-is-resizing .fl-builder-content,.fl-builder-resizable-is-resizing .fl-builder-panel .fl-lightbox,body .fl-builder-bar .fl-builder-bar-content.is-muted{pointer-events:none}body .fl-builder-bar .fl-builder-bar-content.is-muted>:not(.fl-builder-publish-actions){-webkit-filter:saturate(20%) blur(1px);filter:saturate(20%) blur(1px);opacity:.4}.fl-builder-bar-title{box-sizing:border-box;color:#333;display:flex;flex:0 0 380px;max-width:380px;border-right:1px solid #eceef1;cursor:pointer}.fl-builder-bar-title:hover{background:#fff}.fl-builder-simple .fl-builder-bar-title{cursor:auto}.fl-builder-simple .fl-builder-bar-title:hover{cursor:auto;background:0 0}.fl-builder-bar-title span{vertical-align:middle}.fl-builder-bar-title-icon{box-sizing:border-box;background:0 0;flex:0 0 46px;display:flex;align-items:center;padding:4px}.fl-builder-bar-title-icon img{max-width:100%!important;height:auto!important}.fl-builder-bar-title.fl-builder-bar-title-no-icon{padding-left:12px}.fl-builder-bar-title-area{box-sizing:border-box;flex:1 1 100%;display:flex;flex-direction:column;overflow:hidden;padding:4px}.fl-builder-layout-title,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{font-size:16px;font-weight:400;line-height:1.3;color:#161B20;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret,.fl-builder-layout-pretitle,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{font-size:12px;font-weight:500;line-height:1.3;color:#656d77;text-align:left;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret i,.fl-theme-builder-preview-select-title i{color:inherit!important;font-size:14px}.fl-builder-bar-title-caret{margin-left:auto!important;flex:0 0 46px}.fl-theme-builder-preview-select-title i{padding:12px}.fl-theme-builder-preview-select-title i:before{content:"\f078"}.fl-theme-builder-preview-select.fl-builder-button{position:relative;border-radius:0;background:0 0;min-width:0;display:flex;flex:0 0 360px;max-width:360px;margin:0!important;padding:4px 10px;border:none!important;border-right:2px solid #d5dadd!important;box-shadow:none}.fl-theme-builder-preview-select.fl-builder-button:hover{border:none!important;border-right:2px solid #d5dadd!important}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{display:flex;flex:1;justify-content:flex-end;flex-direction:row-reverse}.fl-theme-builder-preview-select-title div{flex:1}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{display:block}.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items{position:absolute;top:calc(48px + 10px);left:10px;width:calc(100% - 20px)!important;background:#fff;border-radius:4px;border:2px solid #D5DADD;border-top:3px solid #00a0d2;box-shadow:0 15px 45px 8px rgba(0,0,0,.04);margin:0!important;padding:0;z-index:-1;font-size:16px;overflow-y:scroll;height:auto!important;max-height:calc(100vh - 66px);min-height:300px;display:flex!important;flex-direction:column}.fl-theme-builder-preview-select-item{padding:4px 0!important;border-bottom:none!important;display:flex;flex-direction:column;text-align:initial}.fl-theme-builder-preview-select-item:hover{text-decoration:none;color:#111;background:0 0!important}body .fl-theme-builder-preview-select .fa-caret-down{float:none}body .fl-theme-builder-preview-select-item-title{padding:10px 15px;color:#222;font-size:14px}body .fl-theme-builder-preview-select .fa-caret-down i:before,body .fl-theme-builder-preview-select-item-title i:before{content:"\f078"}body .fl-theme-builder-preview-select-item-children{overflow:auto}body .fl-theme-builder-preview-select-item-child{overflow:hidden;text-overflow:ellipsis;line-height:1.1;margin:0 10px;border:2px solid transparent;border-radius:4px;padding:8px 10px 10px;font-size:14px;font-weight:400;color:#222}body .fl-theme-builder-preview-select-item-child:hover{background:#e6eaed!important}.fl-theme-builder-preview-select-item .fa-caret-down{color:#606D77}.fl-builder-bar-actions{display:flex;flex-direction:row-reverse;flex:1 1 100%;padding:4px}.fl-builder-bar .fl-builder-button{height:auto;margin:0 0 0 4px}.fl-builder-bar-actions .fl-builder-button:last-child{margin:0}.fl-builder-bar-actions:after{clear:both}.fl-builder-bar .fl-builder-content-panel-button{align-items:baseline!important;font-weight:400}.fl-builder--saving-indicator{flex:0 1 auto;cursor:pointer;display:flex;align-self:center;padding:0 10px;font-size:12px;font-style:italic;color:#676f7a;align-items:center;line-height:1.2;justify-content:flex-end}.fl-builder--saving-indicator:hover{color:#676f7a}.fl-builder--saving-indicator .fa-question-circle{font-size:13px;margin:3px 0 3px 5px}.fl-builder-button.fl-builder-buy-button,.fl-builder-button.fl-builder-feedback-button,.fl-builder-button.fl-builder-upgrade-button{background:#F7A407;color:#fff!important;text-decoration:none}.fl-builder-buy-button i.fa-external-link-alt,.fl-builder-feedback-button i.fa-external-link-alt,.fl-builder-upgrade-button i.fa-external-link-alt{color:#FFC733;margin:0 0 0 6px}.fl-builder-buy-button:focus,.fl-builder-buy-button:hover,.fl-builder-feedback-button:focus,.fl-builder-feedback-button:hover,.fl-builder-upgrade-button:focus,.fl-builder-upgrade-button:hover{background:#EE8E0D!important;color:#fff!important}@media (max-width:980px){.fl-builder--main-menu-panel{width:calc(100% - 20px)!important}.fl-builder--main-menu-panel:before{right:auto;left:20px}.fl-builder-bar-title,.fl-theme-builder-preview-select{flex:1 .5 380px!important}}@media (max-width:620px){.fl-theme-builder-preview-select.fl-builder-button{display:none}}@media (max-width:500px){#fl-builder-toggle-notifications,.fl-builder--main-menu-panel:before,.fl-builder--panel-arrow,.fl-builder-bar-title-area,.fl-builder-panel-drag-handle,.fl-builder-panel:before{display:none}.fl-builder--main-menu-panel,.fl-builder-panel{width:auto!important;top:44px!important;left:0!important;right:0!important;bottom:0!important;border-radius:0!important;box-shadow:none!important}.fl-builder--main-menu-panel{border-left:transparent!important;border-right:transparent!important;border-bottom:transparent!important;max-height:calc(100% - 44px)!important}.fl-builder-bar-title{flex:0 0 80px!important}.fl-builder-bar-title-caret{padding-left:0;padding-right:0;max-width:24px}.fl-builder-bar-actions{max-width:calc(100% - 80px);overflow:hidden}.fl-builder--panel-header{border-radius:0!important;cursor:default!important}.fl-builder--panel-header .fl-builder--tabs{cursor:default!important}.fl-builder-publish-actions{width:100%!important;padding-left:4px!important}.fl-builder-bar-actions .fl-builder-button{padding:0 8px!important}}.fl-notifications-panel .fl-builder-ui-post .wp-block-image,.fl-notifications-panel .fl-builder-ui-post .wp-block-image figure{margin-top:10px!important;margin-bottom:10px!important}.fl-builder--preview-actions{display:none;position:fixed;top:4px;left:4px;z-index:10000001;padding:4px;justify-content:center;background:#fff;border-radius:4px}.fl-builder-preview .fl-builder--preview-actions{display:flex}.fl-builder--preview-actions .device-icons{color:#555;background:#e4e4e4;border:none!important;align-items:center;display:flex;text-decoration:none;font-size:14px!important;line-height:1!important;margin:0 4px 0 0;padding:0 6px;cursor:pointer;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px}.fl-builder--preview-actions .device-icons i{margin:0 6px}.fl-builder--preview-actions .size{position:absolute;left:5px;top:40px;font-size:16px}@keyframes fl-builder-ui-pin-zone-pulse{0%,100%{opacity:1;filter:alpha( opacity=1 )}50%{opacity:.5;filter:alpha( opacity=35 )}}.fl-builder-ui-pin-zone{animation:fl-builder-ui-pin-zone-pulse 2s infinite;transition:width .3s ease;background:rgba(0,160,210,.5);bottom:0;top:0;position:fixed;width:35px;z-index:100001}.fl-builder-ui-show-pin-zone-left .fl-builder-ui-pin-zone-left,.fl-builder-ui-show-pin-zone-right .fl-builder-ui-pin-zone-right{width:75px}.fl-builder-ui-pin-zone-left{left:0}.fl-builder-ui-pin-zone-right{right:0}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button{display:flex!important;background:rgba(0,160,210,.5)!important;padding:2px 4px;width:80px;animation:fl-builder-ui-pin-zone-pulse 2s infinite}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button svg{display:none}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button{width:120px}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button svg{display:none!important;width:100%;transform:none!important;fill:#00A0D2!important;border-radius:3px}.fl-builder-content-panel-pin-zone .fl-builder-done-button{filter:grayscale(100%)}.fl-builder-ui-is-pinned .fl-builder-content-panel-button{display:none}.fl-builder-panel.fl-builder-ui-pinned{top:45px!important;bottom:0!important;height:auto!important;border-radius:0;border:none;box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s;z-index:11}.fl-builder-panel.fl-builder-ui-pinned-right{left:auto!important;right:0;border-left:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned-left{left:0;right:auto;border-right:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-radius:0!important}.fl-builder-ui-pinned-container .fl-lightbox-wrap{position:absolute;z-index:11}.fl-builder-ui-pinned-container .fl-lightbox{position:absolute;top:0;bottom:0;left:0;right:0;width:auto!important;height:auto;border-radius:0;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-builder-ui-pinned-container .fl-lightbox-header-wrap{border-radius:0}.fl-builder-ui-pinned-container .fl-lightbox.ui-draggable .fl-lightbox-header{cursor:auto}.fl-builder-ui-pinned-container .fl-lightbox-header h1{padding:12px 20px 10px!important}.fl-builder-ui-pinned-container .fl-lightbox-controls{display:none}.fl-builder-ui-pinned-content-transform{transform:scale(1);transform-origin:center top 0}.fl-builder-ui-pinned-collapse{cursor:pointer;display:none;position:absolute!important;bottom:2px;padding:5px;border:2px solid transparent;background:0 0!important;width:36px;height:36px;border-radius:4px;fill:#778794;flex-direction:row;justify-content:center}.fl-builder-ui-pinned-collapse:focus,.fl-builder-ui-pinned-collapse:hover{top:auto!important;background:0 0;border:2px solid transparent;outline:0;fill:#00A0D2}.fl-builder-ui-pinned-collapse:focus{background:#E4E7EA}.fl-builder-ui-pinned-collapse>*{margin:auto;line-height:1}.fl-builder-ui-pinned-collapse svg g{fill:inherit}.fl-builder-ui-is-pinned-right .fl-builder-ui-pinned-right-collapse{display:flex;left:-40px}.fl-builder-ui-is-pinned-left .fl-builder-ui-pinned-left-collapse{display:flex;right:-40px}.fl-builder-ui-pinned-collapse i[data-toggle=show],.fl-builder-ui-pinned-is-collapsed i[data-toggle=hide]{display:none}.fl-builder-ui-pinned-is-collapsed i[data-toggle=show]{display:block}.fl-builder--panel-no-settings,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-content,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-controls,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--tab-wrap,.fl-builder-ui-pinned-is-collapsed .fl-builder--panel-header{display:none}.fl-builder-ui-is-pinned-left [data-toggle=hide],.fl-builder-ui-is-pinned-right [data-toggle=show]{transform:rotateY(180deg)}.fl-builder-ui-pinned-is-collapsed .fl-lightbox{box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-header{background:0 0;border:none;z-index:10}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-wrap{top:0}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-header h1{padding:14px 28px 15px!important}.fl-builder-simple-pinned .fl-builder--panel-no-settings{display:flex;align-items:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0}.fl-builder-content-panel-button svg{transition-property:transform;transition-duration:.25s;transform:rotate(0) scale(1);transform-origin:center}.fl-builder-content-panel-is-showing .fl-builder-content-panel-button svg{transform:rotate(135deg) scale(1.1) translate(.5px,-.5px)}.fl-builder--content-library-panel .fl-builder--panel-arrow svg{vertical-align:inherit}@keyframes fl-builder-show-panel{from{transform:scale(.8)}to{transform:scale(1)}}.fl-builder--search-results-panel,.fl-builder-panel{box-sizing:border-box;position:fixed!important;right:20px;top:calc(43px + 10px);width:380px;bottom:20px;background:#F5F7F9;color:#676F7A;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;border-radius:4px;box-shadow:0 8px 40px 4px rgba(0,0,0,.3);z-index:10000007;will-change:transform;-khtml-user-select:none;-ms-user-select:none;user-select:none}.fl-builder-panel{transform-origin:top right;animation-name:fl-builder-show-panel;animation-duration:.15s;animation-fill-mode:both;flex:1;display:none}.fl-builder--search-results-panel{display:none;position:absolute;right:0;top:93px;left:0;bottom:0;width:auto!important;border:none;border-radius:0;box-shadow:none;min-height:100px;max-height:calc(100vh - 54px);overflow:auto;z-index:1}.fl-builder-content-panel-is-showing .fl-builder-panel,.fl-builder-search-results-panel-is-showing .fl-builder--search-results-panel{display:flex;flex-direction:column}.fl-builder-panel .fl-lightbox .fl-builder-panel-drag-handle,.fl-builder-ui-is-pinned .fl-builder--panel-arrow,.fl-lightbox-width-full .fl-builder-panel-drag-handle,body.fl-builder-draggable-is-dragging .fl-builder--panel-arrow{display:none}.fl-builder--search-results-panel .fl-builder--no-results{text-align:center;padding:50px 20px}.fl-builder--panel-arrow{position:absolute;top:-13px;right:10px}.fl-builder--panel-arrow polygon{fill:#00a0d2}.fl-builder--panel-header{border-top:3px solid #00a0d2;border-top-right-radius:4px;border-top-left-radius:4px}.fl-builder-ui-is-pinned .fl-builder--panel-header{border-top:none}.fl-builder-panel-drag-handle{position:absolute;top:7px;left:10px;fill:#ccd4da;width:6px}.fl-builder-ui-is-pinned-left .fl-builder-panel-drag-handle{left:auto;right:10px}.fl-builder--panel-header .fl-builder--panel-controls{display:flex;flex-direction:row;position:relative}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-content-group-select{flex:1 1}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-panel-search{flex:0 0;padding:0 10px 6px 0;margin-left:-4px}.fl-builder--panel-controls .fl-builder-panel-search button{display:flex;flex-direction:row;align-items:center;justify-content:center;width:30px;background:0 0!important;border:2px solid transparent!important;font-size:inherit;height:36px;margin:0;padding:0}.fl-builder--panel-controls .fl-builder-panel-search button:active,.fl-builder--panel-controls .fl-builder-panel-search button:focus{top:0;outline:0}.fl-builder-panel-search button svg{height:auto;width:20px}.fl-builder-panel-search button.fl-builder-dismiss-panel-search svg{width:16px}.fl-builder-panel-search button svg .filled-shape{fill:#000}.fl-builder--panel-controls .fl-builder-panel-search button:active svg .filled-shape,.fl-builder--panel-controls .fl-builder-panel-search button:focus svg .filled-shape{fill:#00A0D2}.fl-builder-panel-search .fl-builder-panel-search-input{display:none;position:absolute;top:0;left:0;right:0;bottom:0;background:#f5f7f9}.fl-builder-panel-search.is-showing-input .fl-builder-panel-search-input{display:flex;flex-direction:row;padding:0 10px 6px}.fl-builder-panel-search-input input{flex:1 1 100%;border:2px solid #e6eaed;background:#fff;border-radius:4px;margin:0 4px 0 0;padding:10px;color:#333}.fl-builder-panel-search-input input:focus{border-color:#0197C6;outline:0}.fl-builder-panel-content-wrap{bottom:0;height:auto;left:0;overflow:hidden;position:absolute;right:0;top:43px}.fl-builder-panel-content{padding-bottom:60px}.fl-builder--panel-view .fl-builder-blocks-section:first-child{border-top:none}.fl-builder-blocks-group:first-child{padding:20px 0 0}.fl-builder-blocks-group .fl-builder-blocks-section-group-name{display:block;padding:0 30px 15px;color:#000;font-size:20px;font-weight:600;line-height:1.4}.fl-builder-blocks-section .fl-builder-block{display:block;line-height:1.1;padding:15px 20px}.fl-builder--template-collection-section-header,.fl-builder-blocks-section .fl-builder-blocks-section-header{line-height:1.2;color:#333;margin:0!important;user-select:none;background-color:#e7ebef;border-top:4px solid #e7ebef;height:30px;display:flex;flex-direction:row}.fl-builder-blocks-section .fl-builder-blocks-section-title{background:#F5F7F9;color:#353535;padding:2px 16px;display:flex;align-items:center}.fl-builder-blocks-section .fl-builder-blocks-section-title i{color:#bfbfbf;float:right}.fl-builder-blocks-section-content{overflow:auto;padding:10px 10px 20px}.fl-builder-blocks-section-content:before{content:none}.fl-builder-blocks-section-content:after{float:none;clear:both}.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:flex;flex-wrap:wrap}@supports (display:grid){.fl-builder--template-collection-section-content,.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr))}.fl-builder--template-collection-section-content>*,.fl-builder-blocks-section-content.fl-builder-modules>*,.fl-builder-blocks-section-content.fl-builder-rows>*,.fl-builder-blocks-section-content.fl-builder-widgets>*{width:auto!important}}.fl-builder-blocks-section-content .fl-builder-block-module,.fl-builder-blocks-section-content .fl-builder-block-row{flex:1 1 50%;width:50%;box-sizing:border-box}.fl-builder--search-results-panel .fl-builder-blocks-section-content .fl-builder-block-module{flex:1 1 100%;width:100%}.fl-builder-blocks-section.fl-active .fl-builder-blocks-section-content{display:block}.fl-builder-blocks-section-content .fl-builder-block{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:13px;line-height:1.1;font-weight:400;color:#38404a}.fl-builder-block{position:relative;height:47px}.fl-builder-block-disabled,.fl-builder-block-disabled .fl-builder-block-content{cursor:pointer!important}.fl-builder-block.fl-builder-block-col-group{height:84px}.fl-builder-block.fl-builder-block-has-thumbnail{height:auto!important;padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover{padding:0!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-content{position:relative!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover .fl-builder-block-content{padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-details{margin:0 10px 4px!important}.fl-builder-block:hover{overflow:visible;z-index:1}.fl-builder-block:hover .fl-builder-block-content{display:block;box-sizing:border-box;position:absolute;top:0;left:0;width:100%;padding:15px 20px;border-radius:4px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);text-decoration:none;color:#111;cursor:move;overflow:hidden}.fl-builder-block-module:hover .fl-builder-block-content{width:auto;min-width:100%}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual{display:block;margin-bottom:7px}.fl-builder-block-drag-helper .fl-builder-block-content .fl-builder-block-visual{display:none!important}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual.fl-cols-visual{display:flex;flex-direction:row;height:30px}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{flex:1 100%;background:#464a4c;height:30px;margin:0 2px;border-radius:2px}.fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#000}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:first-child{margin-left:0!important}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:last-child{margin-right:0!important}.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:last-child,.fl-cols-visual.left-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.right-sidebar .fl-cols-visual-col:last-child{flex-basis:60px}.fl-builder-block-saved-column.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-column:hover .fl-builder-block-title,.fl-builder-block-saved-module.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-module:hover .fl-builder-block-title,.fl-builder-block-saved-row.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-row:hover .fl-builder-block-title,.fl-builder-touch .fl-builder-block-saved-column .fl-builder-block-title,.fl-builder-touch .fl-builder-block-saved-module .fl-builder-block-title,.fl-builder-touch .fl-builder-block-saved-row .fl-builder-block-title{margin-right:70px}.fl-builder-block-module:nth-child(even):hover .fl-builder-block-content{left:auto;right:0}.fl-builder-block-thumbnail{border-radius:4px;background-size:contain;background-repeat:no-repeat;background-position:center;background-color:rgba(0,0,0,.06);margin-bottom:10px;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s}.fl-builder-block:hover .fl-builder-block-thumbnail{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder-block .fl-builder-block-icon{margin-right:7px;fill:#000;display:inline-block;width:20px;height:20px;vertical-align:middle}.fl-builder-block-thumbnail:before{content:"";display:block;padding-top:50%}.fl-builder-block-thumbnail img{max-width:100%;max-height:160px;margin:0;object-fit:cover}.fl-builder-blocks-section-content .fl-builder-block{box-shadow:0 0 0 transparent;transition-property:box-shadow;transition-duration:.15s}.fl-builder-blocks-section-content .fl-builder-block i,.fl-user-template-actions i{color:#000;margin-right:10px}.fl-builder-blocks-section-content .fl-builder-block .fl-builder-block-details{position:relative}.fl-builder-blocks-separator{background:#f1f1f1;height:6px}.fl-builder-block:hover .fl-builder-badge{background:#2ea2cc}.ui-sortable-helper .fl-builder-badge{display:none!important}#fl-builder-blocks-pro{border-bottom:4px solid #e7ebef;position:relative}#fl-builder-blocks-pro.fl-builder-blocks-section .fl-builder-block{cursor:pointer!important;padding-right:50px}#fl-builder-blocks-pro .fl-builder-block:hover .fl-builder-block-content{cursor:pointer!important;padding-right:60px}.fl-builder-blocks-pro-closed{height:240px;overflow:hidden}.fl-builder-blocks-pro-overlay{background:linear-gradient(to top,rgba(245,247,249,1) 0,rgba(255,255,255,0) 100%);position:absolute;top:0;right:0;bottom:0;left:0}.fl-builder-blocks-pro-open .fl-builder-blocks-pro-overlay{display:none}.fl-builder-blocks-pro-expand.fl-builder-button{display:inline-block!important;font-size:12px!important;margin-bottom:10px!important;opacity:.4;width:100%!important}.fl-builder-blocks-pro-expand:hover{opacity:1}.fl-builder--panel-cta{margin:0 20px 20px!important;padding:10px 30px 30px;font-size:16px;text-align:center}.fl-builder--panel-cta a{color:inherit;text-decoration:none}.fl-builder--panel-cta a:hover{text-decoration:none}.fl-builder--panel-cta img{display:block;max-width:70px;margin:0 auto 20px;position:relative;right:8px}.fl-builder--panel-cta button{display:inline;margin-top:25px}.fl-builder--panel-message{text-align:center;padding:40px 20px;font-size:16px}.fl-builder--panel-message .fl-builder-button{display:inline-block;padding:10px}.fl-builder-pro-badge{background:rgba(0,0,0,.4);color:#fff;font-size:10px;font-weight:700;padding:2px 4px}.fl-builder--menu-item .fl-builder-pro-badge{margin-left:10px}.fl-builder-block-module .fl-builder-pro-badge{padding:2px;position:absolute;right:20px}.fl-builder-block-module:hover .fl-builder-pro-badge{background:#F7A407}.fl-builder--template-thumbnail .fl-builder-pro-badge{background:#F7A407;position:absolute;right:8px;top:8px;z-index:1}.fl-builder-block-row-template .fl-builder-pro-badge{position:absolute;top:auto;bottom:10px;right:10px}.fl-builder-lite .fl-builder--menu-item[data-event=saveTemplate],.fl-builder-lite .fl-builder--menu-item[data-event=launchThemerLayouts]{opacity:.5}.fl-builder-pro-lightbox .fl-lightbox{max-width:450px;padding:30px;text-align:center}.fl-builder-pro-lightbox .dashicons-no{cursor:pointer;position:absolute;right:10px;top:14px;font-size:20px;opacity:.3}.fl-builder-pro-lightbox .dashicons-no:hover{opacity:1}.fl-pro-message-badge{margin-bottom:15px}.fl-pro-message-badge span{background:rgba(0,0,0,.3);color:#fff;font-size:10px!important;font-weight:700;padding:2px 4px}.fl-pro-message-title{font-size:20px!important;font-weight:700;margin-bottom:20px}.fl-pro-message-content{font-size:16px!important;line-height:24px!important;margin-bottom:20px}.fl-pro-message-button button{display:inline}.fl-builder-block-template-image{margin:5px 0 10px;max-width:100%;border:1px solid #dfdfdf}.fl-builder-block .fl-builder-block-title{overflow:hidden;text-overflow:ellipsis;vertical-align:middle;line-height:1.3}.ui-sortable-helper .fl-builder-block-template-image{display:none!important}@keyframes fl-builder-template-item-enter{from{transform:translateY(100px) scale(.3);opacity:0}to{transform:scale(1);opacity:1}}.fl-builder--template-collection{clear:both;padding:10px 0}.fl-builder--template-collection-section-content{padding:0 10px}.fl-builder--template-collection-item{box-sizing:border-box;width:50%;float:left;padding:10px;cursor:pointer;font-size:13px;transform-origin:center;opacity:1;position:relative}.fl-builder--template-thumbnail{background-size:cover;background-clip:content-box;background-position:center top;background-color:#fff;border:2px solid transparent;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s;position:relative}.fl-builder--template-collection-item[data-id="0"] .fl-builder--template-thumbnail,.fl-user-template .fl-builder--template-thumbnail{border-color:#e4e7ea}.fl-builder--template-thumbnail:before{display:block;content:"";padding-top:120%}.fl-builder--template-thumbnail:hover{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder--template-name{text-align:center;padding:4px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fl-builder--template-collection-section{padding-bottom:10px;border-bottom:1px solid #dfdfdf}.fl-builder--template-collection-section:last-child{border-bottom:none}.fl-builder--template-collection-section:after,.fl-builder--template-collection-section:before{content:"";display:block;clear:both}.fl-builder--template-collection-section-name{padding:15px 10px 10px}span.fl-builder-block-no-node-templates{display:block;padding:15px 20px;text-align:center}span.fl-builder-block-no-node-templates:hover{cursor:default}.fl-builder-blocks-node-template .fl-builder-block{position:relative}.fl-builder-blocks-section-content .fl-builder-node-template-actions{bottom:0;cursor:default;display:none;position:absolute;right:0;top:0}.fl-builder-blocks-section-content .fl-builder-node-template-actions a:hover{text-decoration:none}.fl-builder-blocks-section-content .fl-builder-node-template-delete,.fl-builder-blocks-section-content .fl-builder-node-template-edit{display:inline;cursor:pointer;margin:0;padding:15px 10px;text-align:center;width:30px}.fl-builder-block-details .fl-builder-node-template-delete,.fl-builder-block-details .fl-builder-node-template-edit{padding-top:0!important}.fl-builder-blocks-section-content .fl-builder-node-template-delete i,.fl-builder-blocks-section-content .fl-builder-node-template-edit i{color:#676F7A;margin:0}.fl-builder-blocks-section-content .fl-builder-node-template-delete:hover i,.fl-builder-blocks-section-content .fl-builder-node-template-edit:hover i{color:#444}.fl-builder-blocks-node-template .fl-builder-block:hover .fl-builder-node-template-actions,.fl-builder-touch .fl-builder-blocks-section-content .fl-builder-node-template-actions{display:block}.ui-sortable-helper .fl-builder-node-template-delete,.ui-sortable-helper .fl-builder-node-template-edit{display:none!important}.fl-builder--tabs{display:flex;flex-direction:row;position:relative;justify-content:flex-start;align-items:center}.fl-builder-panel .fl-builder--panel-header{cursor:move}.fl-builder-panel .fl-builder--tabs{justify-content:space-around;padding:4px 24px;cursor:pointer}.fl-builder--tab-wrap{flex:1 1 100%;display:flex;flex-direction:row;align-items:stretch;justify-content:space-between;margin:auto;max-width:400px}.fl-builder--tabs button,.fl-builder--tabs button:active,.fl-builder--tabs button:focus,.fl-builder--tabs button:hover{flex:1 1 100%;display:inline-block;text-decoration:none;text-transform:none;color:inherit;text-align:center;margin:0;padding:5px;cursor:pointer;font-size:13px!important;font-weight:500!important;line-height:1.3!important;background:0 0!important;outline:0!important;border:2px solid transparent;border-radius:4px;min-height:36px;top:0;transition-property:background,color;transition-duration:.25s}.fl-builder--tabs button:focus{background:#e6eaed!important}.fl-builder--selector-display,.fl-builder-content-group-select select{background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important}.fl-builder--tabs button.is-showing{color:#0086b0}.fl-builder--panel-content{flex:1}.fl-builder--panel-view{display:none;overflow:hidden}.fl-builder--panel-view.is-showing{display:block}.fl-builder--content-library-panel.ui-draggable-dragging{height:500px!important}.fl-builder--content-library-panel .fl-builder-drop-zone{display:none!important}.fl-builder--panel-header .fl-builder--tabs{cursor:move}.fl-builder--category-select{display:flex;flex-direction:column;position:relative}.fl-builder--selector-display{display:flex;flex-direction:row;position:relative;justify-content:space-between;color:#161B20;cursor:pointer;font-size:13px;font-weight:700;line-height:16px;border-radius:4px;align-items:stretch}.fl-builder--selector-display-label{display:flex;flex-direction:row;align-items:stretch;font-size:inherit;line-height:inherit;width:100%;margin:0!important;padding:0!important;color:#6D6D6D;background:0 0!important;border:2px solid transparent;box-shadow:0 1px 2px 0 rgba(0,0,0,.12)!important;border-radius:4px;font-family:inherit;text-transform:none}.fl-builder--selector-display-label:hover{top:0;color:inherit;background:0 0!important;border:2px solid transparent;border-radius:4px}.fl-builder--selector-display-label:active{top:0;color:inherit;background:0 0;border:2px solid #e4e7ea;border-radius:4px}.fl-builder--selector-display-label:focus{top:0;color:inherit;background:0 0;border:2px solid #00A0D2;outline:0}.fl-builder--group-label{color:inherit;flex:0 0 auto;padding:4px 12px 4px 10px;background:#e7ebef;border-radius:3px;display:flex;flex-direction:row;align-items:center}.fl-builder--current-view-name{flex:1 1 100%;color:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;padding:8px 10px;text-align:left}.fl-builder--selector-menu{display:none;color:#293138;position:absolute;top:46px;left:0;width:100%;background:#fff;border-radius:4px;box-shadow:0 0 20px 2px rgba(0,0,0,.2);overflow:visible;z-index:2}.fl-builder--selector-menu:before{bottom:100%;right:8px;content:" ";height:0;width:0;position:absolute;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}.fl-builder--category-select.is-showing .fl-builder--selector-menu{display:flex;max-height:calc(100vh - 150px)}.fl-builder--category-select.is-showing .fl-builder--selector-menu .fl-builder--menu{margin:10px 0;flex:1 100%;overflow:auto}button.fl-builder-button.fl-builder-bar-title-caret{margin:4px;padding:0 12px!important}button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#e6eaed!important;border-color:transparent!important}.fl-builder--menu{margin-bottom:2px}.fl-builder--menu>a,.fl-builder--menu>button,.fl-builder--menu>span{display:block;padding:8px 10px 10px;border-radius:4px;color:inherit;text-decoration:none;background:0 0!important;border:2px solid transparent!important;font-weight:400;font-family:inherit}.fl-builder--menu>a:active,.fl-builder--menu>a:focus,.fl-builder--menu>a:hover,.fl-builder--menu>button:active,.fl-builder--menu>button:focus,.fl-builder--menu>button:hover{background:#e6eaed!important;border:2px solid transparent!important;top:0}.fl-builder--menu>a:focus,.fl-builder--menu>button:focus{outline:0;color:inherit;text-decoration:none}.fl-builder--menu .fl-has-children>svg{float:right;margin:0 7px 0 0;height:16px;width:9px;transition-property:transform;transition-duration:.15s;transform:rotate(-90deg)}.fl-builder--menu .fl-has-children.fl-has-children-showing>svg{transform:rotate(0)}.fl-builder--menu .fl-inset{display:none;padding-left:35px;font-size:14px;line-height:1.25}.fl-builder--menu a.fl-template-collection{color:#161B20}.fl-builder--menu>:after{clear:both}.fl-builder--menu * .fl-builder--menu-item-accessory{float:right;color:#000;text-transform:uppercase;text-align:center;min-width:20px;letter-spacing:2px}.fl-builder--menu * .fl-builder--menu-item-accessory i{font-size:1em;margin-top:2px}.fl-builder--menu hr::after,.fl-builder--menu hr::before{display:none!important;content:none!important;height:auto}.fl-builder--menu .fl-builder-video-wrap iframe{display:block;margin:4px 0;width:100%}.fl-builder-publish-actions{display:flex;box-sizing:border-box;position:absolute;top:0;right:0;width:380px;max-width:100%;height:44px;padding:4px 4px 4px 0;flex-direction:row;justify-content:flex-end;opacity:1;pointer-events:auto;transform:scaleX(1) translateX(0);transform-origin:right;transition-property:transform,opacity;transition-duration:.15s}.fl-builder-publish-actions.is-hidden{transform:scaleX(.23) translateX(68px);opacity:0;pointer-events:none}.fl-builder-bar .fl-builder-button-group{display:flex;flex-basis:100%}.fl-builder-bar .fl-builder-button-group>.fl-builder-button{border-radius:0;margin-left:0;flex:1 0 auto;text-align:center;justify-content:space-around;box-shadow:none}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-builder-publish-actions-click-away-mask{display:none;position:fixed;top:0;left:0;right:0;height:100vh;background:0 0}.fl-builder-drop-zone,.fl-builder-empty,.fl-col-has-highlight-guide .fl-col-content,.fl-col-highlight,.fl-row-highlight .fl-col-group{position:relative}.fl-builder-dragging .fl-builder-content:not(.fl-builder-empty){padding:16px 0}.fl-builder-empty{display:none;border:2px dashed #969696;border-radius:8px;color:#909090;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-weight:700;margin:10px;padding:250px 20px;text-align:center;text-transform:uppercase}.fl-builder-edit .fl-builder-empty{display:block}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging{background:rgba(255,255,255,.95)!important;border:2px solid #000;border-radius:4px;box-shadow:0 0 8px rgba(0,0,0,.2);-moz-box-shadow:0 0 8px rgba(0,0,0,.2);-webkit-box-shadow:0 0 8px rgba(0,0,0,.2);color:#333!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px!important;height:47px!important;line-height:40px!important;overflow:hidden;padding:0 20px;position:absolute!important;text-overflow:ellipsis;white-space:nowrap;width:180px!important;z-index:100010!important;display:flex;flex-direction:row;align-content:center;justify-content:flex-start}.fl-builder-block.fl-builder-block-drag-helper:hover{padding:0;box-shadow:none}.fl-builder-block-drag-helper:hover .fl-builder-block-content{position:static;padding:0 20px}.fl-builder-block-saved-column.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-module.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-row.fl-builder-block-drag-helper:hover .fl-builder-block-content{padding:14px 20px}.fl-builder-block-drag-helper .fl-builder-block-icon{fill:#000;margin-top:-10px}.fl-builder-drop-zone{animation:fl-builder-drop-zone-pulse 2s infinite;background:#00A2D7;border-radius:4px;color:#fff!important;display:block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;font-size:12px;letter-spacing:1px;line-height:14px;margin:10px;padding:6px 8px 5px;text-align:left;text-overflow:ellipsis;text-shadow:none;text-transform:none;white-space:nowrap;overflow:hidden;z-index:10}@keyframes fl-builder-drop-zone-pulse{0%,100%{background-color:#00A2D7}50%{background-color:#79DEFF}}.fl-builder-drop-zone-global{animation:fl-builder-drop-zone-global-pulse 2s infinite;background:#ff9600}@keyframes fl-builder-drop-zone-global-pulse{0%,100%{background-color:#FFBC5C}50%{background-color:#ff9600}}.fl-builder-content>.fl-builder-drop-zone{margin:10px 20px}.fl-row-content>.fl-builder-drop-zone{margin:3px 7px}.fl-col-has-cols>.fl-col-content>.fl-builder-drop-zone{margin:3px 10px}.fl-sortable-disabled>.fl-builder-drop-zone{display:none!important}.fl-col-group-equal-height.fl-col-group-align-center .fl-col-content>.fl-builder-drop-zone{width:100%}.fl-row-highlight{padding:16px 0}.fl-row-highlight .fl-row-content{border:2px dashed rgba(203,205,206,.5);padding:8px;border-radius:6px}.fl-row-highlight.fl-node-global .fl-row-content{border-color:#ff9600}.fl-col-highlight{padding:8px}.fl-col-highlight .fl-col-content{border-style:dashed!important;border-color:#00a0d2!important;border-radius:4px;min-height:100px;overflow-x:hidden;border-width:2px!important}.fl-col-has-cols.fl-col-highlight>.fl-col-content{padding:8px}.fl-col-highlight.fl-node-global .fl-col-content{border-color:#ff9600!important}.fl-builder-simple .fl-col-highlight .fl-col-content{border:none!important}.fl-col-highlight-guide{background:rgba(0,160,210,.05);border:2px solid #00A0D2;border-radius:4px;bottom:4px;left:4px;position:absolute;right:4px;top:4px;z-index:1}.fl-node-global .fl-col-highlight-guide{border-color:#ff9600!important;background-color:rgba(255,150,0,.06)!important}.fl-col-has-highlight-guide .fl-block-overlay{background:0 0;border-color:transparent}.fl-col-has-highlight-guide .fl-block-col-resize{display:none}.fl-col-has-highlight-guide .fl-col-highlight .fl-col-content{border-color:transparent!important}.fl-col-drop-target{bottom:8px;display:none;left:-9px;position:absolute;top:8px;width:18px;z-index:1}.fl-col-highlight .fl-col-drop-target{display:block}.fl-col-drop-target-last{left:auto;right:-9px}.fl-col-drop-target .fl-builder-drop-zone{bottom:0;left:2px;margin:0;padding:0;position:absolute;right:2px;top:0}.fl-col-group-drop-target{display:none;left:8px;height:18px;position:absolute;right:8px;top:-9px;z-index:1}.fl-row-highlight .fl-col-group-drop-target{display:block}.fl-col-group-drop-target-last{top:auto;bottom:-9px}.fl-col-group-drop-target .fl-builder-drop-zone{bottom:2px;left:0;margin:0;padding:0;position:absolute;right:0;top:2px}.fl-row-content>.fl-col-group-drop-target{position:static}.fl-row-content>.fl-col-group-drop-target .fl-builder-drop-zone{height:18px;position:static}.fl-row-drop-target{display:none;left:0;height:24px;margin-top:-28px;position:absolute;right:0;z-index:1}.fl-row-highlight .fl-row-drop-target{display:block}.fl-row-drop-target-last{margin-top:4px}.fl-row .fl-row-drop-target .fl-builder-drop-zone{bottom:0;left:4px;margin:0;position:absolute;right:4px;top:0}.fl-builder-content>.fl-row-drop-target{margin:0;position:static}.fl-builder-dragging .fl-builder-content.fl-builder-empty>.fl-row-drop-target{bottom:10px;display:block;height:auto;left:0;position:absolute;right:0;top:10px}.fl-builder-content .fl-row-drop-target .fl-builder-drop-zone{margin-bottom:0;margin-top:0}.fl-col-group:focus,.fl-col:focus,.fl-module:focus,.fl-row:focus{outline:0}.fl-sortable-proxy{display:none}.fl-block-overlay,.fl-block-overlay *{text-shadow:none;-webkit-touch-callout:none;transition-property:border-color;transition-duration:.3s}.fl-block-overlay-active{position:relative}.fl-block-overlay-actions{background:#00A0D2;float:left;height:30px;margin:-1px -1px 0;padding:0 4px;text-shadow:none;border-bottom-right-radius:5px;border-top-left-radius:3px;transition-property:background-color;transition-duration:.3s}.fl-row-overlay-header-bottom .fl-block-overlay-actions{border-radius:0 5px 0 3px}.fl-builder-col-resizing .fl-block-overlay-actions,.fl-builder-row-resizing .fl-block-overlay-actions{overflow:hidden}.fl-block-overlay-actions>span{display:block;float:left}.fl-block-overlay-actions i{color:#fff!important;cursor:pointer;display:block!important;float:left;font-size:16px!important;height:28px!important;line-height:28px!important;opacity:.8;filter:alpha(opacity=80);text-align:center;width:32px!important}.fl-block-overlay-actions i:hover{opacity:1;filter:alpha(opacity=100)}.fl-block-overlay-actions>i:first-child{padding-left:4px}.fl-block-overlay-actions>i:last-child{padding-right:2px}.fl-block-overlay-actions .fl-block-move{cursor:move}.fl-block-has-rules{color:#00A0D2!important;cursor:pointer;padding:7px;position:absolute;right:0;top:0}.fl-block-has-rules.logic{color:red!important}.fl-block-overlay-title{color:#fff!important;float:left;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;height:30px;line-height:29px;margin-right:2px;padding:0 12px 0 8px}.fl-col-overlay,.fl-module-overlay,.fl-row-overlay{background:rgba(190,239,255,0);color:#fff}.fl-builder-touch .fl-block-overlay-actions{height:32px}.fl-builder-touch .fl-block-overlay-actions i{font-size:20px!important;height:32px!important;line-height:32px!important;width:38px!important}.fl-row-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:0;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;left:0;position:absolute;top:-33px;right:0;z-index:100006}.fl-row-overlay.fl-row-menu-active,.fl-row-overlay.fl-row-menu-active.fl-block-overlay.fl-block-overlay-global{z-index:100007}.fl-row-full-width .fl-row-overlay{left:2px;right:2px;bottom:2px}.fl-row-overlay-header-bottom{bottom:-32px!important;top:0}.fl-row-overlay-header-bottom .fl-block-overlay-header{position:absolute;bottom:0}.fl-block-overlay-active .fl-row-content-wrap{position:relative}.fl-block-overlay-active .fl-row-content{position:relative;z-index:100007!important}.fl-builder-row-resizing .fl-col.fl-block-overlay-active,.fl-builder-row-resizing .fl-module.fl-block-overlay-active{position:static}.fl-col-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:8px;cursor:pointer;left:8px;position:absolute;right:8px;top:8px;z-index:100008}.fl-module-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:4px;cursor:pointer;left:4px;min-height:32px;position:absolute;right:4px;top:4px;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-module-overlay{cursor:default}.fl-module-adjust-height{padding-bottom:15px;padding-top:15px}.fl-col-bg-overlay .fl-block-overlay-active.fl-module{z-index:100008}.fl-block-overlay-global{background:rgba(255,150,0,0);border:2px solid #F7A407;border-radius:4px}.fl-block-overlay-global .fl-block-overlay-actions{background:#F7A407}.fl-block-overlay-title-global{background:#fff;color:#ff9600!important;font-size:11px;letter-spacing:1px;margin-left:4px;padding:2px 4px;vertical-align:top}.fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:pointer;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-row-overlay{cursor:default}.fl-builder-row-template .fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:default;z-index:100006}.fl-block-overlay-global.fl-row-overlay .fl-block-col-resize{display:none}.fl-block-overlay-muted .fl-row-overlay{background:rgba(85,93,102,0);border:2px solid #555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-overlay-actions{background:#555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-has-rules{color:#555D66!important}.fl-block-overlay-muted .fl-row-overlay .fl-block-col-resize{display:none}.fl-node-disabled .fl-row-content-wrap,.fl-node-disabled>.fl-col-content{opacity:.3}.fl-block-col-resize{bottom:0!important;position:absolute;top:0!important;width:6px}.fl-block-col-resize-e{cursor:ew-resize;left:auto!important;right:-2px!important}.fl-block-col-resize-w{cursor:ew-resize;left:-7px!important}.fl-block-col-resize-handle-wrap{margin:-4px 0 0 -5px;padding:0 5px;position:absolute;top:50%!important}.fl-block-col-resize-e .fl-block-col-resize-handle-wrap{margin-left:-6px}.fl-block-col-resize-handle{background:#fff;border:2px solid #00A0D2;border-radius:50%;height:12px;width:12px}.fl-node-global .fl-block-col-resize-handle{border-color:#ff9600}.fl-block-col-resize-feedback{color:#333!important;display:none;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:11px!important;position:absolute}.fl-block-col-resize-feedback-left,.fl-block-col-resize-feedback-right{background:#fff;border:1px solid #3ba0ff;padding:2px 4px}.fl-block-col-resize-feedback-left{right:20px;top:-7px}.fl-block-col-resize-feedback-right{left:20px;top:-7px}.fl-builder-has-submenu{position:relative}.fl-builder-has-submenu>ul.fl-builder-submenu{background:#00A0D2;box-shadow:0 0 20px rgba(0,0,0,.2);border-radius:0 4px 4px;display:none;left:0;list-style:none;margin:0;padding:6px 0;position:absolute;text-align:left;top:100%;width:165px;z-index:100008}.fl-builder-has-submenu>ul.fl-builder-submenu li{list-style:none;margin:0;padding:0}.fl-builder-submenu-right ul.fl-builder-submenu{left:auto;right:0}.fl-builder-has-submenu.fl-builder-submenu-open>ul.fl-builder-submenu{display:block}.fl-builder-has-submenu>ul.fl-builder-submenu li a{border-bottom:0 none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;color:#fff!important;display:block;line-height:13px;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;opacity:.8;filter:alpha(opacity=80);overflow:hidden;padding:6px 12px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.fl-builder-has-submenu>ul.fl-builder-submenu li a:hover{background:#0197C6;color:#fff;opacity:1;filter:alpha(opacity=100);text-decoration:none}.fl-builder-actions-title,.fl-builder-alert-lightbox .fl-lightbox-message,.fl-builder-alert-lightbox .fl-lightbox-message-info{color:#333!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px!important}.fl-builder-has-submenu .fl-builder-submenu .fa,.fl-builder-has-submenu .fl-builder-submenu .far,.fl-builder-has-submenu .fl-builder-submenu .fas{float:right;height:12px!important;line-height:12px!important;position:relative;right:-5px;width:14px!important}.fl-builder-has-submenu .fl-builder-has-submenu .fl-builder-submenu{display:none;left:100%;top:0}.fl-builder-has-submenu .fl-builder-submenu-right.fl-builder-has-submenu .fl-builder-submenu{left:auto;right:100%}.fl-builder-has-submenu .fl-builder-has-submenu:hover .fl-builder-submenu{display:block}.fl-builder-submenu-sep{padding:7px 0!important}.fl-builder-submenu-sep div{border-bottom:1px solid rgba(255,255,255,.4)}.fl-block-col-move,.fl-block-col-move-parent{cursor:move;position:relative}.fl-builder-submenu .fa-arrows-alt{cursor:move;display:none!important}.fl-builder-submenu a:hover .fa-arrows-alt{display:block!important;float:right;line-height:12px!important;height:12px!important}.fl-block-overlay-global ul.fl-builder-submenu{background:#ff9600!important}.fl-block-overlay-global ul.fl-builder-submenu li a:hover{background:#fa3}.fl-builder-actions-lightbox .fl-lightbox{display:block;width:300px;border-radius:4px}.fl-builder-actions-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-actions-lightbox .fl-builder-actions{display:flex;flex-direction:column;padding:25px;text-align:center}.fl-builder-actions-title{display:block;margin-bottom:20px}.fl-builder-actions .fl-builder-button{display:flex;justify-content:center;margin-bottom:7px;min-height:36px}.fl-builder-alert-lightbox{padding:20px;z-index:30000000;top:0;pointer-events:auto}.fl-builder-alert-lightbox .fl-lightbox{max-width:440px;width:auto}.fl-builder-alert-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-alert-lightbox .fl-lightbox-message,.fl-builder-alert-lightbox .fl-lightbox-message-info{line-height:24px;padding:30px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox{max-width:60%}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-content{padding:20px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-message{padding:10px 20px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-message h1{font-size:20px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-message p{font-size:14px;padding-top:5px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .link{color:#428bca;text-decoration:underline}.fl-builder-alert-lightbox .fl-lightbox-message-info{padding:0 20px;font-size:14px!important}.fl-builder-alert-lightbox .fl-lightbox-message-info p{line-height:20px;padding:10px 0 0 10px}.fl-builder-alert-lightbox .fl-lightbox-message-info a{font-size:14px}@keyframes fl-builder-content-section-entry{from{transform:translateY(150px) translateX(100px) scale(.3);opacity:0}to{transform:translateY(0) translateX(0) scale(1);opacity:1}}.fl-template-category-select{width:180px!important}.fl-template-selector .fl-builder-settings-section{margin:0 0 10px}.fl-template-selector .fl-builder-settings-fields{height:470px}.fl-template-selector .fl-builder-settings-tab{width:560px}.fl-template-selector .fl-builder-settings-tab-description{font-size:15px!important;margin:0!important;padding:10px 0 25px;text-align:center}.fl-template-preview{float:left;margin:0 25px 30px 0;position:relative;text-align:center;width:170px}.fl-template-preview.fl-last{margin-right:0}.fl-template-image{border:1px solid #d9d9d9;cursor:pointer;margin-bottom:12px;height:164px;overflow:hidden}.fl-template-image:hover{border-color:red}.fl-template-image img{max-height:none;width:100%}.fl-template-preview span{display:block;text-align:center}.fl-user-template-category-name{background:#f2f2f2;border-bottom:3px solid #dfdfdf;border-top:2px solid #dfdfdf;font-weight:700;padding:8px 15px}.fl-user-templates{border-bottom:1px solid #dfdfdf;padding:10px 0 20px}.fl-builder--user-templates-section-content{border-bottom:2px solid #e6eaed;padding:10px}.fl-builder--user-templates-section-content:first-child{padding-top:0}.fl-builder--user-templates-section-content:last-child,.fl-user-templates:last-child{border-bottom:none}.fl-builder--user-templates-section-name{font-weight:700;font-size:16px;color:#333;z-index:9999;padding:15px 10px;margin:0 10px}@keyframes fl-list-item-entry{from{opacity:0;transform:scale(.5) translateY(100px)}to{opacity:1;transform:scale(1) translateY(0)}}.fl-builder--save-new-user-template,.fl-user-template{position:relative;display:flex;flex-direction:row;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:16px;font-weight:200;line-height:1.1;padding:10px 20px;color:#6d6d6d}.fl-user-template:hover{cursor:pointer;background:#fff;box-shadow:0 6px 20px rgba(0,0,0,.08);text-decoration:none;color:#111;padding-right:68px}.fl-user-template-name{overflow:hidden;text-overflow:ellipsis;flex:1}.fl-user-template-actions{display:none;bottom:0;position:absolute;right:0;top:0}.fl-user-template:hover .fl-user-template-actions{display:flex;flex-direction:row;align-items:center}.fl-user-template-actions a{display:inline-block;padding:15px 0;width:30px}.fl-user-template:hover a:hover i{color:#444!important}.fl-user-templates-message{display:none}.fl-user-template-thumbnail{flex:0;margin-right:20px}.fl-user-template-thumbnail .fl-builder--template-thumbnail{background-size:cover;background-position:center top;width:45px}.fl-user-template-thumbnail .fl-builder--template-thumbnail:hover{box-shadow:none;transform:scale(1);transition-property:none}.fl-builder--save-new-user-template .fl-user-template-thumbnail .fl-builder--template-thumbnail{border-style:dashed;border-width:2px;border-color:#ccd4da}.fl-builder--save-new-user-template .fl-save-control{display:flex;flex-direction:row;flex:1}.fl-builder--save-new-user-template .fl-save-control input{background:0 0;border:none!important;flex:1;font-size:16px;margin-right:10px;margin-left:-12px;color:#000}.fl-builder-settings-message,.fl-builder-settings-message *{font-size:15px!important;line-height:23px!important}.fl-builder--save-new-user-template .fl-save-control input::-webkit-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input::-moz-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-ms-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-moz-placeholder{color:#777}@keyframes fl-slide-in-right{from{transform:translateX(50px)}to{transform:translateX(0)}}.fl-builder--save-new-user-template .fl-save-control button{display:none;animation-name:fl-slide-in-right;animation-duration:.25s;background-color:#00a0d2;border:none;padding:0 15px}.fl-save-control-mask{display:none;background:0 0;position:absolute;top:-50px;left:0;bottom:0;right:0;z-index:-1;min-height:80vh}.single-fl-builder-template .fl-content{width:100%!important}form.fl-builder-settings{height:100%;margin:0;padding:0;display:flex;flex-direction:column}.fl-builder-settings-message{padding:20px 25px!important;background:#f2f2f2!important}.fl-builder-preview-loader{position:relative;top:-2px;margin-left:3px}.fl-lightbox-header .fl-builder-preview-loader{margin:0;position:absolute;right:40px;top:15px}@keyframes fl-grab-attention{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}.fl-lightbox-width-slim .fl-form-table{margin:10px 12px 10px 10px!important;width:calc(100% - 40px)}.fl-lightbox-width-slim.fl-lightbox .fl-form-table th{display:block;position:relative;padding:10px 0 0 12px!important;width:auto!important}.fl-lightbox-width-slim .fl-form-table td{display:block}.fl-lightbox-width-slim .fl-form-table .fl-field[data-type=editor] td:first-child,.fl-lightbox-width-slim .fl-form-table td:first-child{padding-left:0!important}.fl-field-label .fl-field-responsive-toggle,.fl-lightbox-width-slim .fl-field-control-wrapper .fl-field-responsive-toggle{display:none}.fl-lightbox-width-slim .fl-field-label .fl-field-responsive-toggle{display:inline-block;padding:0 5px!important}.fl-lightbox-width-slim input.text-full+.fl-field-description,.fl-lightbox-width-slim select+.fl-field-description{display:block;padding:8px 10px;margin:0}.fl-lightbox-width-slim .fl-builder-settings-fields select{width:100%}.fl-lightbox-width-slim .fl-compound-field{max-width:none}.fl-lightbox-width-slim .fl-color-picker{display:flex;width:auto}.fl-lightbox-width-slim .fl-color-picker-clear{flex:0 0 40px}.fl-lightbox-width-slim .fl-field[data-type=dimension] .fl-field-responsive-setting{width:100%}.fl-lightbox-width-slim .fl-dimension-field-units{max-width:none}.fl-lightbox-width-slim .fl-dimension-field-unit-select select{width:auto!important}.fl-lightbox-width-slim .fl-gradient-picker-color-row{width:50%}.fl-lightbox-width-slim .fl-color-picker.fl-gradient-picker-color,.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-option{width:100%}.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-options{float:none}.fl-lightbox-width-slim .mce-menubtn.mce-fixed-width button{width:72px!important}.fl-lightbox-width-slim .fl-builder-settings-tab-description{margin:20px 10px}.fl-lightbox-width-micro .mce-menubtn.mce-fixed-width button{width:38px!important}.fl-lightbox-width-micro .mce-btn[aria-label=Fullscreen],.fl-lightbox-width-micro .mce-btn[aria-label=Blockquote]{display:none}.fl-lightbox-width-micro .mce-toolbar i.mce-ico{width:18px}.fl-lightbox-width-slim .fl-field[data-type=editor] .fl-field-control-wrapper,.fl-lightbox-width-slim .fl-field[data-type=code] .fl-field-control-wrapper{margin-left:-10px;margin-right:-30px}.fl-lightbox .wp-editor-tools{padding-left:6px;padding-right:28px}.fl-lightbox .mce-top-part::before{box-shadow:none!important}.mce-container .mce-stack-layout span{color:initial}.fl-lightbox div.mce-toolbar-grp{background:0 0;border:none}.fl-lightbox div.mce-toolbar-grp>div{padding:0 3px}.fl-lightbox .fl-builder-settings .wp-switch-editor{background:#e7ebef;border:1px solid transparent}.fl-lightbox .html-active .switch-html,.fl-lightbox .quicktags-toolbar,.fl-lightbox .tmce-active .switch-tmce{background:#fff}.fl-lightbox .quicktags-toolbar,.fl-lightbox .wp-editor-container{border:none}.fl-lightbox .mce-toolbar .mce-container-body{display:flex;flex-direction:row}.fl-lightbox-width-slim .mce-toolbar .mce-container-body{justify-content:center}.fl-lightbox textarea.wp-editor-area{line-height:1.5;padding:20px;width:calc(100% - 10px)}.fl-lightbox .wp-core-ui .button,.fl-lightbox .wp-core-ui .button-secondary{border:none;box-shadow:none;background:#e7ebef}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units{width:auto}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units input{max-width:none;width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple{display:flex;flex-wrap:wrap;position:relative}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-control,.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-label{width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-form-field-preview-text{max-width:225px}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-builder-field-actions{position:absolute!important;top:0;right:0;width:70px;z-index:1}.fl-lightbox-width-slim .fl-builder-field-actions-single .fl-builder-field-copy{float:right!important;margin-right:5px}.fl-lightbox-width-slim .fl-field[data-type=time] select{width:auto}.fl-builder-settings-tabs{display:flex;flex-direction:row;align-items:stretch;overflow:hidden;height:32px;background:#e7ebef}.fl-builder-content-group-select{padding:0 10px 6px;display:none}.fl-builder-content-group-select select{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;padding:8px 10px;border:2px solid #e4e7ea;color:#161B20}select:focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;outline:0!important}.fl-legacy-settings-tab{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings-tab:first-child .fl-legacy-settings-tab{background:0 0;height:auto}body .fl-builder-settings-tabs>*{box-sizing:border-box;color:#676F7A!important;fill:#676F7A!important;background:0 0;border:2px solid transparent;border-radius:0;margin:0;outline:0;padding:1px 16px;text-decoration:none!important;font-size:13px;font-weight:400!important;flex:0 0 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:center}body .fl-lightbox-width-slim .fl-builder-settings-tabs>*{flex:1 1 auto}body .fl-builder-settings-tabs>.fl-builder-settings-tabs-more{flex:0 0 60px;display:none;margin-left:auto;justify-content:center}.fl-builder-settings-tabs-more svg{width:16px;height:auto;margin:auto}.fl-builder-settings-tabs-more g,.fl-builder-settings-tabs-more path,.fl-builder-settings-tabs-more svg{fill:inherit}body .fl-lightbox-has-tab-overflow .fl-builder-settings-tabs-more{display:flex}.fl-builder-settings-tabs>:active,.fl-builder-settings-tabs>:hover{top:0;color:#333;background:0 0;border:2px solid transparent}.fl-builder-settings-tabs>:focus{top:0;outline:0;border:2px solid transparent;background:0 0;color:#0086b0;fill:#0086b0}.fl-builder-settings-tabs .fl-active,.fl-builder-settings-tabs-more.fl-contains-active,.fl-builder-settings-tabs-overflow-menu .fl-active{color:#0086b0!important;fill:#0086b0!important;position:relative;background:#fff}.fl-builder-settings-tabs .fl-active.fl-overflowed,.fl-builder-settings-tabs .fl-overflowed{display:none!important}.fl-builder-settings-tabs .error{color:#d03436;padding-right:10px}.fl-builder-settings-tabs .error .fl-error-icon,.fl-builder-settings-tabs-overflow-menu .error .fl-error-icon{background:url(../img/sprite.png) -148px -5px no-repeat;display:inline-block;height:16px;margin-left:7px;position:relative;top:3px;width:16px}.fl-builder-settings-tabs-more.fl-contains-errors{fill:#d03436!important}.fl-builder-settings-tab{display:none;width:auto!important}.fl-builder-settings-tab.fl-active{display:block}.fl-builder-settings-tab-description{background:#e4e7ea;padding:10px 15px;border-radius:4px;margin:20px}.fl-builder-settings-tab-description a{text-decoration:underline!important}.fl-builder-settings-tab-description a:hover{color:#333}.fl-builder-settings-tabs-overflow-menu{display:none;position:absolute;left:0;right:0;border:2px solid #e6eaed;border-top:3px solid #00a0d2;border-radius:4px;background:#fff;z-index:9999;margin:0 6px;padding:10px;flex-direction:column;box-shadow:0 0 20px 2px rgba(0,0,0,.2)}.fl-builder-settings-tabs-overflow-menu:before{bottom:100%;right:20px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:10px;margin-left:-10px}.fl-builder-settings-tabs-overflow-menu>a{display:block;padding:10px 15px;font-size:14px;font-weight:600!important;border:2px solid transparent;border-radius:4px;outline:0}.fl-builder-settings-tabs-overflow-menu>a:hover{background:#e6eaed;text-decoration:none}.fl-builder-settings-tabs-overflow-click-mask{display:none;position:fixed;top:0;bottom:0;left:0;right:0;background:0 0;z-index:11}.fl-lightbox .fl-form-table{display:table;background:none;border:none;overflow:inherit;width:calc(100% - 35px)}.fl-lightbox .fl-form-table tbody{border:none}.fl-form-table tr:nth-child(even),.fl-lightbox .fl-form-table tr{background:0 0}.fl-lightbox .fl-form-table td,.fl-lightbox .fl-form-table th{background:0 0!important;border:none!important;font-weight:400!important;text-align:left!important}.fl-lightbox .fl-form-table th{padding:10px 15px 10px 30px!important;vertical-align:top!important;width:200px!important}.fl-lightbox .fl-form-table td:first-child{padding-left:30px!important}.fl-lightbox .fl-form-table th label{color:#333;width:auto;max-width:100%}.fl-lightbox .fl-form-table th label i{color:grey}.fl-lightbox .fl-form-table th label i:hover{color:#555}.fl-lightbox .fl-form-table td{padding:8px 10px}.fl-lightbox-width-slim .fl-form-table td{padding:4px 0 5px}.fl-builder-settings-fields{margin:0;overflow:hidden;position:relative;flex:1 100%;visibility:hidden}.fl-lightbox-header .fl-builder-settings-fields{height:auto;margin:0;position:absolute;right:10px;top:10px}.fl-builder-settings-fields .fl-nanoscroller-content{padding:4px 0 0}.fl-builder-settings-fields .fl-field-control-wrapper{position:relative}.fl-field{animation-duration:.25s;animation-delay:.1s}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select,.fl-builder-settings-fields textarea{background:#fff!important;border-color:transparent!important;border-style:solid;border-width:2px;border-radius:4px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);color:#333!important;display:inline;font-size:13px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px 6px;width:auto;box-sizing:border-box}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select:not(multiple){height:36px!important}.colorpicker input,.fl-builder-settings-fields select,.fl-builder-settings-fields select[multiple]{height:auto!important}.fl-builder-settings-fields input[type=number]{width:70px}.fl-builder-lightbox .fl-builder-settings-fields input[type=date]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=email]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=file]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=number]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=password]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=search]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=text]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=url]:focus,.fl-builder-lightbox .fl-builder-settings-fields select:focus,.fl-builder-lightbox .fl-builder-settings-fields textarea:not(.wp-editor-area):focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)!important}.fl-builder-settings-fields ::-webkit-input-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-moz-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields ::-moz-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-ms-input-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields label{display:inline-block;font-weight:400;user-select:none;margin-bottom:3px;font-size:12px}.fl-builder-settings-fields select{-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;color:#000;margin:0 0 2px;padding:2px 10px;padding-right:30px!important;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important}.fl-dimension-field-unit input[type=number],.fl-unit-field-inputs input[type=number]{-moz-appearance:textfield}.fl-builder-settings-fields select[multiple]{height:60px;background-image:none!important}.fl-builder-custom-field select,.fl-photo-field select{-webkit-box-shadow:none;box-shadow:none;border-color:#e6eaed!important}.fl-builder-settings-section:first-child{border-top:none!important}.fl-builder-settings-section-header{background-color:#e7ebef;border-top:4px solid #e7ebef;cursor:pointer;height:30px;display:flex;flex-direction:row}.fl-builder-settings-description{padding:0 10px 10px;margin:0;font-style:italic;opacity:.75}.fl-builder-settings-fields table{margin:20px 0}.fl-builder-settings-fields .fl-builder-settings-title{display:flex;align-items:center;background:#F5F7F9;color:#353535;padding:2px 10px;margin:0;font-size:13px!important;font-weight:400;user-select:none;border:2px solid transparent;border-radius:0}.fl-builder-settings-fields .fl-builder-settings-title:active,.fl-builder-settings-fields .fl-builder-settings-title:hover{top:0}.fl-builder-settings-fields .fl-builder-settings-title:focus{top:0;border-color:#e0e4ea}.fl-builder-settings-fields .fl-builder-settings-title>svg{height:6px;width:9px;margin-right:7px;transition-property:transform;transition-duration:.15s}.fl-builder-settings-section-collapsed{margin-bottom:4px}.fl-builder-settings-section-collapsed .fl-builder-settings-section-content{display:none}.fl-builder-settings-section-collapsed .fl-builder-settings-title{background:0 0;flex:1 1 100%}.fl-builder-settings-section-collapsed .fl-builder-settings-title>svg{transform:rotate(-90deg)}.wp-core-ui h1,.wp-core-ui h2,.wp-core-ui h3,.wp-core-ui h4,.wp-core-ui h5,.wp-core-ui h6,.wp-core-ui p{color:#333;font-family:inherit}.wp-core-ui #media-attachment-date-filters{width:auto}.wp-core-ui input[type=search]::placeholder{color:#333}.wp-core-ui .submitbox .submitdelete{color:#a00}.wp-core-ui button{font-weight:400}.wp-core-ui input[type=date],.wp-core-ui input[type=email],.wp-core-ui input[type=file],.wp-core-ui input[type=number],.wp-core-ui input[type=password],.wp-core-ui input[type=search],.wp-core-ui input[type=tel],.wp-core-ui input[type=text],.wp-core-ui input[type=url],.wp-core-ui select,.wp-core-ui textarea{background-color:#fff;border-color:#dfdfdf;border-style:solid;border-width:1px;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;color:#333;font-weight:400}.wp-core-ui input[type=date]:focus,.wp-core-ui input[type=email]:focus,.wp-core-ui input[type=file]:focus,.wp-core-ui input[type=number]:focus,.wp-core-ui input[type=password]:focus,.wp-core-ui input[type=search]:focus,.wp-core-ui input[type=tel]:focus,.wp-core-ui input[type=text]:focus,.wp-core-ui input[type=url]:focus,.wp-core-ui select:focus,.wp-core-ui textarea:focus{background:0 0;border-color:#aaa}.wp-core-ui input[type=search]{background-image:none;padding:6px}.fl-field-responsive-setting{display:inline-block;width:100%}.fl-field-responsive-setting-medium,.fl-field-responsive-setting-responsive{display:none}.fl-field-control-wrapper i.fl-field-responsive-toggle{padding:9px 0 0;position:absolute;left:-25px}i.fl-field-responsive-toggle{color:grey;cursor:pointer;display:inline-block;font-size:15px!important;height:auto;line-height:18px!important;text-align:left;vertical-align:middle;width:20px}i.fl-field-responsive-toggle:hover{color:#000}.fl-builder-settings-fields input.text-full{width:100%}.fl-builder-settings-fields .fl-text-field-add-value{min-width:50%;margin-top:.62em}.fl-builder-settings-fields textarea{width:100%}.fl-field[data-type=shadow] .fl-field-control-wrapper{display:flex}.fl-shadow-field .fl-color-picker{margin-bottom:15px;width:100%}.fl-color-picker{cursor:pointer}.fl-color-picker .fl-color-picker-clear{box-sizing:border-box;display:inline-block}.fl-color-picker .fl-color-picker-clear:hover{background-color:#ededed}.colorpicker input{padding:0!important;font-size:11px!important;color:#fff!important;width:29px!important;background:0 0!important;border:none!important}.colorpicker .colorpicker_hex input{width:45px!important}.fl-gradient-picker-type{display:flex;margin-bottom:15px}.fl-gradient-picker-type input{margin:0!important}.fl-gradient-picker-type select{margin-bottom:0!important}.fl-gradient-picker-type-select{margin-right:10px!important}.fl-gradient-picker-colors{display:flex}.fl-gradient-picker-color-row{display:flex;margin-right:15px}.fl-color-picker.fl-gradient-picker-color,.fl-gradient-picker-color-row:last-child{margin-right:0}.fl-color-picker.fl-gradient-picker-color .fl-color-picker-color{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-gradient-picker .fl-gradient-picker-stop input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;margin:0!important}.fl-field[data-type=dimension] .fl-field-label label{padding-right:35px}.fl-field[data-type=dimension] .fl-field-control-wrapper{display:flex}.fl-field[data-type=dimension] .fl-field-description{padding:9px 0 0 5px}.fl-field[data-type=dimension] .fl-field-responsive-setting{width:auto}.fl-dimension-field-units{border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:flex;height:36px;margin:1px 1px 20px;position:relative;max-width:350px}.fl-dimension-field-units>*{border-right:1px solid #e6eaed;width:100%}body .fl-dimension-field-units>:last-child{border-right:none!important}body .fl-dimension-field-units>:first-child>input[type]{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}body .fl-dimension-field-units>:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-dimension-field-unit input[type],.fl-dimension-field-units .fl-field-unit-select{box-shadow:none!important;margin:0!important;border-radius:0!important}.fl-builder-custom-field,.fl-button-group-field-options,.fl-unit-field-inputs{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-dimension-field-unit input{width:100%!important}.fl-dimension-field-unit input::-webkit-inner-spin-button,.fl-dimension-field-unit input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-dimension-field-unit label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-help-tooltip-icon,i.fl-dimension-field-link{font-size:15px!important;vertical-align:middle;cursor:pointer}.fl-dimension-field-unit .fl-field-popup-slider{margin-top:27px}i.fl-dimension-field-link{color:grey;height:auto;line-height:18px!important;text-align:left;width:20px}i.fl-dimension-field-link:hover{color:#000}i.fl-dimension-field-link.dashicons-editor-unlink,i.fl-dimension-field-link.dashicons-editor-unlink:hover{color:#0086b0}.fl-field-label .fl-dimension-field-link,.fl-lightbox-width-slim .fl-dimension-field-link{display:none}.fl-lightbox-width-slim .fl-field-label .fl-dimension-field-link{display:inline-block}.fl-field-control-wrapper .fl-dimension-field-link{padding:9px 0 0;left:-50px;position:absolute}.fl-dimension-field-unit-select{display:flex;width:auto!important}.fl-field[data-type=unit] .fl-field-control-wrapper{display:flex}.fl-field[data-type=unit] .fl-field-description{margin-left:7px!important;padding-top:9px}.fl-field[data-type=unit] .fl-field-responsive-setting{width:auto}.fl-unit-field-inputs{background:0 0;border-radius:4px;display:flex}.fl-unit-field-inputs .fl-field-unit-select,.fl-unit-field-inputs input[type]{box-shadow:none!important;margin:0!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-unit-field-inputs .fl-field-unit-select{display:flex;justify-content:center;align-items:center}.fl-unit-field-inputs input::-webkit-inner-spin-button,.fl-unit-field-inputs input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-unit-field-input{border-right:1px solid #e6eaed!important}body .fl-unit-field-input:last-child{border-right:none!important}body .fl-unit-field-input:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-unit-field-unit-select{display:flex;width:auto!important}select.fl-field-unit-select{background-color:#E7EBEF!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}div.fl-field-unit-select{background-color:#E7EBEF!important;padding:9px 7px!important;flex:1 0 auto}.fl-field-popup-slider{background:#fff;border-radius:4px;box-shadow:0 4px 25px 0 rgba(0,0,0,.18);display:none;margin-top:10px;padding:15px;position:absolute;left:0;right:0;z-index:9999}.fl-field-popup-slider-top{margin-top:0!important;top:-100%;transform:translateY(-10px)}.fl-field-popup-slider-input{background:#E7EBEF;cursor:pointer;height:4px;text-align:left;position:relative;border-radius:3px}.fl-field-popup-slider-input .ui-slider-handle{background:#fff;border:2px solid #3AA4CC;border-radius:100%;cursor:pointer;height:12px;width:12px;position:absolute;top:-6px;margin-left:-7px}.fl-field-popup-slider-input .ui-slider-handle:focus{outline:0}.fl-field-popup-slider-arrow{position:absolute;top:-22px}.fl-field-popup-slider-arrow:after{content:' ';border-color:transparent transparent #fff;border-style:solid;border-width:0 8px 8px;width:0;height:0}.fl-field-popup-slider-top .fl-field-popup-slider-arrow{top:auto;bottom:-24px}.fl-field-popup-slider-top .fl-field-popup-slider-arrow:after{border-bottom-width:0;border-top-width:8px;border-top-color:#fff}input[type=number].fl-field-popup-slider-focus{border:2px solid #00a0d2!important}.fl-font-field{display:flex}.fl-font-field label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-font-field .fl-font-field-font-wrapper{margin-right:8px;width:70%!important}.fl-font-field .fl-font-field-weight-wrapper{width:30%!important}.fl-compound-field{max-width:350px}.fl-compound-field-section-toggle{background:#E7EAEF;border-radius:4px;border-top:2px solid transparent;border-bottom:2px solid transparent;cursor:pointer;align-items:center;display:flex;height:32px;margin-bottom:8px;padding:0 12px}.fl-compound-field-section-toggle:hover{background:#dadfe5}.fl-compound-field-section-toggle .dashicons{font-size:15px;height:15px;margin-right:5px;width:15px}.fl-compound-field-section:last-child .fl-compound-field-section-toggle{margin-bottom:0}.fl-compound-field-section.fl-compound-field-section-visible{padding-bottom:12px}.fl-compound-field-section.fl-compound-field-section-visible:last-child{padding-bottom:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle{background:0 0;border-top:2px solid #E7EBEF;border-radius:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle:hover{background:0 0}.fl-compound-field-section-visible .fl-compound-field-section-toggle .dashicons:before{content:'\f347'}.fl-compound-field-row{display:none;padding-bottom:12px}.fl-compound-field-section-visible .fl-compound-field-row{display:flex}.fl-compound-field-label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-compound-field-label-bottom{padding:6px 0 0 12px}.fl-compound-field-label .fl-dimension-field-link{display:inline-block;padding:0 0 0 2px;position:relative;left:auto;top:-1px}.fl-compound-field-setting{padding-right:8px;width:100%}.fl-compound-field-setting:last-child{padding-right:0}.fl-compound-field-setting select{margin:0!important;width:100%}.fl-compound-field-setting .fl-unit-field-input input{width:100%!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-compound-field-setting .fl-unit-field-input{width:50%!important}.fl-compound-field-setting .fl-unit-field-input select.fl-field-unit-select{background-position:center right 2px!important;padding:2px 5px!important;width:100%;font-size:11px}.fl-typography-field .fl-font-field-font-wrapper{margin-right:8px!important}.fl-typography-field-spacing{width:calc(33.33% - 8px)}.fl-typography-field-transform{width:66.66%}.fl-typography-field-transform .fl-button-group-field-options{float:none}.fl-typography-field-transform .fl-button-group-field-option{width:auto;padding:0 7px}.fl-typography-field .fl-shadow-field{display:flex}.fl-typography-field .fl-shadow-field .fl-color-picker{margin:0 8px 0 0;width:calc(33.33% - 8px)}.fl-typography-field .fl-shadow-field .fl-dimension-field-units{margin-left:0;margin-top:0;margin-right:0;width:66.66%}.fl-button-group-field-options{background:#E7EBEF;border-radius:4px;display:flex;float:left;height:36px;overflow:hidden}.fl-button-group-field-option{cursor:pointer;display:flex;flex:1 1 auto;align-items:center;justify-content:center;padding:0 5px;border-radius:0;border:2px solid transparent;background:0 0!important}.fl-button-group-field-option:hover{top:0;background-color:transparent;color:#000;border:2px solid transparent}.fl-button-group-field-option:focus{top:0;background-color:transparent;border:2px solid #00a0d2;color:#333}.fl-button-group-field-option:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-button-group-field-option:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-button-group-field-option[data-selected="1"]{background-color:#fff!important;color:#000}.fl-button-group-field-option i{color:#6B6E75}.fl-button-group-field-option:hover i{color:#333}.fl-compound-field-cell{width:50%;display:block;float:left;padding-top:13px}.fl-compound-field-cell:first-child{padding-right:4px}.fl-compound-field-cell:last-child{padding-left:4px}.fl-compound-field-cell label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-shape-transform-field .fl-compound-field-row{display:flex;flex-direction:row}.fl-shape-transform-field .fl-compound-field-row>*{width:auto;flex:1 1 auto}.fl-shape-transform-field .fl-compound-field-row>:first-child{flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls{display:flex;flex-direction:row}.fl-shape-transform-field .fl-shape-orientation-controls>*{flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>*,.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>* button{border-radius:0}.fl-shape-orientation-controls .fl-button-group-field:first-child>*,.fl-shape-orientation-controls .fl-button-group-field:first-child>* button{border-top-left-radius:4px;border-bottom-left-radius:4px}.fl-shape-orientation-controls .fl-button-group-field:last-child>*,.fl-shape-orientation-controls .fl-button-group-field:last-child>* button{border-top-right-radius:4px;border-bottom-right-radius:4px}.fl-builder-custom-field{background:#fff;border:2px solid transparent;border-radius:4px;padding:7px 10px;min-height:36px;box-sizing:border-box}.fl-builder-field-multiple .fl-builder-custom-field{cursor:move}.fl-builder-custom-field a{color:#21759b!important;text-decoration:underline!important}.fl-builder-custom-field a:hover{color:#d54e21!important}.fl-builder-custom-field label.error{margin-top:5px}.fl-photo-field .fl-photo-preview{display:flex}.fl-photo-field .fl-photo-select,.fl-photo-field.fl-photo-empty .fl-photo-preview{display:none}.fl-photo-field.fl-photo-empty .fl-photo-select{display:block}.fl-photo-field .fl-photo-preview-img{line-height:0;margin:5px 0}.fl-photo-field .fl-photo-preview-img img{max-width:60px}.fl-photo-field .fl-photo-preview select{margin:8px 0 8px 10px;width:calc(100% - 10px)}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview select{display:none}.fl-photo-field .fl-photo-preview-filename{display:none;font-size:13px;font-weight:700;margin:5px 0 9px 11px}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview-filename{display:inline-block;word-break:break-all}.fl-multiple-photos-field .fl-multiple-photos-select,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-add,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-count,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-edit,.fl-multiple-photos-lightbox .gallery-settings,.fl-photo-field.fl-photo-no-attachment .fl-photo-edit{display:none}.fl-photo-field .fl-photo-edit{margin:0 0 0 11px}.fl-photo-field .fl-photo-remove,.fl-photo-field .fl-photo-replace{margin:0 0 0 8px}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail,.fl-field-control .fl-form-field{margin-bottom:0}.fl-builder-edit .media-modal{z-index:9999991}.fl-builder-edit .media-modal-backdrop{z-index:999999}.fl-builder-edit .media-frame{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fl-builder-edit .media-modal-content h1{font-family:inherit}.fl-builder-edit .media-modal-content .thumbnail{padding:0;border:none;border-radius:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail img{max-width:none}.fl-builder-edit button.media-modal-close{position:absolute;box-shadow:none;-webkit-box-shadow:none}.fl-builder-edit .media-frame.hide-menu{visibility:visible}.fl-builder-edit .media-modal .media-frame-content *,.fl-builder-edit .media-modal .media-frame-router .media-router *{color:grey}span.select2-container.select2-container--open{z-index:9999999}.fl-multiple-photos-field .fl-multiple-photos-add{margin:0 0 0 8px}.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-select{display:inline}.fl-multiple-photos-count{font-weight:700;margin-bottom:3px}.fl-video-field .fl-video-select,.fl-video-field.fl-video-empty .fl-video-preview{display:none}.fl-video-field.fl-video-empty .fl-video-select{display:block}.fl-video-field .fl-video-preview-img{float:left;line-height:0;margin:5px 0}.fl-video-field .fl-video-preview-img img{max-width:60px}.fl-video-field .fl-video-preview-img .dashicons.dashicons-media-video{display:block;font-size:60px;height:60px;line-height:60px;width:60px}.fl-video-field .fl-video-preview-filename{display:inline-block;font-size:14px;font-weight:700;margin:7px 0 5px 11px}.fl-video-field .fl-video-remove,.fl-video-field .fl-video-replace{margin:0 0 0 11px}.fl-multiple-audios-field .fl-multiple-audios-select,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-add,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-edit{display:none}.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-select{display:block}.fl-multiple-audios-field .fl-multiple-audios-add{margin:0 0 0 8px}.fl-icon-field .fl-icon-select,.fl-icon-field.fl-icon-empty .fl-icon-preview{display:none}.fl-icon-field.fl-icon-empty .fl-icon-select{display:block}.fl-icon-field .fl-icon-preview i{display:inline-block;font-size:28px;margin:10px 10px 9px;vertical-align:middle}.fl-icon-field .fl-icon-remove{margin:0 0 0 8px}.fl-builder-hidden-editor{display:none}.fl-builder-settings .wp-switch-editor{border-radius:0;color:#333;margin-top:2px}.fl-builder-settings .mce-toolbar .mce-btn-group .mce-btn{margin:2px 0}.fl-builder-settings .mce-menubtn.mce-fixed-width button{width:100px}.fl-builder-settings .mce-menubtn.mce-fixed-width span{width:100%}.mce-close:active,.mce-close:hover,.mce-toolbar .mce-btn button:active,.mce-toolbar .mce-btn button:hover,.mce-window .mce-btn button:active,.mce-window .mce-btn button:hover{background:0 0;border:none}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:1px!important}.wp-editor-container textarea.wp-editor-area{background:0 0;border:none;padding:10px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.fl-builder-edit form#wp-link{color:#000;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px}.fl-builder-edit form#wp-link #link-options label{display:block;margin-bottom:2px}.fl-builder-edit form#wp-link #link-options label span{padding-right:10px;vertical-align:middle}.fl-builder-edit form#wp-link #link-options input[type=text]{display:inline-block;height:auto;margin:5px 0 0;padding:3px 5px;width:80%}.fl-builder-edit form#wp-link .query-results{top:225px}.fl-code-field{border:1px solid #E6E6E6;border-left:none}.ace_editor,.ace_editor *{font-family:Monaco,Menlo,"Ubuntu Mono","Droid Sans Mono",Consolas,monospace!important;font-size:12px!important;font-weight:400!important;letter-spacing:0!important}.popover[class*=tour-],ul.as-list{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-layout-field-option{border:2px solid #d9d9d9;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;cursor:pointer;float:left;line-height:0;max-width:23%;margin:0 1% 2%;padding:5px}.fl-layout-field-option-selected,.fl-layout-field-option:hover{border-color:red}.fl-layout-field-option img{max-width:100%}.fl-link-field .fl-link-field-input-wrap{display:flex;flex-direction:row}.fl-link-field-input{width:auto!important;flex:1 1 100%}.fl-link-field .fl-link-field-input-wrap button{flex:0 0 0%;height:36px;margin:1px 1px 1px 5px}.fl-link-field-options-wrap{padding:7px 0 0 12px}.fl-link-field-options-wrap label{margin-right:7px}.fl-link-field-options-wrap span{font-size:11px;font-weight:700;color:inherit!important;text-align:center;opacity:.5}.fl-link-field-search{display:none;border:2px solid #e6eaed;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;margin:4px 0 0;padding:10px}.fl-link-field-search-title{display:block;margin:0 0 3px 2px}.fl-link-field-search-cancel{margin-top:6px}.fl-link-field-search input{box-shadow:none!important;width:100%!important;padding:3px 9px!important}.fl-link-field-search #as-original-link-search{width:100%}.fl-field-connections-toggle{padding:10px 0}.fl-field[data-type=editor] .fl-field-connections-toggle{align-items:flex-start}.fl-field[data-type=link] .fl-field-connections-toggle{height:24px;margin-top:1px;align-items:flex-start}.fl-field[data-type=link] .fl-field-connection{bottom:20px}.fl-field-connections-menu[data-field=fl-field-text]{margin-top:30px}.fl-help-tooltip{display:inline-block;position:relative}.fl-lightbox-width-slim .fl-help-tooltip{position:static}.fl-help-tooltip-icon{color:#999!important;padding:5px}.fl-help-tooltip-text{box-sizing:border-box;background:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ccc;-moz-box-shadow:0 0 5px #ccc;-webkit-box-shadow:0 0 5px #ccc;display:none;font-weight:400;left:23px;padding:10px 13px;position:absolute;top:-6px;width:250px;z-index:1000;border-radius:4px}.fl-lightbox-width-slim .fl-help-tooltip-text{top:30px;left:0;width:100%}.fl-form-field[data-preview-text=icon]{display:flex;align-items:center}.fl-form-field-preview-text i{display:inline-block;font-size:18px;line-height:22px;margin-right:10px}.fl-builder-field-actions{padding-left:0!important;padding-right:0!important;text-align:center;width:85px}.fl-builder-field-actions i{color:#999!important;cursor:pointer;font-size:13px!important;line-height:29px!important;width:16px}.fl-builder-field-actions i:hover{color:#000!important}.fl-builder-field-actions i.fl-builder-field-copy,.fl-builder-field-actions i.fl-builder-field-delete{margin-left:5px}.fl-builder-field-actions i.fl-builder-field-move{cursor:move}.fl-builder-field-dd-helper{background:#ccc;height:30px!important;float:left;width:130px!important}.fl-builder-field-dd-zone{border:1px dashed #ccc;height:30px}.fl-builder-field-actions-single .fl-builder-field-delete,.fl-builder-field-actions-single .fl-builder-field-move{display:none!important}.fl-builder-field-multiple .fl-builder-field-actions,.fl-builder-field-multiple .fl-field-control,.fl-builder-field-multiple .fl-field-label{padding-top:2px!important;padding-bottom:2px!important}.fl-builder-field-multiple .fl-builder-field-actions{min-width:70px!important}.fl-builder-field-multiple[data-field=icons] .fl-builder-field-actions{width:70px!important}.fl-builder-field-multiple.ui-sortable-helper .fl-field-control{width:60%}.fl-builder-field-multiple.ui-sortable-helper .fl-builder-field-actions{display:none}.fl-builder-widget-settings input{display:inline-block!important;margin:5px 10px 8px!important}.fl-builder-lightbox-loading{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings .error,.fl-builder-settings input.error{color:#d03436!important}.fl-builder-settings label.error,.fl-builder-settings p.error{color:#d03436;display:block;margin-top:5px}.fl-builder-settings .fl-form-table .fl-field-description{color:#464646;font-style:normal;margin-left:2px}.fl-lightbox .fl-field-connection{right:-1px}.fl-lightbox .fl-field-connection-content{border:2px solid transparent!important;background:#e7ebef!important}.fl-field-connection-content .fl-field-connection-label{color:#676f7a!important}.fl-field-connections-toggle{pointer-events:none;width:20px;right:-25px}.has-scrollbar .fl-field-connections-toggle{right:-22px}.fl-lightbox-width-slim tr[data-type=code] .fl-field-connections-toggle{right:10px}.fl-lightbox-width-slim .fl-code-field{width:90%}.fl-field-connections-toggle-open{transform:none!important}.fl-field-connections-toggle i{pointer-events:auto;color:#abb1ba;font-size:13px!important;transition-property:transform;transition-duration:.15s}.fl-field-connections-toggle-open i{transform:rotate(-45deg)}ul.as-selections{background-color:#fff;border:none;border-radius:4px;box-shadow:none;color:#333;font-size:12px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px;width:auto}ul.as-selections.loading{background:url(../img/ajax-loader-small.svg) 98% center no-repeat}ul.as-selections li.as-selection-item{background:#d4eaf6;border:none;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;font-size:11px;line-height:14px;padding:8px 15px;border-radius:4px;margin:2px}ul.as-selections li.as-selection-item.blur{background:#f4f4f4}ul.as-selections li.as-selection-item a.as-close{line-height:12px}ul.as-selections li.as-original{margin:0}ul.as-selections li.as-original input{height:auto;font-size:12px;margin:0;padding:0;box-shadow:none}ul.as-list{margin:0;font-size:13px;color:#000;background-color:#fff;background-color:rgba(255,255,255,.95);z-index:2;-webkit-box-shadow:0 0 10px rgba(0,0,0,.1);-moz-box-shadow:0 0 10px rgba(0,0,0,.1);box-shadow:0 0 10px rgba(0,0,0,.1);-ms-border-radius:0;-o-border-radius:0;border:none;border:1px solid #dfdfdf;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}ul.as-list span.type{float:right}li.as-message,li.as-result-item{border:none}li.as-result-item.active{background:#e5e5e5;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;color:#333;text-shadow:none}li.as-result-item em{background:0 0!important;color:#333!important;font-size:12px;padding:0!important;font-weight:700}.fl-custom-query-filter{display:none}.fl-custom-query .fl-field[data-type=suggest] select{margin-bottom:5px;width:100%}.fl-builder-service-settings{position:relative}.fl-builder-service-error{color:red!important;padding:15px 0 0}.fl-builder-service-account-delete{color:red!important;margin-left:10px;position:relative;top:2px}.fl-lightbox-width-slim .fl-builder-service-account-delete{display:block;padding-top:7px}#fl-field-visibility_user_capability .fl-field-description,.fl-builder-service-connect-row .fl-field-description{background:#f0f0f0;color:#333!important;display:block;float:none;margin:10px 0 0;padding:10px}#fl-field-visibility_user_capability .fl-field-description a,.fl-builder-service-connect-row .fl-field-description a{color:#21759b!important;text-decoration:underline!important}.fl-ordering-field-option{background:#fff;border:1px solid #dfdfdf;border-radius:3px;cursor:move;margin-bottom:5px;padding:5px 10px}.fl-ordering-field-option .fa{color:#ccc;float:right;line-height:16px}#tiptip_holder{z-index:1000000}#tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#333}#tiptip_holder.tip_bottom #tiptip_arrow_inner{border-bottom-color:#333}#tiptip_holder.tip_right #tiptip_arrow_inner{border-right-color:#333}#tiptip_holder.tip_left #tiptip_arrow_inner{border-left-color:#333}#tiptip_content{background:#333;box-shadow:none}.fl-builder-row-settings .fl-field-responsive-setting input[name=bg_position_custom_right],.fl-builder-row-settings .fl-field-responsive-setting input[name=bg_position_custom_left]{display:none!important}.fl-builder-getting-started-video{line-height:0!important;padding:10px}.fl-builder-getting-started-video iframe{border:none;height:326px;width:100%}.fl-builder-tour-actions .fl-builder-actions-title{font-size:14px!important;line-height:19px}.fl-builder-tour-mask{bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000000}.fl-builder-tour-dimmed{background:rgba(0,0,0,.7);bottom:0;left:0;position:absolute;right:0;top:0}body>.fl-builder-tour-dimmed{position:fixed}.tour-backdrop{z-index:110000}.popover[class*=tour-]{border:1px solid #ccc;border-radius:0;-webkit-box-shadow:0 0 30px rgba(0,0,0,.3);box-shadow:0 0 40px rgba(0,0,0,.3);color:#666;font-size:13px;font-weight:400;line-height:18px;max-width:none;padding:0;width:300px;z-index:100000001}.popover[class*=tour-].bottom>.arrow{border-bottom-color:#ccc}.popover[class*=tour-].bottom>.arrow:after{border-bottom-color:#f7f7f7}.popover[class*=tour-] .popover-title{border-radius:0;color:#333;letter-spacing:normal;text-transform:none}.popover[class*=tour-] .fa-times{color:#b3b3b3;cursor:pointer;font-size:16px;padding:5px;position:absolute;right:3px;top:2px}.popover[class*=tour-] .fa-times:hover{color:#666}.popover[class*=tour-] .popover-content{border-bottom:1px solid #d9d9d9;padding:13px 15px}.popover[class*=tour-] .fl-builder-tour-next{display:block;float:none;width:100%}.popover-navigation button{min-height:36px}.fl-builder-shortcode-mask-wrap{position:relative;pointer-events:none}.fl-builder-shortcode-mask{bottom:-1px;left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fl-builder--search{border:2px solid transparent;position:relative;padding:0;width:54px;transition-property:width;transition-delay:.1s;transition-duration:.15s}.fl-builder--search.is-expanded{border:2px solid #00A0D0}.fl-builder--search input[type=text],.fl-builder--search input[type=text]:focus{background-color:transparent;border:none!important;box-sizing:border-box;width:100%;font-size:16px;text-align:center}.fl-builder--search:before{display:flex;top:0;left:0;align-items:center;justify-content:center;content:"\f002";font:normal normal normal 14px/1 Font Awesome\ 5 Free;text-align:center;width:100%;height:100%;position:absolute;pointer-events:none;color:rgba(128,128,128,.6);font-size:17px;opacity:1;transition-property:opacity;transition-duration:.15s}.fl-builder--main-menu-panel,.fl-builder-ui-keyboard-shortcuts{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-builder--search.has-text:before,.fl-builder--search.is-expanded:before{opacity:0}.fl-builder--search input::-webkit-input-placeholder{color:rgba(128,128,128,0)!important;transition:color .25s}.fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(128,128,128,.4)!important}.fl-builder--search .search-label{cursor:text}.fl-builder--search .search-clear{display:none;padding:10px 10px 10px 30px;color:#a7a7a7;font-size:12px;position:absolute;right:0;top:0;background-color:#eff1f2;background:linear-gradient(to left,#e4e7ea,#e4e7ea 75%,rgba(228,231,234,0))}.fl-builder--search.has-text .search-clear,.fl-builder--search.is-expanded input{display:inline-block}.fl-builder--search:hover .search-clear{color:#888;background-color:#eff1f2;background:linear-gradient(to left,#dadfe5,#dadfe5 75%,rgba(218,223,229,0))}.fl-builder--search.is-expanded{width:246px}@keyframes fl-builder-show-menu-item{from{transform:translateY(10px) scale(.8);opacity:0}to{transform:translateX(0) translateY(0) scale(1);opacity:1}}.fl-builder--main-menu-panel{display:none;box-sizing:border-box;position:fixed;top:calc(45px + 10px);left:10px;width:360px;color:#222;max-height:calc(100% - 66px);border-radius:4px;background:#fff;border:none;border-top:3px solid #00a0d2;box-shadow:0 11px 45px 8px rgba(0,0,0,.1);font-size:14px!important;-ms-user-select:none;user-select:none;z-index:10000009;pointer-events:auto}.fl-builder--main-menu-panel.is-showing,.fl-revision-list-item{display:flex}.fl-builder--main-menu-panel:before,.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items:before{bottom:100%;right:6px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:13px;margin-left:-13px}.fl-builder--main-menu-panel-views{flex:1 1 100%;overflow:auto}.fl-builder--main-menu-panel-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000119}.fl-builder--main-menu-panel .fl-builder--tabs{padding-left:20px;padding-top:15px}.fl-builder--main-menu-panel-view{display:none}.fl-builder--main-menu-panel-view.is-showing{display:block}.fl-builder--main-menu-panel-view-title{font-size:24px;font-weight:600;padding:25px 22px 0;line-height:1;white-space:nowrap}.fl-builder--main-menu-panel-view-title .title-accessory{float:right;color:#b1b1b1}.fl-builder--main-menu-panel-view-title .title-accessory>i{font-size:20px!important;width:25px!important}.fl-builder--main-menu-panel-view-title .title-accessory>i:hover{color:#222}.fl-builder--main-menu-panel-view-title .pop-view{padding:10px;margin-left:-10px;opacity:.5;font-size:25px;font-weight:400;cursor:pointer;background:0 0;outline:0;border:none;color:inherit}.fl-builder--main-menu-panel-view-title .pop-view:focus{outline:0;top:0;background:#E5EAED!important}.fl-builder--main-menu-panel-view-title button{float:right}.fl-builder--menu-item:before{display:block;content:"";float:none;clear:both}.fl-builder--menu-item{color:inherit;text-align:left;box-sizing:border-box;display:block;padding:10px 15px;margin:0 10px;width:calc(100% - 20px);background:0 0;border:none;border-radius:4px;font-size:14px;line-height:1.1;cursor:pointer;opacity:1;text-transform:none}.fl-builder--menu-item .menu-view.view-revisions{opacity:.5;padding-left:5px}.fl-builder--menu-item .menu-event.event-showGlobalSettings,.fl-builder--menu-item .menu-event.event-showLayoutSettings{color:#6bc373;padding-left:5px}.fl-builder--menu-item:hover{background:#eaf1f8;border:none;text-decoration:none;color:#000}.fl-builder--selector-menu .fl-builder--menu-item:hover{background:#fff}.fl-builder--menu-item-accessory{float:right;text-align:center;display:inline-block;min-width:40px;font-size:14px}.fl-builder--menu-item-accessory.view-arrow{font-size:18px}.fl-builder--menu{padding:0;margin:20px 0}.fl-builder--menu hr{margin:8px 0;background:#e6eaed!important;height:1px;border:none}.fl-builder--menu .fl-builder-video-wrap{padding:0 10px 10px}.fl-revision-list-item-text{padding-left:15px}.fl-revision-list-item-date{padding-bottom:5px}.fl-builder--revision-actions{display:none;position:fixed;top:4px;left:4px;z-index:100008;padding:4px 4px 6px;justify-content:center;background:#fff;border-radius:4px}.fl-builder--revision-actions *{margin-right:5px}.fl-builder--revision-actions :last-child{margin:0}.fl-builder--menu-item[data-event=noRevisionsMessage]:hover{background:0 0;box-shadow:none;cursor:default}.fl-no-revisions-message-title{font-weight:700;margin-bottom:10px}.fl-no-revisions-message-text{line-height:22px}.fl-builder--main-menu-panel-view[data-name=history] .fl-builder--menu-item,.fl-builder--main-menu-panel-view[data-name=history] .fl-builder--menu-item:focus{border:none!important;padding:0;margin-bottom:2px}.fl-history-list-item{border:1px solid transparent;border-radius:4px;padding:10px 12px 12px}.fl-history-list-item i.fa-check-circle{display:none}.fl-history-list-item[data-current="1"]{border-color:#D3DADF;display:flex;align-items:center}.fl-history-list-item[data-current="1"] .fl-history-list-item-label{width:100%}.fl-history-list-item[data-current="1"] i.fa-check-circle{display:block}.fl-builder-module-placeholder-message{border:1px dashed #ccc;overflow:hidden;padding:20px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.module-import-wrap{display:flex}.module-import-input{width:100%!important}.module-import-apply{height:35px;margin:1px 1px 1px 5px}.module-import-error{color:red!important;display:none;padding:5px 12px}.fl-field-connections-menu{z-index:999999}.fl-field[data-type=editor] .fl-field-connections-toggle{right:5px!important}.fl-field-connections-inline-toggle{display:inline;color:#9a9b9c;margin-left:6px}.fl-field-connections-inline-toggle i{transition-property:transform;transition-duration:.15s}.fl-field-connections-inline-toggle.fl-field-connections-toggle-open i{transform:rotate(45deg)}.fl-builder-add-ultimate-presets-button,.fl-builder-add-ultimate-rows-button,.fl-builder-pp-add-template-button,.pp-preview-button,.uabb-live-preview-button{display:none!important}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none;background:0 0;transition-property:background;transition-duration:.15s}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-ne,.ui-resizable-nw,.ui-resizable-se,.ui-resizable-sw{width:12px;height:12px}.ui-resizable-se{cursor:se-resize;right:-4px;bottom:-4px}.ui-resizable-sw{cursor:sw-resize;left:-4px;bottom:-4px}.ui-resizable-nw{cursor:nw-resize;left:-4px;top:-4px}.ui-resizable-ne{cursor:ne-resize;right:-4px;top:-4px}.fl-builder-resizable-iframe-fix{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100000000}.fl-builder-panel .ui-resizable-handle:active,.fl-builder-panel .ui-resizable-handle:hover,.fl-lightbox .ui-resizable-handle:active,.fl-lightbox .ui-resizable-handle:hover{background:#00a0d2}.fl-builder-panel .ui-resizable-n,.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-n,.fl-lightbox .ui-resizable-s{height:6px}.fl-builder-panel .ui-resizable-n,.fl-lightbox .ui-resizable-n{top:-3px}.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-s{bottom:-3px}.fl-builder-panel .ui-resizable-e,.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-e,.fl-lightbox .ui-resizable-w{width:6px}.fl-builder-panel .ui-resizable-e,.fl-lightbox .ui-resizable-e{right:-3px}.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-w{left:-3px}.fl-lightbox .ui-resizable-ne,.fl-lightbox .ui-resizable-nw,.fl-lightbox .ui-resizable-se,.fl-lightbox .ui-resizable-sw{background:0 0;border:6px solid transparent}.fl-lightbox .ui-resizable-ne:active,.fl-lightbox .ui-resizable-ne:hover,.fl-lightbox .ui-resizable-nw:active,.fl-lightbox .ui-resizable-nw:hover,.fl-lightbox .ui-resizable-se:active,.fl-lightbox .ui-resizable-se:hover,.fl-lightbox .ui-resizable-sw:active,.fl-lightbox .ui-resizable-sw:hover{background:0 0;border-color:#00a0d2}.fl-lightbox .ui-resizable-ne{border-bottom:none;border-left:none;border-top-right-radius:4px}.fl-lightbox .ui-resizable-nw{border-bottom:none;border-right:none;border-top-left-radius:4px}.fl-lightbox .ui-resizable-se{border-top:none;border-left:none;border-bottom-right-radius:4px}.fl-lightbox .ui-resizable-sw{border-top:none;border-right:none;border-bottom-left-radius:4px}.fl-builder-ui-keyboard-shortcuts{display:none;position:fixed;top:0;left:0;bottom:0;right:0;z-index:999999;justify-content:center;align-items:center;background:rgba(50,50,50,.88);font-size:15px;line-height:1.3;user-select:none}.fl-builder-ui-keyboard-shortcuts.is-showing{display:flex}.fl-builder-ui-keyboard-shortcuts-content{box-sizing:border-box;width:500px;background:#f5f7f9;border-radius:4px;padding:30px 0 0;box-shadow:0 10px 30px rgba(0,0,0,.15)}.fl-builder-ui-keyboard-shortcut-item{display:flex;flex-direction:row;align-items:center;padding:12px 40px}.fl-builder-ui-keyboard-shortcut-item:nth-child(even){background:#eef2f5}.fl-builder-ui-shortcut-keycode{margin-left:auto;text-transform:uppercase;letter-spacing:2px}.fl-builder-ui-keyboard-shortcust-footer{display:flex;flex-direction:row;justify-content:center;padding:10px}.dismiss-shortcut-ui{padding:10px;border-radius:4px;background:#fff;color:#000;font-size:14px;border:2px solid #fff}.dismiss-shortcut-ui:focus,.dismiss-shortcut-ui:hover{top:0;color:#000;background:#eef2f5;border:2px solid #eef2f5}.fl-lightbox .select2-container--default .selection .select2-selection--single,.select2-dropdown{border-color:transparent!important;border-style:solid!important;border-radius:4px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-lightbox .select2-container--default .selection .select2-selection--single{border-width:2px!important;height:36px!important;font-size:13px!important;line-height:15px!important;outline:0}.fl-lightbox .select2-selection--single .select2-selection__rendered{line-height:32px!important;font-size:13px}.fl-lightbox .select2-selection--single .select2-selection__arrow{height:32px}.fl-builder-ui-skin--light .fl-lightbox .select2-selection__rendered,.fl-builder-ui-skin--light .select2-dropdown,.fl-builder-ui-skin--light .select2-search__field{color:grey!important}.fl-builder-ui-skin--light .select2-search__field::placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field::-webkit-input-placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field::-moz-placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field:-ms-input-placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field:-moz-placeholder{color:grey!important}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel,.fl-builder-ui-skin--dark .fl-builder--preview-actions,.fl-builder-ui-skin--dark .fl-builder--search-results-panel,.fl-builder-ui-skin--dark .fl-builder-panel,.fl-builder-ui-skin--dark .fl-lightbox,body.fl-builder-ui-skin--dark .fl-builder-bar .fl-builder-bar-content{background:#23282d;color:#b4b9be;border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-header{color:#b4b9be;border-bottom-color:#1d1d1d;border-top-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-top-color:#1d2227}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel:before{border-bottom-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-arrow polygon{fill:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel-search .fl-builder-panel-search-input{background:#24282e}.fl-builder-ui-skin--dark .fl-responsive-preview-content{background:#131619}.fl-builder-ui-skin--dark .fl-form-table th{background:#23282d!important;color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--preview-actions .device-icons,.fl-builder-ui-skin--dark .fl-builder-button{background:#2c333a}.fl-builder-ui-skin--dark .fl-builder-button:focus{background:#131a22}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-primary{color:#fff!important;fill:#fff!important;background:#00A0D2}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-buy-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-feedback-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-upgrade-button{background-color:#F7A407;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-silent:focus{border:2px solid #00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-bar-title,.fl-builder-ui-skin--dark .fl-user-templates{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{color:#00A0D2!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:hover,.fl-builder-ui-skin--dark .fl-builder--menu>button:hover{background:#101215!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:focus,.fl-builder-ui-skin--dark .fl-builder--menu>button:focus{background:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:#181b1f}.fl-builder-simple.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:transparent}.fl-builder-ui-skin--dark .fl-builder-layout-title{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-bar-title-caret i,.fl-builder-ui-skin--dark .fl-builder-layout-pretitle,.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{color:#7d8690}.fl-builder-ui-skin--dark button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#101215!important}.fl-builder-ui-skin--dark .fl-builder--search:before{color:rgba(162,173,184,.73)}.fl-builder-ui-skin--dark .fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(162,173,184,.73)!important}.fl-builder-ui-skin--dark .fl-builder--search .search-clear{color:rgba(162,173,184,.5);background-color:#e4e4e4;background:linear-gradient(to left,#383f46,#383f46 75%,rgba(56,63,70,0))}.fl-builder-ui-skin--dark .fl-builder--menu hr{background-color:#23282d!important;border:none}.fl-builder-ui-skin--dark .fl-builder--tabs{border-color:#383f46!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing,.fl-builder-ui-skin--dark .fl-builder-settings-tabs a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-more.fl-contains-active{color:#fff!important;fill:#fff!important;background:#181b20!important}.fl-builder-ui-skin--dark .fl-builder--tabs :focus{background-color:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing:focus{color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder--menu-item:hover{background:#383f46;color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--menu * .fl-builder--menu-item-accessory,.fl-builder-ui-skin--dark .fl-builder-blocks-section-group-name{color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--selector-display{color:#c6cdd6;background:url(../img/svg/select-arrow-down-alt2-light.svg) center right 10px no-repeat #1a1b22!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label{color:#b5becb}.fl-builder-ui-skin--dark .fl-builder-panel-search-input input{border-color:#5b656f;color:#b8c2ce;background:#171b1f!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label:focus,.fl-builder-ui-skin--dark .fl-builder-panel-search-input input:focus{border-color:#00a0d2}.fl-builder-ui-skin--dark .fl-builder--group-label{color:#aaafb5!important;background:#24282e}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu{border-color:#101215!important;color:#7c858e;background-color:#101215}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu:before{border-bottom-color:#101215}.fl-builder-ui-skin--dark .fl-builder--menu>a,.fl-builder-ui-skin--dark .fl-builder--menu>button,.fl-builder-ui-skin--dark .fl-builder--menu>span{color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:hover{background:#23282d!important;color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:focus{background:#23282d!important;color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-panel-drag-handle{fill:#5b656f}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-header,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-header,.fl-builder-ui-skin--dark .fl-builder-settings-section-header{background-color:#191b21;border-color:#191b21}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-name,.fl-builder-ui-skin--dark .fl-builder--user-templates-section-name,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-title,.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title{color:#7d8690!important;fill:#7d8690;background:#24282e}.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title:focus{border-color:#7d8690}.fl-builder-ui-skin--dark .fl-builder-blocks-section-content .fl-builder-block,.fl-builder-ui-skin--dark .fl-user-template{color:#b8c2ce}.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-content,.fl-builder-ui-skin--dark .fl-user-template:hover{background:#171b1f;color:#fff}.fl-builder-ui-skin--dark .fl-builder-block:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover i{color:#6d7782!important}.fl-builder-ui-skin--dark .fl-builder-block:hover a:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover a:hover i{color:#9eacbb!important}.fl-builder-ui-skin--dark .fl-builder-block .fl-builder-block-icon{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col,.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#7d8690}.fl-builder-ui-skin--dark .fl-builder--template-thumbnail{border-color:#393f44}.fl-builder-ui-skin--dark .fl-builder--menu a.fl-template-collection{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-lightbox .fl-lightbox-header h1{color:#fff!important}.fl-builder-ui-skin--dark .fl-form-table th label{color:#a8b3bf!important}.fl-builder-ui-skin--dark .fl-builder-settings-tabs{background-color:#2c333a!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields h3.fl-builder-settings-title{background:#24282e}.fl-builder-ui-skin--dark h3.fl-builder-settings-title .fl-builder-settings-title-text-wrap{color:#a8b3bf;background-color:#1b2025}.fl-builder-ui-skin--dark .fl-lightbox :not(i){color:#a7b1bb!important}.fl-builder-ui-skin--dark .fl-builder-button{color:#c6cdd6!important;fill:#c6cdd6!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{fill:#00A0D2!important}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-button.fl-builder-button-primary{color:#fff!important}.fl-builder-ui-skin--dark .fl-color-picker-color.fl-color-picker-empty{background:#1a1b22}.fl-color-picker-color.fl-color-picker-empty .fl-color-picker-icon{fill:#6f7881}.fl-builder-ui-skin--dark .fl-color-picker-clear{background-color:#121a23}.fl-builder-ui-skin--dark .fl-color-picker-clear:hover{background-color:#373f46}.fl-builder-ui-skin--dark span.fl-builder-block-no-node-templates:hover{background:#1d2025}.fl-builder-ui-skin--dark .fl-builder-settings-tab-description{background:#1d2227}.fl-builder-ui-skin--dark .fl-builder-custom-field,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url],.fl-builder-ui-skin--dark .fl-builder-settings-fields select,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea,.fl-builder-ui-skin--dark .fl-lightbox .select2-selection__rendered,.fl-builder-ui-skin--dark .select2-dropdown{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-builder-panel-search button svg .filled-shape{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields select:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea:focus{border-color:#00a0d2!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields select{background-image:url(../img/svg/select-arrow-down-alt2-light.svg)!important}.fl-builder-ui-skin--dark .fl-lightbox .select2-container--default .selection .select2-selection--single{border-color:#181b20!important}.fl-builder-ui-skin--dark .select2-search__field{background-color:#2c333a!important}.fl-builder-ui-skin--dark .fl-builder-custom-field select,.fl-builder-ui-skin--dark .fl-photo-field select{border-color:#7d8690!important}.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle{color:#6b747d}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel-view-title,.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle:hover{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--saving-indicator{color:#858f99}.fl-builder-ui-skin--dark .fl-icons-list i:hover{background-color:#16191d;color:#fff}.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:after,.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:before{background:#6f7881}.fl-builder-ui-skin--dark .fl-builder--user-templates-section-content{border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button{background:0 0;border-right-color:#101215!important}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button:hover{background:#181b1f}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu{background:#131a22;border-color:#353c43 #131a22 #131a22}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu:before{border-bottom-color:#353c43}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:focus,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover{background:#383f46}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover.fl-active{color:#fff!important;background:#383f46}.fl-builder-ui-skin--dark ul.as-selections{background-color:#121a23}.fl-builder-ui-skin--dark .fl-custom-query .fl-builder-settings-section{border-top:2px solid #1b2026!important}.fl-builder-ui-skin--dark div.fl-field-unit-select{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-dimension-field-units>*{border-right:1px solid #383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider,.fl-builder-ui-skin--dark .fl-field-popup-slider-input .ui-slider-handle{background:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-arrow:after{border-bottom-color:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-input{background-color:#121a23}.fl-builder-ui-skin--dark .fl-unit-field-input{border-right:1px solid #383f46!important}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"]{background-color:#383f46!important;color:#fff}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"] i{color:#fff!important}.fl-builder-ui-skin--dark .fl-button-group-field-options{background:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle{background-color:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle:hover{background-color:#383f46}.fl-builder-ui-skin--dark .fl-compound-field-section-visible .fl-compound-field-section-toggle{border-top-color:#121a23!important;background-color:transparent}.fl-builder-ui-skin--dark .fl-field-connections-toggle i{color:#7c8590}.fl-builder-ui-skin--dark .fl-lightbox .fl-field-connection-content{background-color:#191b20!important}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#181b20}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane:hover>.fl-nanoscroller-slider{background-color:#5a646f}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#00A0D2}.fl-builder-ui-skin--dark .fl-lightbox div.mce-panel{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox .mce-toolbar .mce-ico{color:#a7b1bb}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary{background:#383f46;border:none;box-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-settings .wp-switch-editor{background:#23282d}.fl-builder-ui-skin--dark .fl-lightbox .html-active .switch-html,.fl-builder-ui-skin--dark .fl-lightbox .quicktags-toolbar,.fl-builder-ui-skin--dark .fl-lightbox .tmce-active .switch-tmce{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox textarea.wp-editor-area{background:0 0!important}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:hover{background:#191b20}
|
1 |
+
.fl-color-picker-ui{width:300px}.fl-color-picker-ui.fl-color-alpha-enabled{width:334px}.fl-color-picker-ui .iris-picker{float:left;width:100%;height:224px;display:block;position:relative;border-top:1px solid rgba(0,0,0,.1)}.fl-color-picker-ui .iris-picker .iris-square-inner,.fl-color-picker-ui .iris-picker-inner{position:absolute;left:0;top:0;bottom:0;right:0}.fl-color-picker-ui .iris-picker,.iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.fl-color-picker-ui .iris-error{background-color:#ffafaf}.fl-color-picker-ui .iris-picker .iris-square{width:300px;height:200px}.fl-color-picker-ui .iris-picker .iris-palette,.fl-color-picker-ui .iris-picker .iris-slider,.fl-color-picker-ui .iris-picker .iris-square-inner{height:100%;width:12.5%}.fl-color-picker-ui .iris-picker .iris-placeholder,.fl-color-picker-ui .iris-picker .iris-square{position:relative}.fl-color-picker-ui .iris-picker .iris-square-inner{width:auto;margin:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square,.fl-color-picker-ui .iris-ie-9 .iris-square-inner{box-shadow:none;border-radius:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square{outline:rgba(0,0,0,.1) solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-palette,.fl-color-picker-ui .iris-ie-lt9 .iris-slider,.fl-color-picker-ui .iris-ie-lt9 .iris-square,.fl-color-picker-ui .iris-ie-lt9 .iris-square-inner{outline:#999 solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-square .ui-slider-handle{outline:#999 solid 1px;background-color:#fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.fl-color-picker-ui .iris-ie-lt9 .iris-square .iris-square-handle{background:0 0;border:3px solid #fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.fl-color-picker-ui .iris-picker .iris-strip{box-sizing:border-box;width:calc(300px - 12px);margin:5px 6px 6px;border-radius:4px;position:relative;height:22px;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle{width:6px;position:absolute;right:0;top:-2px;bottom:-2px;margin:0;border-radius:3px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.5);z-index:5;cursor:ew-resize}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle:focus{outline:#00a0d2 solid 2px}.fl-color-picker-ui .iris-picker .iris-slider-offset{position:absolute;top:0;left:6px;right:0;bottom:0;width:auto;height:auto;background:0 0;border:none;border-radius:0;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-square-handle{background:0 0;border:5px solid #999;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.fl-color-picker-ui .iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover{border-color:#999}.fl-color-picker-ui .iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover::after{border-color:#fff}.fl-color-picker-ui .iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.fl-color-picker-ui .iris-picker .iris-square-value{width:0;height:0;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.fl-color-picker-wrapper{position:relative;width:48px;height:32px}.fl-color-picker{box-shadow:0 2px 4px 0 rgba(0,0,0,.12);background:url(../img/transp_bg.png) #fff;border-radius:4px;width:120px;height:36px;display:flex;flex-direction:row}.fl-color-picker-color{flex:1 1 100%;box-sizing:border-box!important;position:relative;border-radius:4px;background-color:transparent;cursor:pointer;border:2px solid transparent;padding:0;justify-content:center;display:flex}.fl-color-picker-clear:hover,.fl-color-picker-color:hover{background:0 0;border:2px solid transparent}.fl-color-picker-clear:focus,.fl-color-picker-color.fl-color-picker-empty:focus,.fl-color-picker-color:focus{outline:0;top:0;border:2px solid #00a0d2;background:0 0}.fl-color-picker.fl-color-picker-has-reset .fl-color-picker-color:not(.fl-color-picker-empty){border-top-right-radius:0;border-bottom-right-radius:0}.fl-color-picker-icon{display:none;margin:auto}.fl-color-picker-color.fl-color-picker-empty{border-color:transparent;background-color:transparent}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon{display:block}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon path{fill:inherit}.fl-color-picker-clear{box-sizing:border-box;position:relative;display:flex!important;flex:0 0 36px;justify-content:center;padding:0;border:2px solid transparent;fill:#A2AABE;background-color:#E7EBEF!important;cursor:pointer;align-items:center;border-radius:0 4px 4px 0}.fl-color-picker-clear:hover{fill:#6B6E75;background-color:#E7EBEF}.fl-color-picker-color.fl-color-picker-empty+.fl-color-picker-clear{display:none}.fl-color-picker-ui{display:inline-block;font-family:Helvetica,Verdana,sans-serif;z-index:1;position:fixed;overflow:hidden;padding-bottom:45px;border:1px solid rgba(0,0,0,.1);color:#999;background-color:#FAFAFA;border-radius:3px;-webkit-box-shadow:0 9px 20px rgba(0,0,0,.17);box-shadow:0 9px 20px rgba(0,0,0,.17);-webkit-transition:opacity .2s,visibility .2s;-moz-transition:opacity .2s,visibility .2s;-ms-transition:opacity .2s,visibility .2s;-o-transition:opacity .2s,visibility .2s;transition:opacity .2s,visibility .2s;visibility:hidden;opacity:0;-webkit-transform:translate3d(0,0,0)}.fl-builder--search-results-panel,.fl-builder-panel,.fl-lightbox :not(i){font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-color-picker-ui.fl-color-picker-active{visibility:visible;opacity:1;z-index:999999}.fl-color-picker-ui .fl-color-picker-input,.fl-color-picker-ui .fl-color-picker-input:focus{width:100%;height:30px;border:none!important;font-size:14px!important;padding:0 8px;vertical-align:middle;color:#656c6e;background-color:#fff;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.fl-color-picker-ui .iris-square-value{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.fl-color-picker-preset-add{position:absolute;top:8px;right:8px;width:14px;height:14px;background-color:#656c6e;border-radius:50%;cursor:pointer;-webkit-transition:all .2s;-moz-transition:all .2s;-ms-transition:all .2s;-o-transition:all .2s;transition:all .2s}.fl-color-picker-preset-add:hover{background-color:#333}.fl-color-picker-preset-add:after,.fl-color-picker-preset-add:before{content:'';display:block;position:relative;background-color:#fff}.fl-color-picker-preset-add:before{top:6px;left:3px;width:8px;height:2px}.fl-color-picker-preset-add:after{left:6px;top:1px;width:2px;height:8px}.fl-color-picker-presets{position:absolute;left:0;bottom:0;width:100%;z-index:15;overflow:auto;border-top:1px solid rgba(0,0,0,.1);background-color:#FAFAFA}.fl-color-picker-presets-list .fl-color-picker-preset:hover,.fl-color-picker-presets-toggle:hover{background-color:#EDEDED}.fl-color-picker-presets-toggle{position:relative;overflow:hidden;width:100%;height:35px;text-align:center;line-height:35px;font-size:12px;font-weight:700;cursor:pointer;-webkit-transition:all .1s;-moz-transition:all .1s;-ms-transition:all .1s;-o-transition:all .1s;transition:all .1s}.fl-color-picker-presets-close-label,.fl-color-picker-presets-open-label{position:absolute;top:50%;left:50%;visibility:hidden;color:#999;-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;width:100%}.fl-color-picker-presets-close-label.fl-color-picker-active,.fl-color-picker-presets-open-label.fl-color-picker-active{color:#656c6e;visibility:visible;opacity:1;z-index:999999}.fl-color-picker-presets-list{width:100%;list-style:none;margin:0;padding:0;overflow:auto}.fl-color-picker-presets-list .fl-color-picker-no-preset,.fl-color-picker-presets-list .fl-color-picker-preset{position:relative;padding:5px;font-size:12px;border-top:1px solid rgba(0,0,0,.1);-webkit-transition:all .1s;-moz-transition:all .1s;-ms-transition:all .1s;-o-transition:all .1s;transition:all .1s}.fl-color-picker-presets-list .fl-color-picker-no-preset{padding:18px 5px;text-align:center}.fl-color-picker-presets-list .fl-color-picker-preset-color{display:inline-block;width:40px;height:20px;margin-right:3px;vertical-align:middle;border:1px solid rgba(0,0,0,.1);border-radius:2px;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-label{vertical-align:middle;color:#333;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-remove{position:absolute;top:50%;cursor:pointer;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}.fl-color-picker-clear .fl-color-picker-icon-remove{right:auto;top:auto;margin:auto}.fl-color-picker-presets-list .fl-color-picker-preset-remove{right:5px}.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:after,.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:before{background-color:#333}.fl-color-picker-added{position:absolute;width:100%;top:0;left:0;right:0;bottom:35px;z-index:10;color:#fff;text-align:center;background-color:rgba(0,0,0,.8)}.fl-color-picker-added-text{position:absolute;top:50%;left:50%;width:80%;font-size:14px;color:#fff!important;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.fl-color-picker-icon-check{position:relative;width:50px;height:50px;margin:5px auto}.fl-color-picker-icon-check:before{content:'';display:block;position:relative;width:15px;height:30px;margin-left:14px;border:7px solid #fff;border-left:none;border-top:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.fl-color-picker-icon-arrow-down,.fl-color-picker-icon-arrow-up{display:inline-block;position:relative;width:10px;height:10px;margin-left:5px}.fl-color-picker-icon-arrow-down:before,.fl-color-picker-icon-arrow-up:before{content:'';display:block;position:relative;width:6px;height:6px;border:2px solid #999;border-left:none;border-top:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.fl-color-picker-icon-arrow-up{top:2px;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fl-color-picker-icon-remove{width:15px;height:15px}.fl-color-picker-icon-remove:after,.fl-color-picker-icon-remove:before{content:'';display:block;position:relative;background-color:#6f7881}.fl-color-picker-icon-remove:before{left:6px;width:2px;height:10px;margin-top:3px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.fl-color-picker-icon-remove:after{left:6px;width:2px;height:10px;margin-top:-10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.fl-alpha-wrap{position:absolute;width:32px;height:215px;padding:0 5px;right:4px;border-top:none}.fl-alpha-slider{height:190px;position:absolute;top:12px;width:28px}.fl-alpha-slider .ui-slider-handle{background:rgba(0,0,0,0);border-color:#aaa;border-radius:4px;border-style:solid;border-width:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);cursor:ns-resize;height:12px;left:0;opacity:.9;position:absolute;right:0;width:30px;z-index:14}.fl-alpha-slider .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.fl-alpha-slider-offset{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAASCAYAAAAe/ZHXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQUQ0ODM4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQUQ0ODQ4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RBRDQ4MThFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RBRDQ4MjhFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/r/N8AAAWYSURBVHjarFvvR3VBEN45JZGIPkREHyIiIhJJf3qUSERE9CGiDxERkcg9z9u92uucvTszz5z7xnHPj93Z2d359cxscn5+jpTS+EoiMr3/+51cZ2dn4+e29i2/u7y8RKf/pO3vc+o+n5ycoNK31+f6+jrfZ37yuG2mf3R01H3fa5N/b29vU6dP5qft0G4PDg5MGuPr/v4+jz1t27mfvN/b21P75+fHx8eZfiV/Ozs7rUJnSu/5+RlFv+m6ZJpbW1s1PnrvXl9fZ/qX89zY2LB4mfy+v7/nsdV1XltbK/dr5vnz87OcV5bJabuVlRVLBifjfX9/l/xkGtM+S0tLNXnu0szfU/P3IMn/k0678h6ddqjQFGccVL6hoCsVfsq+NZ5QtCv5rfFS41sq37W+UPhMyhxEWTetvce3NR8oewqD39qalXuGAK/WPltjajIC4x2c9Ye1f43SGcqGwRBeTZjhMNntL4pCWZMQYhE05RVl02EovRgC4RkCbUNSQAGhGB/GsKG4h6FQoigDa2i8fRBy3uLMXYIG3Vr3aZvRaCRdBYlYIMZywhBGCVhgzzOlgRuUSOvC0GMEWxOM/+EtQFh1OIIXtfwg1tRaayGjg5px0jyZKEaTle3e+AsLCygVRAh3FlEgKbReE3oYGj9EgIR00QiEgKw3ZBQbRGjBeAMtDETQmHiKDsezJNLgCTFGItZXlAgCSiQggblP+9c8SDI0lXWlFv5g3K63KZ51FOcZzthQ3LomoNHwJmKIQISI3vqzSpwIQ8liSjGMFQjDpoVgaQ6cWgvLhOC7qiAwiHrWbEg4JMSmeUrBuHoYwioOQNXmhmAcrs096s1gJCGi3hSEVU8DQxYElYHhKwUUGAa+NqOBMsSSAQJuhQhCAH4vxozExsxiihPuaIrjCVYKWlYEsjSM52G8Kxxryngl5j0j+EyGTIiED4s1Itm0ZGWxMFCLJaBAcEI6OBkmFgNBoc8Cait2ZnENE/6wQN8LJSJeSMNAjKVm+LUMAIt3PR5AQgIGp1Z5zxhE8PtXUYReYeXi4mKmOPNXBMzt2tPT07LIUtJqr66uusXEbkFnWiQ6Pj72ikrtzc1NKopuvbbj58PDwxqNHp27u7tuYWumUDV+v7+/Xyu6pc59+/DwUCsC9ujt7u6qRbt8//T01C3elbyN70fb29uZ/1FSincvLy/lPGb42tzc9IqJeHt7q61Pr2C6vr7u7tfHx8fMPhV0sLq6WhZtU0n36+uru8elPE7aLi8v1wqJPXn++fmZKYgX8ozFxcXJb0NaQTHClZT8+gBjsYdaFc+zWcUkGTCWENY66ta92oSVzo3WI6IZKGtukeyfBLFKBNAj6bUOBgaoe9wE4n04IBNkLMoC7+Skj630ZlTJMYdyMsU2T8AwpzALkVFilZgJcT2l9PCWDDSAMBSjVlJgZNk0lE1AIby0qCiCnBQNj6aBGQslZIZJ5hB6D/AzQHto5Z9Nk8tARdN4q2ExBnsyIJ311EymShyjan2rKk0zh1Ay1oQVWAZQRnkUA8RFw7TahjBnmNgMVMQrsCGZJezRtGlU0cUZ1zuaxGZPpbhApM+ZpFQqQ6xadoMtBrEKpBVo4GRXvNSxpaRixKiR+TChCYhsDwZkfFj8IkErjAHejcUI0XQrgwehhNSMHAz21E0wZ23FcCAmj8Sd/PXy2xLYLAuwRw4IMsqjFaWYOpMEhDySAPFCWyFkgAHrEcA+BNeJ4UE8HCzJPpCrerUmQIx1pWJkjqxJD8EikUo2c5aI8ZYgsAkM4WQtnHd0ns0ORgVTBghy5ISy928SGsbTMqYg523RUY8oNYG4FIYiyRyZCnFCJC87IoRAIMVOqQ7BKexxCS2hYVl9JhvlpYjnAe4MhmRPMWhhvLfXINaI9WKM0Zu0+SfAAFLE1EgfVSv7AAAAAElFTkSuQmCC) center;box-shadow:0 0 5px rgba(0,0,0,.4) inset;-moz-box-shadow:0 0 5px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 5px rgba(0,0,0,.4) inset;width:200px;height:22px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg);bottom:48%;left:-80px;position:absolute}.fl-alpha-text{width:30px;font-size:12px;text-align:center;color:#999;position:absolute;bottom:-5px}.fl-lightbox-mask,.fl-lightbox-wrap{bottom:0;left:0;position:fixed;right:0;z-index:100010}@keyframes fl-lightbox-zoom{from{transform:scale(.4)}to{transform:scale(1)}}.fl-lightbox-wrap{display:none;overflow:auto;padding:0;top:43px;-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);pointer-events:none}.fl-builder-draggable-is-dragging .fl-lightbox-wrap,.fl-builder-resizable-is-resizing .fl-lightbox-wrap,.fl-lightbox,.fl-lightbox-mask{pointer-events:auto}.fl-lightbox-mask{background:#000;opacity:.7;filter:alpha(opacity=70);top:0}.fl-lightbox{background:#F5F7F9;border-radius:4px;box-shadow:rgba(0,0,0,1) 0 4px 30px;-moz-box-shadow:rgba(0,0,0,1) 0 4px 30px;-webkit-box-shadow:rgba(0,0,0,1) 0 4px 30px;position:relative;display:flex;z-index:100011;transform-origin:center;animation-name:fl-lightbox-zoom;animation-duration:.25s}.fl-lightbox.fl-lightbox-prevent-animation{animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-lightbox :not(i){color:#333;font-size:12px;line-height:14px;text-decoration:none;text-transform:none}.fl-lightbox *,.fl-lightbox :after,.fl-lightbox :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}#fl-ui-root .fl-nanoscroller-pane,.fl-builder--content-library-panel .fl-nanoscroller-pane,.fl-lightbox .fl-nanoscroller-pane{bottom:2px;right:2px;width:6px}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#bac0ca;transition-property:height,background-color;transition-duration:.25s}#wpadminbar,html{transition-duration:.35s}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider:hover{background-color:#c8cdd4}.fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#029fd2}.fl-lightbox .dashicons{font-family:dashicons}.fl-lightbox.ui-draggable{box-shadow:rgba(0,0,0,.2) 0 7px 30px;-moz-box-shadow:rgba(0,0,0,.2) 0 7px 30px;-webkit-box-shadow:rgba(0,0,0,.2) 0 7px 30px}.fl-lightbox-resizable{height:500px;width:380px}@media (max-width:500px){.fl-lightbox-resizable{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-resizable .ui-resizable-handle{display:none!important}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:default!important}.fl-lightbox-controls{display:none}}.fl-lightbox-width-full{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-width-full .fl-lightbox-header{cursor:inherit!important}.fl-lightbox-controls{position:absolute;right:10px;top:10px;z-index:5}.fl-lightbox-controls .fa{color:#bdbdbd;font-size:14px;padding:5px}.fl-lightbox-controls .fa:hover{color:#aaa;cursor:pointer}.fl-lightbox-header-wrap{border-top-left-radius:4px;border-top-right-radius:4px}.fl-lightbox-header{position:relative}.fl-builder-settings-lightbox .fl-lightbox-header h1:before{content:none!important}.fl-theme-builder-preview-select-title i:before,body .fl-theme-builder-preview-select .fa-caret-down i:before,body .fl-theme-builder-preview-select-item-title i:before{content:"\f078"}.fl-lightbox-header h1{color:#333!important;font-size:16px!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;font-weight:400!important;margin:0!important;padding:14px 34px 15px 28px!important;text-align:left!important;display:flex;flex-direction:row;align-items:center;line-height:1;letter-spacing:0}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:move}.fl-lightbox-header h1 .fl-builder-badge{margin-left:10px;color:#fff;background-color:#F7A408}.fl-lightbox-content,.fl-lightbox-content-wrap{display:flex;flex-direction:column;flex:1 100%;max-width:100%}.fl-lightbox-footer{box-sizing:border-box;display:flex;flex-direction:row;justify-content:flex-end;flex:0 0;flex-basis:44px;padding:4px;text-align:right}.fl-lightbox-footer .fl-builder-button{height:36px;margin-left:5px!important;flex:0 0 0%;justify-content:center}.fl-lightbox-width-slim .fl-lightbox-footer{justify-content:stretch;padding:4px 5px}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button{flex:1 1 100%;display:block;text-align:center}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button:first-child{margin-left:0!important}.fl-lightbox table,.fl-lightbox td,.fl-lightbox th,.fl-lightbox tr{border:none}.fl-lightbox-wrap.fl-icon-selector{z-index:1000111}.fl-icon-selector .fl-lightbox{height:100%}.fl-icons-filter{height:auto!important;margin:0!important;position:absolute!important;right:0;top:0;padding:10px 16px;display:flex;flex-direction:row}.fl-icons-filter select{vertical-align:middle;width:195px;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;color:#000;border:2px solid #e4e7ea!important;border-right:none!important;margin:0;padding:2px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;flex:1 1 195px;border-radius:0}.fl-icons-filter input[type=text]{line-height:18px;vertical-align:middle;width:160px;flex:1 1 160px;border:2px solid #e4e7ea!important;border-radius:0!important;padding:2px 10px!important}.fl-icons-filter input[type=text]:focus,.fl-icons-filter select:focus{border:2px solid #00A0D2!important}.fl-icons-list{bottom:52px;left:0;overflow:auto;padding:20px;position:absolute;right:0;top:48px}.fl-icons-list::-webkit-scrollbar{background-color:#ccc;-webkit-appearance:none;width:10px}.fl-icons-list::-webkit-scrollbar-thumb{background-color:#666;border:1px solid #ccc}.fl-icons-section{text-align:center}.fl-icons-section h2{border-bottom:1px solid #dfdfdf;color:#333!important;font-family:Helvetica,Verdana,sans-serif!important;font-size:16px!important;font-weight:700!important;margin:0 0 20px!important;padding:0 0 10px!important;text-align:left}.fl-builder-button,.fl-responsive-preview-message,a.fl-builder-button,body .fl-builder-bar .fl-builder-bar-content,button.fl-builder-button{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-icons-list i{cursor:pointer;display:inline-block;font-size:40px;height:60px;line-height:60px;width:60px;background:0 0}.fl-icons-list .dashicons-before:before{font-size:40px;vertical-align:unset;width:40px}.fl-icons-list i:hover{background:#fff;box-shadow:0 10px 20px rgba(0,0,0,.15);border-radius:4px}.fl-icon-selector-footer{bottom:0;left:0;position:absolute;right:0}html{transition-property:margin}html.fl-builder-is-showing-toolbar{margin-top:calc(44px + 1px)!important}.fl-builder-edit body{position:static!important}.fl-builder-edit:after,.fl-builder-edit:before{z-index:0!important}.fl-builder-edit .fl-builder-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.fl-builder-bar,.fl-builder-button,a.fl-builder-button,button.fl-builder-button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-khtml-user-select:none;-webkit-touch-callout:none}#wpadminbar{transition-property:transform,opacity;transform-origin:bottom;transform-style:preserve-3d;transform:rotateX(89deg) translateY(46px);opacity:0;pointer-events:none;will-change:transform}html.fl-builder-show-admin-bar{margin-top:32px}html.fl-builder-show-admin-bar #wpadminbar{transform:rotateX(0) translateY(0);pointer-events:auto;opacity:1}@media screen and (max-width:782px){html.fl-builder-show-admin-bar{margin-top:46px}}.fl-clear{clear:both}.screen-reader-text{position:absolute;left:-1000em;top:-1000em;height:1px;width:1px;overflow:hidden}.fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(240,240,240,.8);bottom:0;display:none;left:0;position:fixed;right:0;text-align:center;top:0;z-index:12000000}.fl-builder-settings .fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(255,255,255,.8);display:block;position:absolute}.fl-field-loader{color:#B3B3B3!important;font-style:italic}.fl-builder-node-loading{opacity:.35!important}.fl-builder-node-loading-placeholder{background:url(../img/ajax-loader.svg) center center no-repeat;height:50px}.fl-col-group-has-child-loading{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.fl-col-group-has-child-loading>.fl-builder-node-loading-placeholder{width:50px}.fl-node-hidden{display:none}.fl-builder-edit .fl-node-hidden{display:block}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-mobile{display:block!important}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-mobile{display:flex!important}.fl-responsive-preview-enabled body{overflow:hidden!important}.fl-responsive-preview-mask{background:#F7F7F7;bottom:0;left:0;position:fixed;right:0;top:0;z-index:99999}.fl-responsive-preview{bottom:0;left:0;position:fixed;right:0;top:0;margin-top:50px;z-index:100000}.fl-builder-preview .fl-responsive-preview{margin:0!important}.fl-responsive-preview-content{background:#F5F7F9;padding:20px 20px 45px;overflow:scroll;position:absolute;top:45px;right:0;bottom:0;left:0}.fl-responsive-preview-content .fl-builder-content-editing{overflow:visible!important}.fl-responsive-preview-message{background:#F5F7F9;color:#b3b3b3;font-size:14px;font-weight:400;padding:15px;text-align:center;position:absolute;top:0;left:0;right:0;z-index:999999}.fl-responsive-preview-message span{display:inline-block;margin-right:8px}.fl-responsive-preview-message .size{position:absolute;right:30px;font-size:16px}.fl-responsive-preview-message .fl-builder-button{display:inline-block;margin-left:2px;padding:0 10px}.fl-responsive-preview-message .fl-builder-button i{font-size:14px;height:14px;width:14px}.fl-responsive-preview .fl-builder-content{box-shadow:0 0 8px rgba(0,0,0,.2);margin-left:auto;margin-right:auto;max-width:100%;overflow:visible;position:relative}#fl-builder-preview-frame,#fl-builder-preview-mask{bottom:0;height:100%;position:fixed;top:0;width:100%;right:0}.fl-responsive-preview .fl-block-col-resize{display:none}#fl-builder-preview-mask{background:url(../img/ajax-loader.svg) center center no-repeat #F7F7F7;left:0;z-index:999999}#fl-builder-preview-frame{left:50%;transform:translateX(-50%);-moz-transform:translateX(-50%);-webkit-transform:translateX(-50%);z-index:1000000}body button[class*=fl-builder],body button[class*=fl-builder]:focus,body button[class*=fl-builder]:hover{box-shadow:none;max-height:none;max-width:none;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;letter-spacing:normal}.fl-builder-button,a.fl-builder-button,button.fl-builder-button{-webkit-appearance:none;align-items:center;background:#e7ebef;border:2px solid transparent;border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;color:#676F7A!important;cursor:pointer;display:flex;fill:#676F7A!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:33px;letter-spacing:normal!important;line-height:1!important;margin:0;padding:0 12px;text-align:center;transition-property:background-color,width;transition-duration:.2s;white-space:nowrap;width:auto;user-select:none}.fl-builder-button:hover{background:#dadfe5;color:#222;border:2px solid transparent!important}.fl-builder-button:active{background:#DCDCDC}button.fl-builder-button:focus{position:static;top:auto;outline:0;background:#E4E7EA;border:2px solid #00A0D0!important}.fl-builder-button-primary,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button{background:#00A0D2;color:#fff!important;text-decoration:none;border:2px solid transparent!important}.fl-builder-button.fl-builder-button-primary:focus,body.fl-builder--layout-has-drafted-changes .fl-builder-button.fl-builder-done-button:focus{background:#00A0D2;border:2px solid #ffc217!important}.fl-builder-button-primary:hover,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:hover{background:#0197C6;color:#fff!important}.fl-builder-button-primary:active,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:active{background:#0484AC}.fl-builder-button-large{height:30px}.fl-builder-button-small{font-size:11px!important;line-height:1!important}.fl-builder-help-button{color:#b3b3b3;font-size:16px!important}.fl-builder-help-button i{position:relative;top:-1px}.fl-builder-help-button:hover{color:#666}.fl-builder-publish-button{line-height:45px!important}button.fl-builder-content-panel-button,button.fl-builder-content-panel-button:hover{fill:#00A0D2!important;font-size:30px!important;padding:2px 4px!important}.fl-builder-button-silent,.fl-builder-button-silent:hover{min-width:40px;padding:0 4px!important;background:0 0!important;border:2px solid transparent!important;box-shadow:none!important;display:inline-flex;flex-direction:row;justify-content:center}.fl-builder-done-button,.fl-builder-done-button:hover{font-weight:600}.fl-field .fl-builder-button{display:inline-block;height:auto;padding:11px 12px;vertical-align:middle;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-builder-button svg{max-width:none}.fl-builder-edit .media-modal-content button,.fl-builder-settings-fields button{letter-spacing:normal}.fl-builder-badge{background:#333;border-radius:2px;color:#fff!important;display:inline;font-size:11px!important;font-weight:400;letter-spacing:1px;margin-left:2px;padding:2px 4px;vertical-align:middle}.fl-builder-badge-global{background:#ff9600;transform:translateY(0);transition-duration:.25s;transition-property:transform}.fl-builder-blocks-node-template .fl-builder-badge-global{position:absolute;right:0;top:0}.fl-builder-block:hover .fl-builder-badge-global{display:none}.fl-builder-bar{left:0;position:fixed;right:0;top:0;z-index:999999;user-select:none;transition-property:transform opacity;transition-duration:.35s;transform-style:preserve-3d;-webkit-perspective:1100px;-moz-perspective:1100px;perspective:1100px}.fl-builder-bar.is-hidden{pointer-events:none}.fl-builder-bar.is-hidden .fl-builder-bar-content{transform:translateY(-100%) rotateX(90deg)}body .fl-builder-bar .fl-builder-bar-content{display:flex;box-sizing:border-box;background:#fff;border-bottom:1px solid #eceef1;color:#999;font-size:14px!important;height:calc(44px + 1px);transition-property:background-color,opacity,transform;transition-duration:.35s;pointer-events:auto;letter-spacing:normal}.fl-builder-draggable-is-dragging .fl-builder-content,.fl-builder-draggable-is-dragging .fl-builder-panel .fl-lightbox,.fl-builder-resizable-is-resizing .fl-builder-content,.fl-builder-resizable-is-resizing .fl-builder-panel .fl-lightbox,body .fl-builder-bar .fl-builder-bar-content.is-muted{pointer-events:none}body .fl-builder-bar .fl-builder-bar-content.is-muted>:not(.fl-builder-publish-actions){-webkit-filter:saturate(20%) blur(1px);filter:saturate(20%) blur(1px);opacity:.4}.fl-builder-bar-title{box-sizing:border-box;color:#333;display:flex;flex:0 0 380px;max-width:380px;border-right:1px solid #eceef1;cursor:pointer}.fl-builder-bar-title:hover{background:#fff}.fl-builder-bar-title.is-showing-menu .fl-builder-bar-title-caret>svg{transform:rotate(180deg)}.fl-builder-simple .fl-builder-bar-title{cursor:auto}.fl-builder-simple .fl-builder-bar-title:hover{cursor:auto;background:0 0}.fl-builder-bar-title span{vertical-align:middle}.fl-builder-bar-title-icon{box-sizing:border-box;background:0 0;flex:0 0 46px;display:flex;align-items:center;padding:4px}.fl-builder-bar-title-icon img{max-width:100%!important;height:auto!important}.fl-builder-bar-title.fl-builder-bar-title-no-icon{padding-left:12px}.fl-builder-bar-title-area{box-sizing:border-box;flex:1 1 100%;display:flex;flex-direction:column;overflow:hidden;padding:4px}.fl-builder-layout-title,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{font-size:16px;font-weight:400;line-height:1.3;color:#161B20;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret,.fl-builder-layout-pretitle,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{font-size:12px;font-weight:500;line-height:1.3;color:#656d77;text-align:left;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret i,.fl-theme-builder-preview-select-title i{color:inherit!important;font-size:14px}.fl-builder-bar-title-caret{margin-left:auto!important;flex:0 0 46px}.fl-theme-builder-preview-select-title i{padding:12px}.fl-theme-builder-preview-select.fl-builder-button{position:relative;border-radius:0;background:0 0;min-width:0;display:flex;flex:0 0 360px;max-width:360px;margin:0!important;padding:4px 10px;border:none!important;border-right:2px solid #d5dadd!important;box-shadow:none}.fl-theme-builder-preview-select.fl-builder-button:hover{border:none!important;border-right:2px solid #d5dadd!important}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{display:flex;flex:1;justify-content:flex-end;flex-direction:row-reverse}.fl-theme-builder-preview-select-title div{flex:1}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{display:block}.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items{position:absolute;top:calc(48px + 10px);left:10px;width:calc(100% - 20px)!important;background:#fff;border-radius:4px;border:2px solid #D5DADD;border-top:3px solid #00a0d2;box-shadow:0 15px 45px 8px rgba(0,0,0,.04);margin:0!important;padding:0;z-index:-1;font-size:16px;overflow-y:scroll;height:auto!important;max-height:calc(100vh - 66px);min-height:300px;display:flex!important;flex-direction:column}.fl-theme-builder-preview-select-item{padding:4px 0!important;border-bottom:none!important;display:flex;flex-direction:column;text-align:initial}.fl-theme-builder-preview-select-item:hover{text-decoration:none;color:#111;background:0 0!important}body .fl-theme-builder-preview-select .fa-caret-down{float:none}body .fl-theme-builder-preview-select-item-title{padding:10px 15px;color:#222;font-size:14px}body .fl-theme-builder-preview-select-item-children{overflow:auto}body .fl-theme-builder-preview-select-item-child{overflow:hidden;text-overflow:ellipsis;line-height:1.1;margin:0 10px;border:2px solid transparent;border-radius:4px;padding:8px 10px 10px;font-size:14px;font-weight:400;color:#222}body .fl-theme-builder-preview-select-item-child:hover{background:#e6eaed!important}.fl-theme-builder-preview-select-item .fa-caret-down{color:#606D77}.fl-builder-bar-actions{display:flex;flex-direction:row-reverse;flex:1 1 100%;padding:4px}.fl-builder-bar .fl-builder-button{height:auto;margin:0 0 0 4px}.fl-builder-bar-actions .fl-builder-button:last-child{margin:0}.fl-builder-bar-actions:after{clear:both}.fl-builder-bar .fl-builder-content-panel-button{align-items:baseline!important;font-weight:400}.fl-builder--saving-indicator{flex:0 1 auto;cursor:pointer;display:flex;align-self:center;padding:0 10px;font-size:12px;font-style:italic;color:#676f7a;align-items:center;line-height:1.2;justify-content:flex-end}.fl-builder--saving-indicator:hover{color:#676f7a}.fl-builder--saving-indicator .fa-question-circle{font-size:13px;margin:3px 0 3px 5px}.fl-builder-button.fl-builder-buy-button,.fl-builder-button.fl-builder-feedback-button,.fl-builder-button.fl-builder-upgrade-button{background:#F7A407;color:#fff!important;text-decoration:none}.fl-builder-buy-button i.fa-external-link-alt,.fl-builder-feedback-button i.fa-external-link-alt,.fl-builder-upgrade-button i.fa-external-link-alt{color:#FFC733;margin:0 0 0 6px}.fl-builder-buy-button:focus,.fl-builder-buy-button:hover,.fl-builder-feedback-button:focus,.fl-builder-feedback-button:hover,.fl-builder-upgrade-button:focus,.fl-builder-upgrade-button:hover{background:#EE8E0D!important;color:#fff!important}@media (max-width:980px){.fl-builder--main-menu-panel{width:calc(100% - 20px)!important}.fl-builder--main-menu-panel:before{right:auto;left:20px}.fl-builder-bar-title,.fl-theme-builder-preview-select{flex:1 .5 380px!important}}@media (max-width:620px){.fl-theme-builder-preview-select.fl-builder-button{display:none}}@media (max-width:500px){#fl-builder-toggle-notifications,.fl-builder--main-menu-panel:before,.fl-builder--panel-arrow,.fl-builder-bar-title-area,.fl-builder-panel-drag-handle,.fl-builder-panel:before{display:none}.fl-builder--main-menu-panel,.fl-builder-panel{width:auto!important;top:44px!important;left:0!important;right:0!important;bottom:0!important;border-radius:0!important;box-shadow:none!important}.fl-builder--main-menu-panel{border-left:transparent!important;border-right:transparent!important;border-bottom:transparent!important;max-height:calc(100% - 44px)!important}.fl-builder-bar-title{flex:0 0 80px!important}.fl-builder-bar-title-caret{padding-left:0;padding-right:0;max-width:24px}.fl-builder-bar-actions{max-width:calc(100% - 80px);overflow:hidden}.fl-builder--panel-header{border-radius:0!important;cursor:default!important}.fl-builder--panel-header .fl-builder--tabs{cursor:default!important}.fl-builder-publish-actions{width:100%!important;padding-left:4px!important}.fl-builder-bar-actions .fl-builder-button{padding:0 8px!important}}.fl-notifications-panel .fl-builder-ui-post .wp-block-image,.fl-notifications-panel .fl-builder-ui-post .wp-block-image figure{margin-top:10px!important;margin-bottom:10px!important}.fl-builder--preview-actions{display:none;position:fixed;top:4px;left:4px;z-index:10000001;padding:4px;justify-content:center;background:#fff;border-radius:4px}.fl-builder-preview .fl-builder--preview-actions{display:flex}.fl-builder--preview-actions .device-icons{color:#555;background:#e4e4e4;border:none!important;align-items:center;display:flex;text-decoration:none;font-size:14px!important;line-height:1!important;margin:0 4px 0 0;padding:0 6px;cursor:pointer;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px}.fl-builder--preview-actions .device-icons i{margin:0 6px}.fl-builder--preview-actions .size{position:absolute;left:5px;top:40px;font-size:16px}@keyframes fl-builder-ui-pin-zone-pulse{0%,100%{opacity:1;filter:alpha( opacity=1 )}50%{opacity:.5;filter:alpha( opacity=35 )}}.fl-builder-ui-pin-zone{animation:fl-builder-ui-pin-zone-pulse 2s infinite;transition:width .3s ease;background:rgba(0,160,210,.5);bottom:0;top:0;position:fixed;width:35px;z-index:100001}.fl-builder-ui-show-pin-zone-left .fl-builder-ui-pin-zone-left,.fl-builder-ui-show-pin-zone-right .fl-builder-ui-pin-zone-right{width:75px}.fl-builder-ui-pin-zone-left{left:0}.fl-builder-ui-pin-zone-right{right:0}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button{display:flex!important;background:rgba(0,160,210,.5)!important;padding:2px 4px;width:80px;animation:fl-builder-ui-pin-zone-pulse 2s infinite}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button svg{display:none}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button{width:120px}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button svg{display:none!important;width:100%;transform:none!important;fill:#00A0D2!important;border-radius:3px}.fl-builder-ui-is-pinned .fl-builder-content-panel-button,.fl-builder-ui-pinned-container .fl-lightbox-controls{display:none}.fl-builder-content-panel-pin-zone .fl-builder-done-button{filter:grayscale(100%)}.fl-builder-panel.fl-builder-ui-pinned{top:45px!important;bottom:0!important;height:auto!important;border-radius:0;border:none;box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s;z-index:11}.fl-builder-panel.fl-builder-ui-pinned-right{left:auto!important;right:0;border-left:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned-left{left:0;right:auto;border-right:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-radius:0!important}.fl-builder-ui-pinned-container .fl-lightbox-wrap{position:absolute;z-index:11}.fl-builder-ui-pinned-container .fl-lightbox{position:absolute;top:0;bottom:0;left:0;right:0;width:auto!important;height:auto;border-radius:0;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-builder-ui-pinned-container .fl-lightbox-header-wrap{border-radius:0}.fl-builder-ui-pinned-container .fl-lightbox.ui-draggable .fl-lightbox-header{cursor:auto}.fl-builder-ui-pinned-container .fl-lightbox-header h1{padding:12px 20px 10px!important}.fl-builder-ui-pinned-content-transform{transform:scale(1);transform-origin:center top 0}.fl-builder-ui-pinned-collapse{cursor:pointer;display:none;position:absolute!important;bottom:2px;padding:5px;border:2px solid transparent;background:0 0!important;width:36px;height:36px;border-radius:4px;fill:#778794;flex-direction:row;justify-content:center}.fl-builder-ui-pinned-collapse:focus,.fl-builder-ui-pinned-collapse:hover{top:auto!important;background:0 0;border:2px solid transparent;outline:0;fill:#00A0D2}.fl-builder-ui-pinned-collapse:focus{background:#E4E7EA}.fl-builder-ui-pinned-collapse>*{margin:auto;line-height:1}.fl-builder-ui-pinned-collapse svg g{fill:inherit}.fl-builder-ui-is-pinned-right .fl-builder-ui-pinned-right-collapse{display:flex;left:-40px}.fl-builder-ui-is-pinned-left .fl-builder-ui-pinned-left-collapse{display:flex;right:-40px}.fl-builder-ui-pinned-collapse i[data-toggle=show],.fl-builder-ui-pinned-is-collapsed i[data-toggle=hide]{display:none}.fl-builder-ui-pinned-is-collapsed i[data-toggle=show]{display:block}.fl-builder--panel-no-settings,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-content,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-controls,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--tab-wrap,.fl-builder-ui-pinned-is-collapsed .fl-builder--panel-header{display:none}.fl-builder-ui-is-pinned-left [data-toggle=hide],.fl-builder-ui-is-pinned-right [data-toggle=show]{transform:rotateY(180deg)}.fl-builder-ui-pinned-is-collapsed .fl-lightbox{box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-header{background:0 0;border:none;z-index:10}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-wrap{top:0}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-header h1{padding:14px 28px 15px!important}.fl-builder-simple-pinned .fl-builder--panel-no-settings{display:flex;align-items:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0}.fl-builder-content-panel-button svg{transition-property:transform;transition-duration:.25s;transform:rotate(0) scale(1);transform-origin:center}.fl-builder-content-panel-is-showing .fl-builder-content-panel-button svg{transform:rotate(135deg) scale(1.1) translate(.5px,-.5px)}.fl-builder--content-library-panel .fl-builder--panel-arrow svg{vertical-align:inherit}@keyframes fl-builder-show-panel{from{transform:scale(.8)}to{transform:scale(1)}}.fl-builder--search-results-panel,.fl-builder-panel{box-sizing:border-box;position:fixed!important;right:20px;top:calc(43px + 10px);width:380px;bottom:20px;background:#F5F7F9;color:#676F7A;font-size:14px;border-radius:4px;box-shadow:0 8px 40px 4px rgba(0,0,0,.3);z-index:10000007;will-change:transform;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fl-builder-panel{transform-origin:top right;animation-name:fl-builder-show-panel;animation-duration:.15s;animation-fill-mode:both;flex:1;display:none}.fl-builder--search-results-panel{display:none;position:absolute;right:0;top:93px;left:0;bottom:0;width:auto!important;border:none;border-radius:0;box-shadow:none;min-height:100px;max-height:calc(100vh - 54px);overflow:auto;z-index:1}.fl-builder-content-panel-is-showing .fl-builder-panel,.fl-builder-search-results-panel-is-showing .fl-builder--search-results-panel{display:flex;flex-direction:column}.fl-builder-panel .fl-lightbox .fl-builder-panel-drag-handle,.fl-builder-ui-is-pinned .fl-builder--panel-arrow,.fl-lightbox-width-full .fl-builder-panel-drag-handle,body.fl-builder-draggable-is-dragging .fl-builder--panel-arrow{display:none}.fl-builder--search-results-panel .fl-builder--no-results{text-align:center;padding:50px 20px}.fl-builder--panel-arrow{position:absolute;top:-13px;right:10px}.fl-builder--panel-arrow polygon{fill:#00a0d2}.fl-builder--panel-header{border-top:3px solid #00a0d2;border-top-right-radius:4px;border-top-left-radius:4px}.fl-builder-ui-is-pinned .fl-builder--panel-header{border-top:none}.fl-builder-panel-drag-handle{position:absolute;top:7px;left:10px;fill:#ccd4da;width:6px}.fl-builder-ui-is-pinned-left .fl-builder-panel-drag-handle{left:auto;right:10px}.fl-builder--panel-header .fl-builder--panel-controls{display:flex;flex-direction:row;position:relative}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-content-group-select{flex:1 1}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-panel-search{flex:0 0;padding:0 10px 6px 0;margin-left:-4px}.fl-builder--panel-controls .fl-builder-panel-search button{display:flex;flex-direction:row;align-items:center;justify-content:center;width:30px;background:0 0!important;border:2px solid transparent!important;font-size:inherit;height:36px;margin:0;padding:0}.fl-builder--panel-controls .fl-builder-panel-search button:active,.fl-builder--panel-controls .fl-builder-panel-search button:focus{top:0;outline:0}.fl-builder-panel-search button svg{height:auto;width:20px}.fl-builder-panel-search button.fl-builder-dismiss-panel-search svg{width:16px}.fl-builder-panel-search button svg .filled-shape{fill:#000}.fl-builder--panel-controls .fl-builder-panel-search button:active svg .filled-shape,.fl-builder--panel-controls .fl-builder-panel-search button:focus svg .filled-shape{fill:#00A0D2}.fl-builder-panel-search .fl-builder-panel-search-input{display:none;position:absolute;top:0;left:0;right:0;bottom:0;background:#f5f7f9}.fl-builder-panel-search.is-showing-input .fl-builder-panel-search-input{display:flex;flex-direction:row;padding:0 10px 6px}.fl-builder-panel-search-input input{flex:1 1 100%;border:2px solid #e6eaed;background:#fff;border-radius:4px;margin:0 4px 0 0;padding:10px;color:#333}.fl-builder-panel-search-input input:focus{border-color:#0197C6;outline:0}.fl-builder-panel-content-wrap{bottom:0;height:auto;left:0;overflow:hidden;position:absolute;right:0;top:43px}.fl-builder-panel-content{padding-bottom:60px}.fl-builder--panel-view .fl-builder-blocks-section:first-child{border-top:none}.fl-builder-blocks-group:first-child{padding:20px 0 0}.fl-builder-blocks-group .fl-builder-blocks-section-group-name{display:block;padding:0 30px 15px;color:#000;font-size:20px;font-weight:600;line-height:1.4}.fl-builder-blocks-section .fl-builder-block{display:block;line-height:1.1;padding:15px 20px}.fl-builder--template-collection-section-header,.fl-builder-blocks-section .fl-builder-blocks-section-header{line-height:1.2;color:#333;margin:0!important;user-select:none;background-color:#e7ebef;border-top:4px solid #e7ebef;height:30px;display:flex;flex-direction:row}.fl-builder-blocks-section .fl-builder-blocks-section-title{background:#F5F7F9;color:#353535;padding:2px 16px;display:flex;align-items:center}.fl-builder-blocks-section .fl-builder-blocks-section-title i{color:#bfbfbf;float:right}.fl-builder-blocks-section-content{overflow:auto;padding:10px 10px 20px}.fl-builder-blocks-section-content:before{content:none}.fl-builder-blocks-section-content:after{float:none;clear:both}.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:flex;flex-wrap:wrap}@supports (display:grid){.fl-builder--template-collection-section-content,.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr))}.fl-builder--template-collection-section-content>*,.fl-builder-blocks-section-content.fl-builder-modules>*,.fl-builder-blocks-section-content.fl-builder-rows>*,.fl-builder-blocks-section-content.fl-builder-widgets>*{width:auto!important}}.fl-builder-blocks-section-content .fl-builder-block-module,.fl-builder-blocks-section-content .fl-builder-block-row{flex:1 1 50%;width:50%;box-sizing:border-box}.fl-builder--search-results-panel .fl-builder-blocks-section-content .fl-builder-block-module{flex:1 1 100%;width:100%}.fl-builder-blocks-section.fl-active .fl-builder-blocks-section-content{display:block}.fl-builder-blocks-section-content .fl-builder-block{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:13px;line-height:1.1;font-weight:400;color:#38404a}.fl-builder-block{position:relative;height:47px}.fl-builder-block-disabled,.fl-builder-block-disabled .fl-builder-block-content{cursor:pointer!important}.fl-builder-block.fl-builder-block-col-group{height:84px}.fl-builder-block.fl-builder-block-has-thumbnail{height:auto!important;padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover{padding:0!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-content{position:relative!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover .fl-builder-block-content{padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-details{margin:0 10px 4px!important}.fl-builder-block:hover{overflow:visible;z-index:1}.fl-builder-block:hover .fl-builder-block-content{display:block;box-sizing:border-box;position:absolute;top:0;left:0;width:100%;padding:15px 20px;border-radius:4px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);text-decoration:none;color:#111;cursor:move;overflow:hidden}.fl-builder-block-module:hover .fl-builder-block-content{width:auto;min-width:100%}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual{display:block;margin-bottom:7px}.fl-builder-block-drag-helper .fl-builder-block-content .fl-builder-block-visual{display:none!important}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual.fl-cols-visual{display:flex;flex-direction:row;height:30px}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{flex:1 100%;background:#464a4c;height:30px;margin:0 2px;border-radius:2px}.fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#000}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:first-child{margin-left:0!important}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:last-child{margin-right:0!important}.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:last-child,.fl-cols-visual.left-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.right-sidebar .fl-cols-visual-col:last-child{flex-basis:60px}.fl-builder-block-saved-column.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-column:hover .fl-builder-block-title,.fl-builder-block-saved-module.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-module:hover .fl-builder-block-title,.fl-builder-block-saved-row.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-row:hover .fl-builder-block-title,.fl-builder-touch .fl-builder-block-saved-column .fl-builder-block-title,.fl-builder-touch .fl-builder-block-saved-module .fl-builder-block-title,.fl-builder-touch .fl-builder-block-saved-row .fl-builder-block-title{margin-right:70px}.fl-builder-block-module:nth-child(even):hover .fl-builder-block-content{left:auto;right:0}.fl-builder-block-thumbnail{border-radius:4px;background-size:contain;background-repeat:no-repeat;background-position:center;background-color:rgba(0,0,0,.06);margin-bottom:10px;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s}.fl-builder-block:hover .fl-builder-block-thumbnail{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder-block .fl-builder-block-icon{margin-right:7px;fill:#000;display:inline-block;width:20px;height:20px;vertical-align:middle}.fl-builder-block-thumbnail:before{content:"";display:block;padding-top:50%}.fl-builder-block-thumbnail img{max-width:100%;max-height:160px;margin:0;object-fit:cover}.fl-builder-blocks-section-content .fl-builder-block{box-shadow:0 0 0 transparent;transition-property:box-shadow;transition-duration:.15s}.fl-builder-blocks-section-content .fl-builder-block i,.fl-user-template-actions i{color:#000;margin-right:10px}.fl-builder-blocks-section-content .fl-builder-block .fl-builder-block-details{position:relative}.fl-builder-blocks-separator{background:#f1f1f1;height:6px}.fl-builder-block:hover .fl-builder-badge{background:#2ea2cc}.ui-sortable-helper .fl-builder-badge{display:none!important}#fl-builder-blocks-pro{border-bottom:4px solid #e7ebef;position:relative}#fl-builder-blocks-pro.fl-builder-blocks-section .fl-builder-block{cursor:pointer!important;padding-right:50px}#fl-builder-blocks-pro .fl-builder-block:hover .fl-builder-block-content{cursor:pointer!important;padding-right:60px}.fl-builder-blocks-pro-closed{height:240px;overflow:hidden}.fl-builder-blocks-pro-overlay{background:linear-gradient(to top,rgba(245,247,249,1) 0,rgba(255,255,255,0) 100%);position:absolute;top:0;right:0;bottom:0;left:0}.fl-builder-blocks-pro-open .fl-builder-blocks-pro-overlay{display:none}.fl-builder-blocks-pro-expand.fl-builder-button{display:inline-block!important;font-size:12px!important;margin-bottom:10px!important;opacity:.4;width:100%!important}.fl-builder-blocks-pro-expand:hover{opacity:1}.fl-builder-blocks-pro-expand-rotate svg{transform:rotate(180deg)}.fl-builder--panel-cta{margin:0 20px 20px!important;padding:10px 30px 30px;font-size:16px;text-align:center}.fl-builder--panel-cta a{color:inherit;text-decoration:none}.fl-builder--panel-cta a:hover{text-decoration:none}.fl-builder--panel-cta img{display:block;max-width:70px;margin:0 auto 20px;position:relative;right:8px}.fl-builder--panel-cta button{display:inline;margin-top:25px}.fl-builder--panel-message{text-align:center;padding:40px 20px;font-size:16px}.fl-builder--panel-message .fl-builder-button{display:inline-block;padding:10px}.fl-builder-pro-badge{background:rgba(0,0,0,.4);color:#fff;font-size:10px;font-weight:700;padding:2px 4px}.fl-builder--menu-item .fl-builder-pro-badge{margin-left:10px}.fl-builder-block-module .fl-builder-pro-badge{padding:2px;position:absolute;right:20px}.fl-builder-block-module:hover .fl-builder-pro-badge{background:#F7A407}.fl-builder--template-thumbnail .fl-builder-pro-badge{background:#F7A407;position:absolute;right:8px;top:8px;z-index:1}.fl-builder-block-row-template .fl-builder-pro-badge{position:absolute;top:auto;bottom:10px;right:10px}.fl-builder-lite .fl-builder--menu-item[data-event=saveTemplate],.fl-builder-lite .fl-builder--menu-item[data-event=launchThemerLayouts]{opacity:.5}.fl-builder-pro-lightbox .fl-lightbox{max-width:450px;padding:30px;text-align:center}.fl-builder-pro-lightbox .dashicons-no{cursor:pointer;position:absolute;right:10px;top:14px;font-size:20px;opacity:.3}.fl-builder-pro-lightbox .dashicons-no:hover{opacity:1}.fl-pro-message-badge{margin-bottom:15px}.fl-pro-message-badge span{background:rgba(0,0,0,.3);color:#fff;font-size:10px!important;font-weight:700;padding:2px 4px}.fl-pro-message-title{font-size:20px!important;font-weight:700;margin-bottom:20px}.fl-pro-message-content{font-size:16px!important;line-height:24px!important;margin-bottom:20px}.fl-pro-message-button button{display:inline}.fl-builder-block-template-image{margin:5px 0 10px;max-width:100%;border:1px solid #dfdfdf}.fl-builder-block .fl-builder-block-title{overflow:hidden;text-overflow:ellipsis;vertical-align:middle;line-height:1.3}.ui-sortable-helper .fl-builder-block-template-image{display:none!important}@keyframes fl-builder-template-item-enter{from{transform:translateY(100px) scale(.3);opacity:0}to{transform:scale(1);opacity:1}}.fl-builder--template-collection{clear:both;padding:10px 0}.fl-builder--template-collection-section-content{padding:0 10px}.fl-builder--template-collection-item{box-sizing:border-box;width:50%;float:left;padding:10px;cursor:pointer;font-size:13px;transform-origin:center;opacity:1;position:relative}.fl-builder--template-thumbnail{background-size:cover;background-clip:content-box;background-position:center top;background-color:#fff;border:2px solid transparent;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s;position:relative}.fl-builder--template-collection-item[data-id="0"] .fl-builder--template-thumbnail,.fl-user-template .fl-builder--template-thumbnail{border-color:#e4e7ea}.fl-builder--template-thumbnail:before{display:block;content:"";padding-top:120%}.fl-builder--template-thumbnail:hover{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder--template-name{text-align:center;padding:4px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fl-builder--template-collection-section{padding-bottom:10px;border-bottom:1px solid #dfdfdf}.fl-builder--template-collection-section:last-child{border-bottom:none}.fl-builder--template-collection-section:after,.fl-builder--template-collection-section:before{content:"";display:block;clear:both}.fl-builder--template-collection-section-name{padding:15px 10px 10px}span.fl-builder-block-no-node-templates{display:block;padding:15px 20px;text-align:center}span.fl-builder-block-no-node-templates:hover{cursor:default}.fl-builder-blocks-node-template .fl-builder-block{position:relative}.fl-builder-blocks-section-content .fl-builder-node-template-actions{bottom:0;cursor:default;display:none;position:absolute;right:0;top:0}.fl-builder-blocks-section-content .fl-builder-node-template-actions a:hover{text-decoration:none}.fl-builder-blocks-section-content .fl-builder-node-template-delete,.fl-builder-blocks-section-content .fl-builder-node-template-edit{display:inline;cursor:pointer;margin:0;padding:15px 10px;text-align:center;width:30px}.fl-builder-block-details .fl-builder-node-template-delete,.fl-builder-block-details .fl-builder-node-template-edit{padding-top:0!important}.fl-builder-blocks-section-content .fl-builder-node-template-delete i,.fl-builder-blocks-section-content .fl-builder-node-template-edit i{color:#676F7A;margin:0}.fl-builder-blocks-section-content .fl-builder-node-template-delete:hover i,.fl-builder-blocks-section-content .fl-builder-node-template-edit:hover i{color:#444}.fl-builder-blocks-node-template .fl-builder-block:hover .fl-builder-node-template-actions,.fl-builder-touch .fl-builder-blocks-section-content .fl-builder-node-template-actions{display:block}.ui-sortable-helper .fl-builder-node-template-delete,.ui-sortable-helper .fl-builder-node-template-edit{display:none!important}.fl-builder--tabs{display:flex;flex-direction:row;position:relative;justify-content:flex-start;align-items:center}.fl-builder-panel .fl-builder--panel-header{cursor:move}.fl-builder-panel .fl-builder--tabs{justify-content:space-around;padding:4px 24px;cursor:pointer}.fl-builder--tab-wrap{flex:1 1 100%;display:flex;flex-direction:row;align-items:stretch;justify-content:space-between;margin:auto;max-width:400px}.fl-builder--tabs button,.fl-builder--tabs button:active,.fl-builder--tabs button:focus,.fl-builder--tabs button:hover{flex:1 1 100%;display:inline-block;text-decoration:none;text-transform:none;color:inherit;text-align:center;letter-spacing:normal!important;margin:0;padding:5px;cursor:pointer;font-size:13px!important;font-weight:500!important;line-height:1.3!important;background:0 0!important;outline:0!important;border:2px solid transparent;border-radius:4px;min-height:36px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;top:0;transition-property:background,color;transition-duration:.25s}.fl-builder--tabs button:focus{background:#e6eaed!important}.fl-builder--tabs button.is-showing{color:#0086b0}.fl-builder--panel-content{flex:1}.fl-builder--panel-view{display:none;overflow:hidden}.fl-builder--panel-view.is-showing{display:block;letter-spacing:normal}.fl-builder--content-library-panel.ui-draggable-dragging{height:500px!important}.fl-builder--content-library-panel .fl-builder-drop-zone{display:none!important}.fl-builder--panel-header .fl-builder--tabs{cursor:move}.fl-builder--category-select{display:flex;flex-direction:column;position:relative}.fl-builder--selector-display{display:flex;flex-direction:row;position:relative;justify-content:space-between;color:#161B20;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;cursor:pointer;font-size:13px;font-weight:700;line-height:16px;border-radius:4px;align-items:stretch}.fl-builder--selector-display-label{display:flex;flex-direction:row;align-items:stretch;font-size:inherit;line-height:inherit;width:100%;margin:0!important;padding:0!important;color:#6D6D6D;background:0 0!important;border:2px solid transparent;box-shadow:0 1px 2px 0 rgba(0,0,0,.12)!important;border-radius:4px;font-family:inherit;text-transform:none}.fl-builder--selector-display-label:hover{top:0;color:inherit;background:0 0!important;border:2px solid transparent;border-radius:4px}.fl-builder--selector-display-label:active{top:0;color:inherit;background:0 0;border:2px solid #e4e7ea;border-radius:4px}.fl-builder--selector-display-label:focus{top:0;color:inherit;background:0 0;border:2px solid #00A0D2;outline:0}.fl-builder--group-label{color:inherit;flex:0 0 auto;padding:4px 12px 4px 10px;background:#e7ebef;border-radius:3px;display:flex;flex-direction:row;align-items:center}.fl-builder--current-view-name{flex:1 1 100%;color:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;padding:8px 10px;text-align:left}.fl-builder--selector-menu{display:none;color:#293138;position:absolute;top:46px;left:0;width:100%;background:#fff;border-radius:4px;box-shadow:0 0 20px 2px rgba(0,0,0,.2);overflow:visible;z-index:2}.fl-builder--selector-menu:before{bottom:100%;right:8px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}.fl-builder--category-select.is-showing .fl-builder--selector-menu{display:flex;max-height:calc(100vh - 150px)}.fl-builder--category-select.is-showing .fl-builder--selector-menu .fl-builder--menu{margin:10px 0;flex:1 100%;overflow:auto}button.fl-builder-button.fl-builder-bar-title-caret{margin:4px;padding:0 12px!important}button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#e6eaed!important;border-color:transparent!important}.fl-builder--category-select.is-showing .fl-builder-bar-title-caret i{transform:rotate(180deg)}.fl-builder--menu{margin-bottom:2px}.fl-builder--menu>a,.fl-builder--menu>button,.fl-builder--menu>span{display:block;padding:8px 10px 10px;border-radius:4px;color:inherit;text-decoration:none;background:0 0!important;border:2px solid transparent!important;font-weight:400;font-family:inherit}.fl-builder--menu>a:active,.fl-builder--menu>a:focus,.fl-builder--menu>a:hover,.fl-builder--menu>button:active,.fl-builder--menu>button:focus,.fl-builder--menu>button:hover{background:#e6eaed!important;border:2px solid transparent!important;top:0}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging,.fl-builder-drop-zone,.fl-builder-empty{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-builder--menu>a:focus,.fl-builder--menu>button:focus{outline:0;color:inherit;text-decoration:none}.fl-builder--menu .fl-has-children>svg{float:right;margin:0 7px 0 0;height:16px;width:9px;transition-property:transform;transition-duration:.15s;transform:rotate(-90deg)}.fl-builder--menu .fl-has-children.fl-has-children-showing>svg{transform:rotate(0)}.fl-builder--menu .fl-inset{display:none;padding-left:35px;font-size:14px;line-height:1.25}.fl-builder--menu a.fl-template-collection{color:#161B20}.fl-builder--menu>:after{clear:both}.fl-builder--menu * .fl-builder--menu-item-accessory{float:right;color:#000;text-transform:uppercase;text-align:center;min-width:20px;letter-spacing:2px}.fl-builder--menu * .fl-builder--menu-item-accessory i{font-size:1em;margin-top:2px}.fl-builder--menu hr::after,.fl-builder--menu hr::before{display:none!important;content:none!important;height:auto}.fl-builder--menu .fl-builder-video-wrap iframe{display:block;margin:4px 0;width:100%}.fl-builder-publish-actions{display:flex;box-sizing:border-box;position:absolute;top:0;right:0;width:380px;max-width:100%;height:44px;padding:4px 4px 4px 0;flex-direction:row;justify-content:flex-end;opacity:1;pointer-events:auto;transform:scaleX(1) translateX(0);transform-origin:right;transition-property:transform,opacity;transition-duration:.15s}.fl-builder-publish-actions.is-hidden{transform:scaleX(.23) translateX(68px);opacity:0;pointer-events:none}.fl-builder-bar .fl-builder-button-group{display:flex;flex-basis:100%}.fl-builder-bar .fl-builder-button-group>.fl-builder-button{border-radius:0;margin-left:0;flex:1 0 auto;text-align:center;justify-content:space-around;box-shadow:none}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-builder-publish-actions-click-away-mask{display:none;position:fixed;top:0;left:0;right:0;height:100vh;background:0 0}.fl-builder-dragging .fl-builder-content:not(.fl-builder-empty){padding:16px 0}.fl-builder-empty{display:none;border:2px dashed #969696;border-radius:8px;color:#909090;font-size:20px;font-weight:700;margin:10px;padding:250px 20px;position:relative;text-align:center;text-transform:uppercase}.fl-builder-drop-zone,.fl-builder-has-submenu>ul.fl-builder-submenu li a{font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fl-builder-edit .fl-builder-empty{display:block}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging{background:rgba(255,255,255,.95)!important;border:2px solid #000;border-radius:4px;box-shadow:0 0 8px rgba(0,0,0,.2);-moz-box-shadow:0 0 8px rgba(0,0,0,.2);-webkit-box-shadow:0 0 8px rgba(0,0,0,.2);color:#333!important;font-size:13px!important;height:47px!important;line-height:40px!important;overflow:hidden;padding:0 20px;position:absolute!important;text-overflow:ellipsis;white-space:nowrap;width:180px!important;z-index:100010!important;display:flex;flex-direction:row;align-content:center;justify-content:flex-start}.fl-builder-block.fl-builder-block-drag-helper:hover{padding:0;box-shadow:none}.fl-builder-block-drag-helper:hover .fl-builder-block-content{position:static;padding:0 20px}.fl-col-has-highlight-guide .fl-col-content,.fl-col-highlight,.fl-row-highlight .fl-col-group{position:relative}.fl-builder-block-saved-column.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-module.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-row.fl-builder-block-drag-helper:hover .fl-builder-block-content{padding:14px 20px}.fl-builder-block-drag-helper .fl-builder-block-icon{fill:#000;margin-top:-10px}.fl-builder-drop-zone{animation:fl-builder-drop-zone-pulse 2s infinite;background:#00A2D7;border-radius:4px;color:#fff!important;display:block;font-size:12px;letter-spacing:1px;line-height:14px;margin:10px;padding:6px 8px 5px;position:relative;text-align:left;text-shadow:none;text-transform:none;z-index:10}@keyframes fl-builder-drop-zone-pulse{0%,100%{background-color:#00A2D7}50%{background-color:#79DEFF}}.fl-builder-drop-zone-global{animation:fl-builder-drop-zone-global-pulse 2s infinite;background:#ff9600}@keyframes fl-builder-drop-zone-global-pulse{0%,100%{background-color:#FFBC5C}50%{background-color:#ff9600}}.fl-builder-content>.fl-builder-drop-zone{margin:10px 20px}.fl-row-content>.fl-builder-drop-zone{margin:3px 7px}.fl-col-has-cols>.fl-col-content>.fl-builder-drop-zone{margin:3px 10px}.fl-sortable-disabled>.fl-builder-drop-zone{display:none!important}.fl-col-group-equal-height.fl-col-group-align-center .fl-col-content>.fl-builder-drop-zone{width:100%}.fl-row-highlight{padding:16px 0}.fl-row-highlight .fl-row-content{border:2px dashed rgba(203,205,206,.5);padding:8px;border-radius:6px}.fl-row-highlight.fl-node-global .fl-row-content{border-color:#ff9600}.fl-col-highlight{padding:8px}.fl-col-highlight .fl-col-content{border-style:dashed!important;border-color:#00a0d2!important;border-radius:4px;min-height:100px;overflow-x:hidden;border-width:2px!important}.fl-col-has-cols.fl-col-highlight>.fl-col-content{padding:8px}.fl-col-highlight.fl-node-global .fl-col-content{border-color:#ff9600!important}.fl-builder-simple .fl-col-highlight .fl-col-content{border:none!important}.fl-col-highlight-guide{background:rgba(0,160,210,.05);border:2px solid #00A0D2;border-radius:4px;bottom:4px;left:4px;position:absolute;right:4px;top:4px;z-index:1}.fl-node-global .fl-col-highlight-guide{border-color:#ff9600!important;background-color:rgba(255,150,0,.06)!important}.fl-col-has-highlight-guide .fl-block-overlay{background:0 0;border-color:transparent}.fl-col-has-highlight-guide .fl-block-col-resize{display:none}.fl-col-has-highlight-guide .fl-col-highlight .fl-col-content{border-color:transparent!important}.fl-col-drop-target{bottom:8px;display:none;left:-9px;position:absolute;top:8px;width:18px;z-index:1}.fl-col-highlight .fl-col-drop-target{display:block}.fl-col-drop-target-last{left:auto;right:-9px}.fl-col-drop-target .fl-builder-drop-zone{bottom:0;left:2px;margin:0;padding:0;position:absolute;right:2px;top:0}.fl-col-group-drop-target{display:none;left:8px;height:18px;position:absolute;right:8px;top:-9px;z-index:1}.fl-row-highlight .fl-col-group-drop-target{display:block}.fl-col-group-drop-target-last{top:auto;bottom:-9px}.fl-col-group-drop-target .fl-builder-drop-zone{bottom:2px;left:0;margin:0;padding:0;position:absolute;right:0;top:2px}.fl-row-content>.fl-col-group-drop-target{position:static}.fl-row-content>.fl-col-group-drop-target .fl-builder-drop-zone{height:18px;position:static}.fl-row-drop-target{display:none;left:0;height:24px;margin-top:-28px;position:absolute;right:0;z-index:1}.fl-row-highlight .fl-row-drop-target{display:block}.fl-row-drop-target-last{margin-top:4px}.fl-row .fl-row-drop-target .fl-builder-drop-zone{bottom:0;left:4px;margin:0;position:absolute;right:4px;top:0}.fl-builder-content>.fl-row-drop-target{margin:0;position:static}.fl-builder-dragging .fl-builder-content.fl-builder-empty>.fl-row-drop-target{bottom:10px;display:block;height:auto;left:0;position:absolute;right:0;top:10px}.fl-builder-content .fl-row-drop-target .fl-builder-drop-zone{margin-bottom:0;margin-top:0}.fl-col-group:focus,.fl-col:focus,.fl-module:focus,.fl-row:focus{outline:0}.fl-sortable-proxy{display:none}.fl-block-overlay,.fl-block-overlay *{text-shadow:none;-webkit-touch-callout:none;transition-property:border-color;transition-duration:.3s}.fl-block-overlay-active{position:relative}.fl-block-overlay-actions{background:#00A0D2;float:left;height:30px;margin:-1px -1px 0;padding:0 4px;text-shadow:none;border-bottom-right-radius:5px;border-top-left-radius:3px;transition-property:background-color;transition-duration:.3s}.fl-row-overlay-header-bottom .fl-block-overlay-actions{border-radius:0 5px 0 3px}.fl-builder-col-resizing .fl-block-overlay-actions,.fl-builder-row-resizing .fl-block-overlay-actions{overflow:hidden}.fl-block-overlay-actions>span{display:block;float:left}.fl-block-overlay-actions i{color:#fff!important;cursor:pointer;display:block!important;float:left;font-size:16px!important;height:28px!important;line-height:28px!important;opacity:.8;filter:alpha(opacity=80);text-align:center;width:32px!important}.fl-block-overlay-actions i:hover{opacity:1;filter:alpha(opacity=100)}.fl-block-overlay-actions>i:first-child{padding-left:4px}.fl-block-overlay-actions>i:last-child{padding-right:2px}.fl-block-overlay-actions .fl-block-move{cursor:move}.fl-block-has-rules{color:#00A0D2!important;cursor:pointer;padding:7px;position:absolute;right:0;top:0}.fl-block-has-rules.logic{color:red!important}.fl-block-overlay-title,.fl-builder-has-submenu>ul.fl-builder-submenu li a{color:#fff!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-block-overlay-title{float:left;font-size:14px;height:30px;line-height:29px;margin-right:2px;padding:0 12px 0 8px}.fl-col-overlay,.fl-module-overlay,.fl-row-overlay{background:rgba(190,239,255,0);color:#fff}.fl-builder-touch .fl-block-overlay-actions{height:32px}.fl-builder-touch .fl-block-overlay-actions i{font-size:20px!important;height:32px!important;line-height:32px!important;width:38px!important}.fl-row-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:0;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;left:0;position:absolute;top:-33px;right:0;z-index:100006}.fl-row-overlay.fl-row-menu-active,.fl-row-overlay.fl-row-menu-active.fl-block-overlay.fl-block-overlay-global{z-index:100007}.fl-row-full-width .fl-row-overlay{left:2px;right:2px;bottom:2px}.fl-row-overlay-header-bottom{bottom:-32px!important;top:0}.fl-row-overlay-header-bottom .fl-block-overlay-header{position:absolute;bottom:0}.fl-block-overlay-active .fl-row-content-wrap{position:relative}.fl-block-overlay-active .fl-row-content{position:relative;z-index:100007!important}.fl-builder-row-resizing .fl-col.fl-block-overlay-active,.fl-builder-row-resizing .fl-module.fl-block-overlay-active{position:static}.fl-col-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:8px;cursor:pointer;left:8px;position:absolute;right:8px;top:8px;z-index:100008}.fl-module-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:4px;cursor:pointer;left:4px;min-height:32px;position:absolute;right:4px;top:4px;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-module-overlay{cursor:default}.fl-module-adjust-height{padding-bottom:15px;padding-top:15px}.fl-col-bg-overlay .fl-block-overlay-active.fl-module{z-index:100008}.fl-block-overlay-global{background:rgba(255,150,0,0);border:2px solid #F7A407;border-radius:4px}.fl-block-overlay-global .fl-block-overlay-actions{background:#F7A407}.fl-block-overlay-title-global{background:#fff;color:#ff9600!important;font-size:11px;letter-spacing:1px;margin-left:4px;padding:2px 4px;vertical-align:top}.fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:pointer;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-row-overlay{cursor:default}.fl-builder-row-template .fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:default;z-index:100006}.fl-block-overlay-global.fl-row-overlay .fl-block-col-resize{display:none}.fl-block-overlay-muted .fl-row-overlay{background:rgba(85,93,102,0);border:2px solid #555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-overlay-actions{background:#555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-has-rules{color:#555D66!important}.fl-block-overlay-muted .fl-row-overlay .fl-block-col-resize{display:none}.fl-node-disabled .fl-row-content-wrap,.fl-node-disabled>.fl-col-content{opacity:.3}.fl-block-col-resize{bottom:0!important;position:absolute;top:0!important;width:6px}.fl-block-col-resize-e{cursor:ew-resize;left:auto!important;right:-2px!important}.fl-block-col-resize-w{cursor:ew-resize;left:-7px!important}.fl-block-col-resize-handle-wrap{margin:-4px 0 0 -5px;padding:0 5px;position:absolute;top:50%!important}.fl-block-col-resize-e .fl-block-col-resize-handle-wrap{margin-left:-6px}.fl-block-col-resize-handle{background:#fff;border:2px solid #00A0D2;border-radius:50%;height:12px;width:12px}.fl-node-global .fl-block-col-resize-handle{border-color:#ff9600}.fl-block-col-resize-feedback{color:#333!important;display:none;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:11px!important;position:absolute}.fl-block-col-resize-feedback-left,.fl-block-col-resize-feedback-right{background:#fff;border:1px solid #3ba0ff;padding:2px 4px}.fl-block-col-resize-feedback-left{right:20px;top:-7px}.fl-block-col-resize-feedback-right{left:20px;top:-7px}.fl-builder-has-submenu{position:relative}.fl-builder-has-submenu>ul.fl-builder-submenu{background:#00A0D2;box-shadow:0 0 20px rgba(0,0,0,.2);border-radius:0 4px 4px;display:none;left:0;list-style:none;margin:0;padding:6px 0;position:absolute;text-align:left;letter-spacing:normal;top:100%;width:165px;z-index:100008}.fl-builder-has-submenu>ul.fl-builder-submenu li{list-style:none;margin:0;padding:0}.fl-builder-submenu-right ul.fl-builder-submenu{left:auto;right:0}.fl-builder-has-submenu.fl-builder-submenu-open>ul.fl-builder-submenu{display:block}.fl-builder-has-submenu>ul.fl-builder-submenu li a{border-bottom:0 none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;display:block;line-height:13px;font-size:13px;opacity:.8;filter:alpha(opacity=80);padding:6px 12px;text-decoration:none}.fl-builder-has-submenu>ul.fl-builder-submenu li a:hover{background:#0197C6;color:#fff;opacity:1;filter:alpha(opacity=100);text-decoration:none}.fl-builder-actions-title,.fl-builder-alert-lightbox .fl-lightbox-message,.fl-builder-alert-lightbox .fl-lightbox-message-info{color:#333!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px!important}.fl-builder-has-submenu .fl-builder-submenu .fa,.fl-builder-has-submenu .fl-builder-submenu .far,.fl-builder-has-submenu .fl-builder-submenu .fas{float:right;height:12px!important;line-height:12px!important;position:relative;right:-5px;width:14px!important}.fl-builder-has-submenu .fl-builder-has-submenu .fl-builder-submenu{display:none;left:100%;top:0}.fl-builder-has-submenu .fl-builder-submenu-right.fl-builder-has-submenu .fl-builder-submenu{left:auto;right:100%}.fl-builder-has-submenu .fl-builder-has-submenu:hover .fl-builder-submenu{display:block}.fl-builder-submenu-sep{padding:7px 0!important}.fl-builder-submenu-sep div{border-bottom:1px solid rgba(255,255,255,.4)}.fl-block-col-move,.fl-block-col-move-parent{cursor:move;position:relative}.fl-builder-submenu .fa-arrows-alt{cursor:move;display:none!important}.fl-builder-submenu a:hover .fa-arrows-alt{display:block!important;float:right;line-height:12px!important;height:12px!important}.fl-block-overlay-global ul.fl-builder-submenu{background:#ff9600!important}.fl-block-overlay-global ul.fl-builder-submenu li a:hover{background:#fa3}.fl-builder-actions-lightbox .fl-lightbox{display:block;width:300px;border-radius:4px}.fl-builder-actions-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-actions-lightbox .fl-builder-actions{display:flex;flex-direction:column;padding:25px;text-align:center;letter-spacing:normal}.fl-builder-actions-title{display:block;margin-bottom:20px}.fl-builder-actions .fl-builder-button{display:flex;justify-content:center;margin-bottom:7px;min-height:36px}.fl-builder-alert-lightbox{padding:20px;z-index:30000000;top:0;pointer-events:auto}.fl-builder-alert-lightbox .fl-lightbox{max-width:440px;width:auto}.fl-builder-alert-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-alert-lightbox .fl-lightbox-message,.fl-builder-alert-lightbox .fl-lightbox-message-info{letter-spacing:normal;line-height:24px;padding:30px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox{max-width:60%}.fl-lightbox-width-slim .fl-compound-field,.fl-lightbox-width-slim .fl-dimension-field-units{max-width:none}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-content{padding:20px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-message{padding:10px 20px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-message h1{font-size:20px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .fl-lightbox-message p{font-size:14px;padding-top:5px}.fl-builder-alert-lightbox.fl-builder-crash-lightbox .link{color:#428bca;text-decoration:underline}.fl-builder-alert-lightbox .fl-lightbox-message-info{padding:0 20px;font-size:14px!important}.fl-builder-alert-lightbox .fl-lightbox-message-info p{line-height:20px;padding:10px 0 0 10px}.fl-builder-alert-lightbox .fl-lightbox-message-info a{font-size:14px}@keyframes fl-builder-content-section-entry{from{transform:translateY(150px) translateX(100px) scale(.3);opacity:0}to{transform:translateY(0) translateX(0) scale(1);opacity:1}}.fl-template-category-select{width:180px!important}.fl-template-selector .fl-builder-settings-section{margin:0 0 10px}.fl-template-selector .fl-builder-settings-fields{height:470px}.fl-template-selector .fl-builder-settings-tab{width:560px}.fl-template-selector .fl-builder-settings-tab-description{font-size:15px!important;margin:0!important;padding:10px 0 25px;text-align:center}.fl-template-preview{float:left;margin:0 25px 30px 0;position:relative;text-align:center;width:170px}.fl-template-preview.fl-last{margin-right:0}.fl-template-image{border:1px solid #d9d9d9;cursor:pointer;margin-bottom:12px;height:164px;overflow:hidden}.fl-template-image:hover{border-color:red}.fl-template-image img{max-height:none;width:100%}.fl-template-preview span{display:block;text-align:center}.fl-user-template-category-name{background:#f2f2f2;border-bottom:3px solid #dfdfdf;border-top:2px solid #dfdfdf;font-weight:700;padding:8px 15px}.fl-user-templates{border-bottom:1px solid #dfdfdf;padding:10px 0 20px}.fl-builder--user-templates-section-content{border-bottom:2px solid #e6eaed;padding:10px}.fl-builder--user-templates-section-content:first-child{padding-top:0}.fl-builder--user-templates-section-content:last-child,.fl-user-templates:last-child{border-bottom:none}.fl-builder--user-templates-section-name{font-weight:700;font-size:16px;color:#333;z-index:9999;padding:15px 10px;margin:0 10px}@keyframes fl-list-item-entry{from{opacity:0;transform:scale(.5) translateY(100px)}to{opacity:1;transform:scale(1) translateY(0)}}.fl-builder--save-new-user-template,.fl-user-template{position:relative;display:flex;flex-direction:row;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:16px;font-weight:200;line-height:1.1;padding:10px 20px;color:#6d6d6d}.fl-user-template:hover{cursor:pointer;background:#fff;box-shadow:0 6px 20px rgba(0,0,0,.08);text-decoration:none;color:#111;padding-right:68px}.fl-user-template-name{overflow:hidden;text-overflow:ellipsis;flex:1}.fl-user-template-actions{display:none;bottom:0;position:absolute;right:0;top:0}.fl-user-template:hover .fl-user-template-actions{display:flex;flex-direction:row;align-items:center}.fl-user-template-actions a{display:inline-block;padding:15px 0;width:30px}.fl-user-template:hover a:hover i{color:#444!important}.fl-user-templates-message{display:none}.fl-user-template-thumbnail{flex:0;margin-right:20px}.fl-user-template-thumbnail .fl-builder--template-thumbnail{background-size:cover;background-position:center top;width:45px}.fl-user-template-thumbnail .fl-builder--template-thumbnail:hover{box-shadow:none;transform:scale(1);transition-property:none}.fl-builder--save-new-user-template .fl-user-template-thumbnail .fl-builder--template-thumbnail{border-style:dashed;border-width:2px;border-color:#ccd4da}.fl-builder--save-new-user-template .fl-save-control{display:flex;flex-direction:row;flex:1}.fl-builder--save-new-user-template .fl-save-control input{background:0 0;border:none!important;flex:1;font-size:16px;margin-right:10px;margin-left:-12px;color:#000}.fl-builder-settings-message,.fl-builder-settings-message *{font-size:15px!important;line-height:23px!important}.fl-builder--save-new-user-template .fl-save-control input::-webkit-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input::-moz-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-ms-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-moz-placeholder{color:#777}@keyframes fl-slide-in-right{from{transform:translateX(50px)}to{transform:translateX(0)}}.fl-builder--save-new-user-template .fl-save-control button{display:none;animation-name:fl-slide-in-right;animation-duration:.25s;background-color:#00a0d2;border:none;padding:0 15px}.fl-save-control-mask{display:none;background:0 0;position:absolute;top:-50px;left:0;bottom:0;right:0;z-index:-1;min-height:80vh}.single-fl-builder-template .fl-content{width:100%!important}form.fl-builder-settings{height:100%;margin:0;padding:0;display:flex;flex-direction:column;letter-spacing:normal}.fl-builder-settings-message{padding:20px 25px!important;background:#f2f2f2!important}.fl-builder-preview-loader{position:relative;top:-2px;margin-left:3px}.fl-lightbox-header .fl-builder-preview-loader{margin:0;position:absolute;right:40px;top:15px}@keyframes fl-grab-attention{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}.fl-lightbox-width-slim .fl-form-table{margin:10px 12px 10px 10px!important;width:calc(100% - 40px)}.fl-lightbox-width-slim.fl-lightbox .fl-form-table th{display:block;position:relative;padding:10px 0 0 12px!important;width:auto!important}.fl-lightbox-width-slim .fl-form-table td{display:block}.fl-lightbox-width-slim .fl-form-table .fl-field[data-type=editor] td:first-child,.fl-lightbox-width-slim .fl-form-table td:first-child{padding-left:0!important}.fl-field-label .fl-field-responsive-toggle,.fl-lightbox-width-slim .fl-field-control-wrapper .fl-field-responsive-toggle{display:none}.fl-lightbox-width-slim .fl-field-label .fl-field-responsive-toggle{display:inline-block;padding:0 5px!important}.fl-lightbox-width-slim input.text-full+.fl-field-description,.fl-lightbox-width-slim select+.fl-field-description{display:block;padding:8px 10px;margin:0}.fl-lightbox-width-slim .fl-builder-settings-fields select{width:100%}.fl-lightbox-width-slim .fl-color-picker{display:flex;width:auto}.fl-lightbox-width-slim .fl-color-picker-clear{flex:0 0 40px}.fl-lightbox-width-slim .fl-field[data-type=dimension] .fl-field-responsive-setting{width:100%}.fl-lightbox-width-slim .fl-dimension-field-unit-select select{width:auto!important}.fl-lightbox-width-slim .fl-gradient-picker-color-row{width:50%}.fl-lightbox-width-slim .fl-color-picker.fl-gradient-picker-color,.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-option{width:100%}.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-options{float:none}.fl-lightbox-width-slim .mce-menubtn.mce-fixed-width button{width:72px!important}.fl-lightbox-width-slim .fl-builder-settings-tab-description{margin:20px 10px}.fl-lightbox-width-micro .mce-menubtn.mce-fixed-width button{width:38px!important}.fl-lightbox-width-micro .mce-btn[aria-label=Fullscreen],.fl-lightbox-width-micro .mce-btn[aria-label=Blockquote]{display:none}.fl-lightbox-width-micro .mce-toolbar i.mce-ico{width:18px}.fl-lightbox-width-slim .fl-field[data-type=editor] .fl-field-control-wrapper,.fl-lightbox-width-slim .fl-field[data-type=code] .fl-field-control-wrapper{margin-left:-10px;margin-right:-30px}.fl-lightbox .wp-editor-tools{padding-left:6px;padding-right:28px}.fl-lightbox .mce-top-part::before{box-shadow:none!important}.mce-container .mce-stack-layout span{color:initial}.fl-lightbox div.mce-toolbar-grp{background:0 0;border:none}.fl-lightbox div.mce-toolbar-grp>div{padding:0 3px}.fl-lightbox .fl-builder-settings .wp-switch-editor{background:#e7ebef;border:1px solid transparent}.fl-lightbox .html-active .switch-html,.fl-lightbox .quicktags-toolbar,.fl-lightbox .tmce-active .switch-tmce{background:#fff}.fl-lightbox .quicktags-toolbar,.fl-lightbox .wp-editor-container{border:none}.fl-lightbox .mce-toolbar .mce-container-body{display:flex;flex-direction:row}.fl-lightbox-width-slim .mce-toolbar .mce-container-body{justify-content:center}.fl-lightbox textarea.wp-editor-area{line-height:1.5;padding:20px;width:calc(100% - 10px)}.fl-lightbox .wp-core-ui .button,.fl-lightbox .wp-core-ui .button-secondary{border:none;box-shadow:none;background:#e7ebef}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units{width:auto}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units input{max-width:none;width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple{display:flex;flex-wrap:wrap;position:relative}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-control,.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-label{width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-form-field-preview-text{max-width:225px}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-builder-field-actions{position:absolute!important;top:0;right:0;width:70px;z-index:1}.fl-lightbox-width-slim .fl-builder-field-actions-single .fl-builder-field-copy{float:right!important;margin-right:5px}.fl-lightbox-width-slim .fl-field[data-type=time] select{width:auto}.fl-builder-settings-tabs{display:flex;flex-direction:row;align-items:stretch;overflow:hidden;height:32px;background:#e7ebef}.fl-builder-content-group-select{padding:0 10px 6px;display:none}.fl-builder-content-group-select select{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;padding:8px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;border:2px solid #e4e7ea;color:#161B20}select:focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;outline:0!important}.fl-legacy-settings-tab{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings-tab:first-child .fl-legacy-settings-tab{background:0 0;height:auto}body .fl-builder-settings-tabs>*{box-sizing:border-box;color:#676F7A!important;fill:#676F7A!important;background:0 0;border:2px solid transparent;border-radius:0;margin:0;outline:0;padding:1px 16px;text-decoration:none!important;font-size:13px;font-weight:400!important;flex:0 0 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:center}.fl-builder-custom-field a,.fl-builder-settings-tab-description a{text-decoration:underline!important}body .fl-lightbox-width-slim .fl-builder-settings-tabs>*{flex:1 1 auto}body .fl-builder-settings-tabs>.fl-builder-settings-tabs-more{flex:0 0 60px;display:none;margin-left:auto;justify-content:center}.fl-builder-settings-tabs-more svg{width:16px;height:auto;margin:auto}.fl-builder-settings-tabs-more g,.fl-builder-settings-tabs-more path,.fl-builder-settings-tabs-more svg{fill:inherit}body .fl-lightbox-has-tab-overflow .fl-builder-settings-tabs-more{display:flex}.fl-builder-settings-tabs>:active,.fl-builder-settings-tabs>:hover{top:0;color:#333;background:0 0;border:2px solid transparent}.fl-builder-settings-tabs>:focus{top:0;outline:0;border:2px solid transparent;background:0 0;color:#0086b0;fill:#0086b0}.fl-builder-settings-tabs .fl-active,.fl-builder-settings-tabs-more.fl-contains-active,.fl-builder-settings-tabs-overflow-menu .fl-active{color:#0086b0!important;fill:#0086b0!important;position:relative;background:#fff}.fl-builder-settings-tabs .fl-active.fl-overflowed,.fl-builder-settings-tabs .fl-overflowed{display:none!important}.fl-builder-settings-tabs .error{color:#d03436;padding-right:10px}.fl-builder-settings-tabs .error .fl-error-icon,.fl-builder-settings-tabs-overflow-menu .error .fl-error-icon{background:url(../img/sprite.png) -148px -5px no-repeat;display:inline-block;height:16px;margin-left:7px;position:relative;top:3px;width:16px}.fl-builder-settings-tabs-more.fl-contains-errors{fill:#d03436!important}.fl-builder-settings-tab{display:none;width:auto!important}.fl-builder-settings-tab.fl-active{display:block}.fl-builder-settings-tab-description{background:#e4e7ea;padding:10px 15px;border-radius:4px;margin:20px}.fl-builder-settings-tab-description a:hover{color:#333}.fl-builder-settings-tabs-overflow-menu{display:none;position:absolute;left:0;right:0;border:2px solid #e6eaed;border-top:3px solid #00a0d2;border-radius:4px;background:#fff;z-index:9999;margin:0 6px;padding:10px;flex-direction:column;box-shadow:0 0 20px 2px rgba(0,0,0,.2)}.fl-builder-settings-tabs-overflow-menu:before{bottom:100%;right:20px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:10px;margin-left:-10px}.fl-builder-settings-tabs-overflow-menu>a{display:block;padding:10px 15px;font-size:14px;font-weight:600!important;border:2px solid transparent;border-radius:4px;outline:0}.fl-builder-settings-tabs-overflow-menu>a:hover{background:#e6eaed;text-decoration:none}.fl-builder-settings-tabs-overflow-click-mask{display:none;position:fixed;top:0;bottom:0;left:0;right:0;background:0 0;z-index:11}.fl-lightbox .fl-form-table{display:table;background:none;border:none;overflow:inherit;width:calc(100% - 35px)}.fl-lightbox .fl-form-table tbody{border:none}.fl-form-table tr:nth-child(even),.fl-lightbox .fl-form-table tr{background:0 0}.fl-lightbox .fl-form-table td,.fl-lightbox .fl-form-table th{background:0 0!important;border:none!important;font-weight:400!important;text-align:left!important}.fl-lightbox .fl-form-table th{padding:10px 15px 10px 30px!important;vertical-align:top!important;width:200px!important}.fl-lightbox .fl-form-table td:first-child{padding-left:30px!important}.fl-lightbox .fl-form-table th label{color:#333;width:auto;max-width:100%}.fl-lightbox .fl-form-table th label i{color:grey}.fl-lightbox .fl-form-table th label i:hover{color:#555}.fl-lightbox .fl-form-table td{padding:8px 10px}.fl-lightbox-width-slim .fl-form-table td{padding:4px 0 5px}.fl-builder-settings-fields{margin:0;overflow:hidden;position:relative;flex:1 100%;visibility:hidden}.fl-lightbox-header .fl-builder-settings-fields{height:auto;margin:0;position:absolute;right:10px;top:10px}.fl-builder-settings-fields .fl-nanoscroller-content{padding:4px 0 0}.fl-builder-settings-fields .fl-field-control-wrapper{position:relative}.fl-field{animation-duration:.25s;animation-delay:.1s}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select,.fl-builder-settings-fields textarea{background:#fff!important;border-color:transparent!important;border-style:solid;border-width:2px;border-radius:4px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);color:#333!important;display:inline;font-size:13px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px 6px;width:auto;box-sizing:border-box}i.fl-dimension-field-link,i.fl-field-responsive-toggle{line-height:18px!important;cursor:pointer;vertical-align:middle}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select:not(multiple){height:36px!important}.fl-builder-settings-fields select,.fl-builder-settings-fields select[multiple]{height:auto!important}.fl-builder-settings-fields input[type=number]{width:70px}.fl-builder-lightbox .fl-builder-settings-fields input[type=date]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=email]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=file]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=number]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=password]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=search]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=text]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=url]:focus,.fl-builder-lightbox .fl-builder-settings-fields select:focus,.fl-builder-lightbox .fl-builder-settings-fields textarea:not(.wp-editor-area):focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)!important}.fl-builder-settings-fields ::-webkit-input-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-moz-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields ::-moz-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-ms-input-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields label{display:inline-block;font-weight:400;user-select:none;margin-bottom:3px;font-size:12px}.fl-builder-settings-fields select{-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;color:#000;margin:0 0 2px;padding:2px 10px;padding-right:30px!important;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important}.fl-dimension-field-unit input[type=number],.fl-unit-field-inputs input[type=number]{-moz-appearance:textfield}.fl-builder-settings-fields select[multiple]{height:60px;background-image:none!important}.fl-builder-custom-field select,.fl-photo-field select{-webkit-box-shadow:none;box-shadow:none;border-color:#e6eaed!important}.fl-builder-settings-section:first-child{border-top:none!important}.fl-builder-settings-section-header{background-color:#e7ebef;border-top:4px solid #e7ebef;cursor:pointer;height:30px;display:flex;flex-direction:row}.fl-builder-settings-description{padding:0 10px 10px;margin:0;font-style:italic;opacity:.75}.fl-builder-settings-fields table{margin:20px 0}.fl-builder-settings-fields .fl-builder-settings-title{display:flex;align-items:center;background:#F5F7F9;color:#353535;padding:2px 10px;margin:0;font-size:13px!important;font-weight:400;user-select:none;border:2px solid transparent;border-radius:0}.fl-builder-settings-fields .fl-builder-settings-title:active,.fl-builder-settings-fields .fl-builder-settings-title:hover{top:0}.fl-builder-settings-fields .fl-builder-settings-title:focus{top:0;border-color:#e0e4ea}.fl-builder-settings-fields .fl-builder-settings-title>svg{height:6px;width:9px;margin-right:7px;transition-property:transform;transition-duration:.15s}.fl-builder-settings-section-collapsed{margin-bottom:4px}.fl-builder-settings-section-collapsed .fl-builder-settings-section-content{display:none}.fl-builder-settings-section-collapsed .fl-builder-settings-title{background:0 0;flex:1 1 100%}.fl-builder-settings-section-collapsed .fl-builder-settings-title>svg{transform:rotate(-90deg)}.wp-core-ui h1,.wp-core-ui h2,.wp-core-ui h3,.wp-core-ui h4,.wp-core-ui h5,.wp-core-ui h6,.wp-core-ui p{color:#333;font-family:inherit}.wp-core-ui #media-attachment-date-filters{width:auto}.wp-core-ui input[type=search]::placeholder{color:#333}.wp-core-ui .submitbox .submitdelete{color:#a00}.wp-core-ui button{font-weight:400}.wp-core-ui input[type=date],.wp-core-ui input[type=email],.wp-core-ui input[type=file],.wp-core-ui input[type=number],.wp-core-ui input[type=password],.wp-core-ui input[type=search],.wp-core-ui input[type=tel],.wp-core-ui input[type=text],.wp-core-ui input[type=url],.wp-core-ui select,.wp-core-ui textarea{background-color:#fff;border-color:#dfdfdf;border-style:solid;border-width:1px;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;color:#333;font-weight:400}.wp-core-ui input[type=date]:focus,.wp-core-ui input[type=email]:focus,.wp-core-ui input[type=file]:focus,.wp-core-ui input[type=number]:focus,.wp-core-ui input[type=password]:focus,.wp-core-ui input[type=search]:focus,.wp-core-ui input[type=tel]:focus,.wp-core-ui input[type=text]:focus,.wp-core-ui input[type=url]:focus,.wp-core-ui select:focus,.wp-core-ui textarea:focus{background:0 0;border-color:#aaa}.wp-core-ui input[type=search]{background-image:none;padding:6px}.fl-field-responsive-setting{display:inline-block;width:100%}.fl-field-responsive-setting-medium,.fl-field-responsive-setting-responsive{display:none}.fl-field-control-wrapper i.fl-field-responsive-toggle{padding:9px 0 0;position:absolute;left:-25px}i.fl-field-responsive-toggle{color:grey;display:inline-block;font-size:15px!important;height:auto;text-align:left;width:20px}.fl-builder-settings-fields input.text-full,.fl-builder-settings-fields textarea{width:100%}i.fl-field-responsive-toggle:hover{color:#000}.fl-builder-settings-fields .fl-text-field-add-value{min-width:50%;margin-top:.62em}.fl-field[data-type=shadow] .fl-field-control-wrapper{display:flex}.fl-shadow-field .fl-color-picker{margin-bottom:15px;width:100%}.fl-color-picker{cursor:pointer}.fl-color-picker .fl-color-picker-clear{box-sizing:border-box;display:inline-block}.fl-color-picker .fl-color-picker-clear:hover{background-color:#ededed}.colorpicker input{padding:0!important;font-size:11px!important;color:#fff!important;width:29px!important;height:auto!important;background:0 0!important;border:none!important}.colorpicker .colorpicker_hex input{width:45px!important}.fl-gradient-picker-type{display:flex;margin-bottom:15px}.fl-gradient-picker-type input{margin:0!important}.fl-gradient-picker-type select{margin-bottom:0!important}.fl-gradient-picker-type-select{margin-right:10px!important}.fl-gradient-picker-colors{display:flex}.fl-gradient-picker-color-row{display:flex;margin-right:15px}.fl-color-picker.fl-gradient-picker-color,.fl-gradient-picker-color-row:last-child{margin-right:0}.fl-color-picker.fl-gradient-picker-color .fl-color-picker-color{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-gradient-picker .fl-gradient-picker-stop input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;margin:0!important}.fl-field[data-type=dimension] .fl-field-label label{padding-right:35px}.fl-field[data-type=dimension] .fl-field-control-wrapper{display:flex}.fl-field[data-type=dimension] .fl-field-description{padding:9px 0 0 5px}.fl-field[data-type=dimension] .fl-field-responsive-setting{width:auto}.fl-dimension-field-units{border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:flex;height:36px;margin:1px 1px 20px;position:relative;max-width:350px}.fl-dimension-field-units>*{border-right:1px solid #e6eaed;width:100%}body .fl-dimension-field-units>:last-child{border-right:none!important}body .fl-dimension-field-units>:first-child>input[type]{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}body .fl-dimension-field-units>:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-dimension-field-unit input[type],.fl-dimension-field-units .fl-field-unit-select{box-shadow:none!important;margin:0!important;border-radius:0!important}.fl-dimension-field-unit input{width:100%!important}.fl-dimension-field-unit input::-webkit-inner-spin-button,.fl-dimension-field-unit input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-dimension-field-unit label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-dimension-field-unit .fl-field-popup-slider{margin-top:27px}i.fl-dimension-field-link{color:grey;font-size:15px!important;height:auto;text-align:left;width:20px}i.fl-dimension-field-link:hover{color:#000}i.fl-dimension-field-link.dashicons-editor-unlink,i.fl-dimension-field-link.dashicons-editor-unlink:hover{color:#0086b0}.fl-field-label .fl-dimension-field-link,.fl-lightbox-width-slim .fl-dimension-field-link{display:none}.fl-lightbox-width-slim .fl-field-label .fl-dimension-field-link{display:inline-block}.fl-field-control-wrapper .fl-dimension-field-link{padding:9px 0 0;left:-50px;position:absolute}.fl-dimension-field-unit-select{display:flex;width:auto!important}.fl-field[data-type=unit] .fl-field-control-wrapper{display:flex}.fl-field[data-type=unit] .fl-field-description{margin-left:7px!important;padding-top:9px}.fl-field[data-type=unit] .fl-field-responsive-setting{width:auto}.fl-unit-field-inputs{background:0 0;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:flex}.fl-unit-field-inputs .fl-field-unit-select,.fl-unit-field-inputs input[type]{box-shadow:none!important;margin:0!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-unit-field-inputs .fl-field-unit-select{display:flex;justify-content:center;align-items:center}.fl-unit-field-inputs input::-webkit-inner-spin-button,.fl-unit-field-inputs input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-unit-field-input{border-right:1px solid #e6eaed!important}body .fl-unit-field-input:last-child{border-right:none!important}body .fl-unit-field-input:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-unit-field-unit-select{display:flex;width:auto!important}select.fl-field-unit-select{background-color:#E7EBEF!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}div.fl-field-unit-select{background-color:#E7EBEF!important;padding:9px 7px!important;flex:1 0 auto}.fl-field-popup-slider{background:#fff;border-radius:4px;box-shadow:0 4px 25px 0 rgba(0,0,0,.18);display:none;margin-top:10px;padding:15px;position:absolute;left:0;right:0;z-index:9999}.fl-field-popup-slider-top{margin-top:0!important;top:-100%;transform:translateY(-10px)}.fl-field-popup-slider-input{background:#E7EBEF;cursor:pointer;height:4px;text-align:left;position:relative;border-radius:3px}.fl-field-popup-slider-input .ui-slider-handle{background:#fff;border:2px solid #3AA4CC;border-radius:100%;cursor:pointer;height:12px;width:12px;position:absolute;top:-6px;margin-left:-7px}.fl-field-popup-slider-input .ui-slider-handle:focus{outline:0}.fl-field-popup-slider-arrow{position:absolute;top:-22px}.fl-field-popup-slider-arrow:after{content:' ';border-color:transparent transparent #fff;border-style:solid;border-width:0 8px 8px;width:0;height:0}.fl-field-popup-slider-top .fl-field-popup-slider-arrow{top:auto;bottom:-24px}.fl-field-popup-slider-top .fl-field-popup-slider-arrow:after{border-bottom-width:0;border-top-width:8px;border-top-color:#fff}input[type=number].fl-field-popup-slider-focus{border:2px solid #00a0d2!important}.fl-font-field{display:flex}.fl-font-field label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-font-field .fl-font-field-font-wrapper{margin-right:8px;width:70%!important}.fl-font-field .fl-font-field-weight-wrapper{width:30%!important}.fl-compound-field{max-width:350px}.fl-compound-field-section-toggle{background:#E7EAEF;border-radius:4px;border-top:2px solid transparent;border-bottom:2px solid transparent;cursor:pointer;align-items:center;display:flex;height:32px;margin-bottom:8px;padding:0 12px}.fl-compound-field-section-toggle:hover{background:#dadfe5}.fl-compound-field-section-toggle .dashicons{font-size:15px;height:15px;margin-right:5px;width:15px}.fl-compound-field-section:last-child .fl-compound-field-section-toggle{margin-bottom:0}.fl-compound-field-section.fl-compound-field-section-visible{padding-bottom:12px}.fl-compound-field-section.fl-compound-field-section-visible:last-child{padding-bottom:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle{background:0 0;border-top:2px solid #E7EBEF;border-radius:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle:hover{background:0 0}.fl-compound-field-section-visible .fl-compound-field-section-toggle .dashicons:before{content:'\f347'}.fl-compound-field-row{display:none;padding-bottom:12px}.fl-compound-field-section-visible .fl-compound-field-row{display:flex}.fl-compound-field-label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-compound-field-label-bottom{padding:6px 0 0 12px}.fl-compound-field-label .fl-dimension-field-link{display:inline-block;padding:0 0 0 2px;position:relative;left:auto;top:-1px}.fl-compound-field-setting{padding-right:8px;width:100%}.fl-compound-field-setting:last-child{padding-right:0}.fl-compound-field-setting select{margin:0!important;width:100%}.fl-compound-field-setting .fl-unit-field-input input{width:100%!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-compound-field-setting .fl-unit-field-input{width:50%!important}.fl-compound-field-setting .fl-unit-field-input select.fl-field-unit-select{background-position:center right 2px!important;padding:2px 5px!important;width:100%;font-size:11px}.fl-typography-field .fl-font-field-font-wrapper{margin-right:8px!important}.fl-typography-field-spacing{width:calc(33.33% - 8px)}.fl-typography-field-transform{width:66.66%}.fl-typography-field-transform .fl-button-group-field-options{float:none}.fl-typography-field-transform .fl-button-group-field-option{width:auto;padding:0 7px}.fl-typography-field .fl-shadow-field{display:flex}.fl-typography-field .fl-shadow-field .fl-color-picker{margin:0 8px 0 0;width:calc(33.33% - 8px)}.fl-typography-field .fl-shadow-field .fl-dimension-field-units{margin-left:0;margin-top:0;margin-right:0;width:66.66%}.fl-button-group-field-options{background:#E7EBEF;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:flex;float:left;height:36px;overflow:hidden}.fl-button-group-field-option{cursor:pointer;display:flex;flex:1 1 auto;align-items:center;justify-content:center;padding:0 5px;border-radius:0;border:2px solid transparent;background:0 0!important}.fl-button-group-field-option:hover{top:0;background-color:transparent;color:#000;border:2px solid transparent}.fl-button-group-field-option:focus{top:0;background-color:transparent;border:2px solid #00a0d2;color:#333}.fl-button-group-field-option:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-button-group-field-option:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-button-group-field-option[data-selected="1"]{background-color:#fff!important;color:#000}.fl-button-group-field-option i{color:#6B6E75}.fl-button-group-field-option:hover i{color:#333}.fl-compound-field-cell{width:50%;display:block;float:left;padding-top:13px}.fl-compound-field-cell:first-child{padding-right:4px}.fl-compound-field-cell:last-child{padding-left:4px}.fl-compound-field-cell label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-shape-transform-field .fl-compound-field-row{display:flex;flex-direction:row}.fl-shape-transform-field .fl-compound-field-row>*{width:auto;flex:1 1 auto}.fl-shape-transform-field .fl-compound-field-row>:first-child{flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls{display:flex;flex-direction:row}.fl-shape-transform-field .fl-shape-orientation-controls>*{flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>*,.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>* button{border-radius:0}.fl-shape-orientation-controls .fl-button-group-field:first-child>*,.fl-shape-orientation-controls .fl-button-group-field:first-child>* button{border-top-left-radius:4px;border-bottom-left-radius:4px}.fl-shape-orientation-controls .fl-button-group-field:last-child>*,.fl-shape-orientation-controls .fl-button-group-field:last-child>* button{border-top-right-radius:4px;border-bottom-right-radius:4px}.fl-builder-custom-field{background:#fff;border:2px solid transparent;border-radius:4px;padding:7px 10px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);min-height:36px;box-sizing:border-box}.fl-builder-field-multiple .fl-builder-custom-field{cursor:move}.fl-builder-custom-field a{color:#21759b!important}.fl-builder-custom-field a:hover{color:#d54e21!important}.fl-builder-custom-field label.error{margin-top:5px}.fl-photo-field .fl-photo-preview{display:flex}.fl-photo-field .fl-photo-select,.fl-photo-field.fl-photo-empty .fl-photo-preview{display:none}.fl-photo-field.fl-photo-empty .fl-photo-select{display:block}.fl-photo-field .fl-photo-preview-img{line-height:0;margin:5px 0}.fl-photo-field .fl-photo-preview-img img{max-width:60px}.fl-photo-field .fl-photo-preview select{margin:8px 0 8px 10px;width:calc(100% - 10px)}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview select{display:none}.fl-photo-field .fl-photo-preview-filename{display:none;font-size:13px;font-weight:700;margin:5px 0 9px 11px}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview-filename{display:inline-block;word-break:break-all}.fl-multiple-photos-field .fl-multiple-photos-select,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-add,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-count,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-edit,.fl-multiple-photos-lightbox .gallery-settings,.fl-photo-field.fl-photo-no-attachment .fl-photo-edit{display:none}.fl-photo-field .fl-photo-edit{margin:0 0 0 11px}.fl-photo-field .fl-photo-remove,.fl-photo-field .fl-photo-replace{margin:0 0 0 8px}.fl-builder-edit .media-modal{z-index:9999991}.fl-builder-edit .media-modal-backdrop{z-index:999999}.fl-builder-edit .media-frame{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fl-builder-edit .media-modal-content{letter-spacing:normal}.fl-builder-edit .media-modal-content h1{font-family:inherit}.fl-builder-edit form#wp-link,.popover[class*=tour-],ul.as-list{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-builder-edit .media-modal-content .thumbnail{padding:0;border:none;border-radius:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail{margin-bottom:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail img{max-width:none}.fl-builder-edit button.media-modal-close{position:absolute;box-shadow:none;-webkit-box-shadow:none}.fl-builder-edit .media-frame.hide-menu{visibility:visible}.fl-builder-edit .media-modal .media-frame-content *,.fl-builder-edit .media-modal .media-frame-router .media-router *{color:grey}span.select2-container.select2-container--open{z-index:9999999}.fl-multiple-photos-field .fl-multiple-photos-add{margin:0 0 0 8px}.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-select{display:inline}.fl-multiple-photos-count{font-weight:700;margin-bottom:3px}.fl-video-field .fl-video-select,.fl-video-field.fl-video-empty .fl-video-preview{display:none}.fl-video-field.fl-video-empty .fl-video-select{display:block}.fl-video-field .fl-video-preview-img{float:left;line-height:0;margin:5px 0}.fl-video-field .fl-video-preview-img img{max-width:60px}.fl-video-field .fl-video-preview-img .dashicons.dashicons-media-video{display:block;font-size:60px;height:60px;line-height:60px;width:60px}.fl-video-field .fl-video-preview-filename{display:inline-block;font-size:14px;font-weight:700;margin:7px 0 5px 11px}.fl-video-field .fl-video-remove,.fl-video-field .fl-video-replace{margin:0 0 0 11px}.fl-multiple-audios-field .fl-multiple-audios-select,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-add,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-edit{display:none}.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-select{display:block}.fl-multiple-audios-field .fl-multiple-audios-add{margin:0 0 0 8px}.fl-icon-field .fl-icon-select,.fl-icon-field.fl-icon-empty .fl-icon-preview{display:none}.fl-icon-field.fl-icon-empty .fl-icon-select{display:block}.fl-icon-field .fl-icon-preview i{display:inline-block;font-size:28px;margin:10px 10px 9px;vertical-align:middle}.fl-icon-field .fl-icon-remove{margin:0 0 0 8px}.fl-builder-hidden-editor{display:none}.fl-builder-settings .wp-switch-editor{border-radius:0;color:#333;margin-top:2px}.fl-builder-settings .mce-toolbar .mce-btn-group .mce-btn{margin:2px 0}.fl-builder-settings .mce-menubtn.mce-fixed-width button{width:100px}.fl-builder-settings .mce-menubtn.mce-fixed-width span{width:100%}.mce-close:active,.mce-close:hover,.mce-toolbar .mce-btn button:active,.mce-toolbar .mce-btn button:hover,.mce-window .mce-btn button:active,.mce-window .mce-btn button:hover{background:0 0;border:none}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:1px!important}.wp-editor-container textarea.wp-editor-area{background:0 0;border:none;padding:10px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.fl-builder-edit form#wp-link{color:#000;font-size:13px}.fl-builder-edit form#wp-link #link-options label{display:block;margin-bottom:2px}.fl-builder-edit form#wp-link #link-options label span{padding-right:10px;vertical-align:middle}.fl-builder-edit form#wp-link #link-options input[type=text]{display:inline-block;height:auto;margin:5px 0 0;padding:3px 5px;width:80%}.fl-builder-edit form#wp-link .query-results{top:225px}.fl-code-field{border:1px solid #E6E6E6;border-left:none}.ace_editor,.ace_editor *{font-family:Monaco,Menlo,"Ubuntu Mono","Droid Sans Mono",Consolas,monospace!important;font-size:12px!important;font-weight:400!important;letter-spacing:0!important}.fl-layout-field-option{border:2px solid #d9d9d9;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;cursor:pointer;float:left;line-height:0;max-width:23%;margin:0 1% 2%;padding:5px}.fl-layout-field-option-selected,.fl-layout-field-option:hover{border-color:red}.fl-layout-field-option img{max-width:100%}.fl-link-field .fl-link-field-input-wrap{display:flex;flex-direction:row}.fl-link-field-input{width:auto!important;flex:1 1 100%}.fl-link-field .fl-link-field-input-wrap button{flex:0 0 0%;height:36px;margin:1px 1px 1px 5px}.fl-link-field-options-wrap{padding:7px 0 0 12px}.fl-link-field-options-wrap label{margin-right:7px}.fl-link-field-options-wrap span{font-size:11px;font-weight:700;color:inherit!important;text-align:center;opacity:.5}.fl-link-field-search{display:none;border:2px solid #e6eaed;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;margin:4px 0 0;padding:10px}.fl-link-field-search-title{display:block;margin:0 0 3px 2px}.fl-link-field-search-cancel{margin-top:6px}.fl-link-field-search input{box-shadow:none!important;width:100%!important;padding:3px 9px!important}.fl-link-field-search #as-original-link-search{width:100%}.fl-field-connections-toggle{padding:10px 0}.fl-field[data-type=editor] .fl-field-connections-toggle{align-items:flex-start}.fl-field[data-type=link] .fl-field-connections-toggle{height:24px;margin-top:1px;align-items:flex-start}.fl-field[data-type=link] .fl-field-connection{bottom:20px}.fl-field-connections-menu[data-field=fl-field-text]{margin-top:30px}.fl-help-tooltip{display:inline-block;position:relative}.fl-lightbox-width-slim .fl-help-tooltip{position:static}.fl-help-tooltip-icon{color:#999!important;cursor:pointer;font-size:15px!important;padding:5px;vertical-align:middle}.fl-help-tooltip-text{box-sizing:border-box;background:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ccc;-moz-box-shadow:0 0 5px #ccc;-webkit-box-shadow:0 0 5px #ccc;display:none;font-weight:400;left:23px;padding:10px 13px;position:absolute;top:-6px;width:250px;z-index:1000;border-radius:4px}.fl-lightbox-width-slim .fl-help-tooltip-text{top:30px;left:0;width:100%}.fl-field-control .fl-form-field{margin-bottom:0}.fl-form-field[data-preview-text=icon]{display:flex;align-items:center}.fl-form-field-preview-text i{display:inline-block;font-size:18px;line-height:22px;margin-right:10px}.fl-builder-field-actions{padding-left:0!important;padding-right:0!important;text-align:center;width:85px}.fl-builder-field-actions i{color:#999!important;cursor:pointer;font-size:13px!important;line-height:29px!important;width:16px}.fl-builder-field-actions i:hover{color:#000!important}.fl-builder-field-actions i.fl-builder-field-copy,.fl-builder-field-actions i.fl-builder-field-delete{margin-left:5px}.fl-builder-field-actions i.fl-builder-field-move{cursor:move}.fl-builder-field-dd-helper{background:#ccc;height:30px!important;float:left;width:130px!important}.fl-builder-field-dd-zone{border:1px dashed #ccc;height:30px}.fl-builder-field-actions-single .fl-builder-field-delete,.fl-builder-field-actions-single .fl-builder-field-move{display:none!important}.fl-builder-field-multiple .fl-builder-field-actions,.fl-builder-field-multiple .fl-field-control,.fl-builder-field-multiple .fl-field-label{padding-top:2px!important;padding-bottom:2px!important}.fl-builder-field-multiple .fl-builder-field-actions{min-width:70px!important}.fl-builder-field-multiple[data-field=icons] .fl-builder-field-actions{width:70px!important}.fl-builder-field-multiple.ui-sortable-helper .fl-field-control{width:60%}.fl-builder-field-multiple.ui-sortable-helper .fl-builder-field-actions{display:none}.fl-builder-widget-settings input{display:inline-block!important;margin:5px 10px 8px!important}.fl-builder-lightbox-loading{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings .error,.fl-builder-settings input.error{color:#d03436!important}.fl-builder-settings label.error,.fl-builder-settings p.error{color:#d03436;display:block;margin-top:5px}.fl-builder-settings .fl-form-table .fl-field-description{color:#464646;font-style:normal;margin-left:2px}.fl-lightbox .fl-field-connection{right:-1px}.fl-lightbox .fl-field-connection-content{border:2px solid transparent!important;background:#e7ebef!important}.fl-field-connection-content .fl-field-connection-label{color:#676f7a!important}.fl-field-connections-toggle{pointer-events:none;width:20px;right:-25px}.has-scrollbar .fl-field-connections-toggle{right:-22px}.fl-lightbox-width-slim tr[data-type=code] .fl-field-connections-toggle{right:10px}.fl-lightbox-width-slim .fl-code-field{width:90%}.fl-field-connections-toggle-open{transform:none!important}.fl-field-connections-toggle i{pointer-events:auto;color:#abb1ba;font-size:13px!important;transition-property:transform;transition-duration:.15s}.fl-field-connections-toggle-open i{transform:rotate(-45deg)}ul.as-selections{background-color:#fff;border:none;border-radius:4px;box-shadow:none;color:#333;font-size:12px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px;width:auto}ul.as-selections.loading{background:url(../img/ajax-loader-small.svg) 98% center no-repeat}ul.as-selections li.as-selection-item{background:#d4eaf6;border:none;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;font-size:11px;line-height:14px;padding:8px 15px;border-radius:4px;margin:2px}ul.as-selections li.as-selection-item.blur{background:#f4f4f4}ul.as-selections li.as-selection-item a.as-close{line-height:12px}ul.as-selections li.as-original{margin:0}ul.as-selections li.as-original input{height:auto;font-size:12px;margin:0;padding:0;box-shadow:none}ul.as-list{margin:0;font-size:13px;color:#000;background-color:#fff;background-color:rgba(255,255,255,.95);z-index:2;-webkit-box-shadow:0 0 10px rgba(0,0,0,.1);-moz-box-shadow:0 0 10px rgba(0,0,0,.1);box-shadow:0 0 10px rgba(0,0,0,.1);-ms-border-radius:0;-o-border-radius:0;border:none;border:1px solid #dfdfdf;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}ul.as-list span.type{float:right}li.as-message,li.as-result-item{border:none}li.as-result-item.active{background:#e5e5e5;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;color:#333;text-shadow:none}li.as-result-item em{background:0 0!important;color:#333!important;font-size:12px;padding:0!important;font-weight:700}.fl-custom-query-filter{display:none}.fl-custom-query .fl-field[data-type=suggest] select{margin-bottom:5px;width:100%}.fl-builder-service-settings{position:relative}.fl-builder-service-error{color:red!important;padding:15px 0 0}.fl-builder-service-account-delete{color:red!important;margin-left:10px;position:relative;top:2px}.fl-lightbox-width-slim .fl-builder-service-account-delete{display:block;padding-top:7px}#fl-field-visibility_user_capability .fl-field-description,.fl-builder-service-connect-row .fl-field-description{background:#f0f0f0;color:#333!important;display:block;float:none;margin:10px 0 0;padding:10px}#fl-field-visibility_user_capability .fl-field-description a,.fl-builder-service-connect-row .fl-field-description a{color:#21759b!important;text-decoration:underline!important}.fl-ordering-field-option{background:#fff;border:1px solid #dfdfdf;border-radius:3px;cursor:move;margin-bottom:5px;padding:5px 10px}.fl-ordering-field-option .fa{color:#ccc;float:right;line-height:16px}#tiptip_holder{z-index:1000000}#tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#333}#tiptip_holder.tip_bottom #tiptip_arrow_inner{border-bottom-color:#333}#tiptip_holder.tip_right #tiptip_arrow_inner{border-right-color:#333}#tiptip_holder.tip_left #tiptip_arrow_inner{border-left-color:#333}#tiptip_content{background:#333;box-shadow:none;letter-spacing:normal}.fl-builder-row-settings .fl-field-responsive-setting input[name=bg_position_custom_right],.fl-builder-row-settings .fl-field-responsive-setting input[name=bg_position_custom_left]{display:none!important}.fl-builder-getting-started-video{line-height:0!important;padding:10px}.fl-builder-getting-started-video iframe{border:none;height:326px;width:100%}.fl-builder-tour-actions .fl-builder-actions-title{font-size:14px!important;line-height:19px}.fl-builder-tour-mask{bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000000}.fl-builder-tour-dimmed{background:rgba(0,0,0,.7);bottom:0;left:0;position:absolute;right:0;top:0}body>.fl-builder-tour-dimmed{position:fixed}.tour-backdrop{z-index:110000}.popover[class*=tour-]{border:1px solid #ccc;border-radius:0;-webkit-box-shadow:0 0 30px rgba(0,0,0,.3);box-shadow:0 0 40px rgba(0,0,0,.3);color:#666;font-size:13px;font-weight:400;line-height:18px;max-width:none;padding:0;width:300px;z-index:100000001}.popover[class*=tour-].bottom>.arrow{border-bottom-color:#ccc}.popover[class*=tour-].bottom>.arrow:after{border-bottom-color:#f7f7f7}.popover[class*=tour-] .popover-title{border-radius:0;color:#333;letter-spacing:normal;text-transform:none}.popover[class*=tour-] .fa-times{color:#b3b3b3;cursor:pointer;font-size:16px;padding:5px;position:absolute;right:3px;top:2px}.popover[class*=tour-] .fa-times:hover{color:#666}.popover[class*=tour-] .popover-content{border-bottom:1px solid #d9d9d9;padding:13px 15px}.popover[class*=tour-] .fl-builder-tour-next{display:block;float:none;width:100%}.popover-navigation button{min-height:36px}.fl-builder-shortcode-mask-wrap{position:relative;pointer-events:none}.fl-builder-shortcode-mask{bottom:-1px;left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fl-builder--search{border:2px solid transparent;position:relative;padding:0;width:54px;transition-property:width;transition-delay:.1s;transition-duration:.15s}.fl-builder--search.is-expanded{border:2px solid #00A0D0}.fl-builder--search input[type=text],.fl-builder--search input[type=text]:focus{background-color:transparent;border:none!important;box-sizing:border-box;width:100%;font-size:16px;text-align:center}.fl-builder--search:before{display:flex;top:0;left:0;align-items:center;justify-content:center;content:"\f002";font:normal normal normal 14px/1 Font Awesome\ 5 Free;text-align:center;width:100%;height:100%;position:absolute;pointer-events:none;color:rgba(128,128,128,.6);font-size:17px;opacity:1;transition-property:opacity;transition-duration:.15s}.fl-builder--main-menu-panel,.fl-builder-ui-keyboard-shortcuts{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-builder--search.has-text:before,.fl-builder--search.is-expanded:before{opacity:0}.fl-builder--search input::-webkit-input-placeholder{color:rgba(128,128,128,0)!important;transition:color .25s}.fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(128,128,128,.4)!important}.fl-builder--search .search-label{cursor:text}.fl-builder--search .search-clear{display:none;padding:10px 10px 10px 30px;color:#a7a7a7;font-size:12px;position:absolute;right:0;top:0;background-color:#eff1f2;background:linear-gradient(to left,#e4e7ea,#e4e7ea 75%,rgba(228,231,234,0))}.fl-builder--search.has-text .search-clear,.fl-builder--search.is-expanded input{display:inline-block}.fl-builder--search:hover .search-clear{color:#888;background-color:#eff1f2;background:linear-gradient(to left,#dadfe5,#dadfe5 75%,rgba(218,223,229,0))}.fl-builder--search.is-expanded{width:246px}@keyframes fl-builder-show-menu-item{from{transform:translateY(10px) scale(.8);opacity:0}to{transform:translateX(0) translateY(0) scale(1);opacity:1}}.fl-builder--main-menu-panel{display:none;box-sizing:border-box;position:fixed;top:calc(45px + 10px);left:10px;width:360px;color:#222;max-height:calc(100% - 66px);border-radius:4px;background:#fff;border:none;border-top:3px solid #00a0d2;box-shadow:0 11px 45px 8px rgba(0,0,0,.1);font-size:14px!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:10000009;pointer-events:auto}.fl-builder--main-menu-panel.is-showing{display:flex}.fl-builder--main-menu-panel:before,.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items:before{bottom:100%;right:6px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:13px;margin-left:-13px}.fl-builder--main-menu-panel-views{flex:1 1 100%;overflow:auto}.fl-builder--main-menu-panel-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000119}.fl-builder--main-menu-panel .fl-builder--tabs{padding-left:20px;padding-top:15px}.fl-builder--main-menu-panel-view{display:none}.fl-builder--main-menu-panel-view.is-showing{display:block}.fl-builder--main-menu-panel-view-title{font-size:24px;font-weight:600;padding:25px 22px 0;line-height:1;white-space:nowrap}.fl-builder--main-menu-panel-view-title .title-accessory{float:right;color:#b1b1b1}.fl-builder--main-menu-panel-view-title .title-accessory>i{font-size:20px!important;width:25px!important}.fl-builder--main-menu-panel-view-title .title-accessory>i:hover{color:#222}.fl-builder--main-menu-panel-view-title .pop-view{padding:10px;margin-left:-10px;opacity:.5;font-size:25px;font-weight:400;cursor:pointer;background:0 0;outline:0;border:none;color:inherit}.fl-builder--main-menu-panel-view-title .pop-view:focus{outline:0;top:0;background:#E5EAED!important}.fl-builder--main-menu-panel-view-title button{float:right}.fl-builder--menu-item:before{display:block;content:"";float:none;clear:both}.fl-builder--menu-item{color:inherit;text-align:left;box-sizing:border-box;display:block;padding:10px 15px;margin:0 10px;width:calc(100% - 20px);background:0 0;border:none;border-radius:4px;font-size:14px;line-height:1.1;cursor:pointer;opacity:1;text-transform:none}.fl-builder--menu-item .menu-view.view-revisions{opacity:.5;padding-left:5px}.fl-builder--menu-item .menu-event.event-showGlobalSettings,.fl-builder--menu-item .menu-event.event-showLayoutSettings{color:#6bc373;padding-left:5px}.fl-builder--menu-item:hover{background:#eaf1f8;border:none;text-decoration:none;color:#000}.fl-builder--selector-menu .fl-builder--menu-item:hover{background:#fff}.fl-builder--menu-item-accessory{float:right;text-align:center;display:inline-block;min-width:40px;font-size:14px}.fl-builder--menu-item-accessory.view-arrow{font-size:18px}.fl-builder--menu{padding:0;margin:20px 0}.fl-builder--menu hr{margin:8px 0;background:#e6eaed!important;height:1px;border:none}.fl-builder--menu .fl-builder-video-wrap{padding:0 10px 10px}.fl-revision-list-item{display:flex}.fl-revision-list-item-text{padding-left:15px}.fl-revision-list-item-date{padding-bottom:5px}.fl-builder--revision-actions{display:none;position:fixed;top:4px;left:4px;z-index:100008;padding:4px 4px 6px;justify-content:center;background:#fff;border-radius:4px}.fl-builder--revision-actions *{margin-right:5px}.fl-builder--revision-actions :last-child{margin:0}.fl-builder--menu-item[data-event=noRevisionsMessage]:hover{background:0 0;box-shadow:none;cursor:default}.fl-no-revisions-message-title{font-weight:700;margin-bottom:10px}.fl-no-revisions-message-text{line-height:22px}.fl-builder--main-menu-panel-view[data-name=history] .fl-builder--menu-item,.fl-builder--main-menu-panel-view[data-name=history] .fl-builder--menu-item:focus{border:none!important;padding:0;margin-bottom:2px}.fl-history-list-item{border:1px solid transparent;border-radius:4px;padding:10px 12px 12px}.fl-history-list-item i.fa-check-circle{display:none}.fl-history-list-item[data-current="1"]{border-color:#D3DADF;display:flex;align-items:center}.fl-history-list-item[data-current="1"] .fl-history-list-item-label{width:100%}.fl-history-list-item[data-current="1"] i.fa-check-circle{display:block}.fl-builder-module-placeholder-message{border:1px dashed #ccc;overflow:hidden;padding:20px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.module-import-wrap{display:flex}.module-import-input{width:100%!important}.module-import-apply{height:35px;margin:1px 1px 1px 5px}.module-import-error{color:red!important;display:none;padding:5px 12px}.fl-field-connections-menu{z-index:999999}.fl-field[data-type=editor] .fl-field-connections-toggle{right:5px!important}.fl-field-connections-inline-toggle{display:inline;color:#9a9b9c;margin-left:6px}.fl-field-connections-inline-toggle i{transition-property:transform;transition-duration:.15s}.fl-field-connections-inline-toggle.fl-field-connections-toggle-open i{transform:rotate(45deg)}.fl-builder-add-ultimate-presets-button,.fl-builder-add-ultimate-rows-button,.fl-builder-pp-add-template-button,.pp-preview-button,.uabb-live-preview-button{display:none!important}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none;background:0 0;transition-property:background;transition-duration:.15s}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-ne,.ui-resizable-nw,.ui-resizable-se,.ui-resizable-sw{width:12px;height:12px}.ui-resizable-se{cursor:se-resize;right:-4px;bottom:-4px}.ui-resizable-sw{cursor:sw-resize;left:-4px;bottom:-4px}.ui-resizable-nw{cursor:nw-resize;left:-4px;top:-4px}.ui-resizable-ne{cursor:ne-resize;right:-4px;top:-4px}.fl-builder-resizable-iframe-fix{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100000000}.fl-builder-panel .ui-resizable-handle:active,.fl-builder-panel .ui-resizable-handle:hover,.fl-lightbox .ui-resizable-handle:active,.fl-lightbox .ui-resizable-handle:hover{background:#00a0d2}.fl-builder-panel .ui-resizable-n,.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-n,.fl-lightbox .ui-resizable-s{height:6px}.fl-builder-panel .ui-resizable-n,.fl-lightbox .ui-resizable-n{top:-3px}.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-s{bottom:-3px}.fl-builder-panel .ui-resizable-e,.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-e,.fl-lightbox .ui-resizable-w{width:6px}.fl-builder-panel .ui-resizable-e,.fl-lightbox .ui-resizable-e{right:-3px}.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-w{left:-3px}.fl-lightbox .ui-resizable-ne,.fl-lightbox .ui-resizable-nw,.fl-lightbox .ui-resizable-se,.fl-lightbox .ui-resizable-sw{background:0 0;border:6px solid transparent}.fl-lightbox .ui-resizable-ne:active,.fl-lightbox .ui-resizable-ne:hover,.fl-lightbox .ui-resizable-nw:active,.fl-lightbox .ui-resizable-nw:hover,.fl-lightbox .ui-resizable-se:active,.fl-lightbox .ui-resizable-se:hover,.fl-lightbox .ui-resizable-sw:active,.fl-lightbox .ui-resizable-sw:hover{background:0 0;border-color:#00a0d2}.fl-lightbox .ui-resizable-ne{border-bottom:none;border-left:none;border-top-right-radius:4px}.fl-lightbox .ui-resizable-nw{border-bottom:none;border-right:none;border-top-left-radius:4px}.fl-lightbox .ui-resizable-se{border-top:none;border-left:none;border-bottom-right-radius:4px}.fl-lightbox .ui-resizable-sw{border-top:none;border-right:none;border-bottom-left-radius:4px}.fl-builder-ui-keyboard-shortcuts{display:none;position:fixed;top:0;left:0;bottom:0;right:0;z-index:999999;justify-content:center;align-items:center;background:rgba(50,50,50,.88);font-size:15px;line-height:1.3;user-select:none}.fl-builder-ui-keyboard-shortcuts.is-showing{display:flex}.fl-builder-ui-keyboard-shortcuts-content{box-sizing:border-box;width:500px;background:#f5f7f9;border-radius:4px;padding:30px 0 0;box-shadow:0 10px 30px rgba(0,0,0,.15)}.fl-builder-ui-keyboard-shortcut-item{display:flex;flex-direction:row;align-items:center;padding:12px 40px}.fl-builder-ui-keyboard-shortcut-item:nth-child(even){background:#eef2f5}.fl-builder-ui-shortcut-keycode{margin-left:auto;text-transform:uppercase;letter-spacing:2px}.fl-builder-ui-keyboard-shortcust-footer{display:flex;flex-direction:row;justify-content:center;padding:10px}.dismiss-shortcut-ui{padding:10px;border-radius:4px;background:#fff;color:#000;font-size:14px;border:2px solid #fff}.dismiss-shortcut-ui:focus,.dismiss-shortcut-ui:hover{top:0;color:#000;background:#eef2f5;border:2px solid #eef2f5}.fl-lightbox .select2-container--default .selection .select2-selection--single,.select2-dropdown{border-color:transparent!important;border-style:solid!important;border-radius:4px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-lightbox .select2-container--default .selection .select2-selection--single{border-width:2px!important;height:36px!important;font-size:13px!important;line-height:15px!important;outline:0}.fl-lightbox .select2-selection--single .select2-selection__rendered{line-height:32px!important;font-size:13px}.fl-lightbox .select2-selection--single .select2-selection__arrow{height:32px}.fl-builder-ui-skin--light .fl-lightbox .select2-selection__rendered,.fl-builder-ui-skin--light .select2-dropdown,.fl-builder-ui-skin--light .select2-search__field{color:grey!important}.fl-builder-ui-skin--light .select2-search__field::placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field::-webkit-input-placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field::-moz-placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field:-ms-input-placeholder{color:grey!important}.fl-builder-ui-skin--light .select2-search__field:-moz-placeholder{color:grey!important}.fl-diff td.diff-addedline,.fl-diff td.diff-context,.fl-diff td.diff-deletedline span{display:none}.fl-diff table.diff{width:100%}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel,.fl-builder-ui-skin--dark .fl-builder--preview-actions,.fl-builder-ui-skin--dark .fl-builder--search-results-panel,.fl-builder-ui-skin--dark .fl-builder-panel,.fl-builder-ui-skin--dark .fl-lightbox,body.fl-builder-ui-skin--dark .fl-builder-bar .fl-builder-bar-content{background:#23282d;color:#b4b9be;border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-header{color:#b4b9be;border-bottom-color:#1d1d1d;border-top-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-top-color:#1d2227}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel:before{border-bottom-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-arrow polygon{fill:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel-search .fl-builder-panel-search-input{background:#24282e}.fl-builder-ui-skin--dark .fl-responsive-preview-content{background:#131619}.fl-builder-ui-skin--dark .fl-form-table th{background:#23282d!important;color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--preview-actions .device-icons,.fl-builder-ui-skin--dark .fl-builder-button{background:#2c333a}.fl-builder-ui-skin--dark .fl-builder-button:focus{background:#131a22}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-primary{color:#fff!important;fill:#fff!important;background:#00A0D2}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-buy-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-feedback-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-upgrade-button{background-color:#F7A407;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-silent:focus{border:2px solid #00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{color:#00A0D2!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:hover,.fl-builder-ui-skin--dark .fl-builder--menu>button:hover{background:#101215!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:focus,.fl-builder-ui-skin--dark .fl-builder--menu>button:focus{background:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-bar-title{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:#181b1f}.fl-builder-simple.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:transparent}.fl-builder-ui-skin--dark .fl-builder-layout-title{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-bar-title-caret i,.fl-builder-ui-skin--dark .fl-builder-layout-pretitle,.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{color:#7d8690}.fl-builder-ui-skin--dark button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#101215!important}.fl-builder-ui-skin--dark .fl-builder--search:before{color:rgba(162,173,184,.73)}.fl-builder-ui-skin--dark .fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(162,173,184,.73)!important}.fl-builder-ui-skin--dark .fl-builder--search .search-clear{color:rgba(162,173,184,.5);background-color:#e4e4e4;background:linear-gradient(to left,#383f46,#383f46 75%,rgba(56,63,70,0))}.fl-builder-ui-skin--dark .fl-builder--menu hr{background-color:#23282d!important;border:none}.fl-builder-ui-skin--dark .fl-builder--tabs{border-color:#383f46!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing,.fl-builder-ui-skin--dark .fl-builder-settings-tabs a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-more.fl-contains-active{color:#fff!important;fill:#fff!important;background:#181b20!important}.fl-builder-ui-skin--dark .fl-builder--tabs :focus{background-color:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing:focus{color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder--menu-item:hover{background:#383f46;color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--menu * .fl-builder--menu-item-accessory,.fl-builder-ui-skin--dark .fl-builder-blocks-section-group-name{color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--selector-display{color:#c6cdd6;background:url(../img/svg/select-arrow-down-alt2-light.svg) center right 10px no-repeat #1a1b22!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label{color:#b5becb}.fl-builder-ui-skin--dark .fl-builder-panel-search-input input{border-color:#5b656f;color:#b8c2ce;background:#171b1f!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label:focus,.fl-builder-ui-skin--dark .fl-builder-panel-search-input input:focus{border-color:#00a0d2}.fl-builder-ui-skin--dark .fl-builder--group-label{color:#aaafb5!important;background:#24282e}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu{border-color:#101215!important;color:#7c858e;background-color:#101215}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu:before{border-bottom-color:#101215}.fl-builder-ui-skin--dark .fl-builder--menu>a,.fl-builder-ui-skin--dark .fl-builder--menu>button,.fl-builder-ui-skin--dark .fl-builder--menu>span{color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:hover{background:#23282d!important;color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:focus{background:#23282d!important;color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-panel-drag-handle{fill:#5b656f}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-header,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-header,.fl-builder-ui-skin--dark .fl-builder-settings-section-header{background-color:#191b21;border-color:#191b21}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-name,.fl-builder-ui-skin--dark .fl-builder--user-templates-section-name,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-title,.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title{color:#7d8690!important;fill:#7d8690;background:#24282e}.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title:focus{border-color:#7d8690}.fl-builder-ui-skin--dark .fl-builder-blocks-section-content .fl-builder-block,.fl-builder-ui-skin--dark .fl-user-template{color:#b8c2ce}.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-content,.fl-builder-ui-skin--dark .fl-user-template:hover{background:#171b1f;color:#fff}.fl-builder-ui-skin--dark .fl-builder-block:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover i{color:#6d7782!important}.fl-builder-ui-skin--dark .fl-builder-block:hover a:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover a:hover i{color:#9eacbb!important}.fl-builder-ui-skin--dark .fl-builder-block .fl-builder-block-icon{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col,.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#7d8690}.fl-builder-ui-skin--dark .fl-user-templates{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder--template-thumbnail{border-color:#393f44}.fl-builder-ui-skin--dark .fl-builder--menu a.fl-template-collection{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-lightbox .fl-lightbox-header h1{color:#fff!important}.fl-builder-ui-skin--dark .fl-form-table th label{color:#a8b3bf!important}.fl-builder-ui-skin--dark .fl-builder-settings-tabs{background-color:#2c333a!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields h3.fl-builder-settings-title{background:#24282e}.fl-builder-ui-skin--dark h3.fl-builder-settings-title .fl-builder-settings-title-text-wrap{color:#a8b3bf;background-color:#1b2025}.fl-builder-ui-skin--dark .fl-lightbox :not(i){color:#a7b1bb!important}.fl-builder-ui-skin--dark .fl-builder-button{color:#c6cdd6!important;fill:#c6cdd6!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{fill:#00A0D2!important}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-button.fl-builder-button-primary{color:#fff!important}.fl-builder-ui-skin--dark .fl-color-picker-color.fl-color-picker-empty{background:#1a1b22}.fl-color-picker-color.fl-color-picker-empty .fl-color-picker-icon{fill:#6f7881}.fl-builder-ui-skin--dark .fl-color-picker-clear{background-color:#121a23}.fl-builder-ui-skin--dark .fl-color-picker-clear:hover{background-color:#373f46}.fl-builder-ui-skin--dark span.fl-builder-block-no-node-templates:hover{background:#1d2025}.fl-builder-ui-skin--dark .fl-builder-settings-tab-description{background:#1d2227}.fl-builder-ui-skin--dark .fl-builder-custom-field,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url],.fl-builder-ui-skin--dark .fl-builder-settings-fields select,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea,.fl-builder-ui-skin--dark .fl-lightbox .select2-selection__rendered,.fl-builder-ui-skin--dark .select2-dropdown{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-builder-panel-search button svg .filled-shape{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields select:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea:focus{border-color:#00a0d2!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields select{background-image:url(../img/svg/select-arrow-down-alt2-light.svg)!important}.fl-builder-ui-skin--dark .fl-lightbox .select2-container--default .selection .select2-selection--single{border-color:#181b20!important}.fl-builder-ui-skin--dark .select2-search__field{background-color:#2c333a!important}.fl-builder-ui-skin--dark .fl-builder-custom-field select,.fl-builder-ui-skin--dark .fl-photo-field select{border-color:#7d8690!important}.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle{color:#6b747d}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel-view-title,.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle:hover{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--saving-indicator{color:#858f99}.fl-builder-ui-skin--dark .fl-icons-list i:hover{background-color:#16191d;color:#fff}.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:after,.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:before{background:#6f7881}.fl-builder-ui-skin--dark .fl-builder--user-templates-section-content{border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button{background:0 0;border-right-color:#101215!important}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button:hover{background:#181b1f}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu{background:#131a22;border-color:#353c43 #131a22 #131a22}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu:before{border-bottom-color:#353c43}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:focus,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover{background:#383f46}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover.fl-active{color:#fff!important;background:#383f46}.fl-builder-ui-skin--dark ul.as-selections{background-color:#121a23}.fl-builder-ui-skin--dark .fl-custom-query .fl-builder-settings-section{border-top:2px solid #1b2026!important}.fl-builder-ui-skin--dark div.fl-field-unit-select{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-dimension-field-units>*{border-right:1px solid #383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider,.fl-builder-ui-skin--dark .fl-field-popup-slider-input .ui-slider-handle{background:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-arrow:after{border-bottom-color:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-input{background-color:#121a23}.fl-builder-ui-skin--dark .fl-unit-field-input{border-right:1px solid #383f46!important}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"]{background-color:#383f46!important;color:#fff}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"] i{color:#fff!important}.fl-builder-ui-skin--dark .fl-button-group-field-options{background:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle{background-color:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle:hover{background-color:#383f46}.fl-builder-ui-skin--dark .fl-compound-field-section-visible .fl-compound-field-section-toggle{border-top-color:#121a23!important;background-color:transparent}.fl-builder-ui-skin--dark .fl-field-connections-toggle i{color:#7c8590}.fl-builder-ui-skin--dark .fl-lightbox .fl-field-connection-content{background-color:#191b20!important}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#181b20}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane:hover>.fl-nanoscroller-slider{background-color:#5a646f}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#00A0D2}.fl-builder-ui-skin--dark .fl-lightbox div.mce-panel{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox .mce-toolbar .mce-ico{color:#a7b1bb}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary{background:#383f46;border:none;box-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-settings .wp-switch-editor{background:#23282d}.fl-builder-ui-skin--dark .fl-lightbox .html-active .switch-html,.fl-builder-ui-skin--dark .fl-lightbox .quicktags-toolbar,.fl-builder-ui-skin--dark .fl-lightbox .tmce-active .switch-tmce{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox textarea.wp-editor-area{background:0 0!important}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:hover{background:#191b20}
|
css/fl-slideshow.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.fl-slideshow,.fl-slideshow-content{position:relative}.fl-slideshow{color:#8c8d8e;font-family:Helvetica,Verdana,Arial,sans-serif;font-size:13px;letter-spacing:normal;word-spacing:normal}.fl-slideshow .yui3-widget-content-expanded{box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;-ms-box-sizing:content-box}.fl-slideshow.fl-fullscreen-active{background:#1c1d1f!important}.fl-slideshow a{outline:0}.fl-loading-image{width:42px;height:42px;background:#000;border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px}.fl-fullscreen-close-message{position:absolute;z-index:1000;top:200px;width:100%;text-align:center}.fl-fullscreen-close-message span{display:inline-block;padding:15px 25px;background:url(../img/slideshow/transparent-bg-dark.png);border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;color:#fff;font-size:16px;line-height:26px}.fl-fullscreen-active.fl-slideshow{margin:0;padding:0}.fl-slideshow-image{overflow:hidden;position:relative}.fl-slideshow-image,.fl-slideshow-image img{backface-visibility:hidden;-moz-backface-visibility:hidden;-webkit-backface-visibility:hidden}.fl-slideshow-image img{position:absolute;z-index:1;-webkit-touch-callout:none}.fl-slideshow-video-button{display:block;width:88px;height:60px;position:absolute;z-index:2;background:url(../img/slideshow/icons-light.png) -120px -80px no-repeat}.fl-slideshow-video-button:hover{background-position:-220px -80px}.fl-slideshow-video{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;background:url(../img/slideshow/transparent-bg-dark.png)}.fl-slideshow-video-wrap{top:45px;right:45px;bottom:45px;left:45px;position:fixed;z-index:1001}.fl-slideshow-video iframe{border:none;display:block;line-height:0;margin:0;padding:0;position:relative;z-index:1001}.fl-slideshow-video-close{position:absolute;z-index:10000;left:5px;top:5px;width:40px;height:40px;background:url(../img/slideshow/icons-light.png) 0 -80px no-repeat}.fl-slideshow-video-close:hover{background-position:-40px -80px}.fl-slideshow-transition-slice{opacity:0;overflow:hidden;position:absolute}.fl-slideshow-transition-slice img{display:block;position:absolute}.fl-slideshow-main-image{z-index:2}.fl-slideshow-frame{position:relative}.fl-slideshow-frame-content{height:100%}.fl-slideshow-frame.fl-click-action-enabled .fl-slideshow-image-img{cursor:pointer}.fl-slideshow-main-nav{position:relative;height:40px}.fl-slideshow-main-nav.fl-slideshow-overlay{left:0;right:0;z-index:10}.fl-slideshow-nav-buttons{text-align:center}.fl-slideshow-nav-buttons-left{position:absolute;top:0;left:0;height:100%;padding-left:5px}.fl-slideshow-nav-buttons-right{position:absolute;top:0;right:0;height:100%;padding-right:5px}.fl-slideshow-nav a{display:inline-block;width:40px;height:40px;background-image:url(../img/slideshow/icons-light.png);vertical-align:middle}.fl-slideshow-nav-count{display:inline-block;height:9px;line-height:12px;padding:14px 14px 0}.fl-slideshow-nav-thumbs{background-position:0 0}.fl-slideshow-nav-thumbs:hover{background-position:0 -40px}.fl-slideshow-nav-buy{background-position:-40px 0}.fl-slideshow-nav-buy:hover{background-position:-40px -40px}.fl-slideshow-nav-caption{background-position:-80px 0}.fl-slideshow-nav-caption:hover{background-position:-80px -40px}.fl-slideshow-nav-caption-disabled,.fl-slideshow-nav-caption-disabled:hover{background-position:-80px 0;opacity:.35;cursor:default}.fl-slideshow-nav-social{background-position:-120px 0}.fl-slideshow-nav-social:hover{background-position:-120px -40px}.fl-slideshow-nav-prev,.fl-slideshow-nav-prevPage{background-position:-160px 0}.fl-slideshow-nav-prev:hover,.fl-slideshow-nav-prevPage:hover{background-position:-160px -40px}.fl-slideshow-nav-pause{background-position:-200px 0}.fl-slideshow-nav-pause:hover{background-position:-200px -40px}.fl-slideshow-nav-play{background-position:-240px 0}.fl-slideshow-nav-play:hover{background-position:-240px -40px}.fl-slideshow-nav-next,.fl-slideshow-nav-nextPage{background-position:-280px 0}.fl-slideshow-nav-next:hover,.fl-slideshow-nav-nextPage:hover{background-position:-280px -40px}.fl-slideshow-nav-fullscreen{background-position:-320px 0}.fl-slideshow-nav-fullscreen:hover{background-position:-320px -40px}.fl-fullscreen-active .fl-slideshow-nav-fullscreen{background-position:-360px 0}.fl-fullscreen-active .fl-slideshow-nav-fullscreen:hover{background-position:-360px -40px}.fl-slideshow-nav-close{background-position:-400px 0}.fl-slideshow-nav-close:hover{background-position:-400px -40px}.fl-slideshow-image-nav-left,.fl-slideshow-image-nav-left .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-left a{display:block;position:absolute;left:0;top:0;z-index:7;width:100px;height:55px;background:0 0!important}.fl-slideshow-image-nav-left a{background:url(../img/slideshow/arrows-prev.png) left center no-repeat!important}.fl-slideshow-image-nav-left a:hover{background-position:-70px center!important}.fl-slideshow-image-nav-right,.fl-slideshow-image-nav-right .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-right a{display:block;position:absolute;right:0;top:0;z-index:7;width:100px;height:55px;background:0 0!important}.fl-slideshow-image-nav-right a{background:url(../img/slideshow/arrows-next.png) right center no-repeat!important}.fl-slideshow-image-nav-right a:hover{background-position:30px center!important}.fl-slideshow-image-nav-left .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-left a,.fl-slideshow-image-nav-right .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-right a{width:100%}.fl-slideshow-mouse-nav-prev,.fl-slideshow-mouse-nav-prev div,.fl-slideshow-mouse-nav-prev img{cursor:url(../img/slideshow/arrow-prev.png),w-resize!important}.fl-slideshow-mouse-nav-next,.fl-slideshow-mouse-nav-next div,.fl-slideshow-mouse-nav-next img{cursor:url(../img/slideshow/arrow-next.png),e-resize!important}.fl-slideshow-thumbs{position:relative;z-index:1}.fl-slideshow-thumbs-content{height:100%;margin:0 auto;position:relative}.fl-slideshow-thumbs.fl-slideshow-overlay{z-index:9}.fl-slideshow-thumbs-clip{overflow:hidden;position:relative;-webkit-backface-visibility:hidden}.fl-slideshow-thumbs-pages{position:relative;-webkit-backface-visibility:hidden}.fl-slideshow-thumbs-page{position:absolute;-webkit-backface-visibility:hidden}.fl-slideshow-thumbs .fl-slideshow-image{background:#2e3033;border:1px solid #7d818a;float:left}.fl-slideshow-thumbs .fl-slideshow-image-active,.fl-slideshow-thumbs .fl-slideshow-image:hover{border:1px solid #fff}.fl-slideshow-thumbs img{cursor:pointer!important}.fl-slideshow-thumbs-left-nav .fl-slideshow-nav-buttons,.fl-slideshow-thumbs-right-nav .fl-slideshow-nav-buttons{padding:0 15px}.fl-slideshow-vertical-thumbs{position:absolute;top:0;z-index:20}.fl-slideshow-caption{width:100%;z-index:8;color:#fff}.fl-slideshow-caption a{color:#fff}.fl-slideshow-caption-content{padding:20px}.fl-slideshow-caption-toggle{display:inline-block;padding:0 20px 20px}.fl-slideshow-social{width:100%;z-index:8}.fl-slideshow-social-content{padding:20px 25px 15px}.fl-slideshow-overlay{background:url(../img/slideshow/transparent-bg-dark.png)}.fl-slideshow-overlay-close{position:absolute;z-index:1000;right:0;width:40px;height:40px;background:url(../img/slideshow/icons-light.png) 0 -80px no-repeat}.fl-slideshow-overlay-close:hover{background-position:-40px -80px}.fl-slideshow-caption .fl-slideshow-overlay-close,.fl-slideshow-social .fl-slideshow-overlay-close{width:30px;height:30px;background:url(../img/slideshow/icons-light.png) -80px -80px no-repeat}.fl-slideshow-caption .fl-slideshow-overlay-close:hover,.fl-slideshow-social .fl-slideshow-overlay-close:hover{background-position:-80px -110px}.fl-slideshow-light
|
1 |
+
.fl-slideshow,.fl-slideshow-content{position:relative}.fl-slideshow{color:#8c8d8e;font-family:Helvetica,Verdana,Arial,sans-serif;font-size:13px;letter-spacing:normal;word-spacing:normal}.fl-slideshow .yui3-widget-content-expanded{box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;-ms-box-sizing:content-box}.fl-slideshow.fl-fullscreen-active{background:#1c1d1f!important}.fl-slideshow a{outline:0}.fl-loading-image{width:42px;height:42px;background:#000;border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px}.fl-fullscreen-close-message{position:absolute;z-index:1000;top:200px;width:100%;text-align:center}.fl-fullscreen-close-message span{display:inline-block;padding:15px 25px;background:url(../img/slideshow/transparent-bg-dark.png);border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;color:#fff;font-size:16px;line-height:26px}.fl-fullscreen-active.fl-slideshow{margin:0;padding:0}.fl-slideshow-image{overflow:hidden;position:relative}.fl-slideshow-image,.fl-slideshow-image img{backface-visibility:hidden;-moz-backface-visibility:hidden;-webkit-backface-visibility:hidden}.fl-slideshow-image img{position:absolute;z-index:1;-webkit-touch-callout:none}.fl-slideshow-video-button{display:block;width:88px;height:60px;position:absolute;z-index:2;background:url(../img/slideshow/icons-light.png) -120px -80px no-repeat}.fl-slideshow-video-button:hover{background-position:-220px -80px}.fl-slideshow-video{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;background:url(../img/slideshow/transparent-bg-dark.png)}.fl-slideshow-video-wrap{top:45px;right:45px;bottom:45px;left:45px;position:fixed;z-index:1001}.fl-slideshow-video iframe{border:none;display:block;line-height:0;margin:0;padding:0;position:relative;z-index:1001}.fl-slideshow-video-close{position:absolute;z-index:10000;left:5px;top:5px;width:40px;height:40px;background:url(../img/slideshow/icons-light.png) 0 -80px no-repeat}.fl-slideshow-video-close:hover{background-position:-40px -80px}.fl-slideshow-transition-slice{opacity:0;overflow:hidden;position:absolute}.fl-slideshow-transition-slice img{display:block;position:absolute}.fl-slideshow-main-image{z-index:2}.fl-slideshow-frame{position:relative}.fl-slideshow-frame-content{height:100%}.fl-slideshow-frame.fl-click-action-enabled .fl-slideshow-image-img{cursor:pointer}.fl-slideshow-main-nav{position:relative;height:40px}.fl-slideshow-main-nav.fl-slideshow-overlay{left:0;right:0;z-index:10}.fl-slideshow-nav-buttons{text-align:center}.fl-slideshow-nav-buttons-left{position:absolute;top:0;left:0;height:100%;padding-left:5px}.fl-slideshow-nav-buttons-right{position:absolute;top:0;right:0;height:100%;padding-right:5px}.fl-slideshow-nav a{display:inline-block;width:40px;height:40px;background-image:url(../img/slideshow/icons-light.png);vertical-align:middle}.fl-slideshow-nav-count{display:inline-block;height:9px;line-height:12px;padding:14px 14px 0}.fl-slideshow-nav-thumbs{background-position:0 0}.fl-slideshow-nav-thumbs:hover{background-position:0 -40px}.fl-slideshow-nav-buy{background-position:-40px 0}.fl-slideshow-nav-buy:hover{background-position:-40px -40px}.fl-slideshow-nav-caption{background-position:-80px 0}.fl-slideshow-nav-caption:hover{background-position:-80px -40px}.fl-slideshow-nav-caption-disabled,.fl-slideshow-nav-caption-disabled:hover{background-position:-80px 0;opacity:.35;cursor:default}.fl-slideshow-nav-social{background-position:-120px 0}.fl-slideshow-nav-social:hover{background-position:-120px -40px}.fl-slideshow-nav-prev,.fl-slideshow-nav-prevPage{background-position:-160px 0}.fl-slideshow-nav-prev:hover,.fl-slideshow-nav-prevPage:hover{background-position:-160px -40px}.fl-slideshow-nav-pause{background-position:-200px 0}.fl-slideshow-nav-pause:hover{background-position:-200px -40px}.fl-slideshow-nav-play{background-position:-240px 0}.fl-slideshow-nav-play:hover{background-position:-240px -40px}.fl-slideshow-nav-next,.fl-slideshow-nav-nextPage{background-position:-280px 0}.fl-slideshow-nav-next:hover,.fl-slideshow-nav-nextPage:hover{background-position:-280px -40px}.fl-slideshow-nav-fullscreen{background-position:-320px 0}.fl-slideshow-nav-fullscreen:hover{background-position:-320px -40px}.fl-fullscreen-active .fl-slideshow-nav-fullscreen{background-position:-360px 0}.fl-fullscreen-active .fl-slideshow-nav-fullscreen:hover{background-position:-360px -40px}.fl-slideshow-nav-close{background-position:-400px 0}.fl-slideshow-nav-close:hover{background-position:-400px -40px}.fl-slideshow-image-nav-left,.fl-slideshow-image-nav-left .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-left a{display:block;position:absolute;left:0;top:0;z-index:7;width:100px;height:55px;background:0 0!important}.fl-slideshow-image-nav-left a{background:url(../img/slideshow/arrows-prev.png) left center no-repeat!important}.fl-slideshow-image-nav-left a:hover{background-position:-70px center!important}.fl-slideshow-image-nav-right,.fl-slideshow-image-nav-right .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-right a{display:block;position:absolute;right:0;top:0;z-index:7;width:100px;height:55px;background:0 0!important}.fl-slideshow-image-nav-right a{background:url(../img/slideshow/arrows-next.png) right center no-repeat!important}.fl-slideshow-image-nav-right a:hover{background-position:30px center!important}.fl-slideshow-image-nav-left .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-left a,.fl-slideshow-image-nav-right .fl-slideshow-nav-buttons,.fl-slideshow-image-nav-right a{width:100%}.fl-slideshow-mouse-nav-prev,.fl-slideshow-mouse-nav-prev div,.fl-slideshow-mouse-nav-prev img{cursor:url(../img/slideshow/arrow-prev.png),w-resize!important}.fl-slideshow-mouse-nav-next,.fl-slideshow-mouse-nav-next div,.fl-slideshow-mouse-nav-next img{cursor:url(../img/slideshow/arrow-next.png),e-resize!important}.fl-slideshow-thumbs{position:relative;z-index:1}.fl-slideshow-thumbs-content{height:100%;margin:0 auto;position:relative}.fl-slideshow-thumbs.fl-slideshow-overlay{z-index:9}.fl-slideshow-thumbs-clip{overflow:hidden;position:relative;-webkit-backface-visibility:hidden}.fl-slideshow-thumbs-pages{position:relative;-webkit-backface-visibility:hidden}.fl-slideshow-thumbs-page{position:absolute;-webkit-backface-visibility:hidden}.fl-slideshow-thumbs .fl-slideshow-image{background:#2e3033;border:1px solid #7d818a;float:left}.fl-slideshow-thumbs .fl-slideshow-image-active,.fl-slideshow-thumbs .fl-slideshow-image:hover{border:1px solid #fff}.fl-slideshow-thumbs img{cursor:pointer!important}.fl-slideshow-thumbs-left-nav .fl-slideshow-nav-buttons,.fl-slideshow-thumbs-right-nav .fl-slideshow-nav-buttons{padding:0 15px}.fl-slideshow-vertical-thumbs{position:absolute;top:0;z-index:20}.fl-slideshow-caption{width:100%;z-index:8;color:#fff}.fl-slideshow-caption a{color:#fff}.fl-slideshow-light,.fl-slideshow-light .fl-slideshow-caption,.fl-slideshow-light .fl-slideshow-caption a{color:#333}.fl-slideshow-caption-content{padding:20px}.fl-slideshow-caption-toggle{display:inline-block;padding:0 20px 20px}.fl-slideshow-social{width:100%;z-index:8}.fl-slideshow-social-content{padding:20px 25px 15px}.fl-slideshow-overlay{background:url(../img/slideshow/transparent-bg-dark.png)}.fl-slideshow-overlay-close{position:absolute;z-index:1000;right:0;width:40px;height:40px;background:url(../img/slideshow/icons-light.png) 0 -80px no-repeat}.fl-slideshow-overlay-close:hover{background-position:-40px -80px}.fl-slideshow-caption .fl-slideshow-overlay-close,.fl-slideshow-social .fl-slideshow-overlay-close{width:30px;height:30px;background:url(../img/slideshow/icons-light.png) -80px -80px no-repeat}.fl-slideshow-caption .fl-slideshow-overlay-close:hover,.fl-slideshow-social .fl-slideshow-overlay-close:hover{background-position:-80px -110px}.fl-slideshow-light.fl-fullscreen-active{background:#f2f2f2!important}.fl-slideshow-light .fl-loading-image{background:#fff}.fl-slideshow-light .fl-slideshow-nav a{background-image:url(../img/slideshow/icons-dark.png)}.fl-slideshow-light .fl-slideshow-video{background:url(../img/slideshow/transparent-bg-light.png)}.fl-slideshow-light .fl-slideshow-video-close{background:url(../img/slideshow/icons-dark.png) 0 -80px no-repeat}.fl-slideshow-light .fl-slideshow-video-close:hover{background-position:-40px -80px}.fl-slideshow-light .fl-slideshow-thumbs .fl-slideshow-frame{background:#dadde6}.fl-slideshow-light .fl-slideshow-thumbs .fl-slideshow-image{border:1px solid #737373}.fl-slideshow-light .fl-slideshow-thumbs .fl-slideshow-frame-active .fl-slideshow-image,.fl-slideshow-light .fl-slideshow-thumbs .fl-slideshow-image:hover{border:1px solid #000}.fl-slideshow-light .fl-slideshow-overlay{background-image:url(../img/slideshow/transparent-bg-light.png)}.fl-slideshow-light .fl-slideshow-caption .fl-slideshow-overlay-close,.fl-slideshow-light .fl-slideshow-overlay-close,.fl-slideshow-light .fl-slideshow-social .fl-slideshow-overlay-close{background-image:url(../img/slideshow/icons-dark.png)}.fl-slideshow-nav a.sm-fonticon,.fl-slideshow-nav a.sm-fonticon:hover{background-image:none!important;height:24px;line-height:24px;margin:5px 7px;text-decoration:none;vertical-align:middle;width:24px}.fl-slideshow-nav-count.fonticons-enabled{display:inline-block;font-size:13px;height:24px;line-height:32px;margin:5px 15px;padding:0;vertical-align:middle}.fl-slideshow-video-close.sm-fonticon{background-image:none!important;height:16px;font-size:32px;line-height:16px;text-decoration:none;width:16px}.fl-slideshow-overlay-close.sm-fonticon{background-image:none!important;height:25px;line-height:25px;text-decoration:none;width:25px}
|
css/jquery.magnificpopup.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.mfp-bg,.mfp-container,.mfp-wrap{
|
1 |
+
.mfp-bg,.mfp-wrap{position:fixed;left:0;top:0}.mfp-bg,.mfp-container,.mfp-wrap{height:100%;width:100%}.mfp-container:before,.mfp-figure:after{content:''}.mfp-bg{z-index:1042;overflow:hidden;background:#0b0b0b;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{z-index:1043;outline:0!important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-ajax-holder .mfp-content,.mfp-inline-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-arrow,.mfp-close,.mfp-counter,.mfp-preloader{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none!important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-close,.mfp-preloader a:hover{color:#fff}.mfp-s-error .mfp-content,.mfp-s-ready .mfp-preloader{display:none}button.mfp-arrow,button.mfp-close{overflow:visible;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;display:block;outline:0;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}.mfp-figure:after,.mfp-iframe-scaler iframe{box-shadow:0 0 8px rgba(0,0,0,.6);position:absolute;left:0}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:.65;padding:0 0 18px 10px;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace}.mfp-close:focus,.mfp-close:hover{opacity:1}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#333}.mfp-iframe-holder .mfp-close,.mfp-image-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-figure,img.mfp-img{line-height:0}.mfp-arrow{position:absolute;opacity:.65;margin:-55px 0 0;top:50%;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:transparent}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:focus,.mfp-arrow:hover{opacity:1}.mfp-arrow .mfp-a,.mfp-arrow .mfp-b,.mfp-arrow:after,.mfp-arrow:before{content:'';display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:inset transparent}.mfp-arrow .mfp-a,.mfp-arrow:after{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow .mfp-b,.mfp-arrow:before{border-top-width:21px;border-bottom-width:21px}.mfp-arrow-left{left:0}.mfp-arrow-left .mfp-a,.mfp-arrow-left:after{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left .mfp-b,.mfp-arrow-left:before{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right .mfp-a,.mfp-arrow-right:after{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right .mfp-b,.mfp-arrow-right:before{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-image-holder .mfp-content,img.mfp-img{max-width:100%}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{display:block;top:0;width:100%;height:100%;background:#000}.mfp-figure:after,img.mfp-img{width:auto;height:auto;display:block}img.mfp-img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0;margin:0 auto}.mfp-figure:after{top:40px;bottom:40px;right:0;z-index:-1;background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width:800px) and (orientation:landscape),screen and (max-height:300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width:900px){.mfp-arrow{-webkit-transform:scale(.75);transform:scale(.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}
|
extensions/fl-builder-cache-helper/classes/class-fl-builder-cache-helper.php
CHANGED
@@ -12,7 +12,6 @@ class Plugin {
|
|
12 |
'fl_builder_cache_cleared',
|
13 |
'fl_builder_after_save_layout',
|
14 |
'fl_builder_after_save_user_template',
|
15 |
-
'upgrader_process_complete',
|
16 |
);
|
17 |
|
18 |
function __construct() {
|
12 |
'fl_builder_cache_cleared',
|
13 |
'fl_builder_after_save_layout',
|
14 |
'fl_builder_after_save_user_template',
|
|
|
15 |
);
|
16 |
|
17 |
function __construct() {
|
extensions/fl-builder-cache-helper/plugins/wordpress.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace FLCacheClear;
|
3 |
+
//phpcs:ignore WordPress.WP.CapitalPDangit.MisspelledClassName
|
4 |
+
class Wordpress {
|
5 |
+
var $name = 'Object Caching';
|
6 |
+
|
7 |
+
function run() {
|
8 |
+
wp_cache_flush();
|
9 |
+
}
|
10 |
+
}
|
extensions/fl-builder-seo-plugins/classes/class-fl-builder-seo-plugins.php
CHANGED
@@ -95,9 +95,9 @@ class FLBuilderSeoPlugins {
|
|
95 |
add_action( 'admin_enqueue_scripts', array( $this, 'dequeue_layout_scripts' ), 10000 );
|
96 |
|
97 |
if ( 'yoast' === $plugin ) {
|
98 |
-
$deps = array(
|
99 |
} else {
|
100 |
-
$deps = array( 'rank-math-
|
101 |
}
|
102 |
|
103 |
$data = $this->content_data();
|
95 |
add_action( 'admin_enqueue_scripts', array( $this, 'dequeue_layout_scripts' ), 10000 );
|
96 |
|
97 |
if ( 'yoast' === $plugin ) {
|
98 |
+
$deps = array();
|
99 |
} else {
|
100 |
+
$deps = array( 'wp-hooks', 'rank-math-analyzer' );
|
101 |
}
|
102 |
|
103 |
$data = $this->content_data();
|
extensions/fl-builder-seo-plugins/js/plugin-rankmath.js
CHANGED
@@ -1,20 +1,28 @@
|
|
1 |
-
(function($){
|
|
|
2 |
var RankMathIntegration = function() {
|
3 |
-
|
4 |
-
|
|
|
5 |
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
11 |
}
|
|
|
12 |
|
13 |
-
|
14 |
-
|
15 |
-
|
|
|
|
|
|
|
|
|
16 |
|
17 |
-
|
18 |
-
|
19 |
})
|
20 |
})(jQuery);
|
1 |
+
(function($) {
|
2 |
+
|
3 |
var RankMathIntegration = function() {
|
4 |
+
this.init()
|
5 |
+
this.hooks()
|
6 |
+
}
|
7 |
|
8 |
+
RankMathIntegration.prototype.init = function() {
|
9 |
+
this.pluginName = 'rank-math-review-analysis'
|
10 |
+
this.fields = {
|
11 |
+
content: {
|
12 |
+
'wp_review_desc': 'editor'
|
13 |
+
}
|
14 |
}
|
15 |
+
}
|
16 |
|
17 |
+
RankMathIntegration.prototype.hooks = function() {
|
18 |
+
wp.hooks.addFilter('rank_math_content', this.pluginName, $.proxy(this.reviewDescription, this))
|
19 |
+
}
|
20 |
+
|
21 |
+
RankMathIntegration.prototype.reviewDescription = function(content) {
|
22 |
+
return window.bb_seo_data.content;
|
23 |
+
}
|
24 |
|
25 |
+
$(document).ready( function() {
|
26 |
+
new RankMathIntegration()
|
27 |
})
|
28 |
})(jQuery);
|
extensions/fl-builder-seo-plugins/js/plugin-yoast.js
CHANGED
@@ -1,16 +1,50 @@
|
|
1 |
-
|
2 |
-
$(document).ready(function(){
|
3 |
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* global YoastSEO */
|
|
|
2 |
|
3 |
+
class BeaverBuilderYoast {
|
4 |
+
constructor() {
|
5 |
+
// Ensure YoastSEO.js is present and can access the necessary features.
|
6 |
+
if ( typeof YoastSEO === "undefined" || typeof YoastSEO.analysis === "undefined" || typeof YoastSEO.analysis.worker === "undefined" ) {
|
7 |
+
return;
|
8 |
+
}
|
9 |
+
|
10 |
+
YoastSEO.app.registerPlugin( "beaverPlugin", { status: "ready" } );
|
11 |
+
|
12 |
+
this.registerModifications();
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Registers the addContent modification.
|
17 |
+
*
|
18 |
+
* @returns {void}
|
19 |
+
*/
|
20 |
+
registerModifications() {
|
21 |
+
const callback = this.addContent.bind( this );
|
22 |
+
|
23 |
+
// Ensure that the additional data is being seen as a modification to the content.
|
24 |
+
YoastSEO.app.registerModification( "content", callback, "beaverPlugin", 10 );
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Adds to the content to be analyzed by the analyzer.
|
29 |
+
*
|
30 |
+
* @param {string} data The current data string.
|
31 |
+
*
|
32 |
+
* @returns {string} The data string parameter with the added content.
|
33 |
+
*/
|
34 |
+
addContent( data ) {
|
35 |
+
return window.bb_seo_data.content ;
|
36 |
+
}
|
37 |
+
}
|
38 |
+
/**
|
39 |
+
* Adds eventlistener to load the plugin.
|
40 |
+
*/
|
41 |
+
if ( typeof YoastSEO !== "undefined" && typeof YoastSEO.app !== "undefined" ) {
|
42 |
+
new BeaverBuilderYoast();
|
43 |
+
} else {
|
44 |
+
jQuery( window ).on(
|
45 |
+
"YoastSEO:ready",
|
46 |
+
function() {
|
47 |
+
new BeaverBuilderYoast();
|
48 |
+
}
|
49 |
+
);
|
50 |
+
}
|
fl-builder.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: Beaver Builder Plugin (Lite Version)
|
4 |
* Plugin URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-uri
|
5 |
* Description: A drag and drop frontend WordPress page builder plugin that works with almost any theme!
|
6 |
-
* Version: 2.4.
|
7 |
* Author: The Beaver Builder Team
|
8 |
* Author URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-author
|
9 |
* Copyright: (c) 2014 Beaver Builder
|
3 |
* Plugin Name: Beaver Builder Plugin (Lite Version)
|
4 |
* Plugin URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-uri
|
5 |
* Description: A drag and drop frontend WordPress page builder plugin that works with almost any theme!
|
6 |
+
* Version: 2.4.1.2
|
7 |
* Author: The Beaver Builder Team
|
8 |
* Author URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-author
|
9 |
* Copyright: (c) 2014 Beaver Builder
|
fonts/fontawesome/5.14.0/css/all.min.css
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
/*!
|
2 |
-
* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
|
3 |
-
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
4 |
-
*/
|
5 |
-
.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
|
|
|
|
|
|
|
|
|
|
fonts/fontawesome/5.14.0/webfonts/fa-brands-400.woff
DELETED
Binary file
|
fonts/fontawesome/5.14.0/webfonts/fa-brands-400.woff2
DELETED
Binary file
|
fonts/fontawesome/5.14.0/webfonts/fa-regular-400.woff2
DELETED
Binary file
|
fonts/fontawesome/5.14.0/webfonts/fa-solid-900.woff
DELETED
Binary file
|
fonts/fontawesome/5.14.0/webfonts/fa-solid-900.woff2
DELETED
Binary file
|
fonts/fontawesome/5.15.1/css/all.min.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
|
3 |
+
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
4 |
+
*/
|
5 |
+
.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
|
fonts/fontawesome/{5.14.0 → 5.15.1}/css/v4-shims.min.css
RENAMED
@@ -1,5 +1,5 @@
|
|
1 |
/*!
|
2 |
-
* Font Awesome Free 5.
|
3 |
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
4 |
*/
|
5 |
.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f884"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cab:before{content:"\f1ba"}
|
1 |
/*!
|
2 |
+
* Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
|
3 |
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
4 |
*/
|
5 |
.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f884"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cab:before{content:"\f1ba"}
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-brands-400.eot
RENAMED
Binary file
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-brands-400.svg
RENAMED
@@ -1,16 +1,12 @@
|
|
1 |
<?xml version="1.0" standalone="no"?>
|
2 |
-
<!--
|
3 |
-
Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
|
4 |
-
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
5 |
-
-->
|
6 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
7 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
8 |
<metadata>
|
9 |
-
Created by FontForge 20200314 at
|
10 |
By Robert Madole
|
11 |
Copyright (c) Font Awesome
|
12 |
</metadata>
|
13 |
-
|
14 |
<font id="FontAwesome5Brands-Regular" horiz-adv-x="448" >
|
15 |
<font-face
|
16 |
font-family="Font Awesome 5 Brands Regular"
|
@@ -160,6 +156,79 @@ c-0.00292969 -0.337891 -0.00488281 -0.676758 -0.00488281 -1.01562c0 -7.25977 0.6
|
|
160 |
c0.00878906 0 0.140625 -0.0732422 0.149414 -0.0732422v-87.3799z" />
|
161 |
<glyph glyph-name="unsplash" unicode=""
|
162 |
d="M448 217.83v-249.83h-448v249.83h141.13v-124.92h165.74v124.92h141.13zM306.87 416v-124.91h-165.74v124.91h165.74z" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
<glyph glyph-name="twitter-square" unicode=""
|
164 |
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM351.1 257.2c12.8008 9.2998 24 20.8994 32.9004 34c-11.7998 -5.10059 -24.5996 -8.7998 -37.7998 -10.2002
|
165 |
c13.5996 8.09961 23.8994 20.9004 28.7998 36.0996c-12.5996 -7.5 -26.7998 -13 -41.5996 -15.7998c-12 12.7998 -29 20.7002 -47.9004 20.7002c-40 0 -73.2998 -36.0996 -64 -80.5996c-54.4004 2.7998 -102.9 28.7998 -135.2 68.5996
|
@@ -1228,15 +1297,17 @@ c-4.2998 22.5 -31.4004 20.9004 -49 20.9004h-24.6006v-127.8zM382.5 157.4v36c0 17.
|
|
1228 |
c5.69922 -6.7998 11.8994 -9.7998 20.8994 -9.7998c19.7998 0 22.2002 15.2002 22.2002 30.9004zM265 218.1v-49.2998c0 -9.7002 1.90039 -18.7002 -10.2998 -18.3994v83.6992c11.8994 0 10.2998 -6.2998 10.2998 -16zM350.5 192v-32.7002
|
1229 |
c0 -5.39941 1.59961 -14.3994 -6.2002 -14.3994c-1.59961 0 -3 0.799805 -3.7998 2.39941c-2.2002 5.10059 -1.09961 44.1006 -1.09961 44.7002c0 3.7998 -1.10059 12.7002 4.89941 12.7002c7.2998 0 6.2002 -7.2998 6.2002 -12.7002z" />
|
1230 |
<glyph glyph-name="ravelry" unicode="" horiz-adv-x="512"
|
1231 |
-
d="
|
1232 |
-
c-
|
1233 |
-
c-
|
1234 |
-
|
1235 |
-
c-
|
1236 |
-
|
1237 |
-
|
1238 |
-
|
1239 |
-
|
|
|
|
|
1240 |
<glyph glyph-name="sellcast" unicode=""
|
1241 |
d="M353.4 416c52.0996 0 94.6992 -42.5996 94.6992 -94.5996v-258.801c0 -52 -42.5996 -94.5996 -94.6992 -94.5996h-258.7c-52.1006 0 -94.7002 42.5996 -94.7002 94.7002v258.7c0 52 42.5996 94.5996 94.7002 94.5996h258.7zM303.4 99.5996
|
1242 |
c27.8994 48.2002 11.1992 110.5 -37.2002 138.5c-18.6006 10.8008 0.0996094 -0.0996094 -18.5 10.7002c-25 14.4004 -46.2002 -23.2998 -21.6006 -37.5c18 -10.2002 0.800781 -0.399414 18.6006 -10.5996c27.5996 -16 37.2002 -51.7998 21.2998 -79.4004
|
@@ -1917,13 +1988,21 @@ c-42.5 0 -47.3994 -14.8008 -47.3994 -25.9004c0 -13.4004 5.7998 -17.2998 63.2002
|
|
1917 |
<glyph glyph-name="npm" unicode="" horiz-adv-x="576"
|
1918 |
d="M288 160h-32v64h32v-64zM576 288v-192h-288v-32h-128v32h-160v192h576zM160 256h-128v-128h64v96h32v-96h32v128zM320 256h-128v-160h64v32h64v128zM544 256h-192v-128h64v96h32v-96h32v96h32v-96h32v128z" />
|
1919 |
<glyph glyph-name="ns8" unicode="" horiz-adv-x="640"
|
1920 |
-
d="
|
1921 |
-
c-
|
1922 |
-
|
1923 |
-
|
1924 |
-
|
1925 |
-
c-
|
1926 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1927 |
<glyph glyph-name="nutritionix" unicode="" horiz-adv-x="400"
|
1928 |
d="M88 439.9c0 0 133.4 8.19922 121 -104.4c0 0 19.0996 74.9004 103 40.5996c0 0 -17.7002 -74 -88 -56c0 0 14.5996 54.6006 66.0996 56.6006c0 0 -39.8994 10.2998 -82.0996 -48.7998c0 0 -19.7998 94.5 -93.5996 99.6992c0 0 75.1992 -19.3994 77.5996 -107.5
|
1929 |
c0 -0.0996094 -106.4 -7 -104 119.801zM400 124.3c0 -48.5 -9.7002 -95.2998 -32 -132.3c-42.2002 -30.9004 -105 -48 -168 -48c-62.9004 0 -125.8 17.0996 -168 48c-22.2998 37 -32 83.7998 -32 132.3c0 48.4004 17.7002 94.7002 40 131.7
|
@@ -2025,13 +2104,16 @@ d="M281.2 169.8l-197.9 -57.2002l-28.5996 98.6006l188.2 54.0996c52.6992 15.2998 6
|
|
2025 |
c-46 0 -89.5 12.7002 -126.3 34.7002l-23 80.2002l286.8 -37.3008l48.0996 13.3008l-9.69922 34.1992l-220.4 27.1006l92.5996 26.5996c30.2002 8.7002 42 15.7998 61.4004 33.2002c24.5 23 31.7002 45.5 23.5 73.5996l-10.7002 37.8008
|
2026 |
c-8.7002 30.1992 -25.0996 49.0996 -61.3994 55.1992c-25.1006 3.5 -44.5 2 -79.3008 -8.19922l-221.899 -63.9004c26 108.8 124.2 189.5 241.3 189.5zM38.2998 59.4004c-24 38.3994 -38.2998 83.2998 -38.2998 131.8z" />
|
2027 |
<glyph glyph-name="rocketchat" unicode="" horiz-adv-x="576"
|
2028 |
-
d="
|
2029 |
-
|
2030 |
-
|
2031 |
-
|
2032 |
-
c-
|
2033 |
-
c-
|
2034 |
-
|
|
|
|
|
|
|
2035 |
<glyph glyph-name="rockrms" unicode="" horiz-adv-x="496"
|
2036 |
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM405.4 20.5l-101.5 118.9s73.5996 0.199219 74.1992 0.199219c29.6006 -1.09961 46.6006 33.3008 27.6006 56.1006l-157.7 185.1c-13.2002 17.2998 -40.0996 18.4004 -54.5 0
|
2037 |
l-147.1 -172.5h90l84.2998 98.9004l84.5996 -99.2998h-75.2998c-30.5 0 -44.5 -35.7002 -26.5996 -56.1006l112 -131.3h90z" />
|
@@ -3286,8 +3368,6 @@ c0 -0.0498047 -0.00195312 -0.0986328 -0.00585938 -0.147461v-0.799805c0.00195312
|
|
3286 |
v-25.7998h16.1006c0.0380859 0.00195312 0.0742188 0.00488281 0.113281 0.00488281c1.04297 0 1.88965 -0.847656 1.88965 -1.89062c0 -0.0380859 -0.000976562 -0.0761719 -0.00292969 -0.114258v-0.800781
|
3287 |
c0.00195312 -0.0380859 0.00488281 -0.0742188 0.00488281 -0.113281c0 -1.04297 -0.847656 -1.88965 -1.89062 -1.88965c-0.0380859 0 -0.0761719 0.000976562 -0.114258 0.00292969h-16.1006v-26.6992h19.4004zM288.301 262.799l2.2998 -6.7998l7.10059 -0.0996094
|
3288 |
l-5.7002 -4.30078l2.09961 -6.7998l-5.7998 4.10059l-5.7998 -4.10059l2.09961 6.7998l-5.69922 4.30078l7.09961 0.0996094z" />
|
3289 |
-
<glyph glyph-name="adobe" unicode="" horiz-adv-x="512"
|
3290 |
-
d="M315.5 384h170.9v-384zM196.5 384l-170.9 -384v384h170.9zM256 241.9l107.5 -241.9h-73l-30.7002 76.7998h-78.7002z" />
|
3291 |
<glyph glyph-name="artstation" unicode="" horiz-adv-x="512"
|
3292 |
d="M2 70.5996h315.1l59.2002 -102.6h-285.399c-0.00488281 0 0.0205078 -0.0498047 0.015625 -0.0498047c-20.0742 0 -37.4736 11.5439 -45.916 28.3496zM501.8 98c19 -29.4004 -0.0996094 -55.9004 -2 -59.0996l-40.7002 -70.5l-257.3 447.6h88.4004
|
3293 |
c0.00390625 0 -0.0234375 0.0527344 -0.0195312 0.0527344c19.6797 0 36.79 -11.0879 45.4189 -27.3525zM275 143.5h-231l115.5 200z" />
|
1 |
<?xml version="1.0" standalone="no"?>
|
|
|
|
|
|
|
|
|
2 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
3 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
4 |
<metadata>
|
5 |
+
Created by FontForge 20200314 at Mon Oct 5 09:50:45 2020
|
6 |
By Robert Madole
|
7 |
Copyright (c) Font Awesome
|
8 |
</metadata>
|
9 |
+
<!-- Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
|
10 |
<font id="FontAwesome5Brands-Regular" horiz-adv-x="448" >
|
11 |
<font-face
|
12 |
font-family="Font Awesome 5 Brands Regular"
|
156 |
c0.00878906 0 0.140625 -0.0732422 0.149414 -0.0732422v-87.3799z" />
|
157 |
<glyph glyph-name="unsplash" unicode=""
|
158 |
d="M448 217.83v-249.83h-448v249.83h141.13v-124.92h165.74v124.92h141.13zM306.87 416v-124.91h-165.74v124.91h165.74z" />
|
159 |
+
<glyph glyph-name="cloudflare" unicode="" horiz-adv-x="640"
|
160 |
+
d="M407.906 128.087c12.1836 -0.574219 22.2178 -5.50977 28.2334 -13.9023c6.54883 -9.09961 8 -21.5 4.10059 -34.8994l-3.27344 -11.2656c-0.681641 -2.28125 -2.7793 -3.95508 -5.27051 -4c-0.0419922 -0.000976562 -0.0791016 -0.0195312 -0.12207 -0.0195312
|
161 |
+
l-426.101 0.0507812c-2.26172 0.00878906 -4.13379 1.69238 -4.44434 3.87109c-0.676758 4.58691 -1.02637 9.18457 -1.0293 13.958c0 52.3926 41.9238 95.0137 94.2002 96.5303c-1.37402 5.39062 -2.05469 10.9785 -2.05469 16.7939
|
162 |
+
c0 37.5967 30.5234 68.1201 68.1201 68.1201c15.3838 0 29.583 -5.11035 40.9912 -13.7246c20.542 59.582 77.085 102.308 143.607 102.308c72.1562 0 132.629 -50.417 148.085 -117.914c0.107422 -0.513672 0.164062 -1.03906 0.164062 -1.58398v-0.046875
|
163 |
+
c0 -0.0332031 -0.00292969 -0.0683594 -0.00292969 -0.101562c0 -0.998047 -0.18457 -1.9541 -0.521484 -2.83496l-13.2861 -34.542c-10.4756 -27.21 -40.3906 -49.5234 -68.0215 -50.7842l-232.94 -2.93555c-2.48145 -0.173828 -4.5625 -1.82227 -5.36035 -4.07617
|
164 |
+
c-0.178711 -0.493164 -0.275391 -1.03223 -0.275391 -1.58691c0 -0.945312 0.283203 -1.8252 0.768555 -2.55957c0.8125 -1.14258 2.13379 -1.89355 3.63281 -1.92676zM513.856 226.9c69.668 0 126.144 -56.2002 126.147 -125.533
|
165 |
+
c0 -0.0458984 -0.0175781 -0.0644531 -0.0175781 -0.110352c0 -11.7441 -1.62598 -23.1123 -4.66406 -33.8896c-0.571289 -1.94629 -2.37012 -3.37012 -4.5 -3.37012h-0.0390625h-175.91c-0.0478516 0 -0.0898438 0.0166016 -0.135742 0.0166016
|
166 |
+
c-1.44727 0.0595703 -2.60449 1.25391 -2.60449 2.71484c0 0.339844 0.0634766 0.666016 0.176758 0.96582l3.69531 9.60547c10.4766 27.21 40.3916 49.5146 68.1455 50.7842l51.125 2.93945c2.47559 0.179688 4.55078 1.82617 5.35059 4.07422
|
167 |
+
c0.177734 0.492188 0.274414 1.03027 0.274414 1.58301c0 0.957031 -0.291016 1.84766 -0.788086 2.58594c-0.785156 1.11035 -2.06152 1.84375 -3.51074 1.89453l-49.1992 2.93848c-12.1846 0.577148 -22.2188 5.5 -28.2383 13.9004
|
168 |
+
c-6.54883 9.10352 -8 21.4902 -4.09961 34.8896l9.07617 31.1934c0.447266 1.45508 1.75391 2.53613 3.32422 2.65332c2.12012 0.101562 4.25 0.164062 6.3916 0.164062z" />
|
169 |
+
<glyph glyph-name="guilded" unicode=""
|
170 |
+
d="M443.427 384c0.00195312 -0.518555 0.0253906 -0.367188 0.0253906 -0.885742c0 -29.1934 -2.00293 -57.9229 -5.87891 -86.0576h-336.147s0.366211 -52.0498 27.0918 -105.883c27.458 -51.8174 65.3164 -85.1025 96.5488 -98.3623
|
171 |
+
c32.2695 15.082 63.4434 41.2695 80.4561 69.4824h-88.5898c-22.9229 18.998 -40.96 50.5146 -45.0996 86.9443h259.889c-12.8154 -58.5713 -40.0088 -111.838 -65.916 -145.762c-35.8154 -46.7773 -84.2695 -82.8105 -140.55 -103.477
|
172 |
+
c-1.25586 0 -113.21 33.8652 -177.267 161.642c-21.2266 42.2988 -43.418 119.099 -43.418 222.358h438.855z" />
|
173 |
+
<glyph glyph-name="hive" unicode="" horiz-adv-x="512"
|
174 |
+
d="M260.353 193.122c0.191406 -0.329102 0.300781 -0.716797 0.300781 -1.12402c0 -0.404297 -0.107422 -0.783203 -0.294922 -1.11133l-127.412 -221.777c-0.380859 -0.666992 -1.09473 -1.11621 -1.91602 -1.11621c-0.818359 0 -1.53223 0.445312 -1.91406 1.10645
|
175 |
+
l-128.816 221.778c-0.189453 0.328125 -0.297852 0.713867 -0.297852 1.12012s0.108398 0.787109 0.297852 1.11523l127.409 221.777c0.380859 0.666016 1.09473 1.11523 1.91602 1.11523c0.817383 0 1.53125 -0.445312 1.91309 -1.10547zM299.431 218.835l-110.624 193.824
|
176 |
+
c-0.189453 0.327148 -0.298828 0.709961 -0.298828 1.11523c0 1.21973 0.983398 2.21094 2.19922 2.22559h66.5078c0.81543 -0.00195312 1.52539 -0.447266 1.90039 -1.11133l110.625 -193.823c0.189453 -0.328125 0.298828 -0.709961 0.298828 -1.11523
|
177 |
+
c0 -1.21973 -0.983398 -2.21191 -2.19922 -2.22656h-66.5088c-0.81543 0.00292969 -1.52441 0.448242 -1.90039 1.11133zM511.7 193.114c0.1875 -0.328125 0.294922 -0.711914 0.294922 -1.11621c0 -0.405273 -0.107422 -0.78418 -0.294922 -1.1123l-126.808 -221.773
|
178 |
+
c-0.376953 -0.664062 -1.08887 -1.11035 -1.90527 -1.1123h-66.6006c-1.21875 0.0117188 -2.20312 1.00684 -2.20312 2.22852c0 0.404297 0.108398 0.78418 0.297852 1.11133l126.171 220.66l-126.168 220.66c-0.189453 0.327148 -0.298828 0.708984 -0.298828 1.11426
|
179 |
+
c0 1.2207 0.985352 2.21387 2.2041 2.22559h66.6006c0.818359 -0.000976562 1.53125 -0.447266 1.91016 -1.1123zM366.016 163.083c1.2168 -0.0136719 2.19922 -1.00879 2.19922 -2.22852c0 -0.405273 -0.108398 -0.785156 -0.297852 -1.1123l-108.8 -190.631
|
180 |
+
c-0.375 -0.664062 -1.08496 -1.10938 -1.90039 -1.11133h-66.5088c-1.21582 0.0146484 -2.19824 1.00879 -2.19824 2.22852c0 0.405273 0.108398 0.785156 0.297852 1.1123l108.801 190.631c0.374023 0.664062 1.08398 1.10938 1.89941 1.11133h66.5078z" />
|
181 |
+
<glyph glyph-name="innosoft" unicode=""
|
182 |
+
d="M422.559 288.29l0.00292969 -190.955c0.0253906 -12.4102 -5.87793 -22.8965 -16.623 -29.5283l-164.527 -94.9951c-5.08008 -3.04102 -11.0938 -4.79004 -17.4404 -4.79004c-6.11523 0 -11.8545 1.62402 -16.8096 4.46387l-118.794 68.583l247.049 142.627v-56
|
183 |
+
l-150.051 -86.627l32.7227 -18.9004c1.74805 -0.97168 3.78613 -1.52441 5.92676 -1.52441c2.18457 0 4.23633 0.576172 6.01074 1.58691l138.111 79.7441c3.54883 2.08008 5.91992 5.92578 5.91992 10.332v0.0361328v138.281l-308.407 -178.066
|
184 |
+
c-3.94629 -2.25293 -8.57129 -3.54102 -13.4365 -3.54102c-4.83301 0 -9.37207 1.27051 -13.2998 3.49609c-8.39453 4.75586 -13.3037 13.293 -13.4736 23.4287v191.5c0.518555 12.7334 6.65527 23.0039 17.2891 29.124l164.601 95.0254
|
185 |
+
c11.5 5.98535 22.8076 5.85938 33.7998 -0.269531l118.513 -68.4072l-247.061 -142.637v56l150.062 86.6367l-32.6553 18.8525c-1.76367 0.998047 -3.82715 1.56738 -5.99609 1.56738c-2.15137 0 -4.17285 -0.55957 -5.92578 -1.54199l-138.076 -79.7129
|
186 |
+
c-3.60352 -2.04785 -6.02734 -5.90723 -6.04688 -10.3398v-138.387l308.539 178.142c3.88281 2.24414 8.44531 3.5293 13.25 3.5293c4.70801 0 9.13086 -1.23438 12.9609 -3.39648c8.16406 -4.63184 13.6914 -13.3291 13.8652 -23.3369z" />
|
187 |
+
<glyph glyph-name="instalod" unicode="" horiz-adv-x="512"
|
188 |
+
d="M153.384 -32l50.8447 146.789l298.325 57.4463l-115.44 -204.235h-233.729zM504.726 207.922l-144.495 -27.8223l-204.562 235.9h231.444zM124.386 399.191l101.241 -116.752l-102.391 -295.594l-115.962 205.154z" />
|
189 |
+
<glyph glyph-name="octopus-deploy" unicode="" horiz-adv-x="512"
|
190 |
+
d="M455.6 98.7998c12.4395 -10.5996 42.6348 -26.4775 42.5244 -45.2666c-0.15332 -24.6084 -48.4248 5.24121 -53.8184 9.51953c6.13965 -10.7275 66.998 -74.1787 28.2627 -78.6943c-35.6562 -4.1582 -67.1406 45.6416 -88.5615 67.0225
|
191 |
+
c-36 35.9082 -29.7373 -43.5332 -29.8994 -59.9443c-0.257812 -25.9082 -18.5586 -78.4209 -51.4121 -44.2207c-27.1387 28.2314 -16.873 73.2607 -35.7383 104.622c-20.6641 34.3535 -55.0361 -34.3535 -63.627 -46.9258
|
192 |
+
c-9.59668 -14.042 -57.6094 -82.041 -76.709 -45.8125c-15.499 29.4004 9.2793 75.5127 21.4629 102.103c-4.44336 -9.65723 -35.9297 -23.9414 -45.1299 -28.5879c-20.7871 -10.4971 -41.8867 -16.7256 -65.2646 -15.0449
|
193 |
+
c-27.8916 2.00098 -38.3789 11.6572 8.42773 41.8574c38.5615 24.8389 83.8613 67.4209 66.6621 117.582c-9.37305 27.3301 -22.3574 50.7568 -24.0898 80.2998c-0.209961 3.56152 -0.25 7.08008 -0.25 10.6924c0 22.0957 3.9707 43.2715 11.2373 62.8516
|
194 |
+
c34.5752 92.8066 137.363 136.747 230.253 108.848c86.0371 -25.8398 145.23 -125.74 109.575 -212.79c-20.5752 -50.2334 -29.7959 -89.0205 16.0947 -128.11z" />
|
195 |
+
<glyph glyph-name="perbyte" unicode=""
|
196 |
+
d="M305.314 163.422c15.9307 0.000976562 28.5732 -4.5 37.9277 -13.5059s14.0322 -20.7842 14.0322 -35.335c0 -14.8936 -4.58984 -26.9307 -13.7705 -36.1113c-9.17969 -9.17969 -21.9111 -13.7695 -38.1934 -13.7695h-58.7109v98.7217h58.7148zM149.435 319.301
|
197 |
+
c15.9346 0.00488281 28.5791 -4.49609 37.9316 -13.5039s14.0283 -20.7871 14.0283 -35.3379c0 -14.8896 -4.58984 -26.9258 -13.7695 -36.1084c-9.17969 -9.18164 -21.9102 -13.7725 -38.1904 -13.7725h-58.7109v98.7227h58.7109zM366.648 416.002
|
198 |
+
c22.4385 -0.0253906 41.5996 -7.98145 57.4854 -23.8672s23.8418 -35.0479 23.8672 -57.4854v-285.296c-0.0253906 -22.4375 -7.98145 -41.5996 -23.8672 -57.4854s-35.0479 -23.8418 -57.4854 -23.8672h-285.295c-22.4385 0.0253906 -41.6006 7.98145 -57.4863 23.8672
|
199 |
+
s-23.8418 35.0479 -23.8672 57.4863v285.296c0.0253906 22.4375 7.98145 41.5996 23.8672 57.4854s35.0479 23.8408 57.4863 23.8662h285.295zM430.282 49.3535l-0.000976562 285.296c-0.0195312 17.5518 -6.24219 32.54 -18.668 44.9658s-27.4141 18.6484 -44.9648 18.668
|
200 |
+
h-285.295c-17.5508 -0.0195312 -32.5391 -6.24219 -44.9648 -18.668s-18.6484 -27.4141 -18.668 -44.9658v-285.296c0.0195312 -17.5508 6.24219 -32.5391 18.668 -44.9648s27.4141 -18.6484 44.9648 -18.668h285.295c17.5518 0.0195312 32.54 6.24219 44.9658 18.668
|
201 |
+
s18.6484 27.4141 18.668 44.9648zM305.313 319.301c15.9307 0.00488281 28.5732 -4.49609 37.9277 -13.5039s14.0322 -20.7871 14.0322 -35.3379c0 -14.8896 -4.58984 -26.9258 -13.7705 -36.1084c-9.17969 -9.18164 -21.9111 -13.7725 -38.1934 -13.7725h-58.7109v98.7227
|
202 |
+
h58.7148z" />
|
203 |
+
<glyph glyph-name="uncharted" unicode=""
|
204 |
+
d="M171.73 215.187c-0.0605469 -0.00195312 -0.12207 -0.000976562 -0.183594 -0.000976562c-0.673828 0 -1.3125 0.148438 -1.88672 0.414062l-115.933 67.9004v-85.2891c-0.0830078 -2.71289 -1.16895 -5.18555 -2.89941 -7.03906
|
205 |
+
c-1.6748 -1.54297 -3.91113 -2.4873 -6.36621 -2.4873c-0.0859375 0 -0.172852 0.000976562 -0.258789 0.00390625c-0.146484 -0.0078125 -0.296875 -0.00585938 -0.444336 -0.00585938c-1.65332 0 -3.2002 0.455078 -4.52344 1.24707l-22.3584 12.835
|
206 |
+
c-2.9541 1.50684 -4.9707 4.57031 -4.9707 8.1123c0 0.0566406 0.000976562 0.112305 0.00195312 0.168945v115.107c0.118164 3.54102 2.08105 6.61523 4.96875 8.28027l100.2 57.9668c1.40625 0.787109 3.04688 1.23535 4.77148 1.23535s3.3457 -0.448242 4.75098 -1.23535
|
207 |
+
l22.3584 -12.8389c2.9541 -1.50586 4.96973 -4.56934 4.96973 -8.11035c0 -0.0566406 -0.000976562 -0.113281 -0.00195312 -0.169922c-0.117188 -3.54199 -2.08008 -6.61523 -4.96777 -8.28125l-74.5293 -43.4727l116.757 -68.3184
|
208 |
+
c1.16016 -0.680664 1.96191 -1.89941 2.07129 -3.31152c0 -1.65723 -0.414062 -3.31348 -1.65723 -4.1416c-7.34473 -6.5459 -12.6475 -15.3301 -14.8994 -25.2559c-0.810547 -1.94629 -2.72949 -3.31348 -4.96777 -3.31348h-0.00195312zM323.272 70.2695
|
209 |
+
c4.96777 0 9.52734 -4.55469 10.3506 -9.1084v-26.085c-0.117188 -3.54199 -2.08105 -6.61523 -4.96777 -8.28125l-100.2 -57.5527c-1.48633 -0.772461 -3.18359 -1.22363 -4.96875 -1.24219c-0.146484 -0.00683594 -0.296875 -0.00488281 -0.444336 -0.00488281
|
210 |
+
c-1.65332 0 -3.2002 0.455078 -4.52441 1.24707l-100.199 57.5527c-2.95508 1.50586 -4.9707 4.56934 -4.9707 8.11035c0 0.0576172 0 0.114258 0.000976562 0.170898v26.085c0.0585938 5.22852 4.29492 9.46484 9.52344 9.52246
|
211 |
+
c0.146484 0.0078125 0.296875 0.00585938 0.444336 0.00585938c1.65332 0 3.20117 -0.456055 4.52441 -1.24707l74.5293 -43.0615v133.323c0.0615234 2.62891 2.21387 4.74609 4.85742 4.74609c0.469727 0 0.922852 -0.0673828 1.35254 -0.191406
|
212 |
+
c4.39453 -1.18066 8.99414 -1.80664 13.7588 -1.80664c5.29102 0 10.4023 0.776367 15.2256 2.2207c3.31055 1.24512 6.21094 -1.65527 6.21094 -4.55469v-134.152l74.5273 43.0625c1.50684 0.730469 3.2002 1.17383 4.96973 1.24121zM286.007 370
|
213 |
+
c-12.6943 0 -23 10.3057 -23 23s10.3057 23 23 23s23 -10.3057 23 -23s-10.3057 -23 -23 -23zM349.634 380.086c12.6943 0 23 -10.3057 23 -23s-10.3057 -23 -23 -23c-12.6934 0 -23 10.3057 -23 23s10.3066 23 23 23zM412.816 296.4c-12.6943 0 -23 10.3057 -23 23
|
214 |
+
c0 12.6934 10.3057 23 23 23c12.6934 0 23 -10.3066 23 -23c0 -12.6943 -10.3066 -23 -23 -23zM349.634 305.6c12.6943 0 23 -10.3057 23 -23c0 -12.6934 -10.3057 -23 -23 -23c-12.6934 0 -23 10.3066 -23 23c0 12.6943 10.3066 23 23 23zM286.007 222.356
|
215 |
+
c-12.6943 0 -23 10.3018 -23 22.9951v0.00488281c0 12.6934 10.3057 23 23 23s23 -10.3066 23 -23c0 -12.6943 -10.3057 -23 -23 -23zM223.933 185.998c-12.6934 0 -23 10.3018 -23 22.9961v0.00390625c0 12.6943 10.3066 23 23 23c12.6943 0 23 -10.3057 23 -23
|
216 |
+
s-10.3057 -23 -23 -23zM412.816 268.356c12.6924 0 22.9971 -10.3086 23 -23c0 -12.6943 -10.3066 -23 -23 -23c-12.6943 0 -23 10.3057 -23 23c0 12.6934 10.3057 23 23 23zM412.816 196.084c12.6924 0 22.9971 -10.3076 23 -23c0 -12.6943 -10.3066 -23 -23 -23
|
217 |
+
c-12.6943 0 -23 10.3057 -23 23s10.3057 23 23 23z" />
|
218 |
+
<glyph glyph-name="watchman-monitoring" unicode="" horiz-adv-x="512"
|
219 |
+
d="M256 432c132.548 0 240 -107.452 240 -240s-107.452 -240 -240 -240s-240 107.452 -240 240s107.452 240 240 240zM121.69 18.8779l27.6846 204.861l-9.46777 7.39941c-2.98242 2.34082 -4.89062 5.9668 -4.89062 10.0479
|
220 |
+
c0 0.100586 0.000976562 0.201172 0.00292969 0.301758c0 7.04883 0.144531 19.5488 0.144531 19.5488l13.9434 2.0127l0.120117 10.9668l-102.899 -17.8945c-6.20508 -20.251 -9.58691 -41.7412 -9.58691 -64.0137v-0.108398c0 -70.3223 33.3145 -132.972 84.9492 -173.122
|
221 |
+
zM227.382 302.148l0.0400391 -3.61816l193.512 37.7002c-40.1152 46.0273 -99.1426 75.0244 -164.934 75.0244c-74.4863 0 -140.374 -37.3623 -180.018 -94.2998l73.5068 -19.1758l0.0478516 4.36914l-8.48145 7.61719s-6.93359 5.38086 0.144531 9.34473
|
222 |
+
c7.18652 4.02539 39.5283 34.5 39.5283 34.5c7.20312 7.34668 10.1123 5.47656 15.4609 0c0 0 32.3418 -30.4766 39.5293 -34.5c7.07715 -3.96387 0.143555 -9.34473 0.143555 -9.34473zM261.445 -27.1211c118.386 2.90918 213.813 100.047 213.813 219.121
|
223 |
+
c-0.0107422 17.2881 -2.04297 33.9951 -5.85059 50.1299l-241.711 31.3916l0.116211 -10.4746l13.9424 -2.0127s0.144531 -12.5049 0.144531 -19.5488c0.00195312 -0.100586 0.0126953 -0.19043 0.0126953 -0.290039c0 -4.08203 -1.91797 -7.71973 -4.90137 -10.0596
|
224 |
+
l-9.4668 -7.39941z" />
|
225 |
+
<glyph glyph-name="wodu" unicode="" horiz-adv-x="640"
|
226 |
+
d="M178.414 108.294h-37.3145l-28.9336 116.231h-0.477539l-28.4609 -116.231h-38.0273l-45.2002 170.76h37.5479l27.0264 -116.23h0.477539l29.6553 116.23h35.1572l29.1777 -117.667h0.479492l27.9785 117.667h36.8311zM271.4 235.287
|
227 |
+
c38.9834 0 64.0996 -25.8281 64.0996 -65.291c0 -39.2217 -25.1113 -65.0498 -64.0996 -65.0498c-38.7432 0 -63.8555 25.8281 -63.8555 65.0498c0.00195312 39.4629 25.1143 65.291 63.8555 65.291zM271.4 130.534c23.1992 0 30.1328 19.8516 30.1328 39.4619
|
228 |
+
c0 19.8516 -6.93457 39.7002 -30.1328 39.7002c-27.7002 0 -29.8945 -19.8506 -29.8945 -39.7002c0.00195312 -19.6104 6.9375 -39.4619 29.8945 -39.4619zM435.084 124.078h-0.477539c-7.89355 -13.3926 -21.7656 -19.1318 -37.5488 -19.1318
|
229 |
+
c-37.3096 0 -55.4844 32.0449 -55.4844 66.2461c0 33.2422 18.415 64.0947 54.7666 64.0947c14.5889 0 28.9385 -6.21777 36.8311 -18.416h0.240234v62.1826h33.96v-170.76h-32.2871v15.7842zM405.428 209.7c-22.2393 0 -29.8936 -19.1338 -29.8936 -39.4629
|
230 |
+
c0 -19.3711 8.84766 -39.7002 29.8936 -39.7002c22.4824 0 29.1787 19.6133 29.1787 39.9395c0 20.0879 -7.1748 39.2236 -29.1787 39.2236zM592.96 108.294h-32.2871v17.2188h-0.717773c-8.60938 -13.8701 -23.4365 -20.5664 -37.7861 -20.5664
|
231 |
+
c-36.1133 0 -45.2002 20.3281 -45.2002 50.9404v76.0527h33.959v-69.8398c0 -20.3281 5.97949 -30.3721 21.7656 -30.3721c18.415 0 26.3057 10.2832 26.3057 35.3936v64.8184h33.9609v-123.646zM602.453 145.124h37.5469v-36.8301h-37.5469v36.8301z" />
|
232 |
<glyph glyph-name="twitter-square" unicode=""
|
233 |
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM351.1 257.2c12.8008 9.2998 24 20.8994 32.9004 34c-11.7998 -5.10059 -24.5996 -8.7998 -37.7998 -10.2002
|
234 |
c13.5996 8.09961 23.8994 20.9004 28.7998 36.0996c-12.5996 -7.5 -26.7998 -13 -41.5996 -15.7998c-12 12.7998 -29 20.7002 -47.9004 20.7002c-40 0 -73.2998 -36.0996 -64 -80.5996c-54.4004 2.7998 -102.9 28.7998 -135.2 68.5996
|
1297 |
c5.69922 -6.7998 11.8994 -9.7998 20.8994 -9.7998c19.7998 0 22.2002 15.2002 22.2002 30.9004zM265 218.1v-49.2998c0 -9.7002 1.90039 -18.7002 -10.2998 -18.3994v83.6992c11.8994 0 10.2998 -6.2998 10.2998 -16zM350.5 192v-32.7002
|
1298 |
c0 -5.39941 1.59961 -14.3994 -6.2002 -14.3994c-1.59961 0 -3 0.799805 -3.7998 2.39941c-2.2002 5.10059 -1.09961 44.1006 -1.09961 44.7002c0 3.7998 -1.10059 12.7002 4.89941 12.7002c7.2998 0 6.2002 -7.2998 6.2002 -12.7002z" />
|
1299 |
<glyph glyph-name="ravelry" unicode="" horiz-adv-x="512"
|
1300 |
+
d="M498.252 213.777c0.129883 -0.613281 0.322266 -1.21777 0.561523 -1.78223v-37.0557c-0.194336 -0.300781 -0.516602 -0.583008 -0.552734 -0.900391c-0.619141 -5.36426 -0.837891 -10.8076 -1.87012 -16.0869c-2.06934 -10.6074 -4.15723 -21.2393 -7.0166 -31.6523
|
1301 |
+
c-4.94531 -18.0205 -12.7578 -34.8809 -22.2998 -50.9258c-8.94336 -15.126 -19.4043 -28.9668 -31.4268 -41.6387c-3.74609 -3.92188 -7.54688 -7.80078 -11.5107 -11.5c-5.31152 -4.95703 -10.5146 -10.1094 -16.2998 -14.457
|
1302 |
+
c-9.3418 -7.02344 -18.9883 -13.6533 -28.7373 -20.1006c-15.083 -9.81543 -31.6211 -17.9053 -48.9512 -23.8174c-15.3828 -5.38281 -31.1533 -9.38574 -47.4893 -10.7178c-2.52734 -0.206055 -5.02051 -0.753906 -7.52734 -1.14258h-32.2891
|
1303 |
+
c-0.358398 0.245117 -0.762695 0.436523 -1.18945 0.55957c-6.1377 0.620117 -12.3418 0.863281 -18.4121 1.87305c-13.8301 2.22949 -27.5977 5.58398 -40.6416 9.83496c-19.5498 6.43359 -38.4463 15.0176 -55.8994 25.2773
|
1304 |
+
c-15.0488 8.79004 -28.9365 18.9688 -41.7871 30.5859c-9.6875 8.70605 -18.3936 18.0898 -26.3584 28.416c-9.38184 12.1963 -17.4385 25.4316 -24 39.5283c-7.5918 16.6592 -13.3467 34.7812 -16.7295 53.2998c-2.35547 13.1611 -3.85059 26.5459 -4.4248 40.2402
|
1305 |
+
c-0.136719 3.0332 -0.209961 5.74121 -0.209961 8.80859c0 9.05566 0.599609 17.9717 1.76172 26.7119c1.52637 11.874 4.15625 23.6367 7.69043 34.7588c5.05762 15.7021 12.0283 30.7871 20.4941 44.6006c9.58203 15.9961 20.7793 30.6025 33.6484 43.9502
|
1306 |
+
c9.55469 9.83496 19.7539 19.0605 29.9268 28.2676c5.70605 5.1582 11.8066 9.9082 17.9736 14.5186c12.0029 9.04004 24.6963 17.1025 38.0801 24.1572c12.5137 6.63281 25.9795 12.1963 39.7686 16.3555c10.9453 3.41016 22.5254 5.84375 34.2559 7.09961
|
1307 |
+
c2.42773 0.225586 4.82617 0.761719 7.23633 1.15039c10.7627 -0.00195312 21.5254 0 32.2881 0.00585938c0.299805 -0.195312 0.583984 -0.516602 0.899414 -0.552734c6.87793 -0.81543 13.8467 -1.16797 20.627 -2.48242
|
1308 |
+
c11.2432 -2.18359 22.4971 -4.51465 33.5156 -7.61523c19.999 -5.78125 39.2266 -14.2031 56.7227 -24.668c17.2832 -10.0947 32.9639 -22.1357 47.1133 -36.1152c6.71973 -6.90527 12.9209 -14.0508 18.8174 -21.6895c13.4639 -16.959 24.0283 -36.4561 30.874 -57.5
|
1309 |
+
c3.88867 -11.8086 7.16211 -24.2148 9.62207 -36.5996c2.0459 -10.1748 2.53809 -20.6602 3.74609 -31zM337.135 214.927l0.00488281 67.2695c-35.2686 0 -53.1152 -9.36719 -62.04 -36.1895v31.9316h-73.5176v-190.738h73.5127v93.667
|
1310 |
+
c0 22.1396 6.37012 37.04 33.5703 37.04c11.8984 0 28.4697 -2.98047 28.4697 -2.98047z" />
|
1311 |
<glyph glyph-name="sellcast" unicode=""
|
1312 |
d="M353.4 416c52.0996 0 94.6992 -42.5996 94.6992 -94.5996v-258.801c0 -52 -42.5996 -94.5996 -94.6992 -94.5996h-258.7c-52.1006 0 -94.7002 42.5996 -94.7002 94.7002v258.7c0 52 42.5996 94.5996 94.7002 94.5996h258.7zM303.4 99.5996
|
1313 |
c27.8994 48.2002 11.1992 110.5 -37.2002 138.5c-18.6006 10.8008 0.0996094 -0.0996094 -18.5 10.7002c-25 14.4004 -46.2002 -23.2998 -21.6006 -37.5c18 -10.2002 0.800781 -0.399414 18.6006 -10.5996c27.5996 -16 37.2002 -51.7998 21.2998 -79.4004
|
1988 |
<glyph glyph-name="npm" unicode="" horiz-adv-x="576"
|
1989 |
d="M288 160h-32v64h32v-64zM576 288v-192h-288v-32h-128v32h-160v192h576zM160 256h-128v-128h64v96h32v-96h32v128zM320 256h-128v-160h64v32h64v128zM544 256h-192v-128h64v96h32v-96h32v96h32v-96h32v128z" />
|
1990 |
<glyph glyph-name="ns8" unicode="" horiz-adv-x="640"
|
1991 |
+
d="M104.324 178.828v26.1777h26.0664v-26.1777h-26.0664zM156.79 205.006h-26.3428v26.1777c-0.124023 7.05762 -5.8916 12.748 -12.9785 12.748c-7.08594 0 -12.8535 -5.69043 -12.9775 -12.748v-0.166016h-26.4004v0.166016
|
1992 |
+
c-0.000976562 0.119141 -0.000976562 0.220703 -0.000976562 0.339844c0 21.7041 17.6211 39.3242 39.3242 39.3242c21.5039 0 38.999 -17.2959 39.3213 -38.7227v-0.941406zM209.146 179.16v26.0117h26.3438v-26.0117
|
1993 |
+
c0 -0.0371094 -0.000976562 -0.0722656 -0.000976562 -0.109375c0 -64.7373 -52.5439 -117.3 -117.274 -117.331h-0.774414c-0.0380859 0 -0.0732422 0.000976562 -0.110352 0.000976562c-64.7373 0 -117.299 52.543 -117.33 117.273v0.166016h26.3369
|
1994 |
+
c0 -50.2793 40.8203 -91.1006 91.0996 -91.1006h0.609375c50.2793 0 91.1006 40.8213 91.1006 91.1006zM51.9131 179.16v25.96h-26.291v25.3994c0 50.6445 41.1162 91.7617 91.7607 91.7617s91.7607 -41.1172 91.7607 -91.7617v-25.293h-26.3438v25.293v0.200195
|
1995 |
+
c0 36.1055 -29.3135 65.4199 -65.4199 65.4199c-35.7656 0 -64.8672 -28.7646 -65.4121 -64.4023v-26.6201h26.2891v-25.957c0.356445 -21.2305 17.7031 -38.3564 39.0176 -38.3564s38.6611 17.126 39.0176 38.3564h26.3438
|
1996 |
+
c-0.140625 -35.9551 -29.374 -65.1016 -65.3613 -65.1016s-65.2207 29.1465 -65.3613 65.1016zM470.313 250.333c-11.3467 0 -20.8633 -4.75977 -24.2402 -12.1172v-8.41211c2.21875 -4.53809 6.30859 -7.69238 12.6191 -9.62988
|
1997 |
+
c4.75879 -1.37891 9.76562 -2.3623 14.832 -2.87793c6.36426 -0.827148 13.0068 -1.71484 20.6992 -4.42676c13.7256 -4.59375 24.0742 -13.2275 28.9443 -24.2412l0.166016 -0.664062l-0.166016 -25.8994c-7.69238 -17.0479 -28.668 -28.4473 -52.2998 -28.4473
|
1998 |
+
c-25.6797 0 -47.374 12.6182 -55.2891 32.0439l-0.552734 1.43848l23.0205 11.5078l0.719727 -1.49414c5.97754 -12.1211 17.5996 -19.0391 31.9336 -19.0391c12.0098 0 22.083 4.81445 25.791 12.3418v9.85059c-2.37988 4.59473 -6.47656 7.75098 -12.8398 9.85156
|
1999 |
+
c-5.20312 1.71582 -10.3506 2.37988 -15.8291 3.09961c-6.78809 0.675781 -13.4814 2.04199 -19.8135 3.98438c-14.1123 4.87109 -23.9678 13.2275 -28.668 24.2412c-0.158203 0.949219 -0.123047 -2.02637 0 24.8496c7.36133 17.0469 27.8379 28.4473 50.9727 28.4473
|
2000 |
+
c24.9062 0 45.3818 -12.0098 53.4062 -31.2705l0.609375 -1.43848l-23.2451 -11.5117l-0.71875 1.5498c-5.47949 11.6221 -16.3818 18.2637 -30.0518 18.2637zM287.568 136.656v68.3994h26.0664v-68.3994h-26.0664zM639.834 189.956l0.166016 -0.722656l-0.166016 -28.8906
|
2001 |
+
c-7.52734 -15.9941 -27.8916 -26.7305 -50.584 -26.7305s-43.0029 10.7363 -50.585 26.7305l-0.166016 0.720703l0.166016 28.8887c2.93262 6.25391 8.24121 12.0137 15.4414 16.7139c-5.57422 3.90332 -10.0391 9.14453 -13.0068 15.3311l-0.166016 0.664062
|
2002 |
+
l0.166016 25.3467c7.36133 15.9922 26.7334 26.7324 48.1504 26.7324s40.7881 -10.7402 48.1504 -26.7295l0.166016 -0.664062l-0.166016 -25.3467c-2.90137 -6.22852 -7.38379 -11.4873 -13.0078 -15.3301c7.1416 -4.7041 12.5088 -10.46 15.4414 -16.7139z
|
2003 |
+
M566.614 240.762v-13.7246c3.48535 -6.19922 12.5068 -10.3486 22.5801 -10.3486c10.0723 0 19.0938 4.14844 22.6357 10.3486v13.7246c-3.59766 6.31055 -12.6191 10.5166 -22.6357 10.5166c-10.0176 0 -18.9805 -4.20605 -22.5801 -10.5166zM613.933 168.593v16.1572
|
2004 |
+
c-3.76367 6.36523 -13.3379 10.5146 -24.6826 10.5146c-11.1836 0 -20.9756 -4.20605 -24.6836 -10.5146v-16.1572c3.70801 -6.52734 13.5586 -10.8994 24.6836 -10.8994c11.3447 0 20.9189 4.25879 24.6826 10.8994zM376.4 182.038v89.7129h25.8994v-135.095h-25.6777
|
2005 |
+
l-62.5391 94.085v0.386719h-26.5098v40.623h29z" />
|
2006 |
<glyph glyph-name="nutritionix" unicode="" horiz-adv-x="400"
|
2007 |
d="M88 439.9c0 0 133.4 8.19922 121 -104.4c0 0 19.0996 74.9004 103 40.5996c0 0 -17.7002 -74 -88 -56c0 0 14.5996 54.6006 66.0996 56.6006c0 0 -39.8994 10.2998 -82.0996 -48.7998c0 0 -19.7998 94.5 -93.5996 99.6992c0 0 75.1992 -19.3994 77.5996 -107.5
|
2008 |
c0 -0.0996094 -106.4 -7 -104 119.801zM400 124.3c0 -48.5 -9.7002 -95.2998 -32 -132.3c-42.2002 -30.9004 -105 -48 -168 -48c-62.9004 0 -125.8 17.0996 -168 48c-22.2998 37 -32 83.7998 -32 132.3c0 48.4004 17.7002 94.7002 40 131.7
|
2104 |
c-46 0 -89.5 12.7002 -126.3 34.7002l-23 80.2002l286.8 -37.3008l48.0996 13.3008l-9.69922 34.1992l-220.4 27.1006l92.5996 26.5996c30.2002 8.7002 42 15.7998 61.4004 33.2002c24.5 23 31.7002 45.5 23.5 73.5996l-10.7002 37.8008
|
2105 |
c-8.7002 30.1992 -25.0996 49.0996 -61.3994 55.1992c-25.1006 3.5 -44.5 2 -79.3008 -8.19922l-221.899 -63.9004c26 108.8 124.2 189.5 241.3 189.5zM38.2998 59.4004c-24 38.3994 -38.2998 83.2998 -38.2998 131.8z" />
|
2106 |
<glyph glyph-name="rocketchat" unicode="" horiz-adv-x="576"
|
2107 |
+
d="M284.046 223.2c0.0341797 0 0.0664062 -0.00195312 0.100586 -0.00195312c18.8496 0 34.1592 -15.2754 34.2168 -34.1113c0 -18.8281 -15.2822 -34.1143 -34.1104 -34.1143s-34.1143 15.2861 -34.1143 34.1143c0 18.7588 15.1748 34.002 33.9072 34.1133zM173.596 223.2
|
2108 |
+
c0.0332031 0 0.0673828 -0.00195312 0.100586 -0.00195312c18.8496 0 34.1592 -15.2754 34.2168 -34.1113c0 -18.8281 -15.2822 -34.1143 -34.1104 -34.1143s-34.1143 15.2861 -34.1143 34.1143c0 18.7588 15.1748 34.002 33.9072 34.1133zM394.519 223.2
|
2109 |
+
c0.0351562 0 0.0683594 -0.00195312 0.102539 -0.00195312c18.8496 0 34.1592 -15.2754 34.2148 -34.1113c0 -18.8281 -15.2822 -34.1143 -34.1104 -34.1143s-34.1133 15.2861 -34.1133 34.1143c0 18.7588 15.1738 34.002 33.9062 34.1133zM548.326 278.519
|
2110 |
+
c17.3076 -26.9443 26.0674 -55.9189 26.0898 -86.9395c0 -30.209 -8.76074 -59.2021 -26.0703 -86.125c-15.5342 -24.1934 -37.3076 -45.5703 -64.6787 -63.6191c-52.8672 -34.8164 -122.354 -53.9746 -195.667 -53.9746
|
2111 |
+
c-0.150391 -0.000976562 0.0664062 -0.00585938 -0.0830078 -0.00585938c-24.5488 0 -48.5908 2.18359 -71.9443 6.36621c-14.8564 -14.2842 -31.3604 -26.5059 -49.5098 -36.5889c-66.7744 -33.3467 -125.6 -20.9092 -155.324 -10.2002
|
2112 |
+
c-5.54492 1.96289 -9.51758 7.25488 -9.51758 13.4697c0 3.82715 1.50879 7.30469 3.96289 9.87109c20.9619 21.6748 55.6416 64.5342 47.1162 103.49c-33.1426 33.9004 -51.1123 74.7764 -51.1123 118.148c0 42.5605 17.9697 83.4365 51.1123 117.337
|
2113 |
+
c8.52148 38.9521 -26.1582 81.7939 -47.1201 103.47c-2.45996 2.56738 -3.97656 6.0498 -3.97656 9.88281c0 6.21973 3.98047 11.5156 9.53125 13.4785c29.7246 10.71 88.5488 23.1211 155.302 -10.2109c18.1504 -10.0811 34.6553 -22.3027 49.5107 -36.5879
|
2114 |
+
c23.3457 4.18066 47.0137 6.35742 71.5547 6.35742c0.15918 0 0.318359 -0.000976562 0.476562 -0.000976562c73.293 0 142.78 -19.1826 195.666 -54c27.3711 -18.0479 49.1465 -39.4453 64.6816 -63.6182zM284.987 38.0996c128.612 0 232.866 67.376 232.866 150.487
|
2115 |
+
c0 83.0957 -104.274 150.469 -232.866 150.469c-128.593 0 -232.847 -67.3691 -232.847 -150.469c0 -36.2002 19.7861 -69.4375 52.7783 -95.4004c9.28809 -29.5986 3.84668 -62.958 -16.3252 -100.078c-0.960938 -1.79297 -1.8584 -3.58496 -2.8418 -5.35645
|
2116 |
+
c18.6367 1.63574 36.5557 6.875 52.5225 14.8701c13.5889 7.65625 25.9609 16.8633 37.1377 27.585l20.1289 19.3926c28.2617 -7.47852 57.8037 -11.501 88.4033 -11.501c0.347656 0 0.695312 0 1.04297 0.000976562z" />
|
2117 |
<glyph glyph-name="rockrms" unicode="" horiz-adv-x="496"
|
2118 |
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM405.4 20.5l-101.5 118.9s73.5996 0.199219 74.1992 0.199219c29.6006 -1.09961 46.6006 33.3008 27.6006 56.1006l-157.7 185.1c-13.2002 17.2998 -40.0996 18.4004 -54.5 0
|
2119 |
l-147.1 -172.5h90l84.2998 98.9004l84.5996 -99.2998h-75.2998c-30.5 0 -44.5 -35.7002 -26.5996 -56.1006l112 -131.3h90z" />
|
3368 |
v-25.7998h16.1006c0.0380859 0.00195312 0.0742188 0.00488281 0.113281 0.00488281c1.04297 0 1.88965 -0.847656 1.88965 -1.89062c0 -0.0380859 -0.000976562 -0.0761719 -0.00292969 -0.114258v-0.800781
|
3369 |
c0.00195312 -0.0380859 0.00488281 -0.0742188 0.00488281 -0.113281c0 -1.04297 -0.847656 -1.88965 -1.89062 -1.88965c-0.0380859 0 -0.0761719 0.000976562 -0.114258 0.00292969h-16.1006v-26.6992h19.4004zM288.301 262.799l2.2998 -6.7998l7.10059 -0.0996094
|
3370 |
l-5.7002 -4.30078l2.09961 -6.7998l-5.7998 4.10059l-5.7998 -4.10059l2.09961 6.7998l-5.69922 4.30078l7.09961 0.0996094z" />
|
|
|
|
|
3371 |
<glyph glyph-name="artstation" unicode="" horiz-adv-x="512"
|
3372 |
d="M2 70.5996h315.1l59.2002 -102.6h-285.399c-0.00488281 0 0.0205078 -0.0498047 0.015625 -0.0498047c-20.0742 0 -37.4736 11.5439 -45.916 28.3496zM501.8 98c19 -29.4004 -0.0996094 -55.9004 -2 -59.0996l-40.7002 -70.5l-257.3 447.6h88.4004
|
3373 |
c0.00390625 0 -0.0234375 0.0527344 -0.0195312 0.0527344c19.6797 0 36.79 -11.0879 45.4189 -27.3525zM275 143.5h-231l115.5 200z" />
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-brands-400.ttf
RENAMED
Binary file
|
fonts/fontawesome/5.15.1/webfonts/fa-brands-400.woff
ADDED
Binary file
|
fonts/fontawesome/5.15.1/webfonts/fa-brands-400.woff2
ADDED
Binary file
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.eot
RENAMED
Binary file
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.svg
RENAMED
@@ -1,16 +1,12 @@
|
|
1 |
<?xml version="1.0" standalone="no"?>
|
2 |
-
<!--
|
3 |
-
Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
|
4 |
-
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
5 |
-
-->
|
6 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
7 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
8 |
<metadata>
|
9 |
-
Created by FontForge 20200314 at
|
10 |
By Robert Madole
|
11 |
Copyright (c) Font Awesome
|
12 |
</metadata>
|
13 |
-
|
14 |
<font id="FontAwesome5Free-Regular" horiz-adv-x="512" >
|
15 |
<font-face
|
16 |
font-family="Font Awesome 5 Free Regular"
|
1 |
<?xml version="1.0" standalone="no"?>
|
|
|
|
|
|
|
|
|
2 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
3 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
4 |
<metadata>
|
5 |
+
Created by FontForge 20200314 at Mon Oct 5 09:50:45 2020
|
6 |
By Robert Madole
|
7 |
Copyright (c) Font Awesome
|
8 |
</metadata>
|
9 |
+
<!-- Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
|
10 |
<font id="FontAwesome5Free-Regular" horiz-adv-x="512" >
|
11 |
<font-face
|
12 |
font-family="Font Awesome 5 Free Regular"
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.ttf
RENAMED
Binary file
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-regular-400.woff
RENAMED
Binary file
|
fonts/fontawesome/5.15.1/webfonts/fa-regular-400.woff2
ADDED
Binary file
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-solid-900.eot
RENAMED
Binary file
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-solid-900.svg
RENAMED
@@ -1,16 +1,12 @@
|
|
1 |
<?xml version="1.0" standalone="no"?>
|
2 |
-
<!--
|
3 |
-
Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
|
4 |
-
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
5 |
-
-->
|
6 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
7 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
8 |
<metadata>
|
9 |
-
Created by FontForge 20200314 at
|
10 |
By Robert Madole
|
11 |
Copyright (c) Font Awesome
|
12 |
</metadata>
|
13 |
-
|
14 |
<font id="FontAwesome5Free-Solid" horiz-adv-x="512" >
|
15 |
<font-face
|
16 |
font-family="Font Awesome 5 Free Solid"
|
@@ -311,6 +307,23 @@ s9.55762 21.3301 21.3301 21.3301h16.1602c38.0195 0 57.0498 45.96 30.1699 72.8398
|
|
311 |
c26.8398 -26.8799 72.8398 -7.83008 72.8398 30.1699v16.1602c0 11.7725 9.55762 21.3301 21.3301 21.3301s21.3301 -9.55762 21.3301 -21.3301v-16.1602c0 -38.0195 45.96 -57.0498 72.8398 -30.1699l11.4297 11.4297c3.85742 3.83301 9.17578 6.19531 15.0361 6.19531
|
312 |
c11.7725 0 21.3301 -9.55762 21.3301 -21.3291c0 -5.85938 -2.36621 -11.1689 -6.19629 -15.0254l-11.4297 -11.4404c-26.8799 -26.8398 -7.83008 -72.8398 30.1699 -72.8398h16.1602c11.7725 0 21.3301 -9.55762 21.3301 -21.3301s-9.55762 -21.3301 -21.3301 -21.3301
|
313 |
h-16.1602zM160 256c17.6611 0 32 14.3389 32 32s-14.3389 32 -32 32s-32 -14.3389 -32 -32s14.3389 -32 32 -32zM240 224c8.83105 0 16 7.16895 16 16s-7.16895 16 -16 16s-16 -7.16895 -16 -16s7.16895 -16 16 -16z" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
314 |
<glyph glyph-name="glass-martini" unicode=""
|
315 |
d="M502.05 390.4l-214.05 -214.04v-192.36h56c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-240c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h56v192.36l-214.05 214.04c-21.25 21.2598 -6.2002 57.5996 23.8496 57.5996h444.4
|
316 |
c30.0498 0 45.0996 -36.3398 23.8496 -57.5996z" />
|
1 |
<?xml version="1.0" standalone="no"?>
|
|
|
|
|
|
|
|
|
2 |
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
3 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
4 |
<metadata>
|
5 |
+
Created by FontForge 20200314 at Mon Oct 5 09:50:45 2020
|
6 |
By Robert Madole
|
7 |
Copyright (c) Font Awesome
|
8 |
</metadata>
|
9 |
+
<!-- Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
|
10 |
<font id="FontAwesome5Free-Solid" horiz-adv-x="512" >
|
11 |
<font-face
|
12 |
font-family="Font Awesome 5 Free Solid"
|
307 |
c26.8398 -26.8799 72.8398 -7.83008 72.8398 30.1699v16.1602c0 11.7725 9.55762 21.3301 21.3301 21.3301s21.3301 -9.55762 21.3301 -21.3301v-16.1602c0 -38.0195 45.96 -57.0498 72.8398 -30.1699l11.4297 11.4297c3.85742 3.83301 9.17578 6.19531 15.0361 6.19531
|
308 |
c11.7725 0 21.3301 -9.55762 21.3301 -21.3291c0 -5.85938 -2.36621 -11.1689 -6.19629 -15.0254l-11.4297 -11.4404c-26.8799 -26.8398 -7.83008 -72.8398 30.1699 -72.8398h16.1602c11.7725 0 21.3301 -9.55762 21.3301 -21.3301s-9.55762 -21.3301 -21.3301 -21.3301
|
309 |
h-16.1602zM160 256c17.6611 0 32 14.3389 32 32s-14.3389 32 -32 32s-32 -14.3389 -32 -32s14.3389 -32 32 -32zM240 224c8.83105 0 16 7.16895 16 16s-7.16895 16 -16 16s-16 -7.16895 -16 -16s7.16895 -16 16 -16z" />
|
310 |
+
<glyph glyph-name="vest" unicode="" horiz-adv-x="448"
|
311 |
+
d="M437.252 208.123c6.76562 -10.1484 10.748 -22.3994 10.748 -35.5v-204.623c0 -17.6611 -14.3389 -32 -32 -32h-192v224l73.8115 221.438c-21.7695 -12.3281 -47.0635 -19.5205 -73.8115 -19.6729c-26.748 0.150391 -52.042 7.34277 -73.8115 19.6699l56.9463 -170.836
|
312 |
+
l-13.4922 -40.4805c-1.05957 -3.17969 -1.64258 -6.58496 -1.64258 -10.1191v-224h-160c-17.6611 0 -32 14.3389 -32 32v204.623c0 13.1006 3.98242 25.3516 10.748 35.5l53.252 79.877v128c0 17.6611 14.3389 32 32 32h32
|
313 |
+
c4.91211 -0.00195312 9.50586 -1.49512 13.3115 -4.03125l25 -16.6719c16.4814 -11.0186 36.4971 -17.4463 57.793 -17.4463s41.1025 6.42773 57.584 17.4463l25 16.6719c3.80566 2.53613 8.39941 4.0293 13.3115 4.03125h32c17.6611 0 32 -14.3389 32 -32v-128z
|
314 |
+
M131.312 76.6885c2.78125 2.87891 4.48828 6.80078 4.48828 11.1152c0 8.83105 -7.16992 16 -16 16c-4.31445 0 -8.23242 -1.71094 -11.1113 -4.49219l-48 -48c-2.78125 -2.87891 -4.48828 -6.80078 -4.48828 -11.1152c0 -8.83105 7.16992 -16 16 -16
|
315 |
+
c4.31445 0 8.23242 1.71094 11.1113 4.49219zM387.312 28.6885c2.89746 2.89453 4.69043 6.89844 4.69043 11.3135s-1.79297 8.41504 -4.69043 11.3096l-48 48c-2.87891 2.78125 -6.80078 4.48828 -11.1152 4.48828c-8.83105 0 -16 -7.16992 -16 -16
|
316 |
+
c0 -4.31445 1.71094 -8.23242 4.49219 -11.1113l48 -48c2.89453 -2.89746 6.89844 -4.69043 11.3135 -4.69043s8.41504 1.79297 11.3096 4.69043z" />
|
317 |
+
<glyph glyph-name="vest-patches" unicode="" horiz-adv-x="448"
|
318 |
+
d="M437.252 208.123c6.76562 -10.1484 10.748 -22.3994 10.748 -35.5v-204.623c0 -17.6611 -14.3389 -32 -32 -32h-192v224l73.8105 221.434c-21.7705 -12.3252 -47.0635 -19.5156 -73.8105 -19.668c-26.7471 0.154297 -52.041 7.34668 -73.8115 19.6738l56.9463 -170.84
|
319 |
+
l-13.4922 -40.4805c-1.05957 -3.17969 -1.64258 -6.58496 -1.64258 -10.1191v-224h-160c-17.6611 0 -32 14.3389 -32 32v204.623c0 13.1006 3.98242 25.3516 10.748 35.5l53.252 79.877v128c0 17.6611 14.3389 32 32 32h32l0.0283203 -0.0146484
|
320 |
+
c4.91113 0 9.47949 -1.47949 13.2832 -4.0166l25 -16.6719c16.4814 -11.0186 36.4971 -17.4463 57.793 -17.4463s41.1025 6.42773 57.584 17.4463l25 16.6719c3.80371 2.53711 8.39551 4.03125 13.3066 4.03125h0.00488281h32c17.6611 0 32 -14.3389 32 -32v-128z
|
321 |
+
M63.5 175.516l15.5156 -15.5156l-15.5156 -15.5156c-2.12402 -2.16699 -3.43066 -5.1377 -3.43066 -8.4082c0 -6.62891 5.38086 -12.0107 12.0098 -12.0107c3.2793 0 6.25293 1.31738 8.4209 3.4502l15.5 15.5l15.5 -15.5
|
322 |
+
c2.16797 -2.13281 5.14551 -3.44629 8.42383 -3.44629c6.62891 0 12.0107 5.38184 12.0107 12.0098c0 3.27051 -1.31055 6.23828 -3.43457 8.40527l-15.5156 15.5156l15.5156 15.5156c2.12402 2.16699 3.43066 5.1377 3.43066 8.4082
|
323 |
+
c0 6.62891 -5.38086 12.0107 -12.0098 12.0107c-3.2793 0 -6.25293 -1.31738 -8.4209 -3.4502l-15.5 -15.5l-15.5 15.5c-2.16797 2.13281 -5.14551 3.44629 -8.42383 3.44629c-6.62891 0 -12.0107 -5.38184 -12.0107 -12.0098c0 -3.27051 1.31055 -6.23828 3.43457 -8.40527
|
324 |
+
zM96 -8c22.0762 0 40 17.9238 40 40s-17.9238 40 -40 40s-40 -17.9238 -40 -40s17.9238 -40 40 -40zM359.227 112.215c13.6875 0.0966797 24.7734 11.2139 24.7734 24.9229c0 0.757812 -0.0341797 1.50684 -0.0996094 2.24707
|
325 |
+
c-1.16406 12.8008 -12.5742 22.1113 -25.4004 22.0762l-5.05078 -0.0371094l0.0371094 5.05762c0.0722656 12.7998 -9.26758 24.2568 -22.0566 25.4189c-0.742188 0.0664062 -1.46973 0.0947266 -2.22949 0.0947266c-13.7012 0 -24.8418 -11.0527 -24.9854 -24.7207
|
326 |
+
l-0.214844 -48.5742c0 -0.00976562 -0.000976562 -0.0195312 -0.000976562 -0.0292969c0 -3.68164 2.98926 -6.6709 6.6709 -6.6709h0.0302734z" />
|
327 |
<glyph glyph-name="glass-martini" unicode=""
|
328 |
d="M502.05 390.4l-214.05 -214.04v-192.36h56c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-240c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h56v192.36l-214.05 214.04c-21.25 21.2598 -6.2002 57.5996 23.8496 57.5996h444.4
|
329 |
c30.0498 0 45.0996 -36.3398 23.8496 -57.5996z" />
|
fonts/fontawesome/{5.14.0 → 5.15.1}/webfonts/fa-solid-900.ttf
RENAMED
Binary file
|
fonts/fontawesome/5.15.1/webfonts/fa-solid-900.woff
ADDED
Binary file
|
fonts/fontawesome/5.15.1/webfonts/fa-solid-900.woff2
ADDED
Binary file
|
includes/admin-settings-license.php
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
<div id="fl-license-form" class="fl-settings-form">
|
2 |
+
<?php do_action( 'fl_themes_license_form' ); ?>
|
3 |
+
</div>
|
includes/compatibility.php
CHANGED
@@ -179,17 +179,20 @@ function fl_theme_builder_has_post_grid() {
|
|
179 |
$layout_ids = array();
|
180 |
|
181 |
// Checks themer layout
|
182 |
-
|
183 |
-
|
|
|
184 |
}
|
185 |
-
|
186 |
-
|
|
|
187 |
}
|
188 |
-
|
189 |
-
|
|
|
190 |
}
|
191 |
-
|
192 |
-
|
193 |
$layout_ids = array_merge( $layout_ids, $parts );
|
194 |
}
|
195 |
|
179 |
$layout_ids = array();
|
180 |
|
181 |
// Checks themer layout
|
182 |
+
$header = FLThemeBuilderLayoutData::get_current_page_layout_ids( 'header' );
|
183 |
+
if ( ! empty( $header ) ) {
|
184 |
+
$layout_ids[] = $header[0];
|
185 |
}
|
186 |
+
$single = FLThemeBuilderLayoutData::get_current_page_layout_ids( 'singular' );
|
187 |
+
if ( ! empty( $single ) ) {
|
188 |
+
$layout_ids[] = $single[0];
|
189 |
}
|
190 |
+
$footer = FLThemeBuilderLayoutData::get_current_page_layout_ids( 'footer' );
|
191 |
+
if ( ! empty( $footer ) ) {
|
192 |
+
$layout_ids[] = $footer[0];
|
193 |
}
|
194 |
+
$parts = FLThemeBuilderLayoutData::get_current_page_layout_ids( 'part' );
|
195 |
+
if ( ! empty( $parts ) ) {
|
196 |
$layout_ids = array_merge( $layout_ids, $parts );
|
197 |
}
|
198 |
|
includes/ui-field-photo.php
CHANGED
@@ -18,7 +18,7 @@ var photo = null;
|
|
18 |
if ( FLBuilderSettingsConfig.attachments[ data.value ] ) {
|
19 |
photo = FLBuilderSettingsConfig.attachments[ data.value ];
|
20 |
photo.isAttachment = true;
|
21 |
-
} else if ( typeof data.value !== 'undefined' ) {
|
22 |
if ( data.settings[ data.rootName + '_src' ] ) {
|
23 |
photo = {
|
24 |
id: data.value,
|
18 |
if ( FLBuilderSettingsConfig.attachments[ data.value ] ) {
|
19 |
photo = FLBuilderSettingsConfig.attachments[ data.value ];
|
20 |
photo.isAttachment = true;
|
21 |
+
} else if ( typeof data.value !== 'undefined' && '' !== data.value && false !== data.value ) {
|
22 |
if ( data.settings[ data.rootName + '_src' ] ) {
|
23 |
photo = {
|
24 |
id: data.value,
|
includes/ui-js-config.php
CHANGED
@@ -72,6 +72,10 @@ echo 'FLBuilderConfig = ' . FLBuilderUtils::json_encode( apply_filt
|
|
72 |
'video' => 'video',
|
73 |
) ),
|
74 |
'themerLayoutsUrl' => admin_url( '/edit.php?post_type=fl-theme-layout' ),
|
|
|
|
|
|
|
|
|
75 |
) ) ) . ';';
|
76 |
|
77 |
/**
|
@@ -100,6 +104,7 @@ echo 'FLBuilderStrings = ' . FLBuilderUtils::json_encode( apply_filt
|
|
100 |
'codeerrorhtml' => esc_attr__( 'You cannot add <script> or <iframe> tag here.', 'fl-builder' ),
|
101 |
'codeErrorFix' => esc_attr__( 'Fix Errors', 'fl-builder' ),
|
102 |
'codeErrorIgnore' => esc_attr__( 'Save With Errors', 'fl-builder' ),
|
|
|
103 |
'column' => esc_attr__( 'Column', 'fl-builder' ),
|
104 |
'contentSliderSelectLayout' => esc_attr__( 'Please select either a background layout or content layout before submitting.', 'fl-builder' ),
|
105 |
'contentSliderTransitionWarn' => esc_attr__( 'Transition value should be lower than Delay value.', 'fl-builder' ),
|
@@ -224,6 +229,14 @@ echo 'FLBuilderStrings = ' . FLBuilderUtils::json_encode( apply_filt
|
|
224 |
'widgetsCategoryTitle' => esc_attr__( 'WordPress Widgets', 'fl-builder' ),
|
225 |
'uncategorized' => esc_attr__( 'Uncategorized', 'fl-builder' ),
|
226 |
'yesPlease' => esc_attr__( 'Yes Please!', 'fl-builder' ),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
227 |
'savedStatus' => array(
|
228 |
'saving' => esc_attr__( 'Saving...', 'fl-builder' ),
|
229 |
'savingTooltip' => esc_attr__( 'The layout is currently being saved', 'fl-builder' ),
|
@@ -238,7 +251,6 @@ echo 'FLBuilderStrings = ' . FLBuilderUtils::json_encode( apply_filt
|
|
238 |
'publishingTooltip' => esc_attr__( 'Changes being published', 'fl-builder' ),
|
239 |
'nothingToSave' => esc_attr__( 'No new changes to save', 'fl-builder' ),
|
240 |
'hasAlreadySaved' => esc_attr__( 'Your changes are saved', 'fl-builder' ),
|
241 |
-
|
242 |
),
|
243 |
'typeLabels' => array(
|
244 |
'template' => esc_attr__( 'Template', 'fl-builder' ),
|
72 |
'video' => 'video',
|
73 |
) ),
|
74 |
'themerLayoutsUrl' => admin_url( '/edit.php?post_type=fl-theme-layout' ),
|
75 |
+
'userCaps' => array(
|
76 |
+
'unfiltered_html' => current_user_can( 'unfiltered_html' ),
|
77 |
+
'global_unfiltered_html' => defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ? true : false,
|
78 |
+
),
|
79 |
) ) ) . ';';
|
80 |
|
81 |
/**
|
104 |
'codeerrorhtml' => esc_attr__( 'You cannot add <script> or <iframe> tag here.', 'fl-builder' ),
|
105 |
'codeErrorFix' => esc_attr__( 'Fix Errors', 'fl-builder' ),
|
106 |
'codeErrorIgnore' => esc_attr__( 'Save With Errors', 'fl-builder' ),
|
107 |
+
'codeErrorDetected' => esc_html__( 'We detected a possible issue here:', 'fl-builder' ),
|
108 |
'column' => esc_attr__( 'Column', 'fl-builder' ),
|
109 |
'contentSliderSelectLayout' => esc_attr__( 'Please select either a background layout or content layout before submitting.', 'fl-builder' ),
|
110 |
'contentSliderTransitionWarn' => esc_attr__( 'Transition value should be lower than Delay value.', 'fl-builder' ),
|
229 |
'widgetsCategoryTitle' => esc_attr__( 'WordPress Widgets', 'fl-builder' ),
|
230 |
'uncategorized' => esc_attr__( 'Uncategorized', 'fl-builder' ),
|
231 |
'yesPlease' => esc_attr__( 'Yes Please!', 'fl-builder' ),
|
232 |
+
'noScriptWarn' => array(
|
233 |
+
'heading' => esc_attr__( 'Settings could not be saved.', 'fl-builder' ),
|
234 |
+
// translators: %s : User Role
|
235 |
+
'message' => sprintf( esc_attr__( 'These settings contain sensitive code that is not allowed for your user role (%s).', 'fl-builder' ), FLBuilderUtils::get_current_user_role() ),
|
236 |
+
'global' => esc_attr__( 'These settings contain sensitive code that is not allowed as DISALLOW_UNFILTERED_HTML has been set globally via wp-config.', 'fl-builder' ),
|
237 |
+
// translators: %s : Link to Docs
|
238 |
+
'footer' => sprintf( esc_attr__( 'See [%s] for more information.', 'fl-builder' ), '<a target="_blank" href="https://docs.wpbeaverbuilder.com/beaver-builder/troubleshooting/common-issues/error-settings-not-saved">link</a>' ),
|
239 |
+
),
|
240 |
'savedStatus' => array(
|
241 |
'saving' => esc_attr__( 'Saving...', 'fl-builder' ),
|
242 |
'savingTooltip' => esc_attr__( 'The layout is currently being saved', 'fl-builder' ),
|
251 |
'publishingTooltip' => esc_attr__( 'Changes being published', 'fl-builder' ),
|
252 |
'nothingToSave' => esc_attr__( 'No new changes to save', 'fl-builder' ),
|
253 |
'hasAlreadySaved' => esc_attr__( 'Your changes are saved', 'fl-builder' ),
|
|
|
254 |
),
|
255 |
'typeLabels' => array(
|
256 |
'template' => esc_attr__( 'Template', 'fl-builder' ),
|
includes/updater-config.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
if ( class_exists( 'FLUpdater' ) ) {
|
4 |
FLUpdater::add_product(array(
|
5 |
'name' => 'Beaver Builder Plugin (Lite Version)',
|
6 |
-
'version' => '2.4.
|
7 |
'slug' => 'bb-plugin',
|
8 |
'type' => 'plugin',
|
9 |
));
|
3 |
if ( class_exists( 'FLUpdater' ) ) {
|
4 |
FLUpdater::add_product(array(
|
5 |
'name' => 'Beaver Builder Plugin (Lite Version)',
|
6 |
+
'version' => '2.4.1.2',
|
7 |
'slug' => 'bb-plugin',
|
8 |
'type' => 'plugin',
|
9 |
));
|
includes/updater/updater.php
CHANGED
@@ -15,3 +15,10 @@ if ( ! class_exists( 'FLUpdater' ) && FL_BUILDER_LITE !== true ) {
|
|
15 |
/* Initialize the updater. */
|
16 |
FLUpdater::init();
|
17 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
/* Initialize the updater. */
|
16 |
FLUpdater::init();
|
17 |
}
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Show dummy license tab with links to docs/upgrade etc.
|
21 |
+
*/
|
22 |
+
if ( FL_BUILDER_LITE === true ) {
|
23 |
+
add_action( 'fl_themes_license_form', 'FLBuilderAdmin::render_form_lite' );
|
24 |
+
}
|
includes/vendor/mailchimp/mailchimp.php
CHANGED
@@ -497,7 +497,8 @@ class FLBuilderMailChimp
|
|
497 |
)
|
498 |
);
|
499 |
|
500 |
-
if ( $results[ 'total_items' ] > 0 ) {
|
|
|
501 |
foreach ( $results[ 'categories' ] as $category ) {
|
502 |
$subgroups = $this->get(
|
503 |
'lists/' . $list_id . '/interest-categories/' . $category[ 'id' ] . '/interests',
|
497 |
)
|
498 |
);
|
499 |
|
500 |
+
// if ( $results[ 'total_items' ] > 0 ) {
|
501 |
+
if ( !empty( $results[ 'total_items' ] ) && $results[ 'total_items' ] > 0 ) {
|
502 |
foreach ( $results[ 'categories' ] as $category ) {
|
503 |
$subgroups = $this->get(
|
504 |
'lists/' . $list_id . '/interest-categories/' . $category[ 'id' ] . '/interests',
|
includes/vendor/mailjet/autoload.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload.php @generated by Composer
|
4 |
+
|
5 |
+
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
+
|
7 |
+
return ComposerAutoloaderInitdfadddb69c8eb151aaa04d306b6f98d2::getLoader();
|
includes/vendor/mailjet/composer/ClassLoader.php
ADDED
@@ -0,0 +1,445 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Composer.
|
5 |
+
*
|
6 |
+
* (c) Nils Adermann <naderman@naderman.de>
|
7 |
+
* Jordi Boggiano <j.boggiano@seld.be>
|
8 |
+
*
|
9 |
+
* For the full copyright and license information, please view the LICENSE
|
10 |
+
* file that was distributed with this source code.
|
11 |
+
*/
|
12 |
+
|
13 |
+
namespace Composer\Autoload;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
17 |
+
*
|
18 |
+
* $loader = new \Composer\Autoload\ClassLoader();
|
19 |
+
*
|
20 |
+
* // register classes with namespaces
|
21 |
+
* $loader->add('Symfony\Component', __DIR__.'/component');
|
22 |
+
* $loader->add('Symfony', __DIR__.'/framework');
|
23 |
+
*
|
24 |
+
* // activate the autoloader
|
25 |
+
* $loader->register();
|
26 |
+
*
|
27 |
+
* // to enable searching the include path (eg. for PEAR packages)
|
28 |
+
* $loader->setUseIncludePath(true);
|
29 |
+
*
|
30 |
+
* In this example, if you try to use a class in the Symfony\Component
|
31 |
+
* namespace or one of its children (Symfony\Component\Console for instance),
|
32 |
+
* the autoloader will first look for the class under the component/
|
33 |
+
* directory, and it will then fallback to the framework/ directory if not
|
34 |
+
* found before giving up.
|
35 |
+
*
|
36 |
+
* This class is loosely based on the Symfony UniversalClassLoader.
|
37 |
+
*
|
38 |
+
* @author Fabien Potencier <fabien@symfony.com>
|
39 |
+
* @author Jordi Boggiano <j.boggiano@seld.be>
|
40 |
+
* @see http://www.php-fig.org/psr/psr-0/
|
41 |
+
* @see http://www.php-fig.org/psr/psr-4/
|
42 |
+
*/
|
43 |
+
class ClassLoader
|
44 |
+
{
|
45 |
+
// PSR-4
|
46 |
+
private $prefixLengthsPsr4 = array();
|
47 |
+
private $prefixDirsPsr4 = array();
|
48 |
+
private $fallbackDirsPsr4 = array();
|
49 |
+
|
50 |
+
// PSR-0
|
51 |
+
private $prefixesPsr0 = array();
|
52 |
+
private $fallbackDirsPsr0 = array();
|
53 |
+
|
54 |
+
private $useIncludePath = false;
|
55 |
+
private $classMap = array();
|
56 |
+
private $classMapAuthoritative = false;
|
57 |
+
private $missingClasses = array();
|
58 |
+
private $apcuPrefix;
|
59 |
+
|
60 |
+
public function getPrefixes()
|
61 |
+
{
|
62 |
+
if (!empty($this->prefixesPsr0)) {
|
63 |
+
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
64 |
+
}
|
65 |
+
|
66 |
+
return array();
|
67 |
+
}
|
68 |
+
|
69 |
+
public function getPrefixesPsr4()
|
70 |
+
{
|
71 |
+
return $this->prefixDirsPsr4;
|
72 |
+
}
|
73 |
+
|
74 |
+
public function getFallbackDirs()
|
75 |
+
{
|
76 |
+
return $this->fallbackDirsPsr0;
|
77 |
+
}
|
78 |
+
|
79 |
+
public function getFallbackDirsPsr4()
|
80 |
+
{
|
81 |
+
return $this->fallbackDirsPsr4;
|
82 |
+
}
|
83 |
+
|
84 |
+
public function getClassMap()
|
85 |
+
{
|
86 |
+
return $this->classMap;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* @param array $classMap Class to filename map
|
91 |
+
*/
|
92 |
+
public function addClassMap(array $classMap)
|
93 |
+
{
|
94 |
+
if ($this->classMap) {
|
95 |
+
$this->classMap = array_merge($this->classMap, $classMap);
|
96 |
+
} else {
|
97 |
+
$this->classMap = $classMap;
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Registers a set of PSR-0 directories for a given prefix, either
|
103 |
+
* appending or prepending to the ones previously set for this prefix.
|
104 |
+
*
|
105 |
+
* @param string $prefix The prefix
|
106 |
+
* @param array|string $paths The PSR-0 root directories
|
107 |
+
* @param bool $prepend Whether to prepend the directories
|
108 |
+
*/
|
109 |
+
public function add($prefix, $paths, $prepend = false)
|
110 |
+
{
|
111 |
+
if (!$prefix) {
|
112 |
+
if ($prepend) {
|
113 |
+
$this->fallbackDirsPsr0 = array_merge(
|
114 |
+
(array) $paths,
|
115 |
+
$this->fallbackDirsPsr0
|
116 |
+
);
|
117 |
+
} else {
|
118 |
+
$this->fallbackDirsPsr0 = array_merge(
|
119 |
+
$this->fallbackDirsPsr0,
|
120 |
+
(array) $paths
|
121 |
+
);
|
122 |
+
}
|
123 |
+
|
124 |
+
return;
|
125 |
+
}
|
126 |
+
|
127 |
+
$first = $prefix[0];
|
128 |
+
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
129 |
+
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
130 |
+
|
131 |
+
return;
|
132 |
+
}
|
133 |
+
if ($prepend) {
|
134 |
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
135 |
+
(array) $paths,
|
136 |
+
$this->prefixesPsr0[$first][$prefix]
|
137 |
+
);
|
138 |
+
} else {
|
139 |
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
140 |
+
$this->prefixesPsr0[$first][$prefix],
|
141 |
+
(array) $paths
|
142 |
+
);
|
143 |
+
}
|
144 |
+
}
|
145 |
+
|
146 |
+
/**
|
147 |
+
* Registers a set of PSR-4 directories for a given namespace, either
|
148 |
+
* appending or prepending to the ones previously set for this namespace.
|
149 |
+
*
|
150 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
151 |
+
* @param array|string $paths The PSR-4 base directories
|
152 |
+
* @param bool $prepend Whether to prepend the directories
|
153 |
+
*
|
154 |
+
* @throws \InvalidArgumentException
|
155 |
+
*/
|
156 |
+
public function addPsr4($prefix, $paths, $prepend = false)
|
157 |
+
{
|
158 |
+
if (!$prefix) {
|
159 |
+
// Register directories for the root namespace.
|
160 |
+
if ($prepend) {
|
161 |
+
$this->fallbackDirsPsr4 = array_merge(
|
162 |
+
(array) $paths,
|
163 |
+
$this->fallbackDirsPsr4
|
164 |
+
);
|
165 |
+
} else {
|
166 |
+
$this->fallbackDirsPsr4 = array_merge(
|
167 |
+
$this->fallbackDirsPsr4,
|
168 |
+
(array) $paths
|
169 |
+
);
|
170 |
+
}
|
171 |
+
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
172 |
+
// Register directories for a new namespace.
|
173 |
+
$length = strlen($prefix);
|
174 |
+
if ('\\' !== $prefix[$length - 1]) {
|
175 |
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
176 |
+
}
|
177 |
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
178 |
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
179 |
+
} elseif ($prepend) {
|
180 |
+
// Prepend directories for an already registered namespace.
|
181 |
+
$this->prefixDirsPsr4[$prefix] = array_merge(
|
182 |
+
(array) $paths,
|
183 |
+
$this->prefixDirsPsr4[$prefix]
|
184 |
+
);
|
185 |
+
} else {
|
186 |
+
// Append directories for an already registered namespace.
|
187 |
+
$this->prefixDirsPsr4[$prefix] = array_merge(
|
188 |
+
$this->prefixDirsPsr4[$prefix],
|
189 |
+
(array) $paths
|
190 |
+
);
|
191 |
+
}
|
192 |
+
}
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Registers a set of PSR-0 directories for a given prefix,
|
196 |
+
* replacing any others previously set for this prefix.
|
197 |
+
*
|
198 |
+
* @param string $prefix The prefix
|
199 |
+
* @param array|string $paths The PSR-0 base directories
|
200 |
+
*/
|
201 |
+
public function set($prefix, $paths)
|
202 |
+
{
|
203 |
+
if (!$prefix) {
|
204 |
+
$this->fallbackDirsPsr0 = (array) $paths;
|
205 |
+
} else {
|
206 |
+
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
207 |
+
}
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* Registers a set of PSR-4 directories for a given namespace,
|
212 |
+
* replacing any others previously set for this namespace.
|
213 |
+
*
|
214 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
215 |
+
* @param array|string $paths The PSR-4 base directories
|
216 |
+
*
|
217 |
+
* @throws \InvalidArgumentException
|
218 |
+
*/
|
219 |
+
public function setPsr4($prefix, $paths)
|
220 |
+
{
|
221 |
+
if (!$prefix) {
|
222 |
+
$this->fallbackDirsPsr4 = (array) $paths;
|
223 |
+
} else {
|
224 |
+
$length = strlen($prefix);
|
225 |
+
if ('\\' !== $prefix[$length - 1]) {
|
226 |
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
227 |
+
}
|
228 |
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
229 |
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
230 |
+
}
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Turns on searching the include path for class files.
|
235 |
+
*
|
236 |
+
* @param bool $useIncludePath
|
237 |
+
*/
|
238 |
+
public function setUseIncludePath($useIncludePath)
|
239 |
+
{
|
240 |
+
$this->useIncludePath = $useIncludePath;
|
241 |
+
}
|
242 |
+
|
243 |
+
/**
|
244 |
+
* Can be used to check if the autoloader uses the include path to check
|
245 |
+
* for classes.
|
246 |
+
*
|
247 |
+
* @return bool
|
248 |
+
*/
|
249 |
+
public function getUseIncludePath()
|
250 |
+
{
|
251 |
+
return $this->useIncludePath;
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Turns off searching the prefix and fallback directories for classes
|
256 |
+
* that have not been registered with the class map.
|
257 |
+
*
|
258 |
+
* @param bool $classMapAuthoritative
|
259 |
+
*/
|
260 |
+
public function setClassMapAuthoritative($classMapAuthoritative)
|
261 |
+
{
|
262 |
+
$this->classMapAuthoritative = $classMapAuthoritative;
|
263 |
+
}
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Should class lookup fail if not found in the current class map?
|
267 |
+
*
|
268 |
+
* @return bool
|
269 |
+
*/
|
270 |
+
public function isClassMapAuthoritative()
|
271 |
+
{
|
272 |
+
return $this->classMapAuthoritative;
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
277 |
+
*
|
278 |
+
* @param string|null $apcuPrefix
|
279 |
+
*/
|
280 |
+
public function setApcuPrefix($apcuPrefix)
|
281 |
+
{
|
282 |
+
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
283 |
+
}
|
284 |
+
|
285 |
+
/**
|
286 |
+
* The APCu prefix in use, or null if APCu caching is not enabled.
|
287 |
+
*
|
288 |
+
* @return string|null
|
289 |
+
*/
|
290 |
+
public function getApcuPrefix()
|
291 |
+
{
|
292 |
+
return $this->apcuPrefix;
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Registers this instance as an autoloader.
|
297 |
+
*
|
298 |
+
* @param bool $prepend Whether to prepend the autoloader or not
|
299 |
+
*/
|
300 |
+
public function register($prepend = false)
|
301 |
+
{
|
302 |
+
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
303 |
+
}
|
304 |
+
|
305 |
+
/**
|
306 |
+
* Unregisters this instance as an autoloader.
|
307 |
+
*/
|
308 |
+
public function unregister()
|
309 |
+
{
|
310 |
+
spl_autoload_unregister(array($this, 'loadClass'));
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Loads the given class or interface.
|
315 |
+
*
|
316 |
+
* @param string $class The name of the class
|
317 |
+
* @return bool|null True if loaded, null otherwise
|
318 |
+
*/
|
319 |
+
public function loadClass($class)
|
320 |
+
{
|
321 |
+
if ($file = $this->findFile($class)) {
|
322 |
+
includeFile($file);
|
323 |
+
|
324 |
+
return true;
|
325 |
+
}
|
326 |
+
}
|
327 |
+
|
328 |
+
/**
|
329 |
+
* Finds the path to the file where the class is defined.
|
330 |
+
*
|
331 |
+
* @param string $class The name of the class
|
332 |
+
*
|
333 |
+
* @return string|false The path if found, false otherwise
|
334 |
+
*/
|
335 |
+
public function findFile($class)
|
336 |
+
{
|
337 |
+
// class map lookup
|
338 |
+
if (isset($this->classMap[$class])) {
|
339 |
+
return $this->classMap[$class];
|
340 |
+
}
|
341 |
+
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
342 |
+
return false;
|
343 |
+
}
|
344 |
+
if (null !== $this->apcuPrefix) {
|
345 |
+
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
346 |
+
if ($hit) {
|
347 |
+
return $file;
|
348 |
+
}
|
349 |
+
}
|
350 |
+
|
351 |
+
$file = $this->findFileWithExtension($class, '.php');
|
352 |
+
|
353 |
+
// Search for Hack files if we are running on HHVM
|
354 |
+
if (false === $file && defined('HHVM_VERSION')) {
|
355 |
+
$file = $this->findFileWithExtension($class, '.hh');
|
356 |
+
}
|
357 |
+
|
358 |
+
if (null !== $this->apcuPrefix) {
|
359 |
+
apcu_add($this->apcuPrefix.$class, $file);
|
360 |
+
}
|
361 |
+
|
362 |
+
if (false === $file) {
|
363 |
+
// Remember that this class does not exist.
|
364 |
+
$this->missingClasses[$class] = true;
|
365 |
+
}
|
366 |
+
|
367 |
+
return $file;
|
368 |
+
}
|
369 |
+
|
370 |
+
private function findFileWithExtension($class, $ext)
|
371 |
+
{
|
372 |
+
// PSR-4 lookup
|
373 |
+
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
374 |
+
|
375 |
+
$first = $class[0];
|
376 |
+
if (isset($this->prefixLengthsPsr4[$first])) {
|
377 |
+
$subPath = $class;
|
378 |
+
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
379 |
+
$subPath = substr($subPath, 0, $lastPos);
|
380 |
+
$search = $subPath . '\\';
|
381 |
+
if (isset($this->prefixDirsPsr4[$search])) {
|
382 |
+
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
383 |
+
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
384 |
+
if (file_exists($file = $dir . $pathEnd)) {
|
385 |
+
return $file;
|
386 |
+
}
|
387 |
+
}
|
388 |
+
}
|
389 |
+
}
|
390 |
+
}
|
391 |
+
|
392 |
+
// PSR-4 fallback dirs
|
393 |
+
foreach ($this->fallbackDirsPsr4 as $dir) {
|
394 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
395 |
+
return $file;
|
396 |
+
}
|
397 |
+
}
|
398 |
+
|
399 |
+
// PSR-0 lookup
|
400 |
+
if (false !== $pos = strrpos($class, '\\')) {
|
401 |
+
// namespaced class name
|
402 |
+
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
403 |
+
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
404 |
+
} else {
|
405 |
+
// PEAR-like class name
|
406 |
+
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
407 |
+
}
|
408 |
+
|
409 |
+
if (isset($this->prefixesPsr0[$first])) {
|
410 |
+
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
411 |
+
if (0 === strpos($class, $prefix)) {
|
412 |
+
foreach ($dirs as $dir) {
|
413 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
414 |
+
return $file;
|
415 |
+
}
|
416 |
+
}
|
417 |
+
}
|
418 |
+
}
|
419 |
+
}
|
420 |
+
|
421 |
+
// PSR-0 fallback dirs
|
422 |
+
foreach ($this->fallbackDirsPsr0 as $dir) {
|
423 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
424 |
+
return $file;
|
425 |
+
}
|
426 |
+
}
|
427 |
+
|
428 |
+
// PSR-0 include paths.
|
429 |
+
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
430 |
+
return $file;
|
431 |
+
}
|
432 |
+
|
433 |
+
return false;
|
434 |
+
}
|
435 |
+
}
|
436 |
+
|
437 |
+
/**
|
438 |
+
* Scope isolated include.
|
439 |
+
*
|
440 |
+
* Prevents access to $this/self from included files.
|
441 |
+
*/
|
442 |
+
function includeFile($file)
|
443 |
+
{
|
444 |
+
include $file;
|
445 |
+
}
|
includes/vendor/mailjet/composer/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
Copyright (c) Nils Adermann, Jordi Boggiano
|
3 |
+
|
4 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5 |
+
of this software and associated documentation files (the "Software"), to deal
|
6 |
+
in the Software without restriction, including without limitation the rights
|
7 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8 |
+
copies of the Software, and to permit persons to whom the Software is furnished
|
9 |
+
to do so, subject to the following conditions:
|
10 |
+
|
11 |
+
The above copyright notice and this permission notice shall be included in all
|
12 |
+
copies or substantial portions of the Software.
|
13 |
+
|
14 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20 |
+
THE SOFTWARE.
|
21 |
+
|
includes/vendor/mailjet/composer/autoload_classmap.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_classmap.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
);
|
includes/vendor/mailjet/composer/autoload_files.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_files.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
|
10 |
+
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
11 |
+
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
12 |
+
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
|
13 |
+
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
|
14 |
+
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
|
15 |
+
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
16 |
+
);
|
includes/vendor/mailjet/composer/autoload_namespaces.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_namespaces.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
'Mailjet' => array($vendorDir . '/mailjet/mailjet-apiv3-php/src'),
|
10 |
+
);
|
includes/vendor/mailjet/composer/autoload_psr4.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_psr4.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
|
10 |
+
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
|
11 |
+
'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
|
12 |
+
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
|
13 |
+
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
|
14 |
+
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
|
15 |
+
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
|
16 |
+
);
|
includes/vendor/mailjet/composer/autoload_real.php
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_real.php @generated by Composer
|
4 |
+
|
5 |
+
class ComposerAutoloaderInitdfadddb69c8eb151aaa04d306b6f98d2
|
6 |
+
{
|
7 |
+
private static $loader;
|
8 |
+
|
9 |
+
public static function loadClassLoader($class)
|
10 |
+
{
|
11 |
+
if ('Composer\Autoload\ClassLoader' === $class) {
|
12 |
+
require __DIR__ . '/ClassLoader.php';
|
13 |
+
}
|
14 |
+
}
|
15 |
+
|
16 |
+
public static function getLoader()
|
17 |
+
{
|
18 |
+
if (null !== self::$loader) {
|
19 |
+
return self::$loader;
|
20 |
+
}
|
21 |
+
|
22 |
+
spl_autoload_register(array('ComposerAutoloaderInitdfadddb69c8eb151aaa04d306b6f98d2', 'loadClassLoader'), true, true);
|
23 |
+
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
+
spl_autoload_unregister(array('ComposerAutoloaderInitdfadddb69c8eb151aaa04d306b6f98d2', 'loadClassLoader'));
|
25 |
+
|
26 |
+
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
+
if ($useStaticLoader) {
|
28 |
+
require_once __DIR__ . '/autoload_static.php';
|
29 |
+
|
30 |
+
call_user_func(\Composer\Autoload\ComposerStaticInitdfadddb69c8eb151aaa04d306b6f98d2::getInitializer($loader));
|
31 |
+
} else {
|
32 |
+
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
+
foreach ($map as $namespace => $path) {
|
34 |
+
$loader->set($namespace, $path);
|
35 |
+
}
|
36 |
+
|
37 |
+
$map = require __DIR__ . '/autoload_psr4.php';
|
38 |
+
foreach ($map as $namespace => $path) {
|
39 |
+
$loader->setPsr4($namespace, $path);
|
40 |
+
}
|
41 |
+
|
42 |
+
$classMap = require __DIR__ . '/autoload_classmap.php';
|
43 |
+
if ($classMap) {
|
44 |
+
$loader->addClassMap($classMap);
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
$loader->register(true);
|
49 |
+
|
50 |
+
if ($useStaticLoader) {
|
51 |
+
$includeFiles = Composer\Autoload\ComposerStaticInitdfadddb69c8eb151aaa04d306b6f98d2::$files;
|
52 |
+
} else {
|
53 |
+
$includeFiles = require __DIR__ . '/autoload_files.php';
|
54 |
+
}
|
55 |
+
foreach ($includeFiles as $fileIdentifier => $file) {
|
56 |
+
composerRequiredfadddb69c8eb151aaa04d306b6f98d2($fileIdentifier, $file);
|
57 |
+
}
|
58 |
+
|
59 |
+
return $loader;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
|
63 |
+
function composerRequiredfadddb69c8eb151aaa04d306b6f98d2($fileIdentifier, $file)
|
64 |
+
{
|
65 |
+
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
66 |
+
require $file;
|
67 |
+
|
68 |
+
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
69 |
+
}
|
70 |
+
}
|
includes/vendor/mailjet/composer/autoload_static.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_static.php @generated by Composer
|
4 |
+
|
5 |
+
namespace Composer\Autoload;
|
6 |
+
|
7 |
+
class ComposerStaticInitdfadddb69c8eb151aaa04d306b6f98d2
|
8 |
+
{
|
9 |
+
public static $files = array (
|
10 |
+
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
11 |
+
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
12 |
+
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
|
13 |
+
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
|
14 |
+
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
|
15 |
+
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
|
16 |
+
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
17 |
+
);
|
18 |
+
|
19 |
+
public static $prefixLengthsPsr4 = array (
|
20 |
+
'S' =>
|
21 |
+
array (
|
22 |
+
'Symfony\\Polyfill\\Php72\\' => 23,
|
23 |
+
'Symfony\\Polyfill\\Mbstring\\' => 26,
|
24 |
+
'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
|
25 |
+
),
|
26 |
+
'P' =>
|
27 |
+
array (
|
28 |
+
'Psr\\Http\\Message\\' => 17,
|
29 |
+
),
|
30 |
+
'G' =>
|
31 |
+
array (
|
32 |
+
'GuzzleHttp\\Psr7\\' => 16,
|
33 |
+
'GuzzleHttp\\Promise\\' => 19,
|
34 |
+
'GuzzleHttp\\' => 11,
|
35 |
+
),
|
36 |
+
);
|
37 |
+
|
38 |
+
public static $prefixDirsPsr4 = array (
|
39 |
+
'Symfony\\Polyfill\\Php72\\' =>
|
40 |
+
array (
|
41 |
+
0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
|
42 |
+
),
|
43 |
+
'Symfony\\Polyfill\\Mbstring\\' =>
|
44 |
+
array (
|
45 |
+
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
|
46 |
+
),
|
47 |
+
'Symfony\\Polyfill\\Intl\\Idn\\' =>
|
48 |
+
array (
|
49 |
+
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn',
|
50 |
+
),
|
51 |
+
'Psr\\Http\\Message\\' =>
|
52 |
+
array (
|
53 |
+
0 => __DIR__ . '/..' . '/psr/http-message/src',
|
54 |
+
),
|
55 |
+
'GuzzleHttp\\Psr7\\' =>
|
56 |
+
array (
|
57 |
+
0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
|
58 |
+
),
|
59 |
+
'GuzzleHttp\\Promise\\' =>
|
60 |
+
array (
|
61 |
+
0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
|
62 |
+
),
|
63 |
+
'GuzzleHttp\\' =>
|
64 |
+
array (
|
65 |
+
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
|
66 |
+
),
|
67 |
+
);
|
68 |
+
|
69 |
+
public static $prefixesPsr0 = array (
|
70 |
+
'M' =>
|
71 |
+
array (
|
72 |
+
'Mailjet' =>
|
73 |
+
array (
|
74 |
+
0 => __DIR__ . '/..' . '/mailjet/mailjet-apiv3-php/src',
|
75 |
+
),
|
76 |
+
),
|
77 |
+
);
|
78 |
+
|
79 |
+
public static function getInitializer(ClassLoader $loader)
|
80 |
+
{
|
81 |
+
return \Closure::bind(function () use ($loader) {
|
82 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInitdfadddb69c8eb151aaa04d306b6f98d2::$prefixLengthsPsr4;
|
83 |
+
$loader->prefixDirsPsr4 = ComposerStaticInitdfadddb69c8eb151aaa04d306b6f98d2::$prefixDirsPsr4;
|
84 |
+
$loader->prefixesPsr0 = ComposerStaticInitdfadddb69c8eb151aaa04d306b6f98d2::$prefixesPsr0;
|
85 |
+
|
86 |
+
}, null, ClassLoader::class);
|
87 |
+
}
|
88 |
+
}
|
includes/vendor/mailjet/composer/installed.json
ADDED
@@ -0,0 +1,525 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[
|
2 |
+
{
|
3 |
+
"name": "guzzlehttp/guzzle",
|
4 |
+
"version": "6.5.3",
|
5 |
+
"version_normalized": "6.5.3.0",
|
6 |
+
"source": {
|
7 |
+
"type": "git",
|
8 |
+
"url": "https://github.com/guzzle/guzzle.git",
|
9 |
+
"reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e"
|
10 |
+
},
|
11 |
+
"dist": {
|
12 |
+
"type": "zip",
|
13 |
+
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/aab4ebd862aa7d04f01a4b51849d657db56d882e",
|
14 |
+
"reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e",
|
15 |
+
"shasum": ""
|
16 |
+
},
|
17 |
+
"require": {
|
18 |
+
"ext-json": "*",
|
19 |
+
"guzzlehttp/promises": "^1.0",
|
20 |
+
"guzzlehttp/psr7": "^1.6.1",
|
21 |
+
"php": ">=5.5",
|
22 |
+
"symfony/polyfill-intl-idn": "^1.11"
|
23 |
+
},
|
24 |
+
"require-dev": {
|
25 |
+
"ext-curl": "*",
|
26 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
27 |
+
"psr/log": "^1.1"
|
28 |
+
},
|
29 |
+
"suggest": {
|
30 |
+
"psr/log": "Required for using the Log middleware"
|
31 |
+
},
|
32 |
+
"time": "2020-04-18T10:38:46+00:00",
|
33 |
+
"type": "library",
|
34 |
+
"extra": {
|
35 |
+
"branch-alias": {
|
36 |
+
"dev-master": "6.5-dev"
|
37 |
+
}
|
38 |
+
},
|
39 |
+
"installation-source": "dist",
|
40 |
+
"autoload": {
|
41 |
+
"psr-4": {
|
42 |
+
"GuzzleHttp\\": "src/"
|
43 |
+
},
|
44 |
+
"files": [
|
45 |
+
"src/functions_include.php"
|
46 |
+
]
|
47 |
+
},
|
48 |
+
"notification-url": "https://packagist.org/downloads/",
|
49 |
+
"license": [
|
50 |
+
"MIT"
|
51 |
+
],
|
52 |
+
"authors": [
|
53 |
+
{
|
54 |
+
"name": "Michael Dowling",
|
55 |
+
"email": "mtdowling@gmail.com",
|
56 |
+
"homepage": "https://github.com/mtdowling"
|
57 |
+
}
|
58 |
+
],
|
59 |
+
"description": "Guzzle is a PHP HTTP client library",
|
60 |
+
"homepage": "http://guzzlephp.org/",
|
61 |
+
"keywords": [
|
62 |
+
"client",
|
63 |
+
"curl",
|
64 |
+
"framework",
|
65 |
+
"http",
|
66 |
+
"http client",
|
67 |
+
"rest",
|
68 |
+
"web service"
|
69 |
+
]
|
70 |
+
},
|
71 |
+
{
|
72 |
+
"name": "guzzlehttp/promises",
|
73 |
+
"version": "v1.3.1",
|
74 |
+
"version_normalized": "1.3.1.0",
|
75 |
+
"source": {
|
76 |
+
"type": "git",
|
77 |
+
"url": "https://github.com/guzzle/promises.git",
|
78 |
+
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
|
79 |
+
},
|
80 |
+
"dist": {
|
81 |
+
"type": "zip",
|
82 |
+
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
83 |
+
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
84 |
+
"shasum": ""
|
85 |
+
},
|
86 |
+
"require": {
|
87 |
+
"php": ">=5.5.0"
|
88 |
+
},
|
89 |
+
"require-dev": {
|
90 |
+
"phpunit/phpunit": "^4.0"
|
91 |
+
},
|
92 |
+
"time": "2016-12-20T10:07:11+00:00",
|
93 |
+
"type": "library",
|
94 |
+
"extra": {
|
95 |
+
"branch-alias": {
|
96 |
+
"dev-master": "1.4-dev"
|
97 |
+
}
|
98 |
+
},
|
99 |
+
"installation-source": "dist",
|
100 |
+
"autoload": {
|
101 |
+
"psr-4": {
|
102 |
+
"GuzzleHttp\\Promise\\": "src/"
|
103 |
+
},
|
104 |
+
"files": [
|
105 |
+
"src/functions_include.php"
|
106 |
+
]
|
107 |
+
},
|
108 |
+
"notification-url": "https://packagist.org/downloads/",
|
109 |
+
"license": [
|
110 |
+
"MIT"
|
111 |
+
],
|
112 |
+
"authors": [
|
113 |
+
{
|
114 |
+
"name": "Michael Dowling",
|
115 |
+
"email": "mtdowling@gmail.com",
|
116 |
+
"homepage": "https://github.com/mtdowling"
|
117 |
+
}
|
118 |
+
],
|
119 |
+
"description": "Guzzle promises library",
|
120 |
+
"keywords": [
|
121 |
+
"promise"
|
122 |
+
]
|
123 |
+
},
|
124 |
+
{
|
125 |
+
"name": "guzzlehttp/psr7",
|
126 |
+
"version": "1.6.1",
|
127 |
+
"version_normalized": "1.6.1.0",
|
128 |
+
"source": {
|
129 |
+
"type": "git",
|
130 |
+
"url": "https://github.com/guzzle/psr7.git",
|
131 |
+
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
|
132 |
+
},
|
133 |
+
"dist": {
|
134 |
+
"type": "zip",
|
135 |
+
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
|
136 |
+
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
|
137 |
+
"shasum": ""
|
138 |
+
},
|
139 |
+
"require": {
|
140 |
+
"php": ">=5.4.0",
|
141 |
+
"psr/http-message": "~1.0",
|
142 |
+
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
|
143 |
+
},
|
144 |
+
"provide": {
|
145 |
+
"psr/http-message-implementation": "1.0"
|
146 |
+
},
|
147 |
+
"require-dev": {
|
148 |
+
"ext-zlib": "*",
|
149 |
+
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
|
150 |
+
},
|
151 |
+
"suggest": {
|
152 |
+
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
|
153 |
+
},
|
154 |
+
"time": "2019-07-01T23:21:34+00:00",
|
155 |
+
"type": "library",
|
156 |
+
"extra": {
|
157 |
+
"branch-alias": {
|
158 |
+
"dev-master": "1.6-dev"
|
159 |
+
}
|
160 |
+
},
|
161 |
+
"installation-source": "dist",
|
162 |
+
"autoload": {
|
163 |
+
"psr-4": {
|
164 |
+
"GuzzleHttp\\Psr7\\": "src/"
|
165 |
+
},
|
166 |
+
"files": [
|
167 |
+
"src/functions_include.php"
|
168 |
+
]
|
169 |
+
},
|
170 |
+
"notification-url": "https://packagist.org/downloads/",
|
171 |
+
"license": [
|
172 |
+
"MIT"
|
173 |
+
],
|
174 |
+
"authors": [
|
175 |
+
{
|
176 |
+
"name": "Michael Dowling",
|
177 |
+
"email": "mtdowling@gmail.com",
|
178 |
+
"homepage": "https://github.com/mtdowling"
|
179 |
+
},
|
180 |
+
{
|
181 |
+
"name": "Tobias Schultze",
|
182 |
+
"homepage": "https://github.com/Tobion"
|
183 |
+
}
|
184 |
+
],
|
185 |
+
"description": "PSR-7 message implementation that also provides common utility methods",
|
186 |
+
"keywords": [
|
187 |
+
"http",
|
188 |
+
"message",
|
189 |
+
"psr-7",
|
190 |
+
"request",
|
191 |
+
"response",
|
192 |
+
"stream",
|
193 |
+
"uri",
|
194 |
+
"url"
|
195 |
+
]
|
196 |
+
},
|
197 |
+
{
|
198 |
+
"name": "mailjet/mailjet-apiv3-php",
|
199 |
+
"version": "v1.4.1",
|
200 |
+
"version_normalized": "1.4.1.0",
|
201 |
+
"source": {
|
202 |
+
"type": "git",
|
203 |
+
"url": "https://github.com/mailjet/mailjet-apiv3-php.git",
|
204 |
+
"reference": "9d89b9a424a9631bff8e499cbbe34058481e8102"
|
205 |
+
},
|
206 |
+
"dist": {
|
207 |
+
"type": "zip",
|
208 |
+
"url": "https://api.github.com/repos/mailjet/mailjet-apiv3-php/zipball/9d89b9a424a9631bff8e499cbbe34058481e8102",
|
209 |
+
"reference": "9d89b9a424a9631bff8e499cbbe34058481e8102",
|
210 |
+
"shasum": ""
|
211 |
+
},
|
212 |
+
"require": {
|
213 |
+
"guzzlehttp/guzzle": "~6.0|~5.3",
|
214 |
+
"php": ">=5.4.0"
|
215 |
+
},
|
216 |
+
"require-dev": {
|
217 |
+
"php-coveralls/php-coveralls": "^1.0",
|
218 |
+
"phpunit/phpunit": "^4.8"
|
219 |
+
},
|
220 |
+
"time": "2018-10-31T13:24:45+00:00",
|
221 |
+
"type": "library",
|
222 |
+
"installation-source": "dist",
|
223 |
+
"autoload": {
|
224 |
+
"psr-0": {
|
225 |
+
"Mailjet": "src/"
|
226 |
+
}
|
227 |
+
},
|
228 |
+
"notification-url": "https://packagist.org/downloads/",
|
229 |
+
"license": [
|
230 |
+
"MIT"
|
231 |
+
],
|
232 |
+
"authors": [
|
233 |
+
{
|
234 |
+
"name": "Mailjet",
|
235 |
+
"email": "dev@mailjet.com",
|
236 |
+
"homepage": "https://dev.mailjet.com"
|
237 |
+
}
|
238 |
+
],
|
239 |
+
"description": "PHP wrapper for the Mailjet API",
|
240 |
+
"homepage": "https://github.com/mailjet/mailjet-apiv3-php/",
|
241 |
+
"keywords": [
|
242 |
+
"Mailjet",
|
243 |
+
"api",
|
244 |
+
"email",
|
245 |
+
"php",
|
246 |
+
"v3"
|
247 |
+
]
|
248 |
+
},
|
249 |
+
{
|
250 |
+
"name": "psr/http-message",
|
251 |
+
"version": "1.0.1",
|
252 |
+
"version_normalized": "1.0.1.0",
|
253 |
+
"source": {
|
254 |
+
"type": "git",
|
255 |
+
"url": "https://github.com/php-fig/http-message.git",
|
256 |
+
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
257 |
+
},
|
258 |
+
"dist": {
|
259 |
+
"type": "zip",
|
260 |
+
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
261 |
+
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
262 |
+
"shasum": ""
|
263 |
+
},
|
264 |
+
"require": {
|
265 |
+
"php": ">=5.3.0"
|
266 |
+
},
|
267 |
+
"time": "2016-08-06T14:39:51+00:00",
|
268 |
+
"type": "library",
|
269 |
+
"extra": {
|
270 |
+
"branch-alias": {
|
271 |
+
"dev-master": "1.0.x-dev"
|
272 |
+
}
|
273 |
+
},
|
274 |
+
"installation-source": "dist",
|
275 |
+
"autoload": {
|
276 |
+
"psr-4": {
|
277 |
+
"Psr\\Http\\Message\\": "src/"
|
278 |
+
}
|
279 |
+
},
|
280 |
+
"notification-url": "https://packagist.org/downloads/",
|
281 |
+
"license": [
|
282 |
+
"MIT"
|
283 |
+
],
|
284 |
+
"authors": [
|
285 |
+
{
|
286 |
+
"name": "PHP-FIG",
|
287 |
+
"homepage": "http://www.php-fig.org/"
|
288 |
+
}
|
289 |
+
],
|
290 |
+
"description": "Common interface for HTTP messages",
|
291 |
+
"homepage": "https://github.com/php-fig/http-message",
|
292 |
+
"keywords": [
|
293 |
+
"http",
|
294 |
+
"http-message",
|
295 |
+
"psr",
|
296 |
+
"psr-7",
|
297 |
+
"request",
|
298 |
+
"response"
|
299 |
+
]
|
300 |
+
},
|
301 |
+
{
|
302 |
+
"name": "ralouphie/getallheaders",
|
303 |
+
"version": "3.0.3",
|
304 |
+
"version_normalized": "3.0.3.0",
|
305 |
+
"source": {
|
306 |
+
"type": "git",
|
307 |
+
"url": "https://github.com/ralouphie/getallheaders.git",
|
308 |
+
"reference": "120b605dfeb996808c31b6477290a714d356e822"
|
309 |
+
},
|
310 |
+
"dist": {
|
311 |
+
"type": "zip",
|
312 |
+
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
|
313 |
+
"reference": "120b605dfeb996808c31b6477290a714d356e822",
|
314 |
+
"shasum": ""
|
315 |
+
},
|
316 |
+
"require": {
|
317 |
+
"php": ">=5.6"
|
318 |
+
},
|
319 |
+
"require-dev": {
|
320 |
+
"php-coveralls/php-coveralls": "^2.1",
|
321 |
+
"phpunit/phpunit": "^5 || ^6.5"
|
322 |
+
},
|
323 |
+
"time": "2019-03-08T08:55:37+00:00",
|
324 |
+
"type": "library",
|
325 |
+
"installation-source": "dist",
|
326 |
+
"autoload": {
|
327 |
+
"files": [
|
328 |
+
"src/getallheaders.php"
|
329 |
+
]
|
330 |
+
},
|
331 |
+
"notification-url": "https://packagist.org/downloads/",
|
332 |
+
"license": [
|
333 |
+
"MIT"
|
334 |
+
],
|
335 |
+
"authors": [
|
336 |
+
{
|
337 |
+
"name": "Ralph Khattar",
|
338 |
+
"email": "ralph.khattar@gmail.com"
|
339 |
+
}
|
340 |
+
],
|
341 |
+
"description": "A polyfill for getallheaders."
|
342 |
+
},
|
343 |
+
{
|
344 |
+
"name": "symfony/polyfill-intl-idn",
|
345 |
+
"version": "v1.17.0",
|
346 |
+
"version_normalized": "1.17.0.0",
|
347 |
+
"source": {
|
348 |
+
"type": "git",
|
349 |
+
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
350 |
+
"reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a"
|
351 |
+
},
|
352 |
+
"dist": {
|
353 |
+
"type": "zip",
|
354 |
+
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a",
|
355 |
+
"reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a",
|
356 |
+
"shasum": ""
|
357 |
+
},
|
358 |
+
"require": {
|
359 |
+
"php": ">=5.3.3",
|
360 |
+
"symfony/polyfill-mbstring": "^1.3",
|
361 |
+
"symfony/polyfill-php72": "^1.10"
|
362 |
+
},
|
363 |
+
"suggest": {
|
364 |
+
"ext-intl": "For best performance"
|
365 |
+
},
|
366 |
+
"time": "2020-05-12T16:47:27+00:00",
|
367 |
+
"type": "library",
|
368 |
+
"extra": {
|
369 |
+
"branch-alias": {
|
370 |
+
"dev-master": "1.17-dev"
|
371 |
+
}
|
372 |
+
},
|
373 |
+
"installation-source": "dist",
|
374 |
+
"autoload": {
|
375 |
+
"psr-4": {
|
376 |
+
"Symfony\\Polyfill\\Intl\\Idn\\": ""
|
377 |
+
},
|
378 |
+
"files": [
|
379 |
+
"bootstrap.php"
|
380 |
+
]
|
381 |
+
},
|
382 |
+
"notification-url": "https://packagist.org/downloads/",
|
383 |
+
"license": [
|
384 |
+
"MIT"
|
385 |
+
],
|
386 |
+
"authors": [
|
387 |
+
{
|
388 |
+
"name": "Laurent Bassin",
|
389 |
+
"email": "laurent@bassin.info"
|
390 |
+
},
|
391 |
+
{
|
392 |
+
"name": "Symfony Community",
|
393 |
+
"homepage": "https://symfony.com/contributors"
|
394 |
+
}
|
395 |
+
],
|
396 |
+
"description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
|
397 |
+
"homepage": "https://symfony.com",
|
398 |
+
"keywords": [
|
399 |
+
"compatibility",
|
400 |
+
"idn",
|
401 |
+
"intl",
|
402 |
+
"polyfill",
|
403 |
+
"portable",
|
404 |
+
"shim"
|
405 |
+
]
|
406 |
+
},
|
407 |
+
{
|
408 |
+
"name": "symfony/polyfill-mbstring",
|
409 |
+
"version": "v1.17.0",
|
410 |
+
"version_normalized": "1.17.0.0",
|
411 |
+
"source": {
|
412 |
+
"type": "git",
|
413 |
+
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
414 |
+
"reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
|
415 |
+
},
|
416 |
+
"dist": {
|
417 |
+
"type": "zip",
|
418 |
+
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
|
419 |
+
"reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
|
420 |
+
"shasum": ""
|
421 |
+
},
|
422 |
+
"require": {
|
423 |
+
"php": ">=5.3.3"
|
424 |
+
},
|
425 |
+
"suggest": {
|
426 |
+
"ext-mbstring": "For best performance"
|
427 |
+
},
|
428 |
+
"time": "2020-05-12T16:47:27+00:00",
|
429 |
+
"type": "library",
|
430 |
+
"extra": {
|
431 |
+
"branch-alias": {
|
432 |
+
"dev-master": "1.17-dev"
|
433 |
+
}
|
434 |
+
},
|
435 |
+
"installation-source": "dist",
|
436 |
+
"autoload": {
|
437 |
+
"psr-4": {
|
438 |
+
"Symfony\\Polyfill\\Mbstring\\": ""
|
439 |
+
},
|
440 |
+
"files": [
|
441 |
+
"bootstrap.php"
|
442 |
+
]
|
443 |
+
},
|
444 |
+
"notification-url": "https://packagist.org/downloads/",
|
445 |
+
"license": [
|
446 |
+
"MIT"
|
447 |
+
],
|
448 |
+
"authors": [
|
449 |
+
{
|
450 |
+
"name": "Nicolas Grekas",
|
451 |
+
"email": "p@tchwork.com"
|
452 |
+
},
|
453 |
+
{
|
454 |
+
"name": "Symfony Community",
|
455 |
+
"homepage": "https://symfony.com/contributors"
|
456 |
+
}
|
457 |
+
],
|
458 |
+
"description": "Symfony polyfill for the Mbstring extension",
|
459 |
+
"homepage": "https://symfony.com",
|
460 |
+
"keywords": [
|
461 |
+
"compatibility",
|
462 |
+
"mbstring",
|
463 |
+
"polyfill",
|
464 |
+
"portable",
|
465 |
+
"shim"
|
466 |
+
]
|
467 |
+
},
|
468 |
+
{
|
469 |
+
"name": "symfony/polyfill-php72",
|
470 |
+
"version": "v1.17.0",
|
471 |
+
"version_normalized": "1.17.0.0",
|
472 |
+
"source": {
|
473 |
+
"type": "git",
|
474 |
+
"url": "https://github.com/symfony/polyfill-php72.git",
|
475 |
+
"reference": "f048e612a3905f34931127360bdd2def19a5e582"
|
476 |
+
},
|
477 |
+
"dist": {
|
478 |
+
"type": "zip",
|
479 |
+
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582",
|
480 |
+
"reference": "f048e612a3905f34931127360bdd2def19a5e582",
|
481 |
+
"shasum": ""
|
482 |
+
},
|
483 |
+
"require": {
|
484 |
+
"php": ">=5.3.3"
|
485 |
+
},
|
486 |
+
"time": "2020-05-12T16:47:27+00:00",
|
487 |
+
"type": "library",
|
488 |
+
"extra": {
|
489 |
+
"branch-alias": {
|
490 |
+
"dev-master": "1.17-dev"
|
491 |
+
}
|
492 |
+
},
|
493 |
+
"installation-source": "dist",
|
494 |
+
"autoload": {
|
495 |
+
"psr-4": {
|
496 |
+
"Symfony\\Polyfill\\Php72\\": ""
|
497 |
+
},
|
498 |
+
"files": [
|
499 |
+
"bootstrap.php"
|
500 |
+
]
|
501 |
+
},
|
502 |
+
"notification-url": "https://packagist.org/downloads/",
|
503 |
+
"license": [
|
504 |
+
"MIT"
|
505 |
+
],
|
506 |
+
"authors": [
|
507 |
+
{
|
508 |
+
"name": "Nicolas Grekas",
|
509 |
+
"email": "p@tchwork.com"
|
510 |
+
},
|
511 |
+
{
|
512 |
+
"name": "Symfony Community",
|
513 |
+
"homepage": "https://symfony.com/contributors"
|
514 |
+
}
|
515 |
+
],
|
516 |
+
"description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
|
517 |
+
"homepage": "https://symfony.com",
|
518 |
+
"keywords": [
|
519 |
+
"compatibility",
|
520 |
+
"polyfill",
|
521 |
+
"portable",
|
522 |
+
"shim"
|
523 |
+
]
|
524 |
+
}
|
525 |
+
]
|
includes/vendor/mailjet/guzzlehttp/guzzle/.php_cs
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$config = PhpCsFixer\Config::create()
|
4 |
+
->setRiskyAllowed(true)
|
5 |
+
->setRules([
|
6 |
+
'@PSR2' => true,
|
7 |
+
'array_syntax' => ['syntax' => 'short'],
|
8 |
+
'declare_strict_types' => false,
|
9 |
+
'concat_space' => ['spacing'=>'one'],
|
10 |
+
'php_unit_test_case_static_method_calls' => ['call_type' => 'self'],
|
11 |
+
'ordered_imports' => true,
|
12 |
+
// 'phpdoc_align' => ['align'=>'vertical'],
|
13 |
+
// 'native_function_invocation' => true,
|
14 |
+
])
|
15 |
+
->setFinder(
|
16 |
+
PhpCsFixer\Finder::create()
|
17 |
+
->in(__DIR__.'/src')
|
18 |
+
->in(__DIR__.'/tests')
|
19 |
+
->name('*.php')
|
20 |
+
)
|
21 |
+
;
|
22 |
+
|
23 |
+
return $config;
|
includes/vendor/mailjet/guzzlehttp/guzzle/CHANGELOG.md
ADDED
@@ -0,0 +1,1327 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Change Log
|
2 |
+
|
3 |
+
## 6.5.3 - 2020-04-18
|
4 |
+
|
5 |
+
* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550)
|
6 |
+
* Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548)
|
7 |
+
|
8 |
+
## 6.5.2 - 2019-12-23
|
9 |
+
|
10 |
+
* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489)
|
11 |
+
|
12 |
+
## 6.5.1 - 2019-12-21
|
13 |
+
|
14 |
+
* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454)
|
15 |
+
* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424)
|
16 |
+
|
17 |
+
## 6.5.0 - 2019-12-07
|
18 |
+
|
19 |
+
* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143)
|
20 |
+
* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287)
|
21 |
+
* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132)
|
22 |
+
* Fix: `RetryMiddleware` did not do exponential delay between retires due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132)
|
23 |
+
* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348)
|
24 |
+
* Deprecated `ClientInterface::VERSION`
|
25 |
+
|
26 |
+
## 6.4.1 - 2019-10-23
|
27 |
+
|
28 |
+
* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that
|
29 |
+
* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`
|
30 |
+
|
31 |
+
## 6.4.0 - 2019-10-23
|
32 |
+
|
33 |
+
* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)
|
34 |
+
* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081)
|
35 |
+
* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161)
|
36 |
+
* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163)
|
37 |
+
* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242)
|
38 |
+
* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284)
|
39 |
+
* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273)
|
40 |
+
* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)
|
41 |
+
* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)
|
42 |
+
|
43 |
+
## 6.3.3 - 2018-04-22
|
44 |
+
|
45 |
+
* Fix: Default headers when decode_content is specified
|
46 |
+
|
47 |
+
|
48 |
+
## 6.3.2 - 2018-03-26
|
49 |
+
|
50 |
+
* Fix: Release process
|
51 |
+
|
52 |
+
|
53 |
+
## 6.3.1 - 2018-03-26
|
54 |
+
|
55 |
+
* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014)
|
56 |
+
* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012)
|
57 |
+
* Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999)
|
58 |
+
* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998)
|
59 |
+
* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953)
|
60 |
+
* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915)
|
61 |
+
* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916)
|
62 |
+
|
63 |
+
+ Minor code cleanups, documentation fixes and clarifications.
|
64 |
+
|
65 |
+
|
66 |
+
## 6.3.0 - 2017-06-22
|
67 |
+
|
68 |
+
* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659)
|
69 |
+
* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621)
|
70 |
+
* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580)
|
71 |
+
* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609)
|
72 |
+
* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641)
|
73 |
+
* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611)
|
74 |
+
* Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811)
|
75 |
+
* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642)
|
76 |
+
* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569)
|
77 |
+
* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711)
|
78 |
+
* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745)
|
79 |
+
* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721)
|
80 |
+
* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318)
|
81 |
+
* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)
|
82 |
+
* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)
|
83 |
+
|
84 |
+
|
85 |
+
+ Minor code cleanups, documentation fixes and clarifications.
|
86 |
+
|
87 |
+
## 6.2.3 - 2017-02-28
|
88 |
+
|
89 |
+
* Fix deprecations with guzzle/psr7 version 1.4
|
90 |
+
|
91 |
+
## 6.2.2 - 2016-10-08
|
92 |
+
|
93 |
+
* Allow to pass nullable Response to delay callable
|
94 |
+
* Only add scheme when host is present
|
95 |
+
* Fix drain case where content-length is the literal string zero
|
96 |
+
* Obfuscate in-URL credentials in exceptions
|
97 |
+
|
98 |
+
## 6.2.1 - 2016-07-18
|
99 |
+
|
100 |
+
* Address HTTP_PROXY security vulnerability, CVE-2016-5385:
|
101 |
+
https://httpoxy.org/
|
102 |
+
* Fixing timeout bug with StreamHandler:
|
103 |
+
https://github.com/guzzle/guzzle/pull/1488
|
104 |
+
* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when
|
105 |
+
a server does not honor `Connection: close`.
|
106 |
+
* Ignore URI fragment when sending requests.
|
107 |
+
|
108 |
+
## 6.2.0 - 2016-03-21
|
109 |
+
|
110 |
+
* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`.
|
111 |
+
https://github.com/guzzle/guzzle/pull/1389
|
112 |
+
* Bug fix: Fix sleep calculation when waiting for delayed requests.
|
113 |
+
https://github.com/guzzle/guzzle/pull/1324
|
114 |
+
* Feature: More flexible history containers.
|
115 |
+
https://github.com/guzzle/guzzle/pull/1373
|
116 |
+
* Bug fix: defer sink stream opening in StreamHandler.
|
117 |
+
https://github.com/guzzle/guzzle/pull/1377
|
118 |
+
* Bug fix: do not attempt to escape cookie values.
|
119 |
+
https://github.com/guzzle/guzzle/pull/1406
|
120 |
+
* Feature: report original content encoding and length on decoded responses.
|
121 |
+
https://github.com/guzzle/guzzle/pull/1409
|
122 |
+
* Bug fix: rewind seekable request bodies before dispatching to cURL.
|
123 |
+
https://github.com/guzzle/guzzle/pull/1422
|
124 |
+
* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.
|
125 |
+
https://github.com/guzzle/guzzle/pull/1367
|
126 |
+
|
127 |
+
## 6.1.1 - 2015-11-22
|
128 |
+
|
129 |
+
* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler
|
130 |
+
https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4
|
131 |
+
* Feature: HandlerStack is now more generic.
|
132 |
+
https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e
|
133 |
+
* Bug fix: setting verify to false in the StreamHandler now disables peer
|
134 |
+
verification. https://github.com/guzzle/guzzle/issues/1256
|
135 |
+
* Feature: Middleware now uses an exception factory, including more error
|
136 |
+
context. https://github.com/guzzle/guzzle/pull/1282
|
137 |
+
* Feature: better support for disabled functions.
|
138 |
+
https://github.com/guzzle/guzzle/pull/1287
|
139 |
+
* Bug fix: fixed regression where MockHandler was not using `sink`.
|
140 |
+
https://github.com/guzzle/guzzle/pull/1292
|
141 |
+
|
142 |
+
## 6.1.0 - 2015-09-08
|
143 |
+
|
144 |
+
* Feature: Added the `on_stats` request option to provide access to transfer
|
145 |
+
statistics for requests. https://github.com/guzzle/guzzle/pull/1202
|
146 |
+
* Feature: Added the ability to persist session cookies in CookieJars.
|
147 |
+
https://github.com/guzzle/guzzle/pull/1195
|
148 |
+
* Feature: Some compatibility updates for Google APP Engine
|
149 |
+
https://github.com/guzzle/guzzle/pull/1216
|
150 |
+
* Feature: Added support for NO_PROXY to prevent the use of a proxy based on
|
151 |
+
a simple set of rules. https://github.com/guzzle/guzzle/pull/1197
|
152 |
+
* Feature: Cookies can now contain square brackets.
|
153 |
+
https://github.com/guzzle/guzzle/pull/1237
|
154 |
+
* Bug fix: Now correctly parsing `=` inside of quotes in Cookies.
|
155 |
+
https://github.com/guzzle/guzzle/pull/1232
|
156 |
+
* Bug fix: Cusotm cURL options now correctly override curl options of the
|
157 |
+
same name. https://github.com/guzzle/guzzle/pull/1221
|
158 |
+
* Bug fix: Content-Type header is now added when using an explicitly provided
|
159 |
+
multipart body. https://github.com/guzzle/guzzle/pull/1218
|
160 |
+
* Bug fix: Now ignoring Set-Cookie headers that have no name.
|
161 |
+
* Bug fix: Reason phrase is no longer cast to an int in some cases in the
|
162 |
+
cURL handler. https://github.com/guzzle/guzzle/pull/1187
|
163 |
+
* Bug fix: Remove the Authorization header when redirecting if the Host
|
164 |
+
header changes. https://github.com/guzzle/guzzle/pull/1207
|
165 |
+
* Bug fix: Cookie path matching fixes
|
166 |
+
https://github.com/guzzle/guzzle/issues/1129
|
167 |
+
* Bug fix: Fixing the cURL `body_as_string` setting
|
168 |
+
https://github.com/guzzle/guzzle/pull/1201
|
169 |
+
* Bug fix: quotes are no longer stripped when parsing cookies.
|
170 |
+
https://github.com/guzzle/guzzle/issues/1172
|
171 |
+
* Bug fix: `form_params` and `query` now always uses the `&` separator.
|
172 |
+
https://github.com/guzzle/guzzle/pull/1163
|
173 |
+
* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.
|
174 |
+
https://github.com/guzzle/guzzle/pull/1189
|
175 |
+
|
176 |
+
## 6.0.2 - 2015-07-04
|
177 |
+
|
178 |
+
* Fixed a memory leak in the curl handlers in which references to callbacks
|
179 |
+
were not being removed by `curl_reset`.
|
180 |
+
* Cookies are now extracted properly before redirects.
|
181 |
+
* Cookies now allow more character ranges.
|
182 |
+
* Decoded Content-Encoding responses are now modified to correctly reflect
|
183 |
+
their state if the encoding was automatically removed by a handler. This
|
184 |
+
means that the `Content-Encoding` header may be removed an the
|
185 |
+
`Content-Length` modified to reflect the message size after removing the
|
186 |
+
encoding.
|
187 |
+
* Added a more explicit error message when trying to use `form_params` and
|
188 |
+
`multipart` in the same request.
|
189 |
+
* Several fixes for HHVM support.
|
190 |
+
* Functions are now conditionally required using an additional level of
|
191 |
+
indirection to help with global Composer installations.
|
192 |
+
|
193 |
+
## 6.0.1 - 2015-05-27
|
194 |
+
|
195 |
+
* Fixed a bug with serializing the `query` request option where the `&`
|
196 |
+
separator was missing.
|
197 |
+
* Added a better error message for when `body` is provided as an array. Please
|
198 |
+
use `form_params` or `multipart` instead.
|
199 |
+
* Various doc fixes.
|
200 |
+
|
201 |
+
## 6.0.0 - 2015-05-26
|
202 |
+
|
203 |
+
* See the UPGRADING.md document for more information.
|
204 |
+
* Added `multipart` and `form_params` request options.
|
205 |
+
* Added `synchronous` request option.
|
206 |
+
* Added the `on_headers` request option.
|
207 |
+
* Fixed `expect` handling.
|
208 |
+
* No longer adding default middlewares in the client ctor. These need to be
|
209 |
+
present on the provided handler in order to work.
|
210 |
+
* Requests are no longer initiated when sending async requests with the
|
211 |
+
CurlMultiHandler. This prevents unexpected recursion from requests completing
|
212 |
+
while ticking the cURL loop.
|
213 |
+
* Removed the semantics of setting `default` to `true`. This is no longer
|
214 |
+
required now that the cURL loop is not ticked for async requests.
|
215 |
+
* Added request and response logging middleware.
|
216 |
+
* No longer allowing self signed certificates when using the StreamHandler.
|
217 |
+
* Ensuring that `sink` is valid if saving to a file.
|
218 |
+
* Request exceptions now include a "handler context" which provides handler
|
219 |
+
specific contextual information.
|
220 |
+
* Added `GuzzleHttp\RequestOptions` to allow request options to be applied
|
221 |
+
using constants.
|
222 |
+
* `$maxHandles` has been removed from CurlMultiHandler.
|
223 |
+
* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.
|
224 |
+
|
225 |
+
## 5.3.0 - 2015-05-19
|
226 |
+
|
227 |
+
* Mock now supports `save_to`
|
228 |
+
* Marked `AbstractRequestEvent::getTransaction()` as public.
|
229 |
+
* Fixed a bug in which multiple headers using different casing would overwrite
|
230 |
+
previous headers in the associative array.
|
231 |
+
* Added `Utils::getDefaultHandler()`
|
232 |
+
* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated.
|
233 |
+
* URL scheme is now always lowercased.
|
234 |
+
|
235 |
+
## 6.0.0-beta.1
|
236 |
+
|
237 |
+
* Requires PHP >= 5.5
|
238 |
+
* Updated to use PSR-7
|
239 |
+
* Requires immutable messages, which basically means an event based system
|
240 |
+
owned by a request instance is no longer possible.
|
241 |
+
* Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7).
|
242 |
+
* Removed the dependency on `guzzlehttp/streams`. These stream abstractions
|
243 |
+
are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7`
|
244 |
+
namespace.
|
245 |
+
* Added middleware and handler system
|
246 |
+
* Replaced the Guzzle event and subscriber system with a middleware system.
|
247 |
+
* No longer depends on RingPHP, but rather places the HTTP handlers directly
|
248 |
+
in Guzzle, operating on PSR-7 messages.
|
249 |
+
* Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which
|
250 |
+
means the `guzzlehttp/retry-subscriber` is now obsolete.
|
251 |
+
* Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`.
|
252 |
+
* Asynchronous responses
|
253 |
+
* No longer supports the `future` request option to send an async request.
|
254 |
+
Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`,
|
255 |
+
`getAsync`, etc.).
|
256 |
+
* Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid
|
257 |
+
recursion required by chaining and forwarding react promises. See
|
258 |
+
https://github.com/guzzle/promises
|
259 |
+
* Added `requestAsync` and `sendAsync` to send request asynchronously.
|
260 |
+
* Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests
|
261 |
+
asynchronously.
|
262 |
+
* Request options
|
263 |
+
* POST and form updates
|
264 |
+
* Added the `form_fields` and `form_files` request options.
|
265 |
+
* Removed the `GuzzleHttp\Post` namespace.
|
266 |
+
* The `body` request option no longer accepts an array for POST requests.
|
267 |
+
* The `exceptions` request option has been deprecated in favor of the
|
268 |
+
`http_errors` request options.
|
269 |
+
* The `save_to` request option has been deprecated in favor of `sink` request
|
270 |
+
option.
|
271 |
+
* Clients no longer accept an array of URI template string and variables for
|
272 |
+
URI variables. You will need to expand URI templates before passing them
|
273 |
+
into a client constructor or request method.
|
274 |
+
* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are
|
275 |
+
now magic methods that will send synchronous requests.
|
276 |
+
* Replaced `Utils.php` with plain functions in `functions.php`.
|
277 |
+
* Removed `GuzzleHttp\Collection`.
|
278 |
+
* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as
|
279 |
+
an array.
|
280 |
+
* Removed `GuzzleHttp\Query`. Query string handling is now handled using an
|
281 |
+
associative array passed into the `query` request option. The query string
|
282 |
+
is serialized using PHP's `http_build_query`. If you need more control, you
|
283 |
+
can pass the query string in as a string.
|
284 |
+
* `GuzzleHttp\QueryParser` has been replaced with the
|
285 |
+
`GuzzleHttp\Psr7\parse_query`.
|
286 |
+
|
287 |
+
## 5.2.0 - 2015-01-27
|
288 |
+
|
289 |
+
* Added `AppliesHeadersInterface` to make applying headers to a request based
|
290 |
+
on the body more generic and not specific to `PostBodyInterface`.
|
291 |
+
* Reduced the number of stack frames needed to send requests.
|
292 |
+
* Nested futures are now resolved in the client rather than the RequestFsm
|
293 |
+
* Finishing state transitions is now handled in the RequestFsm rather than the
|
294 |
+
RingBridge.
|
295 |
+
* Added a guard in the Pool class to not use recursion for request retries.
|
296 |
+
|
297 |
+
## 5.1.0 - 2014-12-19
|
298 |
+
|
299 |
+
* Pool class no longer uses recursion when a request is intercepted.
|
300 |
+
* The size of a Pool can now be dynamically adjusted using a callback.
|
301 |
+
See https://github.com/guzzle/guzzle/pull/943.
|
302 |
+
* Setting a request option to `null` when creating a request with a client will
|
303 |
+
ensure that the option is not set. This allows you to overwrite default
|
304 |
+
request options on a per-request basis.
|
305 |
+
See https://github.com/guzzle/guzzle/pull/937.
|
306 |
+
* Added the ability to limit which protocols are allowed for redirects by
|
307 |
+
specifying a `protocols` array in the `allow_redirects` request option.
|
308 |
+
* Nested futures due to retries are now resolved when waiting for synchronous
|
309 |
+
responses. See https://github.com/guzzle/guzzle/pull/947.
|
310 |
+
* `"0"` is now an allowed URI path. See
|
311 |
+
https://github.com/guzzle/guzzle/pull/935.
|
312 |
+
* `Query` no longer typehints on the `$query` argument in the constructor,
|
313 |
+
allowing for strings and arrays.
|
314 |
+
* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle
|
315 |
+
specific exceptions if necessary.
|
316 |
+
|
317 |
+
## 5.0.3 - 2014-11-03
|
318 |
+
|
319 |
+
This change updates query strings so that they are treated as un-encoded values
|
320 |
+
by default where the value represents an un-encoded value to send over the
|
321 |
+
wire. A Query object then encodes the value before sending over the wire. This
|
322 |
+
means that even value query string values (e.g., ":") are url encoded. This
|
323 |
+
makes the Query class match PHP's http_build_query function. However, if you
|
324 |
+
want to send requests over the wire using valid query string characters that do
|
325 |
+
not need to be encoded, then you can provide a string to Url::setQuery() and
|
326 |
+
pass true as the second argument to specify that the query string is a raw
|
327 |
+
string that should not be parsed or encoded (unless a call to getQuery() is
|
328 |
+
subsequently made, forcing the query-string to be converted into a Query
|
329 |
+
object).
|
330 |
+
|
331 |
+
## 5.0.2 - 2014-10-30
|
332 |
+
|
333 |
+
* Added a trailing `\r\n` to multipart/form-data payloads. See
|
334 |
+
https://github.com/guzzle/guzzle/pull/871
|
335 |
+
* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs.
|
336 |
+
* Status codes are now returned as integers. See
|
337 |
+
https://github.com/guzzle/guzzle/issues/881
|
338 |
+
* No longer overwriting an existing `application/x-www-form-urlencoded` header
|
339 |
+
when sending POST requests, allowing for customized headers. See
|
340 |
+
https://github.com/guzzle/guzzle/issues/877
|
341 |
+
* Improved path URL serialization.
|
342 |
+
|
343 |
+
* No longer double percent-encoding characters in the path or query string if
|
344 |
+
they are already encoded.
|
345 |
+
* Now properly encoding the supplied path to a URL object, instead of only
|
346 |
+
encoding ' ' and '?'.
|
347 |
+
* Note: This has been changed in 5.0.3 to now encode query string values by
|
348 |
+
default unless the `rawString` argument is provided when setting the query
|
349 |
+
string on a URL: Now allowing many more characters to be present in the
|
350 |
+
query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A
|
351 |
+
|
352 |
+
## 5.0.1 - 2014-10-16
|
353 |
+
|
354 |
+
Bugfix release.
|
355 |
+
|
356 |
+
* Fixed an issue where connection errors still returned response object in
|
357 |
+
error and end events event though the response is unusable. This has been
|
358 |
+
corrected so that a response is not returned in the `getResponse` method of
|
359 |
+
these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867
|
360 |
+
* Fixed an issue where transfer statistics were not being populated in the
|
361 |
+
RingBridge. https://github.com/guzzle/guzzle/issues/866
|
362 |
+
|
363 |
+
## 5.0.0 - 2014-10-12
|
364 |
+
|
365 |
+
Adding support for non-blocking responses and some minor API cleanup.
|
366 |
+
|
367 |
+
### New Features
|
368 |
+
|
369 |
+
* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`.
|
370 |
+
* Added a public API for creating a default HTTP adapter.
|
371 |
+
* Updated the redirect plugin to be non-blocking so that redirects are sent
|
372 |
+
concurrently. Other plugins like this can now be updated to be non-blocking.
|
373 |
+
* Added a "progress" event so that you can get upload and download progress
|
374 |
+
events.
|
375 |
+
* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers
|
376 |
+
requests concurrently using a capped pool size as efficiently as possible.
|
377 |
+
* Added `hasListeners()` to EmitterInterface.
|
378 |
+
* Removed `GuzzleHttp\ClientInterface::sendAll` and marked
|
379 |
+
`GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the
|
380 |
+
recommended way).
|
381 |
+
|
382 |
+
### Breaking changes
|
383 |
+
|
384 |
+
The breaking changes in this release are relatively minor. The biggest thing to
|
385 |
+
look out for is that request and response objects no longer implement fluent
|
386 |
+
interfaces.
|
387 |
+
|
388 |
+
* Removed the fluent interfaces (i.e., `return $this`) from requests,
|
389 |
+
responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`,
|
390 |
+
`GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and
|
391 |
+
`GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of
|
392 |
+
why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/.
|
393 |
+
This also makes the Guzzle message interfaces compatible with the current
|
394 |
+
PSR-7 message proposal.
|
395 |
+
* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except
|
396 |
+
for the HTTP request functions from function.php, these functions are now
|
397 |
+
implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode`
|
398 |
+
moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to
|
399 |
+
`GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to
|
400 |
+
`GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be
|
401 |
+
`GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php
|
402 |
+
caused problems for many users: they aren't PSR-4 compliant, require an
|
403 |
+
explicit include, and needed an if-guard to ensure that the functions are not
|
404 |
+
declared multiple times.
|
405 |
+
* Rewrote adapter layer.
|
406 |
+
* Removing all classes from `GuzzleHttp\Adapter`, these are now
|
407 |
+
implemented as callables that are stored in `GuzzleHttp\Ring\Client`.
|
408 |
+
* Removed the concept of "parallel adapters". Sending requests serially or
|
409 |
+
concurrently is now handled using a single adapter.
|
410 |
+
* Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The
|
411 |
+
Transaction object now exposes the request, response, and client as public
|
412 |
+
properties. The getters and setters have been removed.
|
413 |
+
* Removed the "headers" event. This event was only useful for changing the
|
414 |
+
body a response once the headers of the response were known. You can implement
|
415 |
+
a similar behavior in a number of ways. One example might be to use a
|
416 |
+
FnStream that has access to the transaction being sent. For example, when the
|
417 |
+
first byte is written, you could check if the response headers match your
|
418 |
+
expectations, and if so, change the actual stream body that is being
|
419 |
+
written to.
|
420 |
+
* Removed the `asArray` parameter from
|
421 |
+
`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header
|
422 |
+
value as an array, then use the newly added `getHeaderAsArray()` method of
|
423 |
+
`MessageInterface`. This change makes the Guzzle interfaces compatible with
|
424 |
+
the PSR-7 interfaces.
|
425 |
+
* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add
|
426 |
+
custom request options using double-dispatch (this was an implementation
|
427 |
+
detail). Instead, you should now provide an associative array to the
|
428 |
+
constructor which is a mapping of the request option name mapping to a
|
429 |
+
function that applies the option value to a request.
|
430 |
+
* Removed the concept of "throwImmediately" from exceptions and error events.
|
431 |
+
This control mechanism was used to stop a transfer of concurrent requests
|
432 |
+
from completing. This can now be handled by throwing the exception or by
|
433 |
+
cancelling a pool of requests or each outstanding future request individually.
|
434 |
+
* Updated to "GuzzleHttp\Streams" 3.0.
|
435 |
+
* `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a
|
436 |
+
`maxLen` parameter. This update makes the Guzzle streams project
|
437 |
+
compatible with the current PSR-7 proposal.
|
438 |
+
* `GuzzleHttp\Stream\Stream::__construct`,
|
439 |
+
`GuzzleHttp\Stream\Stream::factory`, and
|
440 |
+
`GuzzleHttp\Stream\Utils::create` no longer accept a size in the second
|
441 |
+
argument. They now accept an associative array of options, including the
|
442 |
+
"size" key and "metadata" key which can be used to provide custom metadata.
|
443 |
+
|
444 |
+
## 4.2.2 - 2014-09-08
|
445 |
+
|
446 |
+
* Fixed a memory leak in the CurlAdapter when reusing cURL handles.
|
447 |
+
* No longer using `request_fulluri` in stream adapter proxies.
|
448 |
+
* Relative redirects are now based on the last response, not the first response.
|
449 |
+
|
450 |
+
## 4.2.1 - 2014-08-19
|
451 |
+
|
452 |
+
* Ensuring that the StreamAdapter does not always add a Content-Type header
|
453 |
+
* Adding automated github releases with a phar and zip
|
454 |
+
|
455 |
+
## 4.2.0 - 2014-08-17
|
456 |
+
|
457 |
+
* Now merging in default options using a case-insensitive comparison.
|
458 |
+
Closes https://github.com/guzzle/guzzle/issues/767
|
459 |
+
* Added the ability to automatically decode `Content-Encoding` response bodies
|
460 |
+
using the `decode_content` request option. This is set to `true` by default
|
461 |
+
to decode the response body if it comes over the wire with a
|
462 |
+
`Content-Encoding`. Set this value to `false` to disable decoding the
|
463 |
+
response content, and pass a string to provide a request `Accept-Encoding`
|
464 |
+
header and turn on automatic response decoding. This feature now allows you
|
465 |
+
to pass an `Accept-Encoding` header in the headers of a request but still
|
466 |
+
disable automatic response decoding.
|
467 |
+
Closes https://github.com/guzzle/guzzle/issues/764
|
468 |
+
* Added the ability to throw an exception immediately when transferring
|
469 |
+
requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760
|
470 |
+
* Updating guzzlehttp/streams dependency to ~2.1
|
471 |
+
* No longer utilizing the now deprecated namespaced methods from the stream
|
472 |
+
package.
|
473 |
+
|
474 |
+
## 4.1.8 - 2014-08-14
|
475 |
+
|
476 |
+
* Fixed an issue in the CurlFactory that caused setting the `stream=false`
|
477 |
+
request option to throw an exception.
|
478 |
+
See: https://github.com/guzzle/guzzle/issues/769
|
479 |
+
* TransactionIterator now calls rewind on the inner iterator.
|
480 |
+
See: https://github.com/guzzle/guzzle/pull/765
|
481 |
+
* You can now set the `Content-Type` header to `multipart/form-data`
|
482 |
+
when creating POST requests to force multipart bodies.
|
483 |
+
See https://github.com/guzzle/guzzle/issues/768
|
484 |
+
|
485 |
+
## 4.1.7 - 2014-08-07
|
486 |
+
|
487 |
+
* Fixed an error in the HistoryPlugin that caused the same request and response
|
488 |
+
to be logged multiple times when an HTTP protocol error occurs.
|
489 |
+
* Ensuring that cURL does not add a default Content-Type when no Content-Type
|
490 |
+
has been supplied by the user. This prevents the adapter layer from modifying
|
491 |
+
the request that is sent over the wire after any listeners may have already
|
492 |
+
put the request in a desired state (e.g., signed the request).
|
493 |
+
* Throwing an exception when you attempt to send requests that have the
|
494 |
+
"stream" set to true in parallel using the MultiAdapter.
|
495 |
+
* Only calling curl_multi_select when there are active cURL handles. This was
|
496 |
+
previously changed and caused performance problems on some systems due to PHP
|
497 |
+
always selecting until the maximum select timeout.
|
498 |
+
* Fixed a bug where multipart/form-data POST fields were not correctly
|
499 |
+
aggregated (e.g., values with "&").
|
500 |
+
|
501 |
+
## 4.1.6 - 2014-08-03
|
502 |
+
|
503 |
+
* Added helper methods to make it easier to represent messages as strings,
|
504 |
+
including getting the start line and getting headers as a string.
|
505 |
+
|
506 |
+
## 4.1.5 - 2014-08-02
|
507 |
+
|
508 |
+
* Automatically retrying cURL "Connection died, retrying a fresh connect"
|
509 |
+
errors when possible.
|
510 |
+
* cURL implementation cleanup
|
511 |
+
* Allowing multiple event subscriber listeners to be registered per event by
|
512 |
+
passing an array of arrays of listener configuration.
|
513 |
+
|
514 |
+
## 4.1.4 - 2014-07-22
|
515 |
+
|
516 |
+
* Fixed a bug that caused multi-part POST requests with more than one field to
|
517 |
+
serialize incorrectly.
|
518 |
+
* Paths can now be set to "0"
|
519 |
+
* `ResponseInterface::xml` now accepts a `libxml_options` option and added a
|
520 |
+
missing default argument that was required when parsing XML response bodies.
|
521 |
+
* A `save_to` stream is now created lazily, which means that files are not
|
522 |
+
created on disk unless a request succeeds.
|
523 |
+
|
524 |
+
## 4.1.3 - 2014-07-15
|
525 |
+
|
526 |
+
* Various fixes to multipart/form-data POST uploads
|
527 |
+
* Wrapping function.php in an if-statement to ensure Guzzle can be used
|
528 |
+
globally and in a Composer install
|
529 |
+
* Fixed an issue with generating and merging in events to an event array
|
530 |
+
* POST headers are only applied before sending a request to allow you to change
|
531 |
+
the query aggregator used before uploading
|
532 |
+
* Added much more robust query string parsing
|
533 |
+
* Fixed various parsing and normalization issues with URLs
|
534 |
+
* Fixing an issue where multi-valued headers were not being utilized correctly
|
535 |
+
in the StreamAdapter
|
536 |
+
|
537 |
+
## 4.1.2 - 2014-06-18
|
538 |
+
|
539 |
+
* Added support for sending payloads with GET requests
|
540 |
+
|
541 |
+
## 4.1.1 - 2014-06-08
|
542 |
+
|
543 |
+
* Fixed an issue related to using custom message factory options in subclasses
|
544 |
+
* Fixed an issue with nested form fields in a multi-part POST
|
545 |
+
* Fixed an issue with using the `json` request option for POST requests
|
546 |
+
* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar`
|
547 |
+
|
548 |
+
## 4.1.0 - 2014-05-27
|
549 |
+
|
550 |
+
* Added a `json` request option to easily serialize JSON payloads.
|
551 |
+
* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON.
|
552 |
+
* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`.
|
553 |
+
* Added the ability to provide an emitter to a client in the client constructor.
|
554 |
+
* Added the ability to persist a cookie session using $_SESSION.
|
555 |
+
* Added a trait that can be used to add event listeners to an iterator.
|
556 |
+
* Removed request method constants from RequestInterface.
|
557 |
+
* Fixed warning when invalid request start-lines are received.
|
558 |
+
* Updated MessageFactory to work with custom request option methods.
|
559 |
+
* Updated cacert bundle to latest build.
|
560 |
+
|
561 |
+
4.0.2 (2014-04-16)
|
562 |
+
------------------
|
563 |
+
|
564 |
+
* Proxy requests using the StreamAdapter now properly use request_fulluri (#632)
|
565 |
+
* Added the ability to set scalars as POST fields (#628)
|
566 |
+
|
567 |
+
## 4.0.1 - 2014-04-04
|
568 |
+
|
569 |
+
* The HTTP status code of a response is now set as the exception code of
|
570 |
+
RequestException objects.
|
571 |
+
* 303 redirects will now correctly switch from POST to GET requests.
|
572 |
+
* The default parallel adapter of a client now correctly uses the MultiAdapter.
|
573 |
+
* HasDataTrait now initializes the internal data array as an empty array so
|
574 |
+
that the toArray() method always returns an array.
|
575 |
+
|
576 |
+
## 4.0.0 - 2014-03-29
|
577 |
+
|
578 |
+
* For more information on the 4.0 transition, see:
|
579 |
+
http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/
|
580 |
+
* For information on changes and upgrading, see:
|
581 |
+
https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
|
582 |
+
* Added `GuzzleHttp\batch()` as a convenience function for sending requests in
|
583 |
+
parallel without needing to write asynchronous code.
|
584 |
+
* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`.
|
585 |
+
You can now pass a callable or an array of associative arrays where each
|
586 |
+
associative array contains the "fn", "priority", and "once" keys.
|
587 |
+
|
588 |
+
## 4.0.0.rc-2 - 2014-03-25
|
589 |
+
|
590 |
+
* Removed `getConfig()` and `setConfig()` from clients to avoid confusion
|
591 |
+
around whether things like base_url, message_factory, etc. should be able to
|
592 |
+
be retrieved or modified.
|
593 |
+
* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface
|
594 |
+
* functions.php functions were renamed using snake_case to match PHP idioms
|
595 |
+
* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and
|
596 |
+
`GUZZLE_CURL_SELECT_TIMEOUT` environment variables
|
597 |
+
* Added the ability to specify custom `sendAll()` event priorities
|
598 |
+
* Added the ability to specify custom stream context options to the stream
|
599 |
+
adapter.
|
600 |
+
* Added a functions.php function for `get_path()` and `set_path()`
|
601 |
+
* CurlAdapter and MultiAdapter now use a callable to generate curl resources
|
602 |
+
* MockAdapter now properly reads a body and emits a `headers` event
|
603 |
+
* Updated Url class to check if a scheme and host are set before adding ":"
|
604 |
+
and "//". This allows empty Url (e.g., "") to be serialized as "".
|
605 |
+
* Parsing invalid XML no longer emits warnings
|
606 |
+
* Curl classes now properly throw AdapterExceptions
|
607 |
+
* Various performance optimizations
|
608 |
+
* Streams are created with the faster `Stream\create()` function
|
609 |
+
* Marked deprecation_proxy() as internal
|
610 |
+
* Test server is now a collection of static methods on a class
|
611 |
+
|
612 |
+
## 4.0.0-rc.1 - 2014-03-15
|
613 |
+
|
614 |
+
* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
|
615 |
+
|
616 |
+
## 3.8.1 - 2014-01-28
|
617 |
+
|
618 |
+
* Bug: Always using GET requests when redirecting from a 303 response
|
619 |
+
* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in
|
620 |
+
`Guzzle\Http\ClientInterface::setSslVerification()`
|
621 |
+
* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL
|
622 |
+
* Bug: The body of a request can now be set to `"0"`
|
623 |
+
* Sending PHP stream requests no longer forces `HTTP/1.0`
|
624 |
+
* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of
|
625 |
+
each sub-exception
|
626 |
+
* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than
|
627 |
+
clobbering everything).
|
628 |
+
* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)
|
629 |
+
* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.
|
630 |
+
For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.
|
631 |
+
* Now properly escaping the regular expression delimiter when matching Cookie domains.
|
632 |
+
* Network access is now disabled when loading XML documents
|
633 |
+
|
634 |
+
## 3.8.0 - 2013-12-05
|
635 |
+
|
636 |
+
* Added the ability to define a POST name for a file
|
637 |
+
* JSON response parsing now properly walks additionalProperties
|
638 |
+
* cURL error code 18 is now retried automatically in the BackoffPlugin
|
639 |
+
* Fixed a cURL error when URLs contain fragments
|
640 |
+
* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were
|
641 |
+
CurlExceptions
|
642 |
+
* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)
|
643 |
+
* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`
|
644 |
+
* Fixed a bug that was encountered when parsing empty header parameters
|
645 |
+
* UriTemplate now has a `setRegex()` method to match the docs
|
646 |
+
* The `debug` request parameter now checks if it is truthy rather than if it exists
|
647 |
+
* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin
|
648 |
+
* Added the ability to combine URLs using strict RFC 3986 compliance
|
649 |
+
* Command objects can now return the validation errors encountered by the command
|
650 |
+
* Various fixes to cache revalidation (#437 and 29797e5)
|
651 |
+
* Various fixes to the AsyncPlugin
|
652 |
+
* Cleaned up build scripts
|
653 |
+
|
654 |
+
## 3.7.4 - 2013-10-02
|
655 |
+
|
656 |
+
* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)
|
657 |
+
* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp
|
658 |
+
(see https://github.com/aws/aws-sdk-php/issues/147)
|
659 |
+
* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots
|
660 |
+
* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)
|
661 |
+
* Updated the bundled cacert.pem (#419)
|
662 |
+
* OauthPlugin now supports adding authentication to headers or query string (#425)
|
663 |
+
|
664 |
+
## 3.7.3 - 2013-09-08
|
665 |
+
|
666 |
+
* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and
|
667 |
+
`CommandTransferException`.
|
668 |
+
* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description
|
669 |
+
* Schemas are only injected into response models when explicitly configured.
|
670 |
+
* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of
|
671 |
+
an EntityBody.
|
672 |
+
* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator.
|
673 |
+
* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`.
|
674 |
+
* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()
|
675 |
+
* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin
|
676 |
+
* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests
|
677 |
+
* Bug fix: Properly parsing headers that contain commas contained in quotes
|
678 |
+
* Bug fix: mimetype guessing based on a filename is now case-insensitive
|
679 |
+
|
680 |
+
## 3.7.2 - 2013-08-02
|
681 |
+
|
682 |
+
* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander
|
683 |
+
See https://github.com/guzzle/guzzle/issues/371
|
684 |
+
* Bug fix: Cookie domains are now matched correctly according to RFC 6265
|
685 |
+
See https://github.com/guzzle/guzzle/issues/377
|
686 |
+
* Bug fix: GET parameters are now used when calculating an OAuth signature
|
687 |
+
* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted
|
688 |
+
* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched
|
689 |
+
* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.
|
690 |
+
See https://github.com/guzzle/guzzle/issues/379
|
691 |
+
* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See
|
692 |
+
https://github.com/guzzle/guzzle/pull/380
|
693 |
+
* cURL multi cleanup and optimizations
|
694 |
+
|
695 |
+
## 3.7.1 - 2013-07-05
|
696 |
+
|
697 |
+
* Bug fix: Setting default options on a client now works
|
698 |
+
* Bug fix: Setting options on HEAD requests now works. See #352
|
699 |
+
* Bug fix: Moving stream factory before send event to before building the stream. See #353
|
700 |
+
* Bug fix: Cookies no longer match on IP addresses per RFC 6265
|
701 |
+
* Bug fix: Correctly parsing header parameters that are in `<>` and quotes
|
702 |
+
* Added `cert` and `ssl_key` as request options
|
703 |
+
* `Host` header can now diverge from the host part of a URL if the header is set manually
|
704 |
+
* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter
|
705 |
+
* OAuth parameters are only added via the plugin if they aren't already set
|
706 |
+
* Exceptions are now thrown when a URL cannot be parsed
|
707 |
+
* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails
|
708 |
+
* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin
|
709 |
+
|
710 |
+
## 3.7.0 - 2013-06-10
|
711 |
+
|
712 |
+
* See UPGRADING.md for more information on how to upgrade.
|
713 |
+
* Requests now support the ability to specify an array of $options when creating a request to more easily modify a
|
714 |
+
request. You can pass a 'request.options' configuration setting to a client to apply default request options to
|
715 |
+
every request created by a client (e.g. default query string variables, headers, curl options, etc.).
|
716 |
+
* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`.
|
717 |
+
See `Guzzle\Http\StaticClient::mount`.
|
718 |
+
* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests
|
719 |
+
created by a command (e.g. custom headers, query string variables, timeout settings, etc.).
|
720 |
+
* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the
|
721 |
+
headers of a response
|
722 |
+
* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key
|
723 |
+
(e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)
|
724 |
+
* ServiceBuilders now support storing and retrieving arbitrary data
|
725 |
+
* CachePlugin can now purge all resources for a given URI
|
726 |
+
* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource
|
727 |
+
* CachePlugin now uses the Vary header to determine if a resource is a cache hit
|
728 |
+
* `Guzzle\Http\Message\Response` now implements `\Serializable`
|
729 |
+
* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters
|
730 |
+
* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable
|
731 |
+
* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()`
|
732 |
+
* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size
|
733 |
+
* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message
|
734 |
+
* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older
|
735 |
+
Symfony users can still use the old version of Monolog.
|
736 |
+
* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`.
|
737 |
+
Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.
|
738 |
+
* Several performance improvements to `Guzzle\Common\Collection`
|
739 |
+
* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
|
740 |
+
createRequest, head, delete, put, patch, post, options, prepareRequest
|
741 |
+
* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
|
742 |
+
* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
|
743 |
+
* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
|
744 |
+
`Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
|
745 |
+
resource, string, or EntityBody into the $options parameter to specify the download location of the response.
|
746 |
+
* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
|
747 |
+
default `array()`
|
748 |
+
* Added `Guzzle\Stream\StreamInterface::isRepeatable`
|
749 |
+
* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
|
750 |
+
$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
|
751 |
+
$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.
|
752 |
+
* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.
|
753 |
+
* Removed `Guzzle\Http\ClientInterface::expandTemplate()`
|
754 |
+
* Removed `Guzzle\Http\ClientInterface::setRequestFactory()`
|
755 |
+
* Removed `Guzzle\Http\ClientInterface::getCurlMulti()`
|
756 |
+
* Removed `Guzzle\Http\Message\RequestInterface::canCache`
|
757 |
+
* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`
|
758 |
+
* Removed `Guzzle\Http\Message\RequestInterface::isRedirect`
|
759 |
+
* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
|
760 |
+
* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting
|
761 |
+
`Guzzle\Common\Version::$emitWarnings` to true.
|
762 |
+
* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use
|
763 |
+
`$request->getResponseBody()->isRepeatable()` instead.
|
764 |
+
* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
|
765 |
+
`Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
|
766 |
+
* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
|
767 |
+
`Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
|
768 |
+
* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
|
769 |
+
* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
|
770 |
+
* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
|
771 |
+
* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.
|
772 |
+
These will work through Guzzle 4.0
|
773 |
+
* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params].
|
774 |
+
* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
|
775 |
+
* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.
|
776 |
+
* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.
|
777 |
+
* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
|
778 |
+
* Marked `Guzzle\Common\Collection::inject()` as deprecated.
|
779 |
+
* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`
|
780 |
+
* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
|
781 |
+
CacheStorageInterface. These two objects and interface will be removed in a future version.
|
782 |
+
* Always setting X-cache headers on cached responses
|
783 |
+
* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
|
784 |
+
* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
|
785 |
+
$request, Response $response);`
|
786 |
+
* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
|
787 |
+
* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
|
788 |
+
* Added `CacheStorageInterface::purge($url)`
|
789 |
+
* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
|
790 |
+
$plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
|
791 |
+
CanCacheStrategyInterface $canCache = null)`
|
792 |
+
* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
|
793 |
+
|
794 |
+
## 3.6.0 - 2013-05-29
|
795 |
+
|
796 |
+
* ServiceDescription now implements ToArrayInterface
|
797 |
+
* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters
|
798 |
+
* Guzzle can now correctly parse incomplete URLs
|
799 |
+
* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
|
800 |
+
* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
|
801 |
+
* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
|
802 |
+
* Specific header implementations can be created for complex headers. When a message creates a header, it uses a
|
803 |
+
HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
|
804 |
+
CacheControl header implementation.
|
805 |
+
* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
|
806 |
+
* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
|
807 |
+
* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
|
808 |
+
Guzzle\Http\Curl\RequestMediator
|
809 |
+
* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
|
810 |
+
* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
|
811 |
+
* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
|
812 |
+
* Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
|
813 |
+
* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
|
814 |
+
* All response header helper functions return a string rather than mixing Header objects and strings inconsistently
|
815 |
+
* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle
|
816 |
+
directly via interfaces
|
817 |
+
* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
|
818 |
+
but are a no-op until removed.
|
819 |
+
* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a
|
820 |
+
`Guzzle\Service\Command\ArrayCommandInterface`.
|
821 |
+
* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
|
822 |
+
on a request while the request is still being transferred
|
823 |
+
* The ability to case-insensitively search for header values
|
824 |
+
* Guzzle\Http\Message\Header::hasExactHeader
|
825 |
+
* Guzzle\Http\Message\Header::raw. Use getAll()
|
826 |
+
* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
|
827 |
+
instead.
|
828 |
+
* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
|
829 |
+
* Added the ability to cast Model objects to a string to view debug information.
|
830 |
+
|
831 |
+
## 3.5.0 - 2013-05-13
|
832 |
+
|
833 |
+
* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times
|
834 |
+
* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove
|
835 |
+
itself from the EventDispatcher)
|
836 |
+
* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values
|
837 |
+
* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too
|
838 |
+
* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a
|
839 |
+
non-existent key
|
840 |
+
* Bug: All __call() method arguments are now required (helps with mocking frameworks)
|
841 |
+
* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference
|
842 |
+
to help with refcount based garbage collection of resources created by sending a request
|
843 |
+
* Deprecating ZF1 cache and log adapters. These will be removed in the next major version.
|
844 |
+
* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the
|
845 |
+
HistoryPlugin for a history.
|
846 |
+
* Added a `responseBody` alias for the `response_body` location
|
847 |
+
* Refactored internals to no longer rely on Response::getRequest()
|
848 |
+
* HistoryPlugin can now be cast to a string
|
849 |
+
* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests
|
850 |
+
and responses that are sent over the wire
|
851 |
+
* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects
|
852 |
+
|
853 |
+
## 3.4.3 - 2013-04-30
|
854 |
+
|
855 |
+
* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response
|
856 |
+
* Added a check to re-extract the temp cacert bundle from the phar before sending each request
|
857 |
+
|
858 |
+
## 3.4.2 - 2013-04-29
|
859 |
+
|
860 |
+
* Bug fix: Stream objects now work correctly with "a" and "a+" modes
|
861 |
+
* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present
|
862 |
+
* Bug fix: AsyncPlugin no longer forces HEAD requests
|
863 |
+
* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter
|
864 |
+
* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails
|
865 |
+
* Setting a response on a request will write to the custom request body from the response body if one is specified
|
866 |
+
* LogPlugin now writes to php://output when STDERR is undefined
|
867 |
+
* Added the ability to set multiple POST files for the same key in a single call
|
868 |
+
* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default
|
869 |
+
* Added the ability to queue CurlExceptions to the MockPlugin
|
870 |
+
* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send)
|
871 |
+
* Configuration loading now allows remote files
|
872 |
+
|
873 |
+
## 3.4.1 - 2013-04-16
|
874 |
+
|
875 |
+
* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti
|
876 |
+
handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.
|
877 |
+
* Exceptions are now properly grouped when sending requests in parallel
|
878 |
+
* Redirects are now properly aggregated when a multi transaction fails
|
879 |
+
* Redirects now set the response on the original object even in the event of a failure
|
880 |
+
* Bug fix: Model names are now properly set even when using $refs
|
881 |
+
* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax
|
882 |
+
* Added support for oauth_callback in OAuth signatures
|
883 |
+
* Added support for oauth_verifier in OAuth signatures
|
884 |
+
* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection
|
885 |
+
|
886 |
+
## 3.4.0 - 2013-04-11
|
887 |
+
|
888 |
+
* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289
|
889 |
+
* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
|
890 |
+
* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
|
891 |
+
* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
|
892 |
+
* Bug fix: Added `number` type to service descriptions.
|
893 |
+
* Bug fix: empty parameters are removed from an OAuth signature
|
894 |
+
* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header
|
895 |
+
* Bug fix: Fixed "array to string" error when validating a union of types in a service description
|
896 |
+
* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream
|
897 |
+
* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.
|
898 |
+
* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.
|
899 |
+
* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.
|
900 |
+
* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if
|
901 |
+
the Content-Type can be determined based on the entity body or the path of the request.
|
902 |
+
* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.
|
903 |
+
* Added support for a PSR-3 LogAdapter.
|
904 |
+
* Added a `command.after_prepare` event
|
905 |
+
* Added `oauth_callback` parameter to the OauthPlugin
|
906 |
+
* Added the ability to create a custom stream class when using a stream factory
|
907 |
+
* Added a CachingEntityBody decorator
|
908 |
+
* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.
|
909 |
+
* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.
|
910 |
+
* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies
|
911 |
+
* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This
|
912 |
+
means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use
|
913 |
+
POST fields or files (the latter is only used when emulating a form POST in the browser).
|
914 |
+
* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest
|
915 |
+
|
916 |
+
## 3.3.1 - 2013-03-10
|
917 |
+
|
918 |
+
* Added the ability to create PHP streaming responses from HTTP requests
|
919 |
+
* Bug fix: Running any filters when parsing response headers with service descriptions
|
920 |
+
* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing
|
921 |
+
* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across
|
922 |
+
response location visitors.
|
923 |
+
* Bug fix: Removed the possibility of creating configuration files with circular dependencies
|
924 |
+
* RequestFactory::create() now uses the key of a POST file when setting the POST file name
|
925 |
+
* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set
|
926 |
+
|
927 |
+
## 3.3.0 - 2013-03-03
|
928 |
+
|
929 |
+
* A large number of performance optimizations have been made
|
930 |
+
* Bug fix: Added 'wb' as a valid write mode for streams
|
931 |
+
* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned
|
932 |
+
* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()`
|
933 |
+
* BC: Removed `Guzzle\Http\Utils` class
|
934 |
+
* BC: Setting a service description on a client will no longer modify the client's command factories.
|
935 |
+
* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using
|
936 |
+
the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
|
937 |
+
* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to
|
938 |
+
lowercase
|
939 |
+
* Operation parameter objects are now lazy loaded internally
|
940 |
+
* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses
|
941 |
+
* Added support for instantiating responseType=class responseClass classes. Classes must implement
|
942 |
+
`Guzzle\Service\Command\ResponseClassInterface`
|
943 |
+
* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These
|
944 |
+
additional properties also support locations and can be used to parse JSON responses where the outermost part of the
|
945 |
+
JSON is an array
|
946 |
+
* Added support for nested renaming of JSON models (rename sentAs to name)
|
947 |
+
* CachePlugin
|
948 |
+
* Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error
|
949 |
+
* Debug headers can now added to cached response in the CachePlugin
|
950 |
+
|
951 |
+
## 3.2.0 - 2013-02-14
|
952 |
+
|
953 |
+
* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.
|
954 |
+
* URLs with no path no longer contain a "/" by default
|
955 |
+
* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url.
|
956 |
+
* BadResponseException no longer includes the full request and response message
|
957 |
+
* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface
|
958 |
+
* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface
|
959 |
+
* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription
|
960 |
+
* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list
|
961 |
+
* xmlEncoding can now be customized for the XML declaration of a XML service description operation
|
962 |
+
* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value
|
963 |
+
aggregation and no longer uses callbacks
|
964 |
+
* The URL encoding implementation of Guzzle\Http\QueryString can now be customized
|
965 |
+
* Bug fix: Filters were not always invoked for array service description parameters
|
966 |
+
* Bug fix: Redirects now use a target response body rather than a temporary response body
|
967 |
+
* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded
|
968 |
+
* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives
|
969 |
+
|
970 |
+
## 3.1.2 - 2013-01-27
|
971 |
+
|
972 |
+
* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the
|
973 |
+
response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.
|
974 |
+
* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent
|
975 |
+
* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)
|
976 |
+
* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()
|
977 |
+
* Setting default headers on a client after setting the user-agent will not erase the user-agent setting
|
978 |
+
|
979 |
+
## 3.1.1 - 2013-01-20
|
980 |
+
|
981 |
+
* Adding wildcard support to Guzzle\Common\Collection::getPath()
|
982 |
+
* Adding alias support to ServiceBuilder configs
|
983 |
+
* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface
|
984 |
+
|
985 |
+
## 3.1.0 - 2013-01-12
|
986 |
+
|
987 |
+
* BC: CurlException now extends from RequestException rather than BadResponseException
|
988 |
+
* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()
|
989 |
+
* Added getData to ServiceDescriptionInterface
|
990 |
+
* Added context array to RequestInterface::setState()
|
991 |
+
* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http
|
992 |
+
* Bug: Adding required content-type when JSON request visitor adds JSON to a command
|
993 |
+
* Bug: Fixing the serialization of a service description with custom data
|
994 |
+
* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing
|
995 |
+
an array of successful and failed responses
|
996 |
+
* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection
|
997 |
+
* Added Guzzle\Http\IoEmittingEntityBody
|
998 |
+
* Moved command filtration from validators to location visitors
|
999 |
+
* Added `extends` attributes to service description parameters
|
1000 |
+
* Added getModels to ServiceDescriptionInterface
|
1001 |
+
|
1002 |
+
## 3.0.7 - 2012-12-19
|
1003 |
+
|
1004 |
+
* Fixing phar detection when forcing a cacert to system if null or true
|
1005 |
+
* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()`
|
1006 |
+
* Cleaning up `Guzzle\Common\Collection::inject` method
|
1007 |
+
* Adding a response_body location to service descriptions
|
1008 |
+
|
1009 |
+
## 3.0.6 - 2012-12-09
|
1010 |
+
|
1011 |
+
* CurlMulti performance improvements
|
1012 |
+
* Adding setErrorResponses() to Operation
|
1013 |
+
* composer.json tweaks
|
1014 |
+
|
1015 |
+
## 3.0.5 - 2012-11-18
|
1016 |
+
|
1017 |
+
* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin
|
1018 |
+
* Bug: Response body can now be a string containing "0"
|
1019 |
+
* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert
|
1020 |
+
* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs
|
1021 |
+
* Added support for XML attributes in service description responses
|
1022 |
+
* DefaultRequestSerializer now supports array URI parameter values for URI template expansion
|
1023 |
+
* Added better mimetype guessing to requests and post files
|
1024 |
+
|
1025 |
+
## 3.0.4 - 2012-11-11
|
1026 |
+
|
1027 |
+
* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value
|
1028 |
+
* Bug: Cookies can now be added that have a name, domain, or value set to "0"
|
1029 |
+
* Bug: Using the system cacert bundle when using the Phar
|
1030 |
+
* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures
|
1031 |
+
* Enhanced cookie jar de-duplication
|
1032 |
+
* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added
|
1033 |
+
* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies
|
1034 |
+
* Added the ability to create any sort of hash for a stream rather than just an MD5 hash
|
1035 |
+
|
1036 |
+
## 3.0.3 - 2012-11-04
|
1037 |
+
|
1038 |
+
* Implementing redirects in PHP rather than cURL
|
1039 |
+
* Added PECL URI template extension and using as default parser if available
|
1040 |
+
* Bug: Fixed Content-Length parsing of Response factory
|
1041 |
+
* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.
|
1042 |
+
* Adding ToArrayInterface throughout library
|
1043 |
+
* Fixing OauthPlugin to create unique nonce values per request
|
1044 |
+
|
1045 |
+
## 3.0.2 - 2012-10-25
|
1046 |
+
|
1047 |
+
* Magic methods are enabled by default on clients
|
1048 |
+
* Magic methods return the result of a command
|
1049 |
+
* Service clients no longer require a base_url option in the factory
|
1050 |
+
* Bug: Fixed an issue with URI templates where null template variables were being expanded
|
1051 |
+
|
1052 |
+
## 3.0.1 - 2012-10-22
|
1053 |
+
|
1054 |
+
* Models can now be used like regular collection objects by calling filter, map, etc.
|
1055 |
+
* Models no longer require a Parameter structure or initial data in the constructor
|
1056 |
+
* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator`
|
1057 |
+
|
1058 |
+
## 3.0.0 - 2012-10-15
|
1059 |
+
|
1060 |
+
* Rewrote service description format to be based on Swagger
|
1061 |
+
* Now based on JSON schema
|
1062 |
+
* Added nested input structures and nested response models
|
1063 |
+
* Support for JSON and XML input and output models
|
1064 |
+
* Renamed `commands` to `operations`
|
1065 |
+
* Removed dot class notation
|
1066 |
+
* Removed custom types
|
1067 |
+
* Broke the project into smaller top-level namespaces to be more component friendly
|
1068 |
+
* Removed support for XML configs and descriptions. Use arrays or JSON files.
|
1069 |
+
* Removed the Validation component and Inspector
|
1070 |
+
* Moved all cookie code to Guzzle\Plugin\Cookie
|
1071 |
+
* Magic methods on a Guzzle\Service\Client now return the command un-executed.
|
1072 |
+
* Calling getResult() or getResponse() on a command will lazily execute the command if needed.
|
1073 |
+
* Now shipping with cURL's CA certs and using it by default
|
1074 |
+
* Added previousResponse() method to response objects
|
1075 |
+
* No longer sending Accept and Accept-Encoding headers on every request
|
1076 |
+
* Only sending an Expect header by default when a payload is greater than 1MB
|
1077 |
+
* Added/moved client options:
|
1078 |
+
* curl.blacklist to curl.option.blacklist
|
1079 |
+
* Added ssl.certificate_authority
|
1080 |
+
* Added a Guzzle\Iterator component
|
1081 |
+
* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin
|
1082 |
+
* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)
|
1083 |
+
* Added a more robust caching plugin
|
1084 |
+
* Added setBody to response objects
|
1085 |
+
* Updating LogPlugin to use a more flexible MessageFormatter
|
1086 |
+
* Added a completely revamped build process
|
1087 |
+
* Cleaning up Collection class and removing default values from the get method
|
1088 |
+
* Fixed ZF2 cache adapters
|
1089 |
+
|
1090 |
+
## 2.8.8 - 2012-10-15
|
1091 |
+
|
1092 |
+
* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did
|
1093 |
+
|
1094 |
+
## 2.8.7 - 2012-09-30
|
1095 |
+
|
1096 |
+
* Bug: Fixed config file aliases for JSON includes
|
1097 |
+
* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests
|
1098 |
+
* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload
|
1099 |
+
* Bug: Hardening request and response parsing to account for missing parts
|
1100 |
+
* Bug: Fixed PEAR packaging
|
1101 |
+
* Bug: Fixed Request::getInfo
|
1102 |
+
* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail
|
1103 |
+
* Adding the ability for the namespace Iterator factory to look in multiple directories
|
1104 |
+
* Added more getters/setters/removers from service descriptions
|
1105 |
+
* Added the ability to remove POST fields from OAuth signatures
|
1106 |
+
* OAuth plugin now supports 2-legged OAuth
|
1107 |
+
|
1108 |
+
## 2.8.6 - 2012-09-05
|
1109 |
+
|
1110 |
+
* Added the ability to modify and build service descriptions
|
1111 |
+
* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command
|
1112 |
+
* Added a `json` parameter location
|
1113 |
+
* Now allowing dot notation for classes in the CacheAdapterFactory
|
1114 |
+
* Using the union of two arrays rather than an array_merge when extending service builder services and service params
|
1115 |
+
* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references
|
1116 |
+
in service builder config files.
|
1117 |
+
* Services defined in two different config files that include one another will by default replace the previously
|
1118 |
+
defined service, but you can now create services that extend themselves and merge their settings over the previous
|
1119 |
+
* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like
|
1120 |
+
'_default' with a default JSON configuration file.
|
1121 |
+
|
1122 |
+
## 2.8.5 - 2012-08-29
|
1123 |
+
|
1124 |
+
* Bug: Suppressed empty arrays from URI templates
|
1125 |
+
* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching
|
1126 |
+
* Added support for HTTP responses that do not contain a reason phrase in the start-line
|
1127 |
+
* AbstractCommand commands are now invokable
|
1128 |
+
* Added a way to get the data used when signing an Oauth request before a request is sent
|
1129 |
+
|
1130 |
+
## 2.8.4 - 2012-08-15
|
1131 |
+
|
1132 |
+
* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin
|
1133 |
+
* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable.
|
1134 |
+
* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream
|
1135 |
+
* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream
|
1136 |
+
* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())
|
1137 |
+
* Added additional response status codes
|
1138 |
+
* Removed SSL information from the default User-Agent header
|
1139 |
+
* DELETE requests can now send an entity body
|
1140 |
+
* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries
|
1141 |
+
* Added the ability of the MockPlugin to consume mocked request bodies
|
1142 |
+
* LogPlugin now exposes request and response objects in the extras array
|
1143 |
+
|
1144 |
+
## 2.8.3 - 2012-07-30
|
1145 |
+
|
1146 |
+
* Bug: Fixed a case where empty POST requests were sent as GET requests
|
1147 |
+
* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body
|
1148 |
+
* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new
|
1149 |
+
* Added multiple inheritance to service description commands
|
1150 |
+
* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()`
|
1151 |
+
* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything
|
1152 |
+
* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles
|
1153 |
+
|
1154 |
+
## 2.8.2 - 2012-07-24
|
1155 |
+
|
1156 |
+
* Bug: Query string values set to 0 are no longer dropped from the query string
|
1157 |
+
* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()`
|
1158 |
+
* Bug: `+` is now treated as an encoded space when parsing query strings
|
1159 |
+
* QueryString and Collection performance improvements
|
1160 |
+
* Allowing dot notation for class paths in filters attribute of a service descriptions
|
1161 |
+
|
1162 |
+
## 2.8.1 - 2012-07-16
|
1163 |
+
|
1164 |
+
* Loosening Event Dispatcher dependency
|
1165 |
+
* POST redirects can now be customized using CURLOPT_POSTREDIR
|
1166 |
+
|
1167 |
+
## 2.8.0 - 2012-07-15
|
1168 |
+
|
1169 |
+
* BC: Guzzle\Http\Query
|
1170 |
+
* Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)
|
1171 |
+
* Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()
|
1172 |
+
* Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)
|
1173 |
+
* Changed the aggregation functions of QueryString to be static methods
|
1174 |
+
* Can now use fromString() with querystrings that have a leading ?
|
1175 |
+
* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters
|
1176 |
+
* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body
|
1177 |
+
* Cookies are no longer URL decoded by default
|
1178 |
+
* Bug: URI template variables set to null are no longer expanded
|
1179 |
+
|
1180 |
+
## 2.7.2 - 2012-07-02
|
1181 |
+
|
1182 |
+
* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser.
|
1183 |
+
* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty()
|
1184 |
+
* CachePlugin now allows for a custom request parameter function to check if a request can be cached
|
1185 |
+
* Bug fix: CachePlugin now only caches GET and HEAD requests by default
|
1186 |
+
* Bug fix: Using header glue when transferring headers over the wire
|
1187 |
+
* Allowing deeply nested arrays for composite variables in URI templates
|
1188 |
+
* Batch divisors can now return iterators or arrays
|
1189 |
+
|
1190 |
+
## 2.7.1 - 2012-06-26
|
1191 |
+
|
1192 |
+
* Minor patch to update version number in UA string
|
1193 |
+
* Updating build process
|
1194 |
+
|
1195 |
+
## 2.7.0 - 2012-06-25
|
1196 |
+
|
1197 |
+
* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes.
|
1198 |
+
* BC: Removed magic setX methods from commands
|
1199 |
+
* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method
|
1200 |
+
* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.
|
1201 |
+
* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)
|
1202 |
+
* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace
|
1203 |
+
* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin
|
1204 |
+
* Added the ability to set POST fields and files in a service description
|
1205 |
+
* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method
|
1206 |
+
* Adding a command.before_prepare event to clients
|
1207 |
+
* Added BatchClosureTransfer and BatchClosureDivisor
|
1208 |
+
* BatchTransferException now includes references to the batch divisor and transfer strategies
|
1209 |
+
* Fixed some tests so that they pass more reliably
|
1210 |
+
* Added Guzzle\Common\Log\ArrayLogAdapter
|
1211 |
+
|
1212 |
+
## 2.6.6 - 2012-06-10
|
1213 |
+
|
1214 |
+
* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin
|
1215 |
+
* BC: Removing Guzzle\Service\Command\CommandSet
|
1216 |
+
* Adding generic batching system (replaces the batch queue plugin and command set)
|
1217 |
+
* Updating ZF cache and log adapters and now using ZF's composer repository
|
1218 |
+
* Bug: Setting the name of each ApiParam when creating through an ApiCommand
|
1219 |
+
* Adding result_type, result_doc, deprecated, and doc_url to service descriptions
|
1220 |
+
* Bug: Changed the default cookie header casing back to 'Cookie'
|
1221 |
+
|
1222 |
+
## 2.6.5 - 2012-06-03
|
1223 |
+
|
1224 |
+
* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource()
|
1225 |
+
* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from
|
1226 |
+
* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data
|
1227 |
+
* BC: Renaming methods in the CookieJarInterface
|
1228 |
+
* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations
|
1229 |
+
* Making the default glue for HTTP headers ';' instead of ','
|
1230 |
+
* Adding a removeValue to Guzzle\Http\Message\Header
|
1231 |
+
* Adding getCookies() to request interface.
|
1232 |
+
* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()
|
1233 |
+
|
1234 |
+
## 2.6.4 - 2012-05-30
|
1235 |
+
|
1236 |
+
* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.
|
1237 |
+
* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand
|
1238 |
+
* Bug: Fixing magic method command calls on clients
|
1239 |
+
* Bug: Email constraint only validates strings
|
1240 |
+
* Bug: Aggregate POST fields when POST files are present in curl handle
|
1241 |
+
* Bug: Fixing default User-Agent header
|
1242 |
+
* Bug: Only appending or prepending parameters in commands if they are specified
|
1243 |
+
* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes
|
1244 |
+
* Allowing the use of dot notation for class namespaces when using instance_of constraint
|
1245 |
+
* Added any_match validation constraint
|
1246 |
+
* Added an AsyncPlugin
|
1247 |
+
* Passing request object to the calculateWait method of the ExponentialBackoffPlugin
|
1248 |
+
* Allowing the result of a command object to be changed
|
1249 |
+
* Parsing location and type sub values when instantiating a service description rather than over and over at runtime
|
1250 |
+
|
1251 |
+
## 2.6.3 - 2012-05-23
|
1252 |
+
|
1253 |
+
* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options.
|
1254 |
+
* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.
|
1255 |
+
* You can now use an array of data when creating PUT request bodies in the request factory.
|
1256 |
+
* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.
|
1257 |
+
* [Http] Adding support for Content-Type in multipart POST uploads per upload
|
1258 |
+
* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])
|
1259 |
+
* Adding more POST data operations for easier manipulation of POST data.
|
1260 |
+
* You can now set empty POST fields.
|
1261 |
+
* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.
|
1262 |
+
* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.
|
1263 |
+
* CS updates
|
1264 |
+
|
1265 |
+
## 2.6.2 - 2012-05-19
|
1266 |
+
|
1267 |
+
* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method.
|
1268 |
+
|
1269 |
+
## 2.6.1 - 2012-05-19
|
1270 |
+
|
1271 |
+
* [BC] Removing 'path' support in service descriptions. Use 'uri'.
|
1272 |
+
* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.
|
1273 |
+
* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it.
|
1274 |
+
* [BC] Removing Guzzle\Common\XmlElement.
|
1275 |
+
* All commands, both dynamic and concrete, have ApiCommand objects.
|
1276 |
+
* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.
|
1277 |
+
* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.
|
1278 |
+
* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible.
|
1279 |
+
|
1280 |
+
## 2.6.0 - 2012-05-15
|
1281 |
+
|
1282 |
+
* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder
|
1283 |
+
* [BC] Executing a Command returns the result of the command rather than the command
|
1284 |
+
* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed.
|
1285 |
+
* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args.
|
1286 |
+
* [BC] Moving ResourceIterator* to Guzzle\Service\Resource
|
1287 |
+
* [BC] Completely refactored ResourceIterators to iterate over a cloned command object
|
1288 |
+
* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate
|
1289 |
+
* [BC] Guzzle\Guzzle is now deprecated
|
1290 |
+
* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject
|
1291 |
+
* Adding Guzzle\Version class to give version information about Guzzle
|
1292 |
+
* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate()
|
1293 |
+
* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data
|
1294 |
+
* ServiceDescription and ServiceBuilder are now cacheable using similar configs
|
1295 |
+
* Changing the format of XML and JSON service builder configs. Backwards compatible.
|
1296 |
+
* Cleaned up Cookie parsing
|
1297 |
+
* Trimming the default Guzzle User-Agent header
|
1298 |
+
* Adding a setOnComplete() method to Commands that is called when a command completes
|
1299 |
+
* Keeping track of requests that were mocked in the MockPlugin
|
1300 |
+
* Fixed a caching bug in the CacheAdapterFactory
|
1301 |
+
* Inspector objects can be injected into a Command object
|
1302 |
+
* Refactoring a lot of code and tests to be case insensitive when dealing with headers
|
1303 |
+
* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL
|
1304 |
+
* Adding the ability to set global option overrides to service builder configs
|
1305 |
+
* Adding the ability to include other service builder config files from within XML and JSON files
|
1306 |
+
* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.
|
1307 |
+
|
1308 |
+
## 2.5.0 - 2012-05-08
|
1309 |
+
|
1310 |
+
* Major performance improvements
|
1311 |
+
* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated.
|
1312 |
+
* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.
|
1313 |
+
* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}"
|
1314 |
+
* Added the ability to passed parameters to all requests created by a client
|
1315 |
+
* Added callback functionality to the ExponentialBackoffPlugin
|
1316 |
+
* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.
|
1317 |
+
* Rewinding request stream bodies when retrying requests
|
1318 |
+
* Exception is thrown when JSON response body cannot be decoded
|
1319 |
+
* Added configurable magic method calls to clients and commands. This is off by default.
|
1320 |
+
* Fixed a defect that added a hash to every parsed URL part
|
1321 |
+
* Fixed duplicate none generation for OauthPlugin.
|
1322 |
+
* Emitting an event each time a client is generated by a ServiceBuilder
|
1323 |
+
* Using an ApiParams object instead of a Collection for parameters of an ApiCommand
|
1324 |
+
* cache.* request parameters should be renamed to params.cache.*
|
1325 |
+
* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle.
|
1326 |
+
* Added the ability to disable type validation of service descriptions
|
1327 |
+
* ServiceDescriptions and ServiceBuilders are now Serializable
|
includes/vendor/mailjet/guzzlehttp/guzzle/Dockerfile
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM composer:latest as setup
|
2 |
+
|
3 |
+
RUN mkdir /guzzle
|
4 |
+
|
5 |
+
WORKDIR /guzzle
|
6 |
+
|
7 |
+
RUN set -xe \
|
8 |
+
&& composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár <mark.sagikazar@gmail.com>" --no-interaction \
|
9 |
+
&& composer require guzzlehttp/guzzle
|
10 |
+
|
11 |
+
|
12 |
+
FROM php:7.3
|
13 |
+
|
14 |
+
RUN mkdir /guzzle
|
15 |
+
|
16 |
+
WORKDIR /guzzle
|
17 |
+
|
18 |
+
COPY --from=setup /guzzle /guzzle
|
includes/vendor/mailjet/guzzlehttp/guzzle/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
|
2 |
+
|
3 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4 |
+
of this software and associated documentation files (the "Software"), to deal
|
5 |
+
in the Software without restriction, including without limitation the rights
|
6 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7 |
+
copies of the Software, and to permit persons to whom the Software is
|
8 |
+
furnished to do so, subject to the following conditions:
|
9 |
+
|
10 |
+
The above copyright notice and this permission notice shall be included in
|
11 |
+
all copies or substantial portions of the Software.
|
12 |
+
|
13 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19 |
+
THE SOFTWARE.
|
includes/vendor/mailjet/guzzlehttp/guzzle/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Guzzle, PHP HTTP client
|
2 |
+
=======================
|
3 |
+
|
4 |
+
[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases)
|
5 |
+
[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle)
|
6 |
+
[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle)
|
7 |
+
|
8 |
+
Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and
|
9 |
+
trivial to integrate with web services.
|
10 |
+
|
11 |
+
- Simple interface for building query strings, POST requests, streaming large
|
12 |
+
uploads, streaming large downloads, using HTTP cookies, uploading JSON data,
|
13 |
+
etc...
|
14 |
+
- Can send both synchronous and asynchronous requests using the same interface.
|
15 |
+
- Uses PSR-7 interfaces for requests, responses, and streams. This allows you
|
16 |
+
to utilize other PSR-7 compatible libraries with Guzzle.
|
17 |
+
- Abstracts away the underlying HTTP transport, allowing you to write
|
18 |
+
environment and transport agnostic code; i.e., no hard dependency on cURL,
|
19 |
+
PHP streams, sockets, or non-blocking event loops.
|
20 |
+
- Middleware system allows you to augment and compose client behavior.
|
21 |
+
|
22 |
+
```php
|
23 |
+
$client = new \GuzzleHttp\Client();
|
24 |
+
$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
|
25 |
+
|
26 |
+
echo $response->getStatusCode(); # 200
|
27 |
+
echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'
|
28 |
+
echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}'
|
29 |
+
|
30 |
+
# Send an asynchronous request.
|
31 |
+
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
|
32 |
+
$promise = $client->sendAsync($request)->then(function ($response) {
|
33 |
+
echo 'I completed! ' . $response->getBody();
|
34 |
+
});
|
35 |
+
|
36 |
+
$promise->wait();
|
37 |
+
```
|
38 |
+
|
39 |
+
## Help and docs
|
40 |
+
|
41 |
+
- [Documentation](http://guzzlephp.org/)
|
42 |
+
- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)
|
43 |
+
- [Gitter](https://gitter.im/guzzle/guzzle)
|
44 |
+
|
45 |
+
|
46 |
+
## Installing Guzzle
|
47 |
+
|
48 |
+
The recommended way to install Guzzle is through
|
49 |
+
[Composer](http://getcomposer.org).
|
50 |
+
|
51 |
+
```bash
|
52 |
+
# Install Composer
|
53 |
+
curl -sS https://getcomposer.org/installer | php
|
54 |
+
```
|
55 |
+
|
56 |
+
Next, run the Composer command to install the latest stable version of Guzzle:
|
57 |
+
|
58 |
+
```bash
|
59 |
+
composer require guzzlehttp/guzzle
|
60 |
+
```
|
61 |
+
|
62 |
+
After installing, you need to require Composer's autoloader:
|
63 |
+
|
64 |
+
```php
|
65 |
+
require 'vendor/autoload.php';
|
66 |
+
```
|
67 |
+
|
68 |
+
You can then later update Guzzle using composer:
|
69 |
+
|
70 |
+
```bash
|
71 |
+
composer update
|
72 |
+
```
|
73 |
+
|
74 |
+
|
75 |
+
## Version Guidance
|
76 |
+
|
77 |
+
| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version |
|
78 |
+
|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|
|
79 |
+
| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 |
|
80 |
+
| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 |
|
81 |
+
| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 |
|
82 |
+
| 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 |
|
83 |
+
|
84 |
+
[guzzle-3-repo]: https://github.com/guzzle/guzzle3
|
85 |
+
[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
|
86 |
+
[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
|
87 |
+
[guzzle-6-repo]: https://github.com/guzzle/guzzle
|
88 |
+
[guzzle-3-docs]: http://guzzle3.readthedocs.org
|
89 |
+
[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/
|
90 |
+
[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/
|
includes/vendor/mailjet/guzzlehttp/guzzle/UPGRADING.md
ADDED
@@ -0,0 +1,1203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Guzzle Upgrade Guide
|
2 |
+
====================
|
3 |
+
|
4 |
+
5.0 to 6.0
|
5 |
+
----------
|
6 |
+
|
7 |
+
Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages.
|
8 |
+
Due to the fact that these messages are immutable, this prompted a refactoring
|
9 |
+
of Guzzle to use a middleware based system rather than an event system. Any
|
10 |
+
HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be
|
11 |
+
updated to work with the new immutable PSR-7 request and response objects. Any
|
12 |
+
event listeners or subscribers need to be updated to become middleware
|
13 |
+
functions that wrap handlers (or are injected into a
|
14 |
+
`GuzzleHttp\HandlerStack`).
|
15 |
+
|
16 |
+
- Removed `GuzzleHttp\BatchResults`
|
17 |
+
- Removed `GuzzleHttp\Collection`
|
18 |
+
- Removed `GuzzleHttp\HasDataTrait`
|
19 |
+
- Removed `GuzzleHttp\ToArrayInterface`
|
20 |
+
- The `guzzlehttp/streams` dependency has been removed. Stream functionality
|
21 |
+
is now present in the `GuzzleHttp\Psr7` namespace provided by the
|
22 |
+
`guzzlehttp/psr7` package.
|
23 |
+
- Guzzle no longer uses ReactPHP promises and now uses the
|
24 |
+
`guzzlehttp/promises` library. We use a custom promise library for three
|
25 |
+
significant reasons:
|
26 |
+
1. React promises (at the time of writing this) are recursive. Promise
|
27 |
+
chaining and promise resolution will eventually blow the stack. Guzzle
|
28 |
+
promises are not recursive as they use a sort of trampolining technique.
|
29 |
+
Note: there has been movement in the React project to modify promises to
|
30 |
+
no longer utilize recursion.
|
31 |
+
2. Guzzle needs to have the ability to synchronously block on a promise to
|
32 |
+
wait for a result. Guzzle promises allows this functionality (and does
|
33 |
+
not require the use of recursion).
|
34 |
+
3. Because we need to be able to wait on a result, doing so using React
|
35 |
+
promises requires wrapping react promises with RingPHP futures. This
|
36 |
+
overhead is no longer needed, reducing stack sizes, reducing complexity,
|
37 |
+
and improving performance.
|
38 |
+
- `GuzzleHttp\Mimetypes` has been moved to a function in
|
39 |
+
`GuzzleHttp\Psr7\mimetype_from_extension` and
|
40 |
+
`GuzzleHttp\Psr7\mimetype_from_filename`.
|
41 |
+
- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query
|
42 |
+
strings must now be passed into request objects as strings, or provided to
|
43 |
+
the `query` request option when creating requests with clients. The `query`
|
44 |
+
option uses PHP's `http_build_query` to convert an array to a string. If you
|
45 |
+
need a different serialization technique, you will need to pass the query
|
46 |
+
string in as a string. There are a couple helper functions that will make
|
47 |
+
working with query strings easier: `GuzzleHttp\Psr7\parse_query` and
|
48 |
+
`GuzzleHttp\Psr7\build_query`.
|
49 |
+
- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware
|
50 |
+
system based on PSR-7, using RingPHP and it's middleware system as well adds
|
51 |
+
more complexity than the benefits it provides. All HTTP handlers that were
|
52 |
+
present in RingPHP have been modified to work directly with PSR-7 messages
|
53 |
+
and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces
|
54 |
+
complexity in Guzzle, removes a dependency, and improves performance. RingPHP
|
55 |
+
will be maintained for Guzzle 5 support, but will no longer be a part of
|
56 |
+
Guzzle 6.
|
57 |
+
- As Guzzle now uses a middleware based systems the event system and RingPHP
|
58 |
+
integration has been removed. Note: while the event system has been removed,
|
59 |
+
it is possible to add your own type of event system that is powered by the
|
60 |
+
middleware system.
|
61 |
+
- Removed the `Event` namespace.
|
62 |
+
- Removed the `Subscriber` namespace.
|
63 |
+
- Removed `Transaction` class
|
64 |
+
- Removed `RequestFsm`
|
65 |
+
- Removed `RingBridge`
|
66 |
+
- `GuzzleHttp\Subscriber\Cookie` is now provided by
|
67 |
+
`GuzzleHttp\Middleware::cookies`
|
68 |
+
- `GuzzleHttp\Subscriber\HttpError` is now provided by
|
69 |
+
`GuzzleHttp\Middleware::httpError`
|
70 |
+
- `GuzzleHttp\Subscriber\History` is now provided by
|
71 |
+
`GuzzleHttp\Middleware::history`
|
72 |
+
- `GuzzleHttp\Subscriber\Mock` is now provided by
|
73 |
+
`GuzzleHttp\Handler\MockHandler`
|
74 |
+
- `GuzzleHttp\Subscriber\Prepare` is now provided by
|
75 |
+
`GuzzleHttp\PrepareBodyMiddleware`
|
76 |
+
- `GuzzleHttp\Subscriber\Redirect` is now provided by
|
77 |
+
`GuzzleHttp\RedirectMiddleware`
|
78 |
+
- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in
|
79 |
+
`GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone.
|
80 |
+
- Static functions in `GuzzleHttp\Utils` have been moved to namespaced
|
81 |
+
functions under the `GuzzleHttp` namespace. This requires either a Composer
|
82 |
+
based autoloader or you to include functions.php.
|
83 |
+
- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to
|
84 |
+
`GuzzleHttp\ClientInterface::getConfig`.
|
85 |
+
- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed.
|
86 |
+
- The `json` and `xml` methods of response objects has been removed. With the
|
87 |
+
migration to strictly adhering to PSR-7 as the interface for Guzzle messages,
|
88 |
+
adding methods to message interfaces would actually require Guzzle messages
|
89 |
+
to extend from PSR-7 messages rather then work with them directly.
|
90 |
+
|
91 |
+
## Migrating to middleware
|
92 |
+
|
93 |
+
The change to PSR-7 unfortunately required significant refactoring to Guzzle
|
94 |
+
due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event
|
95 |
+
system from plugins. The event system relied on mutability of HTTP messages and
|
96 |
+
side effects in order to work. With immutable messages, you have to change your
|
97 |
+
workflow to become more about either returning a value (e.g., functional
|
98 |
+
middlewares) or setting a value on an object. Guzzle v6 has chosen the
|
99 |
+
functional middleware approach.
|
100 |
+
|
101 |
+
Instead of using the event system to listen for things like the `before` event,
|
102 |
+
you now create a stack based middleware function that intercepts a request on
|
103 |
+
the way in and the promise of the response on the way out. This is a much
|
104 |
+
simpler and more predictable approach than the event system and works nicely
|
105 |
+
with PSR-7 middleware. Due to the use of promises, the middleware system is
|
106 |
+
also asynchronous.
|
107 |
+
|
108 |
+
v5:
|
109 |
+
|
110 |
+
```php
|
111 |
+
use GuzzleHttp\Event\BeforeEvent;
|
112 |
+
$client = new GuzzleHttp\Client();
|
113 |
+
// Get the emitter and listen to the before event.
|
114 |
+
$client->getEmitter()->on('before', function (BeforeEvent $e) {
|
115 |
+
// Guzzle v5 events relied on mutation
|
116 |
+
$e->getRequest()->setHeader('X-Foo', 'Bar');
|
117 |
+
});
|
118 |
+
```
|
119 |
+
|
120 |
+
v6:
|
121 |
+
|
122 |
+
In v6, you can modify the request before it is sent using the `mapRequest`
|
123 |
+
middleware. The idiomatic way in v6 to modify the request/response lifecycle is
|
124 |
+
to setup a handler middleware stack up front and inject the handler into a
|
125 |
+
client.
|
126 |
+
|
127 |
+
```php
|
128 |
+
use GuzzleHttp\Middleware;
|
129 |
+
// Create a handler stack that has all of the default middlewares attached
|
130 |
+
$handler = GuzzleHttp\HandlerStack::create();
|
131 |
+
// Push the handler onto the handler stack
|
132 |
+
$handler->push(Middleware::mapRequest(function (RequestInterface $request) {
|
133 |
+
// Notice that we have to return a request object
|
134 |
+
return $request->withHeader('X-Foo', 'Bar');
|
135 |
+
}));
|
136 |
+
// Inject the handler into the client
|
137 |
+
$client = new GuzzleHttp\Client(['handler' => $handler]);
|
138 |
+
```
|
139 |
+
|
140 |
+
## POST Requests
|
141 |
+
|
142 |
+
This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params)
|
143 |
+
and `multipart` request options. `form_params` is an associative array of
|
144 |
+
strings or array of strings and is used to serialize an
|
145 |
+
`application/x-www-form-urlencoded` POST request. The
|
146 |
+
[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart)
|
147 |
+
option is now used to send a multipart/form-data POST request.
|
148 |
+
|
149 |
+
`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add
|
150 |
+
POST files to a multipart/form-data request.
|
151 |
+
|
152 |
+
The `body` option no longer accepts an array to send POST requests. Please use
|
153 |
+
`multipart` or `form_params` instead.
|
154 |
+
|
155 |
+
The `base_url` option has been renamed to `base_uri`.
|
156 |
+
|
157 |
+
4.x to 5.0
|
158 |
+
----------
|
159 |
+
|
160 |
+
## Rewritten Adapter Layer
|
161 |
+
|
162 |
+
Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send
|
163 |
+
HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor
|
164 |
+
is still supported, but it has now been renamed to `handler`. Instead of
|
165 |
+
passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP
|
166 |
+
`callable` that follows the RingPHP specification.
|
167 |
+
|
168 |
+
## Removed Fluent Interfaces
|
169 |
+
|
170 |
+
[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil)
|
171 |
+
from the following classes:
|
172 |
+
|
173 |
+
- `GuzzleHttp\Collection`
|
174 |
+
- `GuzzleHttp\Url`
|
175 |
+
- `GuzzleHttp\Query`
|
176 |
+
- `GuzzleHttp\Post\PostBody`
|
177 |
+
- `GuzzleHttp\Cookie\SetCookie`
|
178 |
+
|
179 |
+
## Removed functions.php
|
180 |
+
|
181 |
+
Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following
|
182 |
+
functions can be used as replacements.
|
183 |
+
|
184 |
+
- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode`
|
185 |
+
- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath`
|
186 |
+
- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path`
|
187 |
+
- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however,
|
188 |
+
deprecated in favor of using `GuzzleHttp\Pool::batch()`.
|
189 |
+
|
190 |
+
The "procedural" global client has been removed with no replacement (e.g.,
|
191 |
+
`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client`
|
192 |
+
object as a replacement.
|
193 |
+
|
194 |
+
## `throwImmediately` has been removed
|
195 |
+
|
196 |
+
The concept of "throwImmediately" has been removed from exceptions and error
|
197 |
+
events. This control mechanism was used to stop a transfer of concurrent
|
198 |
+
requests from completing. This can now be handled by throwing the exception or
|
199 |
+
by cancelling a pool of requests or each outstanding future request
|
200 |
+
individually.
|
201 |
+
|
202 |
+
## headers event has been removed
|
203 |
+
|
204 |
+
Removed the "headers" event. This event was only useful for changing the
|
205 |
+
body a response once the headers of the response were known. You can implement
|
206 |
+
a similar behavior in a number of ways. One example might be to use a
|
207 |
+
FnStream that has access to the transaction being sent. For example, when the
|
208 |
+
first byte is written, you could check if the response headers match your
|
209 |
+
expectations, and if so, change the actual stream body that is being
|
210 |
+
written to.
|
211 |
+
|
212 |
+
## Updates to HTTP Messages
|
213 |
+
|
214 |
+
Removed the `asArray` parameter from
|
215 |
+
`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header
|
216 |
+
value as an array, then use the newly added `getHeaderAsArray()` method of
|
217 |
+
`MessageInterface`. This change makes the Guzzle interfaces compatible with
|
218 |
+
the PSR-7 interfaces.
|
219 |
+
|
220 |
+
3.x to 4.0
|
221 |
+
----------
|
222 |
+
|
223 |
+
## Overarching changes:
|
224 |
+
|
225 |
+
- Now requires PHP 5.4 or greater.
|
226 |
+
- No longer requires cURL to send requests.
|
227 |
+
- Guzzle no longer wraps every exception it throws. Only exceptions that are
|
228 |
+
recoverable are now wrapped by Guzzle.
|
229 |
+
- Various namespaces have been removed or renamed.
|
230 |
+
- No longer requiring the Symfony EventDispatcher. A custom event dispatcher
|
231 |
+
based on the Symfony EventDispatcher is
|
232 |
+
now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant
|
233 |
+
speed and functionality improvements).
|
234 |
+
|
235 |
+
Changes per Guzzle 3.x namespace are described below.
|
236 |
+
|
237 |
+
## Batch
|
238 |
+
|
239 |
+
The `Guzzle\Batch` namespace has been removed. This is best left to
|
240 |
+
third-parties to implement on top of Guzzle's core HTTP library.
|
241 |
+
|
242 |
+
## Cache
|
243 |
+
|
244 |
+
The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement
|
245 |
+
has been implemented yet, but hoping to utilize a PSR cache interface).
|
246 |
+
|
247 |
+
## Common
|
248 |
+
|
249 |
+
- Removed all of the wrapped exceptions. It's better to use the standard PHP
|
250 |
+
library for unrecoverable exceptions.
|
251 |
+
- `FromConfigInterface` has been removed.
|
252 |
+
- `Guzzle\Common\Version` has been removed. The VERSION constant can be found
|
253 |
+
at `GuzzleHttp\ClientInterface::VERSION`.
|
254 |
+
|
255 |
+
### Collection
|
256 |
+
|
257 |
+
- `getAll` has been removed. Use `toArray` to convert a collection to an array.
|
258 |
+
- `inject` has been removed.
|
259 |
+
- `keySearch` has been removed.
|
260 |
+
- `getPath` no longer supports wildcard expressions. Use something better like
|
261 |
+
JMESPath for this.
|
262 |
+
- `setPath` now supports appending to an existing array via the `[]` notation.
|
263 |
+
|
264 |
+
### Events
|
265 |
+
|
266 |
+
Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses
|
267 |
+
`GuzzleHttp\Event\Emitter`.
|
268 |
+
|
269 |
+
- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by
|
270 |
+
`GuzzleHttp\Event\EmitterInterface`.
|
271 |
+
- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by
|
272 |
+
`GuzzleHttp\Event\Emitter`.
|
273 |
+
- `Symfony\Component\EventDispatcher\Event` is replaced by
|
274 |
+
`GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in
|
275 |
+
`GuzzleHttp\Event\EventInterface`.
|
276 |
+
- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and
|
277 |
+
`HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the
|
278 |
+
event emitter of a request, client, etc. now uses the `getEmitter` method
|
279 |
+
rather than the `getDispatcher` method.
|
280 |
+
|
281 |
+
#### Emitter
|
282 |
+
|
283 |
+
- Use the `once()` method to add a listener that automatically removes itself
|
284 |
+
the first time it is invoked.
|
285 |
+
- Use the `listeners()` method to retrieve a list of event listeners rather than
|
286 |
+
the `getListeners()` method.
|
287 |
+
- Use `emit()` instead of `dispatch()` to emit an event from an emitter.
|
288 |
+
- Use `attach()` instead of `addSubscriber()` and `detach()` instead of
|
289 |
+
`removeSubscriber()`.
|
290 |
+
|
291 |
+
```php
|
292 |
+
$mock = new Mock();
|
293 |
+
// 3.x
|
294 |
+
$request->getEventDispatcher()->addSubscriber($mock);
|
295 |
+
$request->getEventDispatcher()->removeSubscriber($mock);
|
296 |
+
// 4.x
|
297 |
+
$request->getEmitter()->attach($mock);
|
298 |
+
$request->getEmitter()->detach($mock);
|
299 |
+
```
|
300 |
+
|
301 |
+
Use the `on()` method to add a listener rather than the `addListener()` method.
|
302 |
+
|
303 |
+
```php
|
304 |
+
// 3.x
|
305 |
+
$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } );
|
306 |
+
// 4.x
|
307 |
+
$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } );
|
308 |
+
```
|
309 |
+
|
310 |
+
## Http
|
311 |
+
|
312 |
+
### General changes
|
313 |
+
|
314 |
+
- The cacert.pem certificate has been moved to `src/cacert.pem`.
|
315 |
+
- Added the concept of adapters that are used to transfer requests over the
|
316 |
+
wire.
|
317 |
+
- Simplified the event system.
|
318 |
+
- Sending requests in parallel is still possible, but batching is no longer a
|
319 |
+
concept of the HTTP layer. Instead, you must use the `complete` and `error`
|
320 |
+
events to asynchronously manage parallel request transfers.
|
321 |
+
- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`.
|
322 |
+
- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`.
|
323 |
+
- QueryAggregators have been rewritten so that they are simply callable
|
324 |
+
functions.
|
325 |
+
- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in
|
326 |
+
`functions.php` for an easy to use static client instance.
|
327 |
+
- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from
|
328 |
+
`GuzzleHttp\Exception\TransferException`.
|
329 |
+
|
330 |
+
### Client
|
331 |
+
|
332 |
+
Calling methods like `get()`, `post()`, `head()`, etc. no longer create and
|
333 |
+
return a request, but rather creates a request, sends the request, and returns
|
334 |
+
the response.
|
335 |
+
|
336 |
+
```php
|
337 |
+
// 3.0
|
338 |
+
$request = $client->get('/');
|
339 |
+
$response = $request->send();
|
340 |
+
|
341 |
+
// 4.0
|
342 |
+
$response = $client->get('/');
|
343 |
+
|
344 |
+
// or, to mirror the previous behavior
|
345 |
+
$request = $client->createRequest('GET', '/');
|
346 |
+
$response = $client->send($request);
|
347 |
+
```
|
348 |
+
|
349 |
+
`GuzzleHttp\ClientInterface` has changed.
|
350 |
+
|
351 |
+
- The `send` method no longer accepts more than one request. Use `sendAll` to
|
352 |
+
send multiple requests in parallel.
|
353 |
+
- `setUserAgent()` has been removed. Use a default request option instead. You
|
354 |
+
could, for example, do something like:
|
355 |
+
`$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`.
|
356 |
+
- `setSslVerification()` has been removed. Use default request options instead,
|
357 |
+
like `$client->setConfig('defaults/verify', true)`.
|
358 |
+
|
359 |
+
`GuzzleHttp\Client` has changed.
|
360 |
+
|
361 |
+
- The constructor now accepts only an associative array. You can include a
|
362 |
+
`base_url` string or array to use a URI template as the base URL of a client.
|
363 |
+
You can also specify a `defaults` key that is an associative array of default
|
364 |
+
request options. You can pass an `adapter` to use a custom adapter,
|
365 |
+
`batch_adapter` to use a custom adapter for sending requests in parallel, or
|
366 |
+
a `message_factory` to change the factory used to create HTTP requests and
|
367 |
+
responses.
|
368 |
+
- The client no longer emits a `client.create_request` event.
|
369 |
+
- Creating requests with a client no longer automatically utilize a URI
|
370 |
+
template. You must pass an array into a creational method (e.g.,
|
371 |
+
`createRequest`, `get`, `put`, etc.) in order to expand a URI template.
|
372 |
+
|
373 |
+
### Messages
|
374 |
+
|
375 |
+
Messages no longer have references to their counterparts (i.e., a request no
|
376 |
+
longer has a reference to it's response, and a response no loger has a
|
377 |
+
reference to its request). This association is now managed through a
|
378 |
+
`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to
|
379 |
+
these transaction objects using request events that are emitted over the
|
380 |
+
lifecycle of a request.
|
381 |
+
|
382 |
+
#### Requests with a body
|
383 |
+
|
384 |
+
- `GuzzleHttp\Message\EntityEnclosingRequest` and
|
385 |
+
`GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The
|
386 |
+
separation between requests that contain a body and requests that do not
|
387 |
+
contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface`
|
388 |
+
handles both use cases.
|
389 |
+
- Any method that previously accepts a `GuzzleHttp\Response` object now accept a
|
390 |
+
`GuzzleHttp\Message\ResponseInterface`.
|
391 |
+
- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to
|
392 |
+
`GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create
|
393 |
+
both requests and responses and is implemented in
|
394 |
+
`GuzzleHttp\Message\MessageFactory`.
|
395 |
+
- POST field and file methods have been removed from the request object. You
|
396 |
+
must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface`
|
397 |
+
to control the format of a POST body. Requests that are created using a
|
398 |
+
standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use
|
399 |
+
a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if
|
400 |
+
the method is POST and no body is provided.
|
401 |
+
|
402 |
+
```php
|
403 |
+
$request = $client->createRequest('POST', '/');
|
404 |
+
$request->getBody()->setField('foo', 'bar');
|
405 |
+
$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r')));
|
406 |
+
```
|
407 |
+
|
408 |
+
#### Headers
|
409 |
+
|
410 |
+
- `GuzzleHttp\Message\Header` has been removed. Header values are now simply
|
411 |
+
represented by an array of values or as a string. Header values are returned
|
412 |
+
as a string by default when retrieving a header value from a message. You can
|
413 |
+
pass an optional argument of `true` to retrieve a header value as an array
|
414 |
+
of strings instead of a single concatenated string.
|
415 |
+
- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to
|
416 |
+
`GuzzleHttp\Post`. This interface has been simplified and now allows the
|
417 |
+
addition of arbitrary headers.
|
418 |
+
- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most
|
419 |
+
of the custom headers are now handled separately in specific
|
420 |
+
subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has
|
421 |
+
been updated to properly handle headers that contain parameters (like the
|
422 |
+
`Link` header).
|
423 |
+
|
424 |
+
#### Responses
|
425 |
+
|
426 |
+
- `GuzzleHttp\Message\Response::getInfo()` and
|
427 |
+
`GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event
|
428 |
+
system to retrieve this type of information.
|
429 |
+
- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed.
|
430 |
+
- `GuzzleHttp\Message\Response::getMessage()` has been removed.
|
431 |
+
- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific
|
432 |
+
methods have moved to the CacheSubscriber.
|
433 |
+
- Header specific helper functions like `getContentMd5()` have been removed.
|
434 |
+
Just use `getHeader('Content-MD5')` instead.
|
435 |
+
- `GuzzleHttp\Message\Response::setRequest()` and
|
436 |
+
`GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event
|
437 |
+
system to work with request and response objects as a transaction.
|
438 |
+
- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the
|
439 |
+
Redirect subscriber instead.
|
440 |
+
- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have
|
441 |
+
been removed. Use `getStatusCode()` instead.
|
442 |
+
|
443 |
+
#### Streaming responses
|
444 |
+
|
445 |
+
Streaming requests can now be created by a client directly, returning a
|
446 |
+
`GuzzleHttp\Message\ResponseInterface` object that contains a body stream
|
447 |
+
referencing an open PHP HTTP stream.
|
448 |
+
|
449 |
+
```php
|
450 |
+
// 3.0
|
451 |
+
use Guzzle\Stream\PhpStreamRequestFactory;
|
452 |
+
$request = $client->get('/');
|
453 |
+
$factory = new PhpStreamRequestFactory();
|
454 |
+
$stream = $factory->fromRequest($request);
|
455 |
+
$data = $stream->read(1024);
|
456 |
+
|
457 |
+
// 4.0
|
458 |
+
$response = $client->get('/', ['stream' => true]);
|
459 |
+
// Read some data off of the stream in the response body
|
460 |
+
$data = $response->getBody()->read(1024);
|
461 |
+
```
|
462 |
+
|
463 |
+
#### Redirects
|
464 |
+
|
465 |
+
The `configureRedirects()` method has been removed in favor of a
|
466 |
+
`allow_redirects` request option.
|
467 |
+
|
468 |
+
```php
|
469 |
+
// Standard redirects with a default of a max of 5 redirects
|
470 |
+
$request = $client->createRequest('GET', '/', ['allow_redirects' => true]);
|
471 |
+
|
472 |
+
// Strict redirects with a custom number of redirects
|
473 |
+
$request = $client->createRequest('GET', '/', [
|
474 |
+
'allow_redirects' => ['max' => 5, 'strict' => true]
|
475 |
+
]);
|
476 |
+
```
|
477 |
+
|
478 |
+
#### EntityBody
|
479 |
+
|
480 |
+
EntityBody interfaces and classes have been removed or moved to
|
481 |
+
`GuzzleHttp\Stream`. All classes and interfaces that once required
|
482 |
+
`GuzzleHttp\EntityBodyInterface` now require
|
483 |
+
`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no
|
484 |
+
longer uses `GuzzleHttp\EntityBody::factory` but now uses
|
485 |
+
`GuzzleHttp\Stream\Stream::factory` or even better:
|
486 |
+
`GuzzleHttp\Stream\create()`.
|
487 |
+
|
488 |
+
- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface`
|
489 |
+
- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream`
|
490 |
+
- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream`
|
491 |
+
- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream`
|
492 |
+
- `Guzzle\Http\IoEmittyinEntityBody` has been removed.
|
493 |
+
|
494 |
+
#### Request lifecycle events
|
495 |
+
|
496 |
+
Requests previously submitted a large number of requests. The number of events
|
497 |
+
emitted over the lifecycle of a request has been significantly reduced to make
|
498 |
+
it easier to understand how to extend the behavior of a request. All events
|
499 |
+
emitted during the lifecycle of a request now emit a custom
|
500 |
+
`GuzzleHttp\Event\EventInterface` object that contains context providing
|
501 |
+
methods and a way in which to modify the transaction at that specific point in
|
502 |
+
time (e.g., intercept the request and set a response on the transaction).
|
503 |
+
|
504 |
+
- `request.before_send` has been renamed to `before` and now emits a
|
505 |
+
`GuzzleHttp\Event\BeforeEvent`
|
506 |
+
- `request.complete` has been renamed to `complete` and now emits a
|
507 |
+
`GuzzleHttp\Event\CompleteEvent`.
|
508 |
+
- `request.sent` has been removed. Use `complete`.
|
509 |
+
- `request.success` has been removed. Use `complete`.
|
510 |
+
- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`.
|
511 |
+
- `request.exception` has been removed. Use `error`.
|
512 |
+
- `request.receive.status_line` has been removed.
|
513 |
+
- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to
|
514 |
+
maintain a status update.
|
515 |
+
- `curl.callback.write` has been removed. Use a custom `StreamInterface` to
|
516 |
+
intercept writes.
|
517 |
+
- `curl.callback.read` has been removed. Use a custom `StreamInterface` to
|
518 |
+
intercept reads.
|
519 |
+
|
520 |
+
`headers` is a new event that is emitted after the response headers of a
|
521 |
+
request have been received before the body of the response is downloaded. This
|
522 |
+
event emits a `GuzzleHttp\Event\HeadersEvent`.
|
523 |
+
|
524 |
+
You can intercept a request and inject a response using the `intercept()` event
|
525 |
+
of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and
|
526 |
+
`GuzzleHttp\Event\ErrorEvent` event.
|
527 |
+
|
528 |
+
See: http://docs.guzzlephp.org/en/latest/events.html
|
529 |
+
|
530 |
+
## Inflection
|
531 |
+
|
532 |
+
The `Guzzle\Inflection` namespace has been removed. This is not a core concern
|
533 |
+
of Guzzle.
|
534 |
+
|
535 |
+
## Iterator
|
536 |
+
|
537 |
+
The `Guzzle\Iterator` namespace has been removed.
|
538 |
+
|
539 |
+
- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and
|
540 |
+
`Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of
|
541 |
+
Guzzle itself.
|
542 |
+
- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent
|
543 |
+
class is shipped with PHP 5.4.
|
544 |
+
- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because
|
545 |
+
it's easier to just wrap an iterator in a generator that maps values.
|
546 |
+
|
547 |
+
For a replacement of these iterators, see https://github.com/nikic/iter
|
548 |
+
|
549 |
+
## Log
|
550 |
+
|
551 |
+
The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The
|
552 |
+
`Guzzle\Log` namespace has been removed. Guzzle now relies on
|
553 |
+
`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been
|
554 |
+
moved to `GuzzleHttp\Subscriber\Log\Formatter`.
|
555 |
+
|
556 |
+
## Parser
|
557 |
+
|
558 |
+
The `Guzzle\Parser` namespace has been removed. This was previously used to
|
559 |
+
make it possible to plug in custom parsers for cookies, messages, URI
|
560 |
+
templates, and URLs; however, this level of complexity is not needed in Guzzle
|
561 |
+
so it has been removed.
|
562 |
+
|
563 |
+
- Cookie: Cookie parsing logic has been moved to
|
564 |
+
`GuzzleHttp\Cookie\SetCookie::fromString`.
|
565 |
+
- Message: Message parsing logic for both requests and responses has been moved
|
566 |
+
to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only
|
567 |
+
used in debugging or deserializing messages, so it doesn't make sense for
|
568 |
+
Guzzle as a library to add this level of complexity to parsing messages.
|
569 |
+
- UriTemplate: URI template parsing has been moved to
|
570 |
+
`GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL
|
571 |
+
URI template library if it is installed.
|
572 |
+
- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously
|
573 |
+
it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary,
|
574 |
+
then developers are free to subclass `GuzzleHttp\Url`.
|
575 |
+
|
576 |
+
## Plugin
|
577 |
+
|
578 |
+
The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`.
|
579 |
+
Several plugins are shipping with the core Guzzle library under this namespace.
|
580 |
+
|
581 |
+
- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar
|
582 |
+
code has moved to `GuzzleHttp\Cookie`.
|
583 |
+
- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin.
|
584 |
+
- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is
|
585 |
+
received.
|
586 |
+
- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin.
|
587 |
+
- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before
|
588 |
+
sending. This subscriber is attached to all requests by default.
|
589 |
+
- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin.
|
590 |
+
|
591 |
+
The following plugins have been removed (third-parties are free to re-implement
|
592 |
+
these if needed):
|
593 |
+
|
594 |
+
- `GuzzleHttp\Plugin\Async` has been removed.
|
595 |
+
- `GuzzleHttp\Plugin\CurlAuth` has been removed.
|
596 |
+
- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This
|
597 |
+
functionality should instead be implemented with event listeners that occur
|
598 |
+
after normal response parsing occurs in the guzzle/command package.
|
599 |
+
|
600 |
+
The following plugins are not part of the core Guzzle package, but are provided
|
601 |
+
in separate repositories:
|
602 |
+
|
603 |
+
- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler
|
604 |
+
to build custom retry policies using simple functions rather than various
|
605 |
+
chained classes. See: https://github.com/guzzle/retry-subscriber
|
606 |
+
- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to
|
607 |
+
https://github.com/guzzle/cache-subscriber
|
608 |
+
- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to
|
609 |
+
https://github.com/guzzle/log-subscriber
|
610 |
+
- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to
|
611 |
+
https://github.com/guzzle/message-integrity-subscriber
|
612 |
+
- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to
|
613 |
+
`GuzzleHttp\Subscriber\MockSubscriber`.
|
614 |
+
- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to
|
615 |
+
https://github.com/guzzle/oauth-subscriber
|
616 |
+
|
617 |
+
## Service
|
618 |
+
|
619 |
+
The service description layer of Guzzle has moved into two separate packages:
|
620 |
+
|
621 |
+
- http://github.com/guzzle/command Provides a high level abstraction over web
|
622 |
+
services by representing web service operations using commands.
|
623 |
+
- http://github.com/guzzle/guzzle-services Provides an implementation of
|
624 |
+
guzzle/command that provides request serialization and response parsing using
|
625 |
+
Guzzle service descriptions.
|
626 |
+
|
627 |
+
## Stream
|
628 |
+
|
629 |
+
Stream have moved to a separate package available at
|
630 |
+
https://github.com/guzzle/streams.
|
631 |
+
|
632 |
+
`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take
|
633 |
+
on the responsibilities of `Guzzle\Http\EntityBody` and
|
634 |
+
`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number
|
635 |
+
of methods implemented by the `StreamInterface` has been drastically reduced to
|
636 |
+
allow developers to more easily extend and decorate stream behavior.
|
637 |
+
|
638 |
+
## Removed methods from StreamInterface
|
639 |
+
|
640 |
+
- `getStream` and `setStream` have been removed to better encapsulate streams.
|
641 |
+
- `getMetadata` and `setMetadata` have been removed in favor of
|
642 |
+
`GuzzleHttp\Stream\MetadataStreamInterface`.
|
643 |
+
- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been
|
644 |
+
removed. This data is accessible when
|
645 |
+
using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`.
|
646 |
+
- `rewind` has been removed. Use `seek(0)` for a similar behavior.
|
647 |
+
|
648 |
+
## Renamed methods
|
649 |
+
|
650 |
+
- `detachStream` has been renamed to `detach`.
|
651 |
+
- `feof` has been renamed to `eof`.
|
652 |
+
- `ftell` has been renamed to `tell`.
|
653 |
+
- `readLine` has moved from an instance method to a static class method of
|
654 |
+
`GuzzleHttp\Stream\Stream`.
|
655 |
+
|
656 |
+
## Metadata streams
|
657 |
+
|
658 |
+
`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams
|
659 |
+
that contain additional metadata accessible via `getMetadata()`.
|
660 |
+
`GuzzleHttp\Stream\StreamInterface::getMetadata` and
|
661 |
+
`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed.
|
662 |
+
|
663 |
+
## StreamRequestFactory
|
664 |
+
|
665 |
+
The entire concept of the StreamRequestFactory has been removed. The way this
|
666 |
+
was used in Guzzle 3 broke the actual interface of sending streaming requests
|
667 |
+
(instead of getting back a Response, you got a StreamInterface). Streaming
|
668 |
+
PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`.
|
669 |
+
|
670 |
+
3.6 to 3.7
|
671 |
+
----------
|
672 |
+
|
673 |
+
### Deprecations
|
674 |
+
|
675 |
+
- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:
|
676 |
+
|
677 |
+
```php
|
678 |
+
\Guzzle\Common\Version::$emitWarnings = true;
|
679 |
+
```
|
680 |
+
|
681 |
+
The following APIs and options have been marked as deprecated:
|
682 |
+
|
683 |
+
- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.
|
684 |
+
- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
|
685 |
+
- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
|
686 |
+
- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
|
687 |
+
- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
|
688 |
+
- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
|
689 |
+
- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
|
690 |
+
- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
|
691 |
+
- Marked `Guzzle\Common\Collection::inject()` as deprecated.
|
692 |
+
- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use
|
693 |
+
`$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or
|
694 |
+
`$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`
|
695 |
+
|
696 |
+
3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational
|
697 |
+
request methods. When paired with a client's configuration settings, these options allow you to specify default settings
|
698 |
+
for various aspects of a request. Because these options make other previous configuration options redundant, several
|
699 |
+
configuration options and methods of a client and AbstractCommand have been deprecated.
|
700 |
+
|
701 |
+
- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.
|
702 |
+
- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.
|
703 |
+
- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`
|
704 |
+
- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0
|
705 |
+
|
706 |
+
$command = $client->getCommand('foo', array(
|
707 |
+
'command.headers' => array('Test' => '123'),
|
708 |
+
'command.response_body' => '/path/to/file'
|
709 |
+
));
|
710 |
+
|
711 |
+
// Should be changed to:
|
712 |
+
|
713 |
+
$command = $client->getCommand('foo', array(
|
714 |
+
'command.request_options' => array(
|
715 |
+
'headers' => array('Test' => '123'),
|
716 |
+
'save_as' => '/path/to/file'
|
717 |
+
)
|
718 |
+
));
|
719 |
+
|
720 |
+
### Interface changes
|
721 |
+
|
722 |
+
Additions and changes (you will need to update any implementations or subclasses you may have created):
|
723 |
+
|
724 |
+
- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
|
725 |
+
createRequest, head, delete, put, patch, post, options, prepareRequest
|
726 |
+
- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
|
727 |
+
- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
|
728 |
+
- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
|
729 |
+
`Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
|
730 |
+
resource, string, or EntityBody into the $options parameter to specify the download location of the response.
|
731 |
+
- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
|
732 |
+
default `array()`
|
733 |
+
- Added `Guzzle\Stream\StreamInterface::isRepeatable`
|
734 |
+
- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
|
735 |
+
|
736 |
+
The following methods were removed from interfaces. All of these methods are still available in the concrete classes
|
737 |
+
that implement them, but you should update your code to use alternative methods:
|
738 |
+
|
739 |
+
- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
|
740 |
+
`$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
|
741 |
+
`$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or
|
742 |
+
`$client->setDefaultOption('headers/{header_name}', 'value')`. or
|
743 |
+
`$client->setDefaultOption('headers', array('header_name' => 'value'))`.
|
744 |
+
- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.
|
745 |
+
- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail.
|
746 |
+
- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail.
|
747 |
+
- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.
|
748 |
+
- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin.
|
749 |
+
- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin.
|
750 |
+
- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin.
|
751 |
+
|
752 |
+
### Cache plugin breaking changes
|
753 |
+
|
754 |
+
- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
|
755 |
+
CacheStorageInterface. These two objects and interface will be removed in a future version.
|
756 |
+
- Always setting X-cache headers on cached responses
|
757 |
+
- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
|
758 |
+
- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
|
759 |
+
$request, Response $response);`
|
760 |
+
- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
|
761 |
+
- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
|
762 |
+
- Added `CacheStorageInterface::purge($url)`
|
763 |
+
- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
|
764 |
+
$plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
|
765 |
+
CanCacheStrategyInterface $canCache = null)`
|
766 |
+
- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
|
767 |
+
|
768 |
+
3.5 to 3.6
|
769 |
+
----------
|
770 |
+
|
771 |
+
* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
|
772 |
+
* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
|
773 |
+
* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
|
774 |
+
For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().
|
775 |
+
Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.
|
776 |
+
* Specific header implementations can be created for complex headers. When a message creates a header, it uses a
|
777 |
+
HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
|
778 |
+
CacheControl header implementation.
|
779 |
+
* Moved getLinks() from Response to just be used on a Link header object.
|
780 |
+
|
781 |
+
If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the
|
782 |
+
HeaderInterface (e.g. toArray(), getAll(), etc.).
|
783 |
+
|
784 |
+
### Interface changes
|
785 |
+
|
786 |
+
* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
|
787 |
+
* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
|
788 |
+
* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
|
789 |
+
Guzzle\Http\Curl\RequestMediator
|
790 |
+
* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
|
791 |
+
* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
|
792 |
+
* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
|
793 |
+
|
794 |
+
### Removed deprecated functions
|
795 |
+
|
796 |
+
* Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
|
797 |
+
* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
|
798 |
+
|
799 |
+
### Deprecations
|
800 |
+
|
801 |
+
* The ability to case-insensitively search for header values
|
802 |
+
* Guzzle\Http\Message\Header::hasExactHeader
|
803 |
+
* Guzzle\Http\Message\Header::raw. Use getAll()
|
804 |
+
* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
|
805 |
+
instead.
|
806 |
+
|
807 |
+
### Other changes
|
808 |
+
|
809 |
+
* All response header helper functions return a string rather than mixing Header objects and strings inconsistently
|
810 |
+
* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle
|
811 |
+
directly via interfaces
|
812 |
+
* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
|
813 |
+
but are a no-op until removed.
|
814 |
+
* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a
|
815 |
+
`Guzzle\Service\Command\ArrayCommandInterface`.
|
816 |
+
* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
|
817 |
+
on a request while the request is still being transferred
|
818 |
+
* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
|
819 |
+
|
820 |
+
3.3 to 3.4
|
821 |
+
----------
|
822 |
+
|
823 |
+
Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.
|
824 |
+
|
825 |
+
3.2 to 3.3
|
826 |
+
----------
|
827 |
+
|
828 |
+
### Response::getEtag() quote stripping removed
|
829 |
+
|
830 |
+
`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header
|
831 |
+
|
832 |
+
### Removed `Guzzle\Http\Utils`
|
833 |
+
|
834 |
+
The `Guzzle\Http\Utils` class was removed. This class was only used for testing.
|
835 |
+
|
836 |
+
### Stream wrapper and type
|
837 |
+
|
838 |
+
`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase.
|
839 |
+
|
840 |
+
### curl.emit_io became emit_io
|
841 |
+
|
842 |
+
Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the
|
843 |
+
'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
|
844 |
+
|
845 |
+
3.1 to 3.2
|
846 |
+
----------
|
847 |
+
|
848 |
+
### CurlMulti is no longer reused globally
|
849 |
+
|
850 |
+
Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added
|
851 |
+
to a single client can pollute requests dispatched from other clients.
|
852 |
+
|
853 |
+
If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the
|
854 |
+
ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is
|
855 |
+
created.
|
856 |
+
|
857 |
+
```php
|
858 |
+
$multi = new Guzzle\Http\Curl\CurlMulti();
|
859 |
+
$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json');
|
860 |
+
$builder->addListener('service_builder.create_client', function ($event) use ($multi) {
|
861 |
+
$event['client']->setCurlMulti($multi);
|
862 |
+
}
|
863 |
+
});
|
864 |
+
```
|
865 |
+
|
866 |
+
### No default path
|
867 |
+
|
868 |
+
URLs no longer have a default path value of '/' if no path was specified.
|
869 |
+
|
870 |
+
Before:
|
871 |
+
|
872 |
+
```php
|
873 |
+
$request = $client->get('http://www.foo.com');
|
874 |
+
echo $request->getUrl();
|
875 |
+
// >> http://www.foo.com/
|
876 |
+
```
|
877 |
+
|
878 |
+
After:
|
879 |
+
|
880 |
+
```php
|
881 |
+
$request = $client->get('http://www.foo.com');
|
882 |
+
echo $request->getUrl();
|
883 |
+
// >> http://www.foo.com
|
884 |
+
```
|
885 |
+
|
886 |
+
### Less verbose BadResponseException
|
887 |
+
|
888 |
+
The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and
|
889 |
+
response information. You can, however, get access to the request and response object by calling `getRequest()` or
|
890 |
+
`getResponse()` on the exception object.
|
891 |
+
|
892 |
+
### Query parameter aggregation
|
893 |
+
|
894 |
+
Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a
|
895 |
+
setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is
|
896 |
+
responsible for handling the aggregation of multi-valued query string variables into a flattened hash.
|
897 |
+
|
898 |
+
2.8 to 3.x
|
899 |
+
----------
|
900 |
+
|
901 |
+
### Guzzle\Service\Inspector
|
902 |
+
|
903 |
+
Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig`
|
904 |
+
|
905 |
+
**Before**
|
906 |
+
|
907 |
+
```php
|
908 |
+
use Guzzle\Service\Inspector;
|
909 |
+
|
910 |
+
class YourClient extends \Guzzle\Service\Client
|
911 |
+
{
|
912 |
+
public static function factory($config = array())
|
913 |
+
{
|
914 |
+
$default = array();
|
915 |
+
$required = array('base_url', 'username', 'api_key');
|
916 |
+
$config = Inspector::fromConfig($config, $default, $required);
|
917 |
+
|
918 |
+
$client = new self(
|
919 |
+
$config->get('base_url'),
|
920 |
+
$config->get('username'),
|
921 |
+
$config->get('api_key')
|
922 |
+
);
|
923 |
+
$client->setConfig($config);
|
924 |
+
|
925 |
+
$client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
|
926 |
+
|
927 |
+
return $client;
|
928 |
+
}
|
929 |
+
```
|
930 |
+
|
931 |
+
**After**
|
932 |
+
|
933 |
+
```php
|
934 |
+
use Guzzle\Common\Collection;
|
935 |
+
|
936 |
+
class YourClient extends \Guzzle\Service\Client
|
937 |
+
{
|
938 |
+
public static function factory($config = array())
|
939 |
+
{
|
940 |
+
$default = array();
|
941 |
+
$required = array('base_url', 'username', 'api_key');
|
942 |
+
$config = Collection::fromConfig($config, $default, $required);
|
943 |
+
|
944 |
+
$client = new self(
|
945 |
+
$config->get('base_url'),
|
946 |
+
$config->get('username'),
|
947 |
+
$config->get('api_key')
|
948 |
+
);
|
949 |
+
$client->setConfig($config);
|
950 |
+
|
951 |
+
$client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
|
952 |
+
|
953 |
+
return $client;
|
954 |
+
}
|
955 |
+
```
|
956 |
+
|
957 |
+
### Convert XML Service Descriptions to JSON
|
958 |
+
|
959 |
+
**Before**
|
960 |
+
|
961 |
+
```xml
|
962 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
963 |
+
<client>
|
964 |
+
<commands>
|
965 |
+
<!-- Groups -->
|
966 |
+
<command name="list_groups" method="GET" uri="groups.json">
|
967 |
+
<doc>Get a list of groups</doc>
|
968 |
+
</command>
|
969 |
+
<command name="search_groups" method="GET" uri='search.json?query="{{query}} type:group"'>
|
970 |
+
<doc>Uses a search query to get a list of groups</doc>
|
971 |
+
<param name="query" type="string" required="true" />
|
972 |
+
</command>
|
973 |
+
<command name="create_group" method="POST" uri="groups.json">
|
974 |
+
<doc>Create a group</doc>
|
975 |
+
<param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/>
|
976 |
+
<param name="Content-Type" location="header" static="application/json"/>
|
977 |
+
</command>
|
978 |
+
<command name="delete_group" method="DELETE" uri="groups/{{id}}.json">
|
979 |
+
<doc>Delete a group by ID</doc>
|
980 |
+
<param name="id" type="integer" required="true"/>
|
981 |
+
</command>
|
982 |
+
<command name="get_group" method="GET" uri="groups/{{id}}.json">
|
983 |
+
<param name="id" type="integer" required="true"/>
|
984 |
+
</command>
|
985 |
+
<command name="update_group" method="PUT" uri="groups/{{id}}.json">
|
986 |
+
<doc>Update a group</doc>
|
987 |
+
<param name="id" type="integer" required="true"/>
|
988 |
+
<param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/>
|
989 |
+
<param name="Content-Type" location="header" static="application/json"/>
|
990 |
+
</command>
|
991 |
+
</commands>
|
992 |
+
</client>
|
993 |
+
```
|
994 |
+
|
995 |
+
**After**
|
996 |
+
|
997 |
+
```json
|
998 |
+
{
|
999 |
+
"name": "Zendesk REST API v2",
|
1000 |
+
"apiVersion": "2012-12-31",
|
1001 |
+
"description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users",
|
1002 |
+
"operations": {
|
1003 |
+
"list_groups": {
|
1004 |
+
"httpMethod":"GET",
|
1005 |
+
"uri": "groups.json",
|
1006 |
+
"summary": "Get a list of groups"
|
1007 |
+
},
|
1008 |
+
"search_groups":{
|
1009 |
+
"httpMethod":"GET",
|
1010 |
+
"uri": "search.json?query=\"{query} type:group\"",
|
1011 |
+
"summary": "Uses a search query to get a list of groups",
|
1012 |
+
"parameters":{
|
1013 |
+
"query":{
|
1014 |
+
"location": "uri",
|
1015 |
+
"description":"Zendesk Search Query",
|
1016 |
+
"type": "string",
|
1017 |
+
"required": true
|
1018 |
+
}
|
1019 |
+
}
|
1020 |
+
},
|
1021 |
+
"create_group": {
|
1022 |
+
"httpMethod":"POST",
|
1023 |
+
"uri": "groups.json",
|
1024 |
+
"summary": "Create a group",
|
1025 |
+
"parameters":{
|
1026 |
+
"data": {
|
1027 |
+
"type": "array",
|
1028 |
+
"location": "body",
|
1029 |
+
"description":"Group JSON",
|
1030 |
+
"filters": "json_encode",
|
1031 |
+
"required": true
|
1032 |
+
},
|
1033 |
+
"Content-Type":{
|
1034 |
+
"type": "string",
|
1035 |
+
"location":"header",
|
1036 |
+
"static": "application/json"
|
1037 |
+
}
|
1038 |
+
}
|
1039 |
+
},
|
1040 |
+
"delete_group": {
|
1041 |
+
"httpMethod":"DELETE",
|
1042 |
+
"uri": "groups/{id}.json",
|
1043 |
+
"summary": "Delete a group",
|
1044 |
+
"parameters":{
|
1045 |
+
"id":{
|
1046 |
+
"location": "uri",
|
1047 |
+
"description":"Group to delete by ID",
|
1048 |
+
"type": "integer",
|
1049 |
+
"required": true
|
1050 |
+
}
|
1051 |
+
}
|
1052 |
+
},
|
1053 |
+
"get_group": {
|
1054 |
+
"httpMethod":"GET",
|
1055 |
+
"uri": "groups/{id}.json",
|
1056 |
+
"summary": "Get a ticket",
|
1057 |
+
"parameters":{
|
1058 |
+
"id":{
|
1059 |
+
"location": "uri",
|
1060 |
+
"description":"Group to get by ID",
|
1061 |
+
"type": "integer",
|
1062 |
+
"required": true
|
1063 |
+
}
|
1064 |
+
}
|
1065 |
+
},
|
1066 |
+
"update_group": {
|
1067 |
+
"httpMethod":"PUT",
|
1068 |
+
"uri": "groups/{id}.json",
|
1069 |
+
"summary": "Update a group",
|
1070 |
+
"parameters":{
|
1071 |
+
"id": {
|
1072 |
+
"location": "uri",
|
1073 |
+
"description":"Group to update by ID",
|
1074 |
+
"type": "integer",
|
1075 |
+
"required": true
|
1076 |
+
},
|
1077 |
+
"data": {
|
1078 |
+
"type": "array",
|
1079 |
+
"location": "body",
|
1080 |
+
"description":"Group JSON",
|
1081 |
+
"filters": "json_encode",
|
1082 |
+
"required": true
|
1083 |
+
},
|
1084 |
+
"Content-Type":{
|
1085 |
+
"type": "string",
|
1086 |
+
"location":"header",
|
1087 |
+
"static": "application/json"
|
1088 |
+
}
|
1089 |
+
}
|
1090 |
+
}
|
1091 |
+
}
|
1092 |
+
```
|
1093 |
+
|
1094 |
+
### Guzzle\Service\Description\ServiceDescription
|
1095 |
+
|
1096 |
+
Commands are now called Operations
|
1097 |
+
|
1098 |
+
**Before**
|
1099 |
+
|
1100 |
+
```php
|
1101 |
+
use Guzzle\Service\Description\ServiceDescription;
|
1102 |
+
|
1103 |
+
$sd = new ServiceDescription();
|
1104 |
+
$sd->getCommands(); // @returns ApiCommandInterface[]
|
1105 |
+
$sd->hasCommand($name);
|
1106 |
+
$sd->getCommand($name); // @returns ApiCommandInterface|null
|
1107 |
+
$sd->addCommand($command); // @param ApiCommandInterface $command
|
1108 |
+
```
|
1109 |
+
|
1110 |
+
**After**
|
1111 |
+
|
1112 |
+
```php
|
1113 |
+
use Guzzle\Service\Description\ServiceDescription;
|
1114 |
+
|
1115 |
+
$sd = new ServiceDescription();
|
1116 |
+
$sd->getOperations(); // @returns OperationInterface[]
|
1117 |
+
$sd->hasOperation($name);
|
1118 |
+
$sd->getOperation($name); // @returns OperationInterface|null
|
1119 |
+
$sd->addOperation($operation); // @param OperationInterface $operation
|
1120 |
+
```
|
1121 |
+
|
1122 |
+
### Guzzle\Common\Inflection\Inflector
|
1123 |
+
|
1124 |
+
Namespace is now `Guzzle\Inflection\Inflector`
|
1125 |
+
|
1126 |
+
### Guzzle\Http\Plugin
|
1127 |
+
|
1128 |
+
Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.
|
1129 |
+
|
1130 |
+
### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log
|
1131 |
+
|
1132 |
+
Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively.
|
1133 |
+
|
1134 |
+
**Before**
|
1135 |
+
|
1136 |
+
```php
|
1137 |
+
use Guzzle\Common\Log\ClosureLogAdapter;
|
1138 |
+
use Guzzle\Http\Plugin\LogPlugin;
|
1139 |
+
|
1140 |
+
/** @var \Guzzle\Http\Client */
|
1141 |
+
$client;
|
1142 |
+
|
1143 |
+
// $verbosity is an integer indicating desired message verbosity level
|
1144 |
+
$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);
|
1145 |
+
```
|
1146 |
+
|
1147 |
+
**After**
|
1148 |
+
|
1149 |
+
```php
|
1150 |
+
use Guzzle\Log\ClosureLogAdapter;
|
1151 |
+
use Guzzle\Log\MessageFormatter;
|
1152 |
+
use Guzzle\Plugin\Log\LogPlugin;
|
1153 |
+
|
1154 |
+
/** @var \Guzzle\Http\Client */
|
1155 |
+
$client;
|
1156 |
+
|
1157 |
+
// $format is a string indicating desired message format -- @see MessageFormatter
|
1158 |
+
$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);
|
1159 |
+
```
|
1160 |
+
|
1161 |
+
### Guzzle\Http\Plugin\CurlAuthPlugin
|
1162 |
+
|
1163 |
+
Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`.
|
1164 |
+
|
1165 |
+
### Guzzle\Http\Plugin\ExponentialBackoffPlugin
|
1166 |
+
|
1167 |
+
Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes.
|
1168 |
+
|
1169 |
+
**Before**
|
1170 |
+
|
1171 |
+
```php
|
1172 |
+
use Guzzle\Http\Plugin\ExponentialBackoffPlugin;
|
1173 |
+
|
1174 |
+
$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(
|
1175 |
+
ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)
|
1176 |
+
));
|
1177 |
+
|
1178 |
+
$client->addSubscriber($backoffPlugin);
|
1179 |
+
```
|
1180 |
+
|
1181 |
+
**After**
|
1182 |
+
|
1183 |
+
```php
|
1184 |
+
use Guzzle\Plugin\Backoff\BackoffPlugin;
|
1185 |
+
use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
|
1186 |
+
|
1187 |
+
// Use convenient factory method instead -- see implementation for ideas of what
|
1188 |
+
// you can do with chaining backoff strategies
|
1189 |
+
$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(
|
1190 |
+
HttpBackoffStrategy::getDefaultFailureCodes(), array(429)
|
1191 |
+
));
|
1192 |
+
$client->addSubscriber($backoffPlugin);
|
1193 |
+
```
|
1194 |
+
|
1195 |
+
### Known Issues
|
1196 |
+
|
1197 |
+
#### [BUG] Accept-Encoding header behavior changed unintentionally.
|
1198 |
+
|
1199 |
+
(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)
|
1200 |
+
|
1201 |
+
In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to
|
1202 |
+
properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.
|
1203 |
+
See issue #217 for a workaround, or use a version containing the fix.
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Client.php
ADDED
@@ -0,0 +1,502 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Cookie\CookieJar;
|
5 |
+
use GuzzleHttp\Exception\InvalidArgumentException;
|
6 |
+
use GuzzleHttp\Promise;
|
7 |
+
use GuzzleHttp\Psr7;
|
8 |
+
use Psr\Http\Message\RequestInterface;
|
9 |
+
use Psr\Http\Message\ResponseInterface;
|
10 |
+
use Psr\Http\Message\UriInterface;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* @method ResponseInterface get(string|UriInterface $uri, array $options = [])
|
14 |
+
* @method ResponseInterface head(string|UriInterface $uri, array $options = [])
|
15 |
+
* @method ResponseInterface put(string|UriInterface $uri, array $options = [])
|
16 |
+
* @method ResponseInterface post(string|UriInterface $uri, array $options = [])
|
17 |
+
* @method ResponseInterface patch(string|UriInterface $uri, array $options = [])
|
18 |
+
* @method ResponseInterface delete(string|UriInterface $uri, array $options = [])
|
19 |
+
* @method Promise\PromiseInterface getAsync(string|UriInterface $uri, array $options = [])
|
20 |
+
* @method Promise\PromiseInterface headAsync(string|UriInterface $uri, array $options = [])
|
21 |
+
* @method Promise\PromiseInterface putAsync(string|UriInterface $uri, array $options = [])
|
22 |
+
* @method Promise\PromiseInterface postAsync(string|UriInterface $uri, array $options = [])
|
23 |
+
* @method Promise\PromiseInterface patchAsync(string|UriInterface $uri, array $options = [])
|
24 |
+
* @method Promise\PromiseInterface deleteAsync(string|UriInterface $uri, array $options = [])
|
25 |
+
*/
|
26 |
+
class Client implements ClientInterface
|
27 |
+
{
|
28 |
+
/** @var array Default request options */
|
29 |
+
private $config;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Clients accept an array of constructor parameters.
|
33 |
+
*
|
34 |
+
* Here's an example of creating a client using a base_uri and an array of
|
35 |
+
* default request options to apply to each request:
|
36 |
+
*
|
37 |
+
* $client = new Client([
|
38 |
+
* 'base_uri' => 'http://www.foo.com/1.0/',
|
39 |
+
* 'timeout' => 0,
|
40 |
+
* 'allow_redirects' => false,
|
41 |
+
* 'proxy' => '192.168.16.1:10'
|
42 |
+
* ]);
|
43 |
+
*
|
44 |
+
* Client configuration settings include the following options:
|
45 |
+
*
|
46 |
+
* - handler: (callable) Function that transfers HTTP requests over the
|
47 |
+
* wire. The function is called with a Psr7\Http\Message\RequestInterface
|
48 |
+
* and array of transfer options, and must return a
|
49 |
+
* GuzzleHttp\Promise\PromiseInterface that is fulfilled with a
|
50 |
+
* Psr7\Http\Message\ResponseInterface on success. "handler" is a
|
51 |
+
* constructor only option that cannot be overridden in per/request
|
52 |
+
* options. If no handler is provided, a default handler will be created
|
53 |
+
* that enables all of the request options below by attaching all of the
|
54 |
+
* default middleware to the handler.
|
55 |
+
* - base_uri: (string|UriInterface) Base URI of the client that is merged
|
56 |
+
* into relative URIs. Can be a string or instance of UriInterface.
|
57 |
+
* - **: any request option
|
58 |
+
*
|
59 |
+
* @param array $config Client configuration settings.
|
60 |
+
*
|
61 |
+
* @see \GuzzleHttp\RequestOptions for a list of available request options.
|
62 |
+
*/
|
63 |
+
public function __construct(array $config = [])
|
64 |
+
{
|
65 |
+
if (!isset($config['handler'])) {
|
66 |
+
$config['handler'] = HandlerStack::create();
|
67 |
+
} elseif (!is_callable($config['handler'])) {
|
68 |
+
throw new \InvalidArgumentException('handler must be a callable');
|
69 |
+
}
|
70 |
+
|
71 |
+
// Convert the base_uri to a UriInterface
|
72 |
+
if (isset($config['base_uri'])) {
|
73 |
+
$config['base_uri'] = Psr7\uri_for($config['base_uri']);
|
74 |
+
}
|
75 |
+
|
76 |
+
$this->configureDefaults($config);
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* @param string $method
|
81 |
+
* @param array $args
|
82 |
+
*
|
83 |
+
* @return Promise\PromiseInterface
|
84 |
+
*/
|
85 |
+
public function __call($method, $args)
|
86 |
+
{
|
87 |
+
if (count($args) < 1) {
|
88 |
+
throw new \InvalidArgumentException('Magic request methods require a URI and optional options array');
|
89 |
+
}
|
90 |
+
|
91 |
+
$uri = $args[0];
|
92 |
+
$opts = isset($args[1]) ? $args[1] : [];
|
93 |
+
|
94 |
+
return substr($method, -5) === 'Async'
|
95 |
+
? $this->requestAsync(substr($method, 0, -5), $uri, $opts)
|
96 |
+
: $this->request($method, $uri, $opts);
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Asynchronously send an HTTP request.
|
101 |
+
*
|
102 |
+
* @param array $options Request options to apply to the given
|
103 |
+
* request and to the transfer. See \GuzzleHttp\RequestOptions.
|
104 |
+
*
|
105 |
+
* @return Promise\PromiseInterface
|
106 |
+
*/
|
107 |
+
public function sendAsync(RequestInterface $request, array $options = [])
|
108 |
+
{
|
109 |
+
// Merge the base URI into the request URI if needed.
|
110 |
+
$options = $this->prepareDefaults($options);
|
111 |
+
|
112 |
+
return $this->transfer(
|
113 |
+
$request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),
|
114 |
+
$options
|
115 |
+
);
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Send an HTTP request.
|
120 |
+
*
|
121 |
+
* @param array $options Request options to apply to the given
|
122 |
+
* request and to the transfer. See \GuzzleHttp\RequestOptions.
|
123 |
+
*
|
124 |
+
* @return ResponseInterface
|
125 |
+
* @throws GuzzleException
|
126 |
+
*/
|
127 |
+
public function send(RequestInterface $request, array $options = [])
|
128 |
+
{
|
129 |
+
$options[RequestOptions::SYNCHRONOUS] = true;
|
130 |
+
return $this->sendAsync($request, $options)->wait();
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Create and send an asynchronous HTTP request.
|
135 |
+
*
|
136 |
+
* Use an absolute path to override the base path of the client, or a
|
137 |
+
* relative path to append to the base path of the client. The URL can
|
138 |
+
* contain the query string as well. Use an array to provide a URL
|
139 |
+
* template and additional variables to use in the URL template expansion.
|
140 |
+
*
|
141 |
+
* @param string $method HTTP method
|
142 |
+
* @param string|UriInterface $uri URI object or string.
|
143 |
+
* @param array $options Request options to apply. See \GuzzleHttp\RequestOptions.
|
144 |
+
*
|
145 |
+
* @return Promise\PromiseInterface
|
146 |
+
*/
|
147 |
+
public function requestAsync($method, $uri = '', array $options = [])
|
148 |
+
{
|
149 |
+
$options = $this->prepareDefaults($options);
|
150 |
+
// Remove request modifying parameter because it can be done up-front.
|
151 |
+
$headers = isset($options['headers']) ? $options['headers'] : [];
|
152 |
+
$body = isset($options['body']) ? $options['body'] : null;
|
153 |
+
$version = isset($options['version']) ? $options['version'] : '1.1';
|
154 |
+
// Merge the URI into the base URI.
|
155 |
+
$uri = $this->buildUri($uri, $options);
|
156 |
+
if (is_array($body)) {
|
157 |
+
$this->invalidBody();
|
158 |
+
}
|
159 |
+
$request = new Psr7\Request($method, $uri, $headers, $body, $version);
|
160 |
+
// Remove the option so that they are not doubly-applied.
|
161 |
+
unset($options['headers'], $options['body'], $options['version']);
|
162 |
+
|
163 |
+
return $this->transfer($request, $options);
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* Create and send an HTTP request.
|
168 |
+
*
|
169 |
+
* Use an absolute path to override the base path of the client, or a
|
170 |
+
* relative path to append to the base path of the client. The URL can
|
171 |
+
* contain the query string as well.
|
172 |
+
*
|
173 |
+
* @param string $method HTTP method.
|
174 |
+
* @param string|UriInterface $uri URI object or string.
|
175 |
+
* @param array $options Request options to apply. See \GuzzleHttp\RequestOptions.
|
176 |
+
*
|
177 |
+
* @return ResponseInterface
|
178 |
+
* @throws GuzzleException
|
179 |
+
*/
|
180 |
+
public function request($method, $uri = '', array $options = [])
|
181 |
+
{
|
182 |
+
$options[RequestOptions::SYNCHRONOUS] = true;
|
183 |
+
return $this->requestAsync($method, $uri, $options)->wait();
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Get a client configuration option.
|
188 |
+
*
|
189 |
+
* These options include default request options of the client, a "handler"
|
190 |
+
* (if utilized by the concrete client), and a "base_uri" if utilized by
|
191 |
+
* the concrete client.
|
192 |
+
*
|
193 |
+
* @param string|null $option The config option to retrieve.
|
194 |
+
*
|
195 |
+
* @return mixed
|
196 |
+
*/
|
197 |
+
public function getConfig($option = null)
|
198 |
+
{
|
199 |
+
return $option === null
|
200 |
+
? $this->config
|
201 |
+
: (isset($this->config[$option]) ? $this->config[$option] : null);
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* @param string|null $uri
|
206 |
+
*
|
207 |
+
* @return UriInterface
|
208 |
+
*/
|
209 |
+
private function buildUri($uri, array $config)
|
210 |
+
{
|
211 |
+
// for BC we accept null which would otherwise fail in uri_for
|
212 |
+
$uri = Psr7\uri_for($uri === null ? '' : $uri);
|
213 |
+
|
214 |
+
if (isset($config['base_uri'])) {
|
215 |
+
$uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri);
|
216 |
+
}
|
217 |
+
|
218 |
+
if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) {
|
219 |
+
$idnOptions = ($config['idn_conversion'] === true) ? IDNA_DEFAULT : $config['idn_conversion'];
|
220 |
+
$uri = Utils::idnUriConvert($uri, $idnOptions);
|
221 |
+
}
|
222 |
+
|
223 |
+
return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Configures the default options for a client.
|
228 |
+
*
|
229 |
+
* @param array $config
|
230 |
+
* @return void
|
231 |
+
*/
|
232 |
+
private function configureDefaults(array $config)
|
233 |
+
{
|
234 |
+
$defaults = [
|
235 |
+
'allow_redirects' => RedirectMiddleware::$defaultSettings,
|
236 |
+
'http_errors' => true,
|
237 |
+
'decode_content' => true,
|
238 |
+
'verify' => true,
|
239 |
+
'cookies' => false,
|
240 |
+
'idn_conversion' => true,
|
241 |
+
];
|
242 |
+
|
243 |
+
// Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
|
244 |
+
|
245 |
+
// We can only trust the HTTP_PROXY environment variable in a CLI
|
246 |
+
// process due to the fact that PHP has no reliable mechanism to
|
247 |
+
// get environment variables that start with "HTTP_".
|
248 |
+
if (php_sapi_name() === 'cli' && getenv('HTTP_PROXY')) {
|
249 |
+
$defaults['proxy']['http'] = getenv('HTTP_PROXY');
|
250 |
+
}
|
251 |
+
|
252 |
+
if ($proxy = getenv('HTTPS_PROXY')) {
|
253 |
+
$defaults['proxy']['https'] = $proxy;
|
254 |
+
}
|
255 |
+
|
256 |
+
if ($noProxy = getenv('NO_PROXY')) {
|
257 |
+
$cleanedNoProxy = str_replace(' ', '', $noProxy);
|
258 |
+
$defaults['proxy']['no'] = explode(',', $cleanedNoProxy);
|
259 |
+
}
|
260 |
+
|
261 |
+
$this->config = $config + $defaults;
|
262 |
+
|
263 |
+
if (!empty($config['cookies']) && $config['cookies'] === true) {
|
264 |
+
$this->config['cookies'] = new CookieJar();
|
265 |
+
}
|
266 |
+
|
267 |
+
// Add the default user-agent header.
|
268 |
+
if (!isset($this->config['headers'])) {
|
269 |
+
$this->config['headers'] = ['User-Agent' => default_user_agent()];
|
270 |
+
} else {
|
271 |
+
// Add the User-Agent header if one was not already set.
|
272 |
+
foreach (array_keys($this->config['headers']) as $name) {
|
273 |
+
if (strtolower($name) === 'user-agent') {
|
274 |
+
return;
|
275 |
+
}
|
276 |
+
}
|
277 |
+
$this->config['headers']['User-Agent'] = default_user_agent();
|
278 |
+
}
|
279 |
+
}
|
280 |
+
|
281 |
+
/**
|
282 |
+
* Merges default options into the array.
|
283 |
+
*
|
284 |
+
* @param array $options Options to modify by reference
|
285 |
+
*
|
286 |
+
* @return array
|
287 |
+
*/
|
288 |
+
private function prepareDefaults(array $options)
|
289 |
+
{
|
290 |
+
$defaults = $this->config;
|
291 |
+
|
292 |
+
if (!empty($defaults['headers'])) {
|
293 |
+
// Default headers are only added if they are not present.
|
294 |
+
$defaults['_conditional'] = $defaults['headers'];
|
295 |
+
unset($defaults['headers']);
|
296 |
+
}
|
297 |
+
|
298 |
+
// Special handling for headers is required as they are added as
|
299 |
+
// conditional headers and as headers passed to a request ctor.
|
300 |
+
if (array_key_exists('headers', $options)) {
|
301 |
+
// Allows default headers to be unset.
|
302 |
+
if ($options['headers'] === null) {
|
303 |
+
$defaults['_conditional'] = [];
|
304 |
+
unset($options['headers']);
|
305 |
+
} elseif (!is_array($options['headers'])) {
|
306 |
+
throw new \InvalidArgumentException('headers must be an array');
|
307 |
+
}
|
308 |
+
}
|
309 |
+
|
310 |
+
// Shallow merge defaults underneath options.
|
311 |
+
$result = $options + $defaults;
|
312 |
+
|
313 |
+
// Remove null values.
|
314 |
+
foreach ($result as $k => $v) {
|
315 |
+
if ($v === null) {
|
316 |
+
unset($result[$k]);
|
317 |
+
}
|
318 |
+
}
|
319 |
+
|
320 |
+
return $result;
|
321 |
+
}
|
322 |
+
|
323 |
+
/**
|
324 |
+
* Transfers the given request and applies request options.
|
325 |
+
*
|
326 |
+
* The URI of the request is not modified and the request options are used
|
327 |
+
* as-is without merging in default options.
|
328 |
+
*
|
329 |
+
* @param array $options See \GuzzleHttp\RequestOptions.
|
330 |
+
*
|
331 |
+
* @return Promise\PromiseInterface
|
332 |
+
*/
|
333 |
+
private function transfer(RequestInterface $request, array $options)
|
334 |
+
{
|
335 |
+
// save_to -> sink
|
336 |
+
if (isset($options['save_to'])) {
|
337 |
+
$options['sink'] = $options['save_to'];
|
338 |
+
unset($options['save_to']);
|
339 |
+
}
|
340 |
+
|
341 |
+
// exceptions -> http_errors
|
342 |
+
if (isset($options['exceptions'])) {
|
343 |
+
$options['http_errors'] = $options['exceptions'];
|
344 |
+
unset($options['exceptions']);
|
345 |
+
}
|
346 |
+
|
347 |
+
$request = $this->applyOptions($request, $options);
|
348 |
+
/** @var HandlerStack $handler */
|
349 |
+
$handler = $options['handler'];
|
350 |
+
|
351 |
+
try {
|
352 |
+
return Promise\promise_for($handler($request, $options));
|
353 |
+
} catch (\Exception $e) {
|
354 |
+
return Promise\rejection_for($e);
|
355 |
+
}
|
356 |
+
}
|
357 |
+
|
358 |
+
/**
|
359 |
+
* Applies the array of request options to a request.
|
360 |
+
*
|
361 |
+
* @param RequestInterface $request
|
362 |
+
* @param array $options
|
363 |
+
*
|
364 |
+
* @return RequestInterface
|
365 |
+
*/
|
366 |
+
private function applyOptions(RequestInterface $request, array &$options)
|
367 |
+
{
|
368 |
+
$modify = [
|
369 |
+
'set_headers' => [],
|
370 |
+
];
|
371 |
+
|
372 |
+
if (isset($options['headers'])) {
|
373 |
+
$modify['set_headers'] = $options['headers'];
|
374 |
+
unset($options['headers']);
|
375 |
+
}
|
376 |
+
|
377 |
+
if (isset($options['form_params'])) {
|
378 |
+
if (isset($options['multipart'])) {
|
379 |
+
throw new \InvalidArgumentException('You cannot use '
|
380 |
+
. 'form_params and multipart at the same time. Use the '
|
381 |
+
. 'form_params option if you want to send application/'
|
382 |
+
. 'x-www-form-urlencoded requests, and the multipart '
|
383 |
+
. 'option to send multipart/form-data requests.');
|
384 |
+
}
|
385 |
+
$options['body'] = http_build_query($options['form_params'], '', '&');
|
386 |
+
unset($options['form_params']);
|
387 |
+
// Ensure that we don't have the header in different case and set the new value.
|
388 |
+
$options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
|
389 |
+
$options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';
|
390 |
+
}
|
391 |
+
|
392 |
+
if (isset($options['multipart'])) {
|
393 |
+
$options['body'] = new Psr7\MultipartStream($options['multipart']);
|
394 |
+
unset($options['multipart']);
|
395 |
+
}
|
396 |
+
|
397 |
+
if (isset($options['json'])) {
|
398 |
+
$options['body'] = \GuzzleHttp\json_encode($options['json']);
|
399 |
+
unset($options['json']);
|
400 |
+
// Ensure that we don't have the header in different case and set the new value.
|
401 |
+
$options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
|
402 |
+
$options['_conditional']['Content-Type'] = 'application/json';
|
403 |
+
}
|
404 |
+
|
405 |
+
if (!empty($options['decode_content'])
|
406 |
+
&& $options['decode_content'] !== true
|
407 |
+
) {
|
408 |
+
// Ensure that we don't have the header in different case and set the new value.
|
409 |
+
$options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']);
|
410 |
+
$modify['set_headers']['Accept-Encoding'] = $options['decode_content'];
|
411 |
+
}
|
412 |
+
|
413 |
+
if (isset($options['body'])) {
|
414 |
+
if (is_array($options['body'])) {
|
415 |
+
$this->invalidBody();
|
416 |
+
}
|
417 |
+
$modify['body'] = Psr7\stream_for($options['body']);
|
418 |
+
unset($options['body']);
|
419 |
+
}
|
420 |
+
|
421 |
+
if (!empty($options['auth']) && is_array($options['auth'])) {
|
422 |
+
$value = $options['auth'];
|
423 |
+
$type = isset($value[2]) ? strtolower($value[2]) : 'basic';
|
424 |
+
switch ($type) {
|
425 |
+
case 'basic':
|
426 |
+
// Ensure that we don't have the header in different case and set the new value.
|
427 |
+
$modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']);
|
428 |
+
$modify['set_headers']['Authorization'] = 'Basic '
|
429 |
+
. base64_encode("$value[0]:$value[1]");
|
430 |
+
break;
|
431 |
+
case 'digest':
|
432 |
+
// @todo: Do not rely on curl
|
433 |
+
$options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST;
|
434 |
+
$options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]";
|
435 |
+
break;
|
436 |
+
case 'ntlm':
|
437 |
+
$options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM;
|
438 |
+
$options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]";
|
439 |
+
break;
|
440 |
+
}
|
441 |
+
}
|
442 |
+
|
443 |
+
if (isset($options['query'])) {
|
444 |
+
$value = $options['query'];
|
445 |
+
if (is_array($value)) {
|
446 |
+
$value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);
|
447 |
+
}
|
448 |
+
if (!is_string($value)) {
|
449 |
+
throw new \InvalidArgumentException('query must be a string or array');
|
450 |
+
}
|
451 |
+
$modify['query'] = $value;
|
452 |
+
unset($options['query']);
|
453 |
+
}
|
454 |
+
|
455 |
+
// Ensure that sink is not an invalid value.
|
456 |
+
if (isset($options['sink'])) {
|
457 |
+
// TODO: Add more sink validation?
|
458 |
+
if (is_bool($options['sink'])) {
|
459 |
+
throw new \InvalidArgumentException('sink must not be a boolean');
|
460 |
+
}
|
461 |
+
}
|
462 |
+
|
463 |
+
$request = Psr7\modify_request($request, $modify);
|
464 |
+
if ($request->getBody() instanceof Psr7\MultipartStream) {
|
465 |
+
// Use a multipart/form-data POST if a Content-Type is not set.
|
466 |
+
// Ensure that we don't have the header in different case and set the new value.
|
467 |
+
$options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
|
468 |
+
$options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
|
469 |
+
. $request->getBody()->getBoundary();
|
470 |
+
}
|
471 |
+
|
472 |
+
// Merge in conditional headers if they are not present.
|
473 |
+
if (isset($options['_conditional'])) {
|
474 |
+
// Build up the changes so it's in a single clone of the message.
|
475 |
+
$modify = [];
|
476 |
+
foreach ($options['_conditional'] as $k => $v) {
|
477 |
+
if (!$request->hasHeader($k)) {
|
478 |
+
$modify['set_headers'][$k] = $v;
|
479 |
+
}
|
480 |
+
}
|
481 |
+
$request = Psr7\modify_request($request, $modify);
|
482 |
+
// Don't pass this internal value along to middleware/handlers.
|
483 |
+
unset($options['_conditional']);
|
484 |
+
}
|
485 |
+
|
486 |
+
return $request;
|
487 |
+
}
|
488 |
+
|
489 |
+
/**
|
490 |
+
* Throw Exception with pre-set message.
|
491 |
+
* @return void
|
492 |
+
* @throws InvalidArgumentException Invalid body.
|
493 |
+
*/
|
494 |
+
private function invalidBody()
|
495 |
+
{
|
496 |
+
throw new \InvalidArgumentException('Passing in the "body" request '
|
497 |
+
. 'option as an array to send a POST request has been deprecated. '
|
498 |
+
. 'Please use the "form_params" request option to send a '
|
499 |
+
. 'application/x-www-form-urlencoded request, or the "multipart" '
|
500 |
+
. 'request option to send a multipart/form-data request.');
|
501 |
+
}
|
502 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/ClientInterface.php
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\GuzzleException;
|
5 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
6 |
+
use Psr\Http\Message\RequestInterface;
|
7 |
+
use Psr\Http\Message\ResponseInterface;
|
8 |
+
use Psr\Http\Message\UriInterface;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Client interface for sending HTTP requests.
|
12 |
+
*/
|
13 |
+
interface ClientInterface
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* @deprecated Will be removed in Guzzle 7.0.0
|
17 |
+
*/
|
18 |
+
const VERSION = '6.5.3';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Send an HTTP request.
|
22 |
+
*
|
23 |
+
* @param RequestInterface $request Request to send
|
24 |
+
* @param array $options Request options to apply to the given
|
25 |
+
* request and to the transfer.
|
26 |
+
*
|
27 |
+
* @return ResponseInterface
|
28 |
+
* @throws GuzzleException
|
29 |
+
*/
|
30 |
+
public function send(RequestInterface $request, array $options = []);
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Asynchronously send an HTTP request.
|
34 |
+
*
|
35 |
+
* @param RequestInterface $request Request to send
|
36 |
+
* @param array $options Request options to apply to the given
|
37 |
+
* request and to the transfer.
|
38 |
+
*
|
39 |
+
* @return PromiseInterface
|
40 |
+
*/
|
41 |
+
public function sendAsync(RequestInterface $request, array $options = []);
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Create and send an HTTP request.
|
45 |
+
*
|
46 |
+
* Use an absolute path to override the base path of the client, or a
|
47 |
+
* relative path to append to the base path of the client. The URL can
|
48 |
+
* contain the query string as well.
|
49 |
+
*
|
50 |
+
* @param string $method HTTP method.
|
51 |
+
* @param string|UriInterface $uri URI object or string.
|
52 |
+
* @param array $options Request options to apply.
|
53 |
+
*
|
54 |
+
* @return ResponseInterface
|
55 |
+
* @throws GuzzleException
|
56 |
+
*/
|
57 |
+
public function request($method, $uri, array $options = []);
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Create and send an asynchronous HTTP request.
|
61 |
+
*
|
62 |
+
* Use an absolute path to override the base path of the client, or a
|
63 |
+
* relative path to append to the base path of the client. The URL can
|
64 |
+
* contain the query string as well. Use an array to provide a URL
|
65 |
+
* template and additional variables to use in the URL template expansion.
|
66 |
+
*
|
67 |
+
* @param string $method HTTP method
|
68 |
+
* @param string|UriInterface $uri URI object or string.
|
69 |
+
* @param array $options Request options to apply.
|
70 |
+
*
|
71 |
+
* @return PromiseInterface
|
72 |
+
*/
|
73 |
+
public function requestAsync($method, $uri, array $options = []);
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Get a client configuration option.
|
77 |
+
*
|
78 |
+
* These options include default request options of the client, a "handler"
|
79 |
+
* (if utilized by the concrete client), and a "base_uri" if utilized by
|
80 |
+
* the concrete client.
|
81 |
+
*
|
82 |
+
* @param string|null $option The config option to retrieve.
|
83 |
+
*
|
84 |
+
* @return mixed
|
85 |
+
*/
|
86 |
+
public function getConfig($option = null);
|
87 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/CookieJar.php
ADDED
@@ -0,0 +1,316 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Cookie;
|
3 |
+
|
4 |
+
use Psr\Http\Message\RequestInterface;
|
5 |
+
use Psr\Http\Message\ResponseInterface;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Cookie jar that stores cookies as an array
|
9 |
+
*/
|
10 |
+
class CookieJar implements CookieJarInterface
|
11 |
+
{
|
12 |
+
/** @var SetCookie[] Loaded cookie data */
|
13 |
+
private $cookies = [];
|
14 |
+
|
15 |
+
/** @var bool */
|
16 |
+
private $strictMode;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @param bool $strictMode Set to true to throw exceptions when invalid
|
20 |
+
* cookies are added to the cookie jar.
|
21 |
+
* @param array $cookieArray Array of SetCookie objects or a hash of
|
22 |
+
* arrays that can be used with the SetCookie
|
23 |
+
* constructor
|
24 |
+
*/
|
25 |
+
public function __construct($strictMode = false, $cookieArray = [])
|
26 |
+
{
|
27 |
+
$this->strictMode = $strictMode;
|
28 |
+
|
29 |
+
foreach ($cookieArray as $cookie) {
|
30 |
+
if (!($cookie instanceof SetCookie)) {
|
31 |
+
$cookie = new SetCookie($cookie);
|
32 |
+
}
|
33 |
+
$this->setCookie($cookie);
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Create a new Cookie jar from an associative array and domain.
|
39 |
+
*
|
40 |
+
* @param array $cookies Cookies to create the jar from
|
41 |
+
* @param string $domain Domain to set the cookies to
|
42 |
+
*
|
43 |
+
* @return self
|
44 |
+
*/
|
45 |
+
public static function fromArray(array $cookies, $domain)
|
46 |
+
{
|
47 |
+
$cookieJar = new self();
|
48 |
+
foreach ($cookies as $name => $value) {
|
49 |
+
$cookieJar->setCookie(new SetCookie([
|
50 |
+
'Domain' => $domain,
|
51 |
+
'Name' => $name,
|
52 |
+
'Value' => $value,
|
53 |
+
'Discard' => true
|
54 |
+
]));
|
55 |
+
}
|
56 |
+
|
57 |
+
return $cookieJar;
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* @deprecated
|
62 |
+
*/
|
63 |
+
public static function getCookieValue($value)
|
64 |
+
{
|
65 |
+
return $value;
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Evaluate if this cookie should be persisted to storage
|
70 |
+
* that survives between requests.
|
71 |
+
*
|
72 |
+
* @param SetCookie $cookie Being evaluated.
|
73 |
+
* @param bool $allowSessionCookies If we should persist session cookies
|
74 |
+
* @return bool
|
75 |
+
*/
|
76 |
+
public static function shouldPersist(
|
77 |
+
SetCookie $cookie,
|
78 |
+
$allowSessionCookies = false
|
79 |
+
) {
|
80 |
+
if ($cookie->getExpires() || $allowSessionCookies) {
|
81 |
+
if (!$cookie->getDiscard()) {
|
82 |
+
return true;
|
83 |
+
}
|
84 |
+
}
|
85 |
+
|
86 |
+
return false;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Finds and returns the cookie based on the name
|
91 |
+
*
|
92 |
+
* @param string $name cookie name to search for
|
93 |
+
* @return SetCookie|null cookie that was found or null if not found
|
94 |
+
*/
|
95 |
+
public function getCookieByName($name)
|
96 |
+
{
|
97 |
+
// don't allow a non string name
|
98 |
+
if ($name === null || !is_scalar($name)) {
|
99 |
+
return null;
|
100 |
+
}
|
101 |
+
foreach ($this->cookies as $cookie) {
|
102 |
+
if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {
|
103 |
+
return $cookie;
|
104 |
+
}
|
105 |
+
}
|
106 |
+
|
107 |
+
return null;
|
108 |
+
}
|
109 |
+
|
110 |
+
public function toArray()
|
111 |
+
{
|
112 |
+
return array_map(function (SetCookie $cookie) {
|
113 |
+
return $cookie->toArray();
|
114 |
+
}, $this->getIterator()->getArrayCopy());
|
115 |
+
}
|
116 |
+
|
117 |
+
public function clear($domain = null, $path = null, $name = null)
|
118 |
+
{
|
119 |
+
if (!$domain) {
|
120 |
+
$this->cookies = [];
|
121 |
+
return;
|
122 |
+
} elseif (!$path) {
|
123 |
+
$this->cookies = array_filter(
|
124 |
+
$this->cookies,
|
125 |
+
function (SetCookie $cookie) use ($domain) {
|
126 |
+
return !$cookie->matchesDomain($domain);
|
127 |
+
}
|
128 |
+
);
|
129 |
+
} elseif (!$name) {
|
130 |
+
$this->cookies = array_filter(
|
131 |
+
$this->cookies,
|
132 |
+
function (SetCookie $cookie) use ($path, $domain) {
|
133 |
+
return !($cookie->matchesPath($path) &&
|
134 |
+
$cookie->matchesDomain($domain));
|
135 |
+
}
|
136 |
+
);
|
137 |
+
} else {
|
138 |
+
$this->cookies = array_filter(
|
139 |
+
$this->cookies,
|
140 |
+
function (SetCookie $cookie) use ($path, $domain, $name) {
|
141 |
+
return !($cookie->getName() == $name &&
|
142 |
+
$cookie->matchesPath($path) &&
|
143 |
+
$cookie->matchesDomain($domain));
|
144 |
+
}
|
145 |
+
);
|
146 |
+
}
|
147 |
+
}
|
148 |
+
|
149 |
+
public function clearSessionCookies()
|
150 |
+
{
|
151 |
+
$this->cookies = array_filter(
|
152 |
+
$this->cookies,
|
153 |
+
function (SetCookie $cookie) {
|
154 |
+
return !$cookie->getDiscard() && $cookie->getExpires();
|
155 |
+
}
|
156 |
+
);
|
157 |
+
}
|
158 |
+
|
159 |
+
public function setCookie(SetCookie $cookie)
|
160 |
+
{
|
161 |
+
// If the name string is empty (but not 0), ignore the set-cookie
|
162 |
+
// string entirely.
|
163 |
+
$name = $cookie->getName();
|
164 |
+
if (!$name && $name !== '0') {
|
165 |
+
return false;
|
166 |
+
}
|
167 |
+
|
168 |
+
// Only allow cookies with set and valid domain, name, value
|
169 |
+
$result = $cookie->validate();
|
170 |
+
if ($result !== true) {
|
171 |
+
if ($this->strictMode) {
|
172 |
+
throw new \RuntimeException('Invalid cookie: ' . $result);
|
173 |
+
} else {
|
174 |
+
$this->removeCookieIfEmpty($cookie);
|
175 |
+
return false;
|
176 |
+
}
|
177 |
+
}
|
178 |
+
|
179 |
+
// Resolve conflicts with previously set cookies
|
180 |
+
foreach ($this->cookies as $i => $c) {
|
181 |
+
|
182 |
+
// Two cookies are identical, when their path, and domain are
|
183 |
+
// identical.
|
184 |
+
if ($c->getPath() != $cookie->getPath() ||
|
185 |
+
$c->getDomain() != $cookie->getDomain() ||
|
186 |
+
$c->getName() != $cookie->getName()
|
187 |
+
) {
|
188 |
+
continue;
|
189 |
+
}
|
190 |
+
|
191 |
+
// The previously set cookie is a discard cookie and this one is
|
192 |
+
// not so allow the new cookie to be set
|
193 |
+
if (!$cookie->getDiscard() && $c->getDiscard()) {
|
194 |
+
unset($this->cookies[$i]);
|
195 |
+
continue;
|
196 |
+
}
|
197 |
+
|
198 |
+
// If the new cookie's expiration is further into the future, then
|
199 |
+
// replace the old cookie
|
200 |
+
if ($cookie->getExpires() > $c->getExpires()) {
|
201 |
+
unset($this->cookies[$i]);
|
202 |
+
continue;
|
203 |
+
}
|
204 |
+
|
205 |
+
// If the value has changed, we better change it
|
206 |
+
if ($cookie->getValue() !== $c->getValue()) {
|
207 |
+
unset($this->cookies[$i]);
|
208 |
+
continue;
|
209 |
+
}
|
210 |
+
|
211 |
+
// The cookie exists, so no need to continue
|
212 |
+
return false;
|
213 |
+
}
|
214 |
+
|
215 |
+
$this->cookies[] = $cookie;
|
216 |
+
|
217 |
+
return true;
|
218 |
+
}
|
219 |
+
|
220 |
+
public function count()
|
221 |
+
{
|
222 |
+
return count($this->cookies);
|
223 |
+
}
|
224 |
+
|
225 |
+
public function getIterator()
|
226 |
+
{
|
227 |
+
return new \ArrayIterator(array_values($this->cookies));
|
228 |
+
}
|
229 |
+
|
230 |
+
public function extractCookies(
|
231 |
+
RequestInterface $request,
|
232 |
+
ResponseInterface $response
|
233 |
+
) {
|
234 |
+
if ($cookieHeader = $response->getHeader('Set-Cookie')) {
|
235 |
+
foreach ($cookieHeader as $cookie) {
|
236 |
+
$sc = SetCookie::fromString($cookie);
|
237 |
+
if (!$sc->getDomain()) {
|
238 |
+
$sc->setDomain($request->getUri()->getHost());
|
239 |
+
}
|
240 |
+
if (0 !== strpos($sc->getPath(), '/')) {
|
241 |
+
$sc->setPath($this->getCookiePathFromRequest($request));
|
242 |
+
}
|
243 |
+
$this->setCookie($sc);
|
244 |
+
}
|
245 |
+
}
|
246 |
+
}
|
247 |
+
|
248 |
+
/**
|
249 |
+
* Computes cookie path following RFC 6265 section 5.1.4
|
250 |
+
*
|
251 |
+
* @link https://tools.ietf.org/html/rfc6265#section-5.1.4
|
252 |
+
*
|
253 |
+
* @param RequestInterface $request
|
254 |
+
* @return string
|
255 |
+
*/
|
256 |
+
private function getCookiePathFromRequest(RequestInterface $request)
|
257 |
+
{
|
258 |
+
$uriPath = $request->getUri()->getPath();
|
259 |
+
if ('' === $uriPath) {
|
260 |
+
return '/';
|
261 |
+
}
|
262 |
+
if (0 !== strpos($uriPath, '/')) {
|
263 |
+
return '/';
|
264 |
+
}
|
265 |
+
if ('/' === $uriPath) {
|
266 |
+
return '/';
|
267 |
+
}
|
268 |
+
if (0 === $lastSlashPos = strrpos($uriPath, '/')) {
|
269 |
+
return '/';
|
270 |
+
}
|
271 |
+
|
272 |
+
return substr($uriPath, 0, $lastSlashPos);
|
273 |
+
}
|
274 |
+
|
275 |
+
public function withCookieHeader(RequestInterface $request)
|
276 |
+
{
|
277 |
+
$values = [];
|
278 |
+
$uri = $request->getUri();
|
279 |
+
$scheme = $uri->getScheme();
|
280 |
+
$host = $uri->getHost();
|
281 |
+
$path = $uri->getPath() ?: '/';
|
282 |
+
|
283 |
+
foreach ($this->cookies as $cookie) {
|
284 |
+
if ($cookie->matchesPath($path) &&
|
285 |
+
$cookie->matchesDomain($host) &&
|
286 |
+
!$cookie->isExpired() &&
|
287 |
+
(!$cookie->getSecure() || $scheme === 'https')
|
288 |
+
) {
|
289 |
+
$values[] = $cookie->getName() . '='
|
290 |
+
. $cookie->getValue();
|
291 |
+
}
|
292 |
+
}
|
293 |
+
|
294 |
+
return $values
|
295 |
+
? $request->withHeader('Cookie', implode('; ', $values))
|
296 |
+
: $request;
|
297 |
+
}
|
298 |
+
|
299 |
+
/**
|
300 |
+
* If a cookie already exists and the server asks to set it again with a
|
301 |
+
* null value, the cookie must be deleted.
|
302 |
+
*
|
303 |
+
* @param SetCookie $cookie
|
304 |
+
*/
|
305 |
+
private function removeCookieIfEmpty(SetCookie $cookie)
|
306 |
+
{
|
307 |
+
$cookieValue = $cookie->getValue();
|
308 |
+
if ($cookieValue === null || $cookieValue === '') {
|
309 |
+
$this->clear(
|
310 |
+
$cookie->getDomain(),
|
311 |
+
$cookie->getPath(),
|
312 |
+
$cookie->getName()
|
313 |
+
);
|
314 |
+
}
|
315 |
+
}
|
316 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Cookie;
|
3 |
+
|
4 |
+
use Psr\Http\Message\RequestInterface;
|
5 |
+
use Psr\Http\Message\ResponseInterface;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Stores HTTP cookies.
|
9 |
+
*
|
10 |
+
* It extracts cookies from HTTP requests, and returns them in HTTP responses.
|
11 |
+
* CookieJarInterface instances automatically expire contained cookies when
|
12 |
+
* necessary. Subclasses are also responsible for storing and retrieving
|
13 |
+
* cookies from a file, database, etc.
|
14 |
+
*
|
15 |
+
* @link http://docs.python.org/2/library/cookielib.html Inspiration
|
16 |
+
*/
|
17 |
+
interface CookieJarInterface extends \Countable, \IteratorAggregate
|
18 |
+
{
|
19 |
+
/**
|
20 |
+
* Create a request with added cookie headers.
|
21 |
+
*
|
22 |
+
* If no matching cookies are found in the cookie jar, then no Cookie
|
23 |
+
* header is added to the request and the same request is returned.
|
24 |
+
*
|
25 |
+
* @param RequestInterface $request Request object to modify.
|
26 |
+
*
|
27 |
+
* @return RequestInterface returns the modified request.
|
28 |
+
*/
|
29 |
+
public function withCookieHeader(RequestInterface $request);
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Extract cookies from an HTTP response and store them in the CookieJar.
|
33 |
+
*
|
34 |
+
* @param RequestInterface $request Request that was sent
|
35 |
+
* @param ResponseInterface $response Response that was received
|
36 |
+
*/
|
37 |
+
public function extractCookies(
|
38 |
+
RequestInterface $request,
|
39 |
+
ResponseInterface $response
|
40 |
+
);
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Sets a cookie in the cookie jar.
|
44 |
+
*
|
45 |
+
* @param SetCookie $cookie Cookie to set.
|
46 |
+
*
|
47 |
+
* @return bool Returns true on success or false on failure
|
48 |
+
*/
|
49 |
+
public function setCookie(SetCookie $cookie);
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Remove cookies currently held in the cookie jar.
|
53 |
+
*
|
54 |
+
* Invoking this method without arguments will empty the whole cookie jar.
|
55 |
+
* If given a $domain argument only cookies belonging to that domain will
|
56 |
+
* be removed. If given a $domain and $path argument, cookies belonging to
|
57 |
+
* the specified path within that domain are removed. If given all three
|
58 |
+
* arguments, then the cookie with the specified name, path and domain is
|
59 |
+
* removed.
|
60 |
+
*
|
61 |
+
* @param string|null $domain Clears cookies matching a domain
|
62 |
+
* @param string|null $path Clears cookies matching a domain and path
|
63 |
+
* @param string|null $name Clears cookies matching a domain, path, and name
|
64 |
+
*
|
65 |
+
* @return CookieJarInterface
|
66 |
+
*/
|
67 |
+
public function clear($domain = null, $path = null, $name = null);
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Discard all sessions cookies.
|
71 |
+
*
|
72 |
+
* Removes cookies that don't have an expire field or a have a discard
|
73 |
+
* field set to true. To be called when the user agent shuts down according
|
74 |
+
* to RFC 2965.
|
75 |
+
*/
|
76 |
+
public function clearSessionCookies();
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Converts the cookie jar to an array.
|
80 |
+
*
|
81 |
+
* @return array
|
82 |
+
*/
|
83 |
+
public function toArray();
|
84 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Cookie;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Persists non-session cookies using a JSON formatted file
|
6 |
+
*/
|
7 |
+
class FileCookieJar extends CookieJar
|
8 |
+
{
|
9 |
+
/** @var string filename */
|
10 |
+
private $filename;
|
11 |
+
|
12 |
+
/** @var bool Control whether to persist session cookies or not. */
|
13 |
+
private $storeSessionCookies;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Create a new FileCookieJar object
|
17 |
+
*
|
18 |
+
* @param string $cookieFile File to store the cookie data
|
19 |
+
* @param bool $storeSessionCookies Set to true to store session cookies
|
20 |
+
* in the cookie jar.
|
21 |
+
*
|
22 |
+
* @throws \RuntimeException if the file cannot be found or created
|
23 |
+
*/
|
24 |
+
public function __construct($cookieFile, $storeSessionCookies = false)
|
25 |
+
{
|
26 |
+
parent::__construct();
|
27 |
+
$this->filename = $cookieFile;
|
28 |
+
$this->storeSessionCookies = $storeSessionCookies;
|
29 |
+
|
30 |
+
if (file_exists($cookieFile)) {
|
31 |
+
$this->load($cookieFile);
|
32 |
+
}
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Saves the file when shutting down
|
37 |
+
*/
|
38 |
+
public function __destruct()
|
39 |
+
{
|
40 |
+
$this->save($this->filename);
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Saves the cookies to a file.
|
45 |
+
*
|
46 |
+
* @param string $filename File to save
|
47 |
+
* @throws \RuntimeException if the file cannot be found or created
|
48 |
+
*/
|
49 |
+
public function save($filename)
|
50 |
+
{
|
51 |
+
$json = [];
|
52 |
+
foreach ($this as $cookie) {
|
53 |
+
/** @var SetCookie $cookie */
|
54 |
+
if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
|
55 |
+
$json[] = $cookie->toArray();
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
$jsonStr = \GuzzleHttp\json_encode($json);
|
60 |
+
if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) {
|
61 |
+
throw new \RuntimeException("Unable to save file {$filename}");
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Load cookies from a JSON formatted file.
|
67 |
+
*
|
68 |
+
* Old cookies are kept unless overwritten by newly loaded ones.
|
69 |
+
*
|
70 |
+
* @param string $filename Cookie file to load.
|
71 |
+
* @throws \RuntimeException if the file cannot be loaded.
|
72 |
+
*/
|
73 |
+
public function load($filename)
|
74 |
+
{
|
75 |
+
$json = file_get_contents($filename);
|
76 |
+
if (false === $json) {
|
77 |
+
throw new \RuntimeException("Unable to load file {$filename}");
|
78 |
+
} elseif ($json === '') {
|
79 |
+
return;
|
80 |
+
}
|
81 |
+
|
82 |
+
$data = \GuzzleHttp\json_decode($json, true);
|
83 |
+
if (is_array($data)) {
|
84 |
+
foreach (json_decode($json, true) as $cookie) {
|
85 |
+
$this->setCookie(new SetCookie($cookie));
|
86 |
+
}
|
87 |
+
} elseif (strlen($data)) {
|
88 |
+
throw new \RuntimeException("Invalid cookie file: {$filename}");
|
89 |
+
}
|
90 |
+
}
|
91 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Cookie;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Persists cookies in the client session
|
6 |
+
*/
|
7 |
+
class SessionCookieJar extends CookieJar
|
8 |
+
{
|
9 |
+
/** @var string session key */
|
10 |
+
private $sessionKey;
|
11 |
+
|
12 |
+
/** @var bool Control whether to persist session cookies or not. */
|
13 |
+
private $storeSessionCookies;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Create a new SessionCookieJar object
|
17 |
+
*
|
18 |
+
* @param string $sessionKey Session key name to store the cookie
|
19 |
+
* data in session
|
20 |
+
* @param bool $storeSessionCookies Set to true to store session cookies
|
21 |
+
* in the cookie jar.
|
22 |
+
*/
|
23 |
+
public function __construct($sessionKey, $storeSessionCookies = false)
|
24 |
+
{
|
25 |
+
parent::__construct();
|
26 |
+
$this->sessionKey = $sessionKey;
|
27 |
+
$this->storeSessionCookies = $storeSessionCookies;
|
28 |
+
$this->load();
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Saves cookies to session when shutting down
|
33 |
+
*/
|
34 |
+
public function __destruct()
|
35 |
+
{
|
36 |
+
$this->save();
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Save cookies to the client session
|
41 |
+
*/
|
42 |
+
public function save()
|
43 |
+
{
|
44 |
+
$json = [];
|
45 |
+
foreach ($this as $cookie) {
|
46 |
+
/** @var SetCookie $cookie */
|
47 |
+
if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
|
48 |
+
$json[] = $cookie->toArray();
|
49 |
+
}
|
50 |
+
}
|
51 |
+
|
52 |
+
$_SESSION[$this->sessionKey] = json_encode($json);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Load the contents of the client session into the data array
|
57 |
+
*/
|
58 |
+
protected function load()
|
59 |
+
{
|
60 |
+
if (!isset($_SESSION[$this->sessionKey])) {
|
61 |
+
return;
|
62 |
+
}
|
63 |
+
$data = json_decode($_SESSION[$this->sessionKey], true);
|
64 |
+
if (is_array($data)) {
|
65 |
+
foreach ($data as $cookie) {
|
66 |
+
$this->setCookie(new SetCookie($cookie));
|
67 |
+
}
|
68 |
+
} elseif (strlen($data)) {
|
69 |
+
throw new \RuntimeException("Invalid cookie data");
|
70 |
+
}
|
71 |
+
}
|
72 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Cookie/SetCookie.php
ADDED
@@ -0,0 +1,403 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Cookie;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Set-Cookie object
|
6 |
+
*/
|
7 |
+
class SetCookie
|
8 |
+
{
|
9 |
+
/** @var array */
|
10 |
+
private static $defaults = [
|
11 |
+
'Name' => null,
|
12 |
+
'Value' => null,
|
13 |
+
'Domain' => null,
|
14 |
+
'Path' => '/',
|
15 |
+
'Max-Age' => null,
|
16 |
+
'Expires' => null,
|
17 |
+
'Secure' => false,
|
18 |
+
'Discard' => false,
|
19 |
+
'HttpOnly' => false
|
20 |
+
];
|
21 |
+
|
22 |
+
/** @var array Cookie data */
|
23 |
+
private $data;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Create a new SetCookie object from a string
|
27 |
+
*
|
28 |
+
* @param string $cookie Set-Cookie header string
|
29 |
+
*
|
30 |
+
* @return self
|
31 |
+
*/
|
32 |
+
public static function fromString($cookie)
|
33 |
+
{
|
34 |
+
// Create the default return array
|
35 |
+
$data = self::$defaults;
|
36 |
+
// Explode the cookie string using a series of semicolons
|
37 |
+
$pieces = array_filter(array_map('trim', explode(';', $cookie)));
|
38 |
+
// The name of the cookie (first kvp) must exist and include an equal sign.
|
39 |
+
if (empty($pieces[0]) || !strpos($pieces[0], '=')) {
|
40 |
+
return new self($data);
|
41 |
+
}
|
42 |
+
|
43 |
+
// Add the cookie pieces into the parsed data array
|
44 |
+
foreach ($pieces as $part) {
|
45 |
+
$cookieParts = explode('=', $part, 2);
|
46 |
+
$key = trim($cookieParts[0]);
|
47 |
+
$value = isset($cookieParts[1])
|
48 |
+
? trim($cookieParts[1], " \n\r\t\0\x0B")
|
49 |
+
: true;
|
50 |
+
|
51 |
+
// Only check for non-cookies when cookies have been found
|
52 |
+
if (empty($data['Name'])) {
|
53 |
+
$data['Name'] = $key;
|
54 |
+
$data['Value'] = $value;
|
55 |
+
} else {
|
56 |
+
foreach (array_keys(self::$defaults) as $search) {
|
57 |
+
if (!strcasecmp($search, $key)) {
|
58 |
+
$data[$search] = $value;
|
59 |
+
continue 2;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
$data[$key] = $value;
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
return new self($data);
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @param array $data Array of cookie data provided by a Cookie parser
|
71 |
+
*/
|
72 |
+
public function __construct(array $data = [])
|
73 |
+
{
|
74 |
+
$this->data = array_replace(self::$defaults, $data);
|
75 |
+
// Extract the Expires value and turn it into a UNIX timestamp if needed
|
76 |
+
if (!$this->getExpires() && $this->getMaxAge()) {
|
77 |
+
// Calculate the Expires date
|
78 |
+
$this->setExpires(time() + $this->getMaxAge());
|
79 |
+
} elseif ($this->getExpires() && !is_numeric($this->getExpires())) {
|
80 |
+
$this->setExpires($this->getExpires());
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
public function __toString()
|
85 |
+
{
|
86 |
+
$str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';
|
87 |
+
foreach ($this->data as $k => $v) {
|
88 |
+
if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
|
89 |
+
if ($k === 'Expires') {
|
90 |
+
$str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; ';
|
91 |
+
} else {
|
92 |
+
$str .= ($v === true ? $k : "{$k}={$v}") . '; ';
|
93 |
+
}
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
return rtrim($str, '; ');
|
98 |
+
}
|
99 |
+
|
100 |
+
public function toArray()
|
101 |
+
{
|
102 |
+
return $this->data;
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Get the cookie name
|
107 |
+
*
|
108 |
+
* @return string
|
109 |
+
*/
|
110 |
+
public function getName()
|
111 |
+
{
|
112 |
+
return $this->data['Name'];
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Set the cookie name
|
117 |
+
*
|
118 |
+
* @param string $name Cookie name
|
119 |
+
*/
|
120 |
+
public function setName($name)
|
121 |
+
{
|
122 |
+
$this->data['Name'] = $name;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Get the cookie value
|
127 |
+
*
|
128 |
+
* @return string
|
129 |
+
*/
|
130 |
+
public function getValue()
|
131 |
+
{
|
132 |
+
return $this->data['Value'];
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Set the cookie value
|
137 |
+
*
|
138 |
+
* @param string $value Cookie value
|
139 |
+
*/
|
140 |
+
public function setValue($value)
|
141 |
+
{
|
142 |
+
$this->data['Value'] = $value;
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Get the domain
|
147 |
+
*
|
148 |
+
* @return string|null
|
149 |
+
*/
|
150 |
+
public function getDomain()
|
151 |
+
{
|
152 |
+
return $this->data['Domain'];
|
153 |
+
}
|
154 |
+
|
155 |
+
/**
|
156 |
+
* Set the domain of the cookie
|
157 |
+
*
|
158 |
+
* @param string $domain
|
159 |
+
*/
|
160 |
+
public function setDomain($domain)
|
161 |
+
{
|
162 |
+
$this->data['Domain'] = $domain;
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Get the path
|
167 |
+
*
|
168 |
+
* @return string
|
169 |
+
*/
|
170 |
+
public function getPath()
|
171 |
+
{
|
172 |
+
return $this->data['Path'];
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Set the path of the cookie
|
177 |
+
*
|
178 |
+
* @param string $path Path of the cookie
|
179 |
+
*/
|
180 |
+
public function setPath($path)
|
181 |
+
{
|
182 |
+
$this->data['Path'] = $path;
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Maximum lifetime of the cookie in seconds
|
187 |
+
*
|
188 |
+
* @return int|null
|
189 |
+
*/
|
190 |
+
public function getMaxAge()
|
191 |
+
{
|
192 |
+
return $this->data['Max-Age'];
|
193 |
+
}
|
194 |
+
|
195 |
+
/**
|
196 |
+
* Set the max-age of the cookie
|
197 |
+
*
|
198 |
+
* @param int $maxAge Max age of the cookie in seconds
|
199 |
+
*/
|
200 |
+
public function setMaxAge($maxAge)
|
201 |
+
{
|
202 |
+
$this->data['Max-Age'] = $maxAge;
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* The UNIX timestamp when the cookie Expires
|
207 |
+
*
|
208 |
+
* @return mixed
|
209 |
+
*/
|
210 |
+
public function getExpires()
|
211 |
+
{
|
212 |
+
return $this->data['Expires'];
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Set the unix timestamp for which the cookie will expire
|
217 |
+
*
|
218 |
+
* @param int $timestamp Unix timestamp
|
219 |
+
*/
|
220 |
+
public function setExpires($timestamp)
|
221 |
+
{
|
222 |
+
$this->data['Expires'] = is_numeric($timestamp)
|
223 |
+
? (int) $timestamp
|
224 |
+
: strtotime($timestamp);
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* Get whether or not this is a secure cookie
|
229 |
+
*
|
230 |
+
* @return bool|null
|
231 |
+
*/
|
232 |
+
public function getSecure()
|
233 |
+
{
|
234 |
+
return $this->data['Secure'];
|
235 |
+
}
|
236 |
+
|
237 |
+
/**
|
238 |
+
* Set whether or not the cookie is secure
|
239 |
+
*
|
240 |
+
* @param bool $secure Set to true or false if secure
|
241 |
+
*/
|
242 |
+
public function setSecure($secure)
|
243 |
+
{
|
244 |
+
$this->data['Secure'] = $secure;
|
245 |
+
}
|
246 |
+
|
247 |
+
/**
|
248 |
+
* Get whether or not this is a session cookie
|
249 |
+
*
|
250 |
+
* @return bool|null
|
251 |
+
*/
|
252 |
+
public function getDiscard()
|
253 |
+
{
|
254 |
+
return $this->data['Discard'];
|
255 |
+
}
|
256 |
+
|
257 |
+
/**
|
258 |
+
* Set whether or not this is a session cookie
|
259 |
+
*
|
260 |
+
* @param bool $discard Set to true or false if this is a session cookie
|
261 |
+
*/
|
262 |
+
public function setDiscard($discard)
|
263 |
+
{
|
264 |
+
$this->data['Discard'] = $discard;
|
265 |
+
}
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Get whether or not this is an HTTP only cookie
|
269 |
+
*
|
270 |
+
* @return bool
|
271 |
+
*/
|
272 |
+
public function getHttpOnly()
|
273 |
+
{
|
274 |
+
return $this->data['HttpOnly'];
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Set whether or not this is an HTTP only cookie
|
279 |
+
*
|
280 |
+
* @param bool $httpOnly Set to true or false if this is HTTP only
|
281 |
+
*/
|
282 |
+
public function setHttpOnly($httpOnly)
|
283 |
+
{
|
284 |
+
$this->data['HttpOnly'] = $httpOnly;
|
285 |
+
}
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Check if the cookie matches a path value.
|
289 |
+
*
|
290 |
+
* A request-path path-matches a given cookie-path if at least one of
|
291 |
+
* the following conditions holds:
|
292 |
+
*
|
293 |
+
* - The cookie-path and the request-path are identical.
|
294 |
+
* - The cookie-path is a prefix of the request-path, and the last
|
295 |
+
* character of the cookie-path is %x2F ("/").
|
296 |
+
* - The cookie-path is a prefix of the request-path, and the first
|
297 |
+
* character of the request-path that is not included in the cookie-
|
298 |
+
* path is a %x2F ("/") character.
|
299 |
+
*
|
300 |
+
* @param string $requestPath Path to check against
|
301 |
+
*
|
302 |
+
* @return bool
|
303 |
+
*/
|
304 |
+
public function matchesPath($requestPath)
|
305 |
+
{
|
306 |
+
$cookiePath = $this->getPath();
|
307 |
+
|
308 |
+
// Match on exact matches or when path is the default empty "/"
|
309 |
+
if ($cookiePath === '/' || $cookiePath == $requestPath) {
|
310 |
+
return true;
|
311 |
+
}
|
312 |
+
|
313 |
+
// Ensure that the cookie-path is a prefix of the request path.
|
314 |
+
if (0 !== strpos($requestPath, $cookiePath)) {
|
315 |
+
return false;
|
316 |
+
}
|
317 |
+
|
318 |
+
// Match if the last character of the cookie-path is "/"
|
319 |
+
if (substr($cookiePath, -1, 1) === '/') {
|
320 |
+
return true;
|
321 |
+
}
|
322 |
+
|
323 |
+
// Match if the first character not included in cookie path is "/"
|
324 |
+
return substr($requestPath, strlen($cookiePath), 1) === '/';
|
325 |
+
}
|
326 |
+
|
327 |
+
/**
|
328 |
+
* Check if the cookie matches a domain value
|
329 |
+
*
|
330 |
+
* @param string $domain Domain to check against
|
331 |
+
*
|
332 |
+
* @return bool
|
333 |
+
*/
|
334 |
+
public function matchesDomain($domain)
|
335 |
+
{
|
336 |
+
// Remove the leading '.' as per spec in RFC 6265.
|
337 |
+
// http://tools.ietf.org/html/rfc6265#section-5.2.3
|
338 |
+
$cookieDomain = ltrim($this->getDomain(), '.');
|
339 |
+
|
340 |
+
// Domain not set or exact match.
|
341 |
+
if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) {
|
342 |
+
return true;
|
343 |
+
}
|
344 |
+
|
345 |
+
// Matching the subdomain according to RFC 6265.
|
346 |
+
// http://tools.ietf.org/html/rfc6265#section-5.1.3
|
347 |
+
if (filter_var($domain, FILTER_VALIDATE_IP)) {
|
348 |
+
return false;
|
349 |
+
}
|
350 |
+
|
351 |
+
return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain);
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Check if the cookie is expired
|
356 |
+
*
|
357 |
+
* @return bool
|
358 |
+
*/
|
359 |
+
public function isExpired()
|
360 |
+
{
|
361 |
+
return $this->getExpires() !== null && time() > $this->getExpires();
|
362 |
+
}
|
363 |
+
|
364 |
+
/**
|
365 |
+
* Check if the cookie is valid according to RFC 6265
|
366 |
+
*
|
367 |
+
* @return bool|string Returns true if valid or an error message if invalid
|
368 |
+
*/
|
369 |
+
public function validate()
|
370 |
+
{
|
371 |
+
// Names must not be empty, but can be 0
|
372 |
+
$name = $this->getName();
|
373 |
+
if (empty($name) && !is_numeric($name)) {
|
374 |
+
return 'The cookie name must not be empty';
|
375 |
+
}
|
376 |
+
|
377 |
+
// Check if any of the invalid characters are present in the cookie name
|
378 |
+
if (preg_match(
|
379 |
+
'/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/',
|
380 |
+
$name
|
381 |
+
)) {
|
382 |
+
return 'Cookie name must not contain invalid characters: ASCII '
|
383 |
+
. 'Control characters (0-31;127), space, tab and the '
|
384 |
+
. 'following characters: ()<>@,;:\"/?={}';
|
385 |
+
}
|
386 |
+
|
387 |
+
// Value must not be empty, but can be 0
|
388 |
+
$value = $this->getValue();
|
389 |
+
if (empty($value) && !is_numeric($value)) {
|
390 |
+
return 'The cookie value must not be empty';
|
391 |
+
}
|
392 |
+
|
393 |
+
// Domains must not be empty, but can be 0
|
394 |
+
// A "0" is not a valid internet domain, but may be used as server name
|
395 |
+
// in a private network.
|
396 |
+
$domain = $this->getDomain();
|
397 |
+
if (empty($domain) && !is_numeric($domain)) {
|
398 |
+
return 'The cookie domain must not be empty';
|
399 |
+
}
|
400 |
+
|
401 |
+
return true;
|
402 |
+
}
|
403 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/BadResponseException.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
use Psr\Http\Message\RequestInterface;
|
5 |
+
use Psr\Http\Message\ResponseInterface;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Exception when an HTTP error occurs (4xx or 5xx error)
|
9 |
+
*/
|
10 |
+
class BadResponseException extends RequestException
|
11 |
+
{
|
12 |
+
public function __construct(
|
13 |
+
$message,
|
14 |
+
RequestInterface $request,
|
15 |
+
ResponseInterface $response = null,
|
16 |
+
\Exception $previous = null,
|
17 |
+
array $handlerContext = []
|
18 |
+
) {
|
19 |
+
if (null === $response) {
|
20 |
+
@trigger_error(
|
21 |
+
'Instantiating the ' . __CLASS__ . ' class without a Response is deprecated since version 6.3 and will be removed in 7.0.',
|
22 |
+
E_USER_DEPRECATED
|
23 |
+
);
|
24 |
+
}
|
25 |
+
parent::__construct($message, $request, $response, $previous, $handlerContext);
|
26 |
+
}
|
27 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/ClientException.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Exception when a client error is encountered (4xx codes)
|
6 |
+
*/
|
7 |
+
class ClientException extends BadResponseException
|
8 |
+
{
|
9 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/ConnectException.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
use Psr\Http\Message\RequestInterface;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Exception thrown when a connection cannot be established.
|
8 |
+
*
|
9 |
+
* Note that no response is present for a ConnectException
|
10 |
+
*/
|
11 |
+
class ConnectException extends RequestException
|
12 |
+
{
|
13 |
+
public function __construct(
|
14 |
+
$message,
|
15 |
+
RequestInterface $request,
|
16 |
+
\Exception $previous = null,
|
17 |
+
array $handlerContext = []
|
18 |
+
) {
|
19 |
+
parent::__construct($message, $request, null, $previous, $handlerContext);
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* @return null
|
24 |
+
*/
|
25 |
+
public function getResponse()
|
26 |
+
{
|
27 |
+
return null;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* @return bool
|
32 |
+
*/
|
33 |
+
public function hasResponse()
|
34 |
+
{
|
35 |
+
return false;
|
36 |
+
}
|
37 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/GuzzleException.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
use Throwable;
|
5 |
+
|
6 |
+
if (interface_exists(Throwable::class)) {
|
7 |
+
interface GuzzleException extends Throwable
|
8 |
+
{
|
9 |
+
}
|
10 |
+
} else {
|
11 |
+
/**
|
12 |
+
* @method string getMessage()
|
13 |
+
* @method \Throwable|null getPrevious()
|
14 |
+
* @method mixed getCode()
|
15 |
+
* @method string getFile()
|
16 |
+
* @method int getLine()
|
17 |
+
* @method array getTrace()
|
18 |
+
* @method string getTraceAsString()
|
19 |
+
*/
|
20 |
+
interface GuzzleException
|
21 |
+
{
|
22 |
+
}
|
23 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace GuzzleHttp\Exception;
|
4 |
+
|
5 |
+
final class InvalidArgumentException extends \InvalidArgumentException implements GuzzleException
|
6 |
+
{
|
7 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/RequestException.php
ADDED
@@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
5 |
+
use Psr\Http\Message\RequestInterface;
|
6 |
+
use Psr\Http\Message\ResponseInterface;
|
7 |
+
use Psr\Http\Message\UriInterface;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* HTTP Request exception
|
11 |
+
*/
|
12 |
+
class RequestException extends TransferException
|
13 |
+
{
|
14 |
+
/** @var RequestInterface */
|
15 |
+
private $request;
|
16 |
+
|
17 |
+
/** @var ResponseInterface|null */
|
18 |
+
private $response;
|
19 |
+
|
20 |
+
/** @var array */
|
21 |
+
private $handlerContext;
|
22 |
+
|
23 |
+
public function __construct(
|
24 |
+
$message,
|
25 |
+
RequestInterface $request,
|
26 |
+
ResponseInterface $response = null,
|
27 |
+
\Exception $previous = null,
|
28 |
+
array $handlerContext = []
|
29 |
+
) {
|
30 |
+
// Set the code of the exception if the response is set and not future.
|
31 |
+
$code = $response && !($response instanceof PromiseInterface)
|
32 |
+
? $response->getStatusCode()
|
33 |
+
: 0;
|
34 |
+
parent::__construct($message, $code, $previous);
|
35 |
+
$this->request = $request;
|
36 |
+
$this->response = $response;
|
37 |
+
$this->handlerContext = $handlerContext;
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Wrap non-RequestExceptions with a RequestException
|
42 |
+
*
|
43 |
+
* @param RequestInterface $request
|
44 |
+
* @param \Exception $e
|
45 |
+
*
|
46 |
+
* @return RequestException
|
47 |
+
*/
|
48 |
+
public static function wrapException(RequestInterface $request, \Exception $e)
|
49 |
+
{
|
50 |
+
return $e instanceof RequestException
|
51 |
+
? $e
|
52 |
+
: new RequestException($e->getMessage(), $request, null, $e);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Factory method to create a new exception with a normalized error message
|
57 |
+
*
|
58 |
+
* @param RequestInterface $request Request
|
59 |
+
* @param ResponseInterface $response Response received
|
60 |
+
* @param \Exception $previous Previous exception
|
61 |
+
* @param array $ctx Optional handler context.
|
62 |
+
*
|
63 |
+
* @return self
|
64 |
+
*/
|
65 |
+
public static function create(
|
66 |
+
RequestInterface $request,
|
67 |
+
ResponseInterface $response = null,
|
68 |
+
\Exception $previous = null,
|
69 |
+
array $ctx = []
|
70 |
+
) {
|
71 |
+
if (!$response) {
|
72 |
+
return new self(
|
73 |
+
'Error completing request',
|
74 |
+
$request,
|
75 |
+
null,
|
76 |
+
$previous,
|
77 |
+
$ctx
|
78 |
+
);
|
79 |
+
}
|
80 |
+
|
81 |
+
$level = (int) floor($response->getStatusCode() / 100);
|
82 |
+
if ($level === 4) {
|
83 |
+
$label = 'Client error';
|
84 |
+
$className = ClientException::class;
|
85 |
+
} elseif ($level === 5) {
|
86 |
+
$label = 'Server error';
|
87 |
+
$className = ServerException::class;
|
88 |
+
} else {
|
89 |
+
$label = 'Unsuccessful request';
|
90 |
+
$className = __CLASS__;
|
91 |
+
}
|
92 |
+
|
93 |
+
$uri = $request->getUri();
|
94 |
+
$uri = static::obfuscateUri($uri);
|
95 |
+
|
96 |
+
// Client Error: `GET /` resulted in a `404 Not Found` response:
|
97 |
+
// <html> ... (truncated)
|
98 |
+
$message = sprintf(
|
99 |
+
'%s: `%s %s` resulted in a `%s %s` response',
|
100 |
+
$label,
|
101 |
+
$request->getMethod(),
|
102 |
+
$uri,
|
103 |
+
$response->getStatusCode(),
|
104 |
+
$response->getReasonPhrase()
|
105 |
+
);
|
106 |
+
|
107 |
+
$summary = static::getResponseBodySummary($response);
|
108 |
+
|
109 |
+
if ($summary !== null) {
|
110 |
+
$message .= ":\n{$summary}\n";
|
111 |
+
}
|
112 |
+
|
113 |
+
return new $className($message, $request, $response, $previous, $ctx);
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Get a short summary of the response
|
118 |
+
*
|
119 |
+
* Will return `null` if the response is not printable.
|
120 |
+
*
|
121 |
+
* @param ResponseInterface $response
|
122 |
+
*
|
123 |
+
* @return string|null
|
124 |
+
*/
|
125 |
+
public static function getResponseBodySummary(ResponseInterface $response)
|
126 |
+
{
|
127 |
+
return \GuzzleHttp\Psr7\get_message_body_summary($response);
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Obfuscates URI if there is a username and a password present
|
132 |
+
*
|
133 |
+
* @param UriInterface $uri
|
134 |
+
*
|
135 |
+
* @return UriInterface
|
136 |
+
*/
|
137 |
+
private static function obfuscateUri(UriInterface $uri)
|
138 |
+
{
|
139 |
+
$userInfo = $uri->getUserInfo();
|
140 |
+
|
141 |
+
if (false !== ($pos = strpos($userInfo, ':'))) {
|
142 |
+
return $uri->withUserInfo(substr($userInfo, 0, $pos), '***');
|
143 |
+
}
|
144 |
+
|
145 |
+
return $uri;
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Get the request that caused the exception
|
150 |
+
*
|
151 |
+
* @return RequestInterface
|
152 |
+
*/
|
153 |
+
public function getRequest()
|
154 |
+
{
|
155 |
+
return $this->request;
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Get the associated response
|
160 |
+
*
|
161 |
+
* @return ResponseInterface|null
|
162 |
+
*/
|
163 |
+
public function getResponse()
|
164 |
+
{
|
165 |
+
return $this->response;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Check if a response was received
|
170 |
+
*
|
171 |
+
* @return bool
|
172 |
+
*/
|
173 |
+
public function hasResponse()
|
174 |
+
{
|
175 |
+
return $this->response !== null;
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Get contextual information about the error from the underlying handler.
|
180 |
+
*
|
181 |
+
* The contents of this array will vary depending on which handler you are
|
182 |
+
* using. It may also be just an empty array. Relying on this data will
|
183 |
+
* couple you to a specific handler, but can give more debug information
|
184 |
+
* when needed.
|
185 |
+
*
|
186 |
+
* @return array
|
187 |
+
*/
|
188 |
+
public function getHandlerContext()
|
189 |
+
{
|
190 |
+
return $this->handlerContext;
|
191 |
+
}
|
192 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/SeekException.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
use Psr\Http\Message\StreamInterface;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Exception thrown when a seek fails on a stream.
|
8 |
+
*/
|
9 |
+
class SeekException extends \RuntimeException implements GuzzleException
|
10 |
+
{
|
11 |
+
private $stream;
|
12 |
+
|
13 |
+
public function __construct(StreamInterface $stream, $pos = 0, $msg = '')
|
14 |
+
{
|
15 |
+
$this->stream = $stream;
|
16 |
+
$msg = $msg ?: 'Could not seek the stream to position ' . $pos;
|
17 |
+
parent::__construct($msg);
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @return StreamInterface
|
22 |
+
*/
|
23 |
+
public function getStream()
|
24 |
+
{
|
25 |
+
return $this->stream;
|
26 |
+
}
|
27 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/ServerException.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Exception when a server error is encountered (5xx codes)
|
6 |
+
*/
|
7 |
+
class ServerException extends BadResponseException
|
8 |
+
{
|
9 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
class TooManyRedirectsException extends RequestException
|
5 |
+
{
|
6 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Exception/TransferException.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Exception;
|
3 |
+
|
4 |
+
class TransferException extends \RuntimeException implements GuzzleException
|
5 |
+
{
|
6 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlFactory.php
ADDED
@@ -0,0 +1,585 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\ConnectException;
|
5 |
+
use GuzzleHttp\Exception\RequestException;
|
6 |
+
use GuzzleHttp\Promise\FulfilledPromise;
|
7 |
+
use GuzzleHttp\Psr7;
|
8 |
+
use GuzzleHttp\Psr7\LazyOpenStream;
|
9 |
+
use GuzzleHttp\TransferStats;
|
10 |
+
use Psr\Http\Message\RequestInterface;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Creates curl resources from a request
|
14 |
+
*/
|
15 |
+
class CurlFactory implements CurlFactoryInterface
|
16 |
+
{
|
17 |
+
const CURL_VERSION_STR = 'curl_version';
|
18 |
+
const LOW_CURL_VERSION_NUMBER = '7.21.2';
|
19 |
+
|
20 |
+
/** @var array */
|
21 |
+
private $handles = [];
|
22 |
+
|
23 |
+
/** @var int Total number of idle handles to keep in cache */
|
24 |
+
private $maxHandles;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* @param int $maxHandles Maximum number of idle handles.
|
28 |
+
*/
|
29 |
+
public function __construct($maxHandles)
|
30 |
+
{
|
31 |
+
$this->maxHandles = $maxHandles;
|
32 |
+
}
|
33 |
+
|
34 |
+
public function create(RequestInterface $request, array $options)
|
35 |
+
{
|
36 |
+
if (isset($options['curl']['body_as_string'])) {
|
37 |
+
$options['_body_as_string'] = $options['curl']['body_as_string'];
|
38 |
+
unset($options['curl']['body_as_string']);
|
39 |
+
}
|
40 |
+
|
41 |
+
$easy = new EasyHandle;
|
42 |
+
$easy->request = $request;
|
43 |
+
$easy->options = $options;
|
44 |
+
$conf = $this->getDefaultConf($easy);
|
45 |
+
$this->applyMethod($easy, $conf);
|
46 |
+
$this->applyHandlerOptions($easy, $conf);
|
47 |
+
$this->applyHeaders($easy, $conf);
|
48 |
+
unset($conf['_headers']);
|
49 |
+
|
50 |
+
// Add handler options from the request configuration options
|
51 |
+
if (isset($options['curl'])) {
|
52 |
+
$conf = array_replace($conf, $options['curl']);
|
53 |
+
}
|
54 |
+
|
55 |
+
$conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);
|
56 |
+
$easy->handle = $this->handles
|
57 |
+
? array_pop($this->handles)
|
58 |
+
: curl_init();
|
59 |
+
curl_setopt_array($easy->handle, $conf);
|
60 |
+
|
61 |
+
return $easy;
|
62 |
+
}
|
63 |
+
|
64 |
+
public function release(EasyHandle $easy)
|
65 |
+
{
|
66 |
+
$resource = $easy->handle;
|
67 |
+
unset($easy->handle);
|
68 |
+
|
69 |
+
if (count($this->handles) >= $this->maxHandles) {
|
70 |
+
curl_close($resource);
|
71 |
+
} else {
|
72 |
+
// Remove all callback functions as they can hold onto references
|
73 |
+
// and are not cleaned up by curl_reset. Using curl_setopt_array
|
74 |
+
// does not work for some reason, so removing each one
|
75 |
+
// individually.
|
76 |
+
curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);
|
77 |
+
curl_setopt($resource, CURLOPT_READFUNCTION, null);
|
78 |
+
curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);
|
79 |
+
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);
|
80 |
+
curl_reset($resource);
|
81 |
+
$this->handles[] = $resource;
|
82 |
+
}
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Completes a cURL transaction, either returning a response promise or a
|
87 |
+
* rejected promise.
|
88 |
+
*
|
89 |
+
* @param callable $handler
|
90 |
+
* @param EasyHandle $easy
|
91 |
+
* @param CurlFactoryInterface $factory Dictates how the handle is released
|
92 |
+
*
|
93 |
+
* @return \GuzzleHttp\Promise\PromiseInterface
|
94 |
+
*/
|
95 |
+
public static function finish(
|
96 |
+
callable $handler,
|
97 |
+
EasyHandle $easy,
|
98 |
+
CurlFactoryInterface $factory
|
99 |
+
) {
|
100 |
+
if (isset($easy->options['on_stats'])) {
|
101 |
+
self::invokeStats($easy);
|
102 |
+
}
|
103 |
+
|
104 |
+
if (!$easy->response || $easy->errno) {
|
105 |
+
return self::finishError($handler, $easy, $factory);
|
106 |
+
}
|
107 |
+
|
108 |
+
// Return the response if it is present and there is no error.
|
109 |
+
$factory->release($easy);
|
110 |
+
|
111 |
+
// Rewind the body of the response if possible.
|
112 |
+
$body = $easy->response->getBody();
|
113 |
+
if ($body->isSeekable()) {
|
114 |
+
$body->rewind();
|
115 |
+
}
|
116 |
+
|
117 |
+
return new FulfilledPromise($easy->response);
|
118 |
+
}
|
119 |
+
|
120 |
+
private static function invokeStats(EasyHandle $easy)
|
121 |
+
{
|
122 |
+
$curlStats = curl_getinfo($easy->handle);
|
123 |
+
$curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME);
|
124 |
+
$stats = new TransferStats(
|
125 |
+
$easy->request,
|
126 |
+
$easy->response,
|
127 |
+
$curlStats['total_time'],
|
128 |
+
$easy->errno,
|
129 |
+
$curlStats
|
130 |
+
);
|
131 |
+
call_user_func($easy->options['on_stats'], $stats);
|
132 |
+
}
|
133 |
+
|
134 |
+
private static function finishError(
|
135 |
+
callable $handler,
|
136 |
+
EasyHandle $easy,
|
137 |
+
CurlFactoryInterface $factory
|
138 |
+
) {
|
139 |
+
// Get error information and release the handle to the factory.
|
140 |
+
$ctx = [
|
141 |
+
'errno' => $easy->errno,
|
142 |
+
'error' => curl_error($easy->handle),
|
143 |
+
'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME),
|
144 |
+
] + curl_getinfo($easy->handle);
|
145 |
+
$ctx[self::CURL_VERSION_STR] = curl_version()['version'];
|
146 |
+
$factory->release($easy);
|
147 |
+
|
148 |
+
// Retry when nothing is present or when curl failed to rewind.
|
149 |
+
if (empty($easy->options['_err_message'])
|
150 |
+
&& (!$easy->errno || $easy->errno == 65)
|
151 |
+
) {
|
152 |
+
return self::retryFailedRewind($handler, $easy, $ctx);
|
153 |
+
}
|
154 |
+
|
155 |
+
return self::createRejection($easy, $ctx);
|
156 |
+
}
|
157 |
+
|
158 |
+
private static function createRejection(EasyHandle $easy, array $ctx)
|
159 |
+
{
|
160 |
+
static $connectionErrors = [
|
161 |
+
CURLE_OPERATION_TIMEOUTED => true,
|
162 |
+
CURLE_COULDNT_RESOLVE_HOST => true,
|
163 |
+
CURLE_COULDNT_CONNECT => true,
|
164 |
+
CURLE_SSL_CONNECT_ERROR => true,
|
165 |
+
CURLE_GOT_NOTHING => true,
|
166 |
+
];
|
167 |
+
|
168 |
+
// If an exception was encountered during the onHeaders event, then
|
169 |
+
// return a rejected promise that wraps that exception.
|
170 |
+
if ($easy->onHeadersException) {
|
171 |
+
return \GuzzleHttp\Promise\rejection_for(
|
172 |
+
new RequestException(
|
173 |
+
'An error was encountered during the on_headers event',
|
174 |
+
$easy->request,
|
175 |
+
$easy->response,
|
176 |
+
$easy->onHeadersException,
|
177 |
+
$ctx
|
178 |
+
)
|
179 |
+
);
|
180 |
+
}
|
181 |
+
if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) {
|
182 |
+
$message = sprintf(
|
183 |
+
'cURL error %s: %s (%s)',
|
184 |
+
$ctx['errno'],
|
185 |
+
$ctx['error'],
|
186 |
+
'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'
|
187 |
+
);
|
188 |
+
} else {
|
189 |
+
$message = sprintf(
|
190 |
+
'cURL error %s: %s (%s) for %s',
|
191 |
+
$ctx['errno'],
|
192 |
+
$ctx['error'],
|
193 |
+
'see https://curl.haxx.se/libcurl/c/libcurl-errors.html',
|
194 |
+
$easy->request->getUri()
|
195 |
+
);
|
196 |
+
}
|
197 |
+
|
198 |
+
// Create a connection exception if it was a specific error code.
|
199 |
+
$error = isset($connectionErrors[$easy->errno])
|
200 |
+
? new ConnectException($message, $easy->request, null, $ctx)
|
201 |
+
: new RequestException($message, $easy->request, $easy->response, null, $ctx);
|
202 |
+
|
203 |
+
return \GuzzleHttp\Promise\rejection_for($error);
|
204 |
+
}
|
205 |
+
|
206 |
+
private function getDefaultConf(EasyHandle $easy)
|
207 |
+
{
|
208 |
+
$conf = [
|
209 |
+
'_headers' => $easy->request->getHeaders(),
|
210 |
+
CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),
|
211 |
+
CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),
|
212 |
+
CURLOPT_RETURNTRANSFER => false,
|
213 |
+
CURLOPT_HEADER => false,
|
214 |
+
CURLOPT_CONNECTTIMEOUT => 150,
|
215 |
+
];
|
216 |
+
|
217 |
+
if (defined('CURLOPT_PROTOCOLS')) {
|
218 |
+
$conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;
|
219 |
+
}
|
220 |
+
|
221 |
+
$version = $easy->request->getProtocolVersion();
|
222 |
+
if ($version == 1.1) {
|
223 |
+
$conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;
|
224 |
+
} elseif ($version == 2.0) {
|
225 |
+
$conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;
|
226 |
+
} else {
|
227 |
+
$conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
|
228 |
+
}
|
229 |
+
|
230 |
+
return $conf;
|
231 |
+
}
|
232 |
+
|
233 |
+
private function applyMethod(EasyHandle $easy, array &$conf)
|
234 |
+
{
|
235 |
+
$body = $easy->request->getBody();
|
236 |
+
$size = $body->getSize();
|
237 |
+
|
238 |
+
if ($size === null || $size > 0) {
|
239 |
+
$this->applyBody($easy->request, $easy->options, $conf);
|
240 |
+
return;
|
241 |
+
}
|
242 |
+
|
243 |
+
$method = $easy->request->getMethod();
|
244 |
+
if ($method === 'PUT' || $method === 'POST') {
|
245 |
+
// See http://tools.ietf.org/html/rfc7230#section-3.3.2
|
246 |
+
if (!$easy->request->hasHeader('Content-Length')) {
|
247 |
+
$conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
|
248 |
+
}
|
249 |
+
} elseif ($method === 'HEAD') {
|
250 |
+
$conf[CURLOPT_NOBODY] = true;
|
251 |
+
unset(
|
252 |
+
$conf[CURLOPT_WRITEFUNCTION],
|
253 |
+
$conf[CURLOPT_READFUNCTION],
|
254 |
+
$conf[CURLOPT_FILE],
|
255 |
+
$conf[CURLOPT_INFILE]
|
256 |
+
);
|
257 |
+
}
|
258 |
+
}
|
259 |
+
|
260 |
+
private function applyBody(RequestInterface $request, array $options, array &$conf)
|
261 |
+
{
|
262 |
+
$size = $request->hasHeader('Content-Length')
|
263 |
+
? (int) $request->getHeaderLine('Content-Length')
|
264 |
+
: null;
|
265 |
+
|
266 |
+
// Send the body as a string if the size is less than 1MB OR if the
|
267 |
+
// [curl][body_as_string] request value is set.
|
268 |
+
if (($size !== null && $size < 1000000) ||
|
269 |
+
!empty($options['_body_as_string'])
|
270 |
+
) {
|
271 |
+
$conf[CURLOPT_POSTFIELDS] = (string) $request->getBody();
|
272 |
+
// Don't duplicate the Content-Length header
|
273 |
+
$this->removeHeader('Content-Length', $conf);
|
274 |
+
$this->removeHeader('Transfer-Encoding', $conf);
|
275 |
+
} else {
|
276 |
+
$conf[CURLOPT_UPLOAD] = true;
|
277 |
+
if ($size !== null) {
|
278 |
+
$conf[CURLOPT_INFILESIZE] = $size;
|
279 |
+
$this->removeHeader('Content-Length', $conf);
|
280 |
+
}
|
281 |
+
$body = $request->getBody();
|
282 |
+
if ($body->isSeekable()) {
|
283 |
+
$body->rewind();
|
284 |
+
}
|
285 |
+
$conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {
|
286 |
+
return $body->read($length);
|
287 |
+
};
|
288 |
+
}
|
289 |
+
|
290 |
+
// If the Expect header is not present, prevent curl from adding it
|
291 |
+
if (!$request->hasHeader('Expect')) {
|
292 |
+
$conf[CURLOPT_HTTPHEADER][] = 'Expect:';
|
293 |
+
}
|
294 |
+
|
295 |
+
// cURL sometimes adds a content-type by default. Prevent this.
|
296 |
+
if (!$request->hasHeader('Content-Type')) {
|
297 |
+
$conf[CURLOPT_HTTPHEADER][] = 'Content-Type:';
|
298 |
+
}
|
299 |
+
}
|
300 |
+
|
301 |
+
private function applyHeaders(EasyHandle $easy, array &$conf)
|
302 |
+
{
|
303 |
+
foreach ($conf['_headers'] as $name => $values) {
|
304 |
+
foreach ($values as $value) {
|
305 |
+
$value = (string) $value;
|
306 |
+
if ($value === '') {
|
307 |
+
// cURL requires a special format for empty headers.
|
308 |
+
// See https://github.com/guzzle/guzzle/issues/1882 for more details.
|
309 |
+
$conf[CURLOPT_HTTPHEADER][] = "$name;";
|
310 |
+
} else {
|
311 |
+
$conf[CURLOPT_HTTPHEADER][] = "$name: $value";
|
312 |
+
}
|
313 |
+
}
|
314 |
+
}
|
315 |
+
|
316 |
+
// Remove the Accept header if one was not set
|
317 |
+
if (!$easy->request->hasHeader('Accept')) {
|
318 |
+
$conf[CURLOPT_HTTPHEADER][] = 'Accept:';
|
319 |
+
}
|
320 |
+
}
|
321 |
+
|
322 |
+
/**
|
323 |
+
* Remove a header from the options array.
|
324 |
+
*
|
325 |
+
* @param string $name Case-insensitive header to remove
|
326 |
+
* @param array $options Array of options to modify
|
327 |
+
*/
|
328 |
+
private function removeHeader($name, array &$options)
|
329 |
+
{
|
330 |
+
foreach (array_keys($options['_headers']) as $key) {
|
331 |
+
if (!strcasecmp($key, $name)) {
|
332 |
+
unset($options['_headers'][$key]);
|
333 |
+
return;
|
334 |
+
}
|
335 |
+
}
|
336 |
+
}
|
337 |
+
|
338 |
+
private function applyHandlerOptions(EasyHandle $easy, array &$conf)
|
339 |
+
{
|
340 |
+
$options = $easy->options;
|
341 |
+
if (isset($options['verify'])) {
|
342 |
+
if ($options['verify'] === false) {
|
343 |
+
unset($conf[CURLOPT_CAINFO]);
|
344 |
+
$conf[CURLOPT_SSL_VERIFYHOST] = 0;
|
345 |
+
$conf[CURLOPT_SSL_VERIFYPEER] = false;
|
346 |
+
} else {
|
347 |
+
$conf[CURLOPT_SSL_VERIFYHOST] = 2;
|
348 |
+
$conf[CURLOPT_SSL_VERIFYPEER] = true;
|
349 |
+
if (is_string($options['verify'])) {
|
350 |
+
// Throw an error if the file/folder/link path is not valid or doesn't exist.
|
351 |
+
if (!file_exists($options['verify'])) {
|
352 |
+
throw new \InvalidArgumentException(
|
353 |
+
"SSL CA bundle not found: {$options['verify']}"
|
354 |
+
);
|
355 |
+
}
|
356 |
+
// If it's a directory or a link to a directory use CURLOPT_CAPATH.
|
357 |
+
// If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
|
358 |
+
if (is_dir($options['verify']) ||
|
359 |
+
(is_link($options['verify']) && is_dir(readlink($options['verify'])))) {
|
360 |
+
$conf[CURLOPT_CAPATH] = $options['verify'];
|
361 |
+
} else {
|
362 |
+
$conf[CURLOPT_CAINFO] = $options['verify'];
|
363 |
+
}
|
364 |
+
}
|
365 |
+
}
|
366 |
+
}
|
367 |
+
|
368 |
+
if (!empty($options['decode_content'])) {
|
369 |
+
$accept = $easy->request->getHeaderLine('Accept-Encoding');
|
370 |
+
if ($accept) {
|
371 |
+
$conf[CURLOPT_ENCODING] = $accept;
|
372 |
+
} else {
|
373 |
+
$conf[CURLOPT_ENCODING] = '';
|
374 |
+
// Don't let curl send the header over the wire
|
375 |
+
$conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
|
376 |
+
}
|
377 |
+
}
|
378 |
+
|
379 |
+
if (isset($options['sink'])) {
|
380 |
+
$sink = $options['sink'];
|
381 |
+
if (!is_string($sink)) {
|
382 |
+
$sink = \GuzzleHttp\Psr7\stream_for($sink);
|
383 |
+
} elseif (!is_dir(dirname($sink))) {
|
384 |
+
// Ensure that the directory exists before failing in curl.
|
385 |
+
throw new \RuntimeException(sprintf(
|
386 |
+
'Directory %s does not exist for sink value of %s',
|
387 |
+
dirname($sink),
|
388 |
+
$sink
|
389 |
+
));
|
390 |
+
} else {
|
391 |
+
$sink = new LazyOpenStream($sink, 'w+');
|
392 |
+
}
|
393 |
+
$easy->sink = $sink;
|
394 |
+
$conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) {
|
395 |
+
return $sink->write($write);
|
396 |
+
};
|
397 |
+
} else {
|
398 |
+
// Use a default temp stream if no sink was set.
|
399 |
+
$conf[CURLOPT_FILE] = fopen('php://temp', 'w+');
|
400 |
+
$easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]);
|
401 |
+
}
|
402 |
+
$timeoutRequiresNoSignal = false;
|
403 |
+
if (isset($options['timeout'])) {
|
404 |
+
$timeoutRequiresNoSignal |= $options['timeout'] < 1;
|
405 |
+
$conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
|
406 |
+
}
|
407 |
+
|
408 |
+
// CURL default value is CURL_IPRESOLVE_WHATEVER
|
409 |
+
if (isset($options['force_ip_resolve'])) {
|
410 |
+
if ('v4' === $options['force_ip_resolve']) {
|
411 |
+
$conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
|
412 |
+
} elseif ('v6' === $options['force_ip_resolve']) {
|
413 |
+
$conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;
|
414 |
+
}
|
415 |
+
}
|
416 |
+
|
417 |
+
if (isset($options['connect_timeout'])) {
|
418 |
+
$timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
|
419 |
+
$conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
|
420 |
+
}
|
421 |
+
|
422 |
+
if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
|
423 |
+
$conf[CURLOPT_NOSIGNAL] = true;
|
424 |
+
}
|
425 |
+
|
426 |
+
if (isset($options['proxy'])) {
|
427 |
+
if (!is_array($options['proxy'])) {
|
428 |
+
$conf[CURLOPT_PROXY] = $options['proxy'];
|
429 |
+
} else {
|
430 |
+
$scheme = $easy->request->getUri()->getScheme();
|
431 |
+
if (isset($options['proxy'][$scheme])) {
|
432 |
+
$host = $easy->request->getUri()->getHost();
|
433 |
+
if (!isset($options['proxy']['no']) ||
|
434 |
+
!\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no'])
|
435 |
+
) {
|
436 |
+
$conf[CURLOPT_PROXY] = $options['proxy'][$scheme];
|
437 |
+
}
|
438 |
+
}
|
439 |
+
}
|
440 |
+
}
|
441 |
+
|
442 |
+
if (isset($options['cert'])) {
|
443 |
+
$cert = $options['cert'];
|
444 |
+
if (is_array($cert)) {
|
445 |
+
$conf[CURLOPT_SSLCERTPASSWD] = $cert[1];
|
446 |
+
$cert = $cert[0];
|
447 |
+
}
|
448 |
+
if (!file_exists($cert)) {
|
449 |
+
throw new \InvalidArgumentException(
|
450 |
+
"SSL certificate not found: {$cert}"
|
451 |
+
);
|
452 |
+
}
|
453 |
+
$conf[CURLOPT_SSLCERT] = $cert;
|
454 |
+
}
|
455 |
+
|
456 |
+
if (isset($options['ssl_key'])) {
|
457 |
+
if (is_array($options['ssl_key'])) {
|
458 |
+
if (count($options['ssl_key']) === 2) {
|
459 |
+
list($sslKey, $conf[CURLOPT_SSLKEYPASSWD]) = $options['ssl_key'];
|
460 |
+
} else {
|
461 |
+
list($sslKey) = $options['ssl_key'];
|
462 |
+
}
|
463 |
+
}
|
464 |
+
|
465 |
+
$sslKey = isset($sslKey) ? $sslKey: $options['ssl_key'];
|
466 |
+
|
467 |
+
if (!file_exists($sslKey)) {
|
468 |
+
throw new \InvalidArgumentException(
|
469 |
+
"SSL private key not found: {$sslKey}"
|
470 |
+
);
|
471 |
+
}
|
472 |
+
$conf[CURLOPT_SSLKEY] = $sslKey;
|
473 |
+
}
|
474 |
+
|
475 |
+
if (isset($options['progress'])) {
|
476 |
+
$progress = $options['progress'];
|
477 |
+
if (!is_callable($progress)) {
|
478 |
+
throw new \InvalidArgumentException(
|
479 |
+
'progress client option must be callable'
|
480 |
+
);
|
481 |
+
}
|
482 |
+
$conf[CURLOPT_NOPROGRESS] = false;
|
483 |
+
$conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) {
|
484 |
+
$args = func_get_args();
|
485 |
+
// PHP 5.5 pushed the handle onto the start of the args
|
486 |
+
if (is_resource($args[0])) {
|
487 |
+
array_shift($args);
|
488 |
+
}
|
489 |
+
call_user_func_array($progress, $args);
|
490 |
+
};
|
491 |
+
}
|
492 |
+
|
493 |
+
if (!empty($options['debug'])) {
|
494 |
+
$conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']);
|
495 |
+
$conf[CURLOPT_VERBOSE] = true;
|
496 |
+
}
|
497 |
+
}
|
498 |
+
|
499 |
+
/**
|
500 |
+
* This function ensures that a response was set on a transaction. If one
|
501 |
+
* was not set, then the request is retried if possible. This error
|
502 |
+
* typically means you are sending a payload, curl encountered a
|
503 |
+
* "Connection died, retrying a fresh connect" error, tried to rewind the
|
504 |
+
* stream, and then encountered a "necessary data rewind wasn't possible"
|
505 |
+
* error, causing the request to be sent through curl_multi_info_read()
|
506 |
+
* without an error status.
|
507 |
+
*/
|
508 |
+
private static function retryFailedRewind(
|
509 |
+
callable $handler,
|
510 |
+
EasyHandle $easy,
|
511 |
+
array $ctx
|
512 |
+
) {
|
513 |
+
try {
|
514 |
+
// Only rewind if the body has been read from.
|
515 |
+
$body = $easy->request->getBody();
|
516 |
+
if ($body->tell() > 0) {
|
517 |
+
$body->rewind();
|
518 |
+
}
|
519 |
+
} catch (\RuntimeException $e) {
|
520 |
+
$ctx['error'] = 'The connection unexpectedly failed without '
|
521 |
+
. 'providing an error. The request would have been retried, '
|
522 |
+
. 'but attempting to rewind the request body failed. '
|
523 |
+
. 'Exception: ' . $e;
|
524 |
+
return self::createRejection($easy, $ctx);
|
525 |
+
}
|
526 |
+
|
527 |
+
// Retry no more than 3 times before giving up.
|
528 |
+
if (!isset($easy->options['_curl_retries'])) {
|
529 |
+
$easy->options['_curl_retries'] = 1;
|
530 |
+
} elseif ($easy->options['_curl_retries'] == 2) {
|
531 |
+
$ctx['error'] = 'The cURL request was retried 3 times '
|
532 |
+
. 'and did not succeed. The most likely reason for the failure '
|
533 |
+
. 'is that cURL was unable to rewind the body of the request '
|
534 |
+
. 'and subsequent retries resulted in the same error. Turn on '
|
535 |
+
. 'the debug option to see what went wrong. See '
|
536 |
+
. 'https://bugs.php.net/bug.php?id=47204 for more information.';
|
537 |
+
return self::createRejection($easy, $ctx);
|
538 |
+
} else {
|
539 |
+
$easy->options['_curl_retries']++;
|
540 |
+
}
|
541 |
+
|
542 |
+
return $handler($easy->request, $easy->options);
|
543 |
+
}
|
544 |
+
|
545 |
+
private function createHeaderFn(EasyHandle $easy)
|
546 |
+
{
|
547 |
+
if (isset($easy->options['on_headers'])) {
|
548 |
+
$onHeaders = $easy->options['on_headers'];
|
549 |
+
|
550 |
+
if (!is_callable($onHeaders)) {
|
551 |
+
throw new \InvalidArgumentException('on_headers must be callable');
|
552 |
+
}
|
553 |
+
} else {
|
554 |
+
$onHeaders = null;
|
555 |
+
}
|
556 |
+
|
557 |
+
return function ($ch, $h) use (
|
558 |
+
$onHeaders,
|
559 |
+
$easy,
|
560 |
+
&$startingResponse
|
561 |
+
) {
|
562 |
+
$value = trim($h);
|
563 |
+
if ($value === '') {
|
564 |
+
$startingResponse = true;
|
565 |
+
$easy->createResponse();
|
566 |
+
if ($onHeaders !== null) {
|
567 |
+
try {
|
568 |
+
$onHeaders($easy->response);
|
569 |
+
} catch (\Exception $e) {
|
570 |
+
// Associate the exception with the handle and trigger
|
571 |
+
// a curl header write error by returning 0.
|
572 |
+
$easy->onHeadersException = $e;
|
573 |
+
return -1;
|
574 |
+
}
|
575 |
+
}
|
576 |
+
} elseif ($startingResponse) {
|
577 |
+
$startingResponse = false;
|
578 |
+
$easy->headers = [$value];
|
579 |
+
} else {
|
580 |
+
$easy->headers[] = $value;
|
581 |
+
}
|
582 |
+
return strlen($h);
|
583 |
+
};
|
584 |
+
}
|
585 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use Psr\Http\Message\RequestInterface;
|
5 |
+
|
6 |
+
interface CurlFactoryInterface
|
7 |
+
{
|
8 |
+
/**
|
9 |
+
* Creates a cURL handle resource.
|
10 |
+
*
|
11 |
+
* @param RequestInterface $request Request
|
12 |
+
* @param array $options Transfer options
|
13 |
+
*
|
14 |
+
* @return EasyHandle
|
15 |
+
* @throws \RuntimeException when an option cannot be applied
|
16 |
+
*/
|
17 |
+
public function create(RequestInterface $request, array $options);
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Release an easy handle, allowing it to be reused or closed.
|
21 |
+
*
|
22 |
+
* This function must call unset on the easy handle's "handle" property.
|
23 |
+
*
|
24 |
+
* @param EasyHandle $easy
|
25 |
+
*/
|
26 |
+
public function release(EasyHandle $easy);
|
27 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlHandler.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\Psr7;
|
5 |
+
use Psr\Http\Message\RequestInterface;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* HTTP handler that uses cURL easy handles as a transport layer.
|
9 |
+
*
|
10 |
+
* When using the CurlHandler, custom curl options can be specified as an
|
11 |
+
* associative array of curl option constants mapping to values in the
|
12 |
+
* **curl** key of the "client" key of the request.
|
13 |
+
*/
|
14 |
+
class CurlHandler
|
15 |
+
{
|
16 |
+
/** @var CurlFactoryInterface */
|
17 |
+
private $factory;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Accepts an associative array of options:
|
21 |
+
*
|
22 |
+
* - factory: Optional curl factory used to create cURL handles.
|
23 |
+
*
|
24 |
+
* @param array $options Array of options to use with the handler
|
25 |
+
*/
|
26 |
+
public function __construct(array $options = [])
|
27 |
+
{
|
28 |
+
$this->factory = isset($options['handle_factory'])
|
29 |
+
? $options['handle_factory']
|
30 |
+
: new CurlFactory(3);
|
31 |
+
}
|
32 |
+
|
33 |
+
public function __invoke(RequestInterface $request, array $options)
|
34 |
+
{
|
35 |
+
if (isset($options['delay'])) {
|
36 |
+
usleep($options['delay'] * 1000);
|
37 |
+
}
|
38 |
+
|
39 |
+
$easy = $this->factory->create($request, $options);
|
40 |
+
curl_exec($easy->handle);
|
41 |
+
$easy->errno = curl_errno($easy->handle);
|
42 |
+
|
43 |
+
return CurlFactory::finish($this, $easy, $this->factory);
|
44 |
+
}
|
45 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
ADDED
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\InvalidArgumentException;
|
5 |
+
use GuzzleHttp\Promise as P;
|
6 |
+
use GuzzleHttp\Promise\Promise;
|
7 |
+
use GuzzleHttp\Utils;
|
8 |
+
use Psr\Http\Message\RequestInterface;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Returns an asynchronous response using curl_multi_* functions.
|
12 |
+
*
|
13 |
+
* When using the CurlMultiHandler, custom curl options can be specified as an
|
14 |
+
* associative array of curl option constants mapping to values in the
|
15 |
+
* **curl** key of the provided request options.
|
16 |
+
*
|
17 |
+
* @property resource $_mh Internal use only. Lazy loaded multi-handle.
|
18 |
+
*/
|
19 |
+
class CurlMultiHandler
|
20 |
+
{
|
21 |
+
/** @var CurlFactoryInterface */
|
22 |
+
private $factory;
|
23 |
+
private $selectTimeout;
|
24 |
+
private $active;
|
25 |
+
private $handles = [];
|
26 |
+
private $delays = [];
|
27 |
+
private $options = [];
|
28 |
+
|
29 |
+
/**
|
30 |
+
* This handler accepts the following options:
|
31 |
+
*
|
32 |
+
* - handle_factory: An optional factory used to create curl handles
|
33 |
+
* - select_timeout: Optional timeout (in seconds) to block before timing
|
34 |
+
* out while selecting curl handles. Defaults to 1 second.
|
35 |
+
* - options: An associative array of CURLMOPT_* options and
|
36 |
+
* corresponding values for curl_multi_setopt()
|
37 |
+
*
|
38 |
+
* @param array $options
|
39 |
+
*/
|
40 |
+
public function __construct(array $options = [])
|
41 |
+
{
|
42 |
+
$this->factory = isset($options['handle_factory'])
|
43 |
+
? $options['handle_factory'] : new CurlFactory(50);
|
44 |
+
|
45 |
+
if (isset($options['select_timeout'])) {
|
46 |
+
$this->selectTimeout = $options['select_timeout'];
|
47 |
+
} elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {
|
48 |
+
$this->selectTimeout = $selectTimeout;
|
49 |
+
} else {
|
50 |
+
$this->selectTimeout = 1;
|
51 |
+
}
|
52 |
+
|
53 |
+
$this->options = isset($options['options']) ? $options['options'] : [];
|
54 |
+
}
|
55 |
+
|
56 |
+
public function __get($name)
|
57 |
+
{
|
58 |
+
if ($name === '_mh') {
|
59 |
+
$this->_mh = curl_multi_init();
|
60 |
+
|
61 |
+
foreach ($this->options as $option => $value) {
|
62 |
+
// A warning is raised in case of a wrong option.
|
63 |
+
curl_multi_setopt($this->_mh, $option, $value);
|
64 |
+
}
|
65 |
+
|
66 |
+
// Further calls to _mh will return the value directly, without entering the
|
67 |
+
// __get() method at all.
|
68 |
+
return $this->_mh;
|
69 |
+
}
|
70 |
+
|
71 |
+
throw new \BadMethodCallException();
|
72 |
+
}
|
73 |
+
|
74 |
+
public function __destruct()
|
75 |
+
{
|
76 |
+
if (isset($this->_mh)) {
|
77 |
+
curl_multi_close($this->_mh);
|
78 |
+
unset($this->_mh);
|
79 |
+
}
|
80 |
+
}
|
81 |
+
|
82 |
+
public function __invoke(RequestInterface $request, array $options)
|
83 |
+
{
|
84 |
+
$easy = $this->factory->create($request, $options);
|
85 |
+
$id = (int) $easy->handle;
|
86 |
+
|
87 |
+
$promise = new Promise(
|
88 |
+
[$this, 'execute'],
|
89 |
+
function () use ($id) {
|
90 |
+
return $this->cancel($id);
|
91 |
+
}
|
92 |
+
);
|
93 |
+
|
94 |
+
$this->addRequest(['easy' => $easy, 'deferred' => $promise]);
|
95 |
+
|
96 |
+
return $promise;
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Ticks the curl event loop.
|
101 |
+
*/
|
102 |
+
public function tick()
|
103 |
+
{
|
104 |
+
// Add any delayed handles if needed.
|
105 |
+
if ($this->delays) {
|
106 |
+
$currentTime = Utils::currentTime();
|
107 |
+
foreach ($this->delays as $id => $delay) {
|
108 |
+
if ($currentTime >= $delay) {
|
109 |
+
unset($this->delays[$id]);
|
110 |
+
curl_multi_add_handle(
|
111 |
+
$this->_mh,
|
112 |
+
$this->handles[$id]['easy']->handle
|
113 |
+
);
|
114 |
+
}
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
// Step through the task queue which may add additional requests.
|
119 |
+
P\queue()->run();
|
120 |
+
|
121 |
+
if ($this->active &&
|
122 |
+
curl_multi_select($this->_mh, $this->selectTimeout) === -1
|
123 |
+
) {
|
124 |
+
// Perform a usleep if a select returns -1.
|
125 |
+
// See: https://bugs.php.net/bug.php?id=61141
|
126 |
+
usleep(250);
|
127 |
+
}
|
128 |
+
|
129 |
+
while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM);
|
130 |
+
|
131 |
+
$this->processMessages();
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Runs until all outstanding connections have completed.
|
136 |
+
*/
|
137 |
+
public function execute()
|
138 |
+
{
|
139 |
+
$queue = P\queue();
|
140 |
+
|
141 |
+
while ($this->handles || !$queue->isEmpty()) {
|
142 |
+
// If there are no transfers, then sleep for the next delay
|
143 |
+
if (!$this->active && $this->delays) {
|
144 |
+
usleep($this->timeToNext());
|
145 |
+
}
|
146 |
+
$this->tick();
|
147 |
+
}
|
148 |
+
}
|
149 |
+
|
150 |
+
private function addRequest(array $entry)
|
151 |
+
{
|
152 |
+
$easy = $entry['easy'];
|
153 |
+
$id = (int) $easy->handle;
|
154 |
+
$this->handles[$id] = $entry;
|
155 |
+
if (empty($easy->options['delay'])) {
|
156 |
+
curl_multi_add_handle($this->_mh, $easy->handle);
|
157 |
+
} else {
|
158 |
+
$this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000);
|
159 |
+
}
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Cancels a handle from sending and removes references to it.
|
164 |
+
*
|
165 |
+
* @param int $id Handle ID to cancel and remove.
|
166 |
+
*
|
167 |
+
* @return bool True on success, false on failure.
|
168 |
+
*/
|
169 |
+
private function cancel($id)
|
170 |
+
{
|
171 |
+
// Cannot cancel if it has been processed.
|
172 |
+
if (!isset($this->handles[$id])) {
|
173 |
+
return false;
|
174 |
+
}
|
175 |
+
|
176 |
+
$handle = $this->handles[$id]['easy']->handle;
|
177 |
+
unset($this->delays[$id], $this->handles[$id]);
|
178 |
+
curl_multi_remove_handle($this->_mh, $handle);
|
179 |
+
curl_close($handle);
|
180 |
+
|
181 |
+
return true;
|
182 |
+
}
|
183 |
+
|
184 |
+
private function processMessages()
|
185 |
+
{
|
186 |
+
while ($done = curl_multi_info_read($this->_mh)) {
|
187 |
+
$id = (int) $done['handle'];
|
188 |
+
curl_multi_remove_handle($this->_mh, $done['handle']);
|
189 |
+
|
190 |
+
if (!isset($this->handles[$id])) {
|
191 |
+
// Probably was cancelled.
|
192 |
+
continue;
|
193 |
+
}
|
194 |
+
|
195 |
+
$entry = $this->handles[$id];
|
196 |
+
unset($this->handles[$id], $this->delays[$id]);
|
197 |
+
$entry['easy']->errno = $done['result'];
|
198 |
+
$entry['deferred']->resolve(
|
199 |
+
CurlFactory::finish(
|
200 |
+
$this,
|
201 |
+
$entry['easy'],
|
202 |
+
$this->factory
|
203 |
+
)
|
204 |
+
);
|
205 |
+
}
|
206 |
+
}
|
207 |
+
|
208 |
+
private function timeToNext()
|
209 |
+
{
|
210 |
+
$currentTime = Utils::currentTime();
|
211 |
+
$nextTime = PHP_INT_MAX;
|
212 |
+
foreach ($this->delays as $time) {
|
213 |
+
if ($time < $nextTime) {
|
214 |
+
$nextTime = $time;
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
return max(0, $nextTime - $currentTime) * 1000000;
|
219 |
+
}
|
220 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/EasyHandle.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\Psr7\Response;
|
5 |
+
use Psr\Http\Message\RequestInterface;
|
6 |
+
use Psr\Http\Message\ResponseInterface;
|
7 |
+
use Psr\Http\Message\StreamInterface;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Represents a cURL easy handle and the data it populates.
|
11 |
+
*
|
12 |
+
* @internal
|
13 |
+
*/
|
14 |
+
final class EasyHandle
|
15 |
+
{
|
16 |
+
/** @var resource cURL resource */
|
17 |
+
public $handle;
|
18 |
+
|
19 |
+
/** @var StreamInterface Where data is being written */
|
20 |
+
public $sink;
|
21 |
+
|
22 |
+
/** @var array Received HTTP headers so far */
|
23 |
+
public $headers = [];
|
24 |
+
|
25 |
+
/** @var ResponseInterface Received response (if any) */
|
26 |
+
public $response;
|
27 |
+
|
28 |
+
/** @var RequestInterface Request being sent */
|
29 |
+
public $request;
|
30 |
+
|
31 |
+
/** @var array Request options */
|
32 |
+
public $options = [];
|
33 |
+
|
34 |
+
/** @var int cURL error number (if any) */
|
35 |
+
public $errno = 0;
|
36 |
+
|
37 |
+
/** @var \Exception Exception during on_headers (if any) */
|
38 |
+
public $onHeadersException;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Attach a response to the easy handle based on the received headers.
|
42 |
+
*
|
43 |
+
* @throws \RuntimeException if no headers have been received.
|
44 |
+
*/
|
45 |
+
public function createResponse()
|
46 |
+
{
|
47 |
+
if (empty($this->headers)) {
|
48 |
+
throw new \RuntimeException('No headers have been received');
|
49 |
+
}
|
50 |
+
|
51 |
+
// HTTP-version SP status-code SP reason-phrase
|
52 |
+
$startLine = explode(' ', array_shift($this->headers), 3);
|
53 |
+
$headers = \GuzzleHttp\headers_from_lines($this->headers);
|
54 |
+
$normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
|
55 |
+
|
56 |
+
if (!empty($this->options['decode_content'])
|
57 |
+
&& isset($normalizedKeys['content-encoding'])
|
58 |
+
) {
|
59 |
+
$headers['x-encoded-content-encoding']
|
60 |
+
= $headers[$normalizedKeys['content-encoding']];
|
61 |
+
unset($headers[$normalizedKeys['content-encoding']]);
|
62 |
+
if (isset($normalizedKeys['content-length'])) {
|
63 |
+
$headers['x-encoded-content-length']
|
64 |
+
= $headers[$normalizedKeys['content-length']];
|
65 |
+
|
66 |
+
$bodyLength = (int) $this->sink->getSize();
|
67 |
+
if ($bodyLength) {
|
68 |
+
$headers[$normalizedKeys['content-length']] = $bodyLength;
|
69 |
+
} else {
|
70 |
+
unset($headers[$normalizedKeys['content-length']]);
|
71 |
+
}
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
// Attach a response to the easy handle with the parsed headers.
|
76 |
+
$this->response = new Response(
|
77 |
+
$startLine[1],
|
78 |
+
$headers,
|
79 |
+
$this->sink,
|
80 |
+
substr($startLine[0], 5),
|
81 |
+
isset($startLine[2]) ? (string) $startLine[2] : null
|
82 |
+
);
|
83 |
+
}
|
84 |
+
|
85 |
+
public function __get($name)
|
86 |
+
{
|
87 |
+
$msg = $name === 'handle'
|
88 |
+
? 'The EasyHandle has been released'
|
89 |
+
: 'Invalid property: ' . $name;
|
90 |
+
throw new \BadMethodCallException($msg);
|
91 |
+
}
|
92 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/MockHandler.php
ADDED
@@ -0,0 +1,195 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\RequestException;
|
5 |
+
use GuzzleHttp\HandlerStack;
|
6 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
7 |
+
use GuzzleHttp\Promise\RejectedPromise;
|
8 |
+
use GuzzleHttp\TransferStats;
|
9 |
+
use Psr\Http\Message\RequestInterface;
|
10 |
+
use Psr\Http\Message\ResponseInterface;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Handler that returns responses or throw exceptions from a queue.
|
14 |
+
*/
|
15 |
+
class MockHandler implements \Countable
|
16 |
+
{
|
17 |
+
private $queue = [];
|
18 |
+
private $lastRequest;
|
19 |
+
private $lastOptions;
|
20 |
+
private $onFulfilled;
|
21 |
+
private $onRejected;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Creates a new MockHandler that uses the default handler stack list of
|
25 |
+
* middlewares.
|
26 |
+
*
|
27 |
+
* @param array $queue Array of responses, callables, or exceptions.
|
28 |
+
* @param callable $onFulfilled Callback to invoke when the return value is fulfilled.
|
29 |
+
* @param callable $onRejected Callback to invoke when the return value is rejected.
|
30 |
+
*
|
31 |
+
* @return HandlerStack
|
32 |
+
*/
|
33 |
+
public static function createWithMiddleware(
|
34 |
+
array $queue = null,
|
35 |
+
callable $onFulfilled = null,
|
36 |
+
callable $onRejected = null
|
37 |
+
) {
|
38 |
+
return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* The passed in value must be an array of
|
43 |
+
* {@see Psr7\Http\Message\ResponseInterface} objects, Exceptions,
|
44 |
+
* callables, or Promises.
|
45 |
+
*
|
46 |
+
* @param array $queue
|
47 |
+
* @param callable $onFulfilled Callback to invoke when the return value is fulfilled.
|
48 |
+
* @param callable $onRejected Callback to invoke when the return value is rejected.
|
49 |
+
*/
|
50 |
+
public function __construct(
|
51 |
+
array $queue = null,
|
52 |
+
callable $onFulfilled = null,
|
53 |
+
callable $onRejected = null
|
54 |
+
) {
|
55 |
+
$this->onFulfilled = $onFulfilled;
|
56 |
+
$this->onRejected = $onRejected;
|
57 |
+
|
58 |
+
if ($queue) {
|
59 |
+
call_user_func_array([$this, 'append'], $queue);
|
60 |
+
}
|
61 |
+
}
|
62 |
+
|
63 |
+
public function __invoke(RequestInterface $request, array $options)
|
64 |
+
{
|
65 |
+
if (!$this->queue) {
|
66 |
+
throw new \OutOfBoundsException('Mock queue is empty');
|
67 |
+
}
|
68 |
+
|
69 |
+
if (isset($options['delay']) && is_numeric($options['delay'])) {
|
70 |
+
usleep($options['delay'] * 1000);
|
71 |
+
}
|
72 |
+
|
73 |
+
$this->lastRequest = $request;
|
74 |
+
$this->lastOptions = $options;
|
75 |
+
$response = array_shift($this->queue);
|
76 |
+
|
77 |
+
if (isset($options['on_headers'])) {
|
78 |
+
if (!is_callable($options['on_headers'])) {
|
79 |
+
throw new \InvalidArgumentException('on_headers must be callable');
|
80 |
+
}
|
81 |
+
try {
|
82 |
+
$options['on_headers']($response);
|
83 |
+
} catch (\Exception $e) {
|
84 |
+
$msg = 'An error was encountered during the on_headers event';
|
85 |
+
$response = new RequestException($msg, $request, $response, $e);
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
if (is_callable($response)) {
|
90 |
+
$response = call_user_func($response, $request, $options);
|
91 |
+
}
|
92 |
+
|
93 |
+
$response = $response instanceof \Exception
|
94 |
+
? \GuzzleHttp\Promise\rejection_for($response)
|
95 |
+
: \GuzzleHttp\Promise\promise_for($response);
|
96 |
+
|
97 |
+
return $response->then(
|
98 |
+
function ($value) use ($request, $options) {
|
99 |
+
$this->invokeStats($request, $options, $value);
|
100 |
+
if ($this->onFulfilled) {
|
101 |
+
call_user_func($this->onFulfilled, $value);
|
102 |
+
}
|
103 |
+
if (isset($options['sink'])) {
|
104 |
+
$contents = (string) $value->getBody();
|
105 |
+
$sink = $options['sink'];
|
106 |
+
|
107 |
+
if (is_resource($sink)) {
|
108 |
+
fwrite($sink, $contents);
|
109 |
+
} elseif (is_string($sink)) {
|
110 |
+
file_put_contents($sink, $contents);
|
111 |
+
} elseif ($sink instanceof \Psr\Http\Message\StreamInterface) {
|
112 |
+
$sink->write($contents);
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
return $value;
|
117 |
+
},
|
118 |
+
function ($reason) use ($request, $options) {
|
119 |
+
$this->invokeStats($request, $options, null, $reason);
|
120 |
+
if ($this->onRejected) {
|
121 |
+
call_user_func($this->onRejected, $reason);
|
122 |
+
}
|
123 |
+
return \GuzzleHttp\Promise\rejection_for($reason);
|
124 |
+
}
|
125 |
+
);
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Adds one or more variadic requests, exceptions, callables, or promises
|
130 |
+
* to the queue.
|
131 |
+
*/
|
132 |
+
public function append()
|
133 |
+
{
|
134 |
+
foreach (func_get_args() as $value) {
|
135 |
+
if ($value instanceof ResponseInterface
|
136 |
+
|| $value instanceof \Exception
|
137 |
+
|| $value instanceof PromiseInterface
|
138 |
+
|| is_callable($value)
|
139 |
+
) {
|
140 |
+
$this->queue[] = $value;
|
141 |
+
} else {
|
142 |
+
throw new \InvalidArgumentException('Expected a response or '
|
143 |
+
. 'exception. Found ' . \GuzzleHttp\describe_type($value));
|
144 |
+
}
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Get the last received request.
|
150 |
+
*
|
151 |
+
* @return RequestInterface
|
152 |
+
*/
|
153 |
+
public function getLastRequest()
|
154 |
+
{
|
155 |
+
return $this->lastRequest;
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Get the last received request options.
|
160 |
+
*
|
161 |
+
* @return array
|
162 |
+
*/
|
163 |
+
public function getLastOptions()
|
164 |
+
{
|
165 |
+
return $this->lastOptions;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Returns the number of remaining items in the queue.
|
170 |
+
*
|
171 |
+
* @return int
|
172 |
+
*/
|
173 |
+
public function count()
|
174 |
+
{
|
175 |
+
return count($this->queue);
|
176 |
+
}
|
177 |
+
|
178 |
+
public function reset()
|
179 |
+
{
|
180 |
+
$this->queue = [];
|
181 |
+
}
|
182 |
+
|
183 |
+
private function invokeStats(
|
184 |
+
RequestInterface $request,
|
185 |
+
array $options,
|
186 |
+
ResponseInterface $response = null,
|
187 |
+
$reason = null
|
188 |
+
) {
|
189 |
+
if (isset($options['on_stats'])) {
|
190 |
+
$transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0;
|
191 |
+
$stats = new TransferStats($request, $response, $transferTime, $reason);
|
192 |
+
call_user_func($options['on_stats'], $stats);
|
193 |
+
}
|
194 |
+
}
|
195 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/Proxy.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\RequestOptions;
|
5 |
+
use Psr\Http\Message\RequestInterface;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Provides basic proxies for handlers.
|
9 |
+
*/
|
10 |
+
class Proxy
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* Sends synchronous requests to a specific handler while sending all other
|
14 |
+
* requests to another handler.
|
15 |
+
*
|
16 |
+
* @param callable $default Handler used for normal responses
|
17 |
+
* @param callable $sync Handler used for synchronous responses.
|
18 |
+
*
|
19 |
+
* @return callable Returns the composed handler.
|
20 |
+
*/
|
21 |
+
public static function wrapSync(
|
22 |
+
callable $default,
|
23 |
+
callable $sync
|
24 |
+
) {
|
25 |
+
return function (RequestInterface $request, array $options) use ($default, $sync) {
|
26 |
+
return empty($options[RequestOptions::SYNCHRONOUS])
|
27 |
+
? $default($request, $options)
|
28 |
+
: $sync($request, $options);
|
29 |
+
};
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Sends streaming requests to a streaming compatible handler while sending
|
34 |
+
* all other requests to a default handler.
|
35 |
+
*
|
36 |
+
* This, for example, could be useful for taking advantage of the
|
37 |
+
* performance benefits of curl while still supporting true streaming
|
38 |
+
* through the StreamHandler.
|
39 |
+
*
|
40 |
+
* @param callable $default Handler used for non-streaming responses
|
41 |
+
* @param callable $streaming Handler used for streaming responses
|
42 |
+
*
|
43 |
+
* @return callable Returns the composed handler.
|
44 |
+
*/
|
45 |
+
public static function wrapStreaming(
|
46 |
+
callable $default,
|
47 |
+
callable $streaming
|
48 |
+
) {
|
49 |
+
return function (RequestInterface $request, array $options) use ($default, $streaming) {
|
50 |
+
return empty($options['stream'])
|
51 |
+
? $default($request, $options)
|
52 |
+
: $streaming($request, $options);
|
53 |
+
};
|
54 |
+
}
|
55 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Handler/StreamHandler.php
ADDED
@@ -0,0 +1,545 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Handler;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\ConnectException;
|
5 |
+
use GuzzleHttp\Exception\RequestException;
|
6 |
+
use GuzzleHttp\Promise\FulfilledPromise;
|
7 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
8 |
+
use GuzzleHttp\Psr7;
|
9 |
+
use GuzzleHttp\TransferStats;
|
10 |
+
use GuzzleHttp\Utils;
|
11 |
+
use Psr\Http\Message\RequestInterface;
|
12 |
+
use Psr\Http\Message\ResponseInterface;
|
13 |
+
use Psr\Http\Message\StreamInterface;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* HTTP handler that uses PHP's HTTP stream wrapper.
|
17 |
+
*/
|
18 |
+
class StreamHandler
|
19 |
+
{
|
20 |
+
private $lastHeaders = [];
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Sends an HTTP request.
|
24 |
+
*
|
25 |
+
* @param RequestInterface $request Request to send.
|
26 |
+
* @param array $options Request transfer options.
|
27 |
+
*
|
28 |
+
* @return PromiseInterface
|
29 |
+
*/
|
30 |
+
public function __invoke(RequestInterface $request, array $options)
|
31 |
+
{
|
32 |
+
// Sleep if there is a delay specified.
|
33 |
+
if (isset($options['delay'])) {
|
34 |
+
usleep($options['delay'] * 1000);
|
35 |
+
}
|
36 |
+
|
37 |
+
$startTime = isset($options['on_stats']) ? Utils::currentTime() : null;
|
38 |
+
|
39 |
+
try {
|
40 |
+
// Does not support the expect header.
|
41 |
+
$request = $request->withoutHeader('Expect');
|
42 |
+
|
43 |
+
// Append a content-length header if body size is zero to match
|
44 |
+
// cURL's behavior.
|
45 |
+
if (0 === $request->getBody()->getSize()) {
|
46 |
+
$request = $request->withHeader('Content-Length', '0');
|
47 |
+
}
|
48 |
+
|
49 |
+
return $this->createResponse(
|
50 |
+
$request,
|
51 |
+
$options,
|
52 |
+
$this->createStream($request, $options),
|
53 |
+
$startTime
|
54 |
+
);
|
55 |
+
} catch (\InvalidArgumentException $e) {
|
56 |
+
throw $e;
|
57 |
+
} catch (\Exception $e) {
|
58 |
+
// Determine if the error was a networking error.
|
59 |
+
$message = $e->getMessage();
|
60 |
+
// This list can probably get more comprehensive.
|
61 |
+
if (strpos($message, 'getaddrinfo') // DNS lookup failed
|
62 |
+
|| strpos($message, 'Connection refused')
|
63 |
+
|| strpos($message, "couldn't connect to host") // error on HHVM
|
64 |
+
|| strpos($message, "connection attempt failed")
|
65 |
+
) {
|
66 |
+
$e = new ConnectException($e->getMessage(), $request, $e);
|
67 |
+
}
|
68 |
+
$e = RequestException::wrapException($request, $e);
|
69 |
+
$this->invokeStats($options, $request, $startTime, null, $e);
|
70 |
+
|
71 |
+
return \GuzzleHttp\Promise\rejection_for($e);
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
private function invokeStats(
|
76 |
+
array $options,
|
77 |
+
RequestInterface $request,
|
78 |
+
$startTime,
|
79 |
+
ResponseInterface $response = null,
|
80 |
+
$error = null
|
81 |
+
) {
|
82 |
+
if (isset($options['on_stats'])) {
|
83 |
+
$stats = new TransferStats(
|
84 |
+
$request,
|
85 |
+
$response,
|
86 |
+
Utils::currentTime() - $startTime,
|
87 |
+
$error,
|
88 |
+
[]
|
89 |
+
);
|
90 |
+
call_user_func($options['on_stats'], $stats);
|
91 |
+
}
|
92 |
+
}
|
93 |
+
|
94 |
+
private function createResponse(
|
95 |
+
RequestInterface $request,
|
96 |
+
array $options,
|
97 |
+
$stream,
|
98 |
+
$startTime
|
99 |
+
) {
|
100 |
+
$hdrs = $this->lastHeaders;
|
101 |
+
$this->lastHeaders = [];
|
102 |
+
$parts = explode(' ', array_shift($hdrs), 3);
|
103 |
+
$ver = explode('/', $parts[0])[1];
|
104 |
+
$status = $parts[1];
|
105 |
+
$reason = isset($parts[2]) ? $parts[2] : null;
|
106 |
+
$headers = \GuzzleHttp\headers_from_lines($hdrs);
|
107 |
+
list($stream, $headers) = $this->checkDecode($options, $headers, $stream);
|
108 |
+
$stream = Psr7\stream_for($stream);
|
109 |
+
$sink = $stream;
|
110 |
+
|
111 |
+
if (strcasecmp('HEAD', $request->getMethod())) {
|
112 |
+
$sink = $this->createSink($stream, $options);
|
113 |
+
}
|
114 |
+
|
115 |
+
$response = new Psr7\Response($status, $headers, $sink, $ver, $reason);
|
116 |
+
|
117 |
+
if (isset($options['on_headers'])) {
|
118 |
+
try {
|
119 |
+
$options['on_headers']($response);
|
120 |
+
} catch (\Exception $e) {
|
121 |
+
$msg = 'An error was encountered during the on_headers event';
|
122 |
+
$ex = new RequestException($msg, $request, $response, $e);
|
123 |
+
return \GuzzleHttp\Promise\rejection_for($ex);
|
124 |
+
}
|
125 |
+
}
|
126 |
+
|
127 |
+
// Do not drain when the request is a HEAD request because they have
|
128 |
+
// no body.
|
129 |
+
if ($sink !== $stream) {
|
130 |
+
$this->drain(
|
131 |
+
$stream,
|
132 |
+
$sink,
|
133 |
+
$response->getHeaderLine('Content-Length')
|
134 |
+
);
|
135 |
+
}
|
136 |
+
|
137 |
+
$this->invokeStats($options, $request, $startTime, $response, null);
|
138 |
+
|
139 |
+
return new FulfilledPromise($response);
|
140 |
+
}
|
141 |
+
|
142 |
+
private function createSink(StreamInterface $stream, array $options)
|
143 |
+
{
|
144 |
+
if (!empty($options['stream'])) {
|
145 |
+
return $stream;
|
146 |
+
}
|
147 |
+
|
148 |
+
$sink = isset($options['sink'])
|
149 |
+
? $options['sink']
|
150 |
+
: fopen('php://temp', 'r+');
|
151 |
+
|
152 |
+
return is_string($sink)
|
153 |
+
? new Psr7\LazyOpenStream($sink, 'w+')
|
154 |
+
: Psr7\stream_for($sink);
|
155 |
+
}
|
156 |
+
|
157 |
+
private function checkDecode(array $options, array $headers, $stream)
|
158 |
+
{
|
159 |
+
// Automatically decode responses when instructed.
|
160 |
+
if (!empty($options['decode_content'])) {
|
161 |
+
$normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
|
162 |
+
if (isset($normalizedKeys['content-encoding'])) {
|
163 |
+
$encoding = $headers[$normalizedKeys['content-encoding']];
|
164 |
+
if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {
|
165 |
+
$stream = new Psr7\InflateStream(
|
166 |
+
Psr7\stream_for($stream)
|
167 |
+
);
|
168 |
+
$headers['x-encoded-content-encoding']
|
169 |
+
= $headers[$normalizedKeys['content-encoding']];
|
170 |
+
// Remove content-encoding header
|
171 |
+
unset($headers[$normalizedKeys['content-encoding']]);
|
172 |
+
// Fix content-length header
|
173 |
+
if (isset($normalizedKeys['content-length'])) {
|
174 |
+
$headers['x-encoded-content-length']
|
175 |
+
= $headers[$normalizedKeys['content-length']];
|
176 |
+
|
177 |
+
$length = (int) $stream->getSize();
|
178 |
+
if ($length === 0) {
|
179 |
+
unset($headers[$normalizedKeys['content-length']]);
|
180 |
+
} else {
|
181 |
+
$headers[$normalizedKeys['content-length']] = [$length];
|
182 |
+
}
|
183 |
+
}
|
184 |
+
}
|
185 |
+
}
|
186 |
+
}
|
187 |
+
|
188 |
+
return [$stream, $headers];
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Drains the source stream into the "sink" client option.
|
193 |
+
*
|
194 |
+
* @param StreamInterface $source
|
195 |
+
* @param StreamInterface $sink
|
196 |
+
* @param string $contentLength Header specifying the amount of
|
197 |
+
* data to read.
|
198 |
+
*
|
199 |
+
* @return StreamInterface
|
200 |
+
* @throws \RuntimeException when the sink option is invalid.
|
201 |
+
*/
|
202 |
+
private function drain(
|
203 |
+
StreamInterface $source,
|
204 |
+
StreamInterface $sink,
|
205 |
+
$contentLength
|
206 |
+
) {
|
207 |
+
// If a content-length header is provided, then stop reading once
|
208 |
+
// that number of bytes has been read. This can prevent infinitely
|
209 |
+
// reading from a stream when dealing with servers that do not honor
|
210 |
+
// Connection: Close headers.
|
211 |
+
Psr7\copy_to_stream(
|
212 |
+
$source,
|
213 |
+
$sink,
|
214 |
+
(strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1
|
215 |
+
);
|
216 |
+
|
217 |
+
$sink->seek(0);
|
218 |
+
$source->close();
|
219 |
+
|
220 |
+
return $sink;
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Create a resource and check to ensure it was created successfully
|
225 |
+
*
|
226 |
+
* @param callable $callback Callable that returns stream resource
|
227 |
+
*
|
228 |
+
* @return resource
|
229 |
+
* @throws \RuntimeException on error
|
230 |
+
*/
|
231 |
+
private function createResource(callable $callback)
|
232 |
+
{
|
233 |
+
$errors = null;
|
234 |
+
set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {
|
235 |
+
$errors[] = [
|
236 |
+
'message' => $msg,
|
237 |
+
'file' => $file,
|
238 |
+
'line' => $line
|
239 |
+
];
|
240 |
+
return true;
|
241 |
+
});
|
242 |
+
|
243 |
+
$resource = $callback();
|
244 |
+
restore_error_handler();
|
245 |
+
|
246 |
+
if (!$resource) {
|
247 |
+
$message = 'Error creating resource: ';
|
248 |
+
foreach ($errors as $err) {
|
249 |
+
foreach ($err as $key => $value) {
|
250 |
+
$message .= "[$key] $value" . PHP_EOL;
|
251 |
+
}
|
252 |
+
}
|
253 |
+
throw new \RuntimeException(trim($message));
|
254 |
+
}
|
255 |
+
|
256 |
+
return $resource;
|
257 |
+
}
|
258 |
+
|
259 |
+
private function createStream(RequestInterface $request, array $options)
|
260 |
+
{
|
261 |
+
static $methods;
|
262 |
+
if (!$methods) {
|
263 |
+
$methods = array_flip(get_class_methods(__CLASS__));
|
264 |
+
}
|
265 |
+
|
266 |
+
// HTTP/1.1 streams using the PHP stream wrapper require a
|
267 |
+
// Connection: close header
|
268 |
+
if ($request->getProtocolVersion() == '1.1'
|
269 |
+
&& !$request->hasHeader('Connection')
|
270 |
+
) {
|
271 |
+
$request = $request->withHeader('Connection', 'close');
|
272 |
+
}
|
273 |
+
|
274 |
+
// Ensure SSL is verified by default
|
275 |
+
if (!isset($options['verify'])) {
|
276 |
+
$options['verify'] = true;
|
277 |
+
}
|
278 |
+
|
279 |
+
$params = [];
|
280 |
+
$context = $this->getDefaultContext($request);
|
281 |
+
|
282 |
+
if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {
|
283 |
+
throw new \InvalidArgumentException('on_headers must be callable');
|
284 |
+
}
|
285 |
+
|
286 |
+
if (!empty($options)) {
|
287 |
+
foreach ($options as $key => $value) {
|
288 |
+
$method = "add_{$key}";
|
289 |
+
if (isset($methods[$method])) {
|
290 |
+
$this->{$method}($request, $context, $value, $params);
|
291 |
+
}
|
292 |
+
}
|
293 |
+
}
|
294 |
+
|
295 |
+
if (isset($options['stream_context'])) {
|
296 |
+
if (!is_array($options['stream_context'])) {
|
297 |
+
throw new \InvalidArgumentException('stream_context must be an array');
|
298 |
+
}
|
299 |
+
$context = array_replace_recursive(
|
300 |
+
$context,
|
301 |
+
$options['stream_context']
|
302 |
+
);
|
303 |
+
}
|
304 |
+
|
305 |
+
// Microsoft NTLM authentication only supported with curl handler
|
306 |
+
if (isset($options['auth'])
|
307 |
+
&& is_array($options['auth'])
|
308 |
+
&& isset($options['auth'][2])
|
309 |
+
&& 'ntlm' == $options['auth'][2]
|
310 |
+
) {
|
311 |
+
throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
|
312 |
+
}
|
313 |
+
|
314 |
+
$uri = $this->resolveHost($request, $options);
|
315 |
+
|
316 |
+
$context = $this->createResource(
|
317 |
+
function () use ($context, $params) {
|
318 |
+
return stream_context_create($context, $params);
|
319 |
+
}
|
320 |
+
);
|
321 |
+
|
322 |
+
return $this->createResource(
|
323 |
+
function () use ($uri, &$http_response_header, $context, $options) {
|
324 |
+
$resource = fopen((string) $uri, 'r', null, $context);
|
325 |
+
$this->lastHeaders = $http_response_header;
|
326 |
+
|
327 |
+
if (isset($options['read_timeout'])) {
|
328 |
+
$readTimeout = $options['read_timeout'];
|
329 |
+
$sec = (int) $readTimeout;
|
330 |
+
$usec = ($readTimeout - $sec) * 100000;
|
331 |
+
stream_set_timeout($resource, $sec, $usec);
|
332 |
+
}
|
333 |
+
|
334 |
+
return $resource;
|
335 |
+
}
|
336 |
+
);
|
337 |
+
}
|
338 |
+
|
339 |
+
private function resolveHost(RequestInterface $request, array $options)
|
340 |
+
{
|
341 |
+
$uri = $request->getUri();
|
342 |
+
|
343 |
+
if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {
|
344 |
+
if ('v4' === $options['force_ip_resolve']) {
|
345 |
+
$records = dns_get_record($uri->getHost(), DNS_A);
|
346 |
+
if (!isset($records[0]['ip'])) {
|
347 |
+
throw new ConnectException(
|
348 |
+
sprintf(
|
349 |
+
"Could not resolve IPv4 address for host '%s'",
|
350 |
+
$uri->getHost()
|
351 |
+
),
|
352 |
+
$request
|
353 |
+
);
|
354 |
+
}
|
355 |
+
$uri = $uri->withHost($records[0]['ip']);
|
356 |
+
} elseif ('v6' === $options['force_ip_resolve']) {
|
357 |
+
$records = dns_get_record($uri->getHost(), DNS_AAAA);
|
358 |
+
if (!isset($records[0]['ipv6'])) {
|
359 |
+
throw new ConnectException(
|
360 |
+
sprintf(
|
361 |
+
"Could not resolve IPv6 address for host '%s'",
|
362 |
+
$uri->getHost()
|
363 |
+
),
|
364 |
+
$request
|
365 |
+
);
|
366 |
+
}
|
367 |
+
$uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');
|
368 |
+
}
|
369 |
+
}
|
370 |
+
|
371 |
+
return $uri;
|
372 |
+
}
|
373 |
+
|
374 |
+
private function getDefaultContext(RequestInterface $request)
|
375 |
+
{
|
376 |
+
$headers = '';
|
377 |
+
foreach ($request->getHeaders() as $name => $value) {
|
378 |
+
foreach ($value as $val) {
|
379 |
+
$headers .= "$name: $val\r\n";
|
380 |
+
}
|
381 |
+
}
|
382 |
+
|
383 |
+
$context = [
|
384 |
+
'http' => [
|
385 |
+
'method' => $request->getMethod(),
|
386 |
+
'header' => $headers,
|
387 |
+
'protocol_version' => $request->getProtocolVersion(),
|
388 |
+
'ignore_errors' => true,
|
389 |
+
'follow_location' => 0,
|
390 |
+
],
|
391 |
+
];
|
392 |
+
|
393 |
+
$body = (string) $request->getBody();
|
394 |
+
|
395 |
+
if (!empty($body)) {
|
396 |
+
$context['http']['content'] = $body;
|
397 |
+
// Prevent the HTTP handler from adding a Content-Type header.
|
398 |
+
if (!$request->hasHeader('Content-Type')) {
|
399 |
+
$context['http']['header'] .= "Content-Type:\r\n";
|
400 |
+
}
|
401 |
+
}
|
402 |
+
|
403 |
+
$context['http']['header'] = rtrim($context['http']['header']);
|
404 |
+
|
405 |
+
return $context;
|
406 |
+
}
|
407 |
+
|
408 |
+
private function add_proxy(RequestInterface $request, &$options, $value, &$params)
|
409 |
+
{
|
410 |
+
if (!is_array($value)) {
|
411 |
+
$options['http']['proxy'] = $value;
|
412 |
+
} else {
|
413 |
+
$scheme = $request->getUri()->getScheme();
|
414 |
+
if (isset($value[$scheme])) {
|
415 |
+
if (!isset($value['no'])
|
416 |
+
|| !\GuzzleHttp\is_host_in_noproxy(
|
417 |
+
$request->getUri()->getHost(),
|
418 |
+
$value['no']
|
419 |
+
)
|
420 |
+
) {
|
421 |
+
$options['http']['proxy'] = $value[$scheme];
|
422 |
+
}
|
423 |
+
}
|
424 |
+
}
|
425 |
+
}
|
426 |
+
|
427 |
+
private function add_timeout(RequestInterface $request, &$options, $value, &$params)
|
428 |
+
{
|
429 |
+
if ($value > 0) {
|
430 |
+
$options['http']['timeout'] = $value;
|
431 |
+
}
|
432 |
+
}
|
433 |
+
|
434 |
+
private function add_verify(RequestInterface $request, &$options, $value, &$params)
|
435 |
+
{
|
436 |
+
if ($value === true) {
|
437 |
+
// PHP 5.6 or greater will find the system cert by default. When
|
438 |
+
// < 5.6, use the Guzzle bundled cacert.
|
439 |
+
if (PHP_VERSION_ID < 50600) {
|
440 |
+
$options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle();
|
441 |
+
}
|
442 |
+
} elseif (is_string($value)) {
|
443 |
+
$options['ssl']['cafile'] = $value;
|
444 |
+
if (!file_exists($value)) {
|
445 |
+
throw new \RuntimeException("SSL CA bundle not found: $value");
|
446 |
+
}
|
447 |
+
} elseif ($value === false) {
|
448 |
+
$options['ssl']['verify_peer'] = false;
|
449 |
+
$options['ssl']['verify_peer_name'] = false;
|
450 |
+
return;
|
451 |
+
} else {
|
452 |
+
throw new \InvalidArgumentException('Invalid verify request option');
|
453 |
+
}
|
454 |
+
|
455 |
+
$options['ssl']['verify_peer'] = true;
|
456 |
+
$options['ssl']['verify_peer_name'] = true;
|
457 |
+
$options['ssl']['allow_self_signed'] = false;
|
458 |
+
}
|
459 |
+
|
460 |
+
private function add_cert(RequestInterface $request, &$options, $value, &$params)
|
461 |
+
{
|
462 |
+
if (is_array($value)) {
|
463 |
+
$options['ssl']['passphrase'] = $value[1];
|
464 |
+
$value = $value[0];
|
465 |
+
}
|
466 |
+
|
467 |
+
if (!file_exists($value)) {
|
468 |
+
throw new \RuntimeException("SSL certificate not found: {$value}");
|
469 |
+
}
|
470 |
+
|
471 |
+
$options['ssl']['local_cert'] = $value;
|
472 |
+
}
|
473 |
+
|
474 |
+
private function add_progress(RequestInterface $request, &$options, $value, &$params)
|
475 |
+
{
|
476 |
+
$this->addNotification(
|
477 |
+
$params,
|
478 |
+
function ($code, $a, $b, $c, $transferred, $total) use ($value) {
|
479 |
+
if ($code == STREAM_NOTIFY_PROGRESS) {
|
480 |
+
$value($total, $transferred, null, null);
|
481 |
+
}
|
482 |
+
}
|
483 |
+
);
|
484 |
+
}
|
485 |
+
|
486 |
+
private function add_debug(RequestInterface $request, &$options, $value, &$params)
|
487 |
+
{
|
488 |
+
if ($value === false) {
|
489 |
+
return;
|
490 |
+
}
|
491 |
+
|
492 |
+
static $map = [
|
493 |
+
STREAM_NOTIFY_CONNECT => 'CONNECT',
|
494 |
+
STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
|
495 |
+
STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',
|
496 |
+
STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',
|
497 |
+
STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',
|
498 |
+
STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',
|
499 |
+
STREAM_NOTIFY_PROGRESS => 'PROGRESS',
|
500 |
+
STREAM_NOTIFY_FAILURE => 'FAILURE',
|
501 |
+
STREAM_NOTIFY_COMPLETED => 'COMPLETED',
|
502 |
+
STREAM_NOTIFY_RESOLVE => 'RESOLVE',
|
503 |
+
];
|
504 |
+
static $args = ['severity', 'message', 'message_code',
|
505 |
+
'bytes_transferred', 'bytes_max'];
|
506 |
+
|
507 |
+
$value = \GuzzleHttp\debug_resource($value);
|
508 |
+
$ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');
|
509 |
+
$this->addNotification(
|
510 |
+
$params,
|
511 |
+
function () use ($ident, $value, $map, $args) {
|
512 |
+
$passed = func_get_args();
|
513 |
+
$code = array_shift($passed);
|
514 |
+
fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
|
515 |
+
foreach (array_filter($passed) as $i => $v) {
|
516 |
+
fwrite($value, $args[$i] . ': "' . $v . '" ');
|
517 |
+
}
|
518 |
+
fwrite($value, "\n");
|
519 |
+
}
|
520 |
+
);
|
521 |
+
}
|
522 |
+
|
523 |
+
private function addNotification(array &$params, callable $notify)
|
524 |
+
{
|
525 |
+
// Wrap the existing function if needed.
|
526 |
+
if (!isset($params['notification'])) {
|
527 |
+
$params['notification'] = $notify;
|
528 |
+
} else {
|
529 |
+
$params['notification'] = $this->callArray([
|
530 |
+
$params['notification'],
|
531 |
+
$notify
|
532 |
+
]);
|
533 |
+
}
|
534 |
+
}
|
535 |
+
|
536 |
+
private function callArray(array $functions)
|
537 |
+
{
|
538 |
+
return function () use ($functions) {
|
539 |
+
$args = func_get_args();
|
540 |
+
foreach ($functions as $fn) {
|
541 |
+
call_user_func_array($fn, $args);
|
542 |
+
}
|
543 |
+
};
|
544 |
+
}
|
545 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/HandlerStack.php
ADDED
@@ -0,0 +1,277 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
5 |
+
use Psr\Http\Message\RequestInterface;
|
6 |
+
use Psr\Http\Message\ResponseInterface;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Creates a composed Guzzle handler function by stacking middlewares on top of
|
10 |
+
* an HTTP handler function.
|
11 |
+
*/
|
12 |
+
class HandlerStack
|
13 |
+
{
|
14 |
+
/** @var callable|null */
|
15 |
+
private $handler;
|
16 |
+
|
17 |
+
/** @var array */
|
18 |
+
private $stack = [];
|
19 |
+
|
20 |
+
/** @var callable|null */
|
21 |
+
private $cached;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Creates a default handler stack that can be used by clients.
|
25 |
+
*
|
26 |
+
* The returned handler will wrap the provided handler or use the most
|
27 |
+
* appropriate default handler for your system. The returned HandlerStack has
|
28 |
+
* support for cookies, redirects, HTTP error exceptions, and preparing a body
|
29 |
+
* before sending.
|
30 |
+
*
|
31 |
+
* The returned handler stack can be passed to a client in the "handler"
|
32 |
+
* option.
|
33 |
+
*
|
34 |
+
* @param callable $handler HTTP handler function to use with the stack. If no
|
35 |
+
* handler is provided, the best handler for your
|
36 |
+
* system will be utilized.
|
37 |
+
*
|
38 |
+
* @return HandlerStack
|
39 |
+
*/
|
40 |
+
public static function create(callable $handler = null)
|
41 |
+
{
|
42 |
+
$stack = new self($handler ?: choose_handler());
|
43 |
+
$stack->push(Middleware::httpErrors(), 'http_errors');
|
44 |
+
$stack->push(Middleware::redirect(), 'allow_redirects');
|
45 |
+
$stack->push(Middleware::cookies(), 'cookies');
|
46 |
+
$stack->push(Middleware::prepareBody(), 'prepare_body');
|
47 |
+
|
48 |
+
return $stack;
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @param callable $handler Underlying HTTP handler.
|
53 |
+
*/
|
54 |
+
public function __construct(callable $handler = null)
|
55 |
+
{
|
56 |
+
$this->handler = $handler;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Invokes the handler stack as a composed handler
|
61 |
+
*
|
62 |
+
* @param RequestInterface $request
|
63 |
+
* @param array $options
|
64 |
+
*
|
65 |
+
* @return ResponseInterface|PromiseInterface
|
66 |
+
*/
|
67 |
+
public function __invoke(RequestInterface $request, array $options)
|
68 |
+
{
|
69 |
+
$handler = $this->resolve();
|
70 |
+
|
71 |
+
return $handler($request, $options);
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Dumps a string representation of the stack.
|
76 |
+
*
|
77 |
+
* @return string
|
78 |
+
*/
|
79 |
+
public function __toString()
|
80 |
+
{
|
81 |
+
$depth = 0;
|
82 |
+
$stack = [];
|
83 |
+
if ($this->handler) {
|
84 |
+
$stack[] = "0) Handler: " . $this->debugCallable($this->handler);
|
85 |
+
}
|
86 |
+
|
87 |
+
$result = '';
|
88 |
+
foreach (array_reverse($this->stack) as $tuple) {
|
89 |
+
$depth++;
|
90 |
+
$str = "{$depth}) Name: '{$tuple[1]}', ";
|
91 |
+
$str .= "Function: " . $this->debugCallable($tuple[0]);
|
92 |
+
$result = "> {$str}\n{$result}";
|
93 |
+
$stack[] = $str;
|
94 |
+
}
|
95 |
+
|
96 |
+
foreach (array_keys($stack) as $k) {
|
97 |
+
$result .= "< {$stack[$k]}\n";
|
98 |
+
}
|
99 |
+
|
100 |
+
return $result;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Set the HTTP handler that actually returns a promise.
|
105 |
+
*
|
106 |
+
* @param callable $handler Accepts a request and array of options and
|
107 |
+
* returns a Promise.
|
108 |
+
*/
|
109 |
+
public function setHandler(callable $handler)
|
110 |
+
{
|
111 |
+
$this->handler = $handler;
|
112 |
+
$this->cached = null;
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Returns true if the builder has a handler.
|
117 |
+
*
|
118 |
+
* @return bool
|
119 |
+
*/
|
120 |
+
public function hasHandler()
|
121 |
+
{
|
122 |
+
return (bool) $this->handler;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Unshift a middleware to the bottom of the stack.
|
127 |
+
*
|
128 |
+
* @param callable $middleware Middleware function
|
129 |
+
* @param string $name Name to register for this middleware.
|
130 |
+
*/
|
131 |
+
public function unshift(callable $middleware, $name = null)
|
132 |
+
{
|
133 |
+
array_unshift($this->stack, [$middleware, $name]);
|
134 |
+
$this->cached = null;
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Push a middleware to the top of the stack.
|
139 |
+
*
|
140 |
+
* @param callable $middleware Middleware function
|
141 |
+
* @param string $name Name to register for this middleware.
|
142 |
+
*/
|
143 |
+
public function push(callable $middleware, $name = '')
|
144 |
+
{
|
145 |
+
$this->stack[] = [$middleware, $name];
|
146 |
+
$this->cached = null;
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Add a middleware before another middleware by name.
|
151 |
+
*
|
152 |
+
* @param string $findName Middleware to find
|
153 |
+
* @param callable $middleware Middleware function
|
154 |
+
* @param string $withName Name to register for this middleware.
|
155 |
+
*/
|
156 |
+
public function before($findName, callable $middleware, $withName = '')
|
157 |
+
{
|
158 |
+
$this->splice($findName, $withName, $middleware, true);
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Add a middleware after another middleware by name.
|
163 |
+
*
|
164 |
+
* @param string $findName Middleware to find
|
165 |
+
* @param callable $middleware Middleware function
|
166 |
+
* @param string $withName Name to register for this middleware.
|
167 |
+
*/
|
168 |
+
public function after($findName, callable $middleware, $withName = '')
|
169 |
+
{
|
170 |
+
$this->splice($findName, $withName, $middleware, false);
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Remove a middleware by instance or name from the stack.
|
175 |
+
*
|
176 |
+
* @param callable|string $remove Middleware to remove by instance or name.
|
177 |
+
*/
|
178 |
+
public function remove($remove)
|
179 |
+
{
|
180 |
+
$this->cached = null;
|
181 |
+
$idx = is_callable($remove) ? 0 : 1;
|
182 |
+
$this->stack = array_values(array_filter(
|
183 |
+
$this->stack,
|
184 |
+
function ($tuple) use ($idx, $remove) {
|
185 |
+
return $tuple[$idx] !== $remove;
|
186 |
+
}
|
187 |
+
));
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Compose the middleware and handler into a single callable function.
|
192 |
+
*
|
193 |
+
* @return callable
|
194 |
+
*/
|
195 |
+
public function resolve()
|
196 |
+
{
|
197 |
+
if (!$this->cached) {
|
198 |
+
if (!($prev = $this->handler)) {
|
199 |
+
throw new \LogicException('No handler has been specified');
|
200 |
+
}
|
201 |
+
|
202 |
+
foreach (array_reverse($this->stack) as $fn) {
|
203 |
+
$prev = $fn[0]($prev);
|
204 |
+
}
|
205 |
+
|
206 |
+
$this->cached = $prev;
|
207 |
+
}
|
208 |
+
|
209 |
+
return $this->cached;
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* @param string $name
|
214 |
+
* @return int
|
215 |
+
*/
|
216 |
+
private function findByName($name)
|
217 |
+
{
|
218 |
+
foreach ($this->stack as $k => $v) {
|
219 |
+
if ($v[1] === $name) {
|
220 |
+
return $k;
|
221 |
+
}
|
222 |
+
}
|
223 |
+
|
224 |
+
throw new \InvalidArgumentException("Middleware not found: $name");
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* Splices a function into the middleware list at a specific position.
|
229 |
+
*
|
230 |
+
* @param string $findName
|
231 |
+
* @param string $withName
|
232 |
+
* @param callable $middleware
|
233 |
+
* @param bool $before
|
234 |
+
*/
|
235 |
+
private function splice($findName, $withName, callable $middleware, $before)
|
236 |
+
{
|
237 |
+
$this->cached = null;
|
238 |
+
$idx = $this->findByName($findName);
|
239 |
+
$tuple = [$middleware, $withName];
|
240 |
+
|
241 |
+
if ($before) {
|
242 |
+
if ($idx === 0) {
|
243 |
+
array_unshift($this->stack, $tuple);
|
244 |
+
} else {
|
245 |
+
$replacement = [$tuple, $this->stack[$idx]];
|
246 |
+
array_splice($this->stack, $idx, 1, $replacement);
|
247 |
+
}
|
248 |
+
} elseif ($idx === count($this->stack) - 1) {
|
249 |
+
$this->stack[] = $tuple;
|
250 |
+
} else {
|
251 |
+
$replacement = [$this->stack[$idx], $tuple];
|
252 |
+
array_splice($this->stack, $idx, 1, $replacement);
|
253 |
+
}
|
254 |
+
}
|
255 |
+
|
256 |
+
/**
|
257 |
+
* Provides a debug string for a given callable.
|
258 |
+
*
|
259 |
+
* @param array|callable $fn Function to write as a string.
|
260 |
+
*
|
261 |
+
* @return string
|
262 |
+
*/
|
263 |
+
private function debugCallable($fn)
|
264 |
+
{
|
265 |
+
if (is_string($fn)) {
|
266 |
+
return "callable({$fn})";
|
267 |
+
}
|
268 |
+
|
269 |
+
if (is_array($fn)) {
|
270 |
+
return is_string($fn[0])
|
271 |
+
? "callable({$fn[0]}::{$fn[1]})"
|
272 |
+
: "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])";
|
273 |
+
}
|
274 |
+
|
275 |
+
return 'callable(' . spl_object_hash($fn) . ')';
|
276 |
+
}
|
277 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/MessageFormatter.php
ADDED
@@ -0,0 +1,185 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use Psr\Http\Message\MessageInterface;
|
5 |
+
use Psr\Http\Message\RequestInterface;
|
6 |
+
use Psr\Http\Message\ResponseInterface;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Formats log messages using variable substitutions for requests, responses,
|
10 |
+
* and other transactional data.
|
11 |
+
*
|
12 |
+
* The following variable substitutions are supported:
|
13 |
+
*
|
14 |
+
* - {request}: Full HTTP request message
|
15 |
+
* - {response}: Full HTTP response message
|
16 |
+
* - {ts}: ISO 8601 date in GMT
|
17 |
+
* - {date_iso_8601} ISO 8601 date in GMT
|
18 |
+
* - {date_common_log} Apache common log date using the configured timezone.
|
19 |
+
* - {host}: Host of the request
|
20 |
+
* - {method}: Method of the request
|
21 |
+
* - {uri}: URI of the request
|
22 |
+
* - {version}: Protocol version
|
23 |
+
* - {target}: Request target of the request (path + query + fragment)
|
24 |
+
* - {hostname}: Hostname of the machine that sent the request
|
25 |
+
* - {code}: Status code of the response (if available)
|
26 |
+
* - {phrase}: Reason phrase of the response (if available)
|
27 |
+
* - {error}: Any error messages (if available)
|
28 |
+
* - {req_header_*}: Replace `*` with the lowercased name of a request header to add to the message
|
29 |
+
* - {res_header_*}: Replace `*` with the lowercased name of a response header to add to the message
|
30 |
+
* - {req_headers}: Request headers
|
31 |
+
* - {res_headers}: Response headers
|
32 |
+
* - {req_body}: Request body
|
33 |
+
* - {res_body}: Response body
|
34 |
+
*/
|
35 |
+
class MessageFormatter
|
36 |
+
{
|
37 |
+
/**
|
38 |
+
* Apache Common Log Format.
|
39 |
+
* @link http://httpd.apache.org/docs/2.4/logs.html#common
|
40 |
+
* @var string
|
41 |
+
*/
|
42 |
+
const CLF = "{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}";
|
43 |
+
const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
|
44 |
+
const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';
|
45 |
+
|
46 |
+
/** @var string Template used to format log messages */
|
47 |
+
private $template;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @param string $template Log message template
|
51 |
+
*/
|
52 |
+
public function __construct($template = self::CLF)
|
53 |
+
{
|
54 |
+
$this->template = $template ?: self::CLF;
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Returns a formatted message string.
|
59 |
+
*
|
60 |
+
* @param RequestInterface $request Request that was sent
|
61 |
+
* @param ResponseInterface $response Response that was received
|
62 |
+
* @param \Exception $error Exception that was received
|
63 |
+
*
|
64 |
+
* @return string
|
65 |
+
*/
|
66 |
+
public function format(
|
67 |
+
RequestInterface $request,
|
68 |
+
ResponseInterface $response = null,
|
69 |
+
\Exception $error = null
|
70 |
+
) {
|
71 |
+
$cache = [];
|
72 |
+
|
73 |
+
return preg_replace_callback(
|
74 |
+
'/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
|
75 |
+
function (array $matches) use ($request, $response, $error, &$cache) {
|
76 |
+
if (isset($cache[$matches[1]])) {
|
77 |
+
return $cache[$matches[1]];
|
78 |
+
}
|
79 |
+
|
80 |
+
$result = '';
|
81 |
+
switch ($matches[1]) {
|
82 |
+
case 'request':
|
83 |
+
$result = Psr7\str($request);
|
84 |
+
break;
|
85 |
+
case 'response':
|
86 |
+
$result = $response ? Psr7\str($response) : '';
|
87 |
+
break;
|
88 |
+
case 'req_headers':
|
89 |
+
$result = trim($request->getMethod()
|
90 |
+
. ' ' . $request->getRequestTarget())
|
91 |
+
. ' HTTP/' . $request->getProtocolVersion() . "\r\n"
|
92 |
+
. $this->headers($request);
|
93 |
+
break;
|
94 |
+
case 'res_headers':
|
95 |
+
$result = $response ?
|
96 |
+
sprintf(
|
97 |
+
'HTTP/%s %d %s',
|
98 |
+
$response->getProtocolVersion(),
|
99 |
+
$response->getStatusCode(),
|
100 |
+
$response->getReasonPhrase()
|
101 |
+
) . "\r\n" . $this->headers($response)
|
102 |
+
: 'NULL';
|
103 |
+
break;
|
104 |
+
case 'req_body':
|
105 |
+
$result = $request->getBody();
|
106 |
+
break;
|
107 |
+
case 'res_body':
|
108 |
+
$result = $response ? $response->getBody() : 'NULL';
|
109 |
+
break;
|
110 |
+
case 'ts':
|
111 |
+
case 'date_iso_8601':
|
112 |
+
$result = gmdate('c');
|
113 |
+
break;
|
114 |
+
case 'date_common_log':
|
115 |
+
$result = date('d/M/Y:H:i:s O');
|
116 |
+
break;
|
117 |
+
case 'method':
|
118 |
+
$result = $request->getMethod();
|
119 |
+
break;
|
120 |
+
case 'version':
|
121 |
+
$result = $request->getProtocolVersion();
|
122 |
+
break;
|
123 |
+
case 'uri':
|
124 |
+
case 'url':
|
125 |
+
$result = $request->getUri();
|
126 |
+
break;
|
127 |
+
case 'target':
|
128 |
+
$result = $request->getRequestTarget();
|
129 |
+
break;
|
130 |
+
case 'req_version':
|
131 |
+
$result = $request->getProtocolVersion();
|
132 |
+
break;
|
133 |
+
case 'res_version':
|
134 |
+
$result = $response
|
135 |
+
? $response->getProtocolVersion()
|
136 |
+
: 'NULL';
|
137 |
+
break;
|
138 |
+
case 'host':
|
139 |
+
$result = $request->getHeaderLine('Host');
|
140 |
+
break;
|
141 |
+
case 'hostname':
|
142 |
+
$result = gethostname();
|
143 |
+
break;
|
144 |
+
case 'code':
|
145 |
+
$result = $response ? $response->getStatusCode() : 'NULL';
|
146 |
+
break;
|
147 |
+
case 'phrase':
|
148 |
+
$result = $response ? $response->getReasonPhrase() : 'NULL';
|
149 |
+
break;
|
150 |
+
case 'error':
|
151 |
+
$result = $error ? $error->getMessage() : 'NULL';
|
152 |
+
break;
|
153 |
+
default:
|
154 |
+
// handle prefixed dynamic headers
|
155 |
+
if (strpos($matches[1], 'req_header_') === 0) {
|
156 |
+
$result = $request->getHeaderLine(substr($matches[1], 11));
|
157 |
+
} elseif (strpos($matches[1], 'res_header_') === 0) {
|
158 |
+
$result = $response
|
159 |
+
? $response->getHeaderLine(substr($matches[1], 11))
|
160 |
+
: 'NULL';
|
161 |
+
}
|
162 |
+
}
|
163 |
+
|
164 |
+
$cache[$matches[1]] = $result;
|
165 |
+
return $result;
|
166 |
+
},
|
167 |
+
$this->template
|
168 |
+
);
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Get headers from message as string
|
173 |
+
*
|
174 |
+
* @return string
|
175 |
+
*/
|
176 |
+
private function headers(MessageInterface $message)
|
177 |
+
{
|
178 |
+
$result = '';
|
179 |
+
foreach ($message->getHeaders() as $name => $values) {
|
180 |
+
$result .= $name . ': ' . implode(', ', $values) . "\r\n";
|
181 |
+
}
|
182 |
+
|
183 |
+
return trim($result);
|
184 |
+
}
|
185 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Middleware.php
ADDED
@@ -0,0 +1,254 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Cookie\CookieJarInterface;
|
5 |
+
use GuzzleHttp\Exception\RequestException;
|
6 |
+
use GuzzleHttp\Promise\RejectedPromise;
|
7 |
+
use GuzzleHttp\Psr7;
|
8 |
+
use Psr\Http\Message\ResponseInterface;
|
9 |
+
use Psr\Log\LoggerInterface;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Functions used to create and wrap handlers with handler middleware.
|
13 |
+
*/
|
14 |
+
final class Middleware
|
15 |
+
{
|
16 |
+
/**
|
17 |
+
* Middleware that adds cookies to requests.
|
18 |
+
*
|
19 |
+
* The options array must be set to a CookieJarInterface in order to use
|
20 |
+
* cookies. This is typically handled for you by a client.
|
21 |
+
*
|
22 |
+
* @return callable Returns a function that accepts the next handler.
|
23 |
+
*/
|
24 |
+
public static function cookies()
|
25 |
+
{
|
26 |
+
return function (callable $handler) {
|
27 |
+
return function ($request, array $options) use ($handler) {
|
28 |
+
if (empty($options['cookies'])) {
|
29 |
+
return $handler($request, $options);
|
30 |
+
} elseif (!($options['cookies'] instanceof CookieJarInterface)) {
|
31 |
+
throw new \InvalidArgumentException('cookies must be an instance of GuzzleHttp\Cookie\CookieJarInterface');
|
32 |
+
}
|
33 |
+
$cookieJar = $options['cookies'];
|
34 |
+
$request = $cookieJar->withCookieHeader($request);
|
35 |
+
return $handler($request, $options)
|
36 |
+
->then(
|
37 |
+
function ($response) use ($cookieJar, $request) {
|
38 |
+
$cookieJar->extractCookies($request, $response);
|
39 |
+
return $response;
|
40 |
+
}
|
41 |
+
);
|
42 |
+
};
|
43 |
+
};
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Middleware that throws exceptions for 4xx or 5xx responses when the
|
48 |
+
* "http_error" request option is set to true.
|
49 |
+
*
|
50 |
+
* @return callable Returns a function that accepts the next handler.
|
51 |
+
*/
|
52 |
+
public static function httpErrors()
|
53 |
+
{
|
54 |
+
return function (callable $handler) {
|
55 |
+
return function ($request, array $options) use ($handler) {
|
56 |
+
if (empty($options['http_errors'])) {
|
57 |
+
return $handler($request, $options);
|
58 |
+
}
|
59 |
+
return $handler($request, $options)->then(
|
60 |
+
function (ResponseInterface $response) use ($request) {
|
61 |
+
$code = $response->getStatusCode();
|
62 |
+
if ($code < 400) {
|
63 |
+
return $response;
|
64 |
+
}
|
65 |
+
throw RequestException::create($request, $response);
|
66 |
+
}
|
67 |
+
);
|
68 |
+
};
|
69 |
+
};
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Middleware that pushes history data to an ArrayAccess container.
|
74 |
+
*
|
75 |
+
* @param array|\ArrayAccess $container Container to hold the history (by reference).
|
76 |
+
*
|
77 |
+
* @return callable Returns a function that accepts the next handler.
|
78 |
+
* @throws \InvalidArgumentException if container is not an array or ArrayAccess.
|
79 |
+
*/
|
80 |
+
public static function history(&$container)
|
81 |
+
{
|
82 |
+
if (!is_array($container) && !$container instanceof \ArrayAccess) {
|
83 |
+
throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess');
|
84 |
+
}
|
85 |
+
|
86 |
+
return function (callable $handler) use (&$container) {
|
87 |
+
return function ($request, array $options) use ($handler, &$container) {
|
88 |
+
return $handler($request, $options)->then(
|
89 |
+
function ($value) use ($request, &$container, $options) {
|
90 |
+
$container[] = [
|
91 |
+
'request' => $request,
|
92 |
+
'response' => $value,
|
93 |
+
'error' => null,
|
94 |
+
'options' => $options
|
95 |
+
];
|
96 |
+
return $value;
|
97 |
+
},
|
98 |
+
function ($reason) use ($request, &$container, $options) {
|
99 |
+
$container[] = [
|
100 |
+
'request' => $request,
|
101 |
+
'response' => null,
|
102 |
+
'error' => $reason,
|
103 |
+
'options' => $options
|
104 |
+
];
|
105 |
+
return \GuzzleHttp\Promise\rejection_for($reason);
|
106 |
+
}
|
107 |
+
);
|
108 |
+
};
|
109 |
+
};
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Middleware that invokes a callback before and after sending a request.
|
114 |
+
*
|
115 |
+
* The provided listener cannot modify or alter the response. It simply
|
116 |
+
* "taps" into the chain to be notified before returning the promise. The
|
117 |
+
* before listener accepts a request and options array, and the after
|
118 |
+
* listener accepts a request, options array, and response promise.
|
119 |
+
*
|
120 |
+
* @param callable $before Function to invoke before forwarding the request.
|
121 |
+
* @param callable $after Function invoked after forwarding.
|
122 |
+
*
|
123 |
+
* @return callable Returns a function that accepts the next handler.
|
124 |
+
*/
|
125 |
+
public static function tap(callable $before = null, callable $after = null)
|
126 |
+
{
|
127 |
+
return function (callable $handler) use ($before, $after) {
|
128 |
+
return function ($request, array $options) use ($handler, $before, $after) {
|
129 |
+
if ($before) {
|
130 |
+
$before($request, $options);
|
131 |
+
}
|
132 |
+
$response = $handler($request, $options);
|
133 |
+
if ($after) {
|
134 |
+
$after($request, $options, $response);
|
135 |
+
}
|
136 |
+
return $response;
|
137 |
+
};
|
138 |
+
};
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Middleware that handles request redirects.
|
143 |
+
*
|
144 |
+
* @return callable Returns a function that accepts the next handler.
|
145 |
+
*/
|
146 |
+
public static function redirect()
|
147 |
+
{
|
148 |
+
return function (callable $handler) {
|
149 |
+
return new RedirectMiddleware($handler);
|
150 |
+
};
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Middleware that retries requests based on the boolean result of
|
155 |
+
* invoking the provided "decider" function.
|
156 |
+
*
|
157 |
+
* If no delay function is provided, a simple implementation of exponential
|
158 |
+
* backoff will be utilized.
|
159 |
+
*
|
160 |
+
* @param callable $decider Function that accepts the number of retries,
|
161 |
+
* a request, [response], and [exception] and
|
162 |
+
* returns true if the request is to be retried.
|
163 |
+
* @param callable $delay Function that accepts the number of retries and
|
164 |
+
* returns the number of milliseconds to delay.
|
165 |
+
*
|
166 |
+
* @return callable Returns a function that accepts the next handler.
|
167 |
+
*/
|
168 |
+
public static function retry(callable $decider, callable $delay = null)
|
169 |
+
{
|
170 |
+
return function (callable $handler) use ($decider, $delay) {
|
171 |
+
return new RetryMiddleware($decider, $handler, $delay);
|
172 |
+
};
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Middleware that logs requests, responses, and errors using a message
|
177 |
+
* formatter.
|
178 |
+
*
|
179 |
+
* @param LoggerInterface $logger Logs messages.
|
180 |
+
* @param MessageFormatter $formatter Formatter used to create message strings.
|
181 |
+
* @param string $logLevel Level at which to log requests.
|
182 |
+
*
|
183 |
+
* @return callable Returns a function that accepts the next handler.
|
184 |
+
*/
|
185 |
+
public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */)
|
186 |
+
{
|
187 |
+
return function (callable $handler) use ($logger, $formatter, $logLevel) {
|
188 |
+
return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) {
|
189 |
+
return $handler($request, $options)->then(
|
190 |
+
function ($response) use ($logger, $request, $formatter, $logLevel) {
|
191 |
+
$message = $formatter->format($request, $response);
|
192 |
+
$logger->log($logLevel, $message);
|
193 |
+
return $response;
|
194 |
+
},
|
195 |
+
function ($reason) use ($logger, $request, $formatter) {
|
196 |
+
$response = $reason instanceof RequestException
|
197 |
+
? $reason->getResponse()
|
198 |
+
: null;
|
199 |
+
$message = $formatter->format($request, $response, $reason);
|
200 |
+
$logger->notice($message);
|
201 |
+
return \GuzzleHttp\Promise\rejection_for($reason);
|
202 |
+
}
|
203 |
+
);
|
204 |
+
};
|
205 |
+
};
|
206 |
+
}
|
207 |
+
|
208 |
+
/**
|
209 |
+
* This middleware adds a default content-type if possible, a default
|
210 |
+
* content-length or transfer-encoding header, and the expect header.
|
211 |
+
*
|
212 |
+
* @return callable
|
213 |
+
*/
|
214 |
+
public static function prepareBody()
|
215 |
+
{
|
216 |
+
return function (callable $handler) {
|
217 |
+
return new PrepareBodyMiddleware($handler);
|
218 |
+
};
|
219 |
+
}
|
220 |
+
|
221 |
+
/**
|
222 |
+
* Middleware that applies a map function to the request before passing to
|
223 |
+
* the next handler.
|
224 |
+
*
|
225 |
+
* @param callable $fn Function that accepts a RequestInterface and returns
|
226 |
+
* a RequestInterface.
|
227 |
+
* @return callable
|
228 |
+
*/
|
229 |
+
public static function mapRequest(callable $fn)
|
230 |
+
{
|
231 |
+
return function (callable $handler) use ($fn) {
|
232 |
+
return function ($request, array $options) use ($handler, $fn) {
|
233 |
+
return $handler($fn($request), $options);
|
234 |
+
};
|
235 |
+
};
|
236 |
+
}
|
237 |
+
|
238 |
+
/**
|
239 |
+
* Middleware that applies a map function to the resolved promise's
|
240 |
+
* response.
|
241 |
+
*
|
242 |
+
* @param callable $fn Function that accepts a ResponseInterface and
|
243 |
+
* returns a ResponseInterface.
|
244 |
+
* @return callable
|
245 |
+
*/
|
246 |
+
public static function mapResponse(callable $fn)
|
247 |
+
{
|
248 |
+
return function (callable $handler) use ($fn) {
|
249 |
+
return function ($request, array $options) use ($handler, $fn) {
|
250 |
+
return $handler($request, $options)->then($fn);
|
251 |
+
};
|
252 |
+
};
|
253 |
+
}
|
254 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Pool.php
ADDED
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Promise\EachPromise;
|
5 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
6 |
+
use GuzzleHttp\Promise\PromisorInterface;
|
7 |
+
use Psr\Http\Message\RequestInterface;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Sends an iterator of requests concurrently using a capped pool size.
|
11 |
+
*
|
12 |
+
* The pool will read from an iterator until it is cancelled or until the
|
13 |
+
* iterator is consumed. When a request is yielded, the request is sent after
|
14 |
+
* applying the "request_options" request options (if provided in the ctor).
|
15 |
+
*
|
16 |
+
* When a function is yielded by the iterator, the function is provided the
|
17 |
+
* "request_options" array that should be merged on top of any existing
|
18 |
+
* options, and the function MUST then return a wait-able promise.
|
19 |
+
*/
|
20 |
+
class Pool implements PromisorInterface
|
21 |
+
{
|
22 |
+
/** @var EachPromise */
|
23 |
+
private $each;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @param ClientInterface $client Client used to send the requests.
|
27 |
+
* @param array|\Iterator $requests Requests or functions that return
|
28 |
+
* requests to send concurrently.
|
29 |
+
* @param array $config Associative array of options
|
30 |
+
* - concurrency: (int) Maximum number of requests to send concurrently
|
31 |
+
* - options: Array of request options to apply to each request.
|
32 |
+
* - fulfilled: (callable) Function to invoke when a request completes.
|
33 |
+
* - rejected: (callable) Function to invoke when a request is rejected.
|
34 |
+
*/
|
35 |
+
public function __construct(
|
36 |
+
ClientInterface $client,
|
37 |
+
$requests,
|
38 |
+
array $config = []
|
39 |
+
) {
|
40 |
+
// Backwards compatibility.
|
41 |
+
if (isset($config['pool_size'])) {
|
42 |
+
$config['concurrency'] = $config['pool_size'];
|
43 |
+
} elseif (!isset($config['concurrency'])) {
|
44 |
+
$config['concurrency'] = 25;
|
45 |
+
}
|
46 |
+
|
47 |
+
if (isset($config['options'])) {
|
48 |
+
$opts = $config['options'];
|
49 |
+
unset($config['options']);
|
50 |
+
} else {
|
51 |
+
$opts = [];
|
52 |
+
}
|
53 |
+
|
54 |
+
$iterable = \GuzzleHttp\Promise\iter_for($requests);
|
55 |
+
$requests = function () use ($iterable, $client, $opts) {
|
56 |
+
foreach ($iterable as $key => $rfn) {
|
57 |
+
if ($rfn instanceof RequestInterface) {
|
58 |
+
yield $key => $client->sendAsync($rfn, $opts);
|
59 |
+
} elseif (is_callable($rfn)) {
|
60 |
+
yield $key => $rfn($opts);
|
61 |
+
} else {
|
62 |
+
throw new \InvalidArgumentException('Each value yielded by '
|
63 |
+
. 'the iterator must be a Psr7\Http\Message\RequestInterface '
|
64 |
+
. 'or a callable that returns a promise that fulfills '
|
65 |
+
. 'with a Psr7\Message\Http\ResponseInterface object.');
|
66 |
+
}
|
67 |
+
}
|
68 |
+
};
|
69 |
+
|
70 |
+
$this->each = new EachPromise($requests(), $config);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Get promise
|
75 |
+
*
|
76 |
+
* @return PromiseInterface
|
77 |
+
*/
|
78 |
+
public function promise()
|
79 |
+
{
|
80 |
+
return $this->each->promise();
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Sends multiple requests concurrently and returns an array of responses
|
85 |
+
* and exceptions that uses the same ordering as the provided requests.
|
86 |
+
*
|
87 |
+
* IMPORTANT: This method keeps every request and response in memory, and
|
88 |
+
* as such, is NOT recommended when sending a large number or an
|
89 |
+
* indeterminate number of requests concurrently.
|
90 |
+
*
|
91 |
+
* @param ClientInterface $client Client used to send the requests
|
92 |
+
* @param array|\Iterator $requests Requests to send concurrently.
|
93 |
+
* @param array $options Passes through the options available in
|
94 |
+
* {@see GuzzleHttp\Pool::__construct}
|
95 |
+
*
|
96 |
+
* @return array Returns an array containing the response or an exception
|
97 |
+
* in the same order that the requests were sent.
|
98 |
+
* @throws \InvalidArgumentException if the event format is incorrect.
|
99 |
+
*/
|
100 |
+
public static function batch(
|
101 |
+
ClientInterface $client,
|
102 |
+
$requests,
|
103 |
+
array $options = []
|
104 |
+
) {
|
105 |
+
$res = [];
|
106 |
+
self::cmpCallback($options, 'fulfilled', $res);
|
107 |
+
self::cmpCallback($options, 'rejected', $res);
|
108 |
+
$pool = new static($client, $requests, $options);
|
109 |
+
$pool->promise()->wait();
|
110 |
+
ksort($res);
|
111 |
+
|
112 |
+
return $res;
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Execute callback(s)
|
117 |
+
*
|
118 |
+
* @return void
|
119 |
+
*/
|
120 |
+
private static function cmpCallback(array &$options, $name, array &$results)
|
121 |
+
{
|
122 |
+
if (!isset($options[$name])) {
|
123 |
+
$options[$name] = function ($v, $k) use (&$results) {
|
124 |
+
$results[$k] = $v;
|
125 |
+
};
|
126 |
+
} else {
|
127 |
+
$currentFn = $options[$name];
|
128 |
+
$options[$name] = function ($v, $k) use (&$results, $currentFn) {
|
129 |
+
$currentFn($v, $k);
|
130 |
+
$results[$k] = $v;
|
131 |
+
};
|
132 |
+
}
|
133 |
+
}
|
134 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
5 |
+
use GuzzleHttp\Psr7;
|
6 |
+
use Psr\Http\Message\RequestInterface;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Prepares requests that contain a body, adding the Content-Length,
|
10 |
+
* Content-Type, and Expect headers.
|
11 |
+
*/
|
12 |
+
class PrepareBodyMiddleware
|
13 |
+
{
|
14 |
+
/** @var callable */
|
15 |
+
private $nextHandler;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* @param callable $nextHandler Next handler to invoke.
|
19 |
+
*/
|
20 |
+
public function __construct(callable $nextHandler)
|
21 |
+
{
|
22 |
+
$this->nextHandler = $nextHandler;
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @param RequestInterface $request
|
27 |
+
* @param array $options
|
28 |
+
*
|
29 |
+
* @return PromiseInterface
|
30 |
+
*/
|
31 |
+
public function __invoke(RequestInterface $request, array $options)
|
32 |
+
{
|
33 |
+
$fn = $this->nextHandler;
|
34 |
+
|
35 |
+
// Don't do anything if the request has no body.
|
36 |
+
if ($request->getBody()->getSize() === 0) {
|
37 |
+
return $fn($request, $options);
|
38 |
+
}
|
39 |
+
|
40 |
+
$modify = [];
|
41 |
+
|
42 |
+
// Add a default content-type if possible.
|
43 |
+
if (!$request->hasHeader('Content-Type')) {
|
44 |
+
if ($uri = $request->getBody()->getMetadata('uri')) {
|
45 |
+
if ($type = Psr7\mimetype_from_filename($uri)) {
|
46 |
+
$modify['set_headers']['Content-Type'] = $type;
|
47 |
+
}
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
// Add a default content-length or transfer-encoding header.
|
52 |
+
if (!$request->hasHeader('Content-Length')
|
53 |
+
&& !$request->hasHeader('Transfer-Encoding')
|
54 |
+
) {
|
55 |
+
$size = $request->getBody()->getSize();
|
56 |
+
if ($size !== null) {
|
57 |
+
$modify['set_headers']['Content-Length'] = $size;
|
58 |
+
} else {
|
59 |
+
$modify['set_headers']['Transfer-Encoding'] = 'chunked';
|
60 |
+
}
|
61 |
+
}
|
62 |
+
|
63 |
+
// Add the expect header if needed.
|
64 |
+
$this->addExpectHeader($request, $options, $modify);
|
65 |
+
|
66 |
+
return $fn(Psr7\modify_request($request, $modify), $options);
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Add expect header
|
71 |
+
*
|
72 |
+
* @return void
|
73 |
+
*/
|
74 |
+
private function addExpectHeader(
|
75 |
+
RequestInterface $request,
|
76 |
+
array $options,
|
77 |
+
array &$modify
|
78 |
+
) {
|
79 |
+
// Determine if the Expect header should be used
|
80 |
+
if ($request->hasHeader('Expect')) {
|
81 |
+
return;
|
82 |
+
}
|
83 |
+
|
84 |
+
$expect = isset($options['expect']) ? $options['expect'] : null;
|
85 |
+
|
86 |
+
// Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0
|
87 |
+
if ($expect === false || $request->getProtocolVersion() < 1.1) {
|
88 |
+
return;
|
89 |
+
}
|
90 |
+
|
91 |
+
// The expect header is unconditionally enabled
|
92 |
+
if ($expect === true) {
|
93 |
+
$modify['set_headers']['Expect'] = '100-Continue';
|
94 |
+
return;
|
95 |
+
}
|
96 |
+
|
97 |
+
// By default, send the expect header when the payload is > 1mb
|
98 |
+
if ($expect === null) {
|
99 |
+
$expect = 1048576;
|
100 |
+
}
|
101 |
+
|
102 |
+
// Always add if the body cannot be rewound, the size cannot be
|
103 |
+
// determined, or the size is greater than the cutoff threshold
|
104 |
+
$body = $request->getBody();
|
105 |
+
$size = $body->getSize();
|
106 |
+
|
107 |
+
if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
|
108 |
+
$modify['set_headers']['Expect'] = '100-Continue';
|
109 |
+
}
|
110 |
+
}
|
111 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/RedirectMiddleware.php
ADDED
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\BadResponseException;
|
5 |
+
use GuzzleHttp\Exception\TooManyRedirectsException;
|
6 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
7 |
+
use GuzzleHttp\Psr7;
|
8 |
+
use Psr\Http\Message\RequestInterface;
|
9 |
+
use Psr\Http\Message\ResponseInterface;
|
10 |
+
use Psr\Http\Message\UriInterface;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Request redirect middleware.
|
14 |
+
*
|
15 |
+
* Apply this middleware like other middleware using
|
16 |
+
* {@see \GuzzleHttp\Middleware::redirect()}.
|
17 |
+
*/
|
18 |
+
class RedirectMiddleware
|
19 |
+
{
|
20 |
+
const HISTORY_HEADER = 'X-Guzzle-Redirect-History';
|
21 |
+
|
22 |
+
const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';
|
23 |
+
|
24 |
+
public static $defaultSettings = [
|
25 |
+
'max' => 5,
|
26 |
+
'protocols' => ['http', 'https'],
|
27 |
+
'strict' => false,
|
28 |
+
'referer' => false,
|
29 |
+
'track_redirects' => false,
|
30 |
+
];
|
31 |
+
|
32 |
+
/** @var callable */
|
33 |
+
private $nextHandler;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @param callable $nextHandler Next handler to invoke.
|
37 |
+
*/
|
38 |
+
public function __construct(callable $nextHandler)
|
39 |
+
{
|
40 |
+
$this->nextHandler = $nextHandler;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @param RequestInterface $request
|
45 |
+
* @param array $options
|
46 |
+
*
|
47 |
+
* @return PromiseInterface
|
48 |
+
*/
|
49 |
+
public function __invoke(RequestInterface $request, array $options)
|
50 |
+
{
|
51 |
+
$fn = $this->nextHandler;
|
52 |
+
|
53 |
+
if (empty($options['allow_redirects'])) {
|
54 |
+
return $fn($request, $options);
|
55 |
+
}
|
56 |
+
|
57 |
+
if ($options['allow_redirects'] === true) {
|
58 |
+
$options['allow_redirects'] = self::$defaultSettings;
|
59 |
+
} elseif (!is_array($options['allow_redirects'])) {
|
60 |
+
throw new \InvalidArgumentException('allow_redirects must be true, false, or array');
|
61 |
+
} else {
|
62 |
+
// Merge the default settings with the provided settings
|
63 |
+
$options['allow_redirects'] += self::$defaultSettings;
|
64 |
+
}
|
65 |
+
|
66 |
+
if (empty($options['allow_redirects']['max'])) {
|
67 |
+
return $fn($request, $options);
|
68 |
+
}
|
69 |
+
|
70 |
+
return $fn($request, $options)
|
71 |
+
->then(function (ResponseInterface $response) use ($request, $options) {
|
72 |
+
return $this->checkRedirect($request, $options, $response);
|
73 |
+
});
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @param RequestInterface $request
|
78 |
+
* @param array $options
|
79 |
+
* @param ResponseInterface $response
|
80 |
+
*
|
81 |
+
* @return ResponseInterface|PromiseInterface
|
82 |
+
*/
|
83 |
+
public function checkRedirect(
|
84 |
+
RequestInterface $request,
|
85 |
+
array $options,
|
86 |
+
ResponseInterface $response
|
87 |
+
) {
|
88 |
+
if (substr($response->getStatusCode(), 0, 1) != '3'
|
89 |
+
|| !$response->hasHeader('Location')
|
90 |
+
) {
|
91 |
+
return $response;
|
92 |
+
}
|
93 |
+
|
94 |
+
$this->guardMax($request, $options);
|
95 |
+
$nextRequest = $this->modifyRequest($request, $options, $response);
|
96 |
+
|
97 |
+
if (isset($options['allow_redirects']['on_redirect'])) {
|
98 |
+
call_user_func(
|
99 |
+
$options['allow_redirects']['on_redirect'],
|
100 |
+
$request,
|
101 |
+
$response,
|
102 |
+
$nextRequest->getUri()
|
103 |
+
);
|
104 |
+
}
|
105 |
+
|
106 |
+
/** @var PromiseInterface|ResponseInterface $promise */
|
107 |
+
$promise = $this($nextRequest, $options);
|
108 |
+
|
109 |
+
// Add headers to be able to track history of redirects.
|
110 |
+
if (!empty($options['allow_redirects']['track_redirects'])) {
|
111 |
+
return $this->withTracking(
|
112 |
+
$promise,
|
113 |
+
(string) $nextRequest->getUri(),
|
114 |
+
$response->getStatusCode()
|
115 |
+
);
|
116 |
+
}
|
117 |
+
|
118 |
+
return $promise;
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Enable tracking on promise.
|
123 |
+
*
|
124 |
+
* @return PromiseInterface
|
125 |
+
*/
|
126 |
+
private function withTracking(PromiseInterface $promise, $uri, $statusCode)
|
127 |
+
{
|
128 |
+
return $promise->then(
|
129 |
+
function (ResponseInterface $response) use ($uri, $statusCode) {
|
130 |
+
// Note that we are pushing to the front of the list as this
|
131 |
+
// would be an earlier response than what is currently present
|
132 |
+
// in the history header.
|
133 |
+
$historyHeader = $response->getHeader(self::HISTORY_HEADER);
|
134 |
+
$statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);
|
135 |
+
array_unshift($historyHeader, $uri);
|
136 |
+
array_unshift($statusHeader, $statusCode);
|
137 |
+
return $response->withHeader(self::HISTORY_HEADER, $historyHeader)
|
138 |
+
->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);
|
139 |
+
}
|
140 |
+
);
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Check for too many redirects
|
145 |
+
*
|
146 |
+
* @return void
|
147 |
+
*
|
148 |
+
* @throws TooManyRedirectsException Too many redirects.
|
149 |
+
*/
|
150 |
+
private function guardMax(RequestInterface $request, array &$options)
|
151 |
+
{
|
152 |
+
$current = isset($options['__redirect_count'])
|
153 |
+
? $options['__redirect_count']
|
154 |
+
: 0;
|
155 |
+
$options['__redirect_count'] = $current + 1;
|
156 |
+
$max = $options['allow_redirects']['max'];
|
157 |
+
|
158 |
+
if ($options['__redirect_count'] > $max) {
|
159 |
+
throw new TooManyRedirectsException(
|
160 |
+
"Will not follow more than {$max} redirects",
|
161 |
+
$request
|
162 |
+
);
|
163 |
+
}
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* @param RequestInterface $request
|
168 |
+
* @param array $options
|
169 |
+
* @param ResponseInterface $response
|
170 |
+
*
|
171 |
+
* @return RequestInterface
|
172 |
+
*/
|
173 |
+
public function modifyRequest(
|
174 |
+
RequestInterface $request,
|
175 |
+
array $options,
|
176 |
+
ResponseInterface $response
|
177 |
+
) {
|
178 |
+
// Request modifications to apply.
|
179 |
+
$modify = [];
|
180 |
+
$protocols = $options['allow_redirects']['protocols'];
|
181 |
+
|
182 |
+
// Use a GET request if this is an entity enclosing request and we are
|
183 |
+
// not forcing RFC compliance, but rather emulating what all browsers
|
184 |
+
// would do.
|
185 |
+
$statusCode = $response->getStatusCode();
|
186 |
+
if ($statusCode == 303 ||
|
187 |
+
($statusCode <= 302 && !$options['allow_redirects']['strict'])
|
188 |
+
) {
|
189 |
+
$modify['method'] = 'GET';
|
190 |
+
$modify['body'] = '';
|
191 |
+
}
|
192 |
+
|
193 |
+
$uri = $this->redirectUri($request, $response, $protocols);
|
194 |
+
if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {
|
195 |
+
$idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion'];
|
196 |
+
$uri = Utils::idnUriConvert($uri, $idnOptions);
|
197 |
+
}
|
198 |
+
|
199 |
+
$modify['uri'] = $uri;
|
200 |
+
Psr7\rewind_body($request);
|
201 |
+
|
202 |
+
// Add the Referer header if it is told to do so and only
|
203 |
+
// add the header if we are not redirecting from https to http.
|
204 |
+
if ($options['allow_redirects']['referer']
|
205 |
+
&& $modify['uri']->getScheme() === $request->getUri()->getScheme()
|
206 |
+
) {
|
207 |
+
$uri = $request->getUri()->withUserInfo('');
|
208 |
+
$modify['set_headers']['Referer'] = (string) $uri;
|
209 |
+
} else {
|
210 |
+
$modify['remove_headers'][] = 'Referer';
|
211 |
+
}
|
212 |
+
|
213 |
+
// Remove Authorization header if host is different.
|
214 |
+
if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
|
215 |
+
$modify['remove_headers'][] = 'Authorization';
|
216 |
+
}
|
217 |
+
|
218 |
+
return Psr7\modify_request($request, $modify);
|
219 |
+
}
|
220 |
+
|
221 |
+
/**
|
222 |
+
* Set the appropriate URL on the request based on the location header
|
223 |
+
*
|
224 |
+
* @param RequestInterface $request
|
225 |
+
* @param ResponseInterface $response
|
226 |
+
* @param array $protocols
|
227 |
+
*
|
228 |
+
* @return UriInterface
|
229 |
+
*/
|
230 |
+
private function redirectUri(
|
231 |
+
RequestInterface $request,
|
232 |
+
ResponseInterface $response,
|
233 |
+
array $protocols
|
234 |
+
) {
|
235 |
+
$location = Psr7\UriResolver::resolve(
|
236 |
+
$request->getUri(),
|
237 |
+
new Psr7\Uri($response->getHeaderLine('Location'))
|
238 |
+
);
|
239 |
+
|
240 |
+
// Ensure that the redirect URI is allowed based on the protocols.
|
241 |
+
if (!in_array($location->getScheme(), $protocols)) {
|
242 |
+
throw new BadResponseException(
|
243 |
+
sprintf(
|
244 |
+
'Redirect URI, %s, does not use one of the allowed redirect protocols: %s',
|
245 |
+
$location,
|
246 |
+
implode(', ', $protocols)
|
247 |
+
),
|
248 |
+
$request,
|
249 |
+
$response
|
250 |
+
);
|
251 |
+
}
|
252 |
+
|
253 |
+
return $location;
|
254 |
+
}
|
255 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/RequestOptions.php
ADDED
@@ -0,0 +1,263 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* This class contains a list of built-in Guzzle request options.
|
6 |
+
*
|
7 |
+
* More documentation for each option can be found at http://guzzlephp.org/.
|
8 |
+
*
|
9 |
+
* @link http://docs.guzzlephp.org/en/v6/request-options.html
|
10 |
+
*/
|
11 |
+
final class RequestOptions
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* allow_redirects: (bool|array) Controls redirect behavior. Pass false
|
15 |
+
* to disable redirects, pass true to enable redirects, pass an
|
16 |
+
* associative to provide custom redirect settings. Defaults to "false".
|
17 |
+
* This option only works if your handler has the RedirectMiddleware. When
|
18 |
+
* passing an associative array, you can provide the following key value
|
19 |
+
* pairs:
|
20 |
+
*
|
21 |
+
* - max: (int, default=5) maximum number of allowed redirects.
|
22 |
+
* - strict: (bool, default=false) Set to true to use strict redirects
|
23 |
+
* meaning redirect POST requests with POST requests vs. doing what most
|
24 |
+
* browsers do which is redirect POST requests with GET requests
|
25 |
+
* - referer: (bool, default=false) Set to true to enable the Referer
|
26 |
+
* header.
|
27 |
+
* - protocols: (array, default=['http', 'https']) Allowed redirect
|
28 |
+
* protocols.
|
29 |
+
* - on_redirect: (callable) PHP callable that is invoked when a redirect
|
30 |
+
* is encountered. The callable is invoked with the request, the redirect
|
31 |
+
* response that was received, and the effective URI. Any return value
|
32 |
+
* from the on_redirect function is ignored.
|
33 |
+
*/
|
34 |
+
const ALLOW_REDIRECTS = 'allow_redirects';
|
35 |
+
|
36 |
+
/**
|
37 |
+
* auth: (array) Pass an array of HTTP authentication parameters to use
|
38 |
+
* with the request. The array must contain the username in index [0],
|
39 |
+
* the password in index [1], and you can optionally provide a built-in
|
40 |
+
* authentication type in index [2]. Pass null to disable authentication
|
41 |
+
* for a request.
|
42 |
+
*/
|
43 |
+
const AUTH = 'auth';
|
44 |
+
|
45 |
+
/**
|
46 |
+
* body: (resource|string|null|int|float|StreamInterface|callable|\Iterator)
|
47 |
+
* Body to send in the request.
|
48 |
+
*/
|
49 |
+
const BODY = 'body';
|
50 |
+
|
51 |
+
/**
|
52 |
+
* cert: (string|array) Set to a string to specify the path to a file
|
53 |
+
* containing a PEM formatted SSL client side certificate. If a password
|
54 |
+
* is required, then set cert to an array containing the path to the PEM
|
55 |
+
* file in the first array element followed by the certificate password
|
56 |
+
* in the second array element.
|
57 |
+
*/
|
58 |
+
const CERT = 'cert';
|
59 |
+
|
60 |
+
/**
|
61 |
+
* cookies: (bool|GuzzleHttp\Cookie\CookieJarInterface, default=false)
|
62 |
+
* Specifies whether or not cookies are used in a request or what cookie
|
63 |
+
* jar to use or what cookies to send. This option only works if your
|
64 |
+
* handler has the `cookie` middleware. Valid values are `false` and
|
65 |
+
* an instance of {@see GuzzleHttp\Cookie\CookieJarInterface}.
|
66 |
+
*/
|
67 |
+
const COOKIES = 'cookies';
|
68 |
+
|
69 |
+
/**
|
70 |
+
* connect_timeout: (float, default=0) Float describing the number of
|
71 |
+
* seconds to wait while trying to connect to a server. Use 0 to wait
|
72 |
+
* indefinitely (the default behavior).
|
73 |
+
*/
|
74 |
+
const CONNECT_TIMEOUT = 'connect_timeout';
|
75 |
+
|
76 |
+
/**
|
77 |
+
* debug: (bool|resource) Set to true or set to a PHP stream returned by
|
78 |
+
* fopen() enable debug output with the HTTP handler used to send a
|
79 |
+
* request.
|
80 |
+
*/
|
81 |
+
const DEBUG = 'debug';
|
82 |
+
|
83 |
+
/**
|
84 |
+
* decode_content: (bool, default=true) Specify whether or not
|
85 |
+
* Content-Encoding responses (gzip, deflate, etc.) are automatically
|
86 |
+
* decoded.
|
87 |
+
*/
|
88 |
+
const DECODE_CONTENT = 'decode_content';
|
89 |
+
|
90 |
+
/**
|
91 |
+
* delay: (int) The amount of time to delay before sending in milliseconds.
|
92 |
+
*/
|
93 |
+
const DELAY = 'delay';
|
94 |
+
|
95 |
+
/**
|
96 |
+
* expect: (bool|integer) Controls the behavior of the
|
97 |
+
* "Expect: 100-Continue" header.
|
98 |
+
*
|
99 |
+
* Set to `true` to enable the "Expect: 100-Continue" header for all
|
100 |
+
* requests that sends a body. Set to `false` to disable the
|
101 |
+
* "Expect: 100-Continue" header for all requests. Set to a number so that
|
102 |
+
* the size of the payload must be greater than the number in order to send
|
103 |
+
* the Expect header. Setting to a number will send the Expect header for
|
104 |
+
* all requests in which the size of the payload cannot be determined or
|
105 |
+
* where the body is not rewindable.
|
106 |
+
*
|
107 |
+
* By default, Guzzle will add the "Expect: 100-Continue" header when the
|
108 |
+
* size of the body of a request is greater than 1 MB and a request is
|
109 |
+
* using HTTP/1.1.
|
110 |
+
*/
|
111 |
+
const EXPECT = 'expect';
|
112 |
+
|
113 |
+
/**
|
114 |
+
* form_params: (array) Associative array of form field names to values
|
115 |
+
* where each value is a string or array of strings. Sets the Content-Type
|
116 |
+
* header to application/x-www-form-urlencoded when no Content-Type header
|
117 |
+
* is already present.
|
118 |
+
*/
|
119 |
+
const FORM_PARAMS = 'form_params';
|
120 |
+
|
121 |
+
/**
|
122 |
+
* headers: (array) Associative array of HTTP headers. Each value MUST be
|
123 |
+
* a string or array of strings.
|
124 |
+
*/
|
125 |
+
const HEADERS = 'headers';
|
126 |
+
|
127 |
+
/**
|
128 |
+
* http_errors: (bool, default=true) Set to false to disable exceptions
|
129 |
+
* when a non- successful HTTP response is received. By default,
|
130 |
+
* exceptions will be thrown for 4xx and 5xx responses. This option only
|
131 |
+
* works if your handler has the `httpErrors` middleware.
|
132 |
+
*/
|
133 |
+
const HTTP_ERRORS = 'http_errors';
|
134 |
+
|
135 |
+
/**
|
136 |
+
* idn: (bool|int, default=true) A combination of IDNA_* constants for
|
137 |
+
* idn_to_ascii() PHP's function (see "options" parameter). Set to false to
|
138 |
+
* disable IDN support completely, or to true to use the default
|
139 |
+
* configuration (IDNA_DEFAULT constant).
|
140 |
+
*/
|
141 |
+
const IDN_CONVERSION = 'idn_conversion';
|
142 |
+
|
143 |
+
/**
|
144 |
+
* json: (mixed) Adds JSON data to a request. The provided value is JSON
|
145 |
+
* encoded and a Content-Type header of application/json will be added to
|
146 |
+
* the request if no Content-Type header is already present.
|
147 |
+
*/
|
148 |
+
const JSON = 'json';
|
149 |
+
|
150 |
+
/**
|
151 |
+
* multipart: (array) Array of associative arrays, each containing a
|
152 |
+
* required "name" key mapping to the form field, name, a required
|
153 |
+
* "contents" key mapping to a StreamInterface|resource|string, an
|
154 |
+
* optional "headers" associative array of custom headers, and an
|
155 |
+
* optional "filename" key mapping to a string to send as the filename in
|
156 |
+
* the part. If no "filename" key is present, then no "filename" attribute
|
157 |
+
* will be added to the part.
|
158 |
+
*/
|
159 |
+
const MULTIPART = 'multipart';
|
160 |
+
|
161 |
+
/**
|
162 |
+
* on_headers: (callable) A callable that is invoked when the HTTP headers
|
163 |
+
* of the response have been received but the body has not yet begun to
|
164 |
+
* download.
|
165 |
+
*/
|
166 |
+
const ON_HEADERS = 'on_headers';
|
167 |
+
|
168 |
+
/**
|
169 |
+
* on_stats: (callable) allows you to get access to transfer statistics of
|
170 |
+
* a request and access the lower level transfer details of the handler
|
171 |
+
* associated with your client. ``on_stats`` is a callable that is invoked
|
172 |
+
* when a handler has finished sending a request. The callback is invoked
|
173 |
+
* with transfer statistics about the request, the response received, or
|
174 |
+
* the error encountered. Included in the data is the total amount of time
|
175 |
+
* taken to send the request.
|
176 |
+
*/
|
177 |
+
const ON_STATS = 'on_stats';
|
178 |
+
|
179 |
+
/**
|
180 |
+
* progress: (callable) Defines a function to invoke when transfer
|
181 |
+
* progress is made. The function accepts the following positional
|
182 |
+
* arguments: the total number of bytes expected to be downloaded, the
|
183 |
+
* number of bytes downloaded so far, the number of bytes expected to be
|
184 |
+
* uploaded, the number of bytes uploaded so far.
|
185 |
+
*/
|
186 |
+
const PROGRESS = 'progress';
|
187 |
+
|
188 |
+
/**
|
189 |
+
* proxy: (string|array) Pass a string to specify an HTTP proxy, or an
|
190 |
+
* array to specify different proxies for different protocols (where the
|
191 |
+
* key is the protocol and the value is a proxy string).
|
192 |
+
*/
|
193 |
+
const PROXY = 'proxy';
|
194 |
+
|
195 |
+
/**
|
196 |
+
* query: (array|string) Associative array of query string values to add
|
197 |
+
* to the request. This option uses PHP's http_build_query() to create
|
198 |
+
* the string representation. Pass a string value if you need more
|
199 |
+
* control than what this method provides
|
200 |
+
*/
|
201 |
+
const QUERY = 'query';
|
202 |
+
|
203 |
+
/**
|
204 |
+
* sink: (resource|string|StreamInterface) Where the data of the
|
205 |
+
* response is written to. Defaults to a PHP temp stream. Providing a
|
206 |
+
* string will write data to a file by the given name.
|
207 |
+
*/
|
208 |
+
const SINK = 'sink';
|
209 |
+
|
210 |
+
/**
|
211 |
+
* synchronous: (bool) Set to true to inform HTTP handlers that you intend
|
212 |
+
* on waiting on the response. This can be useful for optimizations. Note
|
213 |
+
* that a promise is still returned if you are using one of the async
|
214 |
+
* client methods.
|
215 |
+
*/
|
216 |
+
const SYNCHRONOUS = 'synchronous';
|
217 |
+
|
218 |
+
/**
|
219 |
+
* ssl_key: (array|string) Specify the path to a file containing a private
|
220 |
+
* SSL key in PEM format. If a password is required, then set to an array
|
221 |
+
* containing the path to the SSL key in the first array element followed
|
222 |
+
* by the password required for the certificate in the second element.
|
223 |
+
*/
|
224 |
+
const SSL_KEY = 'ssl_key';
|
225 |
+
|
226 |
+
/**
|
227 |
+
* stream: Set to true to attempt to stream a response rather than
|
228 |
+
* download it all up-front.
|
229 |
+
*/
|
230 |
+
const STREAM = 'stream';
|
231 |
+
|
232 |
+
/**
|
233 |
+
* verify: (bool|string, default=true) Describes the SSL certificate
|
234 |
+
* verification behavior of a request. Set to true to enable SSL
|
235 |
+
* certificate verification using the system CA bundle when available
|
236 |
+
* (the default). Set to false to disable certificate verification (this
|
237 |
+
* is insecure!). Set to a string to provide the path to a CA bundle on
|
238 |
+
* disk to enable verification using a custom certificate.
|
239 |
+
*/
|
240 |
+
const VERIFY = 'verify';
|
241 |
+
|
242 |
+
/**
|
243 |
+
* timeout: (float, default=0) Float describing the timeout of the
|
244 |
+
* request in seconds. Use 0 to wait indefinitely (the default behavior).
|
245 |
+
*/
|
246 |
+
const TIMEOUT = 'timeout';
|
247 |
+
|
248 |
+
/**
|
249 |
+
* read_timeout: (float, default=default_socket_timeout ini setting) Float describing
|
250 |
+
* the body read timeout, for stream requests.
|
251 |
+
*/
|
252 |
+
const READ_TIMEOUT = 'read_timeout';
|
253 |
+
|
254 |
+
/**
|
255 |
+
* version: (float) Specifies the HTTP protocol version to attempt to use.
|
256 |
+
*/
|
257 |
+
const VERSION = 'version';
|
258 |
+
|
259 |
+
/**
|
260 |
+
* force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol
|
261 |
+
*/
|
262 |
+
const FORCE_IP_RESOLVE = 'force_ip_resolve';
|
263 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/RetryMiddleware.php
ADDED
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Promise\PromiseInterface;
|
5 |
+
use GuzzleHttp\Promise\RejectedPromise;
|
6 |
+
use GuzzleHttp\Psr7;
|
7 |
+
use Psr\Http\Message\RequestInterface;
|
8 |
+
use Psr\Http\Message\ResponseInterface;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Middleware that retries requests based on the boolean result of
|
12 |
+
* invoking the provided "decider" function.
|
13 |
+
*/
|
14 |
+
class RetryMiddleware
|
15 |
+
{
|
16 |
+
/** @var callable */
|
17 |
+
private $nextHandler;
|
18 |
+
|
19 |
+
/** @var callable */
|
20 |
+
private $decider;
|
21 |
+
|
22 |
+
/** @var callable */
|
23 |
+
private $delay;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @param callable $decider Function that accepts the number of retries,
|
27 |
+
* a request, [response], and [exception] and
|
28 |
+
* returns true if the request is to be
|
29 |
+
* retried.
|
30 |
+
* @param callable $nextHandler Next handler to invoke.
|
31 |
+
* @param callable $delay Function that accepts the number of retries
|
32 |
+
* and [response] and returns the number of
|
33 |
+
* milliseconds to delay.
|
34 |
+
*/
|
35 |
+
public function __construct(
|
36 |
+
callable $decider,
|
37 |
+
callable $nextHandler,
|
38 |
+
callable $delay = null
|
39 |
+
) {
|
40 |
+
$this->decider = $decider;
|
41 |
+
$this->nextHandler = $nextHandler;
|
42 |
+
$this->delay = $delay ?: __CLASS__ . '::exponentialDelay';
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Default exponential backoff delay function.
|
47 |
+
*
|
48 |
+
* @param int $retries
|
49 |
+
*
|
50 |
+
* @return int milliseconds.
|
51 |
+
*/
|
52 |
+
public static function exponentialDelay($retries)
|
53 |
+
{
|
54 |
+
return (int) pow(2, $retries - 1) * 1000;
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @param RequestInterface $request
|
59 |
+
* @param array $options
|
60 |
+
*
|
61 |
+
* @return PromiseInterface
|
62 |
+
*/
|
63 |
+
public function __invoke(RequestInterface $request, array $options)
|
64 |
+
{
|
65 |
+
if (!isset($options['retries'])) {
|
66 |
+
$options['retries'] = 0;
|
67 |
+
}
|
68 |
+
|
69 |
+
$fn = $this->nextHandler;
|
70 |
+
return $fn($request, $options)
|
71 |
+
->then(
|
72 |
+
$this->onFulfilled($request, $options),
|
73 |
+
$this->onRejected($request, $options)
|
74 |
+
);
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Execute fulfilled closure
|
79 |
+
*
|
80 |
+
* @return mixed
|
81 |
+
*/
|
82 |
+
private function onFulfilled(RequestInterface $req, array $options)
|
83 |
+
{
|
84 |
+
return function ($value) use ($req, $options) {
|
85 |
+
if (!call_user_func(
|
86 |
+
$this->decider,
|
87 |
+
$options['retries'],
|
88 |
+
$req,
|
89 |
+
$value,
|
90 |
+
null
|
91 |
+
)) {
|
92 |
+
return $value;
|
93 |
+
}
|
94 |
+
return $this->doRetry($req, $options, $value);
|
95 |
+
};
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Execute rejected closure
|
100 |
+
*
|
101 |
+
* @return callable
|
102 |
+
*/
|
103 |
+
private function onRejected(RequestInterface $req, array $options)
|
104 |
+
{
|
105 |
+
return function ($reason) use ($req, $options) {
|
106 |
+
if (!call_user_func(
|
107 |
+
$this->decider,
|
108 |
+
$options['retries'],
|
109 |
+
$req,
|
110 |
+
null,
|
111 |
+
$reason
|
112 |
+
)) {
|
113 |
+
return \GuzzleHttp\Promise\rejection_for($reason);
|
114 |
+
}
|
115 |
+
return $this->doRetry($req, $options);
|
116 |
+
};
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
* @return self
|
121 |
+
*/
|
122 |
+
private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null)
|
123 |
+
{
|
124 |
+
$options['delay'] = call_user_func($this->delay, ++$options['retries'], $response);
|
125 |
+
|
126 |
+
return $this($request, $options);
|
127 |
+
}
|
128 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/TransferStats.php
ADDED
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use Psr\Http\Message\RequestInterface;
|
5 |
+
use Psr\Http\Message\ResponseInterface;
|
6 |
+
use Psr\Http\Message\UriInterface;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Represents data at the point after it was transferred either successfully
|
10 |
+
* or after a network error.
|
11 |
+
*/
|
12 |
+
final class TransferStats
|
13 |
+
{
|
14 |
+
private $request;
|
15 |
+
private $response;
|
16 |
+
private $transferTime;
|
17 |
+
private $handlerStats;
|
18 |
+
private $handlerErrorData;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @param RequestInterface $request Request that was sent.
|
22 |
+
* @param ResponseInterface|null $response Response received (if any)
|
23 |
+
* @param float|null $transferTime Total handler transfer time.
|
24 |
+
* @param mixed $handlerErrorData Handler error data.
|
25 |
+
* @param array $handlerStats Handler specific stats.
|
26 |
+
*/
|
27 |
+
public function __construct(
|
28 |
+
RequestInterface $request,
|
29 |
+
ResponseInterface $response = null,
|
30 |
+
$transferTime = null,
|
31 |
+
$handlerErrorData = null,
|
32 |
+
$handlerStats = []
|
33 |
+
) {
|
34 |
+
$this->request = $request;
|
35 |
+
$this->response = $response;
|
36 |
+
$this->transferTime = $transferTime;
|
37 |
+
$this->handlerErrorData = $handlerErrorData;
|
38 |
+
$this->handlerStats = $handlerStats;
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @return RequestInterface
|
43 |
+
*/
|
44 |
+
public function getRequest()
|
45 |
+
{
|
46 |
+
return $this->request;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Returns the response that was received (if any).
|
51 |
+
*
|
52 |
+
* @return ResponseInterface|null
|
53 |
+
*/
|
54 |
+
public function getResponse()
|
55 |
+
{
|
56 |
+
return $this->response;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Returns true if a response was received.
|
61 |
+
*
|
62 |
+
* @return bool
|
63 |
+
*/
|
64 |
+
public function hasResponse()
|
65 |
+
{
|
66 |
+
return $this->response !== null;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Gets handler specific error data.
|
71 |
+
*
|
72 |
+
* This might be an exception, a integer representing an error code, or
|
73 |
+
* anything else. Relying on this value assumes that you know what handler
|
74 |
+
* you are using.
|
75 |
+
*
|
76 |
+
* @return mixed
|
77 |
+
*/
|
78 |
+
public function getHandlerErrorData()
|
79 |
+
{
|
80 |
+
return $this->handlerErrorData;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Get the effective URI the request was sent to.
|
85 |
+
*
|
86 |
+
* @return UriInterface
|
87 |
+
*/
|
88 |
+
public function getEffectiveUri()
|
89 |
+
{
|
90 |
+
return $this->request->getUri();
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Get the estimated time the request was being transferred by the handler.
|
95 |
+
*
|
96 |
+
* @return float|null Time in seconds.
|
97 |
+
*/
|
98 |
+
public function getTransferTime()
|
99 |
+
{
|
100 |
+
return $this->transferTime;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Gets an array of all of the handler specific transfer data.
|
105 |
+
*
|
106 |
+
* @return array
|
107 |
+
*/
|
108 |
+
public function getHandlerStats()
|
109 |
+
{
|
110 |
+
return $this->handlerStats;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Get a specific handler statistic from the handler by name.
|
115 |
+
*
|
116 |
+
* @param string $stat Handler specific transfer stat to retrieve.
|
117 |
+
*
|
118 |
+
* @return mixed|null
|
119 |
+
*/
|
120 |
+
public function getHandlerStat($stat)
|
121 |
+
{
|
122 |
+
return isset($this->handlerStats[$stat])
|
123 |
+
? $this->handlerStats[$stat]
|
124 |
+
: null;
|
125 |
+
}
|
126 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/UriTemplate.php
ADDED
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Expands URI templates. Userland implementation of PECL uri_template.
|
6 |
+
*
|
7 |
+
* @link http://tools.ietf.org/html/rfc6570
|
8 |
+
*/
|
9 |
+
class UriTemplate
|
10 |
+
{
|
11 |
+
/** @var string URI template */
|
12 |
+
private $template;
|
13 |
+
|
14 |
+
/** @var array Variables to use in the template expansion */
|
15 |
+
private $variables;
|
16 |
+
|
17 |
+
/** @var array Hash for quick operator lookups */
|
18 |
+
private static $operatorHash = [
|
19 |
+
'' => ['prefix' => '', 'joiner' => ',', 'query' => false],
|
20 |
+
'+' => ['prefix' => '', 'joiner' => ',', 'query' => false],
|
21 |
+
'#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],
|
22 |
+
'.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],
|
23 |
+
'/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],
|
24 |
+
';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],
|
25 |
+
'?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],
|
26 |
+
'&' => ['prefix' => '&', 'joiner' => '&', 'query' => true]
|
27 |
+
];
|
28 |
+
|
29 |
+
/** @var array Delimiters */
|
30 |
+
private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$',
|
31 |
+
'&', '\'', '(', ')', '*', '+', ',', ';', '='];
|
32 |
+
|
33 |
+
/** @var array Percent encoded delimiters */
|
34 |
+
private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D',
|
35 |
+
'%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C',
|
36 |
+
'%3B', '%3D'];
|
37 |
+
|
38 |
+
public function expand($template, array $variables)
|
39 |
+
{
|
40 |
+
if (false === strpos($template, '{')) {
|
41 |
+
return $template;
|
42 |
+
}
|
43 |
+
|
44 |
+
$this->template = $template;
|
45 |
+
$this->variables = $variables;
|
46 |
+
|
47 |
+
return preg_replace_callback(
|
48 |
+
'/\{([^\}]+)\}/',
|
49 |
+
[$this, 'expandMatch'],
|
50 |
+
$this->template
|
51 |
+
);
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Parse an expression into parts
|
56 |
+
*
|
57 |
+
* @param string $expression Expression to parse
|
58 |
+
*
|
59 |
+
* @return array Returns an associative array of parts
|
60 |
+
*/
|
61 |
+
private function parseExpression($expression)
|
62 |
+
{
|
63 |
+
$result = [];
|
64 |
+
|
65 |
+
if (isset(self::$operatorHash[$expression[0]])) {
|
66 |
+
$result['operator'] = $expression[0];
|
67 |
+
$expression = substr($expression, 1);
|
68 |
+
} else {
|
69 |
+
$result['operator'] = '';
|
70 |
+
}
|
71 |
+
|
72 |
+
foreach (explode(',', $expression) as $value) {
|
73 |
+
$value = trim($value);
|
74 |
+
$varspec = [];
|
75 |
+
if ($colonPos = strpos($value, ':')) {
|
76 |
+
$varspec['value'] = substr($value, 0, $colonPos);
|
77 |
+
$varspec['modifier'] = ':';
|
78 |
+
$varspec['position'] = (int) substr($value, $colonPos + 1);
|
79 |
+
} elseif (substr($value, -1) === '*') {
|
80 |
+
$varspec['modifier'] = '*';
|
81 |
+
$varspec['value'] = substr($value, 0, -1);
|
82 |
+
} else {
|
83 |
+
$varspec['value'] = (string) $value;
|
84 |
+
$varspec['modifier'] = '';
|
85 |
+
}
|
86 |
+
$result['values'][] = $varspec;
|
87 |
+
}
|
88 |
+
|
89 |
+
return $result;
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Process an expansion
|
94 |
+
*
|
95 |
+
* @param array $matches Matches met in the preg_replace_callback
|
96 |
+
*
|
97 |
+
* @return string Returns the replacement string
|
98 |
+
*/
|
99 |
+
private function expandMatch(array $matches)
|
100 |
+
{
|
101 |
+
static $rfc1738to3986 = ['+' => '%20', '%7e' => '~'];
|
102 |
+
|
103 |
+
$replacements = [];
|
104 |
+
$parsed = self::parseExpression($matches[1]);
|
105 |
+
$prefix = self::$operatorHash[$parsed['operator']]['prefix'];
|
106 |
+
$joiner = self::$operatorHash[$parsed['operator']]['joiner'];
|
107 |
+
$useQuery = self::$operatorHash[$parsed['operator']]['query'];
|
108 |
+
|
109 |
+
foreach ($parsed['values'] as $value) {
|
110 |
+
if (!isset($this->variables[$value['value']])) {
|
111 |
+
continue;
|
112 |
+
}
|
113 |
+
|
114 |
+
$variable = $this->variables[$value['value']];
|
115 |
+
$actuallyUseQuery = $useQuery;
|
116 |
+
$expanded = '';
|
117 |
+
|
118 |
+
if (is_array($variable)) {
|
119 |
+
$isAssoc = $this->isAssoc($variable);
|
120 |
+
$kvp = [];
|
121 |
+
foreach ($variable as $key => $var) {
|
122 |
+
if ($isAssoc) {
|
123 |
+
$key = rawurlencode($key);
|
124 |
+
$isNestedArray = is_array($var);
|
125 |
+
} else {
|
126 |
+
$isNestedArray = false;
|
127 |
+
}
|
128 |
+
|
129 |
+
if (!$isNestedArray) {
|
130 |
+
$var = rawurlencode($var);
|
131 |
+
if ($parsed['operator'] === '+' ||
|
132 |
+
$parsed['operator'] === '#'
|
133 |
+
) {
|
134 |
+
$var = $this->decodeReserved($var);
|
135 |
+
}
|
136 |
+
}
|
137 |
+
|
138 |
+
if ($value['modifier'] === '*') {
|
139 |
+
if ($isAssoc) {
|
140 |
+
if ($isNestedArray) {
|
141 |
+
// Nested arrays must allow for deeply nested
|
142 |
+
// structures.
|
143 |
+
$var = strtr(
|
144 |
+
http_build_query([$key => $var]),
|
145 |
+
$rfc1738to3986
|
146 |
+
);
|
147 |
+
} else {
|
148 |
+
$var = $key . '=' . $var;
|
149 |
+
}
|
150 |
+
} elseif ($key > 0 && $actuallyUseQuery) {
|
151 |
+
$var = $value['value'] . '=' . $var;
|
152 |
+
}
|
153 |
+
}
|
154 |
+
|
155 |
+
$kvp[$key] = $var;
|
156 |
+
}
|
157 |
+
|
158 |
+
if (empty($variable)) {
|
159 |
+
$actuallyUseQuery = false;
|
160 |
+
} elseif ($value['modifier'] === '*') {
|
161 |
+
$expanded = implode($joiner, $kvp);
|
162 |
+
if ($isAssoc) {
|
163 |
+
// Don't prepend the value name when using the explode
|
164 |
+
// modifier with an associative array.
|
165 |
+
$actuallyUseQuery = false;
|
166 |
+
}
|
167 |
+
} else {
|
168 |
+
if ($isAssoc) {
|
169 |
+
// When an associative array is encountered and the
|
170 |
+
// explode modifier is not set, then the result must be
|
171 |
+
// a comma separated list of keys followed by their
|
172 |
+
// respective values.
|
173 |
+
foreach ($kvp as $k => &$v) {
|
174 |
+
$v = $k . ',' . $v;
|
175 |
+
}
|
176 |
+
}
|
177 |
+
$expanded = implode(',', $kvp);
|
178 |
+
}
|
179 |
+
} else {
|
180 |
+
if ($value['modifier'] === ':') {
|
181 |
+
$variable = substr($variable, 0, $value['position']);
|
182 |
+
}
|
183 |
+
$expanded = rawurlencode($variable);
|
184 |
+
if ($parsed['operator'] === '+' || $parsed['operator'] === '#') {
|
185 |
+
$expanded = $this->decodeReserved($expanded);
|
186 |
+
}
|
187 |
+
}
|
188 |
+
|
189 |
+
if ($actuallyUseQuery) {
|
190 |
+
if (!$expanded && $joiner !== '&') {
|
191 |
+
$expanded = $value['value'];
|
192 |
+
} else {
|
193 |
+
$expanded = $value['value'] . '=' . $expanded;
|
194 |
+
}
|
195 |
+
}
|
196 |
+
|
197 |
+
$replacements[] = $expanded;
|
198 |
+
}
|
199 |
+
|
200 |
+
$ret = implode($joiner, $replacements);
|
201 |
+
if ($ret && $prefix) {
|
202 |
+
return $prefix . $ret;
|
203 |
+
}
|
204 |
+
|
205 |
+
return $ret;
|
206 |
+
}
|
207 |
+
|
208 |
+
/**
|
209 |
+
* Determines if an array is associative.
|
210 |
+
*
|
211 |
+
* This makes the assumption that input arrays are sequences or hashes.
|
212 |
+
* This assumption is a tradeoff for accuracy in favor of speed, but it
|
213 |
+
* should work in almost every case where input is supplied for a URI
|
214 |
+
* template.
|
215 |
+
*
|
216 |
+
* @param array $array Array to check
|
217 |
+
*
|
218 |
+
* @return bool
|
219 |
+
*/
|
220 |
+
private function isAssoc(array $array)
|
221 |
+
{
|
222 |
+
return $array && array_keys($array)[0] !== 0;
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* Removes percent encoding on reserved characters (used with + and #
|
227 |
+
* modifiers).
|
228 |
+
*
|
229 |
+
* @param string $string String to fix
|
230 |
+
*
|
231 |
+
* @return string
|
232 |
+
*/
|
233 |
+
private function decodeReserved($string)
|
234 |
+
{
|
235 |
+
return str_replace(self::$delimsPct, self::$delims, $string);
|
236 |
+
}
|
237 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/Utils.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Exception\InvalidArgumentException;
|
5 |
+
use Psr\Http\Message\UriInterface;
|
6 |
+
|
7 |
+
final class Utils
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* Wrapper for the hrtime() or microtime() functions
|
11 |
+
* (depending on the PHP version, one of the two is used)
|
12 |
+
*
|
13 |
+
* @return float|mixed UNIX timestamp
|
14 |
+
*
|
15 |
+
* @internal
|
16 |
+
*/
|
17 |
+
public static function currentTime()
|
18 |
+
{
|
19 |
+
return function_exists('hrtime') ? hrtime(true) / 1e9 : microtime(true);
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* @param int $options
|
24 |
+
*
|
25 |
+
* @return UriInterface
|
26 |
+
* @throws InvalidArgumentException
|
27 |
+
*
|
28 |
+
* @internal
|
29 |
+
*/
|
30 |
+
public static function idnUriConvert(UriInterface $uri, $options = 0)
|
31 |
+
{
|
32 |
+
if ($uri->getHost()) {
|
33 |
+
$idnaVariant = defined('INTL_IDNA_VARIANT_UTS46') ? INTL_IDNA_VARIANT_UTS46 : 0;
|
34 |
+
$asciiHost = $idnaVariant === 0
|
35 |
+
? idn_to_ascii($uri->getHost(), $options)
|
36 |
+
: idn_to_ascii($uri->getHost(), $options, $idnaVariant, $info);
|
37 |
+
if ($asciiHost === false) {
|
38 |
+
$errorBitSet = isset($info['errors']) ? $info['errors'] : 0;
|
39 |
+
|
40 |
+
$errorConstants = array_filter(array_keys(get_defined_constants()), function ($name) {
|
41 |
+
return substr($name, 0, 11) === 'IDNA_ERROR_';
|
42 |
+
});
|
43 |
+
|
44 |
+
$errors = [];
|
45 |
+
foreach ($errorConstants as $errorConstant) {
|
46 |
+
if ($errorBitSet & constant($errorConstant)) {
|
47 |
+
$errors[] = $errorConstant;
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
$errorMessage = 'IDN conversion failed';
|
52 |
+
if ($errors) {
|
53 |
+
$errorMessage .= ' (errors: ' . implode(', ', $errors) . ')';
|
54 |
+
}
|
55 |
+
|
56 |
+
throw new InvalidArgumentException($errorMessage);
|
57 |
+
} else {
|
58 |
+
if ($uri->getHost() !== $asciiHost) {
|
59 |
+
// Replace URI only if the ASCII version is different
|
60 |
+
$uri = $uri->withHost($asciiHost);
|
61 |
+
}
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
return $uri;
|
66 |
+
}
|
67 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/functions.php
ADDED
@@ -0,0 +1,334 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp;
|
3 |
+
|
4 |
+
use GuzzleHttp\Handler\CurlHandler;
|
5 |
+
use GuzzleHttp\Handler\CurlMultiHandler;
|
6 |
+
use GuzzleHttp\Handler\Proxy;
|
7 |
+
use GuzzleHttp\Handler\StreamHandler;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Expands a URI template
|
11 |
+
*
|
12 |
+
* @param string $template URI template
|
13 |
+
* @param array $variables Template variables
|
14 |
+
*
|
15 |
+
* @return string
|
16 |
+
*/
|
17 |
+
function uri_template($template, array $variables)
|
18 |
+
{
|
19 |
+
if (extension_loaded('uri_template')) {
|
20 |
+
// @codeCoverageIgnoreStart
|
21 |
+
return \uri_template($template, $variables);
|
22 |
+
// @codeCoverageIgnoreEnd
|
23 |
+
}
|
24 |
+
|
25 |
+
static $uriTemplate;
|
26 |
+
if (!$uriTemplate) {
|
27 |
+
$uriTemplate = new UriTemplate();
|
28 |
+
}
|
29 |
+
|
30 |
+
return $uriTemplate->expand($template, $variables);
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Debug function used to describe the provided value type and class.
|
35 |
+
*
|
36 |
+
* @param mixed $input
|
37 |
+
*
|
38 |
+
* @return string Returns a string containing the type of the variable and
|
39 |
+
* if a class is provided, the class name.
|
40 |
+
*/
|
41 |
+
function describe_type($input)
|
42 |
+
{
|
43 |
+
switch (gettype($input)) {
|
44 |
+
case 'object':
|
45 |
+
return 'object(' . get_class($input) . ')';
|
46 |
+
case 'array':
|
47 |
+
return 'array(' . count($input) . ')';
|
48 |
+
default:
|
49 |
+
ob_start();
|
50 |
+
var_dump($input);
|
51 |
+
// normalize float vs double
|
52 |
+
return str_replace('double(', 'float(', rtrim(ob_get_clean()));
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Parses an array of header lines into an associative array of headers.
|
58 |
+
*
|
59 |
+
* @param iterable $lines Header lines array of strings in the following
|
60 |
+
* format: "Name: Value"
|
61 |
+
* @return array
|
62 |
+
*/
|
63 |
+
function headers_from_lines($lines)
|
64 |
+
{
|
65 |
+
$headers = [];
|
66 |
+
|
67 |
+
foreach ($lines as $line) {
|
68 |
+
$parts = explode(':', $line, 2);
|
69 |
+
$headers[trim($parts[0])][] = isset($parts[1])
|
70 |
+
? trim($parts[1])
|
71 |
+
: null;
|
72 |
+
}
|
73 |
+
|
74 |
+
return $headers;
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Returns a debug stream based on the provided variable.
|
79 |
+
*
|
80 |
+
* @param mixed $value Optional value
|
81 |
+
*
|
82 |
+
* @return resource
|
83 |
+
*/
|
84 |
+
function debug_resource($value = null)
|
85 |
+
{
|
86 |
+
if (is_resource($value)) {
|
87 |
+
return $value;
|
88 |
+
} elseif (defined('STDOUT')) {
|
89 |
+
return STDOUT;
|
90 |
+
}
|
91 |
+
|
92 |
+
return fopen('php://output', 'w');
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Chooses and creates a default handler to use based on the environment.
|
97 |
+
*
|
98 |
+
* The returned handler is not wrapped by any default middlewares.
|
99 |
+
*
|
100 |
+
* @return callable Returns the best handler for the given system.
|
101 |
+
* @throws \RuntimeException if no viable Handler is available.
|
102 |
+
*/
|
103 |
+
function choose_handler()
|
104 |
+
{
|
105 |
+
$handler = null;
|
106 |
+
if (function_exists('curl_multi_exec') && function_exists('curl_exec')) {
|
107 |
+
$handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
|
108 |
+
} elseif (function_exists('curl_exec')) {
|
109 |
+
$handler = new CurlHandler();
|
110 |
+
} elseif (function_exists('curl_multi_exec')) {
|
111 |
+
$handler = new CurlMultiHandler();
|
112 |
+
}
|
113 |
+
|
114 |
+
if (ini_get('allow_url_fopen')) {
|
115 |
+
$handler = $handler
|
116 |
+
? Proxy::wrapStreaming($handler, new StreamHandler())
|
117 |
+
: new StreamHandler();
|
118 |
+
} elseif (!$handler) {
|
119 |
+
throw new \RuntimeException('GuzzleHttp requires cURL, the '
|
120 |
+
. 'allow_url_fopen ini setting, or a custom HTTP handler.');
|
121 |
+
}
|
122 |
+
|
123 |
+
return $handler;
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Get the default User-Agent string to use with Guzzle
|
128 |
+
*
|
129 |
+
* @return string
|
130 |
+
*/
|
131 |
+
function default_user_agent()
|
132 |
+
{
|
133 |
+
static $defaultAgent = '';
|
134 |
+
|
135 |
+
if (!$defaultAgent) {
|
136 |
+
$defaultAgent = 'GuzzleHttp/' . Client::VERSION;
|
137 |
+
if (extension_loaded('curl') && function_exists('curl_version')) {
|
138 |
+
$defaultAgent .= ' curl/' . \curl_version()['version'];
|
139 |
+
}
|
140 |
+
$defaultAgent .= ' PHP/' . PHP_VERSION;
|
141 |
+
}
|
142 |
+
|
143 |
+
return $defaultAgent;
|
144 |
+
}
|
145 |
+
|
146 |
+
/**
|
147 |
+
* Returns the default cacert bundle for the current system.
|
148 |
+
*
|
149 |
+
* First, the openssl.cafile and curl.cainfo php.ini settings are checked.
|
150 |
+
* If those settings are not configured, then the common locations for
|
151 |
+
* bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
|
152 |
+
* and Windows are checked. If any of these file locations are found on
|
153 |
+
* disk, they will be utilized.
|
154 |
+
*
|
155 |
+
* Note: the result of this function is cached for subsequent calls.
|
156 |
+
*
|
157 |
+
* @return string
|
158 |
+
* @throws \RuntimeException if no bundle can be found.
|
159 |
+
*/
|
160 |
+
function default_ca_bundle()
|
161 |
+
{
|
162 |
+
static $cached = null;
|
163 |
+
static $cafiles = [
|
164 |
+
// Red Hat, CentOS, Fedora (provided by the ca-certificates package)
|
165 |
+
'/etc/pki/tls/certs/ca-bundle.crt',
|
166 |
+
// Ubuntu, Debian (provided by the ca-certificates package)
|
167 |
+
'/etc/ssl/certs/ca-certificates.crt',
|
168 |
+
// FreeBSD (provided by the ca_root_nss package)
|
169 |
+
'/usr/local/share/certs/ca-root-nss.crt',
|
170 |
+
// SLES 12 (provided by the ca-certificates package)
|
171 |
+
'/var/lib/ca-certificates/ca-bundle.pem',
|
172 |
+
// OS X provided by homebrew (using the default path)
|
173 |
+
'/usr/local/etc/openssl/cert.pem',
|
174 |
+
// Google app engine
|
175 |
+
'/etc/ca-certificates.crt',
|
176 |
+
// Windows?
|
177 |
+
'C:\\windows\\system32\\curl-ca-bundle.crt',
|
178 |
+
'C:\\windows\\curl-ca-bundle.crt',
|
179 |
+
];
|
180 |
+
|
181 |
+
if ($cached) {
|
182 |
+
return $cached;
|
183 |
+
}
|
184 |
+
|
185 |
+
if ($ca = ini_get('openssl.cafile')) {
|
186 |
+
return $cached = $ca;
|
187 |
+
}
|
188 |
+
|
189 |
+
if ($ca = ini_get('curl.cainfo')) {
|
190 |
+
return $cached = $ca;
|
191 |
+
}
|
192 |
+
|
193 |
+
foreach ($cafiles as $filename) {
|
194 |
+
if (file_exists($filename)) {
|
195 |
+
return $cached = $filename;
|
196 |
+
}
|
197 |
+
}
|
198 |
+
|
199 |
+
throw new \RuntimeException(
|
200 |
+
<<< EOT
|
201 |
+
No system CA bundle could be found in any of the the common system locations.
|
202 |
+
PHP versions earlier than 5.6 are not properly configured to use the system's
|
203 |
+
CA bundle by default. In order to verify peer certificates, you will need to
|
204 |
+
supply the path on disk to a certificate bundle to the 'verify' request
|
205 |
+
option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not
|
206 |
+
need a specific certificate bundle, then Mozilla provides a commonly used CA
|
207 |
+
bundle which can be downloaded here (provided by the maintainer of cURL):
|
208 |
+
https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once
|
209 |
+
you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP
|
210 |
+
ini setting to point to the path to the file, allowing you to omit the 'verify'
|
211 |
+
request option. See http://curl.haxx.se/docs/sslcerts.html for more
|
212 |
+
information.
|
213 |
+
EOT
|
214 |
+
);
|
215 |
+
}
|
216 |
+
|
217 |
+
/**
|
218 |
+
* Creates an associative array of lowercase header names to the actual
|
219 |
+
* header casing.
|
220 |
+
*
|
221 |
+
* @param array $headers
|
222 |
+
*
|
223 |
+
* @return array
|
224 |
+
*/
|
225 |
+
function normalize_header_keys(array $headers)
|
226 |
+
{
|
227 |
+
$result = [];
|
228 |
+
foreach (array_keys($headers) as $key) {
|
229 |
+
$result[strtolower($key)] = $key;
|
230 |
+
}
|
231 |
+
|
232 |
+
return $result;
|
233 |
+
}
|
234 |
+
|
235 |
+
/**
|
236 |
+
* Returns true if the provided host matches any of the no proxy areas.
|
237 |
+
*
|
238 |
+
* This method will strip a port from the host if it is present. Each pattern
|
239 |
+
* can be matched with an exact match (e.g., "foo.com" == "foo.com") or a
|
240 |
+
* partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" ==
|
241 |
+
* "baz.foo.com", but ".foo.com" != "foo.com").
|
242 |
+
*
|
243 |
+
* Areas are matched in the following cases:
|
244 |
+
* 1. "*" (without quotes) always matches any hosts.
|
245 |
+
* 2. An exact match.
|
246 |
+
* 3. The area starts with "." and the area is the last part of the host. e.g.
|
247 |
+
* '.mit.edu' will match any host that ends with '.mit.edu'.
|
248 |
+
*
|
249 |
+
* @param string $host Host to check against the patterns.
|
250 |
+
* @param array $noProxyArray An array of host patterns.
|
251 |
+
*
|
252 |
+
* @return bool
|
253 |
+
*/
|
254 |
+
function is_host_in_noproxy($host, array $noProxyArray)
|
255 |
+
{
|
256 |
+
if (strlen($host) === 0) {
|
257 |
+
throw new \InvalidArgumentException('Empty host provided');
|
258 |
+
}
|
259 |
+
|
260 |
+
// Strip port if present.
|
261 |
+
if (strpos($host, ':')) {
|
262 |
+
$host = explode($host, ':', 2)[0];
|
263 |
+
}
|
264 |
+
|
265 |
+
foreach ($noProxyArray as $area) {
|
266 |
+
// Always match on wildcards.
|
267 |
+
if ($area === '*') {
|
268 |
+
return true;
|
269 |
+
} elseif (empty($area)) {
|
270 |
+
// Don't match on empty values.
|
271 |
+
continue;
|
272 |
+
} elseif ($area === $host) {
|
273 |
+
// Exact matches.
|
274 |
+
return true;
|
275 |
+
} else {
|
276 |
+
// Special match if the area when prefixed with ".". Remove any
|
277 |
+
// existing leading "." and add a new leading ".".
|
278 |
+
$area = '.' . ltrim($area, '.');
|
279 |
+
if (substr($host, -(strlen($area))) === $area) {
|
280 |
+
return true;
|
281 |
+
}
|
282 |
+
}
|
283 |
+
}
|
284 |
+
|
285 |
+
return false;
|
286 |
+
}
|
287 |
+
|
288 |
+
/**
|
289 |
+
* Wrapper for json_decode that throws when an error occurs.
|
290 |
+
*
|
291 |
+
* @param string $json JSON data to parse
|
292 |
+
* @param bool $assoc When true, returned objects will be converted
|
293 |
+
* into associative arrays.
|
294 |
+
* @param int $depth User specified recursion depth.
|
295 |
+
* @param int $options Bitmask of JSON decode options.
|
296 |
+
*
|
297 |
+
* @return mixed
|
298 |
+
* @throws Exception\InvalidArgumentException if the JSON cannot be decoded.
|
299 |
+
* @link http://www.php.net/manual/en/function.json-decode.php
|
300 |
+
*/
|
301 |
+
function json_decode($json, $assoc = false, $depth = 512, $options = 0)
|
302 |
+
{
|
303 |
+
$data = \json_decode($json, $assoc, $depth, $options);
|
304 |
+
if (JSON_ERROR_NONE !== json_last_error()) {
|
305 |
+
throw new Exception\InvalidArgumentException(
|
306 |
+
'json_decode error: ' . json_last_error_msg()
|
307 |
+
);
|
308 |
+
}
|
309 |
+
|
310 |
+
return $data;
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Wrapper for JSON encoding that throws when an error occurs.
|
315 |
+
*
|
316 |
+
* @param mixed $value The value being encoded
|
317 |
+
* @param int $options JSON encode option bitmask
|
318 |
+
* @param int $depth Set the maximum depth. Must be greater than zero.
|
319 |
+
*
|
320 |
+
* @return string
|
321 |
+
* @throws Exception\InvalidArgumentException if the JSON cannot be encoded.
|
322 |
+
* @link http://www.php.net/manual/en/function.json-encode.php
|
323 |
+
*/
|
324 |
+
function json_encode($value, $options = 0, $depth = 512)
|
325 |
+
{
|
326 |
+
$json = \json_encode($value, $options, $depth);
|
327 |
+
if (JSON_ERROR_NONE !== json_last_error()) {
|
328 |
+
throw new Exception\InvalidArgumentException(
|
329 |
+
'json_encode error: ' . json_last_error_msg()
|
330 |
+
);
|
331 |
+
}
|
332 |
+
|
333 |
+
return $json;
|
334 |
+
}
|
includes/vendor/mailjet/guzzlehttp/guzzle/src/functions_include.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Don't redefine the functions if included multiple times.
|
4 |
+
if (!function_exists('GuzzleHttp\uri_template')) {
|
5 |
+
require __DIR__ . '/functions.php';
|
6 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/CHANGELOG.md
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# CHANGELOG
|
2 |
+
|
3 |
+
|
4 |
+
## 1.3.1 - 2016-12-20
|
5 |
+
|
6 |
+
### Fixed
|
7 |
+
|
8 |
+
- `wait()` foreign promise compatibility
|
9 |
+
|
10 |
+
|
11 |
+
## 1.3.0 - 2016-11-18
|
12 |
+
|
13 |
+
### Added
|
14 |
+
|
15 |
+
- Adds support for custom task queues.
|
16 |
+
|
17 |
+
### Fixed
|
18 |
+
|
19 |
+
- Fixed coroutine promise memory leak.
|
20 |
+
|
21 |
+
|
22 |
+
## 1.2.0 - 2016-05-18
|
23 |
+
|
24 |
+
### Changed
|
25 |
+
|
26 |
+
- Update to now catch `\Throwable` on PHP 7+
|
27 |
+
|
28 |
+
|
29 |
+
## 1.1.0 - 2016-03-07
|
30 |
+
|
31 |
+
### Changed
|
32 |
+
|
33 |
+
- Update EachPromise to prevent recurring on a iterator when advancing, as this
|
34 |
+
could trigger fatal generator errors.
|
35 |
+
- Update Promise to allow recursive waiting without unwrapping exceptions.
|
36 |
+
|
37 |
+
|
38 |
+
## 1.0.3 - 2015-10-15
|
39 |
+
|
40 |
+
### Changed
|
41 |
+
|
42 |
+
- Update EachPromise to immediately resolve when the underlying promise iterator
|
43 |
+
is empty. Previously, such a promise would throw an exception when its `wait`
|
44 |
+
function was called.
|
45 |
+
|
46 |
+
|
47 |
+
## 1.0.2 - 2015-05-15
|
48 |
+
|
49 |
+
### Changed
|
50 |
+
|
51 |
+
- Conditionally require functions.php.
|
52 |
+
|
53 |
+
|
54 |
+
## 1.0.1 - 2015-06-24
|
55 |
+
|
56 |
+
### Changed
|
57 |
+
|
58 |
+
- Updating EachPromise to call next on the underlying promise iterator as late
|
59 |
+
as possible to ensure that generators that generate new requests based on
|
60 |
+
callbacks are not iterated until after callbacks are invoked.
|
61 |
+
|
62 |
+
|
63 |
+
## 1.0.0 - 2015-05-12
|
64 |
+
|
65 |
+
- Initial release
|
includes/vendor/mailjet/guzzlehttp/promises/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright (c) 2015-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
|
2 |
+
|
3 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4 |
+
of this software and associated documentation files (the "Software"), to deal
|
5 |
+
in the Software without restriction, including without limitation the rights
|
6 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7 |
+
copies of the Software, and to permit persons to whom the Software is
|
8 |
+
furnished to do so, subject to the following conditions:
|
9 |
+
|
10 |
+
The above copyright notice and this permission notice shall be included in
|
11 |
+
all copies or substantial portions of the Software.
|
12 |
+
|
13 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19 |
+
THE SOFTWARE.
|
includes/vendor/mailjet/guzzlehttp/promises/Makefile
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
all: clean test
|
2 |
+
|
3 |
+
test:
|
4 |
+
vendor/bin/phpunit
|
5 |
+
|
6 |
+
coverage:
|
7 |
+
vendor/bin/phpunit --coverage-html=artifacts/coverage
|
8 |
+
|
9 |
+
view-coverage:
|
10 |
+
open artifacts/coverage/index.html
|
11 |
+
|
12 |
+
clean:
|
13 |
+
rm -rf artifacts/*
|
includes/vendor/mailjet/guzzlehttp/promises/README.md
ADDED
@@ -0,0 +1,504 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Guzzle Promises
|
2 |
+
|
3 |
+
[Promises/A+](https://promisesaplus.com/) implementation that handles promise
|
4 |
+
chaining and resolution iteratively, allowing for "infinite" promise chaining
|
5 |
+
while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/)
|
6 |
+
for a general introduction to promises.
|
7 |
+
|
8 |
+
- [Features](#features)
|
9 |
+
- [Quick start](#quick-start)
|
10 |
+
- [Synchronous wait](#synchronous-wait)
|
11 |
+
- [Cancellation](#cancellation)
|
12 |
+
- [API](#api)
|
13 |
+
- [Promise](#promise)
|
14 |
+
- [FulfilledPromise](#fulfilledpromise)
|
15 |
+
- [RejectedPromise](#rejectedpromise)
|
16 |
+
- [Promise interop](#promise-interop)
|
17 |
+
- [Implementation notes](#implementation-notes)
|
18 |
+
|
19 |
+
|
20 |
+
# Features
|
21 |
+
|
22 |
+
- [Promises/A+](https://promisesaplus.com/) implementation.
|
23 |
+
- Promise resolution and chaining is handled iteratively, allowing for
|
24 |
+
"infinite" promise chaining.
|
25 |
+
- Promises have a synchronous `wait` method.
|
26 |
+
- Promises can be cancelled.
|
27 |
+
- Works with any object that has a `then` function.
|
28 |
+
- C# style async/await coroutine promises using
|
29 |
+
`GuzzleHttp\Promise\coroutine()`.
|
30 |
+
|
31 |
+
|
32 |
+
# Quick start
|
33 |
+
|
34 |
+
A *promise* represents the eventual result of an asynchronous operation. The
|
35 |
+
primary way of interacting with a promise is through its `then` method, which
|
36 |
+
registers callbacks to receive either a promise's eventual value or the reason
|
37 |
+
why the promise cannot be fulfilled.
|
38 |
+
|
39 |
+
|
40 |
+
## Callbacks
|
41 |
+
|
42 |
+
Callbacks are registered with the `then` method by providing an optional
|
43 |
+
`$onFulfilled` followed by an optional `$onRejected` function.
|
44 |
+
|
45 |
+
|
46 |
+
```php
|
47 |
+
use GuzzleHttp\Promise\Promise;
|
48 |
+
|
49 |
+
$promise = new Promise();
|
50 |
+
$promise->then(
|
51 |
+
// $onFulfilled
|
52 |
+
function ($value) {
|
53 |
+
echo 'The promise was fulfilled.';
|
54 |
+
},
|
55 |
+
// $onRejected
|
56 |
+
function ($reason) {
|
57 |
+
echo 'The promise was rejected.';
|
58 |
+
}
|
59 |
+
);
|
60 |
+
```
|
61 |
+
|
62 |
+
*Resolving* a promise means that you either fulfill a promise with a *value* or
|
63 |
+
reject a promise with a *reason*. Resolving a promises triggers callbacks
|
64 |
+
registered with the promises's `then` method. These callbacks are triggered
|
65 |
+
only once and in the order in which they were added.
|
66 |
+
|
67 |
+
|
68 |
+
## Resolving a promise
|
69 |
+
|
70 |
+
Promises are fulfilled using the `resolve($value)` method. Resolving a promise
|
71 |
+
with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger
|
72 |
+
all of the onFulfilled callbacks (resolving a promise with a rejected promise
|
73 |
+
will reject the promise and trigger the `$onRejected` callbacks).
|
74 |
+
|
75 |
+
```php
|
76 |
+
use GuzzleHttp\Promise\Promise;
|
77 |
+
|
78 |
+
$promise = new Promise();
|
79 |
+
$promise
|
80 |
+
->then(function ($value) {
|
81 |
+
// Return a value and don't break the chain
|
82 |
+
return "Hello, " . $value;
|
83 |
+
})
|
84 |
+
// This then is executed after the first then and receives the value
|
85 |
+
// returned from the first then.
|
86 |
+
->then(function ($value) {
|
87 |
+
echo $value;
|
88 |
+
});
|
89 |
+
|
90 |
+
// Resolving the promise triggers the $onFulfilled callbacks and outputs
|
91 |
+
// "Hello, reader".
|
92 |
+
$promise->resolve('reader.');
|
93 |
+
```
|
94 |
+
|
95 |
+
|
96 |
+
## Promise forwarding
|
97 |
+
|
98 |
+
Promises can be chained one after the other. Each then in the chain is a new
|
99 |
+
promise. The return value of a promise is what's forwarded to the next
|
100 |
+
promise in the chain. Returning a promise in a `then` callback will cause the
|
101 |
+
subsequent promises in the chain to only be fulfilled when the returned promise
|
102 |
+
has been fulfilled. The next promise in the chain will be invoked with the
|
103 |
+
resolved value of the promise.
|
104 |
+
|
105 |
+
```php
|
106 |
+
use GuzzleHttp\Promise\Promise;
|
107 |
+
|
108 |
+
$promise = new Promise();
|
109 |
+
$nextPromise = new Promise();
|
110 |
+
|
111 |
+
$promise
|
112 |
+
->then(function ($value) use ($nextPromise) {
|
113 |
+
echo $value;
|
114 |
+
return $nextPromise;
|
115 |
+
})
|
116 |
+
->then(function ($value) {
|
117 |
+
echo $value;
|
118 |
+
});
|
119 |
+
|
120 |
+
// Triggers the first callback and outputs "A"
|
121 |
+
$promise->resolve('A');
|
122 |
+
// Triggers the second callback and outputs "B"
|
123 |
+
$nextPromise->resolve('B');
|
124 |
+
```
|
125 |
+
|
126 |
+
## Promise rejection
|
127 |
+
|
128 |
+
When a promise is rejected, the `$onRejected` callbacks are invoked with the
|
129 |
+
rejection reason.
|
130 |
+
|
131 |
+
```php
|
132 |
+
use GuzzleHttp\Promise\Promise;
|
133 |
+
|
134 |
+
$promise = new Promise();
|
135 |
+
$promise->then(null, function ($reason) {
|
136 |
+
echo $reason;
|
137 |
+
});
|
138 |
+
|
139 |
+
$promise->reject('Error!');
|
140 |
+
// Outputs "Error!"
|
141 |
+
```
|
142 |
+
|
143 |
+
## Rejection forwarding
|
144 |
+
|
145 |
+
If an exception is thrown in an `$onRejected` callback, subsequent
|
146 |
+
`$onRejected` callbacks are invoked with the thrown exception as the reason.
|
147 |
+
|
148 |
+
```php
|
149 |
+
use GuzzleHttp\Promise\Promise;
|
150 |
+
|
151 |
+
$promise = new Promise();
|
152 |
+
$promise->then(null, function ($reason) {
|
153 |
+
throw new \Exception($reason);
|
154 |
+
})->then(null, function ($reason) {
|
155 |
+
assert($reason->getMessage() === 'Error!');
|
156 |
+
});
|
157 |
+
|
158 |
+
$promise->reject('Error!');
|
159 |
+
```
|
160 |
+
|
161 |
+
You can also forward a rejection down the promise chain by returning a
|
162 |
+
`GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or
|
163 |
+
`$onRejected` callback.
|
164 |
+
|
165 |
+
```php
|
166 |
+
use GuzzleHttp\Promise\Promise;
|
167 |
+
use GuzzleHttp\Promise\RejectedPromise;
|
168 |
+
|
169 |
+
$promise = new Promise();
|
170 |
+
$promise->then(null, function ($reason) {
|
171 |
+
return new RejectedPromise($reason);
|
172 |
+
})->then(null, function ($reason) {
|
173 |
+
assert($reason === 'Error!');
|
174 |
+
});
|
175 |
+
|
176 |
+
$promise->reject('Error!');
|
177 |
+
```
|
178 |
+
|
179 |
+
If an exception is not thrown in a `$onRejected` callback and the callback
|
180 |
+
does not return a rejected promise, downstream `$onFulfilled` callbacks are
|
181 |
+
invoked using the value returned from the `$onRejected` callback.
|
182 |
+
|
183 |
+
```php
|
184 |
+
use GuzzleHttp\Promise\Promise;
|
185 |
+
use GuzzleHttp\Promise\RejectedPromise;
|
186 |
+
|
187 |
+
$promise = new Promise();
|
188 |
+
$promise
|
189 |
+
->then(null, function ($reason) {
|
190 |
+
return "It's ok";
|
191 |
+
})
|
192 |
+
->then(function ($value) {
|
193 |
+
assert($value === "It's ok");
|
194 |
+
});
|
195 |
+
|
196 |
+
$promise->reject('Error!');
|
197 |
+
```
|
198 |
+
|
199 |
+
# Synchronous wait
|
200 |
+
|
201 |
+
You can synchronously force promises to complete using a promise's `wait`
|
202 |
+
method. When creating a promise, you can provide a wait function that is used
|
203 |
+
to synchronously force a promise to complete. When a wait function is invoked
|
204 |
+
it is expected to deliver a value to the promise or reject the promise. If the
|
205 |
+
wait function does not deliver a value, then an exception is thrown. The wait
|
206 |
+
function provided to a promise constructor is invoked when the `wait` function
|
207 |
+
of the promise is called.
|
208 |
+
|
209 |
+
```php
|
210 |
+
$promise = new Promise(function () use (&$promise) {
|
211 |
+
$promise->resolve('foo');
|
212 |
+
});
|
213 |
+
|
214 |
+
// Calling wait will return the value of the promise.
|
215 |
+
echo $promise->wait(); // outputs "foo"
|
216 |
+
```
|
217 |
+
|
218 |
+
If an exception is encountered while invoking the wait function of a promise,
|
219 |
+
the promise is rejected with the exception and the exception is thrown.
|
220 |
+
|
221 |
+
```php
|
222 |
+
$promise = new Promise(function () use (&$promise) {
|
223 |
+
throw new \Exception('foo');
|
224 |
+
});
|
225 |
+
|
226 |
+
$promise->wait(); // throws the exception.
|
227 |
+
```
|
228 |
+
|
229 |
+
Calling `wait` on a promise that has been fulfilled will not trigger the wait
|
230 |
+
function. It will simply return the previously resolved value.
|
231 |
+
|
232 |
+
```php
|
233 |
+
$promise = new Promise(function () { die('this is not called!'); });
|
234 |
+
$promise->resolve('foo');
|
235 |
+
echo $promise->wait(); // outputs "foo"
|
236 |
+
```
|
237 |
+
|
238 |
+
Calling `wait` on a promise that has been rejected will throw an exception. If
|
239 |
+
the rejection reason is an instance of `\Exception` the reason is thrown.
|
240 |
+
Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason
|
241 |
+
can be obtained by calling the `getReason` method of the exception.
|
242 |
+
|
243 |
+
```php
|
244 |
+
$promise = new Promise();
|
245 |
+
$promise->reject('foo');
|
246 |
+
$promise->wait();
|
247 |
+
```
|
248 |
+
|
249 |
+
> PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo'
|
250 |
+
|
251 |
+
|
252 |
+
## Unwrapping a promise
|
253 |
+
|
254 |
+
When synchronously waiting on a promise, you are joining the state of the
|
255 |
+
promise into the current state of execution (i.e., return the value of the
|
256 |
+
promise if it was fulfilled or throw an exception if it was rejected). This is
|
257 |
+
called "unwrapping" the promise. Waiting on a promise will by default unwrap
|
258 |
+
the promise state.
|
259 |
+
|
260 |
+
You can force a promise to resolve and *not* unwrap the state of the promise
|
261 |
+
by passing `false` to the first argument of the `wait` function:
|
262 |
+
|
263 |
+
```php
|
264 |
+
$promise = new Promise();
|
265 |
+
$promise->reject('foo');
|
266 |
+
// This will not throw an exception. It simply ensures the promise has
|
267 |
+
// been resolved.
|
268 |
+
$promise->wait(false);
|
269 |
+
```
|
270 |
+
|
271 |
+
When unwrapping a promise, the resolved value of the promise will be waited
|
272 |
+
upon until the unwrapped value is not a promise. This means that if you resolve
|
273 |
+
promise A with a promise B and unwrap promise A, the value returned by the
|
274 |
+
wait function will be the value delivered to promise B.
|
275 |
+
|
276 |
+
**Note**: when you do not unwrap the promise, no value is returned.
|
277 |
+
|
278 |
+
|
279 |
+
# Cancellation
|
280 |
+
|
281 |
+
You can cancel a promise that has not yet been fulfilled using the `cancel()`
|
282 |
+
method of a promise. When creating a promise you can provide an optional
|
283 |
+
cancel function that when invoked cancels the action of computing a resolution
|
284 |
+
of the promise.
|
285 |
+
|
286 |
+
|
287 |
+
# API
|
288 |
+
|
289 |
+
|
290 |
+
## Promise
|
291 |
+
|
292 |
+
When creating a promise object, you can provide an optional `$waitFn` and
|
293 |
+
`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is
|
294 |
+
expected to resolve the promise. `$cancelFn` is a function with no arguments
|
295 |
+
that is expected to cancel the computation of a promise. It is invoked when the
|
296 |
+
`cancel()` method of a promise is called.
|
297 |
+
|
298 |
+
```php
|
299 |
+
use GuzzleHttp\Promise\Promise;
|
300 |
+
|
301 |
+
$promise = new Promise(
|
302 |
+
function () use (&$promise) {
|
303 |
+
$promise->resolve('waited');
|
304 |
+
},
|
305 |
+
function () {
|
306 |
+
// do something that will cancel the promise computation (e.g., close
|
307 |
+
// a socket, cancel a database query, etc...)
|
308 |
+
}
|
309 |
+
);
|
310 |
+
|
311 |
+
assert('waited' === $promise->wait());
|
312 |
+
```
|
313 |
+
|
314 |
+
A promise has the following methods:
|
315 |
+
|
316 |
+
- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`
|
317 |
+
|
318 |
+
Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.
|
319 |
+
|
320 |
+
- `otherwise(callable $onRejected) : PromiseInterface`
|
321 |
+
|
322 |
+
Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled.
|
323 |
+
|
324 |
+
- `wait($unwrap = true) : mixed`
|
325 |
+
|
326 |
+
Synchronously waits on the promise to complete.
|
327 |
+
|
328 |
+
`$unwrap` controls whether or not the value of the promise is returned for a
|
329 |
+
fulfilled promise or if an exception is thrown if the promise is rejected.
|
330 |
+
This is set to `true` by default.
|
331 |
+
|
332 |
+
- `cancel()`
|
333 |
+
|
334 |
+
Attempts to cancel the promise if possible. The promise being cancelled and
|
335 |
+
the parent most ancestor that has not yet been resolved will also be
|
336 |
+
cancelled. Any promises waiting on the cancelled promise to resolve will also
|
337 |
+
be cancelled.
|
338 |
+
|
339 |
+
- `getState() : string`
|
340 |
+
|
341 |
+
Returns the state of the promise. One of `pending`, `fulfilled`, or
|
342 |
+
`rejected`.
|
343 |
+
|
344 |
+
- `resolve($value)`
|
345 |
+
|
346 |
+
Fulfills the promise with the given `$value`.
|
347 |
+
|
348 |
+
- `reject($reason)`
|
349 |
+
|
350 |
+
Rejects the promise with the given `$reason`.
|
351 |
+
|
352 |
+
|
353 |
+
## FulfilledPromise
|
354 |
+
|
355 |
+
A fulfilled promise can be created to represent a promise that has been
|
356 |
+
fulfilled.
|
357 |
+
|
358 |
+
```php
|
359 |
+
use GuzzleHttp\Promise\FulfilledPromise;
|
360 |
+
|
361 |
+
$promise = new FulfilledPromise('value');
|
362 |
+
|
363 |
+
// Fulfilled callbacks are immediately invoked.
|
364 |
+
$promise->then(function ($value) {
|
365 |
+
echo $value;
|
366 |
+
});
|
367 |
+
```
|
368 |
+
|
369 |
+
|
370 |
+
## RejectedPromise
|
371 |
+
|
372 |
+
A rejected promise can be created to represent a promise that has been
|
373 |
+
rejected.
|
374 |
+
|
375 |
+
```php
|
376 |
+
use GuzzleHttp\Promise\RejectedPromise;
|
377 |
+
|
378 |
+
$promise = new RejectedPromise('Error');
|
379 |
+
|
380 |
+
// Rejected callbacks are immediately invoked.
|
381 |
+
$promise->then(null, function ($reason) {
|
382 |
+
echo $reason;
|
383 |
+
});
|
384 |
+
```
|
385 |
+
|
386 |
+
|
387 |
+
# Promise interop
|
388 |
+
|
389 |
+
This library works with foreign promises that have a `then` method. This means
|
390 |
+
you can use Guzzle promises with [React promises](https://github.com/reactphp/promise)
|
391 |
+
for example. When a foreign promise is returned inside of a then method
|
392 |
+
callback, promise resolution will occur recursively.
|
393 |
+
|
394 |
+
```php
|
395 |
+
// Create a React promise
|
396 |
+
$deferred = new React\Promise\Deferred();
|
397 |
+
$reactPromise = $deferred->promise();
|
398 |
+
|
399 |
+
// Create a Guzzle promise that is fulfilled with a React promise.
|
400 |
+
$guzzlePromise = new \GuzzleHttp\Promise\Promise();
|
401 |
+
$guzzlePromise->then(function ($value) use ($reactPromise) {
|
402 |
+
// Do something something with the value...
|
403 |
+
// Return the React promise
|
404 |
+
return $reactPromise;
|
405 |
+
});
|
406 |
+
```
|
407 |
+
|
408 |
+
Please note that wait and cancel chaining is no longer possible when forwarding
|
409 |
+
a foreign promise. You will need to wrap a third-party promise with a Guzzle
|
410 |
+
promise in order to utilize wait and cancel functions with foreign promises.
|
411 |
+
|
412 |
+
|
413 |
+
## Event Loop Integration
|
414 |
+
|
415 |
+
In order to keep the stack size constant, Guzzle promises are resolved
|
416 |
+
asynchronously using a task queue. When waiting on promises synchronously, the
|
417 |
+
task queue will be automatically run to ensure that the blocking promise and
|
418 |
+
any forwarded promises are resolved. When using promises asynchronously in an
|
419 |
+
event loop, you will need to run the task queue on each tick of the loop. If
|
420 |
+
you do not run the task queue, then promises will not be resolved.
|
421 |
+
|
422 |
+
You can run the task queue using the `run()` method of the global task queue
|
423 |
+
instance.
|
424 |
+
|
425 |
+
```php
|
426 |
+
// Get the global task queue
|
427 |
+
$queue = \GuzzleHttp\Promise\queue();
|
428 |
+
$queue->run();
|
429 |
+
```
|
430 |
+
|
431 |
+
For example, you could use Guzzle promises with React using a periodic timer:
|
432 |
+
|
433 |
+
```php
|
434 |
+
$loop = React\EventLoop\Factory::create();
|
435 |
+
$loop->addPeriodicTimer(0, [$queue, 'run']);
|
436 |
+
```
|
437 |
+
|
438 |
+
*TODO*: Perhaps adding a `futureTick()` on each tick would be faster?
|
439 |
+
|
440 |
+
|
441 |
+
# Implementation notes
|
442 |
+
|
443 |
+
|
444 |
+
## Promise resolution and chaining is handled iteratively
|
445 |
+
|
446 |
+
By shuffling pending handlers from one owner to another, promises are
|
447 |
+
resolved iteratively, allowing for "infinite" then chaining.
|
448 |
+
|
449 |
+
```php
|
450 |
+
<?php
|
451 |
+
require 'vendor/autoload.php';
|
452 |
+
|
453 |
+
use GuzzleHttp\Promise\Promise;
|
454 |
+
|
455 |
+
$parent = new Promise();
|
456 |
+
$p = $parent;
|
457 |
+
|
458 |
+
for ($i = 0; $i < 1000; $i++) {
|
459 |
+
$p = $p->then(function ($v) {
|
460 |
+
// The stack size remains constant (a good thing)
|
461 |
+
echo xdebug_get_stack_depth() . ', ';
|
462 |
+
return $v + 1;
|
463 |
+
});
|
464 |
+
}
|
465 |
+
|
466 |
+
$parent->resolve(0);
|
467 |
+
var_dump($p->wait()); // int(1000)
|
468 |
+
|
469 |
+
```
|
470 |
+
|
471 |
+
When a promise is fulfilled or rejected with a non-promise value, the promise
|
472 |
+
then takes ownership of the handlers of each child promise and delivers values
|
473 |
+
down the chain without using recursion.
|
474 |
+
|
475 |
+
When a promise is resolved with another promise, the original promise transfers
|
476 |
+
all of its pending handlers to the new promise. When the new promise is
|
477 |
+
eventually resolved, all of the pending handlers are delivered the forwarded
|
478 |
+
value.
|
479 |
+
|
480 |
+
|
481 |
+
## A promise is the deferred.
|
482 |
+
|
483 |
+
Some promise libraries implement promises using a deferred object to represent
|
484 |
+
a computation and a promise object to represent the delivery of the result of
|
485 |
+
the computation. This is a nice separation of computation and delivery because
|
486 |
+
consumers of the promise cannot modify the value that will be eventually
|
487 |
+
delivered.
|
488 |
+
|
489 |
+
One side effect of being able to implement promise resolution and chaining
|
490 |
+
iteratively is that you need to be able for one promise to reach into the state
|
491 |
+
of another promise to shuffle around ownership of handlers. In order to achieve
|
492 |
+
this without making the handlers of a promise publicly mutable, a promise is
|
493 |
+
also the deferred value, allowing promises of the same parent class to reach
|
494 |
+
into and modify the private properties of promises of the same type. While this
|
495 |
+
does allow consumers of the value to modify the resolution or rejection of the
|
496 |
+
deferred, it is a small price to pay for keeping the stack size constant.
|
497 |
+
|
498 |
+
```php
|
499 |
+
$promise = new Promise();
|
500 |
+
$promise->then(function ($value) { echo $value; });
|
501 |
+
// The promise is the deferred value, so you can deliver a value to it.
|
502 |
+
$promise->resolve('foo');
|
503 |
+
// prints "foo"
|
504 |
+
```
|
includes/vendor/mailjet/guzzlehttp/promises/src/AggregateException.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Exception thrown when too many errors occur in the some() or any() methods.
|
6 |
+
*/
|
7 |
+
class AggregateException extends RejectionException
|
8 |
+
{
|
9 |
+
public function __construct($msg, array $reasons)
|
10 |
+
{
|
11 |
+
parent::__construct(
|
12 |
+
$reasons,
|
13 |
+
sprintf('%s; %d rejected promises', $msg, count($reasons))
|
14 |
+
);
|
15 |
+
}
|
16 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/CancellationException.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Exception that is set as the reason for a promise that has been cancelled.
|
6 |
+
*/
|
7 |
+
class CancellationException extends RejectionException
|
8 |
+
{
|
9 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/Coroutine.php
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
use Exception;
|
5 |
+
use Generator;
|
6 |
+
use Throwable;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Creates a promise that is resolved using a generator that yields values or
|
10 |
+
* promises (somewhat similar to C#'s async keyword).
|
11 |
+
*
|
12 |
+
* When called, the coroutine function will start an instance of the generator
|
13 |
+
* and returns a promise that is fulfilled with its final yielded value.
|
14 |
+
*
|
15 |
+
* Control is returned back to the generator when the yielded promise settles.
|
16 |
+
* This can lead to less verbose code when doing lots of sequential async calls
|
17 |
+
* with minimal processing in between.
|
18 |
+
*
|
19 |
+
* use GuzzleHttp\Promise;
|
20 |
+
*
|
21 |
+
* function createPromise($value) {
|
22 |
+
* return new Promise\FulfilledPromise($value);
|
23 |
+
* }
|
24 |
+
*
|
25 |
+
* $promise = Promise\coroutine(function () {
|
26 |
+
* $value = (yield createPromise('a'));
|
27 |
+
* try {
|
28 |
+
* $value = (yield createPromise($value . 'b'));
|
29 |
+
* } catch (\Exception $e) {
|
30 |
+
* // The promise was rejected.
|
31 |
+
* }
|
32 |
+
* yield $value . 'c';
|
33 |
+
* });
|
34 |
+
*
|
35 |
+
* // Outputs "abc"
|
36 |
+
* $promise->then(function ($v) { echo $v; });
|
37 |
+
*
|
38 |
+
* @param callable $generatorFn Generator function to wrap into a promise.
|
39 |
+
*
|
40 |
+
* @return Promise
|
41 |
+
* @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration
|
42 |
+
*/
|
43 |
+
final class Coroutine implements PromiseInterface
|
44 |
+
{
|
45 |
+
/**
|
46 |
+
* @var PromiseInterface|null
|
47 |
+
*/
|
48 |
+
private $currentPromise;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @var Generator
|
52 |
+
*/
|
53 |
+
private $generator;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @var Promise
|
57 |
+
*/
|
58 |
+
private $result;
|
59 |
+
|
60 |
+
public function __construct(callable $generatorFn)
|
61 |
+
{
|
62 |
+
$this->generator = $generatorFn();
|
63 |
+
$this->result = new Promise(function () {
|
64 |
+
while (isset($this->currentPromise)) {
|
65 |
+
$this->currentPromise->wait();
|
66 |
+
}
|
67 |
+
});
|
68 |
+
$this->nextCoroutine($this->generator->current());
|
69 |
+
}
|
70 |
+
|
71 |
+
public function then(
|
72 |
+
callable $onFulfilled = null,
|
73 |
+
callable $onRejected = null
|
74 |
+
) {
|
75 |
+
return $this->result->then($onFulfilled, $onRejected);
|
76 |
+
}
|
77 |
+
|
78 |
+
public function otherwise(callable $onRejected)
|
79 |
+
{
|
80 |
+
return $this->result->otherwise($onRejected);
|
81 |
+
}
|
82 |
+
|
83 |
+
public function wait($unwrap = true)
|
84 |
+
{
|
85 |
+
return $this->result->wait($unwrap);
|
86 |
+
}
|
87 |
+
|
88 |
+
public function getState()
|
89 |
+
{
|
90 |
+
return $this->result->getState();
|
91 |
+
}
|
92 |
+
|
93 |
+
public function resolve($value)
|
94 |
+
{
|
95 |
+
$this->result->resolve($value);
|
96 |
+
}
|
97 |
+
|
98 |
+
public function reject($reason)
|
99 |
+
{
|
100 |
+
$this->result->reject($reason);
|
101 |
+
}
|
102 |
+
|
103 |
+
public function cancel()
|
104 |
+
{
|
105 |
+
$this->currentPromise->cancel();
|
106 |
+
$this->result->cancel();
|
107 |
+
}
|
108 |
+
|
109 |
+
private function nextCoroutine($yielded)
|
110 |
+
{
|
111 |
+
$this->currentPromise = promise_for($yielded)
|
112 |
+
->then([$this, '_handleSuccess'], [$this, '_handleFailure']);
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* @internal
|
117 |
+
*/
|
118 |
+
public function _handleSuccess($value)
|
119 |
+
{
|
120 |
+
unset($this->currentPromise);
|
121 |
+
try {
|
122 |
+
$next = $this->generator->send($value);
|
123 |
+
if ($this->generator->valid()) {
|
124 |
+
$this->nextCoroutine($next);
|
125 |
+
} else {
|
126 |
+
$this->result->resolve($value);
|
127 |
+
}
|
128 |
+
} catch (Exception $exception) {
|
129 |
+
$this->result->reject($exception);
|
130 |
+
} catch (Throwable $throwable) {
|
131 |
+
$this->result->reject($throwable);
|
132 |
+
}
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* @internal
|
137 |
+
*/
|
138 |
+
public function _handleFailure($reason)
|
139 |
+
{
|
140 |
+
unset($this->currentPromise);
|
141 |
+
try {
|
142 |
+
$nextYield = $this->generator->throw(exception_for($reason));
|
143 |
+
// The throw was caught, so keep iterating on the coroutine
|
144 |
+
$this->nextCoroutine($nextYield);
|
145 |
+
} catch (Exception $exception) {
|
146 |
+
$this->result->reject($exception);
|
147 |
+
} catch (Throwable $throwable) {
|
148 |
+
$this->result->reject($throwable);
|
149 |
+
}
|
150 |
+
}
|
151 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/EachPromise.php
ADDED
@@ -0,0 +1,229 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Represents a promise that iterates over many promises and invokes
|
6 |
+
* side-effect functions in the process.
|
7 |
+
*/
|
8 |
+
class EachPromise implements PromisorInterface
|
9 |
+
{
|
10 |
+
private $pending = [];
|
11 |
+
|
12 |
+
/** @var \Iterator */
|
13 |
+
private $iterable;
|
14 |
+
|
15 |
+
/** @var callable|int */
|
16 |
+
private $concurrency;
|
17 |
+
|
18 |
+
/** @var callable */
|
19 |
+
private $onFulfilled;
|
20 |
+
|
21 |
+
/** @var callable */
|
22 |
+
private $onRejected;
|
23 |
+
|
24 |
+
/** @var Promise */
|
25 |
+
private $aggregate;
|
26 |
+
|
27 |
+
/** @var bool */
|
28 |
+
private $mutex;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Configuration hash can include the following key value pairs:
|
32 |
+
*
|
33 |
+
* - fulfilled: (callable) Invoked when a promise fulfills. The function
|
34 |
+
* is invoked with three arguments: the fulfillment value, the index
|
35 |
+
* position from the iterable list of the promise, and the aggregate
|
36 |
+
* promise that manages all of the promises. The aggregate promise may
|
37 |
+
* be resolved from within the callback to short-circuit the promise.
|
38 |
+
* - rejected: (callable) Invoked when a promise is rejected. The
|
39 |
+
* function is invoked with three arguments: the rejection reason, the
|
40 |
+
* index position from the iterable list of the promise, and the
|
41 |
+
* aggregate promise that manages all of the promises. The aggregate
|
42 |
+
* promise may be resolved from within the callback to short-circuit
|
43 |
+
* the promise.
|
44 |
+
* - concurrency: (integer) Pass this configuration option to limit the
|
45 |
+
* allowed number of outstanding concurrently executing promises,
|
46 |
+
* creating a capped pool of promises. There is no limit by default.
|
47 |
+
*
|
48 |
+
* @param mixed $iterable Promises or values to iterate.
|
49 |
+
* @param array $config Configuration options
|
50 |
+
*/
|
51 |
+
public function __construct($iterable, array $config = [])
|
52 |
+
{
|
53 |
+
$this->iterable = iter_for($iterable);
|
54 |
+
|
55 |
+
if (isset($config['concurrency'])) {
|
56 |
+
$this->concurrency = $config['concurrency'];
|
57 |
+
}
|
58 |
+
|
59 |
+
if (isset($config['fulfilled'])) {
|
60 |
+
$this->onFulfilled = $config['fulfilled'];
|
61 |
+
}
|
62 |
+
|
63 |
+
if (isset($config['rejected'])) {
|
64 |
+
$this->onRejected = $config['rejected'];
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
public function promise()
|
69 |
+
{
|
70 |
+
if ($this->aggregate) {
|
71 |
+
return $this->aggregate;
|
72 |
+
}
|
73 |
+
|
74 |
+
try {
|
75 |
+
$this->createPromise();
|
76 |
+
$this->iterable->rewind();
|
77 |
+
$this->refillPending();
|
78 |
+
} catch (\Throwable $e) {
|
79 |
+
$this->aggregate->reject($e);
|
80 |
+
} catch (\Exception $e) {
|
81 |
+
$this->aggregate->reject($e);
|
82 |
+
}
|
83 |
+
|
84 |
+
return $this->aggregate;
|
85 |
+
}
|
86 |
+
|
87 |
+
private function createPromise()
|
88 |
+
{
|
89 |
+
$this->mutex = false;
|
90 |
+
$this->aggregate = new Promise(function () {
|
91 |
+
reset($this->pending);
|
92 |
+
if (empty($this->pending) && !$this->iterable->valid()) {
|
93 |
+
$this->aggregate->resolve(null);
|
94 |
+
return;
|
95 |
+
}
|
96 |
+
|
97 |
+
// Consume a potentially fluctuating list of promises while
|
98 |
+
// ensuring that indexes are maintained (precluding array_shift).
|
99 |
+
while ($promise = current($this->pending)) {
|
100 |
+
next($this->pending);
|
101 |
+
$promise->wait();
|
102 |
+
if ($this->aggregate->getState() !== PromiseInterface::PENDING) {
|
103 |
+
return;
|
104 |
+
}
|
105 |
+
}
|
106 |
+
});
|
107 |
+
|
108 |
+
// Clear the references when the promise is resolved.
|
109 |
+
$clearFn = function () {
|
110 |
+
$this->iterable = $this->concurrency = $this->pending = null;
|
111 |
+
$this->onFulfilled = $this->onRejected = null;
|
112 |
+
};
|
113 |
+
|
114 |
+
$this->aggregate->then($clearFn, $clearFn);
|
115 |
+
}
|
116 |
+
|
117 |
+
private function refillPending()
|
118 |
+
{
|
119 |
+
if (!$this->concurrency) {
|
120 |
+
// Add all pending promises.
|
121 |
+
while ($this->addPending() && $this->advanceIterator());
|
122 |
+
return;
|
123 |
+
}
|
124 |
+
|
125 |
+
// Add only up to N pending promises.
|
126 |
+
$concurrency = is_callable($this->concurrency)
|
127 |
+
? call_user_func($this->concurrency, count($this->pending))
|
128 |
+
: $this->concurrency;
|
129 |
+
$concurrency = max($concurrency - count($this->pending), 0);
|
130 |
+
// Concurrency may be set to 0 to disallow new promises.
|
131 |
+
if (!$concurrency) {
|
132 |
+
return;
|
133 |
+
}
|
134 |
+
// Add the first pending promise.
|
135 |
+
$this->addPending();
|
136 |
+
// Note this is special handling for concurrency=1 so that we do
|
137 |
+
// not advance the iterator after adding the first promise. This
|
138 |
+
// helps work around issues with generators that might not have the
|
139 |
+
// next value to yield until promise callbacks are called.
|
140 |
+
while (--$concurrency
|
141 |
+
&& $this->advanceIterator()
|
142 |
+
&& $this->addPending());
|
143 |
+
}
|
144 |
+
|
145 |
+
private function addPending()
|
146 |
+
{
|
147 |
+
if (!$this->iterable || !$this->iterable->valid()) {
|
148 |
+
return false;
|
149 |
+
}
|
150 |
+
|
151 |
+
$promise = promise_for($this->iterable->current());
|
152 |
+
$idx = $this->iterable->key();
|
153 |
+
|
154 |
+
$this->pending[$idx] = $promise->then(
|
155 |
+
function ($value) use ($idx) {
|
156 |
+
if ($this->onFulfilled) {
|
157 |
+
call_user_func(
|
158 |
+
$this->onFulfilled, $value, $idx, $this->aggregate
|
159 |
+
);
|
160 |
+
}
|
161 |
+
$this->step($idx);
|
162 |
+
},
|
163 |
+
function ($reason) use ($idx) {
|
164 |
+
if ($this->onRejected) {
|
165 |
+
call_user_func(
|
166 |
+
$this->onRejected, $reason, $idx, $this->aggregate
|
167 |
+
);
|
168 |
+
}
|
169 |
+
$this->step($idx);
|
170 |
+
}
|
171 |
+
);
|
172 |
+
|
173 |
+
return true;
|
174 |
+
}
|
175 |
+
|
176 |
+
private function advanceIterator()
|
177 |
+
{
|
178 |
+
// Place a lock on the iterator so that we ensure to not recurse,
|
179 |
+
// preventing fatal generator errors.
|
180 |
+
if ($this->mutex) {
|
181 |
+
return false;
|
182 |
+
}
|
183 |
+
|
184 |
+
$this->mutex = true;
|
185 |
+
|
186 |
+
try {
|
187 |
+
$this->iterable->next();
|
188 |
+
$this->mutex = false;
|
189 |
+
return true;
|
190 |
+
} catch (\Throwable $e) {
|
191 |
+
$this->aggregate->reject($e);
|
192 |
+
$this->mutex = false;
|
193 |
+
return false;
|
194 |
+
} catch (\Exception $e) {
|
195 |
+
$this->aggregate->reject($e);
|
196 |
+
$this->mutex = false;
|
197 |
+
return false;
|
198 |
+
}
|
199 |
+
}
|
200 |
+
|
201 |
+
private function step($idx)
|
202 |
+
{
|
203 |
+
// If the promise was already resolved, then ignore this step.
|
204 |
+
if ($this->aggregate->getState() !== PromiseInterface::PENDING) {
|
205 |
+
return;
|
206 |
+
}
|
207 |
+
|
208 |
+
unset($this->pending[$idx]);
|
209 |
+
|
210 |
+
// Only refill pending promises if we are not locked, preventing the
|
211 |
+
// EachPromise to recursively invoke the provided iterator, which
|
212 |
+
// cause a fatal error: "Cannot resume an already running generator"
|
213 |
+
if ($this->advanceIterator() && !$this->checkIfFinished()) {
|
214 |
+
// Add more pending promises if possible.
|
215 |
+
$this->refillPending();
|
216 |
+
}
|
217 |
+
}
|
218 |
+
|
219 |
+
private function checkIfFinished()
|
220 |
+
{
|
221 |
+
if (!$this->pending && !$this->iterable->valid()) {
|
222 |
+
// Resolve the promise if there's nothing left to do.
|
223 |
+
$this->aggregate->resolve(null);
|
224 |
+
return true;
|
225 |
+
}
|
226 |
+
|
227 |
+
return false;
|
228 |
+
}
|
229 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/FulfilledPromise.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* A promise that has been fulfilled.
|
6 |
+
*
|
7 |
+
* Thenning off of this promise will invoke the onFulfilled callback
|
8 |
+
* immediately and ignore other callbacks.
|
9 |
+
*/
|
10 |
+
class FulfilledPromise implements PromiseInterface
|
11 |
+
{
|
12 |
+
private $value;
|
13 |
+
|
14 |
+
public function __construct($value)
|
15 |
+
{
|
16 |
+
if (method_exists($value, 'then')) {
|
17 |
+
throw new \InvalidArgumentException(
|
18 |
+
'You cannot create a FulfilledPromise with a promise.');
|
19 |
+
}
|
20 |
+
|
21 |
+
$this->value = $value;
|
22 |
+
}
|
23 |
+
|
24 |
+
public function then(
|
25 |
+
callable $onFulfilled = null,
|
26 |
+
callable $onRejected = null
|
27 |
+
) {
|
28 |
+
// Return itself if there is no onFulfilled function.
|
29 |
+
if (!$onFulfilled) {
|
30 |
+
return $this;
|
31 |
+
}
|
32 |
+
|
33 |
+
$queue = queue();
|
34 |
+
$p = new Promise([$queue, 'run']);
|
35 |
+
$value = $this->value;
|
36 |
+
$queue->add(static function () use ($p, $value, $onFulfilled) {
|
37 |
+
if ($p->getState() === self::PENDING) {
|
38 |
+
try {
|
39 |
+
$p->resolve($onFulfilled($value));
|
40 |
+
} catch (\Throwable $e) {
|
41 |
+
$p->reject($e);
|
42 |
+
} catch (\Exception $e) {
|
43 |
+
$p->reject($e);
|
44 |
+
}
|
45 |
+
}
|
46 |
+
});
|
47 |
+
|
48 |
+
return $p;
|
49 |
+
}
|
50 |
+
|
51 |
+
public function otherwise(callable $onRejected)
|
52 |
+
{
|
53 |
+
return $this->then(null, $onRejected);
|
54 |
+
}
|
55 |
+
|
56 |
+
public function wait($unwrap = true, $defaultDelivery = null)
|
57 |
+
{
|
58 |
+
return $unwrap ? $this->value : null;
|
59 |
+
}
|
60 |
+
|
61 |
+
public function getState()
|
62 |
+
{
|
63 |
+
return self::FULFILLED;
|
64 |
+
}
|
65 |
+
|
66 |
+
public function resolve($value)
|
67 |
+
{
|
68 |
+
if ($value !== $this->value) {
|
69 |
+
throw new \LogicException("Cannot resolve a fulfilled promise");
|
70 |
+
}
|
71 |
+
}
|
72 |
+
|
73 |
+
public function reject($reason)
|
74 |
+
{
|
75 |
+
throw new \LogicException("Cannot reject a fulfilled promise");
|
76 |
+
}
|
77 |
+
|
78 |
+
public function cancel()
|
79 |
+
{
|
80 |
+
// pass
|
81 |
+
}
|
82 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/Promise.php
ADDED
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Promises/A+ implementation that avoids recursion when possible.
|
6 |
+
*
|
7 |
+
* @link https://promisesaplus.com/
|
8 |
+
*/
|
9 |
+
class Promise implements PromiseInterface
|
10 |
+
{
|
11 |
+
private $state = self::PENDING;
|
12 |
+
private $result;
|
13 |
+
private $cancelFn;
|
14 |
+
private $waitFn;
|
15 |
+
private $waitList;
|
16 |
+
private $handlers = [];
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @param callable $waitFn Fn that when invoked resolves the promise.
|
20 |
+
* @param callable $cancelFn Fn that when invoked cancels the promise.
|
21 |
+
*/
|
22 |
+
public function __construct(
|
23 |
+
callable $waitFn = null,
|
24 |
+
callable $cancelFn = null
|
25 |
+
) {
|
26 |
+
$this->waitFn = $waitFn;
|
27 |
+
$this->cancelFn = $cancelFn;
|
28 |
+
}
|
29 |
+
|
30 |
+
public function then(
|
31 |
+
callable $onFulfilled = null,
|
32 |
+
callable $onRejected = null
|
33 |
+
) {
|
34 |
+
if ($this->state === self::PENDING) {
|
35 |
+
$p = new Promise(null, [$this, 'cancel']);
|
36 |
+
$this->handlers[] = [$p, $onFulfilled, $onRejected];
|
37 |
+
$p->waitList = $this->waitList;
|
38 |
+
$p->waitList[] = $this;
|
39 |
+
return $p;
|
40 |
+
}
|
41 |
+
|
42 |
+
// Return a fulfilled promise and immediately invoke any callbacks.
|
43 |
+
if ($this->state === self::FULFILLED) {
|
44 |
+
return $onFulfilled
|
45 |
+
? promise_for($this->result)->then($onFulfilled)
|
46 |
+
: promise_for($this->result);
|
47 |
+
}
|
48 |
+
|
49 |
+
// It's either cancelled or rejected, so return a rejected promise
|
50 |
+
// and immediately invoke any callbacks.
|
51 |
+
$rejection = rejection_for($this->result);
|
52 |
+
return $onRejected ? $rejection->then(null, $onRejected) : $rejection;
|
53 |
+
}
|
54 |
+
|
55 |
+
public function otherwise(callable $onRejected)
|
56 |
+
{
|
57 |
+
return $this->then(null, $onRejected);
|
58 |
+
}
|
59 |
+
|
60 |
+
public function wait($unwrap = true)
|
61 |
+
{
|
62 |
+
$this->waitIfPending();
|
63 |
+
|
64 |
+
$inner = $this->result instanceof PromiseInterface
|
65 |
+
? $this->result->wait($unwrap)
|
66 |
+
: $this->result;
|
67 |
+
|
68 |
+
if ($unwrap) {
|
69 |
+
if ($this->result instanceof PromiseInterface
|
70 |
+
|| $this->state === self::FULFILLED
|
71 |
+
) {
|
72 |
+
return $inner;
|
73 |
+
} else {
|
74 |
+
// It's rejected so "unwrap" and throw an exception.
|
75 |
+
throw exception_for($inner);
|
76 |
+
}
|
77 |
+
}
|
78 |
+
}
|
79 |
+
|
80 |
+
public function getState()
|
81 |
+
{
|
82 |
+
return $this->state;
|
83 |
+
}
|
84 |
+
|
85 |
+
public function cancel()
|
86 |
+
{
|
87 |
+
if ($this->state !== self::PENDING) {
|
88 |
+
return;
|
89 |
+
}
|
90 |
+
|
91 |
+
$this->waitFn = $this->waitList = null;
|
92 |
+
|
93 |
+
if ($this->cancelFn) {
|
94 |
+
$fn = $this->cancelFn;
|
95 |
+
$this->cancelFn = null;
|
96 |
+
try {
|
97 |
+
$fn();
|
98 |
+
} catch (\Throwable $e) {
|
99 |
+
$this->reject($e);
|
100 |
+
} catch (\Exception $e) {
|
101 |
+
$this->reject($e);
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
// Reject the promise only if it wasn't rejected in a then callback.
|
106 |
+
if ($this->state === self::PENDING) {
|
107 |
+
$this->reject(new CancellationException('Promise has been cancelled'));
|
108 |
+
}
|
109 |
+
}
|
110 |
+
|
111 |
+
public function resolve($value)
|
112 |
+
{
|
113 |
+
$this->settle(self::FULFILLED, $value);
|
114 |
+
}
|
115 |
+
|
116 |
+
public function reject($reason)
|
117 |
+
{
|
118 |
+
$this->settle(self::REJECTED, $reason);
|
119 |
+
}
|
120 |
+
|
121 |
+
private function settle($state, $value)
|
122 |
+
{
|
123 |
+
if ($this->state !== self::PENDING) {
|
124 |
+
// Ignore calls with the same resolution.
|
125 |
+
if ($state === $this->state && $value === $this->result) {
|
126 |
+
return;
|
127 |
+
}
|
128 |
+
throw $this->state === $state
|
129 |
+
? new \LogicException("The promise is already {$state}.")
|
130 |
+
: new \LogicException("Cannot change a {$this->state} promise to {$state}");
|
131 |
+
}
|
132 |
+
|
133 |
+
if ($value === $this) {
|
134 |
+
throw new \LogicException('Cannot fulfill or reject a promise with itself');
|
135 |
+
}
|
136 |
+
|
137 |
+
// Clear out the state of the promise but stash the handlers.
|
138 |
+
$this->state = $state;
|
139 |
+
$this->result = $value;
|
140 |
+
$handlers = $this->handlers;
|
141 |
+
$this->handlers = null;
|
142 |
+
$this->waitList = $this->waitFn = null;
|
143 |
+
$this->cancelFn = null;
|
144 |
+
|
145 |
+
if (!$handlers) {
|
146 |
+
return;
|
147 |
+
}
|
148 |
+
|
149 |
+
// If the value was not a settled promise or a thenable, then resolve
|
150 |
+
// it in the task queue using the correct ID.
|
151 |
+
if (!method_exists($value, 'then')) {
|
152 |
+
$id = $state === self::FULFILLED ? 1 : 2;
|
153 |
+
// It's a success, so resolve the handlers in the queue.
|
154 |
+
queue()->add(static function () use ($id, $value, $handlers) {
|
155 |
+
foreach ($handlers as $handler) {
|
156 |
+
self::callHandler($id, $value, $handler);
|
157 |
+
}
|
158 |
+
});
|
159 |
+
} elseif ($value instanceof Promise
|
160 |
+
&& $value->getState() === self::PENDING
|
161 |
+
) {
|
162 |
+
// We can just merge our handlers onto the next promise.
|
163 |
+
$value->handlers = array_merge($value->handlers, $handlers);
|
164 |
+
} else {
|
165 |
+
// Resolve the handlers when the forwarded promise is resolved.
|
166 |
+
$value->then(
|
167 |
+
static function ($value) use ($handlers) {
|
168 |
+
foreach ($handlers as $handler) {
|
169 |
+
self::callHandler(1, $value, $handler);
|
170 |
+
}
|
171 |
+
},
|
172 |
+
static function ($reason) use ($handlers) {
|
173 |
+
foreach ($handlers as $handler) {
|
174 |
+
self::callHandler(2, $reason, $handler);
|
175 |
+
}
|
176 |
+
}
|
177 |
+
);
|
178 |
+
}
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Call a stack of handlers using a specific callback index and value.
|
183 |
+
*
|
184 |
+
* @param int $index 1 (resolve) or 2 (reject).
|
185 |
+
* @param mixed $value Value to pass to the callback.
|
186 |
+
* @param array $handler Array of handler data (promise and callbacks).
|
187 |
+
*
|
188 |
+
* @return array Returns the next group to resolve.
|
189 |
+
*/
|
190 |
+
private static function callHandler($index, $value, array $handler)
|
191 |
+
{
|
192 |
+
/** @var PromiseInterface $promise */
|
193 |
+
$promise = $handler[0];
|
194 |
+
|
195 |
+
// The promise may have been cancelled or resolved before placing
|
196 |
+
// this thunk in the queue.
|
197 |
+
if ($promise->getState() !== self::PENDING) {
|
198 |
+
return;
|
199 |
+
}
|
200 |
+
|
201 |
+
try {
|
202 |
+
if (isset($handler[$index])) {
|
203 |
+
$promise->resolve($handler[$index]($value));
|
204 |
+
} elseif ($index === 1) {
|
205 |
+
// Forward resolution values as-is.
|
206 |
+
$promise->resolve($value);
|
207 |
+
} else {
|
208 |
+
// Forward rejections down the chain.
|
209 |
+
$promise->reject($value);
|
210 |
+
}
|
211 |
+
} catch (\Throwable $reason) {
|
212 |
+
$promise->reject($reason);
|
213 |
+
} catch (\Exception $reason) {
|
214 |
+
$promise->reject($reason);
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
private function waitIfPending()
|
219 |
+
{
|
220 |
+
if ($this->state !== self::PENDING) {
|
221 |
+
return;
|
222 |
+
} elseif ($this->waitFn) {
|
223 |
+
$this->invokeWaitFn();
|
224 |
+
} elseif ($this->waitList) {
|
225 |
+
$this->invokeWaitList();
|
226 |
+
} else {
|
227 |
+
// If there's not wait function, then reject the promise.
|
228 |
+
$this->reject('Cannot wait on a promise that has '
|
229 |
+
. 'no internal wait function. You must provide a wait '
|
230 |
+
. 'function when constructing the promise to be able to '
|
231 |
+
. 'wait on a promise.');
|
232 |
+
}
|
233 |
+
|
234 |
+
queue()->run();
|
235 |
+
|
236 |
+
if ($this->state === self::PENDING) {
|
237 |
+
$this->reject('Invoking the wait callback did not resolve the promise');
|
238 |
+
}
|
239 |
+
}
|
240 |
+
|
241 |
+
private function invokeWaitFn()
|
242 |
+
{
|
243 |
+
try {
|
244 |
+
$wfn = $this->waitFn;
|
245 |
+
$this->waitFn = null;
|
246 |
+
$wfn(true);
|
247 |
+
} catch (\Exception $reason) {
|
248 |
+
if ($this->state === self::PENDING) {
|
249 |
+
// The promise has not been resolved yet, so reject the promise
|
250 |
+
// with the exception.
|
251 |
+
$this->reject($reason);
|
252 |
+
} else {
|
253 |
+
// The promise was already resolved, so there's a problem in
|
254 |
+
// the application.
|
255 |
+
throw $reason;
|
256 |
+
}
|
257 |
+
}
|
258 |
+
}
|
259 |
+
|
260 |
+
private function invokeWaitList()
|
261 |
+
{
|
262 |
+
$waitList = $this->waitList;
|
263 |
+
$this->waitList = null;
|
264 |
+
|
265 |
+
foreach ($waitList as $result) {
|
266 |
+
while (true) {
|
267 |
+
$result->waitIfPending();
|
268 |
+
|
269 |
+
if ($result->result instanceof Promise) {
|
270 |
+
$result = $result->result;
|
271 |
+
} else {
|
272 |
+
if ($result->result instanceof PromiseInterface) {
|
273 |
+
$result->result->wait(false);
|
274 |
+
}
|
275 |
+
break;
|
276 |
+
}
|
277 |
+
}
|
278 |
+
}
|
279 |
+
}
|
280 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/PromiseInterface.php
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* A promise represents the eventual result of an asynchronous operation.
|
6 |
+
*
|
7 |
+
* The primary way of interacting with a promise is through its then method,
|
8 |
+
* which registers callbacks to receive either a promise’s eventual value or
|
9 |
+
* the reason why the promise cannot be fulfilled.
|
10 |
+
*
|
11 |
+
* @link https://promisesaplus.com/
|
12 |
+
*/
|
13 |
+
interface PromiseInterface
|
14 |
+
{
|
15 |
+
const PENDING = 'pending';
|
16 |
+
const FULFILLED = 'fulfilled';
|
17 |
+
const REJECTED = 'rejected';
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Appends fulfillment and rejection handlers to the promise, and returns
|
21 |
+
* a new promise resolving to the return value of the called handler.
|
22 |
+
*
|
23 |
+
* @param callable $onFulfilled Invoked when the promise fulfills.
|
24 |
+
* @param callable $onRejected Invoked when the promise is rejected.
|
25 |
+
*
|
26 |
+
* @return PromiseInterface
|
27 |
+
*/
|
28 |
+
public function then(
|
29 |
+
callable $onFulfilled = null,
|
30 |
+
callable $onRejected = null
|
31 |
+
);
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Appends a rejection handler callback to the promise, and returns a new
|
35 |
+
* promise resolving to the return value of the callback if it is called,
|
36 |
+
* or to its original fulfillment value if the promise is instead
|
37 |
+
* fulfilled.
|
38 |
+
*
|
39 |
+
* @param callable $onRejected Invoked when the promise is rejected.
|
40 |
+
*
|
41 |
+
* @return PromiseInterface
|
42 |
+
*/
|
43 |
+
public function otherwise(callable $onRejected);
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Get the state of the promise ("pending", "rejected", or "fulfilled").
|
47 |
+
*
|
48 |
+
* The three states can be checked against the constants defined on
|
49 |
+
* PromiseInterface: PENDING, FULFILLED, and REJECTED.
|
50 |
+
*
|
51 |
+
* @return string
|
52 |
+
*/
|
53 |
+
public function getState();
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Resolve the promise with the given value.
|
57 |
+
*
|
58 |
+
* @param mixed $value
|
59 |
+
* @throws \RuntimeException if the promise is already resolved.
|
60 |
+
*/
|
61 |
+
public function resolve($value);
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Reject the promise with the given reason.
|
65 |
+
*
|
66 |
+
* @param mixed $reason
|
67 |
+
* @throws \RuntimeException if the promise is already resolved.
|
68 |
+
*/
|
69 |
+
public function reject($reason);
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Cancels the promise if possible.
|
73 |
+
*
|
74 |
+
* @link https://github.com/promises-aplus/cancellation-spec/issues/7
|
75 |
+
*/
|
76 |
+
public function cancel();
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Waits until the promise completes if possible.
|
80 |
+
*
|
81 |
+
* Pass $unwrap as true to unwrap the result of the promise, either
|
82 |
+
* returning the resolved value or throwing the rejected exception.
|
83 |
+
*
|
84 |
+
* If the promise cannot be waited on, then the promise will be rejected.
|
85 |
+
*
|
86 |
+
* @param bool $unwrap
|
87 |
+
*
|
88 |
+
* @return mixed
|
89 |
+
* @throws \LogicException if the promise has no wait function or if the
|
90 |
+
* promise does not settle after waiting.
|
91 |
+
*/
|
92 |
+
public function wait($unwrap = true);
|
93 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/PromisorInterface.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Interface used with classes that return a promise.
|
6 |
+
*/
|
7 |
+
interface PromisorInterface
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* Returns a promise.
|
11 |
+
*
|
12 |
+
* @return PromiseInterface
|
13 |
+
*/
|
14 |
+
public function promise();
|
15 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/RejectedPromise.php
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* A promise that has been rejected.
|
6 |
+
*
|
7 |
+
* Thenning off of this promise will invoke the onRejected callback
|
8 |
+
* immediately and ignore other callbacks.
|
9 |
+
*/
|
10 |
+
class RejectedPromise implements PromiseInterface
|
11 |
+
{
|
12 |
+
private $reason;
|
13 |
+
|
14 |
+
public function __construct($reason)
|
15 |
+
{
|
16 |
+
if (method_exists($reason, 'then')) {
|
17 |
+
throw new \InvalidArgumentException(
|
18 |
+
'You cannot create a RejectedPromise with a promise.');
|
19 |
+
}
|
20 |
+
|
21 |
+
$this->reason = $reason;
|
22 |
+
}
|
23 |
+
|
24 |
+
public function then(
|
25 |
+
callable $onFulfilled = null,
|
26 |
+
callable $onRejected = null
|
27 |
+
) {
|
28 |
+
// If there's no onRejected callback then just return self.
|
29 |
+
if (!$onRejected) {
|
30 |
+
return $this;
|
31 |
+
}
|
32 |
+
|
33 |
+
$queue = queue();
|
34 |
+
$reason = $this->reason;
|
35 |
+
$p = new Promise([$queue, 'run']);
|
36 |
+
$queue->add(static function () use ($p, $reason, $onRejected) {
|
37 |
+
if ($p->getState() === self::PENDING) {
|
38 |
+
try {
|
39 |
+
// Return a resolved promise if onRejected does not throw.
|
40 |
+
$p->resolve($onRejected($reason));
|
41 |
+
} catch (\Throwable $e) {
|
42 |
+
// onRejected threw, so return a rejected promise.
|
43 |
+
$p->reject($e);
|
44 |
+
} catch (\Exception $e) {
|
45 |
+
// onRejected threw, so return a rejected promise.
|
46 |
+
$p->reject($e);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
});
|
50 |
+
|
51 |
+
return $p;
|
52 |
+
}
|
53 |
+
|
54 |
+
public function otherwise(callable $onRejected)
|
55 |
+
{
|
56 |
+
return $this->then(null, $onRejected);
|
57 |
+
}
|
58 |
+
|
59 |
+
public function wait($unwrap = true, $defaultDelivery = null)
|
60 |
+
{
|
61 |
+
if ($unwrap) {
|
62 |
+
throw exception_for($this->reason);
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
public function getState()
|
67 |
+
{
|
68 |
+
return self::REJECTED;
|
69 |
+
}
|
70 |
+
|
71 |
+
public function resolve($value)
|
72 |
+
{
|
73 |
+
throw new \LogicException("Cannot resolve a rejected promise");
|
74 |
+
}
|
75 |
+
|
76 |
+
public function reject($reason)
|
77 |
+
{
|
78 |
+
if ($reason !== $this->reason) {
|
79 |
+
throw new \LogicException("Cannot reject a rejected promise");
|
80 |
+
}
|
81 |
+
}
|
82 |
+
|
83 |
+
public function cancel()
|
84 |
+
{
|
85 |
+
// pass
|
86 |
+
}
|
87 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/RejectionException.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* A special exception that is thrown when waiting on a rejected promise.
|
6 |
+
*
|
7 |
+
* The reason value is available via the getReason() method.
|
8 |
+
*/
|
9 |
+
class RejectionException extends \RuntimeException
|
10 |
+
{
|
11 |
+
/** @var mixed Rejection reason. */
|
12 |
+
private $reason;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @param mixed $reason Rejection reason.
|
16 |
+
* @param string $description Optional description
|
17 |
+
*/
|
18 |
+
public function __construct($reason, $description = null)
|
19 |
+
{
|
20 |
+
$this->reason = $reason;
|
21 |
+
|
22 |
+
$message = 'The promise was rejected';
|
23 |
+
|
24 |
+
if ($description) {
|
25 |
+
$message .= ' with reason: ' . $description;
|
26 |
+
} elseif (is_string($reason)
|
27 |
+
|| (is_object($reason) && method_exists($reason, '__toString'))
|
28 |
+
) {
|
29 |
+
$message .= ' with reason: ' . $this->reason;
|
30 |
+
} elseif ($reason instanceof \JsonSerializable) {
|
31 |
+
$message .= ' with reason: '
|
32 |
+
. json_encode($this->reason, JSON_PRETTY_PRINT);
|
33 |
+
}
|
34 |
+
|
35 |
+
parent::__construct($message);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Returns the rejection reason.
|
40 |
+
*
|
41 |
+
* @return mixed
|
42 |
+
*/
|
43 |
+
public function getReason()
|
44 |
+
{
|
45 |
+
return $this->reason;
|
46 |
+
}
|
47 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/TaskQueue.php
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* A task queue that executes tasks in a FIFO order.
|
6 |
+
*
|
7 |
+
* This task queue class is used to settle promises asynchronously and
|
8 |
+
* maintains a constant stack size. You can use the task queue asynchronously
|
9 |
+
* by calling the `run()` function of the global task queue in an event loop.
|
10 |
+
*
|
11 |
+
* GuzzleHttp\Promise\queue()->run();
|
12 |
+
*/
|
13 |
+
class TaskQueue implements TaskQueueInterface
|
14 |
+
{
|
15 |
+
private $enableShutdown = true;
|
16 |
+
private $queue = [];
|
17 |
+
|
18 |
+
public function __construct($withShutdown = true)
|
19 |
+
{
|
20 |
+
if ($withShutdown) {
|
21 |
+
register_shutdown_function(function () {
|
22 |
+
if ($this->enableShutdown) {
|
23 |
+
// Only run the tasks if an E_ERROR didn't occur.
|
24 |
+
$err = error_get_last();
|
25 |
+
if (!$err || ($err['type'] ^ E_ERROR)) {
|
26 |
+
$this->run();
|
27 |
+
}
|
28 |
+
}
|
29 |
+
});
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
public function isEmpty()
|
34 |
+
{
|
35 |
+
return !$this->queue;
|
36 |
+
}
|
37 |
+
|
38 |
+
public function add(callable $task)
|
39 |
+
{
|
40 |
+
$this->queue[] = $task;
|
41 |
+
}
|
42 |
+
|
43 |
+
public function run()
|
44 |
+
{
|
45 |
+
/** @var callable $task */
|
46 |
+
while ($task = array_shift($this->queue)) {
|
47 |
+
$task();
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* The task queue will be run and exhausted by default when the process
|
53 |
+
* exits IFF the exit is not the result of a PHP E_ERROR error.
|
54 |
+
*
|
55 |
+
* You can disable running the automatic shutdown of the queue by calling
|
56 |
+
* this function. If you disable the task queue shutdown process, then you
|
57 |
+
* MUST either run the task queue (as a result of running your event loop
|
58 |
+
* or manually using the run() method) or wait on each outstanding promise.
|
59 |
+
*
|
60 |
+
* Note: This shutdown will occur before any destructors are triggered.
|
61 |
+
*/
|
62 |
+
public function disableShutdown()
|
63 |
+
{
|
64 |
+
$this->enableShutdown = false;
|
65 |
+
}
|
66 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/TaskQueueInterface.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
interface TaskQueueInterface
|
5 |
+
{
|
6 |
+
/**
|
7 |
+
* Returns true if the queue is empty.
|
8 |
+
*
|
9 |
+
* @return bool
|
10 |
+
*/
|
11 |
+
public function isEmpty();
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Adds a task to the queue that will be executed the next time run is
|
15 |
+
* called.
|
16 |
+
*
|
17 |
+
* @param callable $task
|
18 |
+
*/
|
19 |
+
public function add(callable $task);
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Execute all of the pending task in the queue.
|
23 |
+
*/
|
24 |
+
public function run();
|
25 |
+
}
|
includes/vendor/mailjet/guzzlehttp/promises/src/functions.php
ADDED
@@ -0,0 +1,457 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace GuzzleHttp\Promise;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Get the global task queue used for promise resolution.
|
6 |
+
*
|
7 |
+
* This task queue MUST be run in an event loop in order for promises to be
|
8 |
+
* settled asynchronously. It will be automatically run when synchronously
|
9 |
+
* waiting on a promise.
|
10 |
+
*
|
11 |
+
* <code>
|
12 |
+
* while ($eventLoop->isRunning()) {
|
13 |
+
* GuzzleHttp\Promise\queue()->run();
|
14 |
+
* }
|
15 |
+
* </code>
|
16 |
+
*
|
17 |
+
* @param TaskQueueInterface $assign Optionally specify a new queue instance.
|
18 |
+
*
|
19 |
+
* @return TaskQueueInterface
|
20 |
+
*/
|
21 |
+
function queue(TaskQueueInterface $assign = null)
|
22 |
+
{
|
23 |
+
static $queue;
|
24 |
+
|
25 |
+
if ($assign) {
|
26 |
+
$queue = $assign;
|
27 |
+
} elseif (!$queue) {
|
28 |
+
$queue = new TaskQueue();
|
29 |
+
}
|
30 |
+
|
31 |
+
return $queue;
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Adds a function to run in the task queue when it is next `run()` and returns
|
36 |
+
* a promise that is fulfilled or rejected with the result.
|
37 |
+
*
|
38 |
+
* @param callable $task Task function to run.
|
39 |
+
*
|
40 |
+
* @return PromiseInterface
|
41 |
+
*/
|
42 |
+
function task(callable $task)
|
43 |
+
{
|
44 |
+
$queue = queue();
|
45 |
+
$promise = new Promise([$queue, 'run']);
|
46 |
+
$queue->add(function () use ($task, $promise) {
|
47 |
+
try {
|
48 |
+
$promise->resolve($task());
|
49 |
+
} catch (\Throwable $e) {
|
50 |
+
$promise->reject($e);
|
51 |
+
} catch (\Exception $e) {
|
52 |
+
$promise->reject($e);
|
53 |
+
}
|
54 |
+
});
|
55 |
+
|
56 |
+
return $promise;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Creates a promise for a value if the value is not a promise.
|
61 |
+
*
|
62 |
+
* @param mixed $value Promise or value.
|
63 |
+
*
|
64 |
+
* @return PromiseInterface
|
65 |
+
*/
|
66 |
+
function promise_for($value)
|
67 |
+
{
|
68 |
+
if ($value instanceof PromiseInterface) {
|
69 |
+
return $value;
|
70 |
+
}
|
71 |
+
|
72 |
+
// Return a Guzzle promise that shadows the given promise.
|
73 |
+
if (method_exists($value, 'then')) {
|
74 |
+
$wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;
|
75 |
+
$cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;
|
76 |
+
$promise = new Promise($wfn, $cfn);
|
77 |
+
$value->then([$promise, 'resolve'], [$promise, 'reject']);
|
78 |
+
return $promise;
|
79 |
+
}
|
80 |
+
|
81 |
+
return new FulfilledPromise($value);
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Creates a rejected promise for a reason if the reason is not a promise. If
|
86 |
+
* the provided reason is a promise, then it is returned as-is.
|
87 |
+
*
|
88 |
+
* @param mixed $reason Promise or reason.
|
89 |
+
*
|
90 |
+
* @return PromiseInterface
|
91 |
+
*/
|
92 |
+
function rejection_for($reason)
|
93 |
+
{
|
94 |
+
if ($reason instanceof PromiseInterface) {
|
95 |
+
return $reason;
|
96 |
+
}
|
97 |
+
|
98 |
+
return new RejectedPromise($reason);
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Create an exception for a rejected promise value.
|
103 |
+
*
|
104 |
+
* @param mixed $reason
|
105 |
+
*
|
106 |
+
* @return \Exception|\Throwable
|
107 |
+
*/
|
108 |
+
function exception_for($reason)
|
109 |
+
{
|
110 |
+
return $reason instanceof \Exception || $reason instanceof \Throwable
|
111 |
+
? $reason
|
112 |
+
: new RejectionException($reason);
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Returns an iterator for the given value.
|
117 |
+
*
|
118 |
+
* @param mixed $value
|
119 |
+
*
|
120 |
+
* @return \Iterator
|
121 |
+
*/
|
122 |
+
function iter_for($value)
|
123 |
+
{
|
124 |
+
if ($value instanceof \Iterator) {
|
125 |
+
return $value;
|
126 |
+
} elseif (is_array($value)) {
|
127 |
+
return new \ArrayIterator($value);
|
128 |
+
} else {
|
129 |
+
return new \ArrayIterator([$value]);
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Synchronously waits on a promise to resolve and returns an inspection state
|
135 |
+
* array.
|
136 |
+
*
|
137 |
+
* Returns a state associative array containing a "state" key mapping to a
|
138 |
+
* valid promise state. If the state of the promise is "fulfilled", the array
|
139 |
+
* will contain a "value" key mapping to the fulfilled value of the promise. If
|
140 |
+
* the promise is rejected, the array will contain a "reason" key mapping to
|
141 |
+
* the rejection reason of the promise.
|
142 |
+
*
|
143 |
+
* @param PromiseInterface $promise Promise or value.
|
144 |
+
*
|
145 |
+
* @return array
|
146 |
+
*/
|
147 |
+
function inspect(PromiseInterface $promise)
|
148 |
+
{
|
149 |
+
try {
|
150 |
+
return [
|
151 |
+
'state' => PromiseInterface::FULFILLED,
|
152 |
+
'value' => $promise->wait()
|
153 |
+
];
|
154 |
+
} catch (RejectionException $e) {
|
155 |
+
return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()];
|
156 |
+
} catch (\Throwable $e) {
|
157 |
+
return ['state' => PromiseInterface::REJECTED, 'reason' => $e];
|
158 |
+
} catch (\Exception $e) {
|
159 |
+
return ['state' => PromiseInterface::REJECTED, 'reason' => $e];
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Waits on all of the provided promises, but does not unwrap rejected promises
|
165 |
+
* as thrown exception.
|
166 |
+
*
|
167 |
+
* Returns an array of inspection state arrays.
|
168 |
+
*
|
169 |
+
* @param PromiseInterface[] $promises Traversable of promises to wait upon.
|
170 |
+
*
|
171 |
+
* @return array
|
172 |
+
* @see GuzzleHttp\Promise\inspect for the inspection state array format.
|
173 |
+
*/
|
174 |
+
function inspect_all($promises)
|
175 |
+
{
|
176 |
+
$results = [];
|
177 |
+
foreach ($promises as $key => $promise) {
|
178 |
+
$results[$key] = inspect($promise);
|
179 |
+
}
|
180 |
+
|
181 |
+
return $results;
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Waits on all of the provided promises and returns the fulfilled values.
|
186 |
+
*
|
187 |
+
* Returns an array that contains the value of each promise (in the same order
|
188 |
+
* the promises were provided). An exception is thrown if any of the promises
|
189 |
+
* are rejected.
|
190 |
+
*
|
191 |
+
* @param mixed $promises Iterable of PromiseInterface objects to wait on.
|
192 |
+
*
|
193 |
+
* @return array
|
194 |
+
* @throws \Exception on error
|
195 |
+
* @throws \Throwable on error in PHP >=7
|
196 |
+
*/
|
197 |
+
function unwrap($promises)
|
198 |
+
{
|
199 |
+
$results = [];
|
200 |
+
foreach ($promises as $key => $promise) {
|
201 |
+
$results[$key] = $promise->wait();
|
202 |
+
}
|
203 |
+
|
204 |
+
return $results;
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* Given an array of promises, return a promise that is fulfilled when all the
|
209 |
+
* items in the array are fulfilled.
|
210 |
+
*
|