From 69a887bd893cd0aca73d935a8498e450d0ff7ff4 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Fri, 30 Jul 2021 11:15:29 +0200 Subject: [PATCH 01/23] Initial working version of Pay for order --- assets/js/klarna-checkout-for-woocommerce.js | 108 ++++++++++-------- classes/class-kco-api.php | 4 +- classes/class-kco-gateway.php | 9 +- classes/class-kco-templates.php | 33 +++++- .../class-kco-request-create-recurring.php | 2 +- .../post/class-kco-request-create.php | 2 +- includes/kco-functions.php | 51 ++++++++- templates/klarna-checkout-pay.php | 15 +++ 8 files changed, 163 insertions(+), 61 deletions(-) create mode 100644 templates/klarna-checkout-pay.php diff --git a/assets/js/klarna-checkout-for-woocommerce.js b/assets/js/klarna-checkout-for-woocommerce.js index 34b3aedd..ade59813 100644 --- a/assets/js/klarna-checkout-for-woocommerce.js +++ b/assets/js/klarna-checkout-for-woocommerce.js @@ -41,8 +41,10 @@ jQuery( function( $ ) { $( '#ship-to-different-address-checkbox' ).prop( 'checked', true); } - kco_wc.moveExtraCheckoutFields(); - kco_wc.updateShipping( false ); + if( ! kco_params.pay_for_order ) { + kco_wc.moveExtraCheckoutFields(); + kco_wc.updateShipping( false ); + } }, /** @@ -241,6 +243,7 @@ jQuery( function( $ ) { opacity: 0.6 } }); + var ajax = $.ajax({ type: 'POST', url: kco_params.get_klarna_order_url, @@ -337,6 +340,7 @@ jQuery( function( $ ) { failOrder: function( event, error_message, callback ) { callback({ should_proceed: false }); kco_wc.blocked = false; + var className = kco_params.pay_for_order ? 'div.woocommerce-notices-wrapper' : 'form.checkout'; // Renable the form. $( 'body' ).trigger( 'updated_checkout' ); $( kco_wc.checkoutFormSelector ).removeClass( 'processing' ); @@ -345,12 +349,12 @@ jQuery( function( $ ) { // Print error messages, and trigger checkout_error, and scroll to notices. $( '.woocommerce-NoticeGroup-checkout, .woocommerce-error, .woocommerce-message' ).remove(); - $( 'form.checkout' ).prepend( '
' + error_message + '
' ); // eslint-disable-line max-len - $( 'form.checkout' ).removeClass( 'processing' ).unblock(); - $( 'form.checkout' ).find( '.input-text, select, input:checkbox' ).trigger( 'validate' ).blur(); + $( className ).prepend( '
' + error_message + '
' ); // eslint-disable-line max-len + $( className ).removeClass( 'processing' ).unblock(); + $( className ).find( '.input-text, select, input:checkbox' ).trigger( 'validate' ).blur(); $( document.body ).trigger( 'checkout_error' , [ error_message ] ); $( 'html, body' ).animate( { - scrollTop: ( $( 'form.checkout' ).offset().top - 100 ) + scrollTop: ( $( className ).offset().top - 100 ) }, 1000 ); }, @@ -396,54 +400,56 @@ jQuery( function( $ ) { placeKlarnaOrder: function(callback) { kco_wc.blocked = true; kco_wc.getKlarnaOrder().done( function(response) { - if(response.success) { - console.log( 2 ); - $( '.woocommerce-checkout-review-order-table' ).block({ - message: null, - overlayCSS: { - background: '#fff', - opacity: 0.6 - } - }); - $.ajax({ - type: 'POST', - url: kco_params.submit_order, - data: $('form.checkout').serialize(), - dataType: 'json', - success: function( data ) { - try { - if ( 'success' === data.result ) { - kco_wc.logToFile( 'Successfully placed order. Sending "should_proceed: true" to Klarna' ); - callback({ should_proceed: true }); - } else { - throw 'Result failed'; - } - } catch ( err ) { - if ( data.messages ) { - kco_wc.logToFile( 'Checkout error | ' + data.messages ); - kco_wc.failOrder( 'submission', data.messages, callback ); - } else { - kco_wc.logToFile( 'Checkout error | No message' ); - kco_wc.failOrder( 'submission', '
Checkout error
', callback ); - } - } - }, - error: function( data ) { - try { - kco_wc.logToFile( 'AJAX error | ' + JSON.stringify(data) ); - } catch( e ) { - kco_wc.logToFile( 'AJAX error | Failed to parse error message.' ); - } - kco_wc.failOrder( 'ajax-error', '
Internal Server Error
', callback ) - } - }); + if(response.success ) { + kco_wc.submitOrder() } else { - console.log( 3 ); kco_wc.failOrder( 'get_order', '
' + 'Failed to get the order from Klarna.' + '
', callback ); } }); }, + submitOrder: function(callback) { + $( '.woocommerce-checkout-review-order-table' ).block({ + message: null, + overlayCSS: { + background: '#fff', + opacity: 0.6 + } + }); + $.ajax({ + type: 'POST', + url: kco_params.submit_order, + data: $('form.checkout').serialize(), + dataType: 'json', + success: function( data ) { + try { + if ( 'success' === data.result ) { + kco_wc.logToFile( 'Successfully placed order. Sending "should_proceed: true" to Klarna' ); + callback({ should_proceed: true }); + } else { + throw 'Result failed'; + } + } catch ( err ) { + if ( data.messages ) { + kco_wc.logToFile( 'Checkout error | ' + data.messages ); + kco_wc.failOrder( 'submission', data.messages, callback ); + } else { + kco_wc.logToFile( 'Checkout error | No message' ); + kco_wc.failOrder( 'submission', '
Checkout error
', callback ); + } + } + }, + error: function( data ) { + try { + kco_wc.logToFile( 'AJAX error | ' + JSON.stringify(data) ); + } catch( e ) { + kco_wc.logToFile( 'AJAX error | Failed to parse error message.' ); + } + kco_wc.failOrder( 'ajax-error', '
Internal Server Error
', callback ) + } + }); + }, + /** * Initiates the script. */ @@ -504,7 +510,11 @@ jQuery( function( $ ) { }, 'validation_callback': function( data, callback ) { kco_wc.logToFile( 'validation_callback from Klarna triggered' ); - kco_wc.placeKlarnaOrder(callback); + if( kco_params.pay_for_order ) { + callback({ should_proceed: true }); + } else { + kco_wc.placeKlarnaOrder(callback); + } } }); }); diff --git a/classes/class-kco-api.php b/classes/class-kco-api.php index 81eee368..a01a4c0e 100644 --- a/classes/class-kco-api.php +++ b/classes/class-kco-api.php @@ -20,9 +20,9 @@ class KCO_API { * * @return mixed */ - public function create_klarna_order() { + public function create_klarna_order( $order_id = false ) { $request = new KCO_Request_Create(); - $response = $request->request(); + $response = $request->request( $order_id ); return $this->check_for_api_error( $response ); } diff --git a/classes/class-kco-gateway.php b/classes/class-kco-gateway.php index 1186cd64..c5da809d 100644 --- a/classes/class-kco-gateway.php +++ b/classes/class-kco-gateway.php @@ -228,8 +228,9 @@ public function enqueue_scripts() { return; } + $pay_for_order = false; if ( is_wc_endpoint_url( 'order-pay' ) ) { - return; + $pay_for_order = true; } if ( ! kco_wc_prefill_allowed() ) { @@ -283,6 +284,7 @@ public function enqueue_scripts() { 'timeout_message' => __( 'Please try again, something went wrong with processing your order.', 'klarna-checkout-for-woocommerce' ), 'timeout_time' => apply_filters( 'kco_checkout_timeout_duration', 20 ), 'countries' => kco_get_country_codes(), + 'pay_for_order' => $pay_for_order, ); if ( version_compare( WC_VERSION, '3.9', '>=' ) ) { @@ -291,7 +293,10 @@ public function enqueue_scripts() { wp_localize_script( 'kco', 'kco_params', $checkout_localize_params ); wp_enqueue_script( 'kco' ); - wp_enqueue_style( 'kco' ); + + if ( ! $pay_for_order ) { + wp_enqueue_style( 'kco' ); + } } diff --git a/classes/class-kco-templates.php b/classes/class-kco-templates.php index 01325943..3709d449 100644 --- a/classes/class-kco-templates.php +++ b/classes/class-kco-templates.php @@ -64,7 +64,7 @@ public function override_template( $template, $template_name ) { if ( is_checkout() ) { $confirm = filter_input( INPUT_GET, 'confirm', FILTER_SANITIZE_STRING ); // Don't display KCO template if we have a cart that doesn't needs payment. - if ( apply_filters( 'kco_check_if_needs_payment', true ) ) { + if ( apply_filters( 'kco_check_if_needs_payment', true ) && ! is_wc_endpoint_url( 'order-pay' ) ) { if ( ! WC()->cart->needs_payment() ) { return $template; } @@ -114,6 +114,37 @@ public function override_template( $template, $template_name ) { } } } + + // Klarna Checkout Pay for order. + if ( 'checkout/form-pay.php' === $template_name ) { + global $wp; + $order_id = $wp->query_vars['order-pay']; + $order = wc_get_order( $order_id ); + $available_gateways = WC()->payment_gateways()->get_available_payment_gateways(); + if ( array_key_exists( 'kco', $available_gateways ) ) { + if ( locate_template( 'woocommerce/klarna-checkout-pay.php' ) ) { + $klarna_checkout_template = locate_template( 'woocommerce/paysoncheckout-pay.php' ); + } else { + $klarna_checkout_template = KCO_WC_PLUGIN_PATH . '/templates/klarna-checkout-pay.php'; + } + + if ( 'kco' === $order->get_payment_method() ) { + if ( ! isset( $_GET['confirm'] ) ) { + $template = $klarna_checkout_template; + } + } + + // If chosen payment method does not exist and PCO is the first gateway. + if ( empty( $order->get_payment_method() ) ) { + reset( $available_gateways ); + if ( 'kco' === key( $available_gateways ) ) { + if ( ! isset( $_GET['confirm'] ) ) { + $template = $klarna_checkout_template; + } + } + } + } + } } return $template; diff --git a/classes/requests/checkout/post/class-kco-request-create-recurring.php b/classes/requests/checkout/post/class-kco-request-create-recurring.php index 38ed649f..9e525245 100644 --- a/classes/requests/checkout/post/class-kco-request-create-recurring.php +++ b/classes/requests/checkout/post/class-kco-request-create-recurring.php @@ -20,7 +20,7 @@ class KCO_Request_Create_Recurring extends KCO_Request { * @param string $recurring_token The Klarna recurring token. * @return array */ - public function request( $order_id = null, $recurring_token ) { + public function request( $order_id = null, $recurring_token = null ) { $request_url = $this->get_api_url_base() . 'customer-token/v1/tokens/' . $recurring_token . '/order'; $request_args = apply_filters( 'kco_wc_create_recurring_order', $this->get_request_args( $order_id ) ); $response = wp_remote_request( $request_url, $request_args ); diff --git a/classes/requests/checkout/post/class-kco-request-create.php b/classes/requests/checkout/post/class-kco-request-create.php index 18e5b678..779f3264 100644 --- a/classes/requests/checkout/post/class-kco-request-create.php +++ b/classes/requests/checkout/post/class-kco-request-create.php @@ -46,7 +46,7 @@ public function get_body( $order_id ) { $request_body = array( 'purchase_country' => $this->get_purchase_country(), 'locale' => substr( str_replace( '_', '-', get_locale() ), 0, 5 ), - 'merchant_urls' => KCO_WC()->merchant_urls->get_urls(), + 'merchant_urls' => KCO_WC()->merchant_urls->get_urls( $order_id ), 'billing_countries' => KCO_Request_Countries::get_billing_countries(), 'shipping_countries' => KCO_Request_Countries::get_shipping_countries(), 'merchant_data' => KCO_Request_Merchant_Data::get_merchant_data(), diff --git a/includes/kco-functions.php b/includes/kco-functions.php index 7afd167a..5f8285ae 100644 --- a/includes/kco-functions.php +++ b/includes/kco-functions.php @@ -12,10 +12,9 @@ /** * Gets a Klarna order. Either creates or updates existing order. * - * @param int $order_id The WooCommerce order id. * @return array */ -function kco_create_or_update_order( $order_id = null ) { +function kco_create_or_update_order() { // Need to calculate these here, because WooCommerce hasn't done it yet. WC()->cart->calculate_fees(); WC()->cart->calculate_shipping(); @@ -45,11 +44,53 @@ function kco_create_or_update_order( $order_id = null ) { } } +/** + * Creates or updates a Klarna order for the Pay for order feature. + * + * @return array + */ +function kco_create_or_update_order_pay_for_order() { + global $wp; + $order_id = $wp->query_vars['order-pay']; + + if ( get_post_meta( $order_id, 'kco_order_id' ) ) { // Check if we have an order id. + $klarna_order_id = get_post_meta( $order_id, 'kco_order_id' ); + // Try to update the order, if it fails try to create new order. + $klarna_order = KCO_WC()->api->update_klarna_order( $klarna_order_id, $order_id, true ); + if ( ! $klarna_order ) { + // If update order failed try to create new order. + $klarna_order = KCO_WC()->api->create_klarna_order( $order_id ); + if ( ! $klarna_order ) { + // If failed then bail. + return; + } + update_post_meta( $order_id, 'kco_wc_order_id', $klarna_order['order_id'] ); + return $klarna_order; + } + return $klarna_order; + } else { + // Create new order, since we dont have one. + $klarna_order = KCO_WC()->api->create_klarna_order( $order_id ); + if ( ! $klarna_order ) { + return; + } + update_post_meta( $order_id, 'kco_wc_order_id', $klarna_order['order_id'] ); + return $klarna_order; + } +} + /** * Echoes Klarna Checkout iframe snippet. + * + * @param bool $pay_for_order If this is for a pay for order page or not. + * @return void */ -function kco_wc_show_snippet() { - $klarna_order = kco_create_or_update_order(); +function kco_wc_show_snippet( $pay_for_order = false ) { + if ( $pay_for_order ) { + $klarna_order = kco_create_or_update_order_pay_for_order(); + } else { + $klarna_order = kco_create_or_update_order(); + } do_action( 'kco_wc_show_snippet', $klarna_order ); echo $klarna_order['html_snippet']; // phpcs:ignore WordPress -- Can not escape this, since its the iframe snippet. } @@ -482,7 +523,7 @@ function kco_unset_sessions() { * @param string $klarna_order_id The Klarna Order id. * @return void */ -function kco_confirm_klarna_order( $order_id = null, $klarna_order_id ) { +function kco_confirm_klarna_order( $order_id = null, $klarna_order_id = null ) { if ( $order_id ) { $order = wc_get_order( $order_id ); // If the order is already completed, return. diff --git a/templates/klarna-checkout-pay.php b/templates/klarna-checkout-pay.php new file mode 100644 index 00000000..8f59004a --- /dev/null +++ b/templates/klarna-checkout-pay.php @@ -0,0 +1,15 @@ + +
+ + + +
From 05695e6caba25bb7aac4217ebd2aa97a45af3d7d Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 2 Aug 2021 08:26:27 +0200 Subject: [PATCH 02/23] Update klarna-checkout-for-woocommerce.min.js --- assets/js/klarna-checkout-for-woocommerce.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/klarna-checkout-for-woocommerce.min.js b/assets/js/klarna-checkout-for-woocommerce.min.js index ebabff50..3e7486d2 100644 --- a/assets/js/klarna-checkout-for-woocommerce.min.js +++ b/assets/js/klarna-checkout-for-woocommerce.min.js @@ -1 +1 @@ -jQuery(function(a){if("undefined"==typeof kco_params)return!1;var r={bodyEl:a("body"),checkoutFormSelector:a("form.checkout"),paymentMethodEl:a('input[name="payment_method"]'),paymentMethod:"",selectAnotherSelector:"#klarna-checkout-select-other",shippingUpdated:!1,blocked:!1,preventPaymentMethodChange:!1,timeout:null,interval:null,klarnaUpdateNeeded:!1,documentReady:function(){r.log(kco_params),0'+o+""),a("form.checkout").removeClass("processing").unblock(),a("form.checkout").find(".input-text, select, input:checkbox").trigger("validate").blur(),a(document.body).trigger("checkout_error",[o]),a("html, body").animate({scrollTop:a("form.checkout").offset().top-100},1e3)},logToFile:function(e){a.ajax({url:kco_params.log_to_file_url,type:"POST",dataType:"json",data:{message:e,nonce:kco_params.log_to_file_nonce}})},log:function(e){kco_params.logging&&console.log(e)},updateShipping:function(e){r.kcoSuspend(!0),a("#kco_shipping_data").val(JSON.stringify(e)),a("body").trigger("kco_shipping_option_changed",[e]),a("body").trigger("update_checkout")},convertCountry:function(o){return Object.keys(kco_params.countries).find(e=>kco_params.countries[e]===o)},placeKlarnaOrder:function(n){r.blocked=!0,r.getKlarnaOrder().done(function(e){e.success?(console.log(2),a(".woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),a.ajax({type:"POST",url:kco_params.submit_order,data:a("form.checkout").serialize(),dataType:"json",success:function(o){try{if("success"!==o.result)throw"Result failed";r.logToFile('Successfully placed order. Sending "should_proceed: true" to Klarna'),n({should_proceed:!0})}catch(e){o.messages?(r.logToFile("Checkout error | "+o.messages),r.failOrder("submission",o.messages,n)):(r.logToFile("Checkout error | No message"),r.failOrder("submission",'
Checkout error
',n))}},error:function(e){try{r.logToFile("AJAX error | "+JSON.stringify(e))}catch(e){r.logToFile("AJAX error | Failed to parse error message.")}r.failOrder("ajax-error",'
Internal Server Error
',n)}})):(console.log(3),r.failOrder("get_order",'
Failed to get the order from Klarna.
',n))})},init:function(){a(document).ready(r.documentReady),r.bodyEl.on("update_checkout",function(){r.kcoSuspend(!0)}),r.bodyEl.on("updated_checkout",r.kcoResume),r.bodyEl.on("updated_checkout",r.maybeDisplayShippingPrice),r.bodyEl.on("change","input.qty",r.updateCart),r.bodyEl.on("change",'input[name="payment_method"]',r.maybeChangeToKco),r.bodyEl.on("click",r.selectAnotherSelector,r.changeFromKco),"function"==typeof window._klarnaCheckout&&window._klarnaCheckout(function(e){e.on({shipping_address_change:function(e){r.log("shipping_address_change"),r.log(e);var o=r.convertCountry(e.country.toUpperCase());0<=a("#shipping_first_name").length?(a("#ship-to-different-address-checkbox").prop("checked",!0),a("#ship-to-different-address-checkbox").change(),a("#ship-to-different-address-checkbox").blur(),a("#shipping_first_name").val("given_name"in e?e.given_name:""),a("#shipping_last_name").val("family_name"in e?e.family_name:""),a("#shipping_postcode").val("postal_code"in e?e.postal_code:""),a("#shipping_country").val("country"in e?o:""),a("#shipping_country").change()):(a("#billing_first_name").val("given_name"in e?e.given_name:""),a("#billing_last_name").val("family_name"in e?e.family_name:""),a("#billing_postcode").val("postal_code"in e?e.postal_code:""),a("#billing_country").val("country"in e?o:""),a("#billing_email").val("email"in e?e.email:""),a("#billing_country").change(),a("#billing_email").change(),a("#billing_email").blur()),a("form.checkout").trigger("update_checkout")},change:function(e){r.log("change",e)},order_total_change:function(e){r.log("order_total_change",e)},shipping_option_change:function(e){r.log("shipping_option_change",e),r.log(e),r.updateShipping(e)},can_not_complete_order:function(e){r.log("can_not_complete_order",e)},validation_callback:function(e,o){r.logToFile("validation_callback from Klarna triggered"),r.placeKlarnaOrder(o)}})})}};r.init()}); \ No newline at end of file +jQuery(function(a){if("undefined"==typeof kco_params)return!1;var r={bodyEl:a("body"),checkoutFormSelector:a("form.checkout"),paymentMethodEl:a('input[name="payment_method"]'),paymentMethod:"",selectAnotherSelector:"#klarna-checkout-select-other",shippingUpdated:!1,blocked:!1,preventPaymentMethodChange:!1,timeout:null,interval:null,klarnaUpdateNeeded:!1,documentReady:function(){r.log(kco_params),0'+o+""),a(n).removeClass("processing").unblock(),a(n).find(".input-text, select, input:checkbox").trigger("validate").blur(),a(document.body).trigger("checkout_error",[o]),a("html, body").animate({scrollTop:a(n).offset().top-100},1e3)},logToFile:function(e){a.ajax({url:kco_params.log_to_file_url,type:"POST",dataType:"json",data:{message:e,nonce:kco_params.log_to_file_nonce}})},log:function(e){kco_params.logging&&console.log(e)},updateShipping:function(e){r.kcoSuspend(!0),a("#kco_shipping_data").val(JSON.stringify(e)),a("body").trigger("kco_shipping_option_changed",[e]),a("body").trigger("update_checkout")},convertCountry:function(o){return Object.keys(kco_params.countries).find(e=>kco_params.countries[e]===o)},placeKlarnaOrder:function(o){r.blocked=!0,r.getKlarnaOrder().done(function(e){e.success?r.submitOrder():r.failOrder("get_order",'
Failed to get the order from Klarna.
',o)})},submitOrder:function(n){a(".woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),a.ajax({type:"POST",url:kco_params.submit_order,data:a("form.checkout").serialize(),dataType:"json",success:function(o){try{if("success"!==o.result)throw"Result failed";r.logToFile('Successfully placed order. Sending "should_proceed: true" to Klarna'),n({should_proceed:!0})}catch(e){o.messages?(r.logToFile("Checkout error | "+o.messages),r.failOrder("submission",o.messages,n)):(r.logToFile("Checkout error | No message"),r.failOrder("submission",'
Checkout error
',n))}},error:function(e){try{r.logToFile("AJAX error | "+JSON.stringify(e))}catch(e){r.logToFile("AJAX error | Failed to parse error message.")}r.failOrder("ajax-error",'
Internal Server Error
',n)}})},init:function(){a(document).ready(r.documentReady),r.bodyEl.on("update_checkout",function(){r.kcoSuspend(!0)}),r.bodyEl.on("updated_checkout",r.kcoResume),r.bodyEl.on("updated_checkout",r.maybeDisplayShippingPrice),r.bodyEl.on("change","input.qty",r.updateCart),r.bodyEl.on("change",'input[name="payment_method"]',r.maybeChangeToKco),r.bodyEl.on("click",r.selectAnotherSelector,r.changeFromKco),"function"==typeof window._klarnaCheckout&&window._klarnaCheckout(function(e){e.on({shipping_address_change:function(e){r.log("shipping_address_change"),r.log(e);var o=r.convertCountry(e.country.toUpperCase());0<=a("#shipping_first_name").length?(a("#ship-to-different-address-checkbox").prop("checked",!0),a("#ship-to-different-address-checkbox").change(),a("#ship-to-different-address-checkbox").blur(),a("#shipping_first_name").val("given_name"in e?e.given_name:""),a("#shipping_last_name").val("family_name"in e?e.family_name:""),a("#shipping_postcode").val("postal_code"in e?e.postal_code:""),a("#shipping_country").val("country"in e?o:""),a("#shipping_country").change()):(a("#billing_first_name").val("given_name"in e?e.given_name:""),a("#billing_last_name").val("family_name"in e?e.family_name:""),a("#billing_postcode").val("postal_code"in e?e.postal_code:""),a("#billing_country").val("country"in e?o:""),a("#billing_email").val("email"in e?e.email:""),a("#billing_country").change(),a("#billing_email").change(),a("#billing_email").blur()),a("form.checkout").trigger("update_checkout")},change:function(e){r.log("change",e)},order_total_change:function(e){r.log("order_total_change",e)},shipping_option_change:function(e){r.log("shipping_option_change",e),r.log(e),r.updateShipping(e)},can_not_complete_order:function(e){r.log("can_not_complete_order",e)},validation_callback:function(e,o){r.logToFile("validation_callback from Klarna triggered"),kco_params.pay_for_order?o({should_proceed:!0}):r.placeKlarnaOrder(o)}})})}};r.init()}); \ No newline at end of file From e530659db3bd57be65523ccaf6ec24d8d0142617 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Thu, 5 Aug 2021 09:39:04 +0200 Subject: [PATCH 03/23] PHP 8 fixes --- classes/class-kco-subscription.php | 4 ++-- languages/klarna-checkout-for-woocommerce.pot | 22 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/classes/class-kco-subscription.php b/classes/class-kco-subscription.php index 78f0c8fc..e5b2a80f 100644 --- a/classes/class-kco-subscription.php +++ b/classes/class-kco-subscription.php @@ -202,7 +202,7 @@ public function set_recurring( $request_args ) { * @param array $klarna_order The Klarna order. * @return void */ - public function set_recurring_token_for_order( $order_id = null, $klarna_order ) { + public function set_recurring_token_for_order( $order_id = null, $klarna_order = null ) { $wc_order = wc_get_order( $order_id ); if ( class_exists( 'WC_Subscription' ) && ( wcs_order_contains_subscription( $wc_order, array( 'parent', 'renewal', 'resubscribe', 'switch' ) ) || wcs_is_subscription( $wc_order ) ) ) { $subscriptions = wcs_get_subscriptions_for_order( $order_id ); @@ -235,7 +235,7 @@ public function set_recurring_token_for_order( $order_id = null, $klarna_order ) * @param array $klarna_order The Klarna order. * @return void */ - public function set_recurring_token_for_subscription( $subscription_id = null, $klarna_order ) { + public function set_recurring_token_for_subscription( $subscription_id = null, $klarna_order = null ) { if ( isset( $klarna_order['recurring_token'] ) ) { $recurring_token = $klarna_order['recurring_token']; update_post_meta( $subscription_id, '_kco_recurring_token', $recurring_token ); diff --git a/languages/klarna-checkout-for-woocommerce.pot b/languages/klarna-checkout-for-woocommerce.pot index a365c0f7..9fb0e417 100644 --- a/languages/klarna-checkout-for-woocommerce.pot +++ b/languages/klarna-checkout-for-woocommerce.pot @@ -79,7 +79,7 @@ msgid "There was an error installing the addon. Please try again." msgstr "" #. translators: Klarna order ID. -#: ../classes/class-kco-api-callbacks.php:110, ../includes/kco-functions.php:522 +#: ../classes/class-kco-api-callbacks.php:110, ../includes/kco-functions.php:563 msgid "Klarna order is under review, order ID: %s." msgstr "" @@ -87,7 +87,7 @@ msgstr "" msgid "Klarna Checkout order was rejected." msgstr "" -#: ../classes/class-kco-api-callbacks.php:104, ../includes/kco-functions.php:514 +#: ../classes/class-kco-api-callbacks.php:104, ../includes/kco-functions.php:555 msgid "Payment via Klarna Checkout, order ID: %s" msgstr "" @@ -456,23 +456,23 @@ msgstr "" msgid "The current Klarna Checkout replaces standard WooCommerce checkout page." msgstr "" -#: ../classes/class-kco-gateway.php:280 +#: ../classes/class-kco-gateway.php:281 msgid "Please fill in all required checkout fields." msgstr "" -#: ../classes/class-kco-gateway.php:283 +#: ../classes/class-kco-gateway.php:284 msgid "Please try again, something went wrong with processing your order." msgstr "" -#: ../classes/class-kco-gateway.php:508 +#: ../classes/class-kco-gateway.php:513 msgid "Order address should not be changed and any changes you make will not be reflected in Klarna system." msgstr "" -#: ../classes/class-kco-gateway.php:567 +#: ../classes/class-kco-gateway.php:572 msgid "Organisation number:" msgstr "" -#: ../classes/class-kco-gateway.php:588, ../classes/class-kco-gateway.php:609 +#: ../classes/class-kco-gateway.php:593, ../classes/class-kco-gateway.php:614 msgid "Reference:" msgstr "" @@ -513,7 +513,7 @@ msgstr "" msgid "Thank you, your subscription payment method is now updated." msgstr "" -#: ../classes/class-kco-templates.php:148 +#: ../classes/class-kco-templates.php:179 msgid "Failed to load Klarna Checkout template file." msgstr "" @@ -537,15 +537,15 @@ msgstr "" msgid "Shipping" msgstr "" -#: ../includes/kco-functions.php:77 +#: ../includes/kco-functions.php:118 msgid "Select another payment method" msgstr "" -#: ../includes/kco-functions.php:533 +#: ../includes/kco-functions.php:574 msgid "Waiting for verification from Klarnas push notification" msgstr "" -#: ../includes/kco-functions.php:528 +#: ../includes/kco-functions.php:569 msgid "Klarna Checkout order was rejected" msgstr "" From 3fd8b989af789a5a9afc02cac4de7b272ef5a91a Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Thu, 5 Aug 2021 09:39:17 +0200 Subject: [PATCH 04/23] Minor changes to JS --- assets/js/klarna-checkout-for-woocommerce.js | 82 +++++++++---------- .../js/klarna-checkout-for-woocommerce.min.js | 2 +- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/assets/js/klarna-checkout-for-woocommerce.js b/assets/js/klarna-checkout-for-woocommerce.js index ade59813..c900cd6a 100644 --- a/assets/js/klarna-checkout-for-woocommerce.js +++ b/assets/js/klarna-checkout-for-woocommerce.js @@ -401,51 +401,47 @@ jQuery( function( $ ) { kco_wc.blocked = true; kco_wc.getKlarnaOrder().done( function(response) { if(response.success ) { - kco_wc.submitOrder() - } else { - kco_wc.failOrder( 'get_order', '
' + 'Failed to get the order from Klarna.' + '
', callback ); - } - }); - }, - - submitOrder: function(callback) { - $( '.woocommerce-checkout-review-order-table' ).block({ - message: null, - overlayCSS: { - background: '#fff', - opacity: 0.6 - } - }); - $.ajax({ - type: 'POST', - url: kco_params.submit_order, - data: $('form.checkout').serialize(), - dataType: 'json', - success: function( data ) { - try { - if ( 'success' === data.result ) { - kco_wc.logToFile( 'Successfully placed order. Sending "should_proceed: true" to Klarna' ); - callback({ should_proceed: true }); - } else { - throw 'Result failed'; + $( '.woocommerce-checkout-review-order-table' ).block({ + message: null, + overlayCSS: { + background: '#fff', + opacity: 0.6 } - } catch ( err ) { - if ( data.messages ) { - kco_wc.logToFile( 'Checkout error | ' + data.messages ); - kco_wc.failOrder( 'submission', data.messages, callback ); - } else { - kco_wc.logToFile( 'Checkout error | No message' ); - kco_wc.failOrder( 'submission', '
Checkout error
', callback ); + }); + $.ajax({ + type: 'POST', + url: kco_params.submit_order, + data: $('form.checkout').serialize(), + dataType: 'json', + success: function( data ) { + try { + if ( 'success' === data.result ) { + kco_wc.logToFile( 'Successfully placed order. Sending "should_proceed: true" to Klarna' ); + callback({ should_proceed: true }); + } else { + throw 'Result failed'; + } + } catch ( err ) { + if ( data.messages ) { + kco_wc.logToFile( 'Checkout error | ' + data.messages ); + kco_wc.failOrder( 'submission', data.messages, callback ); + } else { + kco_wc.logToFile( 'Checkout error | No message' ); + kco_wc.failOrder( 'submission', '
Checkout error
', callback ); + } + } + }, + error: function( data ) { + try { + kco_wc.logToFile( 'AJAX error | ' + JSON.stringify(data) ); + } catch( e ) { + kco_wc.logToFile( 'AJAX error | Failed to parse error message.' ); + } + kco_wc.failOrder( 'ajax-error', '
Internal Server Error
', callback ) } - } - }, - error: function( data ) { - try { - kco_wc.logToFile( 'AJAX error | ' + JSON.stringify(data) ); - } catch( e ) { - kco_wc.logToFile( 'AJAX error | Failed to parse error message.' ); - } - kco_wc.failOrder( 'ajax-error', '
Internal Server Error
', callback ) + }); + } else { + kco_wc.failOrder( 'get_order', '
' + 'Failed to get the order from Klarna.' + '
', callback ); } }); }, diff --git a/assets/js/klarna-checkout-for-woocommerce.min.js b/assets/js/klarna-checkout-for-woocommerce.min.js index 1878b84c..d062c3be 100644 --- a/assets/js/klarna-checkout-for-woocommerce.min.js +++ b/assets/js/klarna-checkout-for-woocommerce.min.js @@ -1 +1 @@ -jQuery(function(a){if("undefined"==typeof kco_params)return!1;var r={bodyEl:a("body"),checkoutFormSelector:a("form.checkout"),paymentMethodEl:a('input[name="payment_method"]'),paymentMethod:"",selectAnotherSelector:"#klarna-checkout-select-other",shippingUpdated:!1,blocked:!1,preventPaymentMethodChange:!1,timeout:null,interval:null,klarnaUpdateNeeded:!1,documentReady:function(){r.log(kco_params),0'+o+""),a(n).removeClass("processing").unblock(),a(n).find(".input-text, select, input:checkbox").trigger("validate").blur(),a(document.body).trigger("checkout_error",[o]),a("html, body").animate({scrollTop:a(n).offset().top-100},1e3)},logToFile:function(e){a.ajax({url:kco_params.log_to_file_url,type:"POST",dataType:"json",data:{message:e,nonce:kco_params.log_to_file_nonce}})},log:function(e){kco_params.logging&&console.log(e)},updateShipping:function(e){r.kcoSuspend(!0),a("#kco_shipping_data").val(JSON.stringify(e)),a("body").trigger("kco_shipping_option_changed",[e]),a("body").trigger("update_checkout")},convertCountry:function(o){return Object.keys(kco_params.countries).find(e=>kco_params.countries[e]===o)},placeKlarnaOrder:function(o){r.blocked=!0,r.getKlarnaOrder().done(function(e){e.success?r.submitOrder():r.failOrder("get_order",'
Failed to get the order from Klarna.
',o)})},submitOrder:function(n){a(".woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),a.ajax({type:"POST",url:kco_params.submit_order,data:a("form.checkout").serialize(),dataType:"json",success:function(o){try{if("success"!==o.result)throw"Result failed";r.logToFile('Successfully placed order. Sending "should_proceed: true" to Klarna'),n({should_proceed:!0})}catch(e){o.messages?(r.logToFile("Checkout error | "+o.messages),r.failOrder("submission",o.messages,n)):(r.logToFile("Checkout error | No message"),r.failOrder("submission",'
Checkout error
',n))}},error:function(e){try{r.logToFile("AJAX error | "+JSON.stringify(e))}catch(e){r.logToFile("AJAX error | Failed to parse error message.")}r.failOrder("ajax-error",'
Internal Server Error
',n)}})},init:function(){a(document).ready(r.documentReady),r.bodyEl.on("update_checkout",function(){r.kcoSuspend(!0)}),r.bodyEl.on("updated_checkout",r.kcoResume),r.bodyEl.on("updated_checkout",r.maybeDisplayShippingPrice),r.bodyEl.on("change","input.qty",r.updateCart),r.bodyEl.on("change",'input[name="payment_method"]',r.maybeChangeToKco),r.bodyEl.on("click",r.selectAnotherSelector,r.changeFromKco),"function"==typeof window._klarnaCheckout&&window._klarnaCheckout(function(e){e.on({shipping_address_change:function(e){r.log("shipping_address_change"),r.log(e);var o=r.convertCountry(e.country.toUpperCase());0<=a("#shipping_first_name").length?(a("#ship-to-different-address-checkbox").prop("checked",!0),a("#ship-to-different-address-checkbox").change(),a("#ship-to-different-address-checkbox").blur(),a("#shipping_first_name").val("given_name"in e?e.given_name:""),a("#shipping_last_name").val("family_name"in e?e.family_name:""),a("#shipping_postcode").val("postal_code"in e?e.postal_code:""),a("#shipping_country").val("country"in e?o:""),a("#shipping_country").change()):(a("#billing_first_name").val("given_name"in e?e.given_name:""),a("#billing_last_name").val("family_name"in e?e.family_name:""),a("#billing_postcode").val("postal_code"in e?e.postal_code:""),a("#billing_country").val("country"in e?o:""),a("#billing_email").val("email"in e?e.email:""),a("#billing_country").change(),a("#billing_email").change(),a("#billing_email").blur()),a("form.checkout").trigger("update_checkout")},change:function(e){r.log("change",e)},order_total_change:function(e){r.log("order_total_change",e)},shipping_option_change:function(e){r.log("shipping_option_change",e),r.log(e),r.updateShipping(e)},can_not_complete_order:function(e){r.log("can_not_complete_order",e)},validation_callback:function(e,o){r.logToFile("validation_callback from Klarna triggered"),kco_params.pay_for_order?o({should_proceed:!0}):r.placeKlarnaOrder(o)}})})}};r.init()}); +jQuery(function(a){if("undefined"==typeof kco_params)return!1;var r={bodyEl:a("body"),checkoutFormSelector:a("form.checkout"),paymentMethodEl:a('input[name="payment_method"]'),paymentMethod:"",selectAnotherSelector:"#klarna-checkout-select-other",shippingUpdated:!1,blocked:!1,preventPaymentMethodChange:!1,timeout:null,interval:null,klarnaUpdateNeeded:!1,documentReady:function(){r.log(kco_params),0'+o+""),a(n).removeClass("processing").unblock(),a(n).find(".input-text, select, input:checkbox").trigger("validate").blur(),a(document.body).trigger("checkout_error",[o]),a("html, body").animate({scrollTop:a(n).offset().top-100},1e3)},logToFile:function(e){a.ajax({url:kco_params.log_to_file_url,type:"POST",dataType:"json",data:{message:e,nonce:kco_params.log_to_file_nonce}})},log:function(e){kco_params.logging&&console.log(e)},updateShipping:function(e){r.kcoSuspend(!0),a("#kco_shipping_data").val(JSON.stringify(e)),a("body").trigger("kco_shipping_option_changed",[e]),a("body").trigger("update_checkout")},convertCountry:function(o){return Object.keys(kco_params.countries).find(e=>kco_params.countries[e]===o)},placeKlarnaOrder:function(n){r.blocked=!0,r.getKlarnaOrder().done(function(e){e.success?(a(".woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),a.ajax({type:"POST",url:kco_params.submit_order,data:a("form.checkout").serialize(),dataType:"json",success:function(o){try{if("success"!==o.result)throw"Result failed";r.logToFile('Successfully placed order. Sending "should_proceed: true" to Klarna'),n({should_proceed:!0})}catch(e){o.messages?(r.logToFile("Checkout error | "+o.messages),r.failOrder("submission",o.messages,n)):(r.logToFile("Checkout error | No message"),r.failOrder("submission",'
Checkout error
',n))}},error:function(e){try{r.logToFile("AJAX error | "+JSON.stringify(e))}catch(e){r.logToFile("AJAX error | Failed to parse error message.")}r.failOrder("ajax-error",'
Internal Server Error
',n)}})):r.failOrder("get_order",'
Failed to get the order from Klarna.
',n)})},init:function(){a(document).ready(r.documentReady),r.bodyEl.on("update_checkout",function(){r.kcoSuspend(!0)}),r.bodyEl.on("updated_checkout",r.kcoResume),r.bodyEl.on("updated_checkout",r.maybeDisplayShippingPrice),r.bodyEl.on("change","input.qty",r.updateCart),r.bodyEl.on("change",'input[name="payment_method"]',r.maybeChangeToKco),r.bodyEl.on("click",r.selectAnotherSelector,r.changeFromKco),"function"==typeof window._klarnaCheckout&&window._klarnaCheckout(function(e){e.on({shipping_address_change:function(e){r.log("shipping_address_change"),r.log(e);var o=r.convertCountry(e.country.toUpperCase());0<=a("#shipping_first_name").length?(a("#ship-to-different-address-checkbox").prop("checked",!0),a("#ship-to-different-address-checkbox").change(),a("#ship-to-different-address-checkbox").blur(),a("#shipping_first_name").val("given_name"in e?e.given_name:""),a("#shipping_last_name").val("family_name"in e?e.family_name:""),a("#shipping_postcode").val("postal_code"in e?e.postal_code:""),a("#shipping_country").val("country"in e?o:""),a("#shipping_country").change()):(a("#billing_first_name").val("given_name"in e?e.given_name:""),a("#billing_last_name").val("family_name"in e?e.family_name:""),a("#billing_postcode").val("postal_code"in e?e.postal_code:""),a("#billing_country").val("country"in e?o:""),a("#billing_email").val("email"in e?e.email:""),a("#billing_country").change(),a("#billing_email").change(),a("#billing_email").blur()),a("form.checkout").trigger("update_checkout")},change:function(e){r.log("change",e)},order_total_change:function(e){r.log("order_total_change",e)},shipping_option_change:function(e){r.log("shipping_option_change",e),r.log(e),r.updateShipping(e)},can_not_complete_order:function(e){r.log("can_not_complete_order",e)},validation_callback:function(e,o){r.logToFile("validation_callback from Klarna triggered"),kco_params.pay_for_order?o({should_proceed:!0}):r.placeKlarnaOrder(o)}})})}};r.init()}); \ No newline at end of file From ecd66f14d9f3ac84e57589e11551caf4743718ac Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Sat, 14 Aug 2021 13:07:32 +0200 Subject: [PATCH 05/23] Initial commit of e2e changes --- .github/workflows/e2e_tests.yml | 3 + tests/e2e/.env | 25 + tests/e2e/.gitignore | 3 - tests/e2e/api/API.js | 4 +- tests/e2e/api/index.js | 8 +- tests/e2e/api/setup.js | 161 + tests/e2e/api/woocommerce.js | 69 + tests/e2e/bin/.gitignore | 1 - tests/e2e/bin/data.sql | 641 ++ tests/e2e/config/.gitignore | 1 - tests/e2e/config/config.data.json | 133 + tests/e2e/config/config.js | 5 +- tests/e2e/config/data.json | 46 + tests/e2e/config/tests.json | 7 + tests/e2e/helpers/kcoCart.js | 23 +- tests/e2e/helpers/kcoFrame.js | 37 +- tests/e2e/helpers/kcoTestRunner.js | 28 + tests/e2e/helpers/kcoURLS.js | 9 + tests/e2e/helpers/kcoUtils.js | 12 +- tests/e2e/package-lock.json | 8929 +++++++++++++++++ tests/e2e/package.json | 3 +- ...oFlow.spec.js => kcoFlow.specasdasdasd.js} | 19 +- tests/e2e/tests/kcoTest.spec.js | 671 ++ 23 files changed, 10788 insertions(+), 50 deletions(-) create mode 100644 tests/e2e/.env create mode 100644 tests/e2e/api/setup.js delete mode 100644 tests/e2e/bin/.gitignore create mode 100644 tests/e2e/bin/data.sql delete mode 100644 tests/e2e/config/.gitignore create mode 100644 tests/e2e/config/config.data.json create mode 100644 tests/e2e/config/data.json create mode 100644 tests/e2e/config/tests.json create mode 100644 tests/e2e/helpers/kcoTestRunner.js create mode 100644 tests/e2e/package-lock.json rename tests/e2e/tests/{kcoFlow.spec.js => kcoFlow.specasdasdasd.js} (98%) create mode 100644 tests/e2e/tests/kcoTest.spec.js diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml index 40b7dc70..628c4d07 100644 --- a/.github/workflows/e2e_tests.yml +++ b/.github/workflows/e2e_tests.yml @@ -7,6 +7,9 @@ jobs: build: name: Run tests runs-on: ubuntu-latest + env: + API_KEY: ${{secrets.E2E_API_KEY}} + API_SECRET: ${{secrets.E2E_API_SECRET}} steps: - uses: convictional/trigger-workflow-and-wait@v1.3.0 with: diff --git a/tests/e2e/.env b/tests/e2e/.env new file mode 100644 index 00000000..cb098694 --- /dev/null +++ b/tests/e2e/.env @@ -0,0 +1,25 @@ +WP_VERSION=latest +PLUGIN_NAME="klarna-checkout-for-woocommerce" +#CLI +WC_VERSION=5.1.0 +WP_SITE_TITLE="Klarna Checkout" +WP_ADMIN_PASS="password" +WP_ADMIN_USER="admin" +#MYSQL +MYSQL_DATABASE=testdb +MYSQL_USER=wordpress +MYSQL_PASSWORD=wordpress +MYSQL_RANDOM_ROOT_PASSWORD= '1' +#WP +WORDPRESS_DB_HOST=db +WORDPRESS_DB_NAME=testdb +WORDPRESS_DB_USER=wordpress +WORDPRESS_DB_PASSWORD=wordpress +WORDPRESS_TABLE_PREFIX="wp_" +WORDPRESS_DEBUG=1 +# WordPress CLI environment +WORDPRESS_TITLE="Krokedil E2E Test Suite" +WP_EMAIL="info@krokedil.se" +SLUG="kco" +SITEHOST="localhost" +PORT="8000" diff --git a/tests/e2e/.gitignore b/tests/e2e/.gitignore index b652e0e6..3f109f1c 100644 --- a/tests/e2e/.gitignore +++ b/tests/e2e/.gitignore @@ -54,9 +54,6 @@ typings/ # Yarn Integrity file .yarn-integrity -# dotenv environment variables file -.env - # next.js build output .next diff --git a/tests/e2e/api/API.js b/tests/e2e/api/API.js index 34bcd0ef..5e04a302 100644 --- a/tests/e2e/api/API.js +++ b/tests/e2e/api/API.js @@ -10,8 +10,8 @@ import { klarnaAuth } from "../config/config"; */ const getKlarnaOrderById = async (page, endpoint, id) => { const encodedKey = await page.evaluate((auth) => { - const merchant = auth.test_merchant_id_eu; - const secret = auth.test_shared_secret_eu; + const merchant = process.env.API_KEY; + const secret = process.env.API_SECRET; return btoa(`${merchant}:${secret}`); }, klarnaAuth); diff --git a/tests/e2e/api/index.js b/tests/e2e/api/index.js index a57b7b13..5ca04aa7 100644 --- a/tests/e2e/api/index.js +++ b/tests/e2e/api/index.js @@ -45,15 +45,15 @@ const createRequest = async (endpoint, method = "GET", data = null) => { response = axios.get(requestData.url, config); break; case post: - response = axios.post(requestData.url, data, config); + response = axios.post(requestData.url, data, config).catch(e => console.log(e)); break; case put: response = axios.put(requestData.url, data, config); break; default: - return Promise.reject( - new Error("Unsupported method") - ).then((result) => console.log(result)); + return Promise.reject(new Error("Unsupported method")).then( + (result) => console.log(result) + ); } return response; }; diff --git a/tests/e2e/api/setup.js b/tests/e2e/api/setup.js new file mode 100644 index 00000000..d69f8484 --- /dev/null +++ b/tests/e2e/api/setup.js @@ -0,0 +1,161 @@ +import woocommerce from "./woocommerce"; + +let json = ""; + +const createTaxClasses = async () => { + for(const taxes of json.taxes) { + await woocommerce.createTaxClass({ + name: taxes.name, + }) + } +}; + +const createTaxRates = async () => { + for(const taxes of json.taxes) { + await woocommerce.createTaxRate({ + country: "SE", + state: "", + cities: [], + postcodes: [], + rate: taxes.rate, + name: taxes.name, + shipping: true, + class: taxes.name, + }) + } +}; + +const createProducts = async () => { + let i = 0; + for( const simpleProduct of json.products.simple ) { + let product = await woocommerce.createProduct({ + name: simpleProduct.name, + sku: simpleProduct.sku, + regular_price: simpleProduct.regular_price, + type: "simple", + virtual: simpleProduct.virtual, + downloadable: simpleProduct.downloadable, + tax_class: simpleProduct.tax_class, + }); + + json.products.simple[i].id = product.data.id; + i++; + } +}; + +const createAttributes = async () => { + let i = 0; + for( const variableProduct of json.products.attribute ) { + const attr = await woocommerce.createProductAttribute({ + name: variableProduct.name, + slug: variableProduct.name, + type: "select", + order_by: "menu_order", + has_archives: true, + }); + json.products.attribute[i].id = attr.data.id; + i++; + } +} + +const createVariableProducts = async () => { + for( const variableProduct of json.products.variable ) { + let attributeId = 0; + let i = 0; + json.products.attribute.forEach(element => { + if(element.name === json.products.variable[i].attribute.name) { + attributeId = element.id + } + }) + let options = []; + variableProduct.attribute.options.forEach(tmpOption => { + options.push(tmpOption.option); + }) + const product = await woocommerce.createProduct({ + name: variableProduct.name, + sku: variableProduct.sku, + type: "variable", + virtual: variableProduct.virtual, + downloadable: variableProduct.downloadable, + attributes: [{ + id: attributeId, + name: variableProduct.attribute.name, + variation: true, + visible: true, + options: options, + }], + tax_class: variableProduct.tax_class, + }); + + json.products.variable[i].id = product.data.id; + + let x = 0; + for( const option of variableProduct.attribute.options ) { + const variation = await woocommerce.createProductVariation(product.data.id, { + regular_price: variableProduct.regular_price, + attributes: [ + { + id: attributeId, + option: option.option, + }, + ], + }) + json.products.variable[i].attribute.options[x].id = variation.data.id; + x++; + } + i++; + } +}; + +const createCoupons = async () => { + for(const coupon of json.coupons) { + await woocommerce.createCoupons({ + code: coupon.code, + discount_type: coupon.discountType, + amount: coupon.amount, + individual_use: false, + exclude_sale_items: false, + }) + } +}; + +const createShippingZones = async () => { + for(const shippingZone of json.shipping) { + const zone = await woocommerce.createShippingZone({ + name: shippingZone.name, + }); + + await woocommerce.updateShippingZoneLocation(zone.data.id, [ + { code: shippingZone.location.code, type: shippingZone.location.type }, + ]); + + for(const method of shippingZone.methods){ + const methodRes = await woocommerce.includeShippingZoneMethod( + zone.data.id, + { + method_id: method.method, + } + ); + await woocommerce.updateShippingZoneMethod(zone.data.id, methodRes.data.id, { + settings: { cost: method.amount }, + }); + } + } +}; + +const setupStore = async (data) => { + json = data; + await createTaxClasses(); + await createTaxRates(); + await createShippingZones(); + await createAttributes(); + await createProducts(); + await createVariableProducts(); + await createCoupons(); + + return json; +} + +export default { + setupStore +}; diff --git a/tests/e2e/api/woocommerce.js b/tests/e2e/api/woocommerce.js index 59d147ca..2dd16179 100644 --- a/tests/e2e/api/woocommerce.js +++ b/tests/e2e/api/woocommerce.js @@ -4,6 +4,9 @@ import { createRequest, post, put } from "./index"; const { API_ORDER_ENDPOINT, API_PRODUCTS_ENDPOINT, + API_COUPON_ENDPOINT, + API_TAXES_ENDPOINT, + API_SHIPPING_ENDPOINT, API_CUSTOMER_ENDPOINT, API_SESSION_ENDPOINT, API_WC_OPTIONS, @@ -13,12 +16,15 @@ const { const getProducts = () => { return createRequest(API_PRODUCTS_ENDPOINT); }; + const getProductById = (id) => { return createRequest(`${API_PRODUCTS_ENDPOINT}${id}`); }; + const getOrders = () => { return createRequest(API_ORDER_ENDPOINT); }; + const getOrderById = (id) => { return createRequest(`${API_ORDER_ENDPOINT}${id}`); }; @@ -26,9 +32,11 @@ const getOrderById = (id) => { const createCustomer = async (data) => { return createRequest(`${API_CUSTOMER_ENDPOINT}`, post, data); }; + const getCustomers = async () => { return createRequest(API_CUSTOMER_ENDPOINT); }; + const clearSession = async () => { return createRequest(API_SESSION_ENDPOINT, put, { confirm: true }); }; @@ -41,6 +49,58 @@ const createProduct = async (data) => { return createRequest(API_PRODUCTS_ENDPOINT, post, data); }; +const createProductVariation = async (id, data) => { + return createRequest( + `${API_PRODUCTS_ENDPOINT}${id}/variations`, + post, + data + ); +}; + +const createProductAttribute = async (data) => { + return createRequest(`${API_PRODUCTS_ENDPOINT}attributes`, post, data); +}; + +const createCoupons = async (data) => { + return createRequest(`${API_COUPON_ENDPOINT}`, post, data); +}; + +const createTaxClass = async (data) => { + return createRequest(`${API_TAXES_ENDPOINT}classes`, post, data); +}; + +const createTaxRate = async (data) => { + return createRequest(`${API_TAXES_ENDPOINT}`, post, data); +}; + +const createShippingZone = async (data) => { + return createRequest(`${API_SHIPPING_ENDPOINT}zones`, post, data); +}; + +const updateShippingZoneLocation = async (id, data) => { + return createRequest( + `${API_SHIPPING_ENDPOINT}zones/${id}/locations`, + post, + data + ); +}; + +const includeShippingZoneMethod = async (id, data) => { + return createRequest( + `${API_SHIPPING_ENDPOINT}zones/${id}/methods`, + post, + data + ); +}; + +const updateShippingZoneMethod = async (id, mid, data) => { + return createRequest( + `${API_SHIPPING_ENDPOINT}zones/${id}/methods/${mid}`, + put, + data + ); +}; + const pricesIncludeTax = async (data) => { return createRequest(API_WC_PRICE_INC_EXC, put, data); }; @@ -55,5 +115,14 @@ export default { clearSession, updateOption, createProduct, + createProductVariation, + createProductAttribute, + createCoupons, + createTaxClass, + createTaxRate, + createShippingZone, + updateShippingZoneLocation, + includeShippingZoneMethod, + updateShippingZoneMethod, pricesIncludeTax, }; diff --git a/tests/e2e/bin/.gitignore b/tests/e2e/bin/.gitignore deleted file mode 100644 index 6f296432..00000000 --- a/tests/e2e/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -data.sql diff --git a/tests/e2e/bin/data.sql b/tests/e2e/bin/data.sql new file mode 100644 index 00000000..7d6296da --- /dev/null +++ b/tests/e2e/bin/data.sql @@ -0,0 +1,641 @@ +#http://localhost:8000# ************************************************************ +# Sequel Pro SQL dump +# Version 4541 +# +# http://www.sequelpro.com/ +# https://github.com/sequelpro/sequelpro +# +# Host: 192.168.95.100 (MySQL 5.6.34) +# Database: local +# Generation Time: 2021-06-03 12:21:08 +0000 +# ************************************************************ + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + + +# Dump of table wp_actionscheduler_actions +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_actionscheduler_actions`; + +CREATE TABLE `wp_actionscheduler_actions` ( + `action_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `hook` varchar(191) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `scheduled_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `scheduled_date_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `args` varchar(191) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `schedule` longtext COLLATE utf8mb4_unicode_520_ci, + `group_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `attempts` int(11) NOT NULL DEFAULT '0', + `last_attempt_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `last_attempt_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `claim_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `extended_args` varchar(8000) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + PRIMARY KEY (`action_id`), + KEY `hook` (`hook`), + KEY `status` (`status`), + KEY `scheduled_date_gmt` (`scheduled_date_gmt`), + KEY `args` (`args`), + KEY `group_id` (`group_id`), + KEY `last_attempt_gmt` (`last_attempt_gmt`), + KEY `claim_id` (`claim_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + +LOCK TABLES `wp_actionscheduler_actions` WRITE; +/*!40000 ALTER TABLE `wp_actionscheduler_actions` DISABLE KEYS */; + +INSERT INTO `wp_actionscheduler_actions` (`action_id`, `hook`, `status`, `scheduled_date_gmt`, `scheduled_date_local`, `args`, `schedule`, `group_id`, `attempts`, `last_attempt_gmt`, `last_attempt_local`, `claim_id`, `extended_args`) +VALUES +(16,'action_scheduler/migration_hook','complete','2021-05-19 10:29:56','2021-05-19 10:29:56','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621420196;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621420196;}',1,1,'2021-05-19 10:30:06','2021-05-19 10:30:06',0,NULL), +(17,'woocommerce_update_marketplace_suggestions','complete','2021-05-19 10:29:33','2021-05-19 10:29:33','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621420173;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621420173;}',0,1,'2021-05-19 10:30:06','2021-05-19 10:30:06',0,NULL), +(18,'action_scheduler/migration_hook','complete','2021-05-19 12:48:49','2021-05-19 12:48:49','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621428529;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621428529;}',1,1,'2021-05-19 12:49:30','2021-05-19 12:49:30',0,NULL), +(19,'action_scheduler/migration_hook','complete','2021-05-19 12:58:11','2021-05-19 12:58:11','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621429091;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621429091;}',1,1,'2021-05-19 12:58:51','2021-05-19 12:58:51',0,NULL); + +/*!40000 ALTER TABLE `wp_actionscheduler_actions` ENABLE KEYS */; +UNLOCK TABLES; + + +# Dump of table wp_actionscheduler_claims +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_actionscheduler_claims`; + +CREATE TABLE `wp_actionscheduler_claims` ( + `claim_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `date_created_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`claim_id`), + KEY `date_created_gmt` (`date_created_gmt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + + + +# Dump of table wp_actionscheduler_groups +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_actionscheduler_groups`; + +CREATE TABLE `wp_actionscheduler_groups` ( + `group_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `slug` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + PRIMARY KEY (`group_id`), + KEY `slug` (`slug`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + +LOCK TABLES `wp_actionscheduler_groups` WRITE; +/*!40000 ALTER TABLE `wp_actionscheduler_groups` DISABLE KEYS */; + +INSERT INTO `wp_actionscheduler_groups` (`group_id`, `slug`) +VALUES +(1,'action-scheduler-migration'), +(2,'wc-admin-data'); + +/*!40000 ALTER TABLE `wp_actionscheduler_groups` ENABLE KEYS */; +UNLOCK TABLES; + + +# Dump of table wp_actionscheduler_logs +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_actionscheduler_logs`; + +CREATE TABLE `wp_actionscheduler_logs` ( + `log_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `action_id` bigint(20) unsigned NOT NULL, + `message` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `log_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `log_date_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`log_id`), + KEY `action_id` (`action_id`), + KEY `log_date_gmt` (`log_date_gmt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + +LOCK TABLES `wp_actionscheduler_logs` WRITE; +/*!40000 ALTER TABLE `wp_actionscheduler_logs` DISABLE KEYS */; + +INSERT INTO `wp_actionscheduler_logs` (`log_id`, `action_id`, `message`, `log_date_gmt`, `log_date_local`) +VALUES +(31,16,'action created','2021-05-19 10:28:56','2021-05-19 10:28:56'), +(32,17,'action created','2021-05-19 10:29:33','2021-05-19 10:29:33'), +(33,16,'action started via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), +(34,16,'action complete via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), +(35,17,'action started via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), +(36,17,'action complete via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), +(37,18,'action created','2021-05-19 12:47:49','2021-05-19 12:47:49'), +(38,18,'action started via Async Request','2021-05-19 12:49:30','2021-05-19 12:49:30'), +(39,18,'action complete via Async Request','2021-05-19 12:49:30','2021-05-19 12:49:30'), +(40,19,'action created','2021-05-19 12:57:11','2021-05-19 12:57:11'), +(41,19,'action started via WP Cron','2021-05-19 12:58:51','2021-05-19 12:58:51'), +(42,19,'action complete via WP Cron','2021-05-19 12:58:51','2021-05-19 12:58:51'); + +/*!40000 ALTER TABLE `wp_actionscheduler_logs` ENABLE KEYS */; +UNLOCK TABLES; + + +# Dump of table wp_commentmeta +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_commentmeta`; + +CREATE TABLE `wp_commentmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `meta_value` longtext COLLATE utf8mb4_unicode_520_ci, + PRIMARY KEY (`meta_id`), + KEY `comment_id` (`comment_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + + + +# Dump of table wp_comments +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_comments`; + +CREATE TABLE `wp_comments` ( + `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', + `comment_author` tinytext COLLATE utf8mb4_unicode_520_ci NOT NULL, + `comment_author_email` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `comment_author_url` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `comment_author_IP` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_content` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `comment_karma` int(11) NOT NULL DEFAULT '0', + `comment_approved` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '1', + `comment_agent` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `comment_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'comment', + `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`comment_ID`), + KEY `comment_post_ID` (`comment_post_ID`), + KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), + KEY `comment_date_gmt` (`comment_date_gmt`), + KEY `comment_parent` (`comment_parent`), + KEY `comment_author_email` (`comment_author_email`(10)), + KEY `woo_idx_comment_type` (`comment_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + +LOCK TABLES `wp_comments` WRITE; +/*!40000 ALTER TABLE `wp_comments` DISABLE KEYS */; + +INSERT INTO `wp_comments` (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`, `comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt`, `comment_content`, `comment_karma`, `comment_approved`, `comment_agent`, `comment_type`, `comment_parent`, `user_id`) +VALUES +(1,1,'A WordPress Commenter','wapuu@wordpress.example','https://wordpress.org/','','2021-02-21 01:36:49','2021-02-21 01:36:49','Hi, this is a comment.\nTo get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\nCommenter avatars come from Gravatar.',0,'1','','comment',0,0); + +/*!40000 ALTER TABLE `wp_comments` ENABLE KEYS */; +UNLOCK TABLES; + + +# Dump of table wp_links +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_links`; + +CREATE TABLE `wp_links` ( + `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `link_url` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `link_name` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `link_image` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `link_target` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `link_description` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `link_visible` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'Y', + `link_owner` bigint(20) unsigned NOT NULL DEFAULT '1', + `link_rating` int(11) NOT NULL DEFAULT '0', + `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `link_rel` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `link_notes` mediumtext COLLATE utf8mb4_unicode_520_ci NOT NULL, + `link_rss` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + PRIMARY KEY (`link_id`), + KEY `link_visible` (`link_visible`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + + + +# Dump of table wp_options +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_options`; + +CREATE TABLE `wp_options` ( + `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `option_name` varchar(191) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `option_value` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL, + `autoload` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'yes', + PRIMARY KEY (`option_id`), + UNIQUE KEY `option_name` (`option_name`), + KEY `autoload` (`autoload`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; + +LOCK TABLES `wp_options` WRITE; +/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; + +INSERT INTO `wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) +VALUES +(1,'siteurl','http://localhost:8000','yes'), +(2,'home','http://localhost:8000','yes'), +(3,'blogname','Blueprint','yes'), +(4,'blogdescription','Just another WordPress site','yes'), +(5,'users_can_register','0','yes'), +(6,'admin_email','dev-email@flywheel.local','yes'), +(7,'start_of_week','1','yes'), +(8,'use_balanceTags','0','yes'), +(9,'use_smilies','1','yes'), +(10,'require_name_email','1','yes'), +(11,'comments_notify','1','yes'), +(12,'posts_per_rss','10','yes'), +(13,'rss_use_excerpt','0','yes'), +(14,'mailserver_url','mail.example.com','yes'), +(15,'mailserver_login','login@example.com','yes'), +(16,'mailserver_pass','password','yes'), +(17,'mailserver_port','110','yes'), +(18,'default_category','1','yes'), +(19,'default_comment_status','open','yes'), +(20,'default_ping_status','open','yes'), +(21,'default_pingback_flag','1','yes'), +(22,'posts_per_page','10','yes'), +(23,'date_format','F j, Y','yes'), +(24,'time_format','g:i a','yes'), +(25,'links_updated_date_format','F j, Y g:i a','yes'), +(26,'comment_moderation','0','yes'), +(27,'moderation_notify','1','yes'), +(28,'permalink_structure','/%postname%/','yes'), +(29,'rewrite_rules','a:161:{s:24:\"^wc-auth/v([1]{1})/(.*)?\";s:63:\"index.php?wc-auth-version=$matches[1]&wc-auth-route=$matches[2]\";s:22:\"^wc-api/v([1-3]{1})/?$\";s:51:\"index.php?wc-api-version=$matches[1]&wc-api-route=/\";s:24:\"^wc-api/v([1-3]{1})(.*)?\";s:61:\"index.php?wc-api-version=$matches[1]&wc-api-route=$matches[2]\";s:7:\"shop/?$\";s:27:\"index.php?post_type=product\";s:37:\"shop/feed/(feed|rdf|rss|rss2|atom)/?$\";s:44:\"index.php?post_type=product&feed=$matches[1]\";s:32:\"shop/(feed|rdf|rss|rss2|atom)/?$\";s:44:\"index.php?post_type=product&feed=$matches[1]\";s:24:\"shop/page/([0-9]{1,})/?$\";s:45:\"index.php?post_type=product&paged=$matches[1]\";s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:32:\"category/(.+?)/wc-api(/(.*))?/?$\";s:54:\"index.php?category_name=$matches[1]&wc-api=$matches[3]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:29:\"tag/([^/]+)/wc-api(/(.*))?/?$\";s:44:\"index.php?tag=$matches[1]&wc-api=$matches[3]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:55:\"product-category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?product_cat=$matches[1]&feed=$matches[2]\";s:50:\"product-category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?product_cat=$matches[1]&feed=$matches[2]\";s:31:\"product-category/(.+?)/embed/?$\";s:44:\"index.php?product_cat=$matches[1]&embed=true\";s:43:\"product-category/(.+?)/page/?([0-9]{1,})/?$\";s:51:\"index.php?product_cat=$matches[1]&paged=$matches[2]\";s:25:\"product-category/(.+?)/?$\";s:33:\"index.php?product_cat=$matches[1]\";s:52:\"product-tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?product_tag=$matches[1]&feed=$matches[2]\";s:47:\"product-tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?product_tag=$matches[1]&feed=$matches[2]\";s:28:\"product-tag/([^/]+)/embed/?$\";s:44:\"index.php?product_tag=$matches[1]&embed=true\";s:40:\"product-tag/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?product_tag=$matches[1]&paged=$matches[2]\";s:22:\"product-tag/([^/]+)/?$\";s:33:\"index.php?product_tag=$matches[1]\";s:35:\"product/[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:45:\"product/[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:65:\"product/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:60:\"product/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:60:\"product/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:41:\"product/[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:24:\"product/([^/]+)/embed/?$\";s:40:\"index.php?product=$matches[1]&embed=true\";s:28:\"product/([^/]+)/trackback/?$\";s:34:\"index.php?product=$matches[1]&tb=1\";s:48:\"product/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:46:\"index.php?product=$matches[1]&feed=$matches[2]\";s:43:\"product/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:46:\"index.php?product=$matches[1]&feed=$matches[2]\";s:36:\"product/([^/]+)/page/?([0-9]{1,})/?$\";s:47:\"index.php?product=$matches[1]&paged=$matches[2]\";s:43:\"product/([^/]+)/comment-page-([0-9]{1,})/?$\";s:47:\"index.php?product=$matches[1]&cpage=$matches[2]\";s:33:\"product/([^/]+)/wc-api(/(.*))?/?$\";s:48:\"index.php?product=$matches[1]&wc-api=$matches[3]\";s:39:\"product/[^/]+/([^/]+)/wc-api(/(.*))?/?$\";s:51:\"index.php?attachment=$matches[1]&wc-api=$matches[3]\";s:50:\"product/[^/]+/attachment/([^/]+)/wc-api(/(.*))?/?$\";s:51:\"index.php?attachment=$matches[1]&wc-api=$matches[3]\";s:32:\"product/([^/]+)(?:/([0-9]+))?/?$\";s:46:\"index.php?product=$matches[1]&page=$matches[2]\";s:24:\"product/[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:34:\"product/[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:54:\"product/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:49:\"product/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:49:\"product/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:30:\"product/[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:13:\"favicon\\.ico$\";s:19:\"index.php?favicon=1\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:27:\"comment-page-([0-9]{1,})/?$\";s:38:\"index.php?&page_id=6&cpage=$matches[1]\";s:17:\"wc-api(/(.*))?/?$\";s:29:\"index.php?&wc-api=$matches[2]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:26:\"comments/wc-api(/(.*))?/?$\";s:29:\"index.php?&wc-api=$matches[2]\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:29:\"search/(.+)/wc-api(/(.*))?/?$\";s:42:\"index.php?s=$matches[1]&wc-api=$matches[3]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:32:\"author/([^/]+)/wc-api(/(.*))?/?$\";s:52:\"index.php?author_name=$matches[1]&wc-api=$matches[3]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:54:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/wc-api(/(.*))?/?$\";s:82:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&wc-api=$matches[5]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:41:\"([0-9]{4})/([0-9]{1,2})/wc-api(/(.*))?/?$\";s:66:\"index.php?year=$matches[1]&monthnum=$matches[2]&wc-api=$matches[4]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:28:\"([0-9]{4})/wc-api(/(.*))?/?$\";s:45:\"index.php?year=$matches[1]&wc-api=$matches[3]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:25:\"(.?.+?)/wc-api(/(.*))?/?$\";s:49:\"index.php?pagename=$matches[1]&wc-api=$matches[3]\";s:28:\"(.?.+?)/order-pay(/(.*))?/?$\";s:52:\"index.php?pagename=$matches[1]&order-pay=$matches[3]\";s:33:\"(.?.+?)/order-received(/(.*))?/?$\";s:57:\"index.php?pagename=$matches[1]&order-received=$matches[3]\";s:25:\"(.?.+?)/orders(/(.*))?/?$\";s:49:\"index.php?pagename=$matches[1]&orders=$matches[3]\";s:29:\"(.?.+?)/view-order(/(.*))?/?$\";s:53:\"index.php?pagename=$matches[1]&view-order=$matches[3]\";s:28:\"(.?.+?)/downloads(/(.*))?/?$\";s:52:\"index.php?pagename=$matches[1]&downloads=$matches[3]\";s:31:\"(.?.+?)/edit-account(/(.*))?/?$\";s:55:\"index.php?pagename=$matches[1]&edit-account=$matches[3]\";s:31:\"(.?.+?)/edit-address(/(.*))?/?$\";s:55:\"index.php?pagename=$matches[1]&edit-address=$matches[3]\";s:34:\"(.?.+?)/payment-methods(/(.*))?/?$\";s:58:\"index.php?pagename=$matches[1]&payment-methods=$matches[3]\";s:32:\"(.?.+?)/lost-password(/(.*))?/?$\";s:56:\"index.php?pagename=$matches[1]&lost-password=$matches[3]\";s:34:\"(.?.+?)/customer-logout(/(.*))?/?$\";s:58:\"index.php?pagename=$matches[1]&customer-logout=$matches[3]\";s:37:\"(.?.+?)/add-payment-method(/(.*))?/?$\";s:61:\"index.php?pagename=$matches[1]&add-payment-method=$matches[3]\";s:40:\"(.?.+?)/delete-payment-method(/(.*))?/?$\";s:64:\"index.php?pagename=$matches[1]&delete-payment-method=$matches[3]\";s:45:\"(.?.+?)/set-default-payment-method(/(.*))?/?$\";s:69:\"index.php?pagename=$matches[1]&set-default-payment-method=$matches[3]\";s:31:\".?.+?/([^/]+)/wc-api(/(.*))?/?$\";s:51:\"index.php?attachment=$matches[1]&wc-api=$matches[3]\";s:42:\".?.+?/attachment/([^/]+)/wc-api(/(.*))?/?$\";s:51:\"index.php?attachment=$matches[1]&wc-api=$matches[3]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:25:\"([^/]+)/wc-api(/(.*))?/?$\";s:45:\"index.php?name=$matches[1]&wc-api=$matches[3]\";s:31:\"[^/]+/([^/]+)/wc-api(/(.*))?/?$\";s:51:\"index.php?attachment=$matches[1]&wc-api=$matches[3]\";s:42:\"[^/]+/attachment/([^/]+)/wc-api(/(.*))?/?$\";s:51:\"index.php?attachment=$matches[1]&wc-api=$matches[3]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}','yes'), +(30,'hack_file','0','yes'), +(31,'blog_charset','UTF-8','yes'), +(32,'moderation_keys','','no'), +(33,'active_plugins','a:2:{i:0;s:67:\"klarna-checkout-for-woocommerce/klarna-checkout-for-woocommerce.php\";i:1;s:27:\"woocommerce/woocommerce.php\";}','yes'), +(34,'category_base','','yes'), +(35,'ping_sites','http://rpc.pingomatic.com/','yes'), +(36,'comment_max_links','2','yes'), +(37,'gmt_offset','0','yes'), +(38,'default_email_category','1','yes'), +(39,'recently_edited','','no'), +(40,'template','storefront','yes'), +(41,'stylesheet','storefront','yes'), +(42,'comment_registration','0','yes'), +(43,'html_type','text/html','yes'), +(44,'use_trackback','0','yes'), +(45,'default_role','subscriber','yes'), +(46,'db_version','49752','yes'), +(47,'uploads_use_yearmonth_folders','1','yes'), +(48,'upload_path','','yes'), +(49,'blog_public','1','yes'), +(50,'default_link_category','2','yes'), +(51,'show_on_front','page','yes'), +(52,'tag_base','','yes'), +(53,'show_avatars','1','yes'), +(54,'avatar_rating','G','yes'), +(55,'upload_url_path','','yes'), +(56,'thumbnail_size_w','150','yes'), +(57,'thumbnail_size_h','150','yes'), +(58,'thumbnail_crop','1','yes'), +(59,'medium_size_w','300','yes'), +(60,'medium_size_h','300','yes'), +(61,'avatar_default','mystery','yes'), +(62,'large_size_w','1024','yes'), +(63,'large_size_h','1024','yes'), +(64,'image_default_link_type','none','yes'), +(65,'image_default_size','','yes'), +(66,'image_default_align','','yes'), +(67,'close_comments_for_old_posts','0','yes'), +(68,'close_comments_days_old','14','yes'), +(69,'thread_comments','1','yes'), +(70,'thread_comments_depth','5','yes'), +(71,'page_comments','0','yes'), +(72,'comments_per_page','50','yes'), +(73,'default_comments_page','newest','yes'), +(74,'comment_order','asc','yes'), +(75,'sticky_posts','a:0:{}','yes'), +(76,'widget_categories','a:2:{i:2;a:4:{s:5:\"title\";s:0:\"\";s:5:\"count\";i:0;s:12:\"hierarchical\";i:0;s:8:\"dropdown\";i:0;}s:12:\"_multiwidget\";i:1;}','yes'), +(77,'widget_text','a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}','yes'), +(78,'widget_rss','a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}','yes'), +(79,'uninstall_plugins','a:0:{}','no'), +(80,'timezone_string','','yes'), +(81,'page_for_posts','0','yes'), +(82,'page_on_front','6','yes'), +(83,'default_post_format','0','yes'), +(84,'link_manager_enabled','0','yes'), +(85,'finished_splitting_shared_terms','1','yes'), +(86,'site_icon','0','yes'), +(87,'medium_large_size_w','768','yes'), +(88,'medium_large_size_h','0','yes'), +(89,'wp_page_for_privacy_policy','3','yes'), +(90,'show_comments_cookies_opt_in','1','yes'), +(91,'admin_email_lifespan','1629423409','yes'), +(92,'disallowed_keys','','no'), +(93,'comment_previously_approved','1','yes'), +(94,'auto_plugin_theme_update_emails','a:0:{}','no'), +(95,'auto_update_core_dev','enabled','yes'), +(96,'auto_update_core_minor','enabled','yes'), +(97,'auto_update_core_major','enabled','yes'), +(98,'initial_db_version','49752','yes'), +(99,'wp_user_roles','a:7:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:114:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:18:\"manage_woocommerce\";b:1;s:24:\"view_woocommerce_reports\";b:1;s:12:\"edit_product\";b:1;s:12:\"read_product\";b:1;s:14:\"delete_product\";b:1;s:13:\"edit_products\";b:1;s:20:\"edit_others_products\";b:1;s:16:\"publish_products\";b:1;s:21:\"read_private_products\";b:1;s:15:\"delete_products\";b:1;s:23:\"delete_private_products\";b:1;s:25:\"delete_published_products\";b:1;s:22:\"delete_others_products\";b:1;s:21:\"edit_private_products\";b:1;s:23:\"edit_published_products\";b:1;s:20:\"manage_product_terms\";b:1;s:18:\"edit_product_terms\";b:1;s:20:\"delete_product_terms\";b:1;s:20:\"assign_product_terms\";b:1;s:15:\"edit_shop_order\";b:1;s:15:\"read_shop_order\";b:1;s:17:\"delete_shop_order\";b:1;s:16:\"edit_shop_orders\";b:1;s:23:\"edit_others_shop_orders\";b:1;s:19:\"publish_shop_orders\";b:1;s:24:\"read_private_shop_orders\";b:1;s:18:\"delete_shop_orders\";b:1;s:26:\"delete_private_shop_orders\";b:1;s:28:\"delete_published_shop_orders\";b:1;s:25:\"delete_others_shop_orders\";b:1;s:24:\"edit_private_shop_orders\";b:1;s:26:\"edit_published_shop_orders\";b:1;s:23:\"manage_shop_order_terms\";b:1;s:21:\"edit_shop_order_terms\";b:1;s:23:\"delete_shop_order_terms\";b:1;s:23:\"assign_shop_order_terms\";b:1;s:16:\"edit_shop_coupon\";b:1;s:16:\"read_shop_coupon\";b:1;s:18:\"delete_shop_coupon\";b:1;s:17:\"edit_shop_coupons\";b:1;s:24:\"edit_others_shop_coupons\";b:1;s:20:\"publish_shop_coupons\";b:1;s:25:\"read_private_shop_coupons\";b:1;s:19:\"delete_shop_coupons\";b:1;s:27:\"delete_private_shop_coupons\";b:1;s:29:\"delete_published_shop_coupons\";b:1;s:26:\"delete_others_shop_coupons\";b:1;s:25:\"edit_private_shop_coupons\";b:1;s:27:\"edit_published_shop_coupons\";b:1;s:24:\"manage_shop_coupon_terms\";b:1;s:22:\"edit_shop_coupon_terms\";b:1;s:24:\"delete_shop_coupon_terms\";b:1;s:24:\"assign_shop_coupon_terms\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:34:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}s:8:\"customer\";a:2:{s:4:\"name\";s:8:\"Customer\";s:12:\"capabilities\";a:1:{s:4:\"read\";b:1;}}s:12:\"shop_manager\";a:2:{s:4:\"name\";s:12:\"Shop manager\";s:12:\"capabilities\";a:92:{s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:4:\"read\";b:1;s:18:\"read_private_pages\";b:1;s:18:\"read_private_posts\";b:1;s:10:\"edit_posts\";b:1;s:10:\"edit_pages\";b:1;s:20:\"edit_published_posts\";b:1;s:20:\"edit_published_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"edit_private_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:17:\"edit_others_pages\";b:1;s:13:\"publish_posts\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_posts\";b:1;s:12:\"delete_pages\";b:1;s:20:\"delete_private_pages\";b:1;s:20:\"delete_private_posts\";b:1;s:22:\"delete_published_pages\";b:1;s:22:\"delete_published_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:19:\"delete_others_pages\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:17:\"moderate_comments\";b:1;s:12:\"upload_files\";b:1;s:6:\"export\";b:1;s:6:\"import\";b:1;s:10:\"list_users\";b:1;s:18:\"edit_theme_options\";b:1;s:18:\"manage_woocommerce\";b:1;s:24:\"view_woocommerce_reports\";b:1;s:12:\"edit_product\";b:1;s:12:\"read_product\";b:1;s:14:\"delete_product\";b:1;s:13:\"edit_products\";b:1;s:20:\"edit_others_products\";b:1;s:16:\"publish_products\";b:1;s:21:\"read_private_products\";b:1;s:15:\"delete_products\";b:1;s:23:\"delete_private_products\";b:1;s:25:\"delete_published_products\";b:1;s:22:\"delete_others_products\";b:1;s:21:\"edit_private_products\";b:1;s:23:\"edit_published_products\";b:1;s:20:\"manage_product_terms\";b:1;s:18:\"edit_product_terms\";b:1;s:20:\"delete_product_terms\";b:1;s:20:\"assign_product_terms\";b:1;s:15:\"edit_shop_order\";b:1;s:15:\"read_shop_order\";b:1;s:17:\"delete_shop_order\";b:1;s:16:\"edit_shop_orders\";b:1;s:23:\"edit_others_shop_orders\";b:1;s:19:\"publish_shop_orders\";b:1;s:24:\"read_private_shop_orders\";b:1;s:18:\"delete_shop_orders\";b:1;s:26:\"delete_private_shop_orders\";b:1;s:28:\"delete_published_shop_orders\";b:1;s:25:\"delete_others_shop_orders\";b:1;s:24:\"edit_private_shop_orders\";b:1;s:26:\"edit_published_shop_orders\";b:1;s:23:\"manage_shop_order_terms\";b:1;s:21:\"edit_shop_order_terms\";b:1;s:23:\"delete_shop_order_terms\";b:1;s:23:\"assign_shop_order_terms\";b:1;s:16:\"edit_shop_coupon\";b:1;s:16:\"read_shop_coupon\";b:1;s:18:\"delete_shop_coupon\";b:1;s:17:\"edit_shop_coupons\";b:1;s:24:\"edit_others_shop_coupons\";b:1;s:20:\"publish_shop_coupons\";b:1;s:25:\"read_private_shop_coupons\";b:1;s:19:\"delete_shop_coupons\";b:1;s:27:\"delete_private_shop_coupons\";b:1;s:29:\"delete_published_shop_coupons\";b:1;s:26:\"delete_others_shop_coupons\";b:1;s:25:\"edit_private_shop_coupons\";b:1;s:27:\"edit_published_shop_coupons\";b:1;s:24:\"manage_shop_coupon_terms\";b:1;s:22:\"edit_shop_coupon_terms\";b:1;s:24:\"delete_shop_coupon_terms\";b:1;s:24:\"assign_shop_coupon_terms\";b:1;}}}','yes'), +(100,'fresh_site','0','yes'), +(101,'widget_search','a:2:{i:2;a:1:{s:5:\"title\";s:0:\"\";}s:12:\"_multiwidget\";i:1;}','yes'), +(102,'widget_recent-posts','a:2:{i:2;a:2:{s:5:\"title\";s:0:\"\";s:6:\"number\";i:5;}s:12:\"_multiwidget\";i:1;}','yes'), +(103,'widget_recent-comments','a:2:{i:2;a:2:{s:5:\"title\";s:0:\"\";s:6:\"number\";i:5;}s:12:\"_multiwidget\";i:1;}','yes'), +(104,'widget_archives','a:2:{i:2;a:3:{s:5:\"title\";s:0:\"\";s:5:\"count\";i:0;s:8:\"dropdown\";i:0;}s:12:\"_multiwidget\";i:1;}','yes'), +(105,'widget_meta','a:2:{i:2;a:1:{s:5:\"title\";s:0:\"\";}s:12:\"_multiwidget\";i:1;}','yes'), +(106,'sidebars_widgets','a:8:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:6:{i:0;s:8:\"search-2\";i:1;s:14:\"recent-posts-2\";i:2;s:17:\"recent-comments-2\";i:3;s:10:\"archives-2\";i:4;s:12:\"categories-2\";i:5;s:6:\"meta-2\";}s:8:\"header-1\";a:0:{}s:8:\"footer-1\";a:0:{}s:8:\"footer-2\";a:0:{}s:8:\"footer-3\";a:0:{}s:8:\"footer-4\";a:0:{}s:13:\"array_version\";i:3;}','yes'), +(107,'cron','a:18:{i:1622722873;a:1:{s:26:\"action_scheduler_run_queue\";a:1:{s:32:\"0d04ed39571b55704c122d726248bbac\";a:3:{s:8:\"schedule\";s:12:\"every_minute\";s:4:\"args\";a:1:{i:0;s:7:\"WP Cron\";}s:8:\"interval\";i:60;}}}i:1622723400;a:1:{s:32:\"woocommerce_cancel_unpaid_orders\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:0:{}}}}i:1622723810;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1622724056;a:1:{s:33:\"wc_admin_process_orders_milestone\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1622724062;a:1:{s:29:\"wc_admin_unsnooze_admin_notes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1622724579;a:2:{s:33:\"woocommerce_cleanup_personal_data\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:30:\"woocommerce_tracker_send_event\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1622724629;a:1:{s:25:\"woocommerce_geoip_updater\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:11:\"fifteendays\";s:4:\"args\";a:0:{}s:8:\"interval\";i:1296000;}}}i:1622727410;a:2:{s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1622734455;a:1:{s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1622735369;a:1:{s:24:\"woocommerce_cleanup_logs\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1622735594;a:1:{s:18:\"wp_https_detection\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1622746169;a:1:{s:28:\"woocommerce_cleanup_sessions\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1622764800;a:1:{s:27:\"woocommerce_scheduled_sales\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1622770610;a:1:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1622770728;a:3:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:25:\"delete_expired_transients\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1622770857;a:1:{s:14:\"wc_admin_daily\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1623029810;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}','yes'), +(108,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(109,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(110,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(111,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(112,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(113,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(114,'nonce_key','FUz6 V0[L=lUZS;9$Ot O@^urH|4)<.Hr-_dm6D WNJ{uJVu6=A!+6v,-Dfguow&','no'), +(115,'nonce_salt','PT|d ?T719^|(Y^|l(DF]pCgp&3pfvC>x.W8bZgxfUwcJ=zS`h@^Xc%;eS:Y .pZ','no'), +(116,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(117,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(118,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(120,'recovery_keys','a:0:{}','yes'), +(144,'can_compress_scripts','1','no'), +(145,'recently_activated','a:0:{}','yes'), +(151,'finished_updating_comment_type','1','yes'), +(153,'action_scheduler_hybrid_store_demarkation','5','yes'), +(154,'schema-ActionScheduler_StoreSchema','3.0.1613871654','yes'), +(155,'schema-ActionScheduler_LoggerSchema','2.0.1613871654','yes'), +(158,'woocommerce_schema_version','430','yes'), +(159,'woocommerce_store_address','Hamngatan 2','yes'), +(160,'woocommerce_store_address_2','','yes'), +(161,'woocommerce_store_city','Arvika','yes'), +(162,'woocommerce_default_country','SE','yes'), +(163,'woocommerce_store_postcode','671 31','yes'), +(164,'woocommerce_allowed_countries','all','yes'), +(165,'woocommerce_all_except_countries','a:0:{}','yes'), +(166,'woocommerce_specific_allowed_countries','a:0:{}','yes'), +(167,'woocommerce_ship_to_countries','','yes'), +(168,'woocommerce_specific_ship_to_countries','a:0:{}','yes'), +(169,'woocommerce_default_customer_address','base','yes'), +(170,'woocommerce_calc_taxes','yes','yes'), +(171,'woocommerce_enable_coupons','yes','yes'), +(172,'woocommerce_calc_discounts_sequentially','no','no'), +(173,'woocommerce_currency','SEK','yes'), +(174,'woocommerce_currency_pos','right_space','yes'), +(175,'woocommerce_price_thousand_sep','.','yes'), +(176,'woocommerce_price_decimal_sep',',','yes'), +(177,'woocommerce_price_num_decimals','2','yes'), +(178,'woocommerce_shop_page_id','6','yes'), +(179,'woocommerce_cart_redirect_after_add','no','yes'), +(180,'woocommerce_enable_ajax_add_to_cart','yes','yes'), +(181,'woocommerce_placeholder_image','5','yes'), +(182,'woocommerce_weight_unit','kg','yes'), +(183,'woocommerce_dimension_unit','cm','yes'), +(184,'woocommerce_enable_reviews','no','yes'), +(185,'woocommerce_review_rating_verification_label','yes','no'), +(186,'woocommerce_review_rating_verification_required','no','no'), +(187,'woocommerce_enable_review_rating','yes','yes'), +(188,'woocommerce_review_rating_required','yes','no'), +(189,'woocommerce_manage_stock','yes','yes'), +(190,'woocommerce_hold_stock_minutes','60','no'), +(191,'woocommerce_notify_low_stock','yes','no'), +(192,'woocommerce_notify_no_stock','yes','no'), +(193,'woocommerce_stock_email_recipient','dev-email@flywheel.local','no'), +(194,'woocommerce_notify_low_stock_amount','2','no'), +(195,'woocommerce_notify_no_stock_amount','0','yes'), +(196,'woocommerce_hide_out_of_stock_items','no','yes'), +(197,'woocommerce_stock_format','','yes'), +(198,'woocommerce_file_download_method','force','no'), +(199,'woocommerce_downloads_require_login','no','no'), +(200,'woocommerce_downloads_grant_access_after_payment','yes','no'), +(201,'woocommerce_downloads_add_hash_to_filename','yes','yes'), +(202,'woocommerce_prices_include_tax','yes','yes'), +(203,'woocommerce_tax_based_on','shipping','yes'), +(204,'woocommerce_shipping_tax_class','inherit','yes'), +(205,'woocommerce_tax_round_at_subtotal','no','yes'), +(206,'woocommerce_tax_classes','','yes'), +(207,'woocommerce_tax_display_shop','incl','yes'), +(208,'woocommerce_tax_display_cart','incl','yes'), +(209,'woocommerce_price_display_suffix','','yes'), +(210,'woocommerce_tax_total_display','itemized','no'), +(211,'woocommerce_enable_shipping_calc','no','no'), +(212,'woocommerce_shipping_cost_requires_address','no','yes'), +(213,'woocommerce_ship_to_destination','billing','no'), +(214,'woocommerce_shipping_debug_mode','no','yes'), +(215,'woocommerce_enable_guest_checkout','yes','no'), +(216,'woocommerce_enable_checkout_login_reminder','yes','no'), +(217,'woocommerce_enable_signup_and_login_from_checkout','yes','no'), +(218,'woocommerce_enable_myaccount_registration','yes','no'), +(219,'woocommerce_registration_generate_username','yes','no'), +(220,'woocommerce_registration_generate_password','yes','no'), +(221,'woocommerce_erasure_request_removes_order_data','no','no'), +(222,'woocommerce_erasure_request_removes_download_data','no','no'), +(223,'woocommerce_allow_bulk_remove_personal_data','no','no'), +(224,'woocommerce_registration_privacy_policy_text','Your personal data will be used to support your experience throughout this website, to manage access to your account, and for other purposes described in our [privacy_policy].','yes'), +(225,'woocommerce_checkout_privacy_policy_text','Your personal data will be used to process your order, support your experience throughout this website, and for other purposes described in our [privacy_policy].','yes'), +(226,'woocommerce_delete_inactive_accounts','a:2:{s:6:\"number\";s:0:\"\";s:4:\"unit\";s:6:\"months\";}','no'), +(227,'woocommerce_trash_pending_orders','a:2:{s:6:\"number\";s:0:\"\";s:4:\"unit\";s:4:\"days\";}','no'), +(228,'woocommerce_trash_failed_orders','a:2:{s:6:\"number\";s:0:\"\";s:4:\"unit\";s:4:\"days\";}','no'), +(229,'woocommerce_trash_cancelled_orders','a:2:{s:6:\"number\";s:0:\"\";s:4:\"unit\";s:4:\"days\";}','no'), +(230,'woocommerce_anonymize_completed_orders','a:2:{s:6:\"number\";s:0:\"\";s:4:\"unit\";s:6:\"months\";}','no'), +(231,'woocommerce_email_from_name','Blueprint','no'), +(232,'woocommerce_email_from_address','dev-email@flywheel.local','no'), +(233,'woocommerce_email_header_image','','no'), +(234,'woocommerce_email_footer_text','{site_title} — Built with {WooCommerce}','no'), +(235,'woocommerce_email_base_color','#96588a','no'), +(236,'woocommerce_email_background_color','#f7f7f7','no'), +(237,'woocommerce_email_body_background_color','#ffffff','no'), +(238,'woocommerce_email_text_color','#3c3c3c','no'), +(239,'woocommerce_merchant_email_notifications','yes','no'), +(240,'woocommerce_cart_page_id','6','no'), +(241,'woocommerce_checkout_page_id','7','no'), +(242,'woocommerce_myaccount_page_id','8','no'), +(243,'woocommerce_terms_page_id','3','no'), +(244,'woocommerce_force_ssl_checkout','no','yes'), +(245,'woocommerce_unforce_ssl_checkout','no','yes'), +(246,'woocommerce_checkout_pay_endpoint','order-pay','yes'), +(247,'woocommerce_checkout_order_received_endpoint','order-received','yes'), +(248,'woocommerce_myaccount_add_payment_method_endpoint','add-payment-method','yes'), +(249,'woocommerce_myaccount_delete_payment_method_endpoint','delete-payment-method','yes'), +(250,'woocommerce_myaccount_set_default_payment_method_endpoint','set-default-payment-method','yes'), +(251,'woocommerce_myaccount_orders_endpoint','orders','yes'), +(252,'woocommerce_myaccount_view_order_endpoint','view-order','yes'), +(253,'woocommerce_myaccount_downloads_endpoint','downloads','yes'), +(254,'woocommerce_myaccount_edit_account_endpoint','edit-account','yes'), +(255,'woocommerce_myaccount_edit_address_endpoint','edit-address','yes'), +(256,'woocommerce_myaccount_payment_methods_endpoint','payment-methods','yes'), +(257,'woocommerce_myaccount_lost_password_endpoint','lost-password','yes'), +(258,'woocommerce_logout_endpoint','customer-logout','yes'), +(259,'woocommerce_api_enabled','no','yes'), +(260,'woocommerce_allow_tracking','no','no'), +(261,'woocommerce_show_marketplace_suggestions','yes','no'), +(262,'woocommerce_single_image_width','600','yes'), +(263,'woocommerce_thumbnail_image_width','300','yes'), +(264,'woocommerce_checkout_highlight_required_fields','yes','yes'), +(265,'woocommerce_demo_store','no','no'), +(266,'woocommerce_permalinks','a:5:{s:12:\"product_base\";s:7:\"product\";s:13:\"category_base\";s:16:\"product-category\";s:8:\"tag_base\";s:11:\"product-tag\";s:14:\"attribute_base\";s:0:\"\";s:22:\"use_verbose_page_rules\";b:0;}','yes'), +(267,'current_theme_supports_woocommerce','yes','yes'), +(268,'woocommerce_queue_flush_rewrite_rules','no','yes'), +(271,'default_product_cat','15','yes'), +(274,'woocommerce_version','5.3.0','yes'), +(275,'woocommerce_db_version','5.3.0','yes'), +(279,'_transient_jetpack_autoloader_plugin_paths','a:1:{i:0;s:29:\"{{WP_PLUGIN_DIR}}/woocommerce\";}','yes'), +(280,'action_scheduler_lock_async-request-runner','1622722872','yes'), +(281,'woocommerce_admin_notices','a:1:{i:0;s:20:\"no_secure_connection\";}','yes'), +(282,'woocommerce_maxmind_geolocation_settings','a:1:{s:15:\"database_prefix\";s:32:\"fohiWKTXcNpvaTVb4JwumIHvNDulzmM9\";}','yes'), +(283,'_transient_woocommerce_webhook_ids_status_active','a:0:{}','yes'), +(284,'widget_woocommerce_widget_cart','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(285,'widget_woocommerce_layered_nav_filters','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(286,'widget_woocommerce_layered_nav','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(287,'widget_woocommerce_price_filter','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(288,'widget_woocommerce_product_categories','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(289,'widget_woocommerce_product_search','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(290,'widget_woocommerce_product_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(291,'widget_woocommerce_products','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(292,'widget_woocommerce_recently_viewed_products','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(293,'widget_woocommerce_top_rated_products','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(294,'widget_woocommerce_recent_reviews','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(295,'widget_woocommerce_rating_filter','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), +(299,'woocommerce_admin_install_timestamp','1613871657','yes'), +(303,'wc_remote_inbox_notifications_specs','a:19:{s:20:\"paypal_ppcp_gtm_2021\";O:8:\"stdClass\":8:{s:4:\"slug\";s:20:\"paypal_ppcp_gtm_2021\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:38:\"Offer more options with the new PayPal\";s:7:\"content\";s:113:\"Get the latest PayPal extension for a full suite of payment methods with extensive currency and country coverage.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:36:\"open_wc_paypal_payments_product_page\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:61:\"https://woocommerce.com/products/woocommerce-paypal-payments/\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:4:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:18:\"publish_after_time\";s:13:\"publish_after\";s:19:\"2021-04-05 00:00:00\";}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:19:\"publish_before_time\";s:14:\"publish_before\";s:19:\"2021-04-21 00:00:00\";}i:2;O:8:\"stdClass\":2:{s:4:\"type\";s:2:\"or\";s:8:\"operands\";a:7:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:43:\"woocommerce-gateway-paypal-express-checkout\";}}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:30:\"woocommerce-gateway-paypal-pro\";}}i:2;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:37:\"woocommerce-gateway-paypal-pro-hosted\";}}i:3;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:35:\"woocommerce-gateway-paypal-advanced\";}}i:4;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:40:\"woocommerce-gateway-paypal-digital-goods\";}}i:5;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:31:\"woocommerce-paypal-here-gateway\";}}i:6;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:44:\"woocommerce-gateway-paypal-adaptive-payments\";}}}}i:3;O:8:\"stdClass\":2:{s:4:\"type\";s:2:\"or\";s:8:\"operands\";a:2:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:3:\"not\";s:7:\"operand\";a:1:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:27:\"woocommerce-paypal-payments\";}}}}i:1;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:27:\"woocommerce-paypal-payments\";s:7:\"version\";s:5:\"1.2.1\";s:8:\"operator\";s:1:\"<\";}}}}}s:23:\"facebook_pixel_api_2021\";O:8:\"stdClass\":8:{s:4:\"slug\";s:23:\"facebook_pixel_api_2021\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:44:\"Improve the performance of your Facebook ads\";s:7:\"content\";s:152:\"Enable Facebook Pixel and Conversions API through the latest version of Facebook for WooCommerce for improved measurement and ad targeting capabilities.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:30:\"upgrade_now_facebook_pixel_api\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:11:\"Upgrade now\";}}s:3:\"url\";s:67:\"plugin-install.php?tab=plugin-information&plugin=§ion=changelog\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:3:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:18:\"publish_after_time\";s:13:\"publish_after\";s:19:\"2021-05-17 00:00:00\";}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:19:\"publish_before_time\";s:14:\"publish_before\";s:19:\"2021-06-14 00:00:00\";}i:2;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:24:\"facebook-for-woocommerce\";s:7:\"version\";s:5:\"2.4.0\";s:8:\"operator\";s:2:\"<=\";}}}s:16:\"facebook_ec_2021\";O:8:\"stdClass\":8:{s:4:\"slug\";s:16:\"facebook_ec_2021\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:59:\"Sync your product catalog with Facebook to help boost sales\";s:7:\"content\";s:170:\"A single click adds all products to your Facebook Business Page shop. Product changes are automatically synced, with the flexibility to control which products are listed.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:22:\"learn_more_facebook_ec\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:42:\"https://woocommerce.com/products/facebook/\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:10:\"unactioned\";}}s:5:\"rules\";a:3:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:18:\"publish_after_time\";s:13:\"publish_after\";s:19:\"2021-03-01 00:00:00\";}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:19:\"publish_before_time\";s:14:\"publish_before\";s:19:\"2021-03-15 00:00:00\";}i:2;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:24:\"facebook-for-woocommerce\";}}}}s:37:\"ecomm-need-help-setting-up-your-store\";O:8:\"stdClass\":8:{s:4:\"slug\";s:37:\"ecomm-need-help-setting-up-your-store\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:32:\"Need help setting up your Store?\";s:7:\"content\";s:350:\"Schedule a free 30-min quick start session and get help from our specialists. We’re happy to walk through setup steps, show you around the WordPress.com dashboard, troubleshoot any issues you may have, and help you the find the features you need to accomplish your goals for your site.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:16:\"set-up-concierge\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:21:\"Schedule free session\";}}s:3:\"url\";s:34:\"https://wordpress.com/me/concierge\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:1:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:3:{i:0;s:35:\"woocommerce-shipping-australia-post\";i:1;s:32:\"woocommerce-shipping-canada-post\";i:2;s:30:\"woocommerce-shipping-royalmail\";}}}}s:20:\"woocommerce-services\";O:8:\"stdClass\":8:{s:4:\"slug\";s:20:\"woocommerce-services\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:26:\"WooCommerce Shipping & Tax\";s:7:\"content\";s:255:\"WooCommerce Shipping & Tax helps get your store “ready to sell” as quickly as possible. You create your products. We take care of tax calculation, payment processing, and shipping label printing! Learn more about the extension that you just installed.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:10:\"learn-more\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:84:\"https://docs.woocommerce.com/document/woocommerce-shipping-and-tax/?utm_source=inbox\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:10:\"unactioned\";}}s:5:\"rules\";a:2:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:20:\"woocommerce-services\";}}i:1;O:8:\"stdClass\":3:{s:4:\"type\";s:18:\"wcadmin_active_for\";s:9:\"operation\";s:1:\"<\";s:4:\"days\";i:2;}}}s:32:\"ecomm-unique-shopping-experience\";O:8:\"stdClass\":8:{s:4:\"slug\";s:32:\"ecomm-unique-shopping-experience\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:53:\"For a shopping experience as unique as your customers\";s:7:\"content\";s:274:\"Product Add-Ons allow your customers to personalize products while they’re shopping on your online store. No more follow-up email requests—customers get what they want, before they’re done checking out. Learn more about this extension that comes included in your plan.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:43:\"learn-more-ecomm-unique-shopping-experience\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:71:\"https://docs.woocommerce.com/document/product-add-ons/?utm_source=inbox\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:2:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:3:{i:0;s:35:\"woocommerce-shipping-australia-post\";i:1;s:32:\"woocommerce-shipping-canada-post\";i:2;s:30:\"woocommerce-shipping-royalmail\";}}i:1;O:8:\"stdClass\":3:{s:4:\"type\";s:18:\"wcadmin_active_for\";s:9:\"operation\";s:1:\"<\";s:4:\"days\";i:2;}}}s:37:\"wc-admin-getting-started-in-ecommerce\";O:8:\"stdClass\":8:{s:4:\"slug\";s:37:\"wc-admin-getting-started-in-ecommerce\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:38:\"Getting Started in eCommerce - webinar\";s:7:\"content\";s:174:\"We want to make eCommerce and this process of getting started as easy as possible for you. Watch this webinar to get tips on how to have our store up and running in a breeze.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:17:\"watch-the-webinar\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:17:\"Watch the webinar\";}}s:3:\"url\";s:28:\"https://youtu.be/V_2XtCOyZ7o\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:2:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:18:\"onboarding_profile\";s:5:\"index\";s:12:\"setup_client\";s:9:\"operation\";s:2:\"!=\";s:5:\"value\";b:1;}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:2:\"or\";s:8:\"operands\";a:3:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:18:\"onboarding_profile\";s:5:\"index\";s:13:\"product_count\";s:9:\"operation\";s:1:\"=\";s:5:\"value\";s:1:\"0\";}i:1;O:8:\"stdClass\":4:{s:4:\"type\";s:18:\"onboarding_profile\";s:5:\"index\";s:7:\"revenue\";s:9:\"operation\";s:1:\"=\";s:5:\"value\";s:4:\"none\";}i:2;O:8:\"stdClass\":4:{s:4:\"type\";s:18:\"onboarding_profile\";s:5:\"index\";s:7:\"revenue\";s:9:\"operation\";s:1:\"=\";s:5:\"value\";s:10:\"up-to-2500\";}}}}}s:18:\"your-first-product\";O:8:\"stdClass\":8:{s:4:\"slug\";s:18:\"your-first-product\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:18:\"Your first product\";s:7:\"content\";s:461:\"That\'s huge! You\'re well on your way to building a successful online store — now it’s time to think about how you\'ll fulfill your orders.

Read our shipping guide to learn best practices and options for putting together your shipping strategy. And for WooCommerce stores in the United States, you can print discounted shipping labels via USPS with WooCommerce Shipping.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:10:\"learn-more\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:82:\"https://woocommerce.com/posts/ecommerce-shipping-solutions-guide/?utm_source=inbox\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:4:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:12:\"stored_state\";s:5:\"index\";s:22:\"there_were_no_products\";s:9:\"operation\";s:1:\"=\";s:5:\"value\";b:1;}i:1;O:8:\"stdClass\":4:{s:4:\"type\";s:12:\"stored_state\";s:5:\"index\";s:22:\"there_are_now_products\";s:9:\"operation\";s:1:\"=\";s:5:\"value\";b:1;}i:2;O:8:\"stdClass\":3:{s:4:\"type\";s:13:\"product_count\";s:9:\"operation\";s:2:\">=\";s:5:\"value\";i:1;}i:3;O:8:\"stdClass\":5:{s:4:\"type\";s:18:\"onboarding_profile\";s:5:\"index\";s:13:\"product_types\";s:9:\"operation\";s:8:\"contains\";s:5:\"value\";s:8:\"physical\";s:7:\"default\";a:0:{}}}}s:31:\"wc-square-apple-pay-boost-sales\";O:8:\"stdClass\":8:{s:4:\"slug\";s:31:\"wc-square-apple-pay-boost-sales\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:26:\"Boost sales with Apple Pay\";s:7:\"content\";s:191:\"Now that you accept Apple Pay® with Square you can increase conversion rates by letting your customers know that Apple Pay® is available. Here’s a marketing guide to help you get started.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:27:\"boost-sales-marketing-guide\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:19:\"See marketing guide\";}}s:3:\"url\";s:97:\"https://developer.apple.com/apple-pay/marketing/?utm_source=inbox&utm_campaign=square-boost-sales\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:9:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:11:\"woocommerce\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"4.8\";}i:1;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:18:\"woocommerce-square\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"2.3\";}i:2;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:27:\"wc_square_apple_pay_enabled\";s:5:\"value\";i:1;s:7:\"default\";b:0;s:9:\"operation\";s:1:\"=\";}i:3;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:38:\"wc-square-apple-pay-grow-your-business\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:4;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:38:\"wc-square-apple-pay-grow-your-business\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}i:5;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:27:\"wcpay-apple-pay-boost-sales\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:6;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:27:\"wcpay-apple-pay-boost-sales\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}i:7;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:34:\"wcpay-apple-pay-grow-your-business\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:8;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:34:\"wcpay-apple-pay-grow-your-business\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}}}s:38:\"wc-square-apple-pay-grow-your-business\";O:8:\"stdClass\":8:{s:4:\"slug\";s:38:\"wc-square-apple-pay-grow-your-business\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:45:\"Grow your business with Square and Apple Pay \";s:7:\"content\";s:178:\"Now more than ever, shoppers want a fast, simple, and secure online checkout experience. Increase conversion rates by letting your customers know that you now accept Apple Pay®.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:34:\"grow-your-business-marketing-guide\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:19:\"See marketing guide\";}}s:3:\"url\";s:104:\"https://developer.apple.com/apple-pay/marketing/?utm_source=inbox&utm_campaign=square-grow-your-business\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:9:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:11:\"woocommerce\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"4.8\";}i:1;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:18:\"woocommerce-square\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"2.3\";}i:2;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:27:\"wc_square_apple_pay_enabled\";s:5:\"value\";i:2;s:7:\"default\";b:0;s:9:\"operation\";s:1:\"=\";}i:3;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:31:\"wc-square-apple-pay-boost-sales\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:4;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:31:\"wc-square-apple-pay-boost-sales\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}i:5;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:27:\"wcpay-apple-pay-boost-sales\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:6;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:27:\"wcpay-apple-pay-boost-sales\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}i:7;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:34:\"wcpay-apple-pay-grow-your-business\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:8;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:34:\"wcpay-apple-pay-grow-your-business\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}}}s:32:\"wcpay-apple-pay-is-now-available\";O:8:\"stdClass\":8:{s:4:\"slug\";s:32:\"wcpay-apple-pay-is-now-available\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:53:\"Apple Pay is now available with WooCommerce Payments!\";s:7:\"content\";s:397:\"Increase your conversion rate by offering a fast and secure checkout with Apple Pay®. It’s free to get started with WooCommerce Payments.\";}}s:7:\"actions\";a:2:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:13:\"add-apple-pay\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:13:\"Add Apple Pay\";}}s:3:\"url\";s:69:\"/admin.php?page=wc-settings&tab=checkout§ion=woocommerce_payments\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}i:1;O:8:\"stdClass\":6:{s:4:\"name\";s:10:\"learn-more\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:121:\"https://docs.woocommerce.com/document/payments/apple-pay/?utm_source=inbox&utm_medium=product&utm_campaign=wcpay_applepay\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:3:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:11:\"woocommerce\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"4.8\";}i:1;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:20:\"woocommerce-payments\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:5:\"2.3.0\";}i:2;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:26:\"wcpay_is_apple_pay_enabled\";s:5:\"value\";b:0;s:7:\"default\";b:0;s:9:\"operation\";s:1:\"=\";}}}s:27:\"wcpay-apple-pay-boost-sales\";O:8:\"stdClass\":8:{s:4:\"slug\";s:27:\"wcpay-apple-pay-boost-sales\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:26:\"Boost sales with Apple Pay\";s:7:\"content\";s:205:\"Now that you accept Apple Pay® with WooCommerce Payments you can increase conversion rates by letting your customers know that Apple Pay® is available. Here’s a marketing guide to help you get started.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:27:\"boost-sales-marketing-guide\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:19:\"See marketing guide\";}}s:3:\"url\";s:96:\"https://developer.apple.com/apple-pay/marketing/?utm_source=inbox&utm_campaign=wcpay-boost-sales\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:4:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:11:\"woocommerce\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"4.8\";}i:1;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:26:\"wcpay_is_apple_pay_enabled\";s:5:\"value\";i:1;s:7:\"default\";b:0;s:9:\"operation\";s:1:\"=\";}i:2;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:34:\"wcpay-apple-pay-grow-your-business\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:3;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:34:\"wcpay-apple-pay-grow-your-business\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}}}s:34:\"wcpay-apple-pay-grow-your-business\";O:8:\"stdClass\":8:{s:4:\"slug\";s:34:\"wcpay-apple-pay-grow-your-business\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:58:\"Grow your business with WooCommerce Payments and Apple Pay\";s:7:\"content\";s:178:\"Now more than ever, shoppers want a fast, simple, and secure online checkout experience. Increase conversion rates by letting your customers know that you now accept Apple Pay®.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:34:\"grow-your-business-marketing-guide\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:19:\"See marketing guide\";}}s:3:\"url\";s:103:\"https://developer.apple.com/apple-pay/marketing/?utm_source=inbox&utm_campaign=wcpay-grow-your-business\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:4:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:11:\"woocommerce\";s:8:\"operator\";s:2:\">=\";s:7:\"version\";s:3:\"4.8\";}i:1;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:26:\"wcpay_is_apple_pay_enabled\";s:5:\"value\";i:2;s:7:\"default\";b:0;s:9:\"operation\";s:1:\"=\";}i:2;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:27:\"wcpay-apple-pay-boost-sales\";s:6:\"status\";s:8:\"actioned\";s:9:\"operation\";s:2:\"!=\";}i:3;O:8:\"stdClass\":4:{s:4:\"type\";s:11:\"note_status\";s:9:\"note_name\";s:27:\"wcpay-apple-pay-boost-sales\";s:6:\"status\";s:10:\"unactioned\";s:9:\"operation\";s:2:\"!=\";}}}s:37:\"wc-admin-optimizing-the-checkout-flow\";O:8:\"stdClass\":8:{s:4:\"slug\";s:37:\"wc-admin-optimizing-the-checkout-flow\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:28:\"Optimizing the checkout flow\";s:7:\"content\";s:171:\"It\'s crucial to get your store\'s checkout as smooth as possible to avoid losing sales. Let\'s take a look at how you can optimize the checkout experience for your shoppers.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:28:\"optimizing-the-checkout-flow\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:78:\"https://woocommerce.com/posts/optimizing-woocommerce-checkout?utm_source=inbox\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:2:{i:0;O:8:\"stdClass\":3:{s:4:\"type\";s:18:\"wcadmin_active_for\";s:9:\"operation\";s:1:\">\";s:4:\"days\";i:3;}i:1;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:45:\"woocommerce_task_list_tracked_completed_tasks\";s:9:\"operation\";s:8:\"contains\";s:5:\"value\";s:8:\"payments\";s:7:\"default\";a:0:{}}}}s:39:\"wc-admin-first-five-things-to-customize\";O:8:\"stdClass\":8:{s:4:\"slug\";s:39:\"wc-admin-first-five-things-to-customize\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:45:\"The first 5 things to customize in your store\";s:7:\"content\";s:173:\"Deciding what to start with first is tricky. To help you properly prioritize, we\'ve put together this short list of the first few things you should customize in WooCommerce.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:10:\"learn-more\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:10:\"Learn more\";}}s:3:\"url\";s:82:\"https://woocommerce.com/posts/first-things-customize-woocommerce/?utm_source=inbox\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:10:\"unactioned\";}}s:5:\"rules\";a:2:{i:0;O:8:\"stdClass\":3:{s:4:\"type\";s:18:\"wcadmin_active_for\";s:9:\"operation\";s:1:\">\";s:4:\"days\";i:2;}i:1;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:45:\"woocommerce_task_list_tracked_completed_tasks\";s:5:\"value\";s:9:\"NOT EMPTY\";s:7:\"default\";s:9:\"NOT EMPTY\";s:9:\"operation\";s:2:\"!=\";}}}s:32:\"wc-payments-qualitative-feedback\";O:8:\"stdClass\":8:{s:4:\"slug\";s:32:\"wc-payments-qualitative-feedback\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:55:\"WooCommerce Payments setup - let us know what you think\";s:7:\"content\";s:146:\"Congrats on enabling WooCommerce Payments for your store. Please share your feedback in this 2 minute survey to help us improve the setup process.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:35:\"qualitative-feedback-from-new-users\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:14:\"Share feedback\";}}s:3:\"url\";s:39:\"https://automattic.survey.fm/wc-pay-new\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:1:{i:0;O:8:\"stdClass\":5:{s:4:\"type\";s:6:\"option\";s:11:\"option_name\";s:45:\"woocommerce_task_list_tracked_completed_tasks\";s:9:\"operation\";s:8:\"contains\";s:5:\"value\";s:20:\"woocommerce-payments\";s:7:\"default\";a:0:{}}}}s:29:\"share-your-feedback-on-paypal\";O:8:\"stdClass\":8:{s:4:\"slug\";s:29:\"share-your-feedback-on-paypal\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:29:\"Share your feedback on PayPal\";s:7:\"content\";s:127:\"Share your feedback in this 2 minute survey about how we can make the process of accepting payments more useful for your store.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:14:\"share-feedback\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:14:\"Share feedback\";}}s:3:\"url\";s:43:\"http://automattic.survey.fm/paypal-feedback\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:10:\"unactioned\";}}s:5:\"rules\";a:2:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:3:\"not\";s:7:\"operand\";a:1:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:26:\"woocommerce-gateway-stripe\";}}}}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:43:\"woocommerce-gateway-paypal-express-checkout\";}}}}s:31:\"wcpay_instant_deposits_gtm_2021\";O:8:\"stdClass\":8:{s:4:\"slug\";s:31:\"wcpay_instant_deposits_gtm_2021\";s:4:\"type\";s:9:\"marketing\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:69:\"Get paid within minutes – Instant Deposits for WooCommerce Payments\";s:7:\"content\";s:384:\"Stay flexible with immediate access to your funds when you need them – including nights, weekends, and holidays. With WooCommerce Payments\' new Instant Deposits feature, you’re able to transfer your earnings to a debit card within minutes.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:10:\"learn-more\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:40:\"Learn about Instant Deposits eligibility\";}}s:3:\"url\";s:136:\"https://docs.woocommerce.com/document/payments/instant-deposits/?utm_source=inbox&utm_medium=product&utm_campaign=wcpay_instant_deposits\";s:18:\"url_is_admin_query\";b:0;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:4:{i:0;O:8:\"stdClass\":2:{s:4:\"type\";s:18:\"publish_after_time\";s:13:\"publish_after\";s:19:\"2021-05-18 00:00:00\";}i:1;O:8:\"stdClass\":2:{s:4:\"type\";s:19:\"publish_before_time\";s:14:\"publish_before\";s:19:\"2021-06-01 00:00:00\";}i:2;O:8:\"stdClass\":3:{s:4:\"type\";s:21:\"base_location_country\";s:5:\"value\";s:2:\"US\";s:9:\"operation\";s:1:\"=\";}i:3;O:8:\"stdClass\":2:{s:4:\"type\";s:17:\"plugins_activated\";s:7:\"plugins\";a:1:{i:0;s:20:\"woocommerce-payments\";}}}}s:39:\"wc-subscriptions-security-update-3-0-15\";O:8:\"stdClass\":8:{s:4:\"slug\";s:39:\"wc-subscriptions-security-update-3-0-15\";s:4:\"type\";s:4:\"info\";s:6:\"status\";s:10:\"unactioned\";s:12:\"is_snoozable\";i:0;s:6:\"source\";s:15:\"woocommerce.com\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":3:{s:6:\"locale\";s:5:\"en_US\";s:5:\"title\";s:42:\"WooCommerce Subscriptions security update!\";s:7:\"content\";s:736:\"We recently released an important security update to WooCommerce Subscriptions. To ensure your site\'s data is protected, please upgrade WooCommerce Subscriptions to version 3.0.15 or later.

Click the button below to view and update to the latest Subscriptions version, or log in to WooCommerce.com Dashboard and navigate to your Downloads page.

We recommend always using the latest version of WooCommerce Subscriptions, and other software running on your site, to ensure maximum security.

If you have any questions we are here to help — just open a ticket.\";}}s:7:\"actions\";a:1:{i:0;O:8:\"stdClass\":6:{s:4:\"name\";s:30:\"update-wc-subscriptions-3-0-15\";s:7:\"locales\";a:1:{i:0;O:8:\"stdClass\":2:{s:6:\"locale\";s:5:\"en_US\";s:5:\"label\";s:19:\"View latest version\";}}s:3:\"url\";s:30:\"&page=wc-addons§ion=helper\";s:18:\"url_is_admin_query\";b:1;s:10:\"is_primary\";b:1;s:6:\"status\";s:8:\"actioned\";}}s:5:\"rules\";a:1:{i:0;O:8:\"stdClass\":4:{s:4:\"type\";s:14:\"plugin_version\";s:6:\"plugin\";s:25:\"woocommerce-subscriptions\";s:8:\"operator\";s:1:\"<\";s:7:\"version\";s:6:\"3.0.15\";}}}}','yes'), +(304,'wc_remote_inbox_notifications_stored_state','O:8:\"stdClass\":2:{s:22:\"there_were_no_products\";b:1;s:22:\"there_are_now_products\";b:1;}','yes'), +(306,'wc_blocks_db_schema_version','260','yes'), +(307,'woocommerce_meta_box_errors','a:0:{}','yes'), +(311,'_transient_woocommerce_reports-transient-version','1613873993','yes'), +(321,'woocommerce_onboarding_profile','a:9:{s:12:\"setup_client\";b:0;s:8:\"industry\";a:1:{i:0;a:1:{s:4:\"slug\";s:5:\"other\";}}s:13:\"product_types\";a:2:{i:0;s:8:\"physical\";i:1;s:9:\"downloads\";}s:13:\"product_count\";s:6:\"11-100\";s:14:\"selling_venues\";s:2:\"no\";s:19:\"business_extensions\";a:0:{}s:5:\"theme\";s:10:\"storefront\";s:7:\"plugins\";s:7:\"skipped\";s:9:\"completed\";b:1;}','yes'), +(329,'theme_mods_twentytwentyone','a:1:{s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1613871732;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:8:\"search-2\";i:1;s:14:\"recent-posts-2\";i:2;s:17:\"recent-comments-2\";}s:9:\"sidebar-2\";a:3:{i:0;s:10:\"archives-2\";i:1;s:12:\"categories-2\";i:2;s:6:\"meta-2\";}}}}','yes'), +(330,'current_theme','Storefront','yes'), +(331,'theme_switched','','yes'), +(332,'theme_mods_storefront','a:2:{s:18:\"nav_menu_locations\";a:0:{}s:18:\"custom_css_post_id\";i:-1;}','yes'), +(333,'woocommerce_catalog_rows','4','yes'), +(334,'woocommerce_catalog_columns','3','yes'), +(335,'woocommerce_maybe_regenerate_images_hash','27acde77266b4d2a3491118955cb3f66','yes'), +(338,'storefront_nux_fresh_site','0','yes'), +(348,'woocommerce_task_list_tracked_completed_tasks','a:6:{i:0;s:13:\"store_details\";i:1;s:8:\"products\";i:2;s:8:\"payments\";i:3;s:3:\"tax\";i:4;s:8:\"shipping\";i:5;s:10:\"appearance\";}','yes'), +(353,'woocommerce_task_list_welcome_modal_dismissed','yes','yes'), +(355,'woocommerce_marketplace_suggestions','a:2:{s:11:\"suggestions\";a:27:{i:0;a:4:{s:4:\"slug\";s:28:\"product-edit-meta-tab-header\";s:7:\"context\";s:28:\"product-edit-meta-tab-header\";s:5:\"title\";s:22:\"Recommended extensions\";s:13:\"allow-dismiss\";b:0;}i:1;a:6:{s:4:\"slug\";s:39:\"product-edit-meta-tab-footer-browse-all\";s:7:\"context\";s:28:\"product-edit-meta-tab-footer\";s:9:\"link-text\";s:21:\"Browse all extensions\";s:3:\"url\";s:64:\"https://woocommerce.com/product-category/woocommerce-extensions/\";s:8:\"promoted\";s:31:\"category-woocommerce-extensions\";s:13:\"allow-dismiss\";b:0;}i:2;a:9:{s:4:\"slug\";s:46:\"product-edit-mailchimp-woocommerce-memberships\";s:7:\"product\";s:33:\"woocommerce-memberships-mailchimp\";s:14:\"show-if-active\";a:1:{i:0;s:23:\"woocommerce-memberships\";}s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:116:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/mailchimp-for-memberships.svg\";s:5:\"title\";s:25:\"Mailchimp for Memberships\";s:4:\"copy\";s:79:\"Completely automate your email lists by syncing membership changes to Mailchimp\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:67:\"https://woocommerce.com/products/mailchimp-woocommerce-memberships/\";}i:3;a:9:{s:4:\"slug\";s:19:\"product-edit-addons\";s:7:\"product\";s:26:\"woocommerce-product-addons\";s:14:\"show-if-active\";a:2:{i:0;s:25:\"woocommerce-subscriptions\";i:1;s:20:\"woocommerce-bookings\";}s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:106:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/product-add-ons.svg\";s:5:\"title\";s:15:\"Product Add-Ons\";s:4:\"copy\";s:93:\"Offer add-ons like gift wrapping, special messages or other special options for your products\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:49:\"https://woocommerce.com/products/product-add-ons/\";}i:4;a:9:{s:4:\"slug\";s:46:\"product-edit-woocommerce-subscriptions-gifting\";s:7:\"product\";s:33:\"woocommerce-subscriptions-gifting\";s:14:\"show-if-active\";a:1:{i:0;s:25:\"woocommerce-subscriptions\";}s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:116:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/gifting-for-subscriptions.svg\";s:5:\"title\";s:25:\"Gifting for Subscriptions\";s:4:\"copy\";s:70:\"Let customers buy subscriptions for others - they\'re the ultimate gift\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:67:\"https://woocommerce.com/products/woocommerce-subscriptions-gifting/\";}i:5;a:9:{s:4:\"slug\";s:42:\"product-edit-teams-woocommerce-memberships\";s:7:\"product\";s:33:\"woocommerce-memberships-for-teams\";s:14:\"show-if-active\";a:1:{i:0;s:23:\"woocommerce-memberships\";}s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:112:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/teams-for-memberships.svg\";s:5:\"title\";s:21:\"Teams for Memberships\";s:4:\"copy\";s:123:\"Adds B2B functionality to WooCommerce Memberships, allowing sites to sell team, group, corporate, or family member accounts\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:63:\"https://woocommerce.com/products/teams-woocommerce-memberships/\";}i:6;a:8:{s:4:\"slug\";s:29:\"product-edit-variation-images\";s:7:\"product\";s:39:\"woocommerce-additional-variation-images\";s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:118:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/additional-variation-images.svg\";s:5:\"title\";s:27:\"Additional Variation Images\";s:4:\"copy\";s:72:\"Showcase your products in the best light with a image for each variation\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:73:\"https://woocommerce.com/products/woocommerce-additional-variation-images/\";}i:7;a:9:{s:4:\"slug\";s:47:\"product-edit-woocommerce-subscription-downloads\";s:7:\"product\";s:34:\"woocommerce-subscription-downloads\";s:14:\"show-if-active\";a:1:{i:0;s:25:\"woocommerce-subscriptions\";}s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:113:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/subscription-downloads.svg\";s:5:\"title\";s:22:\"Subscription Downloads\";s:4:\"copy\";s:57:\"Give customers special downloads with their subscriptions\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:68:\"https://woocommerce.com/products/woocommerce-subscription-downloads/\";}i:8;a:8:{s:4:\"slug\";s:31:\"product-edit-min-max-quantities\";s:7:\"product\";s:30:\"woocommerce-min-max-quantities\";s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:109:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/min-max-quantities.svg\";s:5:\"title\";s:18:\"Min/Max Quantities\";s:4:\"copy\";s:81:\"Specify minimum and maximum allowed product quantities for orders to be completed\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:52:\"https://woocommerce.com/products/min-max-quantities/\";}i:9;a:8:{s:4:\"slug\";s:28:\"product-edit-name-your-price\";s:7:\"product\";s:27:\"woocommerce-name-your-price\";s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:106:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/name-your-price.svg\";s:5:\"title\";s:15:\"Name Your Price\";s:4:\"copy\";s:70:\"Let customers pay what they want - useful for donations, tips and more\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:49:\"https://woocommerce.com/products/name-your-price/\";}i:10;a:8:{s:4:\"slug\";s:42:\"product-edit-woocommerce-one-page-checkout\";s:7:\"product\";s:29:\"woocommerce-one-page-checkout\";s:7:\"context\";a:1:{i:0;s:26:\"product-edit-meta-tab-body\";}s:4:\"icon\";s:108:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/one-page-checkout.svg\";s:5:\"title\";s:17:\"One Page Checkout\";s:4:\"copy\";s:92:\"Don\'t make customers click around - let them choose products, checkout & pay all on one page\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:63:\"https://woocommerce.com/products/woocommerce-one-page-checkout/\";}i:11;a:4:{s:4:\"slug\";s:19:\"orders-empty-header\";s:7:\"context\";s:24:\"orders-list-empty-header\";s:5:\"title\";s:20:\"Tools for your store\";s:13:\"allow-dismiss\";b:0;}i:12;a:6:{s:4:\"slug\";s:30:\"orders-empty-footer-browse-all\";s:7:\"context\";s:24:\"orders-list-empty-footer\";s:9:\"link-text\";s:21:\"Browse all extensions\";s:3:\"url\";s:64:\"https://woocommerce.com/product-category/woocommerce-extensions/\";s:8:\"promoted\";s:31:\"category-woocommerce-extensions\";s:13:\"allow-dismiss\";b:0;}i:13;a:8:{s:4:\"slug\";s:19:\"orders-empty-wc-pay\";s:7:\"context\";s:22:\"orders-list-empty-body\";s:7:\"product\";s:20:\"woocommerce-payments\";s:4:\"icon\";s:111:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/woocommerce-payments.svg\";s:5:\"title\";s:20:\"WooCommerce Payments\";s:4:\"copy\";s:125:\"Securely accept payments and manage transactions directly from your WooCommerce dashboard – no setup costs or monthly fees.\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:54:\"https://woocommerce.com/products/woocommerce-payments/\";}i:14;a:8:{s:4:\"slug\";s:19:\"orders-empty-zapier\";s:7:\"context\";s:22:\"orders-list-empty-body\";s:7:\"product\";s:18:\"woocommerce-zapier\";s:4:\"icon\";s:97:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/zapier.svg\";s:5:\"title\";s:6:\"Zapier\";s:4:\"copy\";s:88:\"Save time and increase productivity by connecting your store to more than 1000+ services\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:52:\"https://woocommerce.com/products/woocommerce-zapier/\";}i:15;a:8:{s:4:\"slug\";s:30:\"orders-empty-shipment-tracking\";s:7:\"context\";s:22:\"orders-list-empty-body\";s:7:\"product\";s:29:\"woocommerce-shipment-tracking\";s:4:\"icon\";s:108:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/shipment-tracking.svg\";s:5:\"title\";s:17:\"Shipment Tracking\";s:4:\"copy\";s:86:\"Let customers know when their orders will arrive by adding shipment tracking to emails\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:51:\"https://woocommerce.com/products/shipment-tracking/\";}i:16;a:8:{s:4:\"slug\";s:32:\"orders-empty-table-rate-shipping\";s:7:\"context\";s:22:\"orders-list-empty-body\";s:7:\"product\";s:31:\"woocommerce-table-rate-shipping\";s:4:\"icon\";s:110:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/table-rate-shipping.svg\";s:5:\"title\";s:19:\"Table Rate Shipping\";s:4:\"copy\";s:122:\"Advanced, flexible shipping. Define multiple shipping rates based on location, price, weight, shipping class or item count\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:53:\"https://woocommerce.com/products/table-rate-shipping/\";}i:17;a:8:{s:4:\"slug\";s:40:\"orders-empty-shipping-carrier-extensions\";s:7:\"context\";s:22:\"orders-list-empty-body\";s:4:\"icon\";s:118:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/shipping-carrier-extensions.svg\";s:5:\"title\";s:27:\"Shipping Carrier Extensions\";s:4:\"copy\";s:116:\"Show live rates from FedEx, UPS, USPS and more directly on your store - never under or overcharge for shipping again\";s:11:\"button-text\";s:13:\"Find Carriers\";s:8:\"promoted\";s:26:\"category-shipping-carriers\";s:3:\"url\";s:99:\"https://woocommerce.com/product-category/woocommerce-extensions/shipping-methods/shipping-carriers/\";}i:18;a:8:{s:4:\"slug\";s:32:\"orders-empty-google-product-feed\";s:7:\"context\";s:22:\"orders-list-empty-body\";s:7:\"product\";s:25:\"woocommerce-product-feeds\";s:4:\"icon\";s:110:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/google-product-feed.svg\";s:5:\"title\";s:19:\"Google Product Feed\";s:4:\"copy\";s:76:\"Increase sales by letting customers find you when they\'re shopping on Google\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:53:\"https://woocommerce.com/products/google-product-feed/\";}i:19;a:4:{s:4:\"slug\";s:35:\"products-empty-header-product-types\";s:7:\"context\";s:26:\"products-list-empty-header\";s:5:\"title\";s:23:\"Other types of products\";s:13:\"allow-dismiss\";b:0;}i:20;a:6:{s:4:\"slug\";s:32:\"products-empty-footer-browse-all\";s:7:\"context\";s:26:\"products-list-empty-footer\";s:9:\"link-text\";s:21:\"Browse all extensions\";s:3:\"url\";s:64:\"https://woocommerce.com/product-category/woocommerce-extensions/\";s:8:\"promoted\";s:31:\"category-woocommerce-extensions\";s:13:\"allow-dismiss\";b:0;}i:21;a:8:{s:4:\"slug\";s:30:\"products-empty-product-vendors\";s:7:\"context\";s:24:\"products-list-empty-body\";s:7:\"product\";s:27:\"woocommerce-product-vendors\";s:4:\"icon\";s:106:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/product-vendors.svg\";s:5:\"title\";s:15:\"Product Vendors\";s:4:\"copy\";s:47:\"Turn your store into a multi-vendor marketplace\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:49:\"https://woocommerce.com/products/product-vendors/\";}i:22;a:8:{s:4:\"slug\";s:26:\"products-empty-memberships\";s:7:\"context\";s:24:\"products-list-empty-body\";s:7:\"product\";s:23:\"woocommerce-memberships\";s:4:\"icon\";s:102:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/memberships.svg\";s:5:\"title\";s:11:\"Memberships\";s:4:\"copy\";s:76:\"Give members access to restricted content or products, for a fee or for free\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:57:\"https://woocommerce.com/products/woocommerce-memberships/\";}i:23;a:9:{s:4:\"slug\";s:35:\"products-empty-woocommerce-deposits\";s:7:\"context\";s:24:\"products-list-empty-body\";s:7:\"product\";s:20:\"woocommerce-deposits\";s:14:\"show-if-active\";a:1:{i:0;s:20:\"woocommerce-bookings\";}s:4:\"icon\";s:99:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/deposits.svg\";s:5:\"title\";s:8:\"Deposits\";s:4:\"copy\";s:75:\"Make it easier for customers to pay by offering a deposit or a payment plan\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:54:\"https://woocommerce.com/products/woocommerce-deposits/\";}i:24;a:8:{s:4:\"slug\";s:40:\"products-empty-woocommerce-subscriptions\";s:7:\"context\";s:24:\"products-list-empty-body\";s:7:\"product\";s:25:\"woocommerce-subscriptions\";s:4:\"icon\";s:104:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/subscriptions.svg\";s:5:\"title\";s:13:\"Subscriptions\";s:4:\"copy\";s:97:\"Let customers subscribe to your products or services and pay on a weekly, monthly or annual basis\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:59:\"https://woocommerce.com/products/woocommerce-subscriptions/\";}i:25;a:8:{s:4:\"slug\";s:35:\"products-empty-woocommerce-bookings\";s:7:\"context\";s:24:\"products-list-empty-body\";s:7:\"product\";s:20:\"woocommerce-bookings\";s:4:\"icon\";s:99:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/bookings.svg\";s:5:\"title\";s:8:\"Bookings\";s:4:\"copy\";s:99:\"Allow customers to book appointments, make reservations or rent equipment without leaving your site\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:54:\"https://woocommerce.com/products/woocommerce-bookings/\";}i:26;a:8:{s:4:\"slug\";s:30:\"products-empty-product-bundles\";s:7:\"context\";s:24:\"products-list-empty-body\";s:7:\"product\";s:27:\"woocommerce-product-bundles\";s:4:\"icon\";s:106:\"https://woocommerce.com/wp-content/plugins/wccom-plugins/marketplace-suggestions/icons/product-bundles.svg\";s:5:\"title\";s:15:\"Product Bundles\";s:4:\"copy\";s:49:\"Offer customizable bundles and assembled products\";s:11:\"button-text\";s:10:\"Learn More\";s:3:\"url\";s:49:\"https://woocommerce.com/products/product-bundles/\";}}s:7:\"updated\";i:1621420206;}','no'), +(356,'_transient_product_query-transient-version','1621420125','yes'), +(357,'_transient_product-transient-version','1613871849','yes'), +(363,'product_cat_children','a:0:{}','yes'), +(369,'pa_color_children','a:0:{}','yes'), +(384,'_transient_shipping-transient-version','1622722833','yes'), +(389,'woocommerce_free_shipping_2_settings','a:4:{s:5:\"title\";s:13:\"Free shipping\";s:8:\"requires\";s:0:\"\";s:10:\"min_amount\";s:1:\"0\";s:16:\"ignore_discounts\";s:2:\"no\";}','yes'), +(390,'woocommerce_flat_rate_1_settings','a:3:{s:5:\"title\";s:9:\"Flat rate\";s:10:\"tax_status\";s:7:\"taxable\";s:4:\"cost\";s:2:\"50\";}','yes'), +(399,'woocommerce_bacs_settings','a:11:{s:7:\"enabled\";s:3:\"yes\";s:5:\"title\";s:20:\"Direct bank transfer\";s:11:\"description\";s:176:\"Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order will not be shipped until the funds have cleared in our account.\";s:12:\"instructions\";s:0:\"\";s:15:\"account_details\";s:0:\"\";s:12:\"account_name\";s:0:\"\";s:14:\"account_number\";s:0:\"\";s:9:\"sort_code\";s:0:\"\";s:9:\"bank_name\";s:0:\"\";s:4:\"iban\";s:0:\"\";s:3:\"bic\";s:0:\"\";}','yes'), +(400,'woocommerce_gateway_order','a:4:{s:4:\"bacs\";i:0;s:6:\"cheque\";i:1;s:3:\"cod\";i:2;s:6:\"paypal\";i:3;}','yes'), +(460,'WPML_Plugin__version','1.9.7','yes'), +(461,'redux_version_upgraded_from','3.6.12','yes'), +(462,'wpml_settings','a:9:{s:22:\"delete-on-deactivation\";i:0;s:23:\"can-see-submission-data\";s:14:\"manage_options\";s:28:\"datetimeformat-use-wordpress\";i:0;s:21:\"preferred-mail-format\";s:4:\"html\";s:12:\"display-host\";i:0;s:24:\"log-rotation-limit-amout\";i:0;s:29:\"log-rotation-limit-amout-keep\";i:75;s:24:\"log-rotation-delete-time\";i:0;s:29:\"log-rotation-delete-time-days\";i:30;}','yes'), +(463,'wpml_settings-transients','a:2:{s:14:\"changed_values\";a:0:{}s:9:\"last_save\";i:1613872694;}','yes'), +(502,'storefront_nux_guided_tour','1','yes'), +(516,'_transient_orders-transient-version','1613873985','yes'), +(525,'_transient_wc_count_comments','O:8:\"stdClass\":7:{s:14:\"total_comments\";i:1;s:3:\"all\";i:1;s:8:\"approved\";s:1:\"1\";s:9:\"moderated\";i:0;s:4:\"spam\";i:0;s:5:\"trash\";i:0;s:12:\"post-trashed\";i:0;}','yes'), +(550,'_transient_health-check-site-status-result','{\"good\":14,\"recommended\":5,\"critical\":1}','yes'), +(906,'woocommerce_task_list_appearance_complete','1','yes'), +(907,'woocommerce_demo_store_notice','','yes'), +(908,'woocommerce_task_list_complete','yes','yes'), +(909,'woocommerce_default_homepage_layout','two_columns','yes'), +(912,'woocommerce_task_list_hidden','yes','yes'), +(913,'woocommerce_task_list_prompt_shown','1','yes'), +(947,'https_detection_errors','a:1:{s:23:\"ssl_verification_failed\";a:1:{i:0;s:24:\"SSL verification failed.\";}}','yes'), +(972,'auto_core_update_notified','a:4:{s:4:\"type\";s:7:\"success\";s:5:\"email\";s:24:\"dev-email@flywheel.local\";s:7:\"version\";s:17:\"5.7.3-alpha-50911\";s:9:\"timestamp\";i:1621420100;}','no'), +(991,'_transient_timeout_wc_low_stock_count','1624012125','no'), +(992,'_transient_wc_low_stock_count','0','no'), +(993,'_transient_timeout_wc_outofstock_count','1624012125','no'), +(994,'_transient_wc_outofstock_count','1','no'), +(995,'_transient_is_multi_author','0','yes'), +(996,'_transient_timeout_wc_product_children_12','1624012125','no'), +(997,'_transient_wc_product_children_12','a:2:{s:3:\"all\";a:4:{i:0;i:13;i:1;i:14;i:2;i:15;i:3;i:16;}s:7:\"visible\";a:4:{i:0;i:13;i:1;i:14;i:2;i:15;i:3;i:16;}}','no'), +(998,'_transient_timeout_wc_var_prices_12','1624012125','no'), +(999,'_transient_wc_var_prices_12','{\"version\":\"1613871849\",\"f9e544f77b7eac7add281ef28ca5559f\":{\"price\":{\"13\":\"99.00\",\"14\":\"999.00\",\"15\":\"9999.00\",\"16\":\"99999.00\"},\"regular_price\":{\"13\":\"99.00\",\"14\":\"999.00\",\"15\":\"9999.00\",\"16\":\"99999.00\"},\"sale_price\":{\"13\":\"99.00\",\"14\":\"999.00\",\"15\":\"9999.00\",\"16\":\"99999.00\"}},\"5426960d23c94fafdd70656563f6a15f\":{\"price\":{\"13\":\"99.00\",\"14\":\"999.00\",\"15\":\"9999.00\",\"16\":\"99999.00\"},\"regular_price\":{\"13\":\"99.00\",\"14\":\"999.00\",\"15\":\"9999.00\",\"16\":\"99999.00\"},\"sale_price\":{\"13\":\"99.00\",\"14\":\"999.00\",\"15\":\"9999.00\",\"16\":\"99999.00\"}}}','no'), +(1006,'_transient_timeout_wc_featured_products','1624012127','no'), +(1007,'_transient_wc_featured_products','a:0:{}','no'), +(1008,'_transient_timeout_wc_products_onsale','1624012127','no'), +(1009,'_transient_wc_products_onsale','a:0:{}','no'), +(1010,'_transient_timeout_wc_product_loop_6147550c3f3af9236789687d89ed040c','1624012127','no'), +(1011,'_transient_wc_product_loop_6147550c3f3af9236789687d89ed040c','a:2:{s:7:\"version\";s:10:\"1621420125\";s:5:\"value\";O:8:\"stdClass\":5:{s:3:\"ids\";a:2:{i:0;i:31;i:1;i:30;}s:5:\"total\";i:2;s:11:\"total_pages\";i:1;s:8:\"per_page\";i:2;s:12:\"current_page\";i:1;}}','no'), +(1012,'_transient_timeout_wc_term_counts','1624012127','no'), +(1013,'_transient_wc_term_counts','a:7:{i:19;s:1:\"1\";i:20;s:1:\"1\";i:21;s:1:\"1\";i:16;s:1:\"1\";i:15;s:1:\"0\";i:17;s:1:\"1\";i:18;s:1:\"7\";}','no'), +(1014,'_transient_timeout_wc_product_loop_cd4ceb08a6a3e9bac7f4260a4e03a47f','1624012127','no'), +(1015,'_transient_wc_product_loop_cd4ceb08a6a3e9bac7f4260a4e03a47f','a:2:{s:7:\"version\";s:10:\"1621420125\";s:5:\"value\";O:8:\"stdClass\":5:{s:3:\"ids\";a:4:{i:0;i:22;i:1;i:23;i:2;i:26;i:3;i:27;}s:5:\"total\";i:4;s:11:\"total_pages\";i:1;s:8:\"per_page\";i:4;s:12:\"current_page\";i:1;}}','no'), +(1059,'woocommerce_admin_version','2.2.6','yes'), +(1060,'wc_remote_inbox_notifications_wca_updated','','yes'), +(1063,'_transient_wc_attribute_taxonomies','a:1:{i:0;O:8:\"stdClass\":6:{s:12:\"attribute_id\";s:1:\"1\";s:14:\"attribute_name\";s:5:\"color\";s:15:\"attribute_label\";s:5:\"color\";s:14:\"attribute_type\";s:6:\"select\";s:17:\"attribute_orderby\";s:10:\"menu_order\";s:16:\"attribute_public\";s:1:\"0\";}}','yes'), +(1069,'wc_admin_show_legacy_coupon_menu','0','yes'), +(1073,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-5.7.2.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-5.7.2.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-5.7.2-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-5.7.2-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:5:\"5.7.2\";s:7:\"version\";s:5:\"5.7.2\";s:11:\"php_version\";s:6:\"5.6.20\";s:13:\"mysql_version\";s:3:\"5.0\";s:11:\"new_bundled\";s:3:\"5.6\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1622719801;s:15:\"version_checked\";s:5:\"5.7.2\";s:12:\"translations\";a:0:{}}','no'), +(1092,'_transient_dirsize_cache','a:1011:{s:37:\"/app/public/wp-admin/css/colors/ocean\";i:75444;s:40:\"/app/public/wp-admin/css/colors/midnight\";i:77912;s:36:\"/app/public/wp-admin/css/colors/blue\";i:77947;s:39:\"/app/public/wp-admin/css/colors/sunrise\";i:77972;s:38:\"/app/public/wp-admin/css/colors/coffee\";i:75422;s:41:\"/app/public/wp-admin/css/colors/ectoplasm\";i:77953;s:37:\"/app/public/wp-admin/css/colors/light\";i:78535;s:38:\"/app/public/wp-admin/css/colors/modern\";i:78026;s:31:\"/app/public/wp-admin/css/colors\";i:642361;s:24:\"/app/public/wp-admin/css\";i:2459900;s:27:\"/app/public/wp-admin/images\";i:829649;s:31:\"/app/public/wp-admin/js/widgets\";i:139504;s:23:\"/app/public/wp-admin/js\";i:1887773;s:28:\"/app/public/wp-admin/network\";i:123297;s:29:\"/app/public/wp-admin/includes\";i:2847159;s:25:\"/app/public/wp-admin/user\";i:3418;s:26:\"/app/public/wp-admin/maint\";i:7260;s:20:\"/app/public/wp-admin\";i:9011931;s:36:\"/app/public/wp-includes/blocks/video\";i:1409;s:40:\"/app/public/wp-includes/blocks/tag-cloud\";i:324;s:39:\"/app/public/wp-includes/blocks/calendar\";i:234;s:38:\"/app/public/wp-includes/blocks/buttons\";i:354;s:36:\"/app/public/wp-includes/blocks/embed\";i:601;s:35:\"/app/public/wp-includes/blocks/file\";i:815;s:40:\"/app/public/wp-includes/blocks/paragraph\";i:695;s:36:\"/app/public/wp-includes/blocks/quote\";i:458;s:36:\"/app/public/wp-includes/blocks/group\";i:500;s:38:\"/app/public/wp-includes/blocks/classic\";i:0;s:40:\"/app/public/wp-includes/blocks/shortcode\";i:280;s:40:\"/app/public/wp-includes/blocks/separator\";i:323;s:38:\"/app/public/wp-includes/blocks/gallery\";i:1545;s:38:\"/app/public/wp-includes/blocks/heading\";i:1330;s:34:\"/app/public/wp-includes/blocks/rss\";i:712;s:35:\"/app/public/wp-includes/blocks/code\";i:251;s:36:\"/app/public/wp-includes/blocks/verse\";i:430;s:40:\"/app/public/wp-includes/blocks/pullquote\";i:656;s:35:\"/app/public/wp-includes/blocks/html\";i:273;s:37:\"/app/public/wp-includes/blocks/column\";i:327;s:39:\"/app/public/wp-includes/blocks/archives\";i:328;s:43:\"/app/public/wp-includes/blocks/social-links\";i:830;s:38:\"/app/public/wp-includes/blocks/missing\";i:387;s:37:\"/app/public/wp-includes/blocks/spacer\";i:253;s:42:\"/app/public/wp-includes/blocks/social-link\";i:439;s:36:\"/app/public/wp-includes/blocks/image\";i:1390;s:35:\"/app/public/wp-includes/blocks/more\";i:338;s:37:\"/app/public/wp-includes/blocks/search\";i:670;s:39:\"/app/public/wp-includes/blocks/nextpage\";i:235;s:43:\"/app/public/wp-includes/blocks/text-columns\";i:538;s:36:\"/app/public/wp-includes/blocks/audio\";i:791;s:37:\"/app/public/wp-includes/blocks/button\";i:1150;s:36:\"/app/public/wp-includes/blocks/table\";i:2449;s:35:\"/app/public/wp-includes/blocks/list\";i:661;s:43:\"/app/public/wp-includes/blocks/preformatted\";i:325;s:39:\"/app/public/wp-includes/blocks/freeform\";i:282;s:38:\"/app/public/wp-includes/blocks/columns\";i:360;s:46:\"/app/public/wp-includes/blocks/latest-comments\";i:539;s:43:\"/app/public/wp-includes/blocks/latest-posts\";i:1513;s:41:\"/app/public/wp-includes/blocks/media-text\";i:1661;s:41:\"/app/public/wp-includes/blocks/categories\";i:433;s:36:\"/app/public/wp-includes/blocks/block\";i:244;s:38:\"/app/public/wp-includes/blocks/subhead\";i:339;s:30:\"/app/public/wp-includes/blocks\";i:119336;s:27:\"/app/public/wp-includes/ID3\";i:1134191;s:33:\"/app/public/wp-includes/PHPMailer\";i:219649;s:37:\"/app/public/wp-includes/SimplePie/Net\";i:7493;s:39:\"/app/public/wp-includes/SimplePie/Cache\";i:39593;s:39:\"/app/public/wp-includes/SimplePie/Parse\";i:20551;s:46:\"/app/public/wp-includes/SimplePie/Content/Type\";i:8015;s:41:\"/app/public/wp-includes/SimplePie/Content\";i:8015;s:49:\"/app/public/wp-includes/SimplePie/XML/Declaration\";i:7098;s:37:\"/app/public/wp-includes/SimplePie/XML\";i:7098;s:45:\"/app/public/wp-includes/SimplePie/Decode/HTML\";i:17241;s:40:\"/app/public/wp-includes/SimplePie/Decode\";i:17241;s:38:\"/app/public/wp-includes/SimplePie/HTTP\";i:11515;s:33:\"/app/public/wp-includes/SimplePie\";i:455756;s:47:\"/app/public/wp-includes/css/dist/format-library\";i:11438;s:46:\"/app/public/wp-includes/css/dist/block-library\";i:514190;s:36:\"/app/public/wp-includes/css/dist/nux\";i:14076;s:48:\"/app/public/wp-includes/css/dist/block-directory\";i:19946;s:43:\"/app/public/wp-includes/css/dist/components\";i:491170;s:53:\"/app/public/wp-includes/css/dist/list-reusable-blocks\";i:16656;s:45:\"/app/public/wp-includes/css/dist/block-editor\";i:401180;s:42:\"/app/public/wp-includes/css/dist/edit-post\";i:195299;s:39:\"/app/public/wp-includes/css/dist/editor\";i:110295;s:32:\"/app/public/wp-includes/css/dist\";i:1774250;s:27:\"/app/public/wp-includes/css\";i:2412529;s:34:\"/app/public/wp-includes/images/wlw\";i:4413;s:38:\"/app/public/wp-includes/images/smilies\";i:10082;s:38:\"/app/public/wp-includes/images/crystal\";i:15541;s:36:\"/app/public/wp-includes/images/media\";i:2419;s:30:\"/app/public/wp-includes/images\";i:103747;s:37:\"/app/public/wp-includes/js/codemirror\";i:1287141;s:49:\"/app/public/wp-includes/js/tinymce/plugins/wpview\";i:8994;s:50:\"/app/public/wp-includes/js/tinymce/plugins/wpemoji\";i:5099;s:57:\"/app/public/wp-includes/js/tinymce/plugins/directionality\";i:2749;s:49:\"/app/public/wp-includes/js/tinymce/plugins/wplink\";i:26476;s:52:\"/app/public/wp-includes/js/tinymce/plugins/wordpress\";i:50606;s:52:\"/app/public/wp-includes/js/tinymce/plugins/wpdialogs\";i:3761;s:48:\"/app/public/wp-includes/js/tinymce/plugins/lists\";i:97383;s:52:\"/app/public/wp-includes/js/tinymce/plugins/textcolor\";i:16237;s:56:\"/app/public/wp-includes/js/tinymce/plugins/wptextpattern\";i:11927;s:48:\"/app/public/wp-includes/js/tinymce/plugins/image\";i:55874;s:55:\"/app/public/wp-includes/js/tinymce/plugins/compat3x/css\";i:8179;s:51:\"/app/public/wp-includes/js/tinymce/plugins/compat3x\";i:21758;s:51:\"/app/public/wp-includes/js/tinymce/plugins/tabfocus\";i:5336;s:55:\"/app/public/wp-includes/js/tinymce/plugins/wpautoresize\";i:8332;s:47:\"/app/public/wp-includes/js/tinymce/plugins/link\";i:32949;s:54:\"/app/public/wp-includes/js/tinymce/plugins/wpeditimage\";i:37716;s:50:\"/app/public/wp-includes/js/tinymce/plugins/charmap\";i:31811;s:54:\"/app/public/wp-includes/js/tinymce/plugins/colorpicker\";i:4910;s:45:\"/app/public/wp-includes/js/tinymce/plugins/hr\";i:1347;s:53:\"/app/public/wp-includes/js/tinymce/plugins/fullscreen\";i:7779;s:52:\"/app/public/wp-includes/js/tinymce/plugins/wpgallery\";i:4806;s:48:\"/app/public/wp-includes/js/tinymce/plugins/paste\";i:113193;s:48:\"/app/public/wp-includes/js/tinymce/plugins/media\";i:57914;s:42:\"/app/public/wp-includes/js/tinymce/plugins\";i:606957;s:57:\"/app/public/wp-includes/js/tinymce/skins/wordpress/images\";i:14207;s:50:\"/app/public/wp-includes/js/tinymce/skins/wordpress\";i:22831;s:54:\"/app/public/wp-includes/js/tinymce/skins/lightgray/img\";i:2856;s:56:\"/app/public/wp-includes/js/tinymce/skins/lightgray/fonts\";i:155760;s:50:\"/app/public/wp-includes/js/tinymce/skins/lightgray\";i:210254;s:40:\"/app/public/wp-includes/js/tinymce/skins\";i:233085;s:40:\"/app/public/wp-includes/js/tinymce/utils\";i:18822;s:40:\"/app/public/wp-includes/js/tinymce/langs\";i:15529;s:48:\"/app/public/wp-includes/js/tinymce/themes/inlite\";i:452642;s:48:\"/app/public/wp-includes/js/tinymce/themes/modern\";i:446221;s:41:\"/app/public/wp-includes/js/tinymce/themes\";i:898863;s:34:\"/app/public/wp-includes/js/tinymce\";i:2853643;s:32:\"/app/public/wp-includes/js/jcrop\";i:18340;s:38:\"/app/public/wp-includes/js/dist/vendor\";i:2543129;s:31:\"/app/public/wp-includes/js/dist\";i:13709894;s:36:\"/app/public/wp-includes/js/jquery/ui\";i:793452;s:33:\"/app/public/wp-includes/js/jquery\";i:1307925;s:31:\"/app/public/wp-includes/js/crop\";i:20004;s:49:\"/app/public/wp-includes/js/mediaelement/renderers\";i:18880;s:39:\"/app/public/wp-includes/js/mediaelement\";i:719405;s:36:\"/app/public/wp-includes/js/swfupload\";i:8715;s:35:\"/app/public/wp-includes/js/plupload\";i:487963;s:35:\"/app/public/wp-includes/js/thickbox\";i:31185;s:40:\"/app/public/wp-includes/js/imgareaselect\";i:49029;s:26:\"/app/public/wp-includes/js\";i:22869559;s:37:\"/app/public/wp-includes/random_compat\";i:40843;s:38:\"/app/public/wp-includes/block-patterns\";i:17482;s:36:\"/app/public/wp-includes/certificates\";i:234459;s:38:\"/app/public/wp-includes/block-supports\";i:14925;s:36:\"/app/public/wp-includes/theme-compat\";i:15414;s:42:\"/app/public/wp-includes/Requests/Transport\";i:27761;s:41:\"/app/public/wp-includes/Requests/Response\";i:2125;s:38:\"/app/public/wp-includes/Requests/Proxy\";i:3471;s:37:\"/app/public/wp-includes/Requests/Auth\";i:1941;s:39:\"/app/public/wp-includes/Requests/Cookie\";i:3818;s:52:\"/app/public/wp-includes/Requests/Exception/Transport\";i:918;s:47:\"/app/public/wp-includes/Requests/Exception/HTTP\";i:14334;s:42:\"/app/public/wp-includes/Requests/Exception\";i:16745;s:40:\"/app/public/wp-includes/Requests/Utility\";i:3393;s:32:\"/app/public/wp-includes/Requests\";i:136596;s:28:\"/app/public/wp-includes/pomo\";i:52183;s:42:\"/app/public/wp-includes/sitemaps/providers\";i:15133;s:32:\"/app/public/wp-includes/sitemaps\";i:45054;s:62:\"/app/public/wp-includes/sodium_compat/namespaced/Core/ChaCha20\";i:224;s:62:\"/app/public/wp-includes/sodium_compat/namespaced/Core/Poly1305\";i:112;s:67:\"/app/public/wp-includes/sodium_compat/namespaced/Core/Curve25519/Ge\";i:602;s:64:\"/app/public/wp-includes/sodium_compat/namespaced/Core/Curve25519\";i:820;s:53:\"/app/public/wp-includes/sodium_compat/namespaced/Core\";i:2444;s:48:\"/app/public/wp-includes/sodium_compat/namespaced\";i:2698;s:41:\"/app/public/wp-includes/sodium_compat/lib\";i:76084;s:61:\"/app/public/wp-includes/sodium_compat/src/Core32/SecretStream\";i:3656;s:57:\"/app/public/wp-includes/sodium_compat/src/Core32/ChaCha20\";i:6295;s:57:\"/app/public/wp-includes/sodium_compat/src/Core32/Poly1305\";i:15980;s:62:\"/app/public/wp-includes/sodium_compat/src/Core32/Curve25519/Ge\";i:8177;s:59:\"/app/public/wp-includes/sodium_compat/src/Core32/Curve25519\";i:122399;s:48:\"/app/public/wp-includes/sodium_compat/src/Core32\";i:437457;s:59:\"/app/public/wp-includes/sodium_compat/src/Core/SecretStream\";i:3624;s:53:\"/app/public/wp-includes/sodium_compat/src/Core/Base64\";i:22135;s:55:\"/app/public/wp-includes/sodium_compat/src/Core/ChaCha20\";i:5152;s:55:\"/app/public/wp-includes/sodium_compat/src/Core/Poly1305\";i:12912;s:60:\"/app/public/wp-includes/sodium_compat/src/Core/Curve25519/Ge\";i:7881;s:57:\"/app/public/wp-includes/sodium_compat/src/Core/Curve25519\";i:119831;s:46:\"/app/public/wp-includes/sodium_compat/src/Core\";i:388928;s:47:\"/app/public/wp-includes/sodium_compat/src/PHP52\";i:4116;s:41:\"/app/public/wp-includes/sodium_compat/src\";i:1128619;s:37:\"/app/public/wp-includes/sodium_compat\";i:1213152;s:42:\"/app/public/wp-includes/Text/Diff/Renderer\";i:5535;s:40:\"/app/public/wp-includes/Text/Diff/Engine\";i:31662;s:33:\"/app/public/wp-includes/Text/Diff\";i:44010;s:28:\"/app/public/wp-includes/Text\";i:56925;s:27:\"/app/public/wp-includes/IXR\";i:33999;s:29:\"/app/public/wp-includes/fonts\";i:289826;s:30:\"/app/public/wp-includes/assets\";i:9253;s:31:\"/app/public/wp-includes/widgets\";i:148359;s:42:\"/app/public/wp-includes/rest-api/endpoints\";i:497137;s:39:\"/app/public/wp-includes/rest-api/search\";i:15180;s:39:\"/app/public/wp-includes/rest-api/fields\";i:22171;s:32:\"/app/public/wp-includes/rest-api\";i:617757;s:33:\"/app/public/wp-includes/customize\";i:170161;s:23:\"/app/public/wp-includes\";i:36546748;s:30:\"/app/public/wp-content/upgrade\";i:0;s:22:\"/app/public/wp-content\";i:28;s:11:\"/app/public\";i:45726143;s:49:\"/app/public/wp-content/themes/twentyseventeen/inc\";i:64910;s:67:\"/app/public/wp-content/themes/twentyseventeen/template-parts/footer\";i:1343;s:65:\"/app/public/wp-content/themes/twentyseventeen/template-parts/page\";i:4622;s:65:\"/app/public/wp-content/themes/twentyseventeen/template-parts/post\";i:14277;s:71:\"/app/public/wp-content/themes/twentyseventeen/template-parts/navigation\";i:1039;s:67:\"/app/public/wp-content/themes/twentyseventeen/template-parts/header\";i:1627;s:60:\"/app/public/wp-content/themes/twentyseventeen/template-parts\";i:22908;s:56:\"/app/public/wp-content/themes/twentyseventeen/assets/css\";i:63636;s:59:\"/app/public/wp-content/themes/twentyseventeen/assets/images\";i:1264875;s:55:\"/app/public/wp-content/themes/twentyseventeen/assets/js\";i:33997;s:52:\"/app/public/wp-content/themes/twentyseventeen/assets\";i:1362508;s:45:\"/app/public/wp-content/themes/twentyseventeen\";i:1952319;s:47:\"/app/public/wp-content/themes/twentysixteen/inc\";i:50492;s:54:\"/app/public/wp-content/themes/twentysixteen/genericons\";i:193943;s:47:\"/app/public/wp-content/themes/twentysixteen/css\";i:37772;s:46:\"/app/public/wp-content/themes/twentysixteen/js\";i:23275;s:58:\"/app/public/wp-content/themes/twentysixteen/template-parts\";i:8127;s:43:\"/app/public/wp-content/themes/twentysixteen\";i:906676;s:53:\"/app/public/wp-content/themes/twentyeleven/inc/images\";i:11200;s:46:\"/app/public/wp-content/themes/twentyeleven/inc\";i:42785;s:57:\"/app/public/wp-content/themes/twentyeleven/images/headers\";i:531666;s:49:\"/app/public/wp-content/themes/twentyeleven/images\";i:538331;s:45:\"/app/public/wp-content/themes/twentyeleven/js\";i:2909;s:52:\"/app/public/wp-content/themes/twentyeleven/languages\";i:15786;s:49:\"/app/public/wp-content/themes/twentyeleven/colors\";i:13254;s:42:\"/app/public/wp-content/themes/twentyeleven\";i:1252100;s:48:\"/app/public/wp-content/themes/twentythirteen/inc\";i:8982;s:60:\"/app/public/wp-content/themes/twentythirteen/genericons/font\";i:99552;s:55:\"/app/public/wp-content/themes/twentythirteen/genericons\";i:174221;s:48:\"/app/public/wp-content/themes/twentythirteen/css\";i:45666;s:59:\"/app/public/wp-content/themes/twentythirteen/images/headers\";i:84621;s:51:\"/app/public/wp-content/themes/twentythirteen/images\";i:86203;s:47:\"/app/public/wp-content/themes/twentythirteen/js\";i:8330;s:44:\"/app/public/wp-content/themes/twentythirteen\";i:640804;s:48:\"/app/public/wp-content/themes/twentynineteen/inc\";i:51888;s:51:\"/app/public/wp-content/themes/twentynineteen/images\";i:210233;s:52:\"/app/public/wp-content/themes/twentynineteen/classes\";i:65503;s:47:\"/app/public/wp-content/themes/twentynineteen/js\";i:18021;s:66:\"/app/public/wp-content/themes/twentynineteen/template-parts/footer\";i:528;s:64:\"/app/public/wp-content/themes/twentynineteen/template-parts/post\";i:1689;s:67:\"/app/public/wp-content/themes/twentynineteen/template-parts/content\";i:6366;s:66:\"/app/public/wp-content/themes/twentynineteen/template-parts/header\";i:2987;s:59:\"/app/public/wp-content/themes/twentynineteen/template-parts\";i:11570;s:50:\"/app/public/wp-content/themes/twentynineteen/fonts\";i:1976;s:56:\"/app/public/wp-content/themes/twentynineteen/sass/blocks\";i:20572;s:55:\"/app/public/wp-content/themes/twentynineteen/sass/forms\";i:1804;s:56:\"/app/public/wp-content/themes/twentynineteen/sass/mixins\";i:3747;s:56:\"/app/public/wp-content/themes/twentynineteen/sass/layout\";i:87;s:60:\"/app/public/wp-content/themes/twentynineteen/sass/navigation\";i:13621;s:58:\"/app/public/wp-content/themes/twentynineteen/sass/elements\";i:1614;s:60:\"/app/public/wp-content/themes/twentynineteen/sass/typography\";i:3848;s:61:\"/app/public/wp-content/themes/twentynineteen/sass/site/footer\";i:908;s:61:\"/app/public/wp-content/themes/twentynineteen/sass/site/header\";i:8128;s:62:\"/app/public/wp-content/themes/twentynineteen/sass/site/primary\";i:12552;s:64:\"/app/public/wp-content/themes/twentynineteen/sass/site/secondary\";i:1524;s:54:\"/app/public/wp-content/themes/twentynineteen/sass/site\";i:24020;s:57:\"/app/public/wp-content/themes/twentynineteen/sass/modules\";i:1785;s:55:\"/app/public/wp-content/themes/twentynineteen/sass/media\";i:2392;s:64:\"/app/public/wp-content/themes/twentynineteen/sass/variables-site\";i:8527;s:49:\"/app/public/wp-content/themes/twentynineteen/sass\";i:88003;s:44:\"/app/public/wp-content/themes/twentynineteen\";i:1319305;s:56:\"/app/public/wp-content/themes/storefront/inc/woocommerce\";i:69731;s:55:\"/app/public/wp-content/themes/storefront/inc/customizer\";i:42350;s:50:\"/app/public/wp-content/themes/storefront/inc/admin\";i:15215;s:48:\"/app/public/wp-content/themes/storefront/inc/nux\";i:58518;s:52:\"/app/public/wp-content/themes/storefront/inc/jetpack\";i:3344;s:44:\"/app/public/wp-content/themes/storefront/inc\";i:233388;s:50:\"/app/public/wp-content/themes/storefront/languages\";i:24032;s:74:\"/app/public/wp-content/themes/storefront/assets/css/woocommerce/extensions\";i:95937;s:63:\"/app/public/wp-content/themes/storefront/assets/css/woocommerce\";i:212376;s:68:\"/app/public/wp-content/themes/storefront/assets/css/admin/customizer\";i:9462;s:72:\"/app/public/wp-content/themes/storefront/assets/css/admin/welcome-screen\";i:13238;s:57:\"/app/public/wp-content/themes/storefront/assets/css/admin\";i:31553;s:59:\"/app/public/wp-content/themes/storefront/assets/css/jetpack\";i:894;s:56:\"/app/public/wp-content/themes/storefront/assets/css/base\";i:256004;s:51:\"/app/public/wp-content/themes/storefront/assets/css\";i:500827;s:67:\"/app/public/wp-content/themes/storefront/assets/images/credit-cards\";i:65575;s:74:\"/app/public/wp-content/themes/storefront/assets/images/customizer/controls\";i:1190;s:90:\"/app/public/wp-content/themes/storefront/assets/images/customizer/starter-content/products\";i:510377;s:92:\"/app/public/wp-content/themes/storefront/assets/images/customizer/starter-content/categories\";i:309847;s:81:\"/app/public/wp-content/themes/storefront/assets/images/customizer/starter-content\";i:1251687;s:65:\"/app/public/wp-content/themes/storefront/assets/images/customizer\";i:1252877;s:75:\"/app/public/wp-content/themes/storefront/assets/images/admin/welcome-screen\";i:197408;s:60:\"/app/public/wp-content/themes/storefront/assets/images/admin\";i:200326;s:54:\"/app/public/wp-content/themes/storefront/assets/images\";i:1518778;s:73:\"/app/public/wp-content/themes/storefront/assets/js/woocommerce/extensions\";i:1641;s:62:\"/app/public/wp-content/themes/storefront/assets/js/woocommerce\";i:3239;s:56:\"/app/public/wp-content/themes/storefront/assets/js/admin\";i:12971;s:50:\"/app/public/wp-content/themes/storefront/assets/js\";i:34912;s:53:\"/app/public/wp-content/themes/storefront/assets/fonts\";i:2876964;s:47:\"/app/public/wp-content/themes/storefront/assets\";i:4931481;s:40:\"/app/public/wp-content/themes/storefront\";i:5719155;s:47:\"/app/public/wp-content/themes/twentyfifteen/inc\";i:42497;s:54:\"/app/public/wp-content/themes/twentyfifteen/genericons\";i:192214;s:47:\"/app/public/wp-content/themes/twentyfifteen/css\";i:54212;s:46:\"/app/public/wp-content/themes/twentyfifteen/js\";i:11877;s:43:\"/app/public/wp-content/themes/twentyfifteen\";i:1037418;s:49:\"/app/public/wp-content/themes/twentytwentyone/inc\";i:62695;s:53:\"/app/public/wp-content/themes/twentytwentyone/classes\";i:78406;s:67:\"/app/public/wp-content/themes/twentytwentyone/template-parts/footer\";i:307;s:65:\"/app/public/wp-content/themes/twentytwentyone/template-parts/post\";i:1148;s:68:\"/app/public/wp-content/themes/twentytwentyone/template-parts/content\";i:6469;s:68:\"/app/public/wp-content/themes/twentytwentyone/template-parts/excerpt\";i:4682;s:67:\"/app/public/wp-content/themes/twentytwentyone/template-parts/header\";i:4252;s:60:\"/app/public/wp-content/themes/twentytwentyone/template-parts\";i:16858;s:56:\"/app/public/wp-content/themes/twentytwentyone/assets/css\";i:315967;s:59:\"/app/public/wp-content/themes/twentytwentyone/assets/images\";i:2128437;s:55:\"/app/public/wp-content/themes/twentytwentyone/assets/js\";i:19245;s:69:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/04-elements\";i:12298;s:66:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/02-tools\";i:6931;s:71:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/06-components\";i:36019;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/video\";i:324;s:72:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/file\";i:675;s:77:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/paragraph\";i:497;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/quote\";i:5726;s:80:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/social-icons\";i:615;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/group\";i:3040;s:77:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/separator\";i:2204;s:75:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/gallery\";i:801;s:75:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/heading\";i:2977;s:78:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/tag-clould\";i:201;s:71:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/rss\";i:5502;s:72:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/code\";i:537;s:78:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/navigation\";i:3141;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/verse\";i:127;s:74:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/legacy\";i:1192;s:77:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/pullquote\";i:4215;s:72:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/html\";i:223;s:74:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/spacer\";i:227;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/image\";i:1868;s:74:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/search\";i:5410;s:77:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/utilities\";i:7640;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/audio\";i:113;s:74:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/button\";i:5853;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/table\";i:2937;s:72:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/list\";i:1061;s:80:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/preformatted\";i:189;s:75:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/columns\";i:3506;s:83:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/latest-comments\";i:815;s:80:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/latest-posts\";i:8365;s:78:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/media-text\";i:1389;s:73:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks/cover\";i:4533;s:67:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/05-blocks\";i:78368;s:69:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/01-settings\";i:11555;s:68:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/03-generic\";i:15865;s:70:\"/app/public/wp-content/themes/twentytwentyone/assets/sass/07-utilities\";i:13585;s:57:\"/app/public/wp-content/themes/twentytwentyone/assets/sass\";i:182764;s:52:\"/app/public/wp-content/themes/twentytwentyone/assets\";i:2646413;s:45:\"/app/public/wp-content/themes/twentytwentyone\";i:3614369;s:48:\"/app/public/wp-content/themes/twentyfourteen/inc\";i:47338;s:60:\"/app/public/wp-content/themes/twentyfourteen/genericons/font\";i:99552;s:55:\"/app/public/wp-content/themes/twentyfourteen/genericons\";i:174221;s:48:\"/app/public/wp-content/themes/twentyfourteen/css\";i:55968;s:51:\"/app/public/wp-content/themes/twentyfourteen/images\";i:1694;s:47:\"/app/public/wp-content/themes/twentyfourteen/js\";i:29059;s:59:\"/app/public/wp-content/themes/twentyfourteen/page-templates\";i:2235;s:44:\"/app/public/wp-content/themes/twentyfourteen\";i:1417757;s:46:\"/app/public/wp-content/themes/twentytwelve/inc\";i:4700;s:46:\"/app/public/wp-content/themes/twentytwelve/css\";i:27630;s:45:\"/app/public/wp-content/themes/twentytwelve/js\";i:6065;s:57:\"/app/public/wp-content/themes/twentytwelve/page-templates\";i:1845;s:42:\"/app/public/wp-content/themes/twentytwelve\";i:477472;s:54:\"/app/public/wp-content/themes/twentyten/images/headers\";i:423210;s:46:\"/app/public/wp-content/themes/twentyten/images\";i:424004;s:49:\"/app/public/wp-content/themes/twentyten/languages\";i:8832;s:39:\"/app/public/wp-content/themes/twentyten\";i:989034;s:46:\"/app/public/wp-content/themes/twentytwenty/inc\";i:55406;s:50:\"/app/public/wp-content/themes/twentytwenty/classes\";i:100891;s:57:\"/app/public/wp-content/themes/twentytwenty/template-parts\";i:22791;s:52:\"/app/public/wp-content/themes/twentytwenty/templates\";i:690;s:53:\"/app/public/wp-content/themes/twentytwenty/assets/css\";i:113279;s:56:\"/app/public/wp-content/themes/twentytwenty/assets/images\";i:48358;s:52:\"/app/public/wp-content/themes/twentytwenty/assets/js\";i:41414;s:61:\"/app/public/wp-content/themes/twentytwenty/assets/fonts/inter\";i:460724;s:55:\"/app/public/wp-content/themes/twentytwenty/assets/fonts\";i:460724;s:49:\"/app/public/wp-content/themes/twentytwenty/assets\";i:663775;s:42:\"/app/public/wp-content/themes/twentytwenty\";i:1821941;s:29:\"/app/public/wp-content/themes\";i:21148378;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/blocks\";i:2122;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/wccom-site/rest-api/endpoints\";i:4785;s:71:\"/app/public/wp-content/plugins/woocommerce/includes/wccom-site/rest-api\";i:6784;s:62:\"/app/public/wp-content/plugins/woocommerce/includes/wccom-site\";i:32736;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/traits\";i:2124;s:62:\"/app/public/wp-content/plugins/woocommerce/includes/customizer\";i:30992;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/emails\";i:95268;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/theme-support\";i:21670;s:72:\"/app/public/wp-content/plugins/woocommerce/includes/admin/settings/views\";i:48064;s:66:\"/app/public/wp-content/plugins/woocommerce/includes/admin/settings\";i:150449;s:76:\"/app/public/wp-content/plugins/woocommerce/includes/admin/importers/mappings\";i:9046;s:73:\"/app/public/wp-content/plugins/woocommerce/includes/admin/importers/views\";i:11969;s:67:\"/app/public/wp-content/plugins/woocommerce/includes/admin/importers\";i:55554;s:69:\"/app/public/wp-content/plugins/woocommerce/includes/admin/list-tables\";i:67301;s:63:\"/app/public/wp-content/plugins/woocommerce/includes/admin/notes\";i:10318;s:91:\"/app/public/wp-content/plugins/woocommerce/includes/admin/marketplace-suggestions/templates\";i:1574;s:87:\"/app/public/wp-content/plugins/woocommerce/includes/admin/marketplace-suggestions/views\";i:287;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/admin/marketplace-suggestions\";i:10040;s:78:\"/app/public/wp-content/plugins/woocommerce/includes/admin/plugin-updates/views\";i:2685;s:72:\"/app/public/wp-content/plugins/woocommerce/includes/admin/plugin-updates\";i:18364;s:63:\"/app/public/wp-content/plugins/woocommerce/includes/admin/views\";i:117727;s:70:\"/app/public/wp-content/plugins/woocommerce/includes/admin/helper/views\";i:13968;s:64:\"/app/public/wp-content/plugins/woocommerce/includes/admin/helper\";i:95305;s:74:\"/app/public/wp-content/plugins/woocommerce/includes/admin/meta-boxes/views\";i:116202;s:68:\"/app/public/wp-content/plugins/woocommerce/includes/admin/meta-boxes\";i:195682;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/admin/reports\";i:165092;s:57:\"/app/public/wp-content/plugins/woocommerce/includes/admin\";i:1370304;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/legacy/api/v1\";i:119753;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/legacy/api/v2\";i:257264;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/legacy/api/v3\";i:315322;s:62:\"/app/public/wp-content/plugins/woocommerce/includes/legacy/api\";i:730134;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/legacy\";i:816598;s:61:\"/app/public/wp-content/plugins/woocommerce/includes/libraries\";i:26598;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/tracks/events\";i:30696;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/tracks\";i:51512;s:79:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/flat-rate/includes\";i:3407;s:70:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/flat-rate\";i:11337;s:74:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/free-shipping\";i:7101;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/legacy-free-shipping\";i:7209;s:80:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/legacy-local-pickup\";i:6892;s:82:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/legacy-local-delivery\";i:5881;s:73:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/local-pickup\";i:2807;s:90:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/legacy-international-delivery\";i:2643;s:86:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/legacy-flat-rate/includes\";i:5093;s:77:\"/app/public/wp-content/plugins/woocommerce/includes/shipping/legacy-flat-rate\";i:17092;s:60:\"/app/public/wp-content/plugins/woocommerce/includes/shipping\";i:60962;s:55:\"/app/public/wp-content/plugins/woocommerce/includes/cli\";i:27351;s:62:\"/app/public/wp-content/plugins/woocommerce/includes/shortcodes\";i:49906;s:90:\"/app/public/wp-content/plugins/woocommerce/includes/integrations/maxmind-geolocation/views\";i:839;s:84:\"/app/public/wp-content/plugins/woocommerce/includes/integrations/maxmind-geolocation\";i:14887;s:64:\"/app/public/wp-content/plugins/woocommerce/includes/integrations\";i:14887;s:61:\"/app/public/wp-content/plugins/woocommerce/includes/abstracts\";i:244666;s:59:\"/app/public/wp-content/plugins/woocommerce/includes/walkers\";i:8177;s:64:\"/app/public/wp-content/plugins/woocommerce/includes/log-handlers\";i:22617;s:63:\"/app/public/wp-content/plugins/woocommerce/includes/data-stores\";i:318175;s:67:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/cheque\";i:4350;s:76:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/paypal/includes\";i:53062;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/paypal/assets/images\";i:2454;s:77:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/paypal/assets/js\";i:2566;s:74:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/paypal/assets\";i:5020;s:67:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/paypal\";i:74725;s:65:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/bacs\";i:14236;s:64:\"/app/public/wp-content/plugins/woocommerce/includes/gateways/cod\";i:12933;s:60:\"/app/public/wp-content/plugins/woocommerce/includes/gateways\";i:112515;s:57:\"/app/public/wp-content/plugins/woocommerce/includes/queue\";i:8897;s:66:\"/app/public/wp-content/plugins/woocommerce/includes/payment-tokens\";i:6598;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/export\";i:37870;s:58:\"/app/public/wp-content/plugins/woocommerce/includes/import\";i:53852;s:59:\"/app/public/wp-content/plugins/woocommerce/includes/widgets\";i:62193;s:70:\"/app/public/wp-content/plugins/woocommerce/includes/rest-api/Utilities\";i:2852;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version1\";i:393825;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version3\";i:328437;s:81:\"/app/public/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version2\";i:421250;s:72:\"/app/public/wp-content/plugins/woocommerce/includes/rest-api/Controllers\";i:1143512;s:60:\"/app/public/wp-content/plugins/woocommerce/includes/rest-api\";i:1156427;s:62:\"/app/public/wp-content/plugins/woocommerce/includes/interfaces\";i:36401;s:51:\"/app/public/wp-content/plugins/woocommerce/includes\";i:6644204;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/storybook\";i:4852;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/docker/wc-admin-php-test-suite\";i:2537;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/docker/wc-admin-wp-env\";i:684;s:76:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/docker\";i:3221;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/print-shipping-label-banner\";i:9865;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/wp-admin-scripts\";i:277137;s:78:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/app\";i:270785;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/customer-effort-score\";i:31246;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/date\";i:36994;s:103:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/beta-features-tracking-modal\";i:2932;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/navigation\";i:55168;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/tracks\";i:43880;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/navigation-opt-out\";i:2782;s:82:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/notices\";i:23018;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/csv-export\";i:24559;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/number\";i:30489;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/chunks\";i:1262332;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/components\";i:996447;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/marketing-coupons\";i:18640;s:77:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/ie\";i:25089;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/data\";i:140565;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist/currency\";i:28183;s:74:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/dist\";i:3280111;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/images/marketing\";i:19653;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/images/onboarding\";i:190288;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/images/admin_notes\";i:18641;s:76:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/images\";i:234323;s:77:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/typings\";i:41;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/includes/emails\";i:3687;s:78:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/includes\";i:20703;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/languages\";i:235729;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/automattic/jetpack-autoloader/src\";i:79889;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/automattic/jetpack-autoloader\";i:79889;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/automattic\";i:79889;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/composer/installers/src/Composer/Installers\";i:73900;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/composer/installers/src/Composer\";i:73900;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/composer/installers/src\";i:74368;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/composer/installers\";i:75643;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/composer\";i:100954;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor/jetpack-autoloader\";i:49628;s:76:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/vendor\";i:230966;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Overrides\";i:10835;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/DateTimeProvider\";i:885;s:82:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Composer\";i:3696;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Features/Navigation\";i:46952;s:82:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Features\";i:166093;s:89:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/PluginsProvider\";i:2800;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Notes/MerchantEmailNotifications\";i:8306;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Notes\";i:194216;s:98:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/RemoteInboxNotifications\";i:51706;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Templates\";i:4671;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Customers/Stats\";i:21635;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Customers\";i:75100;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Products/Stats\";i:35248;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Products\";i:68569;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Variations/Stats\";i:36021;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Variations\";i:65856;s:99:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Coupons/Stats\";i:37322;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Coupons\";i:64979;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Taxes/Stats\";i:29516;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Taxes\";i:51999;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/PerformanceIndicators\";i:19704;s:98:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Orders/Stats\";i:68653;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Orders\";i:108414;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Export\";i:6852;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Stock/Stats\";i:8673;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Stock\";i:26854;s:99:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Revenue/Stats\";i:15433;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Revenue\";i:17033;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Import\";i:8857;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Downloads/Files\";i:581;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Downloads/Stats\";i:21084;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Downloads\";i:49627;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports/Categories\";i:24103;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API/Reports\";i:697148;s:77:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/API\";i:890052;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Marketing\";i:7132;s:84:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src/Schedulers\";i:27498;s:73:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin/src\";i:1484746;s:69:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-admin\";i:5614778;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/prices/utils/test\";i:902;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/prices/utils\";i:4621;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/prices\";i:4842;s:99:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/order-meta\";i:575;s:112:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/order-shipping-packages\";i:977;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/panel\";i:2788;s:103:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/error-boundary\";i:864;s:105:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/utils/validation\";i:1130;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/utils\";i:1160;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/registry/test\";i:3741;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/registry\";i:6207;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/slot\";i:3290;s:112:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/subtotal/stories\";i:612;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/subtotal\";i:1750;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/fees/stories\";i:676;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/fees\";i:1968;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/item/stories\";i:683;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/item\";i:2607;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/taxes/stories\";i:529;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals/taxes\";i:2052;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout/totals\";i:8573;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages/checkout\";i:24817;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/packages\";i:29659;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/templates/emails/plain\";i:1562;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/templates/emails\";i:3009;s:80:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/templates\";i:3009;s:168:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/build/atomic-block-components/add-to-cart--atomic-block-components/image--atomic-block-components\";i:550;s:169:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/build/atomic-block-components/add-to-cart--atomic-block-components/button--atomic-block-components\";i:5530;s:137:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/build/atomic-block-components/add-to-cart--atomic-block-components\";i:13331;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/build/atomic-block-components\";i:123154;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/build/vendors--atomic-block-components\";i:18337;s:76:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/build\";i:4558949;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/css/abstracts\";i:7623;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/css\";i:16040;s:99:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-new\";i:4013;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/sidebar\";i:2258;s:128:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/form/phone-number\";i:850;s:127:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/form/order-notes\";i:2374;s:139:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/form/no-shipping-placeholder\";i:1495;s:115:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/form\";i:20467;s:121:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/empty-cart\";i:978;s:131:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout/checkout-order-error\";i:3685;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/checkout\";i:49388;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/cart/test\";i:3089;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/cart/checkout-button\";i:3966;s:116:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/cart/full-cart\";i:20273;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/cart/empty-cart-edit\";i:3398;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/cart\";i:42589;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/payment-methods/test\";i:3235;s:133:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/payment-methods/express-payment\";i:6739;s:136:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/payment-methods/no-payment-methods\";i:2545;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout/payment-methods\";i:33096;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/cart-checkout\";i:125073;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/products/all-products\";i:13812;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/products\";i:18829;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-categories\";i:9746;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/products-by-attribute\";i:7484;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-search\";i:8187;s:99:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-tag\";i:9706;s:105:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-top-rated\";i:4045;s:105:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/price-filter/test\";i:2611;s:100:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/price-filter\";i:16187;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/active-filters\";i:15557;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-category\";i:9135;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/featured-product\";i:19893;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-best-sellers\";i:4090;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/single-product/edit\";i:7829;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/single-product\";i:12604;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/attribute-filter\";i:24242;s:105:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/featured-category\";i:17270;s:103:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/product-on-sale\";i:5080;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/handpicked-products\";i:7024;s:115:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/reviews/reviews-by-category\";i:7208;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/reviews/all-reviews\";i:4239;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/reviews/reviews-by-product\";i:7642;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks/reviews\";i:37897;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks\";i:356062;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/filters\";i:5101;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/middleware\";i:4228;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/settings/blocks\";i:6046;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/settings/shared/test\";i:1433;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/settings/shared\";i:9723;s:89:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/settings\";i:15769;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/cheque\";i:1353;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/paypal\";i:1266;s:127:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/bacs\";i:1370;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/cod\";i:2687;s:145:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/stripe/payment-request\";i:23880;s:141:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/stripe/credit-card\";i:22170;s:142:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/stripe/stripe-utils\";i:35336;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods/stripe\";i:81985;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions/payment-methods\";i:88661;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/payment-method-extensions\";i:88661;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks-registry/block-components/test\";i:2647;s:113:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks-registry/block-components\";i:8452;s:112:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks-registry/payment-methods\";i:10708;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/blocks-registry\";i:19231;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/legacy/base/hocs\";i:53;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/legacy/base\";i:53;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/legacy\";i:53;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/utils/test\";i:5686;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/utils\";i:14068;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/shared/context\";i:3046;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/shared/hocs\";i:2007;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/shared\";i:5053;s:127:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/stock-indicator\";i:4084;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/rating\";i:4232;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/sale-badge\";i:3460;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/title\";i:8986;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/shared\";i:3254;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/image/test\";i:4042;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/image\";i:13896;s:130:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/shared\";i:5803;s:172:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/test\";i:7704;s:167:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes\";i:20179;s:146:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable\";i:21329;s:156:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/product-types/grouped/group-list\";i:329;s:145:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/product-types/grouped\";i:520;s:137:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart/product-types\";i:23310;s:123:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/add-to-cart\";i:35928;s:125:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/category-list\";i:3503;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/tag-list\";i:3437;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/price\";i:8943;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/button\";i:6234;s:115:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/sku\";i:2964;s:119:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements/summary\";i:3368;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks/product-elements\";i:102509;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/blocks\";i:105979;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic/utils\";i:4865;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/atomic\";i:110844;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/extensions/google-analytics\";i:10131;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/extensions\";i:10131;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/grid-layout-control\";i:2358;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/text-toolbar-button\";i:675;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/product-orderby-control\";i:1666;s:112:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/view-switcher\";i:2295;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/product-control\";i:6901;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/block-title\";i:1346;s:119:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/grid-content-control\";i:2382;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/utils\";i:5812;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/product-tag-control\";i:5052;s:116:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/edit-product-link\";i:1363;s:112:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/page-selector\";i:1076;s:115:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/products-control\";i:2275;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/feedback-prompt\";i:1887;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/product-attribute-term-control\";i:6655;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/compatibility-notices\";i:9090;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/heading-toolbar\";i:3808;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/toggle-button-control\";i:35133;s:124:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/error-placeholder/stories\";i:360;s:116:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/error-placeholder\";i:3469;s:123:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components/product-category-control\";i:5217;s:98:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/editor-components\";i:98460;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/type-defs\";i:78792;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/icons/library\";i:22166;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/icons/stories\";i:1886;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/icons/icon\";i:492;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/icons\";i:27099;s:89:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/previews\";i:12320;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/query-state/test\";i:4485;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/query-state\";i:8847;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/utils\";i:968;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/schema/test\";i:9947;s:92:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/schema\";i:20013;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/cart/test\";i:11140;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/cart\";i:34261;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/collections/test\";i:9512;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data/collections\";i:21101;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/data\";i:90355;s:98:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/test\";i:1025;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/event-emit/test\";i:3800;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/event-emit\";i:9397;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/shipping\";i:9812;s:136:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/checkout/processor\";i:8471;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/checkout\";i:10481;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/cart\";i:721;s:138:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/payment-methods/test\";i:7132;s:133:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/payment-methods\";i:42149;s:132:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/checkout-state\";i:21330;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout/customer\";i:1953;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/cart-checkout\";i:86644;s:128:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/store-notices/components\";i:3055;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/store-notices\";i:7201;s:132:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/add-to-cart-form/form/submit\";i:3624;s:125:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/add-to-cart-form/form\";i:4638;s:131:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/add-to-cart-form/form-state\";i:15266;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/add-to-cart-form\";i:19958;s:148:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/validation/components/validation-input-error\";i:1343;s:125:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/validation/components\";i:1385;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers/validation\";i:8059;s:103:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/providers\";i:126381;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/test\";i:14521;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/shipping\";i:4862;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/cart/test\";i:10309;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/cart\";i:23357;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/payment-methods/test\";i:1095;s:115:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/payment-methods\";i:7141;s:116:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/collections/test\";i:8000;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks/collections\";i:18140;s:99:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context/hooks\";i:93832;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/context\";i:232429;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/utils/test\";i:938;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/utils\";i:18019;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/read-more/test\";i:2458;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/read-more/stories\";i:1379;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/read-more\";i:9911;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/tabs\";i:3215;s:112:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/pagination/test\";i:934;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/pagination\";i:8873;s:139:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/form-step/test/__snapshots__\";i:5989;s:125:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/form-step/test\";i:8532;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/form-step\";i:12659;s:124:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-badge\";i:674;s:128:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/address-form/test\";i:5145;s:123:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/address-form\";i:13932;s:128:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/shipping-location\";i:1762;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-summary\";i:1074;s:134:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-low-stock-badge\";i:902;s:130:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/shipping-calculator\";i:2731;s:134:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-backorder-badge\";i:427;s:131:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/payment-method-label\";i:1438;s:119:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/policies\";i:1614;s:124:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-image\";i:734;s:132:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/return-to-cart-button\";i:790;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/place-order-button\";i:847;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/order-summary/test\";i:989;s:124:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/order-summary\";i:9014;s:127:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-metadata\";i:1289;s:145:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-details/test/__snapshots__\";i:1499;s:131:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-details/test\";i:2958;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-details\";i:4900;s:131:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/payment-method-icons\";i:5858;s:133:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/shipping-rates-control\";i:4997;s:137:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/footer-item/stories\";i:645;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/footer-item\";i:2862;s:134:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/shipping/stories\";i:872;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/shipping\";i:8490;s:132:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/coupon/stories\";i:1192;s:124:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/coupon\";i:4853;s:134:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/discount/stories\";i:922;s:126:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals/discount\";i:3834;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/totals\";i:20264;s:141:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/shipping-rates-control-package\";i:7327;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout/product-sale-badge\";i:1503;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/cart-checkout\";i:96017;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/form\";i:564;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/formatted-monetary-amount\";i:2592;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/loading-mask\";i:1331;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/radio-control\";i:6331;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/title\";i:1495;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/dropdown-selector\";i:13902;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/chip/test/__snapshots__\";i:7093;s:106:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/chip/test\";i:9911;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/chip\";i:16165;s:121:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/label/test/__snapshots__\";i:1101;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/label/test\";i:2981;s:102:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/label\";i:4464;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/sort-select\";i:2809;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/filter-submit-button\";i:1252;s:108:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/state-input\";i:4053;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-price/test/__snapshots__\";i:1068;s:115:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-price/test\";i:2377;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-price/stories\";i:1315;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-price\";i:8662;s:128:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-name/test/__snapshots__\";i:697;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-name/test\";i:1841;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-name/stories\";i:458;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-name\";i:3198;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/block-error-boundary\";i:5065;s:118:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/country-input/stories\";i:6132;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/country-input\";i:9496;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/sidebar-layout\";i:2630;s:105:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/textarea\";i:1394;s:121:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/checkbox-control/stories\";i:537;s:113:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/checkbox-control\";i:4226;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/button/stories\";i:210;s:103:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/button\";i:3147;s:113:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/load-more-button\";i:875;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/checkbox-list\";i:4789;s:120:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/radio-control-accordion\";i:1648;s:103:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/select\";i:6872;s:122:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/quantity-selector/stories\";i:598;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/quantity-selector\";i:6445;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/text-input\";i:7646;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/summary/test\";i:4135;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/summary\";i:8552;s:123:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/reviews/review-sort-select\";i:1347;s:116:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/reviews/review-list\";i:1167;s:121:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/reviews/review-list-item\";i:10726;s:104:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/reviews\";i:13427;s:127:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-list/product-list-item\";i:2469;s:129:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-list/product-sort-select\";i:1680;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/product-list\";i:16490;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/price-slider/test\";i:2063;s:117:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/price-slider/stories\";i:856;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components/price-slider\";i:26436;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/components\";i:303972;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/hooks/test\";i:7458;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/hooks\";i:14896;s:95:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/hocs/test\";i:4043;s:114:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/hocs/with-scroll-to-top/test\";i:2066;s:109:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/hocs/with-scroll-to-top\";i:3829;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base/hocs\";i:13692;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/base\";i:583008;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/hocs/test\";i:18095;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js/hocs\";i:39139;s:80:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/js\";i:1559173;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/img/payment-methods\";i:61832;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets/img\";i:817248;s:77:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/assets\";i:2392461;s:111:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/automattic/jetpack-autoloader/src\";i:79889;s:107:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/automattic/jetpack-autoloader\";i:79889;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/automattic\";i:79889;s:121:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/composer/installers/src/Composer/Installers\";i:73900;s:110:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/composer/installers/src/Composer\";i:73900;s:101:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/composer/installers/src\";i:74368;s:97:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/composer/installers\";i:75643;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/composer\";i:109823;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor/jetpack-autoloader\";i:49628;s:77:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/vendor\";i:239835;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Payments/Integrations\";i:22491;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Payments\";i:38385;s:80:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Utils\";i:3176;s:87:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Integrations\";i:6268;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Registry\";i:5604;s:85:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/BlockTypes\";i:85422;s:94:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/Formatters\";i:4263;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/docs\";i:0;s:91:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/Schemas\";i:129555;s:93:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/Utilities\";i:85929;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/Routes\";i:111035;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi\";i:341038;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Assets\";i:17103;s:96:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Domain/Services/Email\";i:4699;s:90:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Domain/Services\";i:36669;s:81:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/Domain\";i:48089;s:74:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks/src\";i:570671;s:70:\"/app/public/wp-content/plugins/woocommerce/packages/woocommerce-blocks\";i:7862627;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/WP_CLI\";i:18687;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/schedules\";i:10729;s:83:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/schema\";i:3907;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/abstracts\";i:67488;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/data-stores\";i:80558;s:84:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/actions\";i:2751;s:86:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes/migration\";i:24900;s:76:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/classes\";i:284460;s:88:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/lib/cron-expression\";i:29942;s:72:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/lib\";i:33218;s:79:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler/deprecated\";i:13199;s:68:\"/app/public/wp-content/plugins/woocommerce/packages/action-scheduler\";i:378651;s:51:\"/app/public/wp-content/plugins/woocommerce/packages\";i:13856056;s:81:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League/Container/Argument\";i:6696;s:82:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League/Container/Inflector\";i:6143;s:88:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League/Container/ServiceProvider\";i:6476;s:83:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League/Container/Definition\";i:12638;s:82:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League/Container/Exception\";i:491;s:72:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League/Container\";i:45194;s:62:\"/app/public/wp-content/plugins/woocommerce/lib/packages/League\";i:45194;s:55:\"/app/public/wp-content/plugins/woocommerce/lib/packages\";i:45194;s:46:\"/app/public/wp-content/plugins/woocommerce/lib\";i:45194;s:58:\"/app/public/wp-content/plugins/woocommerce/templates/order\";i:16928;s:62:\"/app/public/wp-content/plugins/woocommerce/templates/myaccount\";i:47041;s:57:\"/app/public/wp-content/plugins/woocommerce/templates/auth\";i:6620;s:65:\"/app/public/wp-content/plugins/woocommerce/templates/emails/plain\";i:35366;s:59:\"/app/public/wp-content/plugins/woocommerce/templates/emails\";i:83318;s:61:\"/app/public/wp-content/plugins/woocommerce/templates/checkout\";i:32608;s:60:\"/app/public/wp-content/plugins/woocommerce/templates/notices\";i:2782;s:57:\"/app/public/wp-content/plugins/woocommerce/templates/cart\";i:29861;s:72:\"/app/public/wp-content/plugins/woocommerce/templates/single-product/tabs\";i:3986;s:79:\"/app/public/wp-content/plugins/woocommerce/templates/single-product/add-to-cart\";i:14696;s:67:\"/app/public/wp-content/plugins/woocommerce/templates/single-product\";i:41744;s:59:\"/app/public/wp-content/plugins/woocommerce/templates/global\";i:9789;s:57:\"/app/public/wp-content/plugins/woocommerce/templates/loop\";i:10443;s:52:\"/app/public/wp-content/plugins/woocommerce/templates\";i:305806;s:57:\"/app/public/wp-content/plugins/woocommerce/i18n/languages\";i:1382870;s:47:\"/app/public/wp-content/plugins/woocommerce/i18n\";i:1488451;s:77:\"/app/public/wp-content/plugins/woocommerce/assets/css/photoswipe/default-skin\";i:22461;s:64:\"/app/public/wp-content/plugins/woocommerce/assets/css/photoswipe\";i:31039;s:70:\"/app/public/wp-content/plugins/woocommerce/assets/css/jquery-ui/images\";i:19610;s:63:\"/app/public/wp-content/plugins/woocommerce/assets/css/jquery-ui\";i:109637;s:53:\"/app/public/wp-content/plugins/woocommerce/assets/css\";i:1769914;s:75:\"/app/public/wp-content/plugins/woocommerce/assets/images/icons/credit-cards\";i:36070;s:62:\"/app/public/wp-content/plugins/woocommerce/assets/images/icons\";i:36459;s:56:\"/app/public/wp-content/plugins/woocommerce/assets/images\";i:724256;s:63:\"/app/public/wp-content/plugins/woocommerce/assets/js/accounting\";i:16775;s:74:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-ui-touch-punch\";i:6363;s:67:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-blockui\";i:29446;s:61:\"/app/public/wp-content/plugins/woocommerce/assets/js/frontend\";i:188563;s:66:\"/app/public/wp-content/plugins/woocommerce/assets/js/zeroclipboard\";i:94466;s:58:\"/app/public/wp-content/plugins/woocommerce/assets/js/admin\";i:400535;s:64:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-flot\";i:213651;s:64:\"/app/public/wp-content/plugins/woocommerce/assets/js/stupidtable\";i:5728;s:62:\"/app/public/wp-content/plugins/woocommerce/assets/js/selectWoo\";i:461101;s:63:\"/app/public/wp-content/plugins/woocommerce/assets/js/photoswipe\";i:156439;s:64:\"/app/public/wp-content/plugins/woocommerce/assets/js/prettyPhoto\";i:56863;s:66:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-qrcode\";i:45216;s:73:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-serializejson\";i:22440;s:62:\"/app/public/wp-content/plugins/woocommerce/assets/js/js-cookie\";i:5706;s:57:\"/app/public/wp-content/plugins/woocommerce/assets/js/zoom\";i:8694;s:63:\"/app/public/wp-content/plugins/woocommerce/assets/js/flexslider\";i:79657;s:66:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-tiptip\";i:9575;s:66:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-cookie\";i:4504;s:67:\"/app/public/wp-content/plugins/woocommerce/assets/js/jquery-payment\";i:25834;s:60:\"/app/public/wp-content/plugins/woocommerce/assets/js/select2\";i:443760;s:58:\"/app/public/wp-content/plugins/woocommerce/assets/js/round\";i:2269;s:52:\"/app/public/wp-content/plugins/woocommerce/assets/js\";i:2277585;s:55:\"/app/public/wp-content/plugins/woocommerce/assets/fonts\";i:94747;s:49:\"/app/public/wp-content/plugins/woocommerce/assets\";i:4866502;s:54:\"/app/public/wp-content/plugins/woocommerce/sample-data\";i:206613;s:83:\"/app/public/wp-content/plugins/woocommerce/vendor/automattic/jetpack-autoloader/src\";i:81237;s:79:\"/app/public/wp-content/plugins/woocommerce/vendor/automattic/jetpack-autoloader\";i:81237;s:82:\"/app/public/wp-content/plugins/woocommerce/vendor/automattic/jetpack-constants/src\";i:3370;s:78:\"/app/public/wp-content/plugins/woocommerce/vendor/automattic/jetpack-constants\";i:3370;s:60:\"/app/public/wp-content/plugins/woocommerce/vendor/automattic\";i:84607;s:53:\"/app/public/wp-content/plugins/woocommerce/vendor/bin\";i:0;s:93:\"/app/public/wp-content/plugins/woocommerce/vendor/composer/installers/src/Composer/Installers\";i:77219;s:82:\"/app/public/wp-content/plugins/woocommerce/vendor/composer/installers/src/Composer\";i:77219;s:73:\"/app/public/wp-content/plugins/woocommerce/vendor/composer/installers/src\";i:77687;s:69:\"/app/public/wp-content/plugins/woocommerce/vendor/composer/installers\";i:78962;s:58:\"/app/public/wp-content/plugins/woocommerce/vendor/composer\";i:498408;s:92:\"/app/public/wp-content/plugins/woocommerce/vendor/pelago/emogrifier/src/Emogrifier/Utilities\";i:7853;s:96:\"/app/public/wp-content/plugins/woocommerce/vendor/pelago/emogrifier/src/Emogrifier/HtmlProcessor\";i:24707;s:82:\"/app/public/wp-content/plugins/woocommerce/vendor/pelago/emogrifier/src/Emogrifier\";i:71297;s:71:\"/app/public/wp-content/plugins/woocommerce/vendor/pelago/emogrifier/src\";i:133255;s:67:\"/app/public/wp-content/plugins/woocommerce/vendor/pelago/emogrifier\";i:134323;s:56:\"/app/public/wp-content/plugins/woocommerce/vendor/pelago\";i:134323;s:68:\"/app/public/wp-content/plugins/woocommerce/vendor/jetpack-autoloader\";i:51170;s:77:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader/ext/tests\";i:709;s:71:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader/ext\";i:26671;s:89:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader/src/MaxMind/Db/Reader\";i:15947;s:82:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader/src/MaxMind/Db\";i:26831;s:79:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader/src/MaxMind\";i:26831;s:71:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader/src\";i:26831;s:67:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db/reader\";i:66265;s:60:\"/app/public/wp-content/plugins/woocommerce/vendor/maxmind-db\";i:66265;s:67:\"/app/public/wp-content/plugins/woocommerce/vendor/psr/container/src\";i:1602;s:63:\"/app/public/wp-content/plugins/woocommerce/vendor/psr/container\";i:2747;s:53:\"/app/public/wp-content/plugins/woocommerce/vendor/psr\";i:2747;s:86:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/XPath/Extension\";i:33975;s:76:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/XPath\";i:46485;s:91:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests/XPath/Fixtures\";i:16888;s:82:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests/XPath\";i:34117;s:91:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests/Parser/Handler\";i:10979;s:92:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests/Parser/Shortcut\";i:5102;s:83:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests/Parser\";i:35379;s:81:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests/Node\";i:12956;s:76:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Tests\";i:85690;s:85:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Parser/Handler\";i:10913;s:86:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Parser/Shortcut\";i:5786;s:87:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Parser/Tokenizer\";i:7636;s:77:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Parser\";i:46778;s:75:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Node\";i:20435;s:80:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector/Exception\";i:4332;s:70:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony/css-selector\";i:206780;s:57:\"/app/public/wp-content/plugins/woocommerce/vendor/symfony\";i:206780;s:49:\"/app/public/wp-content/plugins/woocommerce/vendor\";i:1044795;s:53:\"/app/public/wp-content/plugins/woocommerce/src/Blocks\";i:0;s:52:\"/app/public/wp-content/plugins/woocommerce/src/Admin\";i:0;s:61:\"/app/public/wp-content/plugins/woocommerce/src/Internal/WCCom\";i:654;s:93:\"/app/public/wp-content/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders\";i:1576;s:76:\"/app/public/wp-content/plugins/woocommerce/src/Internal/DependencyManagement\";i:16392;s:55:\"/app/public/wp-content/plugins/woocommerce/src/Internal\";i:28654;s:63:\"/app/public/wp-content/plugins/woocommerce/src/Checkout/Helpers\";i:8175;s:55:\"/app/public/wp-content/plugins/woocommerce/src/Checkout\";i:8175;s:56:\"/app/public/wp-content/plugins/woocommerce/src/Utilities\";i:2899;s:54:\"/app/public/wp-content/plugins/woocommerce/src/Proxies\";i:4857;s:53:\"/app/public/wp-content/plugins/woocommerce/src/Vendor\";i:0;s:46:\"/app/public/wp-content/plugins/woocommerce/src\";i:53803;s:42:\"/app/public/wp-content/plugins/woocommerce\";i:28581925;s:30:\"/app/public/wp-content/plugins\";i:28581953;s:38:\"/app/public/wp-content/uploads/2021/04\";i:0;s:38:\"/app/public/wp-content/uploads/2021/05\";i:0;s:38:\"/app/public/wp-content/uploads/2021/02\";i:958306;s:35:\"/app/public/wp-content/uploads/2021\";i:958306;s:38:\"/app/public/wp-content/uploads/wc-logs\";i:13;s:50:\"/app/public/wp-content/uploads/woocommerce_uploads\";i:13;s:30:\"/app/public/wp-content/uploads\";i:1305156;}','yes'), +(1094,'action_scheduler_migration_status','complete','yes'), +(1137,'_transient_timeout_wc_shipping_method_count_legacy','1624037261','no'), +(1138,'_transient_wc_shipping_method_count_legacy','a:2:{s:7:\"version\";s:10:\"1613873868\";s:5:\"value\";i:2;}','no'), +(1239,'_transient_timeout_wc_onboarding_product_data','1622806125','no'), +(1240,'_transient_wc_onboarding_product_data','a:6:{s:7:\"headers\";O:42:\"Requests_Utility_CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:18:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Thu, 03 Jun 2021 11:28:45 GMT\";s:12:\"content-type\";s:31:\"application/json; charset=UTF-8\";s:14:\"content-length\";s:5:\"11634\";s:12:\"x-robots-tag\";s:7:\"noindex\";s:4:\"link\";s:60:\"; rel=\"https://api.w.org/\"\";s:22:\"x-content-type-options\";s:7:\"nosniff\";s:29:\"access-control-expose-headers\";s:33:\"X-WP-Total, X-WP-TotalPages, Link\";s:28:\"access-control-allow-headers\";s:73:\"Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type\";s:13:\"x-wccom-cache\";s:3:\"HIT\";s:13:\"cache-control\";s:10:\"max-age=60\";s:5:\"allow\";s:3:\"GET\";s:16:\"content-encoding\";s:4:\"gzip\";s:4:\"x-rq\";s:16:\"vie2 87 111 3196\";s:3:\"age\";s:2:\"21\";s:7:\"x-cache\";s:3:\"hit\";s:4:\"vary\";s:23:\"Accept-Encoding, Origin\";s:13:\"accept-ranges\";s:5:\"bytes\";}}s:4:\"body\";s:48310:\"{\"products\":[{\"title\":\"WooCommerce Google Analytics\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/GA-Dark.png\",\"excerpt\":\"Understand your customers and increase revenue with world\\u2019s leading analytics platform - integrated with WooCommerce for free.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-google-analytics\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"2d21f7de14dfb8e9885a4622be701ddf\",\"slug\":\"woocommerce-google-analytics-integration\",\"id\":1442927},{\"title\":\"WooCommerce Tax\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Tax-Dark.png\",\"excerpt\":\"Automatically calculate how much sales tax should be collected for WooCommerce orders - by city, country, or state - at checkout.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/tax\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"f31b3b9273cce188cc2b27f7849d02dd\",\"slug\":\"woocommerce-services\",\"id\":3220291},{\"title\":\"Stripe\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Stripe-Dark-1.png\",\"excerpt\":\"Accept all major debit and credit cards as well as local payment methods with Stripe.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/stripe\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"50bb7a985c691bb943a9da4d2c8b5efd\",\"slug\":\"woocommerce-gateway-stripe\",\"id\":18627},{\"title\":\"Jetpack\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Jetpack-Dark.png\",\"excerpt\":\"Power up and protect your store with Jetpack\\r\\n\\r\\nFor free security, insights and monitoring, connect to Jetpack. It\'s everything you need for a strong, secure start.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/jetpack\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"d5bfef9700b62b2b132c74c74c3193eb\",\"slug\":\"jetpack\",\"id\":2725249},{\"title\":\"Facebook for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Facebook-Dark.png\",\"excerpt\":\"Get the Official Facebook for WooCommerce plugin for three powerful ways to help grow your business.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/facebook\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"0ea4fe4c2d7ca6338f8a322fb3e4e187\",\"slug\":\"facebook-for-woocommerce\",\"id\":2127297},{\"title\":\"Amazon Pay\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Amazon-Pay-Dark.png\",\"excerpt\":\"Amazon Pay is embedded in your WooCommerce store. Transactions take place via\\u00a0Amazon widgets, so the buyer never leaves your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/pay-with-amazon\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"9865e043bbbe4f8c9735af31cb509b53\",\"slug\":\"woocommerce-gateway-amazon-payments-advanced\",\"id\":238816},{\"title\":\"Square for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Square-Dark.png\",\"excerpt\":\"Accepting payments is easy with Square. Clear rates, fast deposits (1-2 business days). Sell online and in person, and sync all payments, items and inventory.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/square\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"e907be8b86d7df0c8f8e0d0020b52638\",\"slug\":\"woocommerce-square\",\"id\":1770503},{\"title\":\"WooCommerce Shipping\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Ship-Dark-1.png\",\"excerpt\":\"Print USPS and DHL labels right from your WooCommerce dashboard and instantly save up to 90%. WooCommerce Shipping is free to use and saves you time and money.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipping\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"f31b3b9273cce188cc2b27f7849d02dd\",\"slug\":\"woocommerce-services\",\"id\":2165910},{\"title\":\"WooCommerce Payments\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Pay-Dark.png\",\"excerpt\":\"Securely accept payments, track cash flow, and manage recurring revenue from your dashboard \\u2014 all without setup costs or monthly fees.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"8c6319ca-8f41-4e69-be63-6b15ee37773b\",\"slug\":\"woocommerce-payments\",\"id\":5278104},{\"title\":\"Mailchimp for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/09\\/logo-mailchimp-dark-v2.png\",\"excerpt\":\"Increase traffic, drive repeat purchases, and personalize your marketing when you connect to Mailchimp.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/mailchimp-for-woocommerce\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"b4481616ebece8b1ff68fc59b90c1a91\",\"slug\":\"mailchimp-for-woocommerce\",\"id\":2545166},{\"title\":\"WooCommerce Subscriptions\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Subscriptions-Dark.png\",\"excerpt\":\"Let customers subscribe to your products or services and pay on a weekly, monthly or annual basis.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-subscriptions\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$199.00\",\"hash\":\"6115e6d7e297b623a169fdcf5728b224\",\"slug\":\"woocommerce-subscriptions\",\"id\":27147},{\"title\":\"PayPal Checkout\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Paypal-Dark.png\",\"excerpt\":\"PayPal Checkout now with Smart Payment Buttons\\u2122, dynamically displays, PayPal, Venmo, PayPal Credit, or other local payment options in a single stack giving customers the choice to pay with their preferred option.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-paypal-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"69e6cba62ac4021df9e117cc3f716d07\",\"slug\":\"woocommerce-gateway-paypal-express-checkout\",\"id\":1597922},{\"title\":\"ShipStation Integration\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Shipstation-Dark.png\",\"excerpt\":\"Fulfill all your Woo orders (and wherever else you sell) quickly and easily using ShipStation. Try it free for 30 days today!\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipstation-integration\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"9de8640767ba64237808ed7f245a49bb\",\"slug\":\"woocommerce-shipstation-integration\",\"id\":18734},{\"title\":\"Product Add-Ons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Product-Add-Ons-Dark.png\",\"excerpt\":\"Offer add-ons like gift wrapping, special messages or other special options for your products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"147d0077e591e16db9d0d67daeb8c484\",\"slug\":\"woocommerce-product-addons\",\"id\":18618},{\"title\":\"PayFast Payment Gateway\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Payfast-Dark-1.png\",\"excerpt\":\"Take payments on your WooCommerce store via PayFast (redirect method).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/payfast-payment-gateway\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"557bf07293ad916f20c207c6c9cd15ff\",\"slug\":\"woocommerce-payfast-gateway\",\"id\":18596},{\"title\":\"Google Ads & Marketing by Kliken\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2019\\/02\\/GA-for-Woo-Logo-374x192px-qu3duk.png\",\"excerpt\":\"Get in front of shoppers and drive traffic to your store so you can grow your business with Smart Shopping Campaigns and free listings.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/google-ads-and-marketing\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"bf66e173-a220-4da7-9512-b5728c20fc16\",\"slug\":\"kliken-marketing-for-google\",\"id\":3866145},{\"title\":\"USPS Shipping Method\",\"image\":\"\",\"excerpt\":\"Get shipping rates from the USPS API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/usps-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"83d1524e8f5f1913e58889f83d442c32\",\"slug\":\"woocommerce-shipping-usps\",\"id\":18657},{\"title\":\"UPS Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/UPS-Shipping-Method-Dark.png\",\"excerpt\":\"Get shipping rates from the UPS API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/ups-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8dae58502913bac0fbcdcaba515ea998\",\"slug\":\"woocommerce-shipping-ups\",\"id\":18665},{\"title\":\"Shipment Tracking\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Ship-Tracking-Dark-1.png\",\"excerpt\":\"Add shipment tracking information to your orders.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipment-tracking\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"1968e199038a8a001c9f9966fd06bf88\",\"slug\":\"woocommerce-shipment-tracking\",\"id\":18693},{\"title\":\"Table Rate Shipping\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Product-Table-Rate-Shipping-Dark.png\",\"excerpt\":\"Advanced, flexible shipping. Define multiple shipping rates based on location, price, weight, shipping class or item count.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/table-rate-shipping\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"3034ed8aff427b0f635fe4c86bbf008a\",\"slug\":\"woocommerce-table-rate-shipping\",\"id\":18718},{\"title\":\"Braintree for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/02\\/braintree-black-copy.png\",\"excerpt\":\"Accept PayPal, credit cards and debit cards with a single payment gateway solution \\u2014 PayPal Powered by Braintree.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-paypal-powered-by-braintree\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"27f010c8e34ca65b205ddec88ad14536\",\"slug\":\"woocommerce-gateway-paypal-powered-by-braintree\",\"id\":1489837},{\"title\":\"Checkout Field Editor\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Checkout-Field-Editor-Dark.png\",\"excerpt\":\"Optimize your checkout process by adding, removing or editing fields to suit your needs.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-checkout-field-editor\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"2b8029f0d7cdd1118f4d843eb3ab43ff\",\"slug\":\"woocommerce-checkout-field-editor\",\"id\":184594},{\"title\":\"WooCommerce Memberships\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2015\\/06\\/Thumbnail-Memberships-updated.png\",\"excerpt\":\"Give members access to restricted content or products, for a fee or for free.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-memberships\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$199.00\",\"hash\":\"9288e7609ad0b487b81ef6232efa5cfc\",\"slug\":\"woocommerce-memberships\",\"id\":958589},{\"title\":\"WooCommerce Bookings\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Bookings-Dark.png\",\"excerpt\":\"Allow customers to book appointments, make reservations or rent equipment without leaving your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-bookings\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/themes.woocommerce.com\\/hotel\\/\",\"price\":\"$249.00\",\"hash\":\"911c438934af094c2b38d5560b9f50f3\",\"slug\":\"WooCommerce Bookings\",\"id\":390890},{\"title\":\"Product Bundles\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-PB.png?v=1\",\"excerpt\":\"Offer personalized product bundles, bulk discount packages, and assembled\\u00a0products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-bundles\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"aa2518b5-ab19-4b75-bde9-60ca51e20f28\",\"slug\":\"woocommerce-product-bundles\",\"id\":18716},{\"title\":\"Multichannel for WooCommerce: Google, Amazon, eBay & Walmart Integration\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2018\\/10\\/Woo-Extension-Store-Logo-v2.png\",\"excerpt\":\"Get the official Google, Amazon, eBay and Walmart extension and create, sync and manage multichannel listings directly from WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/amazon-ebay-integration\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"e4000666-9275-4c71-8619-be61fb41c9f9\",\"slug\":\"woocommerce-amazon-ebay-integration\",\"id\":3545890},{\"title\":\"Min\\/Max Quantities\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Min-Max-Qua-Dark.png\",\"excerpt\":\"Specify minimum and maximum allowed product quantities for orders to be completed.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/minmax-quantities\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"2b5188d90baecfb781a5aa2d6abb900a\",\"slug\":\"woocommerce-min-max-quantities\",\"id\":18616},{\"title\":\"FedEx Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/01\\/FedEx_Logo_Wallpaper.jpeg\",\"excerpt\":\"Get shipping rates from the FedEx API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/fedex-shipping-module\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1a48b598b47a81559baadef15e320f64\",\"slug\":\"woocommerce-shipping-fedex\",\"id\":18620},{\"title\":\"LiveChat for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2015\\/11\\/LC_woo_regular-zmiaym.png\",\"excerpt\":\"Live Chat and messaging platform for sales and support -- increase average order value and overall sales through live conversations.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/livechat\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.livechat.com\\/livechat-for-ecommerce\\/?a=woocommerce&utm_source=woocommerce.com&utm_medium=integration&utm_campaign=woocommerce.com\",\"price\":\"$0.00\",\"hash\":\"5344cc1f-ed4a-4d00-beff-9d67f6d372f3\",\"slug\":\"livechat-woocommerce\",\"id\":1348888},{\"title\":\"Authorize.Net\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2013\\/04\\/Thumbnail-Authorize.net-updated.png\",\"excerpt\":\"Authorize.Net gateway with support for pre-orders and subscriptions.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/authorize-net\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8b61524fe53add7fdd1a8d1b00b9327d\",\"slug\":\"woocommerce-gateway-authorize-net-cim\",\"id\":178481},{\"title\":\"Product CSV Import Suite\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Product-CSV-Import-Dark.png\",\"excerpt\":\"Import, merge, and export products and variations to and from WooCommerce using a CSV file.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-csv-import-suite\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"7ac9b00a1fe980fb61d28ab54d167d0d\",\"slug\":\"woocommerce-product-csv-import-suite\",\"id\":18680},{\"title\":\"Follow-Ups\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Follow-Ups-Dark.png\",\"excerpt\":\"Automatically contact customers after purchase - be it everyone, your most loyal or your biggest spenders - and keep your store top-of-mind.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/follow-up-emails\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"05ece68fe94558e65278fe54d9ec84d2\",\"slug\":\"woocommerce-follow-up-emails\",\"id\":18686},{\"title\":\"WooCommerce Customer \\/ Order \\/ Coupon Export\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/02\\/Thumbnail-Customer-Order-Coupon-Export-updated.png\",\"excerpt\":\"Export customers, orders, and coupons from WooCommerce manually or on an automated schedule.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/ordercustomer-csv-export\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"914de15813a903c767b55445608bf290\",\"slug\":\"woocommerce-customer-order-csv-export\",\"id\":18652},{\"title\":\"Australia Post Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/australia-post.gif\",\"excerpt\":\"Get shipping rates for your WooCommerce store from the Australia Post API, which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/australia-post-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1dbd4dc6bd91a9cda1bd6b9e7a5e4f43\",\"slug\":\"woocommerce-shipping-australia-post\",\"id\":18622},{\"title\":\"Canada Post Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/canada-post.png\",\"excerpt\":\"Get shipping rates from the Canada Post Ratings API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/canada-post-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"ac029cdf3daba20b20c7b9be7dc00e0e\",\"slug\":\"woocommerce-shipping-canada-post\",\"id\":18623},{\"title\":\"Product Vendors\",\"image\":\"\",\"excerpt\":\"Turn your store into a multi-vendor marketplace\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-vendors\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"a97d99fccd651bbdd728f4d67d492c31\",\"slug\":\"woocommerce-product-vendors\",\"id\":219982},{\"title\":\"WooCommerce Accommodation Bookings\",\"image\":\"\",\"excerpt\":\"Book accommodation using WooCommerce and the WooCommerce Bookings extension.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-accommodation-bookings\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"99b2a7a4af90b6cefd2a733b3b1f78e7\",\"slug\":\"woocommerce-accommodation-bookings\",\"id\":1412069},{\"title\":\"Smart Coupons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/10\\/wc-product-smart-coupons.png\",\"excerpt\":\"Everything you need for discounts, coupons, credits, gift cards, product giveaways, offers, and promotions. Most popular and complete coupons plugin for WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/smart-coupons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/demo.storeapps.org\\/?demo=sc\",\"price\":\"$99.00\",\"hash\":\"05c45f2aa466106a466de4402fff9dde\",\"slug\":\"woocommerce-smart-coupons\",\"id\":18729},{\"title\":\"WooCommerce Brands\",\"image\":\"\",\"excerpt\":\"Create, assign and list brands for products, and allow customers to view by brand.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/brands\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"8a88c7cbd2f1e73636c331c7a86f818c\",\"slug\":\"woocommerce-brands\",\"id\":18737},{\"title\":\"Xero\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2012\\/08\\/xero2.png\",\"excerpt\":\"Save time with automated sync between WooCommerce and your Xero account.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/xero\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"f0dd29d338d3c67cf6cee88eddf6869b\",\"slug\":\"woocommerce-xero\",\"id\":18733},{\"title\":\"Royal Mail\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/04\\/royalmail.png\",\"excerpt\":\"Offer Royal Mail shipping rates to your customers\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/royal-mail\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"03839cca1a16c4488fcb669aeb91a056\",\"slug\":\"woocommerce-shipping-royalmail\",\"id\":182719},{\"title\":\"AutomateWoo\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-AutomateWoo-Dark-1.png\",\"excerpt\":\"Powerful marketing automation for WooCommerce. AutomateWoo has the tools you need to grow your store and make more money.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/automatewoo\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"ba9299b8-1dba-4aa0-a313-28bc1755cb88\",\"slug\":\"automatewoo\",\"id\":4652610},{\"title\":\"Advanced Notifications\",\"image\":\"\",\"excerpt\":\"Easily setup \\\"new order\\\" and stock email notifications for multiple recipients of your choosing.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/advanced-notifications\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"112372c44b002fea2640bd6bfafbca27\",\"slug\":\"woocommerce-advanced-notifications\",\"id\":18740},{\"title\":\"WooCommerce Zapier\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/woocommerce-zapier-logo.png\",\"excerpt\":\"Integrate with 3000+ cloud apps and services today.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-zapier\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$59.00\",\"hash\":\"0782bdbe932c00f4978850268c6cfe40\",\"slug\":\"woocommerce-zapier\",\"id\":243589},{\"title\":\"WooCommerce Points and Rewards\",\"image\":\"\",\"excerpt\":\"Reward your customers for purchases and other actions with points which can be redeemed for discounts.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-points-and-rewards\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"1649b6cca5da8b923b01ca56b5cdd246\",\"slug\":\"woocommerce-points-and-rewards\",\"id\":210259},{\"title\":\"Dynamic Pricing\",\"image\":\"\",\"excerpt\":\"Bulk discounts, role-based pricing and much more\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/dynamic-pricing\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"9a41775bb33843f52c93c922b0053986\",\"slug\":\"woocommerce-dynamic-pricing\",\"id\":18643},{\"title\":\"Name Your Price\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2012\\/09\\/nyp-icon-dark-v83owf.png\",\"excerpt\":\"Allow customers to define the product price. Also useful for accepting user-set donations.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/name-your-price\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"31b4e11696cd99a3c0572975a84f1c08\",\"slug\":\"woocommerce-name-your-price\",\"id\":18738},{\"title\":\"WooCommerce Print Invoices & Packing lists\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/03\\/Thumbnail-Print-Invoices-Packing-lists-updated.png\",\"excerpt\":\"Generate invoices, packing slips, and pick lists for your WooCommerce orders.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/print-invoices-packing-lists\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"465de1126817cdfb42d97ebca7eea717\",\"slug\":\"woocommerce-pip\",\"id\":18666},{\"title\":\"WooCommerce Pre-Orders\",\"image\":\"\",\"excerpt\":\"Allow customers to order products before they are available.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-pre-orders\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"b2dc75e7d55e6f5bbfaccb59830f66b7\",\"slug\":\"woocommerce-pre-orders\",\"id\":178477},{\"title\":\"WooCommerce Subscription Downloads\",\"image\":\"\",\"excerpt\":\"Offer additional downloads to your subscribers, via downloadable products listed in your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-subscription-downloads\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"5be9e21c13953253e4406d2a700382ec\",\"slug\":\"woocommerce-subscription-downloads\",\"id\":420458},{\"title\":\"WooCommerce Additional Variation Images\",\"image\":\"\",\"excerpt\":\"Add gallery images per variation on variable products within WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-additional-variation-images\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/themes.woocommerce.com\\/storefront\\/product\\/woo-single-1\\/\",\"price\":\"$49.00\",\"hash\":\"c61dd6de57dcecb32bd7358866de4539\",\"slug\":\"woocommerce-additional-variation-images\",\"id\":477384},{\"title\":\"WooCommerce Deposits\",\"image\":\"\",\"excerpt\":\"Enable customers to pay for products using a deposit or a payment plan.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-deposits\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$179.00\",\"hash\":\"de192a6cf12c4fd803248da5db700762\",\"slug\":\"woocommerce-deposits\",\"id\":977087},{\"title\":\"Google Product Feed\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2011\\/11\\/logo-regular-lscryp.png\",\"excerpt\":\"Feed product data to Google Merchant Center for setting up Google product listings & product ads.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/google-product-feed\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"d55b4f852872025741312839f142447e\",\"slug\":\"woocommerce-product-feeds\",\"id\":18619},{\"title\":\"Amazon S3 Storage\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/amazon.png\",\"excerpt\":\"Serve digital products via Amazon S3\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/amazon-s3-storage\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"473bf6f221b865eff165c97881b473bb\",\"slug\":\"woocommerce-amazon-s3-storage\",\"id\":18663},{\"title\":\"Cart Add-ons\",\"image\":\"\",\"excerpt\":\"A powerful tool for driving incremental and impulse purchases by customers once they are in the shopping cart\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/cart-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"3a8ef25334396206f5da4cf208adeda3\",\"slug\":\"woocommerce-cart-add-ons\",\"id\":18717},{\"title\":\"Shipping Multiple Addresses\",\"image\":\"\",\"excerpt\":\"Allow your customers to ship individual items in a single order to multiple addresses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipping-multiple-addresses\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"aa0eb6f777846d329952d5b891d6f8cc\",\"slug\":\"woocommerce-shipping-multiple-addresses\",\"id\":18741},{\"title\":\"WooCommerce AvaTax\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/01\\/Thumbnail-Avalara-updated.png\",\"excerpt\":\"Get 100% accurate sales tax calculations and on time tax return filing. No more tracking sales tax rates, rules, or jurisdictional boundaries.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-avatax\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"57077a4b28ba71cacf692bcf4a1a7f60\",\"slug\":\"woocommerce-avatax\",\"id\":1389326},{\"title\":\"PayPal Payments Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Paypal-Payments-Pro-Dark.png\",\"excerpt\":\"Take credit card payments directly on your checkout using PayPal Pro.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/paypal-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"6d23ba7f0e0198937c0029f9e865b40e\",\"slug\":\"woocommerce-gateway-paypal-pro\",\"id\":18594},{\"title\":\"Klarna Checkout\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2018\\/01\\/Partner_marketing_Klarna_Checkout_Black-1.png\",\"excerpt\":\"Klarna Checkout is a full checkout experience embedded on your site that includes all popular payment methods (Pay Now, Pay Later, Financing, Installments).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/klarna-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/demo.krokedil.se\\/klarnacheckout\\/\",\"price\":\"$0.00\",\"hash\":\"90f8ce584e785fcd8c2d739fd4f40d78\",\"slug\":\"klarna-checkout-for-woocommerce\",\"id\":2754152},{\"title\":\"Bulk Stock Management\",\"image\":\"\",\"excerpt\":\"Edit product and variation stock levels in bulk via this handy interface\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/bulk-stock-management\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"02f4328d52f324ebe06a78eaaae7934f\",\"slug\":\"woocommerce-bulk-stock-management\",\"id\":18670},{\"title\":\"Gravity Forms Product Add-ons\",\"image\":\"\",\"excerpt\":\"Powerful product add-ons, Gravity style\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/gravity-forms-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.elementstark.com\\/woocommerce-extension-demos\\/product-category\\/gravity-forms\\/\",\"price\":\"$99.00\",\"hash\":\"a6ac0ab1a1536e3a357ccf24c0650ed0\",\"slug\":\"woocommerce-gravityforms-product-addons\",\"id\":18633},{\"title\":\"WooCommerce Email Customizer\",\"image\":\"\",\"excerpt\":\"Connect with your customers with each email you send by visually modifying your email templates via the WordPress Customizer.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-email-customizer\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"bd909fa97874d431f203b5336c7e8873\",\"slug\":\"woocommerce-email-customizer\",\"id\":853277},{\"title\":\"Composite Products\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-CP.png?v=1\",\"excerpt\":\"Create product kit builders and custom product configurators using existing products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/composite-products\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"0343e0115bbcb97ccd98442b8326a0af\",\"slug\":\"woocommerce-composite-products\",\"id\":216836},{\"title\":\"Force Sells\",\"image\":\"\",\"excerpt\":\"Force products to be added to the cart\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/force-sells\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"3ebddfc491ca168a4ea4800b893302b0\",\"slug\":\"woocommerce-force-sells\",\"id\":18678},{\"title\":\"TaxJar\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/10\\/taxjar-logotype.png\",\"excerpt\":\"Save hours every month by putting your sales tax on autopilot. Automated, multi-state sales tax calculation, reporting, and filing for your WooCommerce store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/taxjar\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"12072d8e-e933-4561-97b1-9db3c7eeed91\",\"slug\":\"taxjar-simplified-taxes-for-woocommerce\",\"id\":514914},{\"title\":\"WooCommerce Quick View\",\"image\":\"\",\"excerpt\":\"Show a quick-view button to view product details and add to cart via lightbox popup\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-quick-view\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"619c6e57ce72c49c4b57e15b06eddb65\",\"slug\":\"woocommerce-quick-view\",\"id\":187509},{\"title\":\"WooCommerce Purchase Order Gateway\",\"image\":\"\",\"excerpt\":\"Receive purchase orders via your WooCommerce-powered online store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-purchase-order\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"573a92318244ece5facb449d63e74874\",\"slug\":\"woocommerce-gateway-purchase-order\",\"id\":478542},{\"title\":\"Returns and Warranty Requests\",\"image\":\"\",\"excerpt\":\"Manage the RMA process, add warranties to products & let customers request & manage returns \\/ exchanges from their account.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/warranty-requests\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"9b4c41102e6b61ea5f558e16f9b63e25\",\"slug\":\"woocommerce-warranty\",\"id\":228315},{\"title\":\"Product Enquiry Form\",\"image\":\"\",\"excerpt\":\"Allow visitors to contact you directly from the product details page via a reCAPTCHA protected form to enquire about a product.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-enquiry-form\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"5a0f5d72519a8ffcc86669f042296937\",\"slug\":\"woocommerce-product-enquiry-form\",\"id\":18601},{\"title\":\"WooCommerce Box Office\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-BO-Dark.png\",\"excerpt\":\"Sell tickets for your next event, concert, function, fundraiser or conference directly on your own site\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-box-office\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"e704c9160de318216a8fa657404b9131\",\"slug\":\"woocommerce-box-office\",\"id\":1628717},{\"title\":\"WooCommerce Order Barcodes\",\"image\":\"\",\"excerpt\":\"Generates a unique barcode for each order on your site - perfect for e-tickets, packing slips, reservations and a variety of other uses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-barcodes\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"889835bb29ee3400923653e1e44a3779\",\"slug\":\"woocommerce-order-barcodes\",\"id\":391708},{\"title\":\"WooCommerce 360\\u00ba Image\",\"image\":\"\",\"excerpt\":\"An easy way to add a dynamic, controllable 360\\u00ba image rotation to your WooCommerce site, by adding a group of images to a product\\u2019s gallery.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-360-image\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"24eb2cfa3738a66bf3b2587876668cd2\",\"slug\":\"woocommerce-360-image\",\"id\":512186},{\"title\":\"WooCommerce Paid Courses\",\"image\":\"\",\"excerpt\":\"Sell your online courses using the most popular eCommerce platform on the web \\u2013 WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-paid-courses\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"bad2a02a063555b7e2bee59924690763\",\"slug\":\"woothemes-sensei\",\"id\":152116},{\"title\":\"WooCommerce Photography\",\"image\":\"\",\"excerpt\":\"Sell photos in the blink of an eye using this simple as dragging & dropping interface.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-photography\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"ee76e8b9daf1d97ca4d3874cc9e35687\",\"slug\":\"woocommerce-photography\",\"id\":583602},{\"title\":\"WooCommerce Bookings Availability\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Bookings-Aval-Dark.png\",\"excerpt\":\"Sell more bookings by presenting a calendar or schedule of available slots in a page or post.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/bookings-availability\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"30770d2a-e392-4e82-baaa-76cfc7d02ae3\",\"slug\":\"woocommerce-bookings-availability\",\"id\":4228225},{\"title\":\"Software Add-on\",\"image\":\"\",\"excerpt\":\"Sell License Keys for Software\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/software-add-on\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"79f6dbfe1f1d3a56a86f0509b6d6b04b\",\"slug\":\"woocommerce-software-add-on\",\"id\":18683},{\"title\":\"WooCommerce Products Compare\",\"image\":\"\",\"excerpt\":\"WooCommerce Products Compare will allow your potential customers to easily compare products within your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-products-compare\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"c3ba0a4a3199a0cc7a6112eb24414548\",\"slug\":\"woocommerce-products-compare\",\"id\":853117},{\"title\":\"WooCommerce Store Catalog PDF Download\",\"image\":\"\",\"excerpt\":\"Offer your customers a PDF download of your product catalog, generated by WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-store-catalog-pdf-download\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"79ca7aadafe706364e2d738b7c1090c4\",\"slug\":\"woocommerce-store-catalog-pdf-download\",\"id\":675790},{\"title\":\"eWAY\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2011\\/10\\/eway-logo-3000-2000.jpg\",\"excerpt\":\"Take credit card payments securely via eWay (SG, MY, HK, AU, and NZ) keeping customers on your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/eway\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"2c497769d98d025e0d340cd0b5ea5da1\",\"slug\":\"woocommerce-gateway-eway\",\"id\":18604},{\"title\":\"Catalog Visibility Options\",\"image\":\"\",\"excerpt\":\"Transform WooCommerce into an online catalog by removing eCommerce functionality\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/catalog-visibility-options\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"12e791110365fdbb5865c8658907967e\",\"slug\":\"woocommerce-catalog-visibility-options\",\"id\":18648},{\"title\":\"WooCommerce Blocks\",\"image\":\"\",\"excerpt\":\"WooCommerce Blocks offers a range of Gutenberg blocks you can use to build and customise your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gutenberg-products-block\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"c2e9f13a-f90c-4ffe-a8a5-b432399ec263\",\"slug\":\"woo-gutenberg-products-block\",\"id\":3076677},{\"title\":\"Sequential Order Numbers Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/05\\/Thumbnail-Sequential-Order-Numbers-Pro-updated.png\",\"excerpt\":\"Tame your order numbers! Advanced & sequential order numbers with optional prefixes \\/ suffixes\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/sequential-order-numbers-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"0b18a2816e016ba9988b93b1cd8fe766\",\"slug\":\"woocommerce-sequential-order-numbers-pro\",\"id\":18688},{\"title\":\"Conditional Shipping and Payments\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-CSP.png?v=1\",\"excerpt\":\"Use conditional logic to restrict the shipping and payment options available on your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/conditional-shipping-and-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1f56ff002fa830b77017b0107505211a\",\"slug\":\"woocommerce-conditional-shipping-and-payments\",\"id\":680253},{\"title\":\"WooCommerce Order Status Manager\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2015\\/02\\/Thumbnail-Order-Status-Manager-updated.png\",\"excerpt\":\"Create, edit, and delete completely custom order statuses and integrate them seamlessly into your order management flow.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-status-manager\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"51fd9ab45394b4cad5a0ebf58d012342\",\"slug\":\"woocommerce-order-status-manager\",\"id\":588398},{\"title\":\"WooCommerce Checkout Add-Ons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/07\\/Thumbnail-Checkout-Add-Ons-updated.png\",\"excerpt\":\"Highlight relevant products, offers like free shipping and other up-sells during checkout.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-checkout-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8fdca00b4000b7a8cc26371d0e470a8f\",\"slug\":\"woocommerce-checkout-add-ons\",\"id\":466854},{\"title\":\"QuickBooks Sync for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2019\\/04\\/woocommerce-com-logo-1-hyhzbh.png\",\"excerpt\":\"Automatic two-way sync for orders, customers, products, inventory and more between WooCommerce and QuickBooks (Online, Desktop, or POS).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/quickbooks-sync-for-woocommerce\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"c5e32e20-7c1f-4585-8b15-d930c2d842ac\",\"slug\":\"myworks-woo-sync-for-quickbooks-online\",\"id\":4065824},{\"title\":\"WooCommerce Google Analytics Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/01\\/Thumbnail-GAPro-updated.png\",\"excerpt\":\"Add advanced event tracking and enhanced eCommerce tracking to your WooCommerce site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-google-analytics-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"d8aed8b7306b509eec1589e59abe319f\",\"slug\":\"woocommerce-google-analytics-pro\",\"id\":1312497},{\"title\":\"WooCommerce One Page Checkout\",\"image\":\"\",\"excerpt\":\"Create special pages where customers can choose products, checkout & pay all on the one page.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-one-page-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"c9ba8f8352cd71b5508af5161268619a\",\"slug\":\"woocommerce-one-page-checkout\",\"id\":527886},{\"title\":\"WooCommerce Product Search\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2014\\/10\\/woocommerce-product-search-product-image-1870x960-1-jvsljj.png\",\"excerpt\":\"The perfect search engine helps customers to find and buy products quickly \\u2013 essential for every WooCommerce store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-product-search\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/demo.itthinx.com\\/wps\\/\",\"price\":\"$49.00\",\"hash\":\"c84cc8ca16ddac3408e6b6c5871133a8\",\"slug\":\"woocommerce-product-search\",\"id\":512174},{\"title\":\"First Data\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/02\\/Thumbnail-FirstData-updated.png\",\"excerpt\":\"FirstData gateway for WooCommerce\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/firstdata\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"eb3e32663ec0810592eaf0d097796230\",\"slug\":\"woocommerce-gateway-firstdata\",\"id\":18645},{\"title\":\"WooSlider\",\"image\":\"\",\"excerpt\":\"WooSlider is the ultimate responsive slideshow WordPress slider plugin\\r\\n\\r\\n\\u00a0\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/wooslider\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/www.wooslider.com\\/\",\"price\":\"$49.00\",\"hash\":\"209d98f3ccde6cc3de7e8732a2b20b6a\",\"slug\":\"wooslider\",\"id\":46506},{\"title\":\"WooCommerce Social Login\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/08\\/Thumbnail-Social-Login-updated.png\",\"excerpt\":\"Enable Social Login for seamless checkout and account creation.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-social-login\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/demos.skyverge.com\\/woocommerce-social-login\\/\",\"price\":\"$79.00\",\"hash\":\"b231cd6367a79cc8a53b7d992d77525d\",\"slug\":\"woocommerce-social-login\",\"id\":473617},{\"title\":\"Coupon Shortcodes\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/09\\/woocommerce-coupon-shortcodes-product-image-1870x960-1-vc5gux.png\",\"excerpt\":\"Show coupon discount info using shortcodes. Allows to render coupon information and content conditionally, based on the validity of coupons.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/coupon-shortcodes\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"ac5d9d51-70b2-4d8f-8b89-24200eea1394\",\"slug\":\"woocommerce-coupon-shortcodes\",\"id\":244762},{\"title\":\"WooCommerce Order Status Control\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/06\\/Thumbnail-Order-Status-Control-updated.png\",\"excerpt\":\"Use this extension to automatically change the order status to \\\"completed\\\" after successful payment.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-status-control\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"32400e509c7c36dcc1cd368e8267d981\",\"slug\":\"woocommerce-order-status-control\",\"id\":439037},{\"title\":\"Variation Swatches and Photos\",\"image\":\"\",\"excerpt\":\"Show color and image swatches instead of dropdowns for variable products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/variation-swatches-and-photos\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.elementstark.com\\/woocommerce-extension-demos\\/product-category\\/swatches-and-photos\\/\",\"price\":\"$99.00\",\"hash\":\"37bea8d549df279c8278878d081b062f\",\"slug\":\"woocommerce-variation-swatches-and-photos\",\"id\":18697},{\"title\":\"Jilt\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2017\\/12\\/Thumbnail-Jilt-updated.png\",\"excerpt\":\"All-in-one email marketing platform built for WooCommerce stores. Send newsletters, abandoned cart reminders, win-backs, welcome automations, and more.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/jilt\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"b53aafb64dca33835e41ee06de7e9816\",\"slug\":\"jilt-for-woocommerce\",\"id\":2754876},{\"title\":\"PayPal\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2020\\/10\\/PPCP-Tile-PayPal-Logo-and-Cart-Art-2x-2-uozwz8.jpg\",\"excerpt\":\"PayPal\\u2019s latest, most complete payment processing solution. Accept PayPal exclusives, credit\\/debit cards and local payment methods. Turn on only PayPal options or process a full suite of payment methods. Enable global transactions with extensive currency and country coverage. Built and supported by WooCommerce and PayPal.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-paypal-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"934115ab-e3f3-4435-9580-345b1ce21899\",\"slug\":\"woocommerce-paypal-payments\",\"id\":6410731},{\"title\":\"Opayo Payment Suite\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2011\\/10\\/Opayo_logo_RGB.png\",\"excerpt\":\"Take payments on your WooCommerce store via Opayo (formally SagePay).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/sage-pay-form\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"6bc0cca47d0274d8ef9b164f6fbec1cc\",\"slug\":\"woocommerce-gateway-sagepay-form\",\"id\":18599},{\"title\":\"EU VAT Number\",\"image\":\"\",\"excerpt\":\"Collect VAT numbers at checkout and remove the VAT charge for eligible EU businesses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/eu-vat-number\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"d2720c4b4bb8d6908e530355b7a2d734\",\"slug\":\"woocommerce-eu-vat-number\",\"id\":18592},{\"title\":\"QuickBooks Commerce (formerly TradeGecko)\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2013\\/09\\/qbo-mark.png\",\"excerpt\":\"Get a wholesale and multichannel inventory & order management platform for your WooCommerce store with QuickBooks Commerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-tradegecko\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"21da7811f7fc1f13ee19daa7415f0ff3\",\"slug\":\"woocommerce-tradegecko\",\"id\":245960}]}\";s:8:\"response\";a:2:{s:4:\"code\";i:200;s:7:\"message\";s:2:\"OK\";}s:7:\"cookies\";a:0:{}s:8:\"filename\";N;s:13:\"http_response\";O:25:\"WP_HTTP_Requests_Response\":5:{s:11:\"\0*\0response\";O:17:\"Requests_Response\":10:{s:4:\"body\";s:48310:\"{\"products\":[{\"title\":\"WooCommerce Google Analytics\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/GA-Dark.png\",\"excerpt\":\"Understand your customers and increase revenue with world\\u2019s leading analytics platform - integrated with WooCommerce for free.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-google-analytics\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"2d21f7de14dfb8e9885a4622be701ddf\",\"slug\":\"woocommerce-google-analytics-integration\",\"id\":1442927},{\"title\":\"WooCommerce Tax\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Tax-Dark.png\",\"excerpt\":\"Automatically calculate how much sales tax should be collected for WooCommerce orders - by city, country, or state - at checkout.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/tax\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"f31b3b9273cce188cc2b27f7849d02dd\",\"slug\":\"woocommerce-services\",\"id\":3220291},{\"title\":\"Stripe\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Stripe-Dark-1.png\",\"excerpt\":\"Accept all major debit and credit cards as well as local payment methods with Stripe.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/stripe\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"50bb7a985c691bb943a9da4d2c8b5efd\",\"slug\":\"woocommerce-gateway-stripe\",\"id\":18627},{\"title\":\"Jetpack\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Jetpack-Dark.png\",\"excerpt\":\"Power up and protect your store with Jetpack\\r\\n\\r\\nFor free security, insights and monitoring, connect to Jetpack. It\'s everything you need for a strong, secure start.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/jetpack\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"d5bfef9700b62b2b132c74c74c3193eb\",\"slug\":\"jetpack\",\"id\":2725249},{\"title\":\"Facebook for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Facebook-Dark.png\",\"excerpt\":\"Get the Official Facebook for WooCommerce plugin for three powerful ways to help grow your business.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/facebook\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"0ea4fe4c2d7ca6338f8a322fb3e4e187\",\"slug\":\"facebook-for-woocommerce\",\"id\":2127297},{\"title\":\"Amazon Pay\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Amazon-Pay-Dark.png\",\"excerpt\":\"Amazon Pay is embedded in your WooCommerce store. Transactions take place via\\u00a0Amazon widgets, so the buyer never leaves your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/pay-with-amazon\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"9865e043bbbe4f8c9735af31cb509b53\",\"slug\":\"woocommerce-gateway-amazon-payments-advanced\",\"id\":238816},{\"title\":\"Square for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Square-Dark.png\",\"excerpt\":\"Accepting payments is easy with Square. Clear rates, fast deposits (1-2 business days). Sell online and in person, and sync all payments, items and inventory.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/square\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"e907be8b86d7df0c8f8e0d0020b52638\",\"slug\":\"woocommerce-square\",\"id\":1770503},{\"title\":\"WooCommerce Shipping\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Ship-Dark-1.png\",\"excerpt\":\"Print USPS and DHL labels right from your WooCommerce dashboard and instantly save up to 90%. WooCommerce Shipping is free to use and saves you time and money.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipping\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"f31b3b9273cce188cc2b27f7849d02dd\",\"slug\":\"woocommerce-services\",\"id\":2165910},{\"title\":\"WooCommerce Payments\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Pay-Dark.png\",\"excerpt\":\"Securely accept payments, track cash flow, and manage recurring revenue from your dashboard \\u2014 all without setup costs or monthly fees.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"8c6319ca-8f41-4e69-be63-6b15ee37773b\",\"slug\":\"woocommerce-payments\",\"id\":5278104},{\"title\":\"Mailchimp for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/09\\/logo-mailchimp-dark-v2.png\",\"excerpt\":\"Increase traffic, drive repeat purchases, and personalize your marketing when you connect to Mailchimp.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/mailchimp-for-woocommerce\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"b4481616ebece8b1ff68fc59b90c1a91\",\"slug\":\"mailchimp-for-woocommerce\",\"id\":2545166},{\"title\":\"WooCommerce Subscriptions\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Subscriptions-Dark.png\",\"excerpt\":\"Let customers subscribe to your products or services and pay on a weekly, monthly or annual basis.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-subscriptions\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$199.00\",\"hash\":\"6115e6d7e297b623a169fdcf5728b224\",\"slug\":\"woocommerce-subscriptions\",\"id\":27147},{\"title\":\"PayPal Checkout\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Paypal-Dark.png\",\"excerpt\":\"PayPal Checkout now with Smart Payment Buttons\\u2122, dynamically displays, PayPal, Venmo, PayPal Credit, or other local payment options in a single stack giving customers the choice to pay with their preferred option.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-paypal-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"69e6cba62ac4021df9e117cc3f716d07\",\"slug\":\"woocommerce-gateway-paypal-express-checkout\",\"id\":1597922},{\"title\":\"ShipStation Integration\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Shipstation-Dark.png\",\"excerpt\":\"Fulfill all your Woo orders (and wherever else you sell) quickly and easily using ShipStation. Try it free for 30 days today!\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipstation-integration\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"9de8640767ba64237808ed7f245a49bb\",\"slug\":\"woocommerce-shipstation-integration\",\"id\":18734},{\"title\":\"Product Add-Ons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Product-Add-Ons-Dark.png\",\"excerpt\":\"Offer add-ons like gift wrapping, special messages or other special options for your products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"147d0077e591e16db9d0d67daeb8c484\",\"slug\":\"woocommerce-product-addons\",\"id\":18618},{\"title\":\"PayFast Payment Gateway\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Payfast-Dark-1.png\",\"excerpt\":\"Take payments on your WooCommerce store via PayFast (redirect method).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/payfast-payment-gateway\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"557bf07293ad916f20c207c6c9cd15ff\",\"slug\":\"woocommerce-payfast-gateway\",\"id\":18596},{\"title\":\"Google Ads & Marketing by Kliken\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2019\\/02\\/GA-for-Woo-Logo-374x192px-qu3duk.png\",\"excerpt\":\"Get in front of shoppers and drive traffic to your store so you can grow your business with Smart Shopping Campaigns and free listings.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/google-ads-and-marketing\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"bf66e173-a220-4da7-9512-b5728c20fc16\",\"slug\":\"kliken-marketing-for-google\",\"id\":3866145},{\"title\":\"USPS Shipping Method\",\"image\":\"\",\"excerpt\":\"Get shipping rates from the USPS API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/usps-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"83d1524e8f5f1913e58889f83d442c32\",\"slug\":\"woocommerce-shipping-usps\",\"id\":18657},{\"title\":\"UPS Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/UPS-Shipping-Method-Dark.png\",\"excerpt\":\"Get shipping rates from the UPS API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/ups-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8dae58502913bac0fbcdcaba515ea998\",\"slug\":\"woocommerce-shipping-ups\",\"id\":18665},{\"title\":\"Shipment Tracking\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Ship-Tracking-Dark-1.png\",\"excerpt\":\"Add shipment tracking information to your orders.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipment-tracking\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"1968e199038a8a001c9f9966fd06bf88\",\"slug\":\"woocommerce-shipment-tracking\",\"id\":18693},{\"title\":\"Table Rate Shipping\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Product-Table-Rate-Shipping-Dark.png\",\"excerpt\":\"Advanced, flexible shipping. Define multiple shipping rates based on location, price, weight, shipping class or item count.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/table-rate-shipping\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"3034ed8aff427b0f635fe4c86bbf008a\",\"slug\":\"woocommerce-table-rate-shipping\",\"id\":18718},{\"title\":\"Braintree for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/02\\/braintree-black-copy.png\",\"excerpt\":\"Accept PayPal, credit cards and debit cards with a single payment gateway solution \\u2014 PayPal Powered by Braintree.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-paypal-powered-by-braintree\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"27f010c8e34ca65b205ddec88ad14536\",\"slug\":\"woocommerce-gateway-paypal-powered-by-braintree\",\"id\":1489837},{\"title\":\"Checkout Field Editor\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Checkout-Field-Editor-Dark.png\",\"excerpt\":\"Optimize your checkout process by adding, removing or editing fields to suit your needs.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-checkout-field-editor\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"2b8029f0d7cdd1118f4d843eb3ab43ff\",\"slug\":\"woocommerce-checkout-field-editor\",\"id\":184594},{\"title\":\"WooCommerce Memberships\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2015\\/06\\/Thumbnail-Memberships-updated.png\",\"excerpt\":\"Give members access to restricted content or products, for a fee or for free.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-memberships\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$199.00\",\"hash\":\"9288e7609ad0b487b81ef6232efa5cfc\",\"slug\":\"woocommerce-memberships\",\"id\":958589},{\"title\":\"WooCommerce Bookings\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Bookings-Dark.png\",\"excerpt\":\"Allow customers to book appointments, make reservations or rent equipment without leaving your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-bookings\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/themes.woocommerce.com\\/hotel\\/\",\"price\":\"$249.00\",\"hash\":\"911c438934af094c2b38d5560b9f50f3\",\"slug\":\"WooCommerce Bookings\",\"id\":390890},{\"title\":\"Product Bundles\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-PB.png?v=1\",\"excerpt\":\"Offer personalized product bundles, bulk discount packages, and assembled\\u00a0products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-bundles\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"aa2518b5-ab19-4b75-bde9-60ca51e20f28\",\"slug\":\"woocommerce-product-bundles\",\"id\":18716},{\"title\":\"Multichannel for WooCommerce: Google, Amazon, eBay & Walmart Integration\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2018\\/10\\/Woo-Extension-Store-Logo-v2.png\",\"excerpt\":\"Get the official Google, Amazon, eBay and Walmart extension and create, sync and manage multichannel listings directly from WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/amazon-ebay-integration\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"e4000666-9275-4c71-8619-be61fb41c9f9\",\"slug\":\"woocommerce-amazon-ebay-integration\",\"id\":3545890},{\"title\":\"Min\\/Max Quantities\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Min-Max-Qua-Dark.png\",\"excerpt\":\"Specify minimum and maximum allowed product quantities for orders to be completed.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/minmax-quantities\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"2b5188d90baecfb781a5aa2d6abb900a\",\"slug\":\"woocommerce-min-max-quantities\",\"id\":18616},{\"title\":\"FedEx Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/01\\/FedEx_Logo_Wallpaper.jpeg\",\"excerpt\":\"Get shipping rates from the FedEx API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/fedex-shipping-module\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1a48b598b47a81559baadef15e320f64\",\"slug\":\"woocommerce-shipping-fedex\",\"id\":18620},{\"title\":\"LiveChat for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2015\\/11\\/LC_woo_regular-zmiaym.png\",\"excerpt\":\"Live Chat and messaging platform for sales and support -- increase average order value and overall sales through live conversations.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/livechat\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.livechat.com\\/livechat-for-ecommerce\\/?a=woocommerce&utm_source=woocommerce.com&utm_medium=integration&utm_campaign=woocommerce.com\",\"price\":\"$0.00\",\"hash\":\"5344cc1f-ed4a-4d00-beff-9d67f6d372f3\",\"slug\":\"livechat-woocommerce\",\"id\":1348888},{\"title\":\"Authorize.Net\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2013\\/04\\/Thumbnail-Authorize.net-updated.png\",\"excerpt\":\"Authorize.Net gateway with support for pre-orders and subscriptions.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/authorize-net\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8b61524fe53add7fdd1a8d1b00b9327d\",\"slug\":\"woocommerce-gateway-authorize-net-cim\",\"id\":178481},{\"title\":\"Product CSV Import Suite\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Product-CSV-Import-Dark.png\",\"excerpt\":\"Import, merge, and export products and variations to and from WooCommerce using a CSV file.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-csv-import-suite\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"7ac9b00a1fe980fb61d28ab54d167d0d\",\"slug\":\"woocommerce-product-csv-import-suite\",\"id\":18680},{\"title\":\"Follow-Ups\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Follow-Ups-Dark.png\",\"excerpt\":\"Automatically contact customers after purchase - be it everyone, your most loyal or your biggest spenders - and keep your store top-of-mind.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/follow-up-emails\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"05ece68fe94558e65278fe54d9ec84d2\",\"slug\":\"woocommerce-follow-up-emails\",\"id\":18686},{\"title\":\"WooCommerce Customer \\/ Order \\/ Coupon Export\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/02\\/Thumbnail-Customer-Order-Coupon-Export-updated.png\",\"excerpt\":\"Export customers, orders, and coupons from WooCommerce manually or on an automated schedule.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/ordercustomer-csv-export\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"914de15813a903c767b55445608bf290\",\"slug\":\"woocommerce-customer-order-csv-export\",\"id\":18652},{\"title\":\"Australia Post Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/australia-post.gif\",\"excerpt\":\"Get shipping rates for your WooCommerce store from the Australia Post API, which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/australia-post-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1dbd4dc6bd91a9cda1bd6b9e7a5e4f43\",\"slug\":\"woocommerce-shipping-australia-post\",\"id\":18622},{\"title\":\"Canada Post Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/canada-post.png\",\"excerpt\":\"Get shipping rates from the Canada Post Ratings API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/canada-post-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"ac029cdf3daba20b20c7b9be7dc00e0e\",\"slug\":\"woocommerce-shipping-canada-post\",\"id\":18623},{\"title\":\"Product Vendors\",\"image\":\"\",\"excerpt\":\"Turn your store into a multi-vendor marketplace\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-vendors\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"a97d99fccd651bbdd728f4d67d492c31\",\"slug\":\"woocommerce-product-vendors\",\"id\":219982},{\"title\":\"WooCommerce Accommodation Bookings\",\"image\":\"\",\"excerpt\":\"Book accommodation using WooCommerce and the WooCommerce Bookings extension.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-accommodation-bookings\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"99b2a7a4af90b6cefd2a733b3b1f78e7\",\"slug\":\"woocommerce-accommodation-bookings\",\"id\":1412069},{\"title\":\"Smart Coupons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/10\\/wc-product-smart-coupons.png\",\"excerpt\":\"Everything you need for discounts, coupons, credits, gift cards, product giveaways, offers, and promotions. Most popular and complete coupons plugin for WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/smart-coupons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/demo.storeapps.org\\/?demo=sc\",\"price\":\"$99.00\",\"hash\":\"05c45f2aa466106a466de4402fff9dde\",\"slug\":\"woocommerce-smart-coupons\",\"id\":18729},{\"title\":\"WooCommerce Brands\",\"image\":\"\",\"excerpt\":\"Create, assign and list brands for products, and allow customers to view by brand.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/brands\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"8a88c7cbd2f1e73636c331c7a86f818c\",\"slug\":\"woocommerce-brands\",\"id\":18737},{\"title\":\"Xero\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2012\\/08\\/xero2.png\",\"excerpt\":\"Save time with automated sync between WooCommerce and your Xero account.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/xero\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"f0dd29d338d3c67cf6cee88eddf6869b\",\"slug\":\"woocommerce-xero\",\"id\":18733},{\"title\":\"Royal Mail\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/04\\/royalmail.png\",\"excerpt\":\"Offer Royal Mail shipping rates to your customers\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/royal-mail\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"03839cca1a16c4488fcb669aeb91a056\",\"slug\":\"woocommerce-shipping-royalmail\",\"id\":182719},{\"title\":\"AutomateWoo\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-AutomateWoo-Dark-1.png\",\"excerpt\":\"Powerful marketing automation for WooCommerce. AutomateWoo has the tools you need to grow your store and make more money.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/automatewoo\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"ba9299b8-1dba-4aa0-a313-28bc1755cb88\",\"slug\":\"automatewoo\",\"id\":4652610},{\"title\":\"Advanced Notifications\",\"image\":\"\",\"excerpt\":\"Easily setup \\\"new order\\\" and stock email notifications for multiple recipients of your choosing.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/advanced-notifications\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"112372c44b002fea2640bd6bfafbca27\",\"slug\":\"woocommerce-advanced-notifications\",\"id\":18740},{\"title\":\"WooCommerce Zapier\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/woocommerce-zapier-logo.png\",\"excerpt\":\"Integrate with 3000+ cloud apps and services today.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-zapier\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$59.00\",\"hash\":\"0782bdbe932c00f4978850268c6cfe40\",\"slug\":\"woocommerce-zapier\",\"id\":243589},{\"title\":\"WooCommerce Points and Rewards\",\"image\":\"\",\"excerpt\":\"Reward your customers for purchases and other actions with points which can be redeemed for discounts.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-points-and-rewards\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"1649b6cca5da8b923b01ca56b5cdd246\",\"slug\":\"woocommerce-points-and-rewards\",\"id\":210259},{\"title\":\"Dynamic Pricing\",\"image\":\"\",\"excerpt\":\"Bulk discounts, role-based pricing and much more\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/dynamic-pricing\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"9a41775bb33843f52c93c922b0053986\",\"slug\":\"woocommerce-dynamic-pricing\",\"id\":18643},{\"title\":\"Name Your Price\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2012\\/09\\/nyp-icon-dark-v83owf.png\",\"excerpt\":\"Allow customers to define the product price. Also useful for accepting user-set donations.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/name-your-price\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"31b4e11696cd99a3c0572975a84f1c08\",\"slug\":\"woocommerce-name-your-price\",\"id\":18738},{\"title\":\"WooCommerce Print Invoices & Packing lists\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/03\\/Thumbnail-Print-Invoices-Packing-lists-updated.png\",\"excerpt\":\"Generate invoices, packing slips, and pick lists for your WooCommerce orders.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/print-invoices-packing-lists\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"465de1126817cdfb42d97ebca7eea717\",\"slug\":\"woocommerce-pip\",\"id\":18666},{\"title\":\"WooCommerce Pre-Orders\",\"image\":\"\",\"excerpt\":\"Allow customers to order products before they are available.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-pre-orders\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"b2dc75e7d55e6f5bbfaccb59830f66b7\",\"slug\":\"woocommerce-pre-orders\",\"id\":178477},{\"title\":\"WooCommerce Subscription Downloads\",\"image\":\"\",\"excerpt\":\"Offer additional downloads to your subscribers, via downloadable products listed in your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-subscription-downloads\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"5be9e21c13953253e4406d2a700382ec\",\"slug\":\"woocommerce-subscription-downloads\",\"id\":420458},{\"title\":\"WooCommerce Additional Variation Images\",\"image\":\"\",\"excerpt\":\"Add gallery images per variation on variable products within WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-additional-variation-images\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/themes.woocommerce.com\\/storefront\\/product\\/woo-single-1\\/\",\"price\":\"$49.00\",\"hash\":\"c61dd6de57dcecb32bd7358866de4539\",\"slug\":\"woocommerce-additional-variation-images\",\"id\":477384},{\"title\":\"WooCommerce Deposits\",\"image\":\"\",\"excerpt\":\"Enable customers to pay for products using a deposit or a payment plan.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-deposits\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$179.00\",\"hash\":\"de192a6cf12c4fd803248da5db700762\",\"slug\":\"woocommerce-deposits\",\"id\":977087},{\"title\":\"Google Product Feed\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2011\\/11\\/logo-regular-lscryp.png\",\"excerpt\":\"Feed product data to Google Merchant Center for setting up Google product listings & product ads.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/google-product-feed\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"d55b4f852872025741312839f142447e\",\"slug\":\"woocommerce-product-feeds\",\"id\":18619},{\"title\":\"Amazon S3 Storage\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/amazon.png\",\"excerpt\":\"Serve digital products via Amazon S3\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/amazon-s3-storage\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"473bf6f221b865eff165c97881b473bb\",\"slug\":\"woocommerce-amazon-s3-storage\",\"id\":18663},{\"title\":\"Cart Add-ons\",\"image\":\"\",\"excerpt\":\"A powerful tool for driving incremental and impulse purchases by customers once they are in the shopping cart\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/cart-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"3a8ef25334396206f5da4cf208adeda3\",\"slug\":\"woocommerce-cart-add-ons\",\"id\":18717},{\"title\":\"Shipping Multiple Addresses\",\"image\":\"\",\"excerpt\":\"Allow your customers to ship individual items in a single order to multiple addresses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipping-multiple-addresses\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"aa0eb6f777846d329952d5b891d6f8cc\",\"slug\":\"woocommerce-shipping-multiple-addresses\",\"id\":18741},{\"title\":\"WooCommerce AvaTax\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/01\\/Thumbnail-Avalara-updated.png\",\"excerpt\":\"Get 100% accurate sales tax calculations and on time tax return filing. No more tracking sales tax rates, rules, or jurisdictional boundaries.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-avatax\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"57077a4b28ba71cacf692bcf4a1a7f60\",\"slug\":\"woocommerce-avatax\",\"id\":1389326},{\"title\":\"PayPal Payments Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Paypal-Payments-Pro-Dark.png\",\"excerpt\":\"Take credit card payments directly on your checkout using PayPal Pro.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/paypal-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"6d23ba7f0e0198937c0029f9e865b40e\",\"slug\":\"woocommerce-gateway-paypal-pro\",\"id\":18594},{\"title\":\"Klarna Checkout\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2018\\/01\\/Partner_marketing_Klarna_Checkout_Black-1.png\",\"excerpt\":\"Klarna Checkout is a full checkout experience embedded on your site that includes all popular payment methods (Pay Now, Pay Later, Financing, Installments).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/klarna-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/demo.krokedil.se\\/klarnacheckout\\/\",\"price\":\"$0.00\",\"hash\":\"90f8ce584e785fcd8c2d739fd4f40d78\",\"slug\":\"klarna-checkout-for-woocommerce\",\"id\":2754152},{\"title\":\"Bulk Stock Management\",\"image\":\"\",\"excerpt\":\"Edit product and variation stock levels in bulk via this handy interface\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/bulk-stock-management\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"02f4328d52f324ebe06a78eaaae7934f\",\"slug\":\"woocommerce-bulk-stock-management\",\"id\":18670},{\"title\":\"Gravity Forms Product Add-ons\",\"image\":\"\",\"excerpt\":\"Powerful product add-ons, Gravity style\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/gravity-forms-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.elementstark.com\\/woocommerce-extension-demos\\/product-category\\/gravity-forms\\/\",\"price\":\"$99.00\",\"hash\":\"a6ac0ab1a1536e3a357ccf24c0650ed0\",\"slug\":\"woocommerce-gravityforms-product-addons\",\"id\":18633},{\"title\":\"WooCommerce Email Customizer\",\"image\":\"\",\"excerpt\":\"Connect with your customers with each email you send by visually modifying your email templates via the WordPress Customizer.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-email-customizer\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"bd909fa97874d431f203b5336c7e8873\",\"slug\":\"woocommerce-email-customizer\",\"id\":853277},{\"title\":\"Composite Products\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-CP.png?v=1\",\"excerpt\":\"Create product kit builders and custom product configurators using existing products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/composite-products\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"0343e0115bbcb97ccd98442b8326a0af\",\"slug\":\"woocommerce-composite-products\",\"id\":216836},{\"title\":\"Force Sells\",\"image\":\"\",\"excerpt\":\"Force products to be added to the cart\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/force-sells\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"3ebddfc491ca168a4ea4800b893302b0\",\"slug\":\"woocommerce-force-sells\",\"id\":18678},{\"title\":\"TaxJar\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/10\\/taxjar-logotype.png\",\"excerpt\":\"Save hours every month by putting your sales tax on autopilot. Automated, multi-state sales tax calculation, reporting, and filing for your WooCommerce store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/taxjar\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"12072d8e-e933-4561-97b1-9db3c7eeed91\",\"slug\":\"taxjar-simplified-taxes-for-woocommerce\",\"id\":514914},{\"title\":\"WooCommerce Quick View\",\"image\":\"\",\"excerpt\":\"Show a quick-view button to view product details and add to cart via lightbox popup\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-quick-view\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"619c6e57ce72c49c4b57e15b06eddb65\",\"slug\":\"woocommerce-quick-view\",\"id\":187509},{\"title\":\"WooCommerce Purchase Order Gateway\",\"image\":\"\",\"excerpt\":\"Receive purchase orders via your WooCommerce-powered online store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-purchase-order\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"573a92318244ece5facb449d63e74874\",\"slug\":\"woocommerce-gateway-purchase-order\",\"id\":478542},{\"title\":\"Returns and Warranty Requests\",\"image\":\"\",\"excerpt\":\"Manage the RMA process, add warranties to products & let customers request & manage returns \\/ exchanges from their account.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/warranty-requests\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"9b4c41102e6b61ea5f558e16f9b63e25\",\"slug\":\"woocommerce-warranty\",\"id\":228315},{\"title\":\"Product Enquiry Form\",\"image\":\"\",\"excerpt\":\"Allow visitors to contact you directly from the product details page via a reCAPTCHA protected form to enquire about a product.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-enquiry-form\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"5a0f5d72519a8ffcc86669f042296937\",\"slug\":\"woocommerce-product-enquiry-form\",\"id\":18601},{\"title\":\"WooCommerce Box Office\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-BO-Dark.png\",\"excerpt\":\"Sell tickets for your next event, concert, function, fundraiser or conference directly on your own site\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-box-office\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"e704c9160de318216a8fa657404b9131\",\"slug\":\"woocommerce-box-office\",\"id\":1628717},{\"title\":\"WooCommerce Order Barcodes\",\"image\":\"\",\"excerpt\":\"Generates a unique barcode for each order on your site - perfect for e-tickets, packing slips, reservations and a variety of other uses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-barcodes\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"889835bb29ee3400923653e1e44a3779\",\"slug\":\"woocommerce-order-barcodes\",\"id\":391708},{\"title\":\"WooCommerce 360\\u00ba Image\",\"image\":\"\",\"excerpt\":\"An easy way to add a dynamic, controllable 360\\u00ba image rotation to your WooCommerce site, by adding a group of images to a product\\u2019s gallery.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-360-image\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"24eb2cfa3738a66bf3b2587876668cd2\",\"slug\":\"woocommerce-360-image\",\"id\":512186},{\"title\":\"WooCommerce Paid Courses\",\"image\":\"\",\"excerpt\":\"Sell your online courses using the most popular eCommerce platform on the web \\u2013 WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-paid-courses\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"bad2a02a063555b7e2bee59924690763\",\"slug\":\"woothemes-sensei\",\"id\":152116},{\"title\":\"WooCommerce Photography\",\"image\":\"\",\"excerpt\":\"Sell photos in the blink of an eye using this simple as dragging & dropping interface.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-photography\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"ee76e8b9daf1d97ca4d3874cc9e35687\",\"slug\":\"woocommerce-photography\",\"id\":583602},{\"title\":\"WooCommerce Bookings Availability\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Bookings-Aval-Dark.png\",\"excerpt\":\"Sell more bookings by presenting a calendar or schedule of available slots in a page or post.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/bookings-availability\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"30770d2a-e392-4e82-baaa-76cfc7d02ae3\",\"slug\":\"woocommerce-bookings-availability\",\"id\":4228225},{\"title\":\"Software Add-on\",\"image\":\"\",\"excerpt\":\"Sell License Keys for Software\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/software-add-on\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"79f6dbfe1f1d3a56a86f0509b6d6b04b\",\"slug\":\"woocommerce-software-add-on\",\"id\":18683},{\"title\":\"WooCommerce Products Compare\",\"image\":\"\",\"excerpt\":\"WooCommerce Products Compare will allow your potential customers to easily compare products within your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-products-compare\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"c3ba0a4a3199a0cc7a6112eb24414548\",\"slug\":\"woocommerce-products-compare\",\"id\":853117},{\"title\":\"WooCommerce Store Catalog PDF Download\",\"image\":\"\",\"excerpt\":\"Offer your customers a PDF download of your product catalog, generated by WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-store-catalog-pdf-download\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"79ca7aadafe706364e2d738b7c1090c4\",\"slug\":\"woocommerce-store-catalog-pdf-download\",\"id\":675790},{\"title\":\"eWAY\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2011\\/10\\/eway-logo-3000-2000.jpg\",\"excerpt\":\"Take credit card payments securely via eWay (SG, MY, HK, AU, and NZ) keeping customers on your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/eway\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"2c497769d98d025e0d340cd0b5ea5da1\",\"slug\":\"woocommerce-gateway-eway\",\"id\":18604},{\"title\":\"Catalog Visibility Options\",\"image\":\"\",\"excerpt\":\"Transform WooCommerce into an online catalog by removing eCommerce functionality\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/catalog-visibility-options\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"12e791110365fdbb5865c8658907967e\",\"slug\":\"woocommerce-catalog-visibility-options\",\"id\":18648},{\"title\":\"WooCommerce Blocks\",\"image\":\"\",\"excerpt\":\"WooCommerce Blocks offers a range of Gutenberg blocks you can use to build and customise your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gutenberg-products-block\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"c2e9f13a-f90c-4ffe-a8a5-b432399ec263\",\"slug\":\"woo-gutenberg-products-block\",\"id\":3076677},{\"title\":\"Sequential Order Numbers Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/05\\/Thumbnail-Sequential-Order-Numbers-Pro-updated.png\",\"excerpt\":\"Tame your order numbers! Advanced & sequential order numbers with optional prefixes \\/ suffixes\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/sequential-order-numbers-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"0b18a2816e016ba9988b93b1cd8fe766\",\"slug\":\"woocommerce-sequential-order-numbers-pro\",\"id\":18688},{\"title\":\"Conditional Shipping and Payments\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-CSP.png?v=1\",\"excerpt\":\"Use conditional logic to restrict the shipping and payment options available on your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/conditional-shipping-and-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1f56ff002fa830b77017b0107505211a\",\"slug\":\"woocommerce-conditional-shipping-and-payments\",\"id\":680253},{\"title\":\"WooCommerce Order Status Manager\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2015\\/02\\/Thumbnail-Order-Status-Manager-updated.png\",\"excerpt\":\"Create, edit, and delete completely custom order statuses and integrate them seamlessly into your order management flow.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-status-manager\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"51fd9ab45394b4cad5a0ebf58d012342\",\"slug\":\"woocommerce-order-status-manager\",\"id\":588398},{\"title\":\"WooCommerce Checkout Add-Ons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/07\\/Thumbnail-Checkout-Add-Ons-updated.png\",\"excerpt\":\"Highlight relevant products, offers like free shipping and other up-sells during checkout.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-checkout-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8fdca00b4000b7a8cc26371d0e470a8f\",\"slug\":\"woocommerce-checkout-add-ons\",\"id\":466854},{\"title\":\"QuickBooks Sync for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2019\\/04\\/woocommerce-com-logo-1-hyhzbh.png\",\"excerpt\":\"Automatic two-way sync for orders, customers, products, inventory and more between WooCommerce and QuickBooks (Online, Desktop, or POS).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/quickbooks-sync-for-woocommerce\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"c5e32e20-7c1f-4585-8b15-d930c2d842ac\",\"slug\":\"myworks-woo-sync-for-quickbooks-online\",\"id\":4065824},{\"title\":\"WooCommerce Google Analytics Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/01\\/Thumbnail-GAPro-updated.png\",\"excerpt\":\"Add advanced event tracking and enhanced eCommerce tracking to your WooCommerce site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-google-analytics-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"d8aed8b7306b509eec1589e59abe319f\",\"slug\":\"woocommerce-google-analytics-pro\",\"id\":1312497},{\"title\":\"WooCommerce One Page Checkout\",\"image\":\"\",\"excerpt\":\"Create special pages where customers can choose products, checkout & pay all on the one page.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-one-page-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"c9ba8f8352cd71b5508af5161268619a\",\"slug\":\"woocommerce-one-page-checkout\",\"id\":527886},{\"title\":\"WooCommerce Product Search\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2014\\/10\\/woocommerce-product-search-product-image-1870x960-1-jvsljj.png\",\"excerpt\":\"The perfect search engine helps customers to find and buy products quickly \\u2013 essential for every WooCommerce store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-product-search\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/demo.itthinx.com\\/wps\\/\",\"price\":\"$49.00\",\"hash\":\"c84cc8ca16ddac3408e6b6c5871133a8\",\"slug\":\"woocommerce-product-search\",\"id\":512174},{\"title\":\"First Data\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/02\\/Thumbnail-FirstData-updated.png\",\"excerpt\":\"FirstData gateway for WooCommerce\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/firstdata\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"eb3e32663ec0810592eaf0d097796230\",\"slug\":\"woocommerce-gateway-firstdata\",\"id\":18645},{\"title\":\"WooSlider\",\"image\":\"\",\"excerpt\":\"WooSlider is the ultimate responsive slideshow WordPress slider plugin\\r\\n\\r\\n\\u00a0\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/wooslider\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/www.wooslider.com\\/\",\"price\":\"$49.00\",\"hash\":\"209d98f3ccde6cc3de7e8732a2b20b6a\",\"slug\":\"wooslider\",\"id\":46506},{\"title\":\"WooCommerce Social Login\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/08\\/Thumbnail-Social-Login-updated.png\",\"excerpt\":\"Enable Social Login for seamless checkout and account creation.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-social-login\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/demos.skyverge.com\\/woocommerce-social-login\\/\",\"price\":\"$79.00\",\"hash\":\"b231cd6367a79cc8a53b7d992d77525d\",\"slug\":\"woocommerce-social-login\",\"id\":473617},{\"title\":\"Coupon Shortcodes\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/09\\/woocommerce-coupon-shortcodes-product-image-1870x960-1-vc5gux.png\",\"excerpt\":\"Show coupon discount info using shortcodes. Allows to render coupon information and content conditionally, based on the validity of coupons.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/coupon-shortcodes\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"ac5d9d51-70b2-4d8f-8b89-24200eea1394\",\"slug\":\"woocommerce-coupon-shortcodes\",\"id\":244762},{\"title\":\"WooCommerce Order Status Control\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/06\\/Thumbnail-Order-Status-Control-updated.png\",\"excerpt\":\"Use this extension to automatically change the order status to \\\"completed\\\" after successful payment.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-status-control\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"32400e509c7c36dcc1cd368e8267d981\",\"slug\":\"woocommerce-order-status-control\",\"id\":439037},{\"title\":\"Variation Swatches and Photos\",\"image\":\"\",\"excerpt\":\"Show color and image swatches instead of dropdowns for variable products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/variation-swatches-and-photos\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.elementstark.com\\/woocommerce-extension-demos\\/product-category\\/swatches-and-photos\\/\",\"price\":\"$99.00\",\"hash\":\"37bea8d549df279c8278878d081b062f\",\"slug\":\"woocommerce-variation-swatches-and-photos\",\"id\":18697},{\"title\":\"Jilt\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2017\\/12\\/Thumbnail-Jilt-updated.png\",\"excerpt\":\"All-in-one email marketing platform built for WooCommerce stores. Send newsletters, abandoned cart reminders, win-backs, welcome automations, and more.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/jilt\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"b53aafb64dca33835e41ee06de7e9816\",\"slug\":\"jilt-for-woocommerce\",\"id\":2754876},{\"title\":\"PayPal\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2020\\/10\\/PPCP-Tile-PayPal-Logo-and-Cart-Art-2x-2-uozwz8.jpg\",\"excerpt\":\"PayPal\\u2019s latest, most complete payment processing solution. Accept PayPal exclusives, credit\\/debit cards and local payment methods. Turn on only PayPal options or process a full suite of payment methods. Enable global transactions with extensive currency and country coverage. Built and supported by WooCommerce and PayPal.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-paypal-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"934115ab-e3f3-4435-9580-345b1ce21899\",\"slug\":\"woocommerce-paypal-payments\",\"id\":6410731},{\"title\":\"Opayo Payment Suite\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2011\\/10\\/Opayo_logo_RGB.png\",\"excerpt\":\"Take payments on your WooCommerce store via Opayo (formally SagePay).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/sage-pay-form\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"6bc0cca47d0274d8ef9b164f6fbec1cc\",\"slug\":\"woocommerce-gateway-sagepay-form\",\"id\":18599},{\"title\":\"EU VAT Number\",\"image\":\"\",\"excerpt\":\"Collect VAT numbers at checkout and remove the VAT charge for eligible EU businesses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/eu-vat-number\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"d2720c4b4bb8d6908e530355b7a2d734\",\"slug\":\"woocommerce-eu-vat-number\",\"id\":18592},{\"title\":\"QuickBooks Commerce (formerly TradeGecko)\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2013\\/09\\/qbo-mark.png\",\"excerpt\":\"Get a wholesale and multichannel inventory & order management platform for your WooCommerce store with QuickBooks Commerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-tradegecko\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"21da7811f7fc1f13ee19daa7415f0ff3\",\"slug\":\"woocommerce-tradegecko\",\"id\":245960}]}\";s:3:\"raw\";s:48948:\"HTTP/1.1 200 OK\r\nServer: nginx\r\nDate: Thu, 03 Jun 2021 11:28:45 GMT\r\nContent-Type: application/json; charset=UTF-8\r\nContent-Length: 11634\r\nConnection: close\r\nX-Robots-Tag: noindex\r\nLink: ; rel=\"https://api.w.org/\"\r\nX-Content-Type-Options: nosniff\r\nAccess-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages, Link\r\nAccess-Control-Allow-Headers: Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type\r\nX-WCCOM-Cache: HIT\r\nCache-Control: max-age=60\r\nAllow: GET\r\nContent-Encoding: gzip\r\nX-rq: vie2 87 111 3196\r\nAge: 21\r\nX-Cache: hit\r\nVary: Accept-Encoding, Origin\r\nAccept-Ranges: bytes\r\n\r\n{\"products\":[{\"title\":\"WooCommerce Google Analytics\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/GA-Dark.png\",\"excerpt\":\"Understand your customers and increase revenue with world\\u2019s leading analytics platform - integrated with WooCommerce for free.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-google-analytics\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"2d21f7de14dfb8e9885a4622be701ddf\",\"slug\":\"woocommerce-google-analytics-integration\",\"id\":1442927},{\"title\":\"WooCommerce Tax\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Tax-Dark.png\",\"excerpt\":\"Automatically calculate how much sales tax should be collected for WooCommerce orders - by city, country, or state - at checkout.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/tax\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"f31b3b9273cce188cc2b27f7849d02dd\",\"slug\":\"woocommerce-services\",\"id\":3220291},{\"title\":\"Stripe\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Stripe-Dark-1.png\",\"excerpt\":\"Accept all major debit and credit cards as well as local payment methods with Stripe.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/stripe\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"50bb7a985c691bb943a9da4d2c8b5efd\",\"slug\":\"woocommerce-gateway-stripe\",\"id\":18627},{\"title\":\"Jetpack\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Jetpack-Dark.png\",\"excerpt\":\"Power up and protect your store with Jetpack\\r\\n\\r\\nFor free security, insights and monitoring, connect to Jetpack. It\'s everything you need for a strong, secure start.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/jetpack\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"d5bfef9700b62b2b132c74c74c3193eb\",\"slug\":\"jetpack\",\"id\":2725249},{\"title\":\"Facebook for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Facebook-Dark.png\",\"excerpt\":\"Get the Official Facebook for WooCommerce plugin for three powerful ways to help grow your business.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/facebook\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"0ea4fe4c2d7ca6338f8a322fb3e4e187\",\"slug\":\"facebook-for-woocommerce\",\"id\":2127297},{\"title\":\"Amazon Pay\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Amazon-Pay-Dark.png\",\"excerpt\":\"Amazon Pay is embedded in your WooCommerce store. Transactions take place via\\u00a0Amazon widgets, so the buyer never leaves your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/pay-with-amazon\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"9865e043bbbe4f8c9735af31cb509b53\",\"slug\":\"woocommerce-gateway-amazon-payments-advanced\",\"id\":238816},{\"title\":\"Square for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Square-Dark.png\",\"excerpt\":\"Accepting payments is easy with Square. Clear rates, fast deposits (1-2 business days). Sell online and in person, and sync all payments, items and inventory.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/square\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"e907be8b86d7df0c8f8e0d0020b52638\",\"slug\":\"woocommerce-square\",\"id\":1770503},{\"title\":\"WooCommerce Shipping\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Ship-Dark-1.png\",\"excerpt\":\"Print USPS and DHL labels right from your WooCommerce dashboard and instantly save up to 90%. WooCommerce Shipping is free to use and saves you time and money.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipping\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"f31b3b9273cce188cc2b27f7849d02dd\",\"slug\":\"woocommerce-services\",\"id\":2165910},{\"title\":\"WooCommerce Payments\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Pay-Dark.png\",\"excerpt\":\"Securely accept payments, track cash flow, and manage recurring revenue from your dashboard \\u2014 all without setup costs or monthly fees.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"8c6319ca-8f41-4e69-be63-6b15ee37773b\",\"slug\":\"woocommerce-payments\",\"id\":5278104},{\"title\":\"Mailchimp for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/09\\/logo-mailchimp-dark-v2.png\",\"excerpt\":\"Increase traffic, drive repeat purchases, and personalize your marketing when you connect to Mailchimp.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/mailchimp-for-woocommerce\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"b4481616ebece8b1ff68fc59b90c1a91\",\"slug\":\"mailchimp-for-woocommerce\",\"id\":2545166},{\"title\":\"WooCommerce Subscriptions\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Subscriptions-Dark.png\",\"excerpt\":\"Let customers subscribe to your products or services and pay on a weekly, monthly or annual basis.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-subscriptions\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$199.00\",\"hash\":\"6115e6d7e297b623a169fdcf5728b224\",\"slug\":\"woocommerce-subscriptions\",\"id\":27147},{\"title\":\"PayPal Checkout\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Paypal-Dark.png\",\"excerpt\":\"PayPal Checkout now with Smart Payment Buttons\\u2122, dynamically displays, PayPal, Venmo, PayPal Credit, or other local payment options in a single stack giving customers the choice to pay with their preferred option.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-paypal-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"69e6cba62ac4021df9e117cc3f716d07\",\"slug\":\"woocommerce-gateway-paypal-express-checkout\",\"id\":1597922},{\"title\":\"ShipStation Integration\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Shipstation-Dark.png\",\"excerpt\":\"Fulfill all your Woo orders (and wherever else you sell) quickly and easily using ShipStation. Try it free for 30 days today!\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipstation-integration\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"9de8640767ba64237808ed7f245a49bb\",\"slug\":\"woocommerce-shipstation-integration\",\"id\":18734},{\"title\":\"Product Add-Ons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Product-Add-Ons-Dark.png\",\"excerpt\":\"Offer add-ons like gift wrapping, special messages or other special options for your products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"147d0077e591e16db9d0d67daeb8c484\",\"slug\":\"woocommerce-product-addons\",\"id\":18618},{\"title\":\"PayFast Payment Gateway\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Payfast-Dark-1.png\",\"excerpt\":\"Take payments on your WooCommerce store via PayFast (redirect method).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/payfast-payment-gateway\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"557bf07293ad916f20c207c6c9cd15ff\",\"slug\":\"woocommerce-payfast-gateway\",\"id\":18596},{\"title\":\"Google Ads & Marketing by Kliken\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2019\\/02\\/GA-for-Woo-Logo-374x192px-qu3duk.png\",\"excerpt\":\"Get in front of shoppers and drive traffic to your store so you can grow your business with Smart Shopping Campaigns and free listings.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/google-ads-and-marketing\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"bf66e173-a220-4da7-9512-b5728c20fc16\",\"slug\":\"kliken-marketing-for-google\",\"id\":3866145},{\"title\":\"USPS Shipping Method\",\"image\":\"\",\"excerpt\":\"Get shipping rates from the USPS API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/usps-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"83d1524e8f5f1913e58889f83d442c32\",\"slug\":\"woocommerce-shipping-usps\",\"id\":18657},{\"title\":\"UPS Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/UPS-Shipping-Method-Dark.png\",\"excerpt\":\"Get shipping rates from the UPS API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/ups-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8dae58502913bac0fbcdcaba515ea998\",\"slug\":\"woocommerce-shipping-ups\",\"id\":18665},{\"title\":\"Shipment Tracking\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Ship-Tracking-Dark-1.png\",\"excerpt\":\"Add shipment tracking information to your orders.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipment-tracking\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"1968e199038a8a001c9f9966fd06bf88\",\"slug\":\"woocommerce-shipment-tracking\",\"id\":18693},{\"title\":\"Table Rate Shipping\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Product-Table-Rate-Shipping-Dark.png\",\"excerpt\":\"Advanced, flexible shipping. Define multiple shipping rates based on location, price, weight, shipping class or item count.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/table-rate-shipping\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"3034ed8aff427b0f635fe4c86bbf008a\",\"slug\":\"woocommerce-table-rate-shipping\",\"id\":18718},{\"title\":\"Braintree for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/02\\/braintree-black-copy.png\",\"excerpt\":\"Accept PayPal, credit cards and debit cards with a single payment gateway solution \\u2014 PayPal Powered by Braintree.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-paypal-powered-by-braintree\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"27f010c8e34ca65b205ddec88ad14536\",\"slug\":\"woocommerce-gateway-paypal-powered-by-braintree\",\"id\":1489837},{\"title\":\"Checkout Field Editor\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Checkout-Field-Editor-Dark.png\",\"excerpt\":\"Optimize your checkout process by adding, removing or editing fields to suit your needs.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-checkout-field-editor\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"2b8029f0d7cdd1118f4d843eb3ab43ff\",\"slug\":\"woocommerce-checkout-field-editor\",\"id\":184594},{\"title\":\"WooCommerce Memberships\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2015\\/06\\/Thumbnail-Memberships-updated.png\",\"excerpt\":\"Give members access to restricted content or products, for a fee or for free.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-memberships\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$199.00\",\"hash\":\"9288e7609ad0b487b81ef6232efa5cfc\",\"slug\":\"woocommerce-memberships\",\"id\":958589},{\"title\":\"WooCommerce Bookings\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Bookings-Dark.png\",\"excerpt\":\"Allow customers to book appointments, make reservations or rent equipment without leaving your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-bookings\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/themes.woocommerce.com\\/hotel\\/\",\"price\":\"$249.00\",\"hash\":\"911c438934af094c2b38d5560b9f50f3\",\"slug\":\"WooCommerce Bookings\",\"id\":390890},{\"title\":\"Product Bundles\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-PB.png?v=1\",\"excerpt\":\"Offer personalized product bundles, bulk discount packages, and assembled\\u00a0products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-bundles\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"aa2518b5-ab19-4b75-bde9-60ca51e20f28\",\"slug\":\"woocommerce-product-bundles\",\"id\":18716},{\"title\":\"Multichannel for WooCommerce: Google, Amazon, eBay & Walmart Integration\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2018\\/10\\/Woo-Extension-Store-Logo-v2.png\",\"excerpt\":\"Get the official Google, Amazon, eBay and Walmart extension and create, sync and manage multichannel listings directly from WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/amazon-ebay-integration\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"e4000666-9275-4c71-8619-be61fb41c9f9\",\"slug\":\"woocommerce-amazon-ebay-integration\",\"id\":3545890},{\"title\":\"Min\\/Max Quantities\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Min-Max-Qua-Dark.png\",\"excerpt\":\"Specify minimum and maximum allowed product quantities for orders to be completed.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/minmax-quantities\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"2b5188d90baecfb781a5aa2d6abb900a\",\"slug\":\"woocommerce-min-max-quantities\",\"id\":18616},{\"title\":\"FedEx Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/01\\/FedEx_Logo_Wallpaper.jpeg\",\"excerpt\":\"Get shipping rates from the FedEx API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/fedex-shipping-module\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1a48b598b47a81559baadef15e320f64\",\"slug\":\"woocommerce-shipping-fedex\",\"id\":18620},{\"title\":\"LiveChat for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2015\\/11\\/LC_woo_regular-zmiaym.png\",\"excerpt\":\"Live Chat and messaging platform for sales and support -- increase average order value and overall sales through live conversations.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/livechat\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.livechat.com\\/livechat-for-ecommerce\\/?a=woocommerce&utm_source=woocommerce.com&utm_medium=integration&utm_campaign=woocommerce.com\",\"price\":\"$0.00\",\"hash\":\"5344cc1f-ed4a-4d00-beff-9d67f6d372f3\",\"slug\":\"livechat-woocommerce\",\"id\":1348888},{\"title\":\"Authorize.Net\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2013\\/04\\/Thumbnail-Authorize.net-updated.png\",\"excerpt\":\"Authorize.Net gateway with support for pre-orders and subscriptions.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/authorize-net\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8b61524fe53add7fdd1a8d1b00b9327d\",\"slug\":\"woocommerce-gateway-authorize-net-cim\",\"id\":178481},{\"title\":\"Product CSV Import Suite\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Product-CSV-Import-Dark.png\",\"excerpt\":\"Import, merge, and export products and variations to and from WooCommerce using a CSV file.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-csv-import-suite\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"7ac9b00a1fe980fb61d28ab54d167d0d\",\"slug\":\"woocommerce-product-csv-import-suite\",\"id\":18680},{\"title\":\"Follow-Ups\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Follow-Ups-Dark.png\",\"excerpt\":\"Automatically contact customers after purchase - be it everyone, your most loyal or your biggest spenders - and keep your store top-of-mind.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/follow-up-emails\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"05ece68fe94558e65278fe54d9ec84d2\",\"slug\":\"woocommerce-follow-up-emails\",\"id\":18686},{\"title\":\"WooCommerce Customer \\/ Order \\/ Coupon Export\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/02\\/Thumbnail-Customer-Order-Coupon-Export-updated.png\",\"excerpt\":\"Export customers, orders, and coupons from WooCommerce manually or on an automated schedule.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/ordercustomer-csv-export\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"914de15813a903c767b55445608bf290\",\"slug\":\"woocommerce-customer-order-csv-export\",\"id\":18652},{\"title\":\"Australia Post Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/australia-post.gif\",\"excerpt\":\"Get shipping rates for your WooCommerce store from the Australia Post API, which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/australia-post-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1dbd4dc6bd91a9cda1bd6b9e7a5e4f43\",\"slug\":\"woocommerce-shipping-australia-post\",\"id\":18622},{\"title\":\"Canada Post Shipping Method\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/canada-post.png\",\"excerpt\":\"Get shipping rates from the Canada Post Ratings API which handles both domestic and international parcels.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/canada-post-shipping-method\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"ac029cdf3daba20b20c7b9be7dc00e0e\",\"slug\":\"woocommerce-shipping-canada-post\",\"id\":18623},{\"title\":\"Product Vendors\",\"image\":\"\",\"excerpt\":\"Turn your store into a multi-vendor marketplace\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-vendors\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"a97d99fccd651bbdd728f4d67d492c31\",\"slug\":\"woocommerce-product-vendors\",\"id\":219982},{\"title\":\"WooCommerce Accommodation Bookings\",\"image\":\"\",\"excerpt\":\"Book accommodation using WooCommerce and the WooCommerce Bookings extension.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-accommodation-bookings\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"99b2a7a4af90b6cefd2a733b3b1f78e7\",\"slug\":\"woocommerce-accommodation-bookings\",\"id\":1412069},{\"title\":\"Smart Coupons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/10\\/wc-product-smart-coupons.png\",\"excerpt\":\"Everything you need for discounts, coupons, credits, gift cards, product giveaways, offers, and promotions. Most popular and complete coupons plugin for WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/smart-coupons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/demo.storeapps.org\\/?demo=sc\",\"price\":\"$99.00\",\"hash\":\"05c45f2aa466106a466de4402fff9dde\",\"slug\":\"woocommerce-smart-coupons\",\"id\":18729},{\"title\":\"WooCommerce Brands\",\"image\":\"\",\"excerpt\":\"Create, assign and list brands for products, and allow customers to view by brand.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/brands\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"8a88c7cbd2f1e73636c331c7a86f818c\",\"slug\":\"woocommerce-brands\",\"id\":18737},{\"title\":\"Xero\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2012\\/08\\/xero2.png\",\"excerpt\":\"Save time with automated sync between WooCommerce and your Xero account.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/xero\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"f0dd29d338d3c67cf6cee88eddf6869b\",\"slug\":\"woocommerce-xero\",\"id\":18733},{\"title\":\"Royal Mail\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/04\\/royalmail.png\",\"excerpt\":\"Offer Royal Mail shipping rates to your customers\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/royal-mail\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"03839cca1a16c4488fcb669aeb91a056\",\"slug\":\"woocommerce-shipping-royalmail\",\"id\":182719},{\"title\":\"AutomateWoo\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-AutomateWoo-Dark-1.png\",\"excerpt\":\"Powerful marketing automation for WooCommerce. AutomateWoo has the tools you need to grow your store and make more money.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/automatewoo\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"ba9299b8-1dba-4aa0-a313-28bc1755cb88\",\"slug\":\"automatewoo\",\"id\":4652610},{\"title\":\"Advanced Notifications\",\"image\":\"\",\"excerpt\":\"Easily setup \\\"new order\\\" and stock email notifications for multiple recipients of your choosing.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/advanced-notifications\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"112372c44b002fea2640bd6bfafbca27\",\"slug\":\"woocommerce-advanced-notifications\",\"id\":18740},{\"title\":\"WooCommerce Zapier\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/woocommerce-zapier-logo.png\",\"excerpt\":\"Integrate with 3000+ cloud apps and services today.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-zapier\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$59.00\",\"hash\":\"0782bdbe932c00f4978850268c6cfe40\",\"slug\":\"woocommerce-zapier\",\"id\":243589},{\"title\":\"WooCommerce Points and Rewards\",\"image\":\"\",\"excerpt\":\"Reward your customers for purchases and other actions with points which can be redeemed for discounts.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-points-and-rewards\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"1649b6cca5da8b923b01ca56b5cdd246\",\"slug\":\"woocommerce-points-and-rewards\",\"id\":210259},{\"title\":\"Dynamic Pricing\",\"image\":\"\",\"excerpt\":\"Bulk discounts, role-based pricing and much more\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/dynamic-pricing\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"9a41775bb33843f52c93c922b0053986\",\"slug\":\"woocommerce-dynamic-pricing\",\"id\":18643},{\"title\":\"Name Your Price\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2012\\/09\\/nyp-icon-dark-v83owf.png\",\"excerpt\":\"Allow customers to define the product price. Also useful for accepting user-set donations.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/name-your-price\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"31b4e11696cd99a3c0572975a84f1c08\",\"slug\":\"woocommerce-name-your-price\",\"id\":18738},{\"title\":\"WooCommerce Print Invoices & Packing lists\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/03\\/Thumbnail-Print-Invoices-Packing-lists-updated.png\",\"excerpt\":\"Generate invoices, packing slips, and pick lists for your WooCommerce orders.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/print-invoices-packing-lists\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"465de1126817cdfb42d97ebca7eea717\",\"slug\":\"woocommerce-pip\",\"id\":18666},{\"title\":\"WooCommerce Pre-Orders\",\"image\":\"\",\"excerpt\":\"Allow customers to order products before they are available.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-pre-orders\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"b2dc75e7d55e6f5bbfaccb59830f66b7\",\"slug\":\"woocommerce-pre-orders\",\"id\":178477},{\"title\":\"WooCommerce Subscription Downloads\",\"image\":\"\",\"excerpt\":\"Offer additional downloads to your subscribers, via downloadable products listed in your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-subscription-downloads\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"5be9e21c13953253e4406d2a700382ec\",\"slug\":\"woocommerce-subscription-downloads\",\"id\":420458},{\"title\":\"WooCommerce Additional Variation Images\",\"image\":\"\",\"excerpt\":\"Add gallery images per variation on variable products within WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-additional-variation-images\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/themes.woocommerce.com\\/storefront\\/product\\/woo-single-1\\/\",\"price\":\"$49.00\",\"hash\":\"c61dd6de57dcecb32bd7358866de4539\",\"slug\":\"woocommerce-additional-variation-images\",\"id\":477384},{\"title\":\"WooCommerce Deposits\",\"image\":\"\",\"excerpt\":\"Enable customers to pay for products using a deposit or a payment plan.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-deposits\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$179.00\",\"hash\":\"de192a6cf12c4fd803248da5db700762\",\"slug\":\"woocommerce-deposits\",\"id\":977087},{\"title\":\"Google Product Feed\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2011\\/11\\/logo-regular-lscryp.png\",\"excerpt\":\"Feed product data to Google Merchant Center for setting up Google product listings & product ads.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/google-product-feed\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"d55b4f852872025741312839f142447e\",\"slug\":\"woocommerce-product-feeds\",\"id\":18619},{\"title\":\"Amazon S3 Storage\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/09\\/amazon.png\",\"excerpt\":\"Serve digital products via Amazon S3\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/amazon-s3-storage\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"473bf6f221b865eff165c97881b473bb\",\"slug\":\"woocommerce-amazon-s3-storage\",\"id\":18663},{\"title\":\"Cart Add-ons\",\"image\":\"\",\"excerpt\":\"A powerful tool for driving incremental and impulse purchases by customers once they are in the shopping cart\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/cart-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"3a8ef25334396206f5da4cf208adeda3\",\"slug\":\"woocommerce-cart-add-ons\",\"id\":18717},{\"title\":\"Shipping Multiple Addresses\",\"image\":\"\",\"excerpt\":\"Allow your customers to ship individual items in a single order to multiple addresses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/shipping-multiple-addresses\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"aa0eb6f777846d329952d5b891d6f8cc\",\"slug\":\"woocommerce-shipping-multiple-addresses\",\"id\":18741},{\"title\":\"WooCommerce AvaTax\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/01\\/Thumbnail-Avalara-updated.png\",\"excerpt\":\"Get 100% accurate sales tax calculations and on time tax return filing. No more tracking sales tax rates, rules, or jurisdictional boundaries.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-avatax\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"57077a4b28ba71cacf692bcf4a1a7f60\",\"slug\":\"woocommerce-avatax\",\"id\":1389326},{\"title\":\"PayPal Payments Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Paypal-Payments-Pro-Dark.png\",\"excerpt\":\"Take credit card payments directly on your checkout using PayPal Pro.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/paypal-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"6d23ba7f0e0198937c0029f9e865b40e\",\"slug\":\"woocommerce-gateway-paypal-pro\",\"id\":18594},{\"title\":\"Klarna Checkout\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2018\\/01\\/Partner_marketing_Klarna_Checkout_Black-1.png\",\"excerpt\":\"Klarna Checkout is a full checkout experience embedded on your site that includes all popular payment methods (Pay Now, Pay Later, Financing, Installments).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/klarna-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/demo.krokedil.se\\/klarnacheckout\\/\",\"price\":\"$0.00\",\"hash\":\"90f8ce584e785fcd8c2d739fd4f40d78\",\"slug\":\"klarna-checkout-for-woocommerce\",\"id\":2754152},{\"title\":\"Bulk Stock Management\",\"image\":\"\",\"excerpt\":\"Edit product and variation stock levels in bulk via this handy interface\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/bulk-stock-management\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"02f4328d52f324ebe06a78eaaae7934f\",\"slug\":\"woocommerce-bulk-stock-management\",\"id\":18670},{\"title\":\"Gravity Forms Product Add-ons\",\"image\":\"\",\"excerpt\":\"Powerful product add-ons, Gravity style\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/gravity-forms-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.elementstark.com\\/woocommerce-extension-demos\\/product-category\\/gravity-forms\\/\",\"price\":\"$99.00\",\"hash\":\"a6ac0ab1a1536e3a357ccf24c0650ed0\",\"slug\":\"woocommerce-gravityforms-product-addons\",\"id\":18633},{\"title\":\"WooCommerce Email Customizer\",\"image\":\"\",\"excerpt\":\"Connect with your customers with each email you send by visually modifying your email templates via the WordPress Customizer.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-email-customizer\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"bd909fa97874d431f203b5336c7e8873\",\"slug\":\"woocommerce-email-customizer\",\"id\":853277},{\"title\":\"Composite Products\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-CP.png?v=1\",\"excerpt\":\"Create product kit builders and custom product configurators using existing products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/composite-products\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$99.00\",\"hash\":\"0343e0115bbcb97ccd98442b8326a0af\",\"slug\":\"woocommerce-composite-products\",\"id\":216836},{\"title\":\"Force Sells\",\"image\":\"\",\"excerpt\":\"Force products to be added to the cart\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/force-sells\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"3ebddfc491ca168a4ea4800b893302b0\",\"slug\":\"woocommerce-force-sells\",\"id\":18678},{\"title\":\"TaxJar\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/10\\/taxjar-logotype.png\",\"excerpt\":\"Save hours every month by putting your sales tax on autopilot. Automated, multi-state sales tax calculation, reporting, and filing for your WooCommerce store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/taxjar\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"12072d8e-e933-4561-97b1-9db3c7eeed91\",\"slug\":\"taxjar-simplified-taxes-for-woocommerce\",\"id\":514914},{\"title\":\"WooCommerce Quick View\",\"image\":\"\",\"excerpt\":\"Show a quick-view button to view product details and add to cart via lightbox popup\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-quick-view\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"619c6e57ce72c49c4b57e15b06eddb65\",\"slug\":\"woocommerce-quick-view\",\"id\":187509},{\"title\":\"WooCommerce Purchase Order Gateway\",\"image\":\"\",\"excerpt\":\"Receive purchase orders via your WooCommerce-powered online store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gateway-purchase-order\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"573a92318244ece5facb449d63e74874\",\"slug\":\"woocommerce-gateway-purchase-order\",\"id\":478542},{\"title\":\"Returns and Warranty Requests\",\"image\":\"\",\"excerpt\":\"Manage the RMA process, add warranties to products & let customers request & manage returns \\/ exchanges from their account.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/warranty-requests\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"9b4c41102e6b61ea5f558e16f9b63e25\",\"slug\":\"woocommerce-warranty\",\"id\":228315},{\"title\":\"Product Enquiry Form\",\"image\":\"\",\"excerpt\":\"Allow visitors to contact you directly from the product details page via a reCAPTCHA protected form to enquire about a product.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/product-enquiry-form\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"5a0f5d72519a8ffcc86669f042296937\",\"slug\":\"woocommerce-product-enquiry-form\",\"id\":18601},{\"title\":\"WooCommerce Box Office\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-BO-Dark.png\",\"excerpt\":\"Sell tickets for your next event, concert, function, fundraiser or conference directly on your own site\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-box-office\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"e704c9160de318216a8fa657404b9131\",\"slug\":\"woocommerce-box-office\",\"id\":1628717},{\"title\":\"WooCommerce Order Barcodes\",\"image\":\"\",\"excerpt\":\"Generates a unique barcode for each order on your site - perfect for e-tickets, packing slips, reservations and a variety of other uses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-barcodes\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"889835bb29ee3400923653e1e44a3779\",\"slug\":\"woocommerce-order-barcodes\",\"id\":391708},{\"title\":\"WooCommerce 360\\u00ba Image\",\"image\":\"\",\"excerpt\":\"An easy way to add a dynamic, controllable 360\\u00ba image rotation to your WooCommerce site, by adding a group of images to a product\\u2019s gallery.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-360-image\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"24eb2cfa3738a66bf3b2587876668cd2\",\"slug\":\"woocommerce-360-image\",\"id\":512186},{\"title\":\"WooCommerce Paid Courses\",\"image\":\"\",\"excerpt\":\"Sell your online courses using the most popular eCommerce platform on the web \\u2013 WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-paid-courses\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"bad2a02a063555b7e2bee59924690763\",\"slug\":\"woothemes-sensei\",\"id\":152116},{\"title\":\"WooCommerce Photography\",\"image\":\"\",\"excerpt\":\"Sell photos in the blink of an eye using this simple as dragging & dropping interface.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-photography\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"ee76e8b9daf1d97ca4d3874cc9e35687\",\"slug\":\"woocommerce-photography\",\"id\":583602},{\"title\":\"WooCommerce Bookings Availability\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/06\\/Logo-Woo-Bookings-Aval-Dark.png\",\"excerpt\":\"Sell more bookings by presenting a calendar or schedule of available slots in a page or post.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/bookings-availability\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"30770d2a-e392-4e82-baaa-76cfc7d02ae3\",\"slug\":\"woocommerce-bookings-availability\",\"id\":4228225},{\"title\":\"Software Add-on\",\"image\":\"\",\"excerpt\":\"Sell License Keys for Software\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/software-add-on\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$129.00\",\"hash\":\"79f6dbfe1f1d3a56a86f0509b6d6b04b\",\"slug\":\"woocommerce-software-add-on\",\"id\":18683},{\"title\":\"WooCommerce Products Compare\",\"image\":\"\",\"excerpt\":\"WooCommerce Products Compare will allow your potential customers to easily compare products within your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-products-compare\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"c3ba0a4a3199a0cc7a6112eb24414548\",\"slug\":\"woocommerce-products-compare\",\"id\":853117},{\"title\":\"WooCommerce Store Catalog PDF Download\",\"image\":\"\",\"excerpt\":\"Offer your customers a PDF download of your product catalog, generated by WooCommerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-store-catalog-pdf-download\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"79ca7aadafe706364e2d738b7c1090c4\",\"slug\":\"woocommerce-store-catalog-pdf-download\",\"id\":675790},{\"title\":\"eWAY\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2011\\/10\\/eway-logo-3000-2000.jpg\",\"excerpt\":\"Take credit card payments securely via eWay (SG, MY, HK, AU, and NZ) keeping customers on your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/eway\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"2c497769d98d025e0d340cd0b5ea5da1\",\"slug\":\"woocommerce-gateway-eway\",\"id\":18604},{\"title\":\"Catalog Visibility Options\",\"image\":\"\",\"excerpt\":\"Transform WooCommerce into an online catalog by removing eCommerce functionality\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/catalog-visibility-options\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"12e791110365fdbb5865c8658907967e\",\"slug\":\"woocommerce-catalog-visibility-options\",\"id\":18648},{\"title\":\"WooCommerce Blocks\",\"image\":\"\",\"excerpt\":\"WooCommerce Blocks offers a range of Gutenberg blocks you can use to build and customise your site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-gutenberg-products-block\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"c2e9f13a-f90c-4ffe-a8a5-b432399ec263\",\"slug\":\"woo-gutenberg-products-block\",\"id\":3076677},{\"title\":\"Sequential Order Numbers Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/05\\/Thumbnail-Sequential-Order-Numbers-Pro-updated.png\",\"excerpt\":\"Tame your order numbers! Advanced & sequential order numbers with optional prefixes \\/ suffixes\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/sequential-order-numbers-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"0b18a2816e016ba9988b93b1cd8fe766\",\"slug\":\"woocommerce-sequential-order-numbers-pro\",\"id\":18688},{\"title\":\"Conditional Shipping and Payments\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2020\\/07\\/Logo-CSP.png?v=1\",\"excerpt\":\"Use conditional logic to restrict the shipping and payment options available on your store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/conditional-shipping-and-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"1f56ff002fa830b77017b0107505211a\",\"slug\":\"woocommerce-conditional-shipping-and-payments\",\"id\":680253},{\"title\":\"WooCommerce Order Status Manager\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2015\\/02\\/Thumbnail-Order-Status-Manager-updated.png\",\"excerpt\":\"Create, edit, and delete completely custom order statuses and integrate them seamlessly into your order management flow.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-status-manager\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$49.00\",\"hash\":\"51fd9ab45394b4cad5a0ebf58d012342\",\"slug\":\"woocommerce-order-status-manager\",\"id\":588398},{\"title\":\"WooCommerce Checkout Add-Ons\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/07\\/Thumbnail-Checkout-Add-Ons-updated.png\",\"excerpt\":\"Highlight relevant products, offers like free shipping and other up-sells during checkout.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-checkout-add-ons\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"8fdca00b4000b7a8cc26371d0e470a8f\",\"slug\":\"woocommerce-checkout-add-ons\",\"id\":466854},{\"title\":\"QuickBooks Sync for WooCommerce\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2019\\/04\\/woocommerce-com-logo-1-hyhzbh.png\",\"excerpt\":\"Automatic two-way sync for orders, customers, products, inventory and more between WooCommerce and QuickBooks (Online, Desktop, or POS).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/quickbooks-sync-for-woocommerce\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"c5e32e20-7c1f-4585-8b15-d930c2d842ac\",\"slug\":\"myworks-woo-sync-for-quickbooks-online\",\"id\":4065824},{\"title\":\"WooCommerce Google Analytics Pro\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2016\\/01\\/Thumbnail-GAPro-updated.png\",\"excerpt\":\"Add advanced event tracking and enhanced eCommerce tracking to your WooCommerce site.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-google-analytics-pro\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"d8aed8b7306b509eec1589e59abe319f\",\"slug\":\"woocommerce-google-analytics-pro\",\"id\":1312497},{\"title\":\"WooCommerce One Page Checkout\",\"image\":\"\",\"excerpt\":\"Create special pages where customers can choose products, checkout & pay all on the one page.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-one-page-checkout\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"c9ba8f8352cd71b5508af5161268619a\",\"slug\":\"woocommerce-one-page-checkout\",\"id\":527886},{\"title\":\"WooCommerce Product Search\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2014\\/10\\/woocommerce-product-search-product-image-1870x960-1-jvsljj.png\",\"excerpt\":\"The perfect search engine helps customers to find and buy products quickly \\u2013 essential for every WooCommerce store.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-product-search\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/demo.itthinx.com\\/wps\\/\",\"price\":\"$49.00\",\"hash\":\"c84cc8ca16ddac3408e6b6c5871133a8\",\"slug\":\"woocommerce-product-search\",\"id\":512174},{\"title\":\"First Data\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2012\\/02\\/Thumbnail-FirstData-updated.png\",\"excerpt\":\"FirstData gateway for WooCommerce\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/firstdata\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"eb3e32663ec0810592eaf0d097796230\",\"slug\":\"woocommerce-gateway-firstdata\",\"id\":18645},{\"title\":\"WooSlider\",\"image\":\"\",\"excerpt\":\"WooSlider is the ultimate responsive slideshow WordPress slider plugin\\r\\n\\r\\n\\u00a0\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/wooslider\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/www.wooslider.com\\/\",\"price\":\"$49.00\",\"hash\":\"209d98f3ccde6cc3de7e8732a2b20b6a\",\"slug\":\"wooslider\",\"id\":46506},{\"title\":\"WooCommerce Social Login\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/08\\/Thumbnail-Social-Login-updated.png\",\"excerpt\":\"Enable Social Login for seamless checkout and account creation.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-social-login\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"http:\\/\\/demos.skyverge.com\\/woocommerce-social-login\\/\",\"price\":\"$79.00\",\"hash\":\"b231cd6367a79cc8a53b7d992d77525d\",\"slug\":\"woocommerce-social-login\",\"id\":473617},{\"title\":\"Coupon Shortcodes\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2013\\/09\\/woocommerce-coupon-shortcodes-product-image-1870x960-1-vc5gux.png\",\"excerpt\":\"Show coupon discount info using shortcodes. Allows to render coupon information and content conditionally, based on the validity of coupons.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/coupon-shortcodes\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"ac5d9d51-70b2-4d8f-8b89-24200eea1394\",\"slug\":\"woocommerce-coupon-shortcodes\",\"id\":244762},{\"title\":\"WooCommerce Order Status Control\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2014\\/06\\/Thumbnail-Order-Status-Control-updated.png\",\"excerpt\":\"Use this extension to automatically change the order status to \\\"completed\\\" after successful payment.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-order-status-control\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"32400e509c7c36dcc1cd368e8267d981\",\"slug\":\"woocommerce-order-status-control\",\"id\":439037},{\"title\":\"Variation Swatches and Photos\",\"image\":\"\",\"excerpt\":\"Show color and image swatches instead of dropdowns for variable products.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/variation-swatches-and-photos\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"https:\\/\\/www.elementstark.com\\/woocommerce-extension-demos\\/product-category\\/swatches-and-photos\\/\",\"price\":\"$99.00\",\"hash\":\"37bea8d549df279c8278878d081b062f\",\"slug\":\"woocommerce-variation-swatches-and-photos\",\"id\":18697},{\"title\":\"Jilt\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2017\\/12\\/Thumbnail-Jilt-updated.png\",\"excerpt\":\"All-in-one email marketing platform built for WooCommerce stores. Send newsletters, abandoned cart reminders, win-backs, welcome automations, and more.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/jilt\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"b53aafb64dca33835e41ee06de7e9816\",\"slug\":\"jilt-for-woocommerce\",\"id\":2754876},{\"title\":\"PayPal\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/woocommerce_uploads\\/2020\\/10\\/PPCP-Tile-PayPal-Logo-and-Cart-Art-2x-2-uozwz8.jpg\",\"excerpt\":\"PayPal\\u2019s latest, most complete payment processing solution. Accept PayPal exclusives, credit\\/debit cards and local payment methods. Turn on only PayPal options or process a full suite of payment methods. Enable global transactions with extensive currency and country coverage. Built and supported by WooCommerce and PayPal.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-paypal-payments\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"934115ab-e3f3-4435-9580-345b1ce21899\",\"slug\":\"woocommerce-paypal-payments\",\"id\":6410731},{\"title\":\"Opayo Payment Suite\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2011\\/10\\/Opayo_logo_RGB.png\",\"excerpt\":\"Take payments on your WooCommerce store via Opayo (formally SagePay).\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/sage-pay-form\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$79.00\",\"hash\":\"6bc0cca47d0274d8ef9b164f6fbec1cc\",\"slug\":\"woocommerce-gateway-sagepay-form\",\"id\":18599},{\"title\":\"EU VAT Number\",\"image\":\"\",\"excerpt\":\"Collect VAT numbers at checkout and remove the VAT charge for eligible EU businesses.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/eu-vat-number\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$29.00\",\"hash\":\"d2720c4b4bb8d6908e530355b7a2d734\",\"slug\":\"woocommerce-eu-vat-number\",\"id\":18592},{\"title\":\"QuickBooks Commerce (formerly TradeGecko)\",\"image\":\"https:\\/\\/woocommerce.com\\/wp-content\\/uploads\\/2013\\/09\\/qbo-mark.png\",\"excerpt\":\"Get a wholesale and multichannel inventory & order management platform for your WooCommerce store with QuickBooks Commerce.\",\"link\":\"https:\\/\\/woocommerce.com\\/products\\/woocommerce-tradegecko\\/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\",\"demo_url\":\"\",\"price\":\"$0.00\",\"hash\":\"21da7811f7fc1f13ee19daa7415f0ff3\",\"slug\":\"woocommerce-tradegecko\",\"id\":245960}]}\";s:7:\"headers\";O:25:\"Requests_Response_Headers\":1:{s:7:\"\0*\0data\";a:18:{s:6:\"server\";a:1:{i:0;s:5:\"nginx\";}s:4:\"date\";a:1:{i:0;s:29:\"Thu, 03 Jun 2021 11:28:45 GMT\";}s:12:\"content-type\";a:1:{i:0;s:31:\"application/json; charset=UTF-8\";}s:14:\"content-length\";a:1:{i:0;s:5:\"11634\";}s:12:\"x-robots-tag\";a:1:{i:0;s:7:\"noindex\";}s:4:\"link\";a:1:{i:0;s:60:\"; rel=\"https://api.w.org/\"\";}s:22:\"x-content-type-options\";a:1:{i:0;s:7:\"nosniff\";}s:29:\"access-control-expose-headers\";a:1:{i:0;s:33:\"X-WP-Total, X-WP-TotalPages, Link\";}s:28:\"access-control-allow-headers\";a:1:{i:0;s:73:\"Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type\";}s:13:\"x-wccom-cache\";a:1:{i:0;s:3:\"HIT\";}s:13:\"cache-control\";a:1:{i:0;s:10:\"max-age=60\";}s:5:\"allow\";a:1:{i:0;s:3:\"GET\";}s:16:\"content-encoding\";a:1:{i:0;s:4:\"gzip\";}s:4:\"x-rq\";a:1:{i:0;s:16:\"vie2 87 111 3196\";}s:3:\"age\";a:1:{i:0;s:2:\"21\";}s:7:\"x-cache\";a:1:{i:0;s:3:\"hit\";}s:4:\"vary\";a:1:{i:0;s:23:\"Accept-Encoding, Origin\";}s:13:\"accept-ranges\";a:1:{i:0;s:5:\"bytes\";}}}s:11:\"status_code\";i:200;s:16:\"protocol_version\";d:1.1000000000000001;s:7:\"success\";b:1;s:9:\"redirects\";i:0;s:3:\"url\";s:59:\"https://woocommerce.com/wp-json/wccom-extensions/1.0/search\";s:7:\"history\";a:0:{}s:7:\"cookies\";O:19:\"Requests_Cookie_Jar\":1:{s:10:\"\0*\0cookies\";a:0:{}}}s:11:\"\0*\0filename\";N;s:4:\"data\";N;s:7:\"headers\";N;s:6:\"status\";N;}}','no'); + +INSERT INTO `wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) +VALUES +(1243,'_site_transient_timeout_theme_roots','1622721530','no'), +(1244,'_site_transient_theme_roots','a:12:{s:10:\"storefront\";s:7:\"/themes\";s:12:\"twentyeleven\";s:7:\"/themes\";s:13:\"twentyfifteen\";s:7:\"/themes\";s:14:\"twentyfourteen\";s:7:\"/themes\";s:14:\"twentynineteen\";s:7:\"/themes\";s:15:\"twentyseventeen\";s:7:\"/themes\";s:13:\"twentysixteen\";s:7:\"/themes\";s:9:\"twentyten\";s:7:\"/themes\";s:14:\"twentythirteen\";s:7:\"/themes\";s:12:\"twentytwelve\";s:7:\"/themes\";s:12:\"twentytwenty\";s:7:\"/themes\";s:15:\"twentytwentyone\";s:7:\"/themes\";}','no'), +(1245,'_transient_timeout__woocommerce_helper_updates','1622762930','no'), +(1246,'_transient__woocommerce_helper_updates','a:4:{s:4:\"hash\";s:32:\"d751713988987e9331980363e24189ce\";s:7:\"updated\";i:1622719730;s:8:\"products\";a:0:{}s:6:\"errors\";a:1:{i:0;s:10:\"http-error\";}}','no'), +(1247,'_site_transient_timeout_browser_291da66cbb2b7ebec14fe3e09324e087','1623324532','no'), +(1248,'_site_transient_browser_291da66cbb2b7ebec14fe3e09324e087','a:10:{s:4:\"name\";s:6:\"Chrome\";s:7:\"version\";s:12:\"90.0.4430.85\";s:8:\"platform\";s:9:\"Macintosh\";s:10:\"update_url\";s:29:\"https://www.google.com/chrome\";s:7:\"img_src\";s:43:\"http://s.w.org/images/browsers/chrome.png?1\";s:11:\"img_src_ssl\";s:44:\"https://s.w.org/images/browsers/chrome.png?1\";s:15:\"current_version\";s:2:\"18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}','no'), +(1249,'_site_transient_timeout_php_check_0cbcbda5109bcde6b94054595b5c2163','1623324532','no'), +(1250,'_site_transient_php_check_0cbcbda5109bcde6b94054595b5c2163','a:5:{s:19:\"recommended_version\";s:3:\"7.4\";s:15:\"minimum_version\";s:6:\"5.6.20\";s:12:\"is_supported\";b:0;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}','no'), +(1251,'_transient_timeout_wc_report_orders_stats_1271e76f65e712e25a748eabc1ee7484','1623324533','no'), +(1252,'_transient_wc_report_orders_stats_1271e76f65e712e25a748eabc1ee7484','a:2:{s:7:\"version\";s:10:\"1613873993\";s:5:\"value\";O:8:\"stdClass\":5:{s:6:\"totals\";O:8:\"stdClass\":15:{s:12:\"orders_count\";i:0;s:14:\"num_items_sold\";i:0;s:11:\"gross_sales\";d:0;s:11:\"total_sales\";d:0;s:7:\"coupons\";d:0;s:13:\"coupons_count\";i:0;s:7:\"refunds\";d:0;s:5:\"taxes\";d:0;s:8:\"shipping\";d:0;s:11:\"net_revenue\";d:0;s:19:\"avg_items_per_order\";d:0;s:15:\"avg_order_value\";d:0;s:15:\"total_customers\";i:0;s:8:\"products\";i:0;s:8:\"segments\";a:0:{}}s:9:\"intervals\";a:1:{i:0;a:6:{s:8:\"interval\";s:7:\"2021-22\";s:10:\"date_start\";s:19:\"2021-06-01 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-06-01 00:00:00\";s:8:\"date_end\";s:19:\"2021-06-03 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-06-03 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":14:{s:12:\"orders_count\";i:0;s:14:\"num_items_sold\";i:0;s:11:\"gross_sales\";d:0;s:11:\"total_sales\";d:0;s:7:\"coupons\";d:0;s:13:\"coupons_count\";i:0;s:7:\"refunds\";d:0;s:5:\"taxes\";d:0;s:8:\"shipping\";d:0;s:11:\"net_revenue\";d:0;s:19:\"avg_items_per_order\";d:0;s:15:\"avg_order_value\";d:0;s:15:\"total_customers\";i:0;s:8:\"segments\";a:0:{}}}}s:5:\"total\";i:1;s:5:\"pages\";i:1;s:7:\"page_no\";i:1;}}','no'), +(1253,'_transient_timeout_wc_report_orders_stats_c79406c4fe31b61f6dd9e8d60605a8b0','1623324533','no'), +(1254,'_transient_wc_report_orders_stats_c79406c4fe31b61f6dd9e8d60605a8b0','a:2:{s:7:\"version\";s:10:\"1613873993\";s:5:\"value\";O:8:\"stdClass\":5:{s:6:\"totals\";O:8:\"stdClass\":15:{s:12:\"orders_count\";i:0;s:14:\"num_items_sold\";i:0;s:11:\"gross_sales\";d:0;s:11:\"total_sales\";d:0;s:7:\"coupons\";d:0;s:13:\"coupons_count\";i:0;s:7:\"refunds\";d:0;s:5:\"taxes\";d:0;s:8:\"shipping\";d:0;s:11:\"net_revenue\";d:0;s:19:\"avg_items_per_order\";d:0;s:15:\"avg_order_value\";d:0;s:15:\"total_customers\";i:0;s:8:\"products\";i:0;s:8:\"segments\";a:0:{}}s:9:\"intervals\";a:1:{i:0;a:6:{s:8:\"interval\";s:7:\"2021-22\";s:10:\"date_start\";s:19:\"2021-06-01 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-06-01 00:00:00\";s:8:\"date_end\";s:19:\"2021-06-03 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-06-03 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":14:{s:12:\"orders_count\";i:0;s:14:\"num_items_sold\";i:0;s:11:\"gross_sales\";d:0;s:11:\"total_sales\";d:0;s:7:\"coupons\";d:0;s:13:\"coupons_count\";i:0;s:7:\"refunds\";d:0;s:5:\"taxes\";d:0;s:8:\"shipping\";d:0;s:11:\"net_revenue\";d:0;s:19:\"avg_items_per_order\";d:0;s:15:\"avg_order_value\";d:0;s:15:\"total_customers\";i:0;s:8:\"segments\";a:0:{}}}}s:5:\"total\";i:1;s:5:\"pages\";i:1;s:7:\"page_no\";i:1;}}','no'), +(1255,'_transient_timeout_wc_report_orders_stats_67ce9325b51e5a16899219331f342063','1623324533','no'), +(1256,'_transient_wc_report_orders_stats_67ce9325b51e5a16899219331f342063','a:2:{s:7:\"version\";s:10:\"1613873993\";s:5:\"value\";O:8:\"stdClass\":5:{s:6:\"totals\";O:8:\"stdClass\":4:{s:11:\"net_revenue\";d:0;s:8:\"products\";i:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}s:9:\"intervals\";a:7:{i:0;a:6:{s:8:\"interval\";s:10:\"2021-05-28\";s:10:\"date_start\";s:19:\"2021-05-28 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-05-28 00:00:00\";s:8:\"date_end\";s:19:\"2021-05-28 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-05-28 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}i:1;a:6:{s:8:\"interval\";s:10:\"2021-05-29\";s:10:\"date_start\";s:19:\"2021-05-29 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-05-29 00:00:00\";s:8:\"date_end\";s:19:\"2021-05-29 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-05-29 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}i:2;a:6:{s:8:\"interval\";s:10:\"2021-05-30\";s:10:\"date_start\";s:19:\"2021-05-30 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-05-30 00:00:00\";s:8:\"date_end\";s:19:\"2021-05-30 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-05-30 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}i:3;a:6:{s:8:\"interval\";s:10:\"2021-05-31\";s:10:\"date_start\";s:19:\"2021-05-31 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-05-31 00:00:00\";s:8:\"date_end\";s:19:\"2021-05-31 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-05-31 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}i:4;a:6:{s:8:\"interval\";s:10:\"2021-06-01\";s:10:\"date_start\";s:19:\"2021-06-01 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-06-01 00:00:00\";s:8:\"date_end\";s:19:\"2021-06-01 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-06-01 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}i:5;a:6:{s:8:\"interval\";s:10:\"2021-06-02\";s:10:\"date_start\";s:19:\"2021-06-02 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-06-02 00:00:00\";s:8:\"date_end\";s:19:\"2021-06-02 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-06-02 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}i:6;a:6:{s:8:\"interval\";s:10:\"2021-06-03\";s:10:\"date_start\";s:19:\"2021-06-03 00:00:00\";s:14:\"date_start_gmt\";s:19:\"2021-06-03 00:00:00\";s:8:\"date_end\";s:19:\"2021-06-03 23:59:59\";s:12:\"date_end_gmt\";s:19:\"2021-06-03 23:59:59\";s:9:\"subtotals\";O:8:\"stdClass\":3:{s:11:\"net_revenue\";d:0;s:13:\"coupons_count\";i:0;s:8:\"segments\";a:0:{}}}}s:5:\"total\";i:7;s:5:\"pages\";i:1;s:7:\"page_no\";i:1;}}','no'), +(1257,'_site_transient_timeout_community-events-a138d024e4b921d2b5772312ad22302d','1622762935','no'), +(1258,'_site_transient_community-events-a138d024e4b921d2b5772312ad22302d','a:4:{s:9:\"sandboxed\";b:0;s:5:\"error\";N;s:8:\"location\";a:1:{s:2:\"ip\";s:12:\"192.168.95.0\";}s:6:\"events\";a:2:{i:0;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:60:\"Watch Party + Discussion Group: Intro to the Block Directory\";s:3:\"url\";s:68:\"https://www.meetup.com/learn-wordpress-discussions/events/278272711/\";s:6:\"meetup\";s:27:\"Learn WordPress Discussions\";s:10:\"meetup_url\";s:51:\"https://www.meetup.com/learn-wordpress-discussions/\";s:4:\"date\";s:19:\"2021-06-04 19:00:00\";s:8:\"end_date\";s:19:\"2021-06-04 21:00:00\";s:20:\"start_unix_timestamp\";i:1622858400;s:18:\"end_unix_timestamp\";i:1622865600;s:8:\"location\";a:4:{s:8:\"location\";s:6:\"Online\";s:7:\"country\";s:2:\"US\";s:8:\"latitude\";d:37.779998779297003;s:9:\"longitude\";d:-122.41999816895;}}i:1;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:15:\"WordCamp Europe\";s:3:\"url\";s:33:\"https://europe.wordcamp.org/2021/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2021-06-07 14:00:00\";s:8:\"end_date\";s:19:\"2021-06-09 00:00:00\";s:20:\"start_unix_timestamp\";i:1623070800;s:18:\"end_unix_timestamp\";i:1623193200;s:8:\"location\";a:4:{s:8:\"location\";s:6:\"Online\";s:7:\"country\";s:2:\"PT\";s:8:\"latitude\";d:41.157943799999998;s:9:\"longitude\";d:-8.6291053000000009;}}}}','no'), +(1259,'_transient_timeout_klarna_hide_banner','1623151738','no'), +(1260,'_transient_klarna_hide_banner','1','no'), +(1264,'_transient_timeout_orders-all-statuses','1623324601','no'), +(1265,'_transient_orders-all-statuses','a:2:{s:7:\"version\";s:10:\"1613873993\";s:5:\"value\";a:0:{}}','no'), +(1267,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1622719802;s:7:\"checked\";a:12:{s:10:\"storefront\";s:5:\"3.6.0\";s:12:\"twentyeleven\";s:3:\"3.7\";s:13:\"twentyfifteen\";s:3:\"2.9\";s:14:\"twentyfourteen\";s:3:\"3.1\";s:14:\"twentynineteen\";s:3:\"2.0\";s:15:\"twentyseventeen\";s:3:\"2.7\";s:13:\"twentysixteen\";s:3:\"2.4\";s:9:\"twentyten\";s:3:\"3.3\";s:14:\"twentythirteen\";s:3:\"3.3\";s:12:\"twentytwelve\";s:3:\"3.3\";s:12:\"twentytwenty\";s:3:\"1.7\";s:15:\"twentytwentyone\";s:3:\"1.3\";}s:8:\"response\";a:1:{s:10:\"storefront\";a:6:{s:5:\"theme\";s:10:\"storefront\";s:11:\"new_version\";s:5:\"3.7.0\";s:3:\"url\";s:40:\"https://wordpress.org/themes/storefront/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/storefront.3.7.0.zip\";s:8:\"requires\";b:0;s:12:\"requires_php\";s:5:\"5.6.0\";}}s:9:\"no_update\";a:11:{s:12:\"twentyeleven\";a:6:{s:5:\"theme\";s:12:\"twentyeleven\";s:11:\"new_version\";s:3:\"3.7\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentyeleven/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentyeleven.3.7.zip\";s:8:\"requires\";b:0;s:12:\"requires_php\";s:5:\"5.2.4\";}s:13:\"twentyfifteen\";a:6:{s:5:\"theme\";s:13:\"twentyfifteen\";s:11:\"new_version\";s:3:\"2.9\";s:3:\"url\";s:43:\"https://wordpress.org/themes/twentyfifteen/\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/theme/twentyfifteen.2.9.zip\";s:8:\"requires\";b:0;s:12:\"requires_php\";s:5:\"5.2.4\";}s:14:\"twentyfourteen\";a:6:{s:5:\"theme\";s:14:\"twentyfourteen\";s:11:\"new_version\";s:3:\"3.1\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentyfourteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentyfourteen.3.1.zip\";s:8:\"requires\";b:0;s:12:\"requires_php\";s:5:\"5.2.4\";}s:14:\"twentynineteen\";a:6:{s:5:\"theme\";s:14:\"twentynineteen\";s:11:\"new_version\";s:3:\"2.0\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentynineteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentynineteen.2.0.zip\";s:8:\"requires\";s:5:\"4.9.6\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:15:\"twentyseventeen\";a:6:{s:5:\"theme\";s:15:\"twentyseventeen\";s:11:\"new_version\";s:3:\"2.7\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentyseventeen/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentyseventeen.2.7.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:13:\"twentysixteen\";a:6:{s:5:\"theme\";s:13:\"twentysixteen\";s:11:\"new_version\";s:3:\"2.4\";s:3:\"url\";s:43:\"https://wordpress.org/themes/twentysixteen/\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/theme/twentysixteen.2.4.zip\";s:8:\"requires\";s:3:\"4.4\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:9:\"twentyten\";a:6:{s:5:\"theme\";s:9:\"twentyten\";s:11:\"new_version\";s:3:\"3.3\";s:3:\"url\";s:39:\"https://wordpress.org/themes/twentyten/\";s:7:\"package\";s:55:\"https://downloads.wordpress.org/theme/twentyten.3.3.zip\";s:8:\"requires\";s:3:\"3.0\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:14:\"twentythirteen\";a:6:{s:5:\"theme\";s:14:\"twentythirteen\";s:11:\"new_version\";s:3:\"3.3\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentythirteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentythirteen.3.3.zip\";s:8:\"requires\";s:3:\"3.6\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:12:\"twentytwelve\";a:6:{s:5:\"theme\";s:12:\"twentytwelve\";s:11:\"new_version\";s:3:\"3.3\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwelve/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwelve.3.3.zip\";s:8:\"requires\";s:3:\"3.5\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:12:\"twentytwenty\";a:6:{s:5:\"theme\";s:12:\"twentytwenty\";s:11:\"new_version\";s:3:\"1.7\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwenty/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwenty.1.7.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.1.3.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','no'), +(1268,'_site_transient_update_plugins','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1622719803;s:7:\"checked\";a:2:{s:67:\"klarna-checkout-for-woocommerce/klarna-checkout-for-woocommerce.php\";s:5:\"2.5.4\";s:27:\"woocommerce/woocommerce.php\";s:5:\"5.3.0\";}s:8:\"response\";a:1:{s:67:\"klarna-checkout-for-woocommerce/klarna-checkout-for-woocommerce.php\";O:8:\"stdClass\":12:{s:2:\"id\";s:45:\"w.org/plugins/klarna-checkout-for-woocommerce\";s:4:\"slug\";s:31:\"klarna-checkout-for-woocommerce\";s:6:\"plugin\";s:67:\"klarna-checkout-for-woocommerce/klarna-checkout-for-woocommerce.php\";s:11:\"new_version\";s:5:\"2.5.5\";s:3:\"url\";s:62:\"https://wordpress.org/plugins/klarna-checkout-for-woocommerce/\";s:7:\"package\";s:74:\"https://downloads.wordpress.org/plugin/klarna-checkout-for-woocommerce.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:84:\"https://ps.w.org/klarna-checkout-for-woocommerce/assets/icon-256x256.jpg?rev=2422081\";s:2:\"1x\";s:84:\"https://ps.w.org/klarna-checkout-for-woocommerce/assets/icon-128x128.jpg?rev=2422081\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:87:\"https://ps.w.org/klarna-checkout-for-woocommerce/assets/banner-1544x500.png?rev=1801155\";s:2:\"1x\";s:86:\"https://ps.w.org/klarna-checkout-for-woocommerce/assets/banner-772x250.png?rev=1801155\";}s:11:\"banners_rtl\";a:0:{}s:6:\"tested\";s:5:\"5.7.2\";s:12:\"requires_php\";s:3:\"5.6\";s:13:\"compatibility\";O:8:\"stdClass\":0:{}}}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:1:{s:27:\"woocommerce/woocommerce.php\";O:8:\"stdClass\":9:{s:2:\"id\";s:25:\"w.org/plugins/woocommerce\";s:4:\"slug\";s:11:\"woocommerce\";s:6:\"plugin\";s:27:\"woocommerce/woocommerce.php\";s:11:\"new_version\";s:5:\"5.3.0\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/woocommerce/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/woocommerce.5.3.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/woocommerce/assets/icon-256x256.png?rev=2366418\";s:2:\"1x\";s:64:\"https://ps.w.org/woocommerce/assets/icon-128x128.png?rev=2366418\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/woocommerce/assets/banner-1544x500.png?rev=2366418\";s:2:\"1x\";s:66:\"https://ps.w.org/woocommerce/assets/banner-772x250.png?rev=2366418\";}s:11:\"banners_rtl\";a:0:{}}}}','no'), +(1270,'_transient_timeout_wc_onboarding_themes','1622806226','no'), +(1271,'_transient_wc_onboarding_themes','a:38:{s:10:\"storefront\";a:6:{s:4:\"slug\";s:10:\"storefront\";s:5:\"title\";s:10:\"Storefront\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:67:\"http://localhost:8000/wp-content/themes/storefront/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:10:\"smart-home\";a:11:{s:5:\"title\";s:10:\"Smart Home\";s:5:\"image\";s:62:\"https://woocommerce.com/wp-content/uploads/2021/04/browser.jpg\";s:7:\"excerpt\";s:131:\"Smart Home is a beautiful Gutenberg-powered theme with a technology-style look suitable for all stores selling smart home products.\";s:4:\"link\";s:103:\"https://woocommerce.com/products/smart-home/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:33:\"https://smarthome.fuelthemes.net/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"d1d581ad-3efa-40c2-b7e0-bb6722779a0b\";s:4:\"slug\";s:10:\"smart-home\";s:2:\"id\";i:7916465;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:6:\"skinny\";a:11:{s:5:\"title\";s:6:\"Skinny\";s:5:\"image\";s:71:\"https://woocommerce.com/wp-content/uploads/2021/04/SKfeatured.png?w=800\";s:7:\"excerpt\";s:123:\"Create a beautiful online shop with Skinny, and optionally allow your site visitors to switch between light and dark skins.\";s:4:\"link\";s:99:\"https://woocommerce.com/products/skinny/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:32:\"https://demo.codestag.com/skinny\";s:5:\"price\";s:10:\"$69.00\";s:4:\"hash\";s:36:\"a21bf5b9-3c45-4d6c-bf24-74ddae21023f\";s:4:\"slug\";s:6:\"skinny\";s:2:\"id\";i:7753168;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:12:\"pure-fashion\";a:11:{s:5:\"title\";s:12:\"Pure Fashion\";s:5:\"image\";s:62:\"https://woocommerce.com/wp-content/uploads/2021/03/browser.jpg\";s:7:\"excerpt\";s:88:\"Beautiful WooCommerce theme with soft colors and a unique layout using Gutenberg editor.\";s:4:\"link\";s:105:\"https://woocommerce.com/products/pure-fashion/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:35:\"https://purefashion.fuelthemes.net/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"9d7ed165-8435-4b0f-8315-8e4a5868f0b0\";s:4:\"slug\";s:12:\"pure-fashion\";s:2:\"id\";i:7704815;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:8:\"overline\";a:11:{s:5:\"title\";s:8:\"Overline\";s:5:\"image\";s:63:\"https://woocommerce.com/wp-content/uploads/2020/11/overline.jpg\";s:7:\"excerpt\";s:171:\"Overline is designed for the new generation of beauty brands and influencers opening their own e-commerce shops. Custom Gutenberg elements allow for increased flexibility.\";s:4:\"link\";s:101:\"https://woocommerce.com/products/overline/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:32:\"https://overline.fuelthemes.net/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"6eab91f2-ca09-4f7e-9022-df55fd8540a9\";s:4:\"slug\";s:8:\"overline\";s:2:\"id\";i:7320744;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:6:\"agency\";a:11:{s:5:\"title\";s:6:\"Agency\";s:5:\"image\";s:70:\"https://woocommerce.com/wp-content/uploads/2020/10/agency-featured.jpg\";s:7:\"excerpt\";s:134:\"Agency is a Gutenberg and WooCommerce optimized WordPress theme for marketing, advertising, and creative agencies. Sell your services!\";s:4:\"link\";s:99:\"https://woocommerce.com/products/agency/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:38:\"https://organicthemes.com/demo/agency/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"4a3a3a22-a5f0-4fa4-8c09-4f37575602ef\";s:4:\"slug\";s:6:\"agency\";s:2:\"id\";i:6674855;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:6:\"rhodes\";a:11:{s:5:\"title\";s:6:\"Rhodes\";s:5:\"image\";s:66:\"https://woocommerce.com/wp-content/uploads/2020/09/rhodes-home.jpg\";s:7:\"excerpt\";s:193:\"The perfect WooCommerce theme for retailers. Whether you\'re selling high-street fashion, beauty products, or home accessories, Rhodes will just stand out of the way letting your products shine.\";s:4:\"link\";s:99:\"https://woocommerce.com/products/rhodes/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:34:\"https://www.cssigniter.com/rhodes/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"b95c0103-23b9-43f3-af49-ee7eaa35e49b\";s:4:\"slug\";s:6:\"rhodes\";s:2:\"id\";i:6509339;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:11:\"restoration\";a:11:{s:5:\"title\";s:11:\"Restoration\";s:5:\"image\";s:78:\"https://woocommerce.com/wp-content/uploads/2020/09/restoration-woocommerce.jpg\";s:7:\"excerpt\";s:90:\"An elegant and sophisticated mobile-first, Gutenberg-powered theme for WooCommerce stores.\";s:4:\"link\";s:104:\"https://woocommerce.com/products/restoration/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:35:\"https://restoration.fuelthemes.net/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"e793e6af-f338-4e92-b268-e0576ddb137b\";s:4:\"slug\";s:11:\"restoration\";s:2:\"id\";i:6454820;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:7:\"matthew\";a:11:{s:5:\"title\";s:7:\"Matthew\";s:5:\"image\";s:73:\"https://woocommerce.com/wp-content/uploads/2020/07/matthew-screenshot.jpg\";s:7:\"excerpt\";s:145:\"Matthew is a Gutenberg-powered WooCommerce theme designed for building a professional online store so that you can sell goods or services online.\";s:4:\"link\";s:100:\"https://woocommerce.com/products/matthew/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:38:\"https://demo.themesharbor.com/matthew/\";s:5:\"price\";s:11:\"$129.00\";s:4:\"hash\";s:36:\"b3983408-c4f6-4751-8bd7-ae65ae34cf3b\";s:4:\"slug\";s:7:\"matthew\";s:2:\"id\";i:6214538;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:11:\"fifthavenue\";a:11:{s:5:\"title\";s:12:\"Fifth Avenue\";s:5:\"image\";s:78:\"https://woocommerce.com/wp-content/uploads/2020/06/fifthavenue-woocommerce.jpg\";s:7:\"excerpt\";s:103:\"Beautiful Gutenberg powered WooCommerce theme designed to be easily customized for all types of stores.\";s:4:\"link\";s:105:\"https://woocommerce.com/products/fifth-avenue/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:35:\"https://fifthavenue.fuelthemes.net/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"9e093a9f-3d49-4fcd-bec7-c87b097d9df8\";s:4:\"slug\";s:11:\"fifthavenue\";s:2:\"id\";i:5989481;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:7:\"artisan\";a:11:{s:5:\"title\";s:7:\"Artisan\";s:5:\"image\";s:71:\"https://woocommerce.com/wp-content/uploads/2020/03/artisan-featured.jpg\";s:7:\"excerpt\";s:79:\"Sell your hand-crafted products online using the Artisan Theme for WooCommerce.\";s:4:\"link\";s:100:\"https://woocommerce.com/products/artisan/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:39:\"https://organicthemes.com/demo/artisan/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"64529812-81f6-4efd-9686-ecb34e527421\";s:4:\"slug\";s:7:\"artisan\";s:2:\"id\";i:5576887;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:7:\"threads\";a:11:{s:5:\"title\";s:7:\"Threads\";s:5:\"image\";s:75:\"https://woocommerce.com/wp-content/uploads/2019/08/threads-home-cropped.jpg\";s:7:\"excerpt\";s:79:\"Create a stunning website for your apparel brand using Threads for WooCommerce.\";s:4:\"link\";s:100:\"https://woocommerce.com/products/threads/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:39:\"https://organicthemes.com/demo/threads/\";s:5:\"price\";s:10:\"$79.00\";s:4:\"hash\";s:36:\"7ca579a6-6aaf-498c-9ee7-e15280ace9e9\";s:4:\"slug\";s:7:\"threads\";s:2:\"id\";i:4663191;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:10:\"block-shop\";a:11:{s:5:\"title\";s:10:\"Block Shop\";s:5:\"image\";s:79:\"https://woocommerce.com/wp-content/uploads/2019/08/block-shop-theme-preview.jpg\";s:7:\"excerpt\";s:81:\"A hassle-free Block-Editor-Era theme for your next WooCommerce project.\r\n\r\n \";s:4:\"link\";s:103:\"https://woocommerce.com/products/block-shop/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:34:\"https://blockshop.wp-theme.design/\";s:5:\"price\";s:10:\"$59.00\";s:4:\"hash\";s:36:\"21fa433c-6c31-4be7-83ab-8d2cc8986130\";s:4:\"slug\";s:10:\"block-shop\";s:2:\"id\";i:4660093;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:6:\"bistro\";a:11:{s:5:\"title\";s:6:\"Bistro\";s:5:\"image\";s:61:\"https://woocommerce.com/wp-content/uploads/2016/07/bistro.png\";s:7:\"excerpt\";s:174:\"Bistro is a Storefront child theme designed for stores selling organic goods and other consumables. It features a friendly and warm design that lends itself to this industry.\";s:4:\"link\";s:99:\"https://woocommerce.com/products/bistro/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:37:\"https://themes.woocommerce.com/bistro\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"58e753f91fddf40abe8ebe4486f8c378\";s:4:\"slug\";s:6:\"bistro\";s:2:\"id\";i:1822936;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:10:\"stationery\";a:11:{s:5:\"title\";s:10:\"Stationery\";s:5:\"image\";s:65:\"https://woocommerce.com/wp-content/uploads/2016/04/stationery.jpg\";s:7:\"excerpt\";s:186:\"Stationery is a Storefront child theme designed for stores selling office supplies and/or arts & crafts. The design has subtle tactile decorations while also being clean and elegant.\";s:4:\"link\";s:103:\"https://woocommerce.com/products/stationery/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:42:\"https://themes.woocommerce.com/stationery/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"b939225b8b8ccdc7b14ffb6d7eab2ac2\";s:4:\"slug\";s:10:\"stationery\";s:2:\"id\";i:1629126;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:7:\"petshop\";a:11:{s:5:\"title\";s:7:\"Petshop\";s:5:\"image\";s:62:\"https://woocommerce.com/wp-content/uploads/2016/03/petshop.png\";s:7:\"excerpt\";s:181:\"Petshop is a Storefront child theme designed for stores selling products in the pet industry. The design is organic and friendly, featuring many details that point to pet ownership.\";s:4:\"link\";s:100:\"https://woocommerce.com/products/petshop/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:39:\"https://themes.woocommerce.com/petshop/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"8060743c9031974326850f539aba5196\";s:4:\"slug\";s:7:\"petshop\";s:2:\"id\";i:1587689;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:5:\"hotel\";a:11:{s:5:\"title\";s:5:\"Hotel\";s:5:\"image\";s:69:\"https://woocommerce.com/wp-content/uploads/2016/03/hotel-featured.jpg\";s:7:\"excerpt\";s:246:\"Hotel is designed for businesses selling time, services and accommodation, offering unique integration with WooCommerce Bookings and Accommodation Bookings. The design is bold yet simple, allowing your content and imagery to do all the talking.\";s:4:\"link\";s:98:\"https://woocommerce.com/products/hotel/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:37:\"https://themes.woocommerce.com/hotel/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"0b0df891aa46f289f4e49bae2389bb04\";s:4:\"slug\";s:5:\"hotel\";s:2:\"id\";i:1554532;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:8:\"bookshop\";a:11:{s:5:\"title\";s:8:\"Bookshop\";s:5:\"image\";s:63:\"https://woocommerce.com/wp-content/uploads/2016/02/featured.png\";s:7:\"excerpt\";s:183:\"Bookshop comes with a unique homepage layout that prominently displays product categories and a variety of products in an arrangement that is popular with bookstores and collectibles.\";s:4:\"link\";s:101:\"https://woocommerce.com/products/bookshop/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:40:\"https://themes.woocommerce.com/bookshop/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"9fe861227e3e82fde8fe5d7e8cc3340e\";s:4:\"slug\";s:8:\"bookshop\";s:2:\"id\";i:1508713;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:6:\"arcade\";a:11:{s:5:\"title\";s:6:\"Arcade\";s:5:\"image\";s:61:\"https://woocommerce.com/wp-content/uploads/2016/01/arcade.png\";s:7:\"excerpt\";s:216:\"Upgrade your video game shops look and feel with Arcade. It\'s bold and modern design will engage visitors and the unique homepage layout will present them with a variety of products as soon as they hit your homepage.\";s:4:\"link\";s:99:\"https://woocommerce.com/products/arcade/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:38:\"https://themes.woocommerce.com/arcade/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"5af09d4e590eec977c6b9519b517f479\";s:4:\"slug\";s:6:\"arcade\";s:2:\"id\";i:1418260;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:9:\"homestore\";a:11:{s:5:\"title\";s:9:\"Homestore\";s:5:\"image\";s:64:\"https://woocommerce.com/wp-content/uploads/2015/12/homestore.jpg\";s:7:\"excerpt\";s:166:\"Give your Department Store a classic look with Homestore. Its clean and efficient design will work well whether you\'re a boutique independent or a high street giant.\";s:4:\"link\";s:102:\"https://woocommerce.com/products/homestore/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:41:\"https://themes.woocommerce.com/homestore/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"d79fe7a1beba26523aafa6ce6d3e1e85\";s:4:\"slug\";s:9:\"homestore\";s:2:\"id\";i:1365559;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:8:\"pharmacy\";a:11:{s:5:\"title\";s:8:\"Pharmacy\";s:5:\"image\";s:63:\"https://woocommerce.com/wp-content/uploads/2015/12/pharmacy.jpg\";s:7:\"excerpt\";s:235:\"Give your health store a professional, trust-worthy design with the Pharmacy Storefront Child Theme. Built upon our rock solid Storefront Parent theme you\'ll also enjoy reliable integration with current and future WooCommerce releases.\";s:4:\"link\";s:101:\"https://woocommerce.com/products/pharmacy/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:40:\"https://themes.woocommerce.com/pharmacy/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"ebeff3c0f89cd3169fb6b3e7e137e513\";s:4:\"slug\";s:8:\"pharmacy\";s:2:\"id\";i:1365557;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:7:\"toyshop\";a:11:{s:5:\"title\";s:7:\"ToyShop\";s:5:\"image\";s:62:\"https://woocommerce.com/wp-content/uploads/2015/09/toyshop.jpg\";s:7:\"excerpt\";s:269:\"Add some fun to your store with ToyShop. The engaging and colorful design of ToyShop makes it a perfect child theme or any store that sells exciting products that are aimed at customers that like to have fun. The outdoorsy style would even be perfect for a flower shop.\";s:4:\"link\";s:100:\"https://woocommerce.com/products/toyshop/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:39:\"https://themes.woocommerce.com/toyshop/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"3e2520021b41ee49a55b93362aaced98\";s:4:\"slug\";s:7:\"toyshop\";s:2:\"id\";i:1230716;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:6:\"outlet\";a:11:{s:5:\"title\";s:6:\"Outlet\";s:5:\"image\";s:61:\"https://woocommerce.com/wp-content/uploads/2015/09/outlet.jpg\";s:7:\"excerpt\";s:221:\"Overclock your tech store with Outlet! Whether you sell boutique iPad jewellery or the nuts and bolts of hardware itself, Outlet will give your shop a stylish look and feel while enjoying the stability of Storefront core.\";s:4:\"link\";s:99:\"https://woocommerce.com/products/outlet/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:38:\"https://themes.woocommerce.com/outlet/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"4c311cb3a3131570946b8799715a0991\";s:4:\"slug\";s:6:\"outlet\";s:2:\"id\";i:1212805;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:7:\"proshop\";a:11:{s:5:\"title\";s:7:\"ProShop\";s:5:\"image\";s:62:\"https://woocommerce.com/wp-content/uploads/2015/06/proshop.jpg\";s:7:\"excerpt\";s:176:\"Unlock the true potential of your sports clothing and equipment store with ProShop! It\'s metropolitan design provides an active aesthetic giving your store oodles of character.\";s:4:\"link\";s:100:\"https://woocommerce.com/products/proshop/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:39:\"https://themes.woocommerce.com/proshop/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"1d51b8633bbd1782dc17fce15f8bd2af\";s:4:\"slug\";s:7:\"proshop\";s:2:\"id\";i:1000757;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:8:\"galleria\";a:11:{s:5:\"title\";s:8:\"Galleria\";s:5:\"image\";s:68:\"https://woocommerce.com/wp-content/uploads/2015/05/galleria-hero.png\";s:7:\"excerpt\";s:162:\"Galleria is a Storefront child theme perfect for fashion and design stores. Stylish and minimalist, it gives sites a classy look and keeps products center stage.\";s:4:\"link\";s:101:\"https://woocommerce.com/products/galleria/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:40:\"https://themes.woocommerce.com/galleria/\";s:5:\"price\";s:10:\"$39.00\";s:4:\"hash\";s:32:\"2429c1dde521031cd053886b15844bbf\";s:4:\"slug\";s:8:\"galleria\";s:2:\"id\";i:887931;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:4:\"deli\";a:11:{s:5:\"title\";s:4:\"Deli\";s:5:\"image\";s:59:\"https://woocommerce.com/wp-content/uploads/2015/03/deli.jpg\";s:7:\"excerpt\";s:135:\"Deli is a Storefront child theme featuring a texturised, earthy design, perfect for stores selling natural, organic or hand made goods.\";s:4:\"link\";s:97:\"https://woocommerce.com/products/deli/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:36:\"https://themes.woocommerce.com/deli/\";s:5:\"price\";s:9:\"$0.00\";s:4:\"hash\";s:32:\"83c6db94c8ebf9da56b59fb97f724e88\";s:4:\"slug\";s:4:\"deli\";s:2:\"id\";i:784823;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:8:\"boutique\";a:11:{s:5:\"title\";s:8:\"Boutique\";s:5:\"image\";s:63:\"https://woocommerce.com/wp-content/uploads/2015/01/boutique.png\";s:7:\"excerpt\";s:168:\"Boutique is a simple, traditionally designed Storefront child theme, ideal for small stores or boutiques. Add your logo, create a unique color scheme and start selling!\";s:4:\"link\";s:101:\"https://woocommerce.com/products/boutique/?utm_source=product&utm_medium=upsell&utm_campaign=wcaddons\";s:8:\"demo_url\";s:40:\"https://themes.woocommerce.com/boutique/\";s:5:\"price\";s:9:\"$0.00\";s:4:\"hash\";s:32:\"71815288e266d58031727d48d6deee25\";s:4:\"slug\";s:8:\"boutique\";s:2:\"id\";i:605777;s:12:\"is_installed\";b:0;s:23:\"has_woocommerce_support\";b:1;}s:12:\"twentyeleven\";a:6:{s:4:\"slug\";s:12:\"twentyeleven\";s:5:\"title\";s:13:\"Twenty Eleven\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:69:\"http://localhost:8000/wp-content/themes/twentyeleven/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:13:\"twentyfifteen\";a:6:{s:4:\"slug\";s:13:\"twentyfifteen\";s:5:\"title\";s:14:\"Twenty Fifteen\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:70:\"http://localhost:8000/wp-content/themes/twentyfifteen/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:14:\"twentyfourteen\";a:6:{s:4:\"slug\";s:14:\"twentyfourteen\";s:5:\"title\";s:15:\"Twenty Fourteen\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:71:\"http://localhost:8000/wp-content/themes/twentyfourteen/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:14:\"twentynineteen\";a:6:{s:4:\"slug\";s:14:\"twentynineteen\";s:5:\"title\";s:15:\"Twenty Nineteen\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:71:\"http://localhost:8000/wp-content/themes/twentynineteen/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:15:\"twentyseventeen\";a:6:{s:4:\"slug\";s:15:\"twentyseventeen\";s:5:\"title\";s:16:\"Twenty Seventeen\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:72:\"http://localhost:8000/wp-content/themes/twentyseventeen/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:13:\"twentysixteen\";a:6:{s:4:\"slug\";s:13:\"twentysixteen\";s:5:\"title\";s:14:\"Twenty Sixteen\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:70:\"http://localhost:8000/wp-content/themes/twentysixteen/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:9:\"twentyten\";a:6:{s:4:\"slug\";s:9:\"twentyten\";s:5:\"title\";s:10:\"Twenty Ten\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:66:\"http://localhost:8000/wp-content/themes/twentyten/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:14:\"twentythirteen\";a:6:{s:4:\"slug\";s:14:\"twentythirteen\";s:5:\"title\";s:15:\"Twenty Thirteen\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:71:\"http://localhost:8000/wp-content/themes/twentythirteen/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:12:\"twentytwelve\";a:6:{s:4:\"slug\";s:12:\"twentytwelve\";s:5:\"title\";s:13:\"Twenty Twelve\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:69:\"http://localhost:8000/wp-content/themes/twentytwelve/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:12:\"twentytwenty\";a:6:{s:4:\"slug\";s:12:\"twentytwenty\";s:5:\"title\";s:13:\"Twenty Twenty\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:69:\"http://localhost:8000/wp-content/themes/twentytwenty/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}s:15:\"twentytwentyone\";a:6:{s:4:\"slug\";s:15:\"twentytwentyone\";s:5:\"title\";s:17:\"Twenty Twenty-One\";s:5:\"price\";s:4:\"0.00\";s:12:\"is_installed\";b:1;s:5:\"image\";s:72:\"http://localhost:8000/wp-content/themes/twentytwentyone/screenshot.png\";s:23:\"has_woocommerce_support\";b:1;}}','no'), +(1272,'_transient_timeout_woocommerce_test_remote_post','1622723431','no'), +(1273,'_transient_woocommerce_test_remote_post','200','no'), +(1274,'_transient_timeout_woocommerce_test_remote_get','1622723432','no'), +(1275,'_transient_woocommerce_test_remote_get','200','no'), +(1276,'_transient_timeout_woocommerce_system_status_wp_version_check','1622806233','no'), +(1277,'_transient_woocommerce_system_status_wp_version_check','5.7.2','no'), +(1292,'_transient_timeout_wc_shipping_method_count','1625314823','no'), +(1293,'_transient_wc_shipping_method_count','a:2:{s:7:\"version\";s:10:\"1613873868\";s:5:\"value\";i:2;}','no'); + +/*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; +UNLOCK TABLES; + +# Dump of table wp_woocommerce_api_keys +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `wp_woocommerce_api_keys`; + +CREATE TABLE `wp_woocommerce_api_keys` ( + `key_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) unsigned NOT NULL, + `description` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `permissions` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, + `consumer_key` char(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `consumer_secret` char(43) COLLATE utf8mb4_unicode_ci NOT NULL, + `nonces` longtext COLLATE utf8mb4_unicode_ci, + `truncated_key` char(7) COLLATE utf8mb4_unicode_ci NOT NULL, + `last_access` datetime DEFAULT NULL, + PRIMARY KEY (`key_id`), + KEY `consumer_key` (`consumer_key`), + KEY `consumer_secret` (`consumer_secret`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +LOCK TABLES `wp_woocommerce_api_keys` WRITE; +/*!40000 ALTER TABLE `wp_woocommerce_api_keys` DISABLE KEYS */; + +INSERT INTO `wp_woocommerce_api_keys` (`key_id`, `user_id`, `description`, `permissions`, `consumer_key`, `consumer_secret`, `nonces`, `truncated_key`, `last_access`) +VALUES +(2,1,'rest api key','read_write','f0bdb95209e38fa4ada5a0645fa40cc41a0652d60d6a9b5833570af4bdbf540d','cs_4b7dc229c7f65cf54e5e30c5dc79287c2eae16d2',NULL,'56a343a',NULL); + +/*!40000 ALTER TABLE `wp_woocommerce_api_keys` ENABLE KEYS */; +UNLOCK TABLES; \ No newline at end of file diff --git a/tests/e2e/config/.gitignore b/tests/e2e/config/.gitignore deleted file mode 100644 index 8ef739a6..00000000 --- a/tests/e2e/config/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.data.json diff --git a/tests/e2e/config/config.data.json b/tests/e2e/config/config.data.json new file mode 100644 index 00000000..a2db1a96 --- /dev/null +++ b/tests/e2e/config/config.data.json @@ -0,0 +1,133 @@ +{ + "url": "http://localhost:8000/", + "baseUrl": "", + "users": { + "admin": { + "username": "admin", + "password": "password", + "klarnaOrderEndpoint": "https://api.playground.klarna.com/ordermanagement/v1/orders/" + }, + "customer": { + "username": "ruben", + "password": "password", + "cardNumber": "4111 1111 1111 1111", + "pinNumber": "410321-9202", + "email": "test@krokedil.se", + "first_name": "RUBEN", + "last_name": "HENRIKSSON", + "phone": "070-999 91 23", + "organizationName": "KROKEDIL", + "billingData": { + "organizationIDSelector": "[data-cid='am.organization_registration_id']", + "organizationID": "002031-0132", + "organizationNameSelector": "[data-cid='am.organization_name']", + "organizationName": "KROKEDIL", + "firstNameSelector": "[data-cid='am.given_name']", + "firstName": "RUBEN", + "lastNameSelector": "[data-cid='am.family_name']", + "lastName": "HENRIKSSON", + "telephoneSelector": "[data-cid='am.phone']", + "telephone": "070-999 91 23", + "emailSelector": "[data-cid='am.email']", + "email": "test@krokedil.se", + "postalCodeSelector": "[data-cid='am.postal_code']", + "postalCode": "12600", + "submitSelector": "button[id='button-primary']" + }, + "customerType": { + "b2c": "B2C", + "b2b": "B2B", + "b2cb": "B2CB", + "b2bc": "B2BC" + }, + "credentialsAndSelectors": { + "username": "admin", + "password": "password", + "selectorForName": "#username", + "selectorForPass": "#password" + }, + "shippingSelectors": { + "iframe": { + "iframeShipping": "no" + }, + "methods": { + "freeShipping": "free", + "flatRate": "flat" + }, + "targets": { + "flatRateTarget": "_flat_rate", + "freeShippingTarget": "_free_shipping" + } + }, + "coupons": { + "fixed_cart": "fixedcart", + "fixed_product": "fixedproduct", + "percent": "percentage", + "free_shipping_100": "free" + }, + "payment": { + "selectedMethod": { + "creditMethod": "credit", + "debitMethod": "debit", + "invoiceMethod": "invoice" + } + }, + "billing": { + "first_name": "RUBEN", + "last_name": "HENRIKSSON", + "company": "", + "address_1": "Getstigen 4", + "address_2": "", + "city": "Hägersten", + "state": "", + "postcode": "12600", + "country": "SE", + "phone": "070-999 91 23", + "email": "test@krokedil.se" + }, + "shipping": { + "first_name": "RUBEN", + "last_name": "HENRIKSSON", + "company": "", + "address_1": "Getstigen 4", + "address_2": "", + "city": "Hägersten", + "state": "", + "postcode": "12600", + "country": "SE", + "email": "test@krokedil.se" + }, + "api": { + "consumerKey": "ck_6b26ae8bf280ffe5fd140d793ff14243c56a343a", + "consumerSecret": "cs_4b7dc229c7f65cf54e5e30c5dc79287c2eae16d2" + } + } + }, + "products": { + "product_id": { + "out_of_stock": "11", + "variable_25": "12", + "downloadable_0": "17", + "downloadable_25": "18", + "downloadable_shipping_0": "20", + "downloadable_shipping_25": "21", + "simple_12": "22", + "simple_6": "23", + "virtual_0": "26", + "virtual_25": "28", + "virtual_downloadable_0": "29", + "virtual_downloadable_25": "30", + "many_characters": "31" + } + }, + "timeoutTime": 2500, + "puppeteerOptions": { + "headless": false, + "defaultViewport": null, + "args": [ + "--disable-infobars", + "--disable-web-security", + "--disable-features=IsolateOrigins,site-per-process" + ] + } +} diff --git a/tests/e2e/config/config.js b/tests/e2e/config/config.js index a01a0216..75d35249 100644 --- a/tests/e2e/config/config.js +++ b/tests/e2e/config/config.js @@ -15,9 +15,8 @@ const settingsArray = { credentials_eu: "", merchant_id_eu: "", shared_secret_eu: "", - test_merchant_id_eu: customerData.klarnaCredentials.test_merchant_id_eu, - test_shared_secret_eu: - customerData.klarnaCredentials.test_shared_secret_eu, + test_merchant_id_eu: process.env.API_KEY, + test_shared_secret_eu: process.env.API_SECRET, credentials_us: "", merchant_id_us: "", shared_secret_us: "", diff --git a/tests/e2e/config/data.json b/tests/e2e/config/data.json new file mode 100644 index 00000000..83827226 --- /dev/null +++ b/tests/e2e/config/data.json @@ -0,0 +1,46 @@ +{ + "taxes": [ + { "name": "25", "rate": "25" }, + { "name": "12", "rate": "12" }, + { "name": "06", "rate": "6" }, + { "name": "00", "rate": "0" } + ], + + "products": { + "simple": [ + { "id": null, "name": "Simple 25%", "sku": "simple-25", "regular_price": "99.99", "virtual": false, "downloadable": false, "tax_class": "25" }, + { "id": null, "name": "Simple 12%", "sku": "simple-12", "regular_price": "158.39", "virtual": false, "downloadable": false, "tax_class": "12" }, + { "id": null, "name": "Simple 6%", "sku": "simple-06", "regular_price": "84.49", "virtual": false, "downloadable": false, "tax_class": "06" }, + { "id": null, "name": "Simple 0%", "sku": "simple-00", "regular_price": "9.99", "virtual": false, "downloadable": false, "tax_class": "00" }, + { "id": null, "name": "Simple Virtual 25%", "sku": "simple-virtual-25", "regular_price": "12.85", "virtual": true, "downloadable": true, "tax_class": "25" }, + { "id": null, "name": "Simple Virtual 12%", "sku": "simple-virtual-12", "regular_price": "6.54", "virtual": true, "downloadable": true, "tax_class": "12" }, + { "id": null, "name": "Simple Virtual 6%", "sku": "simple-virtual-06", "regular_price": "48.24", "virtual": true, "downloadable": true, "tax_class": "06" }, + { "id": null, "name": "Simple Virtual 0%", "sku": "simple-virtual-00", "regular_price": "75.42", "virtual": true, "downloadable": true, "tax_class": "00" } + ], + "variable": [ + { "id": null, "name": "Variable 25%", "sku": "variable-product-25", "regular_price": "26.75", "virtual": false, "downloadable": false, "tax_class": "25", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 25%:black", "option": "black" }, { "id": null, "name": "Variable 25%:red", "option": "red"}, { "id": null, "name": "Variable 25%:green", "option": "green" } ] } }, + { "id": null, "name": "Variable 12%", "sku": "variable-product-12", "regular_price": "95.28", "virtual": false, "downloadable": false, "tax_class": "12", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 12%:black", "option": "black" }, { "id": null, "name": "Variable 12%:red", "option": "red"}, { "id": null, "name": "Variable 12%:green", "option": "green" } ] } }, + { "id": null, "name": "Variable 6%", "sku": "variable-product-06", "regular_price": "26.79", "virtual": false, "downloadable": false, "tax_class": "06", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 6%:black", "option": "black" }, { "id": null, "name": "Variable 6%:red", "option": "red"}, { "id": null, "name": "Variable 6%:green", "option": "green" } ] } }, + { "id": null, "name": "Variable 0%", "sku": "variable-product-00", "regular_price": "52.90", "virtual": false, "downloadable": false, "tax_class": "00", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 0%:black", "option": "black" }, { "id": null, "name": "Variable 0%:red", "option": "red"}, { "id": null, "name": "Variable 0%:green", "option": "green" } ] } } + ], + "attribute": [ + { "id": null, "name": "color" } + ] + }, + + "coupons": [ + { "code": "fixedcart", "amount": "10", "discountType": "fixed_cart" }, + { "code": "percent", "amount": "10", "discountType": "percent" } + ], + + "shipping": [ + { + "name": "Sweden", + "location": { "code": "SE", "type": "country" }, + "methods": [ + { "method": "flat_rate", "amount": 49 }, + { "method": "free_shipping", "amount": 0 } + ] + } + ] +} \ No newline at end of file diff --git a/tests/e2e/config/tests.json b/tests/e2e/config/tests.json new file mode 100644 index 00000000..45bf8dc3 --- /dev/null +++ b/tests/e2e/config/tests.json @@ -0,0 +1,7 @@ +[ + {"name": "Simple 0% and 25%, shipping in iframe, b2c, inclusive tax, guest", "loggedIn": false, "inclusiveTax": "yes", "shippingInIframe": "yes", "products": ["Simple 25%", "Simple 0%"], "shippingMethod": "flat_rate", "coupons":["percent"], "customerType":"person"}, + {"name": "Simple 0% and 25%, shipping not in iframe, b2b, exclusive tax, guest", "loggedIn": false, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Simple 25%", "Simple 0%"], "shippingMethod": "free_shipping", "coupons":[], "customerType":"company"}, + {"name": "Simple Virtual 0% and 25%, shipping in iframe, b2b, inclusive tax", "loggedIn": true, "inclusiveTax": "yes", "shippingInIframe": "yes", "products": ["Simple Virtual 25%", "Simple Virtual 0%"], "shippingMethod": "", "coupons":["fixedcart"], "customerType":"company"}, + {"name": "Simple Virtual 0% and 25%, shipping not in iframe, b2c, exclusive tax", "loggedIn": true, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Simple Virtual 25%", "Simple Virtual 0%"], "shippingMethod": "", "coupons":[], "customerType":"person"}, + {"name": "Variable 12%, shipping not in iframe, b2c, exclusive tax, guest", "loggedIn": true, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Variable 12%:black"], "shippingMethod": "", "coupons":[], "customerType":"person"} +] \ No newline at end of file diff --git a/tests/e2e/helpers/kcoCart.js b/tests/e2e/helpers/kcoCart.js index 28626b51..88ce8f10 100644 --- a/tests/e2e/helpers/kcoCart.js +++ b/tests/e2e/helpers/kcoCart.js @@ -33,14 +33,31 @@ const addSingleProductToCart = async (page, productId) => { * @param products * @returns {Promise} */ -const addMultipleProductsToCart = async (page, products) => { +const addMultipleProductsToCart = async (page, products, data) => { const timer = products.length; await page.waitForTimeout(timer * 800); + let ids = []; + + products.forEach( name => { + data.products.simple.forEach(product => { + if(name === product.name) { + ids.push(product.id); + } + }); + + data.products.variable.forEach(product => { + product.attribute.options.forEach(variation => { + if(name === variation.name) { + ids.push(variation.id); + } + }); + }); + }); (async function addEachProduct() { - for (let i = 0; i < products.length + 1; i += 1) { - await addSingleProductToCart(page, products[i]); + for (let i = 0; i < ids.length + 1; i += 1) { + await addSingleProductToCart(page, ids[i]); } })(); diff --git a/tests/e2e/helpers/kcoFrame.js b/tests/e2e/helpers/kcoFrame.js index f9466845..91e81b2f 100644 --- a/tests/e2e/helpers/kcoFrame.js +++ b/tests/e2e/helpers/kcoFrame.js @@ -33,15 +33,21 @@ const submitBillingForm = async (frame, data, customerType) => { } = data; + const emptyField = async (fieldName) => { + if (await frame.$(fieldName)){ + let inputField = await frame.$(fieldName); + await frame.waitForTimeout(200); + await inputField.click({clickCount: 3}); + await inputField.press("Backspace"); + await frame.waitForTimeout(200); + } + } + // Fill out input field const fillOutFrameField = async (fieldName, inputFieldFillIn) => { - if (await frame.$(fieldName)){ - let inputField = await frame.$(fieldName); - await inputField.click({clickCount: 3}); - await inputField.press('Backspace'); - await frame.waitForTimeout(100); + await frame.waitForTimeout(200); await inputField.type(inputFieldFillIn); await frame.waitForTimeout(200); } @@ -49,6 +55,13 @@ const submitBillingForm = async (frame, data, customerType) => { // Fill out the form const completeForm = async () => { + await emptyField(organizationIDSelector); + await emptyField(organizationNameSelector); + await emptyField(firstNameSelector); + await emptyField(lastNameSelector); + await emptyField(emailSelector); + await emptyField(telephoneSelector); + // ---------------------------------------------------------------- // await fillOutFrameField(organizationIDSelector,organizationID ); await fillOutFrameField(organizationNameSelector, organizationName); await fillOutFrameField(firstNameSelector, firstName); @@ -58,14 +71,14 @@ const submitBillingForm = async (frame, data, customerType) => { } // Check for miniaturized frame - if( await frame.$('[id="preview__link"]')) { - await frame.waitForTimeout(1000); - await frame.click('[id="preview__link"]'); - await frame.waitForTimeout(1000); - } + if( frame && await frame.$('[id="preview__link"]')) { + await frame.waitForTimeout(1000); + await frame.click('[id="preview__link"]'); + await frame.waitForTimeout(1000); + } // Fork from B2CB switches - if (await frame.$('[data-cid="am.customer_type"]')) { + if ( frame && await frame.$('[data-cid="am.customer_type"]')) { await frame.waitForTimeout(1000); await frame.click('[data-cid="am.customer_type"]'); @@ -91,7 +104,7 @@ const submitBillingForm = async (frame, data, customerType) => { await frame.click('[data-cid="am.continue_button"]'); await frame.waitForTimeout(1000); - if(await frame.$('[data-cid="am.continue_button"]')){ + if(frame && await frame.$('[data-cid="am.continue_button"]')){ await completeForm() await frame.click('[data-cid="am.continue_button"]'); } diff --git a/tests/e2e/helpers/kcoTestRunner.js b/tests/e2e/helpers/kcoTestRunner.js new file mode 100644 index 00000000..cc9b2507 --- /dev/null +++ b/tests/e2e/helpers/kcoTestRunner.js @@ -0,0 +1,28 @@ +const createWcCustomer = async () => { + try { + const customerResponse = await API.getWCCustomers(); + const { data } = customerResponse; + if (parseInt(data.length, 10) < 1) { + try { + await API.createWCCustomer(customerAPIData); + } catch (error) { + console.log(error); + } + } + } catch (error) { + console.log(error); + } +} + +const loginUser = async () => { + // Check for user logged in + if (isUserLoggedIn) { + // Login with User Credentials + await page.goto(kcoURLS.MY_ACCOUNT); + await user.login(userCredentials, { page }); + } +} + +export default { + createWcCustomer +} \ No newline at end of file diff --git a/tests/e2e/helpers/kcoURLS.js b/tests/e2e/helpers/kcoURLS.js index 1fb73ad7..7e410ffa 100644 --- a/tests/e2e/helpers/kcoURLS.js +++ b/tests/e2e/helpers/kcoURLS.js @@ -14,6 +14,12 @@ const API_ORDER_ENDPOINT = "/wc/v3/orders/"; const API_PRODUCTS_ENDPOINT = "/wc/v3/products/"; +const API_COUPON_ENDPOINT = "/wc/v3/coupons/"; + +const API_TAXES_ENDPOINT = "/wc/v3/taxes/"; + +const API_SHIPPING_ENDPOINT = "/wc/v3/shipping/"; + const API_CUSTOMER_ENDPOINT = "/wc/v3/customers"; const API_WC_PRICE_INC_EXC = @@ -32,6 +38,9 @@ export default { API_BASE_URL, API_ORDER_ENDPOINT, API_PRODUCTS_ENDPOINT, + API_COUPON_ENDPOINT, + API_TAXES_ENDPOINT, + API_SHIPPING_ENDPOINT, API_CUSTOMER_ENDPOINT, API_SESSION_ENDPOINT, API_WC_OPTIONS, diff --git a/tests/e2e/helpers/kcoUtils.js b/tests/e2e/helpers/kcoUtils.js index 3167b730..ec6133aa 100644 --- a/tests/e2e/helpers/kcoUtils.js +++ b/tests/e2e/helpers/kcoUtils.js @@ -103,18 +103,12 @@ const chooseKlarnaShippingMethod = async ( frame, iframeShipping, shippingMethod, - freeShippingMethodTarget, - flatRateMethodTarget, timeOutTime ) => { let shippingMethodTarget; if (iframeShipping !== "yes") { - if (shippingMethod === "free") { - shippingMethodTarget = `[id*="${freeShippingMethodTarget}"]`; - } else if (shippingMethod === "flat") { - shippingMethodTarget = `[id*="${flatRateMethodTarget}"]`; - } + shippingMethodTarget = `[id*="_${shippingMethod}"]`; if (shippingMethod !== "") { await page.waitForTimeout(timeOutTime); @@ -131,9 +125,9 @@ const chooseKlarnaShippingMethod = async ( '[data-cid="SHIPMO-shipping-option-basic"]' ); - if (iframeShippingMethod === "flat") { + if (iframeShippingMethod === "flat_rate") { await frameShippingTab[0].click(); - } else if (iframeShippingMethod === "free") { + } else if (iframeShippingMethod === "free_shipping") { await frameShippingTab[1].click(); } } diff --git a/tests/e2e/package-lock.json b/tests/e2e/package-lock.json new file mode 100644 index 00000000..edb73ca1 --- /dev/null +++ b/tests/e2e/package-lock.json @@ -0,0 +1,8929 @@ +{ + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.5.tgz", + "integrity": "sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg==", + "dev": true, + "requires": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.2", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", + "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", + "dev": true + }, + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz", + "integrity": "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-split-export-declaration": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + } + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz", + "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "dev": true + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + } + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "requires": { + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "dev": true + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + } + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helpers": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", + "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/register": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.14.5.tgz", + "integrity": "sha512-TjJpGz/aDjFGWsItRBQMOFTrmTI9tr79CHOK+KIvLeCkbxuOAk2M5QHjvruIMGoo9OuccMh5euplPzc5FjAKGg==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", + "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + } + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", + "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@hapi/hoek": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "requires": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + } + }, + "@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "requires": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + } + }, + "@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "requires": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + } + }, + "@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.2", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz", + "integrity": "sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^5.1.2", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "requires": { + "@types/ms": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "@types/node": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.0.tgz", + "integrity": "sha512-OyiZPohMMjZEYqcVo/UJ04GyAxXOJEZO/FpzyXxcH4r/ArrVoXHf4MbUrkLp0Tz7/p1mMKpo5zJ6ZHl8XBNthQ==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "optional": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "optional": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "optional": true + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + } + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "optional": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "optional": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "optional": true + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "axios-debug-log": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/axios-debug-log/-/axios-debug-log-0.8.4.tgz", + "integrity": "sha512-DvmaJiYusndhfAjQ94HqlvhaVoEjOetwo9cpb+OVtOZNZTqdz0VAVed3ZjSQKpyM1g8jDXUXFx0Pg1DhUZzAdw==", + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0" + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + } + } + }, + "babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "requires": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "requires": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "optional": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "optional": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001251", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", + "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "dependencies": { + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "optional": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "optional": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "optional": true + }, + "core-js-compat": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "optional": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "devtools-protocol": { + "version": "0.0.883894", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.883894.tgz", + "integrity": "sha512-33idhm54QJzf3Q7QofMgCvIVSd2o9H3kQPWaKT/fhoZh+digc+WSiMhbkeG3iN79WY4Hwr9G05NpbhEVrsOYAg==" + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==" + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "electron-to-chromium": { + "version": "1.3.803", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.803.tgz", + "integrity": "sha512-tmRK9qB8Zs8eLMtTBp+w2zVS9MUe62gQQQHjYdAc5Zljam3ZIokNb+vZLPRz9RCREp6EFRwyhOFwbt1fEriQ2Q==" + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + } + } + }, + "expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "requires": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "optional": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "optional": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "optional": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "optional": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "requires": { + "ci-info": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "optional": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", + "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "requires": { + "@jest/core": "^27.0.6", + "import-local": "^3.0.2", + "jest-cli": "^27.0.6" + }, + "dependencies": { + "jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "requires": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + } + } + } + }, + "jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "requires": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==" + }, + "jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "requires": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + } + } + }, + "jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + } + }, + "jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "requires": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + }, + "jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==" + }, + "jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "dependencies": { + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "requires": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + } + }, + "jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + } + }, + "jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + } + } + }, + "jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "dependencies": { + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "requires": { + "@babel/types": "^7.15.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "requires": { + "@babel/types": "^7.14.8" + }, + "dependencies": { + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "requires": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + } + } + }, + "jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "requires": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", + "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "dependencies": { + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "optional": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "optional": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-releases": { + "version": "1.1.74", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", + "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-1.0a": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/oauth-1.0a/-/oauth-1.0a-2.2.6.tgz", + "integrity": "sha512-6bkxv3N4Gu5lty4viIcIAnq5GbxECviMBeKR3WX/q87SPQ8E8aursPZUtsXDnxCs787af09WPRBLqYrf/lwoYQ==" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "optional": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "optional": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "optional": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "dependencies": { + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + } + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "optional": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "optional": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "pretty-quick": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.1.tgz", + "integrity": "sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "optional": true + }, + "progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==" + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "puppeteer": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.1.0.tgz", + "integrity": "sha512-bsyDHbFBvbofZ63xqF7hMhuKBX1h4WsqFIAoh1GuHr/Y9cewh+EFNAOdqWSkQRHLiBU/MY6M+8PUnXXjAPtuSg==", + "requires": { + "debug": "4.3.1", + "devtools-protocol": "0.0.883894", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + } + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", + "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true, + "optional": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true, + "optional": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "optional": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.1.0.tgz", + "integrity": "sha512-gCFO5iHIbRPwznl6hAYuwNFld8W4S2shtSJIqG27ReWXo9IWrCyEICxUA+6vJHwSR/OakoenC4QsDxq50tzYmw==", + "requires": { + "tslib": "~2.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "optional": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "optional": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "optional": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "optional": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true, + "optional": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "optional": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tar-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "requires": { + "chownr": "^1.1.1", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "optional": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "optional": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "optional": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "optional": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "optional": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true, + "optional": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "wait-on": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", + "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", + "requires": { + "axios": "^0.21.1", + "joi": "^17.4.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.1.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/tests/e2e/package.json b/tests/e2e/package.json index 120155d6..875bfc0d 100644 --- a/tests/e2e/package.json +++ b/tests/e2e/package.json @@ -2,6 +2,7 @@ "author": "Miodrag Stojanovic ", "dependencies": { "axios": "^0.21.1", + "axios-debug-log": "^0.8.4", "crypto-js": "^4.0.0", "dotenv": "^10.0.0", "jest": "27.0.6", @@ -43,7 +44,7 @@ "docker:site-init": "npm run docker:setup && npm run docker:import-data", "jettison": "jest --detectOpenHandles --forceExit", "wp:install": "node ./cli/install.js", - "e2e:test": "yarn docker:up && yarn wp:install && yarn jettison" + "e2e:test": "yarn docker:up && yarn wp:install && yarn jettison && yarn docker:down" }, "version": "1.0.0" } diff --git a/tests/e2e/tests/kcoFlow.spec.js b/tests/e2e/tests/kcoFlow.specasdasdasd.js similarity index 98% rename from tests/e2e/tests/kcoFlow.spec.js rename to tests/e2e/tests/kcoFlow.specasdasdasd.js index fc8cbae0..e7f0d82b 100644 --- a/tests/e2e/tests/kcoFlow.spec.js +++ b/tests/e2e/tests/kcoFlow.specasdasdasd.js @@ -102,10 +102,7 @@ const iframeShipping = "yes"; // Tax Inclusive ( yes ) / Exclusive ( no ) const inclusivePrice = "yes"; -/** - * TEST INITIALIZATION - */ -describe("KCO", () => { +/*describe("KCO", () => { beforeAll(async () => { browser = await puppeteer.launch(options); context = await browser.createIncognitoBrowserContext(); @@ -116,6 +113,7 @@ describe("KCO", () => { if (parseInt(data.length, 10) < 1) { try { await API.createWCCustomer(customerAPIData); + console.log(await API.createWCCustomer(customerAPIData);) } catch (error) { console.log(error); } @@ -134,7 +132,7 @@ describe("KCO", () => { await page.goto(kcoURLS.MY_ACCOUNT); await user.login(userCredentials, { page }); } - + console.log(process.env) await kcoUtils.toggleIFrame(iframeShipping); await page.goto(kcoURLS.CHECKOUT, { waitUntil: "networkidle0" }); @@ -146,12 +144,12 @@ describe("KCO", () => { browser.close(); // context.close(); } - }, 900000); + }, 900000);*/ /** * Begin test suite */ - test("second flow should be on the my account page", async () => { + /*test("second flow should be on the my account page", async () => { // Add products to Cart await page.waitForTimeout(timeOutTime); await cart.addMultipleProductsToCart(page, productsToCart); @@ -577,13 +575,12 @@ describe("KCO", () => { await page.waitForTimeout(timeOutTime); const value = await page.$eval(".entry-title", (e) => e.textContent); expect(value).toBe("Order received"); - }, 190000); + }, 190000);*/ /** * Compare expected and received values */ - - test("Compare IDs", async () => { + /*test("Compare IDs", async () => { expect(toString(klarnaValues.orderId)).toBe( toString(wooValues.orderId) ); @@ -670,4 +667,4 @@ describe("KCO", () => { test("Compare currencies", async () => { expect(klarnaValues.currency).toBe(wooValues.currency); }, 190000); -}); +});*/ diff --git a/tests/e2e/tests/kcoTest.spec.js b/tests/e2e/tests/kcoTest.spec.js new file mode 100644 index 00000000..947d6683 --- /dev/null +++ b/tests/e2e/tests/kcoTest.spec.js @@ -0,0 +1,671 @@ +import puppeteer from "puppeteer"; +import kcoURLS from "../helpers/kcoURLS"; +import user from "../helpers/kcoUser"; +import cart from "../helpers/kcoCart"; +import kcoFrame from "../helpers/kcoFrame"; +import kcoUtils from "../helpers/kcoUtils"; +import { wooValues, klarnaValues } from "../helpers/kcoCompRes"; + +import { + puppeteerOptions as options, + userCredentials, + billingData, +} from "../config/config"; + +import tests from "../config/tests.json" +import setup from "../api/setup"; +import API from "../api/API"; +import data from "../config/data.json"; + +// Main selectors +let page; +let browser; +let context; +let timeOutTime = 5000; +let json = data; + +describe("KCO E2E tests", () => { + beforeAll(async () => { + try { + json = await setup.setupStore(json); + } catch (e) { + console.log(e); + } + }, 250000); + + beforeEach(async () => { + browser = await puppeteer.launch(options); + context = await browser.createIncognitoBrowserContext(); + page = await context.newPage(); + }), + + afterEach(async () => { + if (!page.isClosed()) { + browser.close(); + // context.close(); + } + API.clearWCSession(); + }), + + test.each(tests)( + "$name", + async (args) => { + if(args.loggedIn) { + await page.goto(kcoURLS.MY_ACCOUNT); + await user.login(userCredentials, { page }); + } + + await kcoUtils.wcPricesIncludeTax({value: args.inclusiveTax}); + await kcoUtils.toggleIFrame(args.shippingInIframe); + + await cart.addMultipleProductsToCart(page, args.products, json); + + await page.waitForTimeout(timeOutTime); + + await page.goto(kcoURLS.CHECKOUT); + await page.waitForTimeout(timeOutTime); + + // Choose Klarna as payment method + if (await page.$('input[id="payment_method_kco"]')) { + await page.evaluate( + (paymentMethod) => paymentMethod.click(), + await page.$('input[id="payment_method_kco"]') + ); + } + + await page.waitForTimeout(2 * timeOutTime); + + const originalFrame = await kcoFrame.loadIFrame( + page, + "klarna-checkout-iframe" + ); + + // Submit billing data + await kcoFrame.submitBillingForm( + originalFrame, + billingData, + args.customerType + ); + + // Apply coupons + if( args.coupons.length > 0 ) { + await kcoUtils.addCouponsOnCheckout( + page, + args.loggedIn, + args.coupons + ); + } + + await kcoUtils.expectSelector( + originalFrame, + page, + '[data-cid="am.continue_button"]', + timeOutTime + ); + + await kcoUtils.expectSelector( + originalFrame, + page, + 'input[id="payment-selector-pay_now"]', + timeOutTime + ); + + // Check for Klarna iFrame shipping and implement shipping method + if( args.shippingMethod !== "" ) { + await kcoUtils.chooseKlarnaShippingMethod( + page, + originalFrame, + args.shippingInIframe, + args.shippingMethod, + timeOutTime + ); + } + + const frameNew = await kcoFrame.loadIFrame( + page, + "klarna-fullscreen-iframe" + ); + + await page.waitForTimeout(timeOutTime); + await kcoUtils.expectSelector( + originalFrame, + page, + '[data-cid="button.buy_button"]', + timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + 'div[id*=".paynow_card."]', + timeOutTime + ); + + const frameCreditCard = await kcoFrame.loadIFrame( + page, + "pgw-iframe-paynow_card" + ); + + await kcoUtils.expectInput( + frameCreditCard, + page, + "4111111111111111", + 'input[id="cardNumber"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectInput( + frameCreditCard, + page, + "1122", + 'input[id="expire"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectInput( + frameCreditCard, + page, + "123", + 'input[id="securityCode"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + '[data-cid="button.buy_button"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + 'button[data-cid="skip-favorite-dialog-confirm-button"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + '[id="nin"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectInput( + frameNew, + page, + "410321-9202", + '[id="nin"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + '[id="supplement_nin_dialog__footer-button-wrapper"]', + 0.25 * timeOutTime + ); + + await page.waitForTimeout(2 * timeOutTime); + await kcoUtils.expectSelector( + page + .frames() + .find((fr) => fr.name() === "klarna-fullscreen-iframe"), + page, + '[id="confirm_bank_account_dialog__footer-button-wrapper"]', + page, + '[id="confirm_bank_account_dialog__footer-button-wrapper"]', + timeOutTime + ); + + /* TMP COMMENTS + await page.waitForTimeout(2 * timeOutTime); + const currentURL = await page.url(); + const currentKCOId = currentURL.split("kco_order_id=")[1]; + const response = await API.getKlarnaOrderById( + page, + klarnaOrderEndpoint, + currentKCOId + ); + const orderId = currentURL + .split("/") + .filter((urlPart) => /^\d+$/.test(urlPart))[0]; + */ + + await page.waitForTimeout(timeOutTime); + const value = await page.$eval(".entry-title", (e) => e.textContent); + expect(value).toBe("Order received"); + } + ) + + /** + * Begin test suite + */ + /*test("Test", async () => { + // Add products to Cart + await page.waitForTimeout(timeOutTime); + await cart.addMultipleProductsToCart(page, productsToCart); + await page.waitForTimeout(timeOutTime); + + await page.goto(kcoURLS.CHECKOUT); + await page.waitForTimeout(timeOutTime); + + // Choose Klarna as payment method + if (await page.$('input[id="payment_method_kco"]')) { + await page.evaluate( + (paymentMethod) => paymentMethod.click(), + await page.$('input[id="payment_method_kco"]') + ); + } + + await page.waitForSelector('input[id="terms"]'); + await page.evaluate( + (cb) => cb.click(), + await page.$('input[id="terms"]') + ); + + await page.waitForTimeout(timeOutTime); + + const originalFrame = await kcoFrame.loadIFrame( + page, + "klarna-checkout-iframe" + ); + + await page.waitForTimeout(2 * timeOutTime); + + // Submit billing data + await kcoFrame.submitBillingForm( + originalFrame, + billingData, + customerType + ); + + // Apply coupons + await kcoUtils.addCouponsOnCheckout( + page, + isUserLoggedIn, + appliedCoupons + ); + + await kcoUtils.expectSelector( + originalFrame, + page, + '[data-cid="am.continue_button"]', + timeOutTime + ); + + await kcoUtils.expectSelector( + originalFrame, + page, + 'input[id="payment-selector-pay_now"]', + timeOutTime + ); + + // Check for Klarna iFrame shipping and implement shipping method + await kcoUtils.chooseKlarnaShippingMethod( + page, + originalFrame, + iframeShipping, + shippingMethod, + freeShippingMethodTarget, + flatRateMethodTarget, + timeOutTime + ); + + const frameNew = await kcoFrame.loadIFrame( + page, + "klarna-fullscreen-iframe" + ); + + await page.waitForTimeout(timeOutTime); + await kcoUtils.expectSelector( + originalFrame, + page, + '[data-cid="button.buy_button"]', + timeOutTime + ); + + if (selectedPaymentMethod === "credit") { + await kcoUtils.expectSelector( + frameNew, + page, + 'div[id*=".paynow_card."]', + timeOutTime + ); + + const frameCreditCard = await kcoFrame.loadIFrame( + page, + "pgw-iframe-paynow_card" + ); + + await kcoUtils.expectInput( + frameCreditCard, + page, + cardNumber, + 'input[id="cardNumber"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectInput( + frameCreditCard, + page, + "1122", + 'input[id="expire"]', + 0.25 * timeOutTime + ); + + await kcoUtils.expectInput( + frameCreditCard, + page, + "123", + 'input[id="securityCode"]', + 0.25 * timeOutTime + ); + } else if (selectedPaymentMethod === "debit") { + await kcoUtils.expectSelector( + frameNew, + page, + '[data-cid="payment-selector-method.direct_debit"]', + timeOutTime + ); + } else if (selectedPaymentMethod === "invoice") { + await kcoUtils.expectSelector( + frameNew, + page, + 'input[id*=".invoice."]', + timeOutTime + ); + } + + await kcoUtils.expectSelector( + frameNew, + page, + '[data-cid="button.buy_button"]', + timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + 'button[data-cid="skip-favorite-dialog-confirm-button"]', + timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + '[id="nin"]', + timeOutTime + ); + + await kcoUtils.expectInput( + frameNew, + page, + pinNumber, + '[id="nin"]', + timeOutTime + ); + + await kcoUtils.expectSelector( + frameNew, + page, + '[id="supplement_nin_dialog__footer-button-wrapper"]', + timeOutTime + ); + + await page.waitForTimeout(2 * timeOutTime); + await kcoUtils.expectSelector( + page + .frames() + .find((fr) => fr.name() === "klarna-fullscreen-iframe"), + page, + '[id="confirm_bank_account_dialog__footer-button-wrapper"]', + page, + '[id="confirm_bank_account_dialog__footer-button-wrapper"]', + timeOutTime + ); + + await page.waitForTimeout(2 * timeOutTime); + const currentURL = await page.url(); + const currentKCOId = currentURL.split("kco_order_id=")[1]; + const response = await API.getKlarnaOrderById( + page, + klarnaOrderEndpoint, + currentKCOId + ); + + const orderId = currentURL + .split("/") + .filter((urlPart) => /^\d+$/.test(urlPart))[0]; + + const wooCommerceOrder = await API.getWCOrderById(orderId); + + const klarnaOrderLinesContainer = []; + const wooOrderLinesContainer = []; + + response.data.order_lines.forEach((klarnaOrderLinesItemType) => { + if (klarnaOrderLinesItemType.type !== "shipping_fee") { + klarnaOrderLinesContainer.push(klarnaOrderLinesItemType); + } + }); + + wooCommerceOrder.data.line_items.forEach((wooOrderLinesItemType) => { + if (wooOrderLinesItemType.type !== "shipping_fee") { + wooOrderLinesContainer.push(wooOrderLinesItemType); + } + }); + + for (let i = 0; i < klarnaOrderLinesContainer.length; i += 1) { + if ( + klarnaOrderLinesContainer[i].reference === + wooOrderLinesContainer[i].sku + ) { + if ( + parseFloat(klarnaOrderLinesContainer[i].total_amount) === + parseInt( + Math.round( + (parseFloat(wooOrderLinesContainer[i].total) + + parseFloat( + wooOrderLinesContainer[i].total_tax + )) * + 100 + ).toFixed(2), + 10 + ) + ) { + klarnaValues.totalAmount.push( + klarnaOrderLinesContainer[i].total_amount + ); + wooValues.totalAmount.push( + parseInt( + Math.round( + (parseFloat(wooOrderLinesContainer[i].total) + + parseFloat( + wooOrderLinesContainer[i].total_tax + )) * + 100 + ).toFixed(2), + 10 + ) + ); + } + + if ( + klarnaOrderLinesContainer[i].quantity === + wooOrderLinesContainer[i].quantity + ) { + klarnaValues.quantity.push( + klarnaOrderLinesContainer[i].quantity + ); + wooValues.quantity.push(wooOrderLinesContainer[i].quantity); + } + + if ( + klarnaOrderLinesContainer[i].total_tax_amount === + wooOrderLinesContainer[i].total_tax * 100 + ) { + klarnaValues.totalTax.push( + klarnaOrderLinesContainer[i].total_tax_amount + ); + wooValues.totalTax.push( + wooOrderLinesContainer[i].total_tax * 100 + ); + } + + if ( + klarnaOrderLinesContainer[i].name === + wooOrderLinesContainer[i].name + ) { + klarnaValues.productName.push( + klarnaOrderLinesContainer[i].name + ); + wooValues.productName.push(wooOrderLinesContainer[i].name); + } + + if ( + klarnaOrderLinesContainer[i].reference === + wooOrderLinesContainer[i].sku + ) { + klarnaValues.sku.push( + klarnaOrderLinesContainer[i].reference + ); + wooValues.sku.push(wooOrderLinesContainer[i].sku); + } + } + } + + if (response.data.order_id === wooCommerceOrder.data.transaction_id) { + klarnaValues.orderId = response.data.order_id; + wooValues.orderId = wooCommerceOrder.data.transaction_id; + } + + if ( + response.data.shipping_address.given_name === + wooCommerceOrder.data.billing.first_name + ) { + klarnaValues.firstName = response.data.shipping_address.given_name; + wooValues.firstName = wooCommerceOrder.data.billing.first_name; + } + + if ( + response.data.shipping_address.family_name === + wooCommerceOrder.data.billing.last_name + ) { + klarnaValues.lastName = response.data.shipping_address.family_name; + wooValues.lastName = wooCommerceOrder.data.billing.last_name; + } + + // Case for B2CB individual + if (customerType === "person") { + if ( + response.data.shipping_address.title === + wooCommerceOrder.data.billing.company + ) { + klarnaValues.company = response.data.shipping_address.title; + wooValues.company = wooCommerceOrder.data.billing.company; + } + + // Case for B2CB for company + } else if (customerType === "company") { + if ( + response.data.shipping_address.organization_name === + wooCommerceOrder.data.billing.company + ) { + klarnaValues.company = + response.data.shipping_address.organization_name; + wooValues.company = wooCommerceOrder.data.billing.company; + } + } + + if ( + response.data.shipping_address.street_address === + wooCommerceOrder.data.billing.address_1 + ) { + klarnaValues.addressOne = + response.data.shipping_address.street_address; + wooValues.addressOne = wooCommerceOrder.data.billing.address_1; + } + + if ( + response.data.shipping_address.street_address2 === + wooCommerceOrder.data.billing.address_2 + ) { + klarnaValues.addressTwo = + response.data.shipping_address.street_address2; + wooValues.addressTwo = wooCommerceOrder.data.billing.address_2; + } + + if ( + response.data.shipping_address.city === + wooCommerceOrder.data.billing.city + ) { + klarnaValues.city = response.data.shipping_address.city; + wooValues.city = wooCommerceOrder.data.billing.city; + } + + if ( + response.data.shipping_address.region === + wooCommerceOrder.data.billing.state + ) { + klarnaValues.region = response.data.shipping_address.region; + wooValues.region = wooCommerceOrder.data.billing.state; + } + + if ( + response.data.shipping_address.postal_code.replace(/\s/g, "") === + wooCommerceOrder.data.billing.postcode + ) { + klarnaValues.postcode = + response.data.shipping_address.postal_code.replace(/\s/g, ""); + wooValues.postcode = wooCommerceOrder.data.billing.postcode; + } + + if ( + response.data.shipping_address.country === + wooCommerceOrder.data.billing.country + ) { + klarnaValues.country = response.data.shipping_address.country; + wooValues.country = wooCommerceOrder.data.billing.country; + } + + if ( + response.data.shipping_address.email === + wooCommerceOrder.data.billing.email + ) { + klarnaValues.email = response.data.shipping_address.email; + wooValues.email = wooCommerceOrder.data.billing.email; + } + + if ( + response.data.shipping_address.phone === + wooCommerceOrder.data.billing.phone.replace(/\s/g, "") + ) { + klarnaValues.phone = response.data.shipping_address.phone; + wooValues.phone = wooCommerceOrder.data.billing.phone.replace( + /\s/g, + "" + ); + } + + if ( + response.data.purchase_currency === wooCommerceOrder.data.currency + ) { + klarnaValues.currency = response.data.purchase_currency; + wooValues.currency = wooCommerceOrder.data.currency; + } + + if ( + response.data.order_lines[productCounterArray.length].name === + wooCommerceOrder.data.shipping_lines[0].method_title + ) { + klarnaValues.shippingMethod = + response.data.order_lines[productCounterArray.length].name; + wooValues.shippingMethod = + wooCommerceOrder.data.shipping_lines[0].method_title; + } + + await page.waitForTimeout(timeOutTime); + const value = await page.$eval(".entry-title", (e) => e.textContent); + expect(value).toBe("Order received"); + }, 190000);*/ +}); From e6d430eb585e5c035977f3c0a7908d17e8ab9787 Mon Sep 17 00:00:00 2001 From: Michael Bengtsson Date: Sun, 15 Aug 2021 21:06:33 +0200 Subject: [PATCH 06/23] File cleanup and optimizing --- assets/js/klarna-checkout-for-woocommerce.js | 2 +- .../js/klarna-checkout-for-woocommerce.min.js | 2 +- tests/e2e/api/API.js | 3 +- tests/e2e/api/index.js | 9 +- tests/e2e/api/setup.js | 2 +- tests/e2e/api/woocommerce.js | 4 +- tests/e2e/config/config.data.json | 133 ---- tests/e2e/config/config.js | 113 --- tests/e2e/config/tests.json | 10 +- tests/e2e/helpers/iframeHandler.js | 191 +++++ tests/e2e/helpers/kcoCart.js | 70 -- tests/e2e/helpers/kcoCompRes.js | 43 -- tests/e2e/helpers/kcoFrame.js | 129 ---- tests/e2e/helpers/kcoTestRunner.js | 28 - tests/e2e/helpers/kcoUser.js | 24 - tests/e2e/helpers/kcoUtils.js | 179 ----- tests/e2e/helpers/{kcoURLS.js => urls.js} | 0 tests/e2e/helpers/utils.js | 135 ++++ tests/e2e/package.json | 2 +- tests/e2e/tests/kcoFlow.specasdasdasd.js | 670 ----------------- tests/e2e/tests/kcoTest.spec.js | 677 ++---------------- tests/e2e/yarn.lock | 27 + 22 files changed, 427 insertions(+), 2026 deletions(-) delete mode 100644 tests/e2e/config/config.data.json delete mode 100644 tests/e2e/config/config.js create mode 100644 tests/e2e/helpers/iframeHandler.js delete mode 100644 tests/e2e/helpers/kcoCart.js delete mode 100644 tests/e2e/helpers/kcoCompRes.js delete mode 100644 tests/e2e/helpers/kcoFrame.js delete mode 100644 tests/e2e/helpers/kcoTestRunner.js delete mode 100644 tests/e2e/helpers/kcoUser.js delete mode 100644 tests/e2e/helpers/kcoUtils.js rename tests/e2e/helpers/{kcoURLS.js => urls.js} (100%) create mode 100644 tests/e2e/helpers/utils.js delete mode 100644 tests/e2e/tests/kcoFlow.specasdasdasd.js diff --git a/assets/js/klarna-checkout-for-woocommerce.js b/assets/js/klarna-checkout-for-woocommerce.js index ade59813..6facea89 100644 --- a/assets/js/klarna-checkout-for-woocommerce.js +++ b/assets/js/klarna-checkout-for-woocommerce.js @@ -401,7 +401,7 @@ jQuery( function( $ ) { kco_wc.blocked = true; kco_wc.getKlarnaOrder().done( function(response) { if(response.success ) { - kco_wc.submitOrder() + kco_wc.submitOrder(callback) } else { kco_wc.failOrder( 'get_order', '
' + 'Failed to get the order from Klarna.' + '
', callback ); } diff --git a/assets/js/klarna-checkout-for-woocommerce.min.js b/assets/js/klarna-checkout-for-woocommerce.min.js index 1878b84c..886921a7 100644 --- a/assets/js/klarna-checkout-for-woocommerce.min.js +++ b/assets/js/klarna-checkout-for-woocommerce.min.js @@ -1 +1 @@ -jQuery(function(a){if("undefined"==typeof kco_params)return!1;var r={bodyEl:a("body"),checkoutFormSelector:a("form.checkout"),paymentMethodEl:a('input[name="payment_method"]'),paymentMethod:"",selectAnotherSelector:"#klarna-checkout-select-other",shippingUpdated:!1,blocked:!1,preventPaymentMethodChange:!1,timeout:null,interval:null,klarnaUpdateNeeded:!1,documentReady:function(){r.log(kco_params),0'+o+""),a(n).removeClass("processing").unblock(),a(n).find(".input-text, select, input:checkbox").trigger("validate").blur(),a(document.body).trigger("checkout_error",[o]),a("html, body").animate({scrollTop:a(n).offset().top-100},1e3)},logToFile:function(e){a.ajax({url:kco_params.log_to_file_url,type:"POST",dataType:"json",data:{message:e,nonce:kco_params.log_to_file_nonce}})},log:function(e){kco_params.logging&&console.log(e)},updateShipping:function(e){r.kcoSuspend(!0),a("#kco_shipping_data").val(JSON.stringify(e)),a("body").trigger("kco_shipping_option_changed",[e]),a("body").trigger("update_checkout")},convertCountry:function(o){return Object.keys(kco_params.countries).find(e=>kco_params.countries[e]===o)},placeKlarnaOrder:function(o){r.blocked=!0,r.getKlarnaOrder().done(function(e){e.success?r.submitOrder():r.failOrder("get_order",'
Failed to get the order from Klarna.
',o)})},submitOrder:function(n){a(".woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),a.ajax({type:"POST",url:kco_params.submit_order,data:a("form.checkout").serialize(),dataType:"json",success:function(o){try{if("success"!==o.result)throw"Result failed";r.logToFile('Successfully placed order. Sending "should_proceed: true" to Klarna'),n({should_proceed:!0})}catch(e){o.messages?(r.logToFile("Checkout error | "+o.messages),r.failOrder("submission",o.messages,n)):(r.logToFile("Checkout error | No message"),r.failOrder("submission",'
Checkout error
',n))}},error:function(e){try{r.logToFile("AJAX error | "+JSON.stringify(e))}catch(e){r.logToFile("AJAX error | Failed to parse error message.")}r.failOrder("ajax-error",'
Internal Server Error
',n)}})},init:function(){a(document).ready(r.documentReady),r.bodyEl.on("update_checkout",function(){r.kcoSuspend(!0)}),r.bodyEl.on("updated_checkout",r.kcoResume),r.bodyEl.on("updated_checkout",r.maybeDisplayShippingPrice),r.bodyEl.on("change","input.qty",r.updateCart),r.bodyEl.on("change",'input[name="payment_method"]',r.maybeChangeToKco),r.bodyEl.on("click",r.selectAnotherSelector,r.changeFromKco),"function"==typeof window._klarnaCheckout&&window._klarnaCheckout(function(e){e.on({shipping_address_change:function(e){r.log("shipping_address_change"),r.log(e);var o=r.convertCountry(e.country.toUpperCase());0<=a("#shipping_first_name").length?(a("#ship-to-different-address-checkbox").prop("checked",!0),a("#ship-to-different-address-checkbox").change(),a("#ship-to-different-address-checkbox").blur(),a("#shipping_first_name").val("given_name"in e?e.given_name:""),a("#shipping_last_name").val("family_name"in e?e.family_name:""),a("#shipping_postcode").val("postal_code"in e?e.postal_code:""),a("#shipping_country").val("country"in e?o:""),a("#shipping_country").change()):(a("#billing_first_name").val("given_name"in e?e.given_name:""),a("#billing_last_name").val("family_name"in e?e.family_name:""),a("#billing_postcode").val("postal_code"in e?e.postal_code:""),a("#billing_country").val("country"in e?o:""),a("#billing_email").val("email"in e?e.email:""),a("#billing_country").change(),a("#billing_email").change(),a("#billing_email").blur()),a("form.checkout").trigger("update_checkout")},change:function(e){r.log("change",e)},order_total_change:function(e){r.log("order_total_change",e)},shipping_option_change:function(e){r.log("shipping_option_change",e),r.log(e),r.updateShipping(e)},can_not_complete_order:function(e){r.log("can_not_complete_order",e)},validation_callback:function(e,o){r.logToFile("validation_callback from Klarna triggered"),kco_params.pay_for_order?o({should_proceed:!0}):r.placeKlarnaOrder(o)}})})}};r.init()}); +jQuery(function(a){if("undefined"==typeof kco_params)return!1;var r={bodyEl:a("body"),checkoutFormSelector:a("form.checkout"),paymentMethodEl:a('input[name="payment_method"]'),paymentMethod:"",selectAnotherSelector:"#klarna-checkout-select-other",shippingUpdated:!1,blocked:!1,preventPaymentMethodChange:!1,timeout:null,interval:null,klarnaUpdateNeeded:!1,documentReady:function(){r.log(kco_params),0'+o+""),a(n).removeClass("processing").unblock(),a(n).find(".input-text, select, input:checkbox").trigger("validate").blur(),a(document.body).trigger("checkout_error",[o]),a("html, body").animate({scrollTop:a(n).offset().top-100},1e3)},logToFile:function(e){a.ajax({url:kco_params.log_to_file_url,type:"POST",dataType:"json",data:{message:e,nonce:kco_params.log_to_file_nonce}})},log:function(e){kco_params.logging&&console.log(e)},updateShipping:function(e){r.kcoSuspend(!0),a("#kco_shipping_data").val(JSON.stringify(e)),a("body").trigger("kco_shipping_option_changed",[e]),a("body").trigger("update_checkout")},convertCountry:function(o){return Object.keys(kco_params.countries).find(e=>kco_params.countries[e]===o)},placeKlarnaOrder:function(o){r.blocked=!0,r.getKlarnaOrder().done(function(e){e.success?r.submitOrder(o):r.failOrder("get_order",'
Failed to get the order from Klarna.
',o)})},submitOrder:function(n){a(".woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),a.ajax({type:"POST",url:kco_params.submit_order,data:a("form.checkout").serialize(),dataType:"json",success:function(o){try{if("success"!==o.result)throw"Result failed";r.logToFile('Successfully placed order. Sending "should_proceed: true" to Klarna'),n({should_proceed:!0})}catch(e){o.messages?(r.logToFile("Checkout error | "+o.messages),r.failOrder("submission",o.messages,n)):(r.logToFile("Checkout error | No message"),r.failOrder("submission",'
Checkout error
',n))}},error:function(e){try{r.logToFile("AJAX error | "+JSON.stringify(e))}catch(e){r.logToFile("AJAX error | Failed to parse error message.")}r.failOrder("ajax-error",'
Internal Server Error
',n)}})},init:function(){a(document).ready(r.documentReady),r.bodyEl.on("update_checkout",function(){r.kcoSuspend(!0)}),r.bodyEl.on("updated_checkout",r.kcoResume),r.bodyEl.on("updated_checkout",r.maybeDisplayShippingPrice),r.bodyEl.on("change","input.qty",r.updateCart),r.bodyEl.on("change",'input[name="payment_method"]',r.maybeChangeToKco),r.bodyEl.on("click",r.selectAnotherSelector,r.changeFromKco),"function"==typeof window._klarnaCheckout&&window._klarnaCheckout(function(e){e.on({shipping_address_change:function(e){r.log("shipping_address_change"),r.log(e);var o=r.convertCountry(e.country.toUpperCase());0<=a("#shipping_first_name").length?(a("#ship-to-different-address-checkbox").prop("checked",!0),a("#ship-to-different-address-checkbox").change(),a("#ship-to-different-address-checkbox").blur(),a("#shipping_first_name").val("given_name"in e?e.given_name:""),a("#shipping_last_name").val("family_name"in e?e.family_name:""),a("#shipping_postcode").val("postal_code"in e?e.postal_code:""),a("#shipping_country").val("country"in e?o:""),a("#shipping_country").change()):(a("#billing_first_name").val("given_name"in e?e.given_name:""),a("#billing_last_name").val("family_name"in e?e.family_name:""),a("#billing_postcode").val("postal_code"in e?e.postal_code:""),a("#billing_country").val("country"in e?o:""),a("#billing_email").val("email"in e?e.email:""),a("#billing_country").change(),a("#billing_email").change(),a("#billing_email").blur()),a("form.checkout").trigger("update_checkout")},change:function(e){r.log("change",e)},order_total_change:function(e){r.log("order_total_change",e)},shipping_option_change:function(e){r.log("shipping_option_change",e),r.log(e),r.updateShipping(e)},can_not_complete_order:function(e){r.log("can_not_complete_order",e)},validation_callback:function(e,o){r.logToFile("validation_callback from Klarna triggered"),kco_params.pay_for_order?o({should_proceed:!0}):r.placeKlarnaOrder(o)}})})}};r.init()}); \ No newline at end of file diff --git a/tests/e2e/api/API.js b/tests/e2e/api/API.js index 5e04a302..c2cbe41c 100644 --- a/tests/e2e/api/API.js +++ b/tests/e2e/api/API.js @@ -1,6 +1,5 @@ import axios from "axios"; import woocommerce from "./woocommerce"; -import { klarnaAuth } from "../config/config"; /** * @param page @@ -13,7 +12,7 @@ const getKlarnaOrderById = async (page, endpoint, id) => { const merchant = process.env.API_KEY; const secret = process.env.API_SECRET; return btoa(`${merchant}:${secret}`); - }, klarnaAuth); + }); return axios.get(`${endpoint}/${id}`, { headers: { diff --git a/tests/e2e/api/index.js b/tests/e2e/api/index.js index 5ca04aa7..8e7c2f67 100644 --- a/tests/e2e/api/index.js +++ b/tests/e2e/api/index.js @@ -1,9 +1,10 @@ import Oauth from "oauth-1.0a"; import crypto from "crypto"; import axios from "axios"; -import { customerKey, customerSecret } from "../config/config"; -import kcoURLS from "../helpers/kcoURLS"; +import kcoURLS from "../helpers/urls"; +const consumerKey = "ck_6b26ae8bf280ffe5fd140d793ff14243c56a343a"; +const consumerSecret = "cs_4b7dc229c7f65cf54e5e30c5dc79287c2eae16d2"; const { API_BASE_URL } = kcoURLS; const httpMethods = { get: "GET", @@ -13,8 +14,8 @@ const httpMethods = { const { get, post, put } = httpMethods; const oauth = Oauth({ consumer: { - key: customerKey, - secret: customerSecret, + key: consumerKey, + secret: consumerSecret, }, signature_method: "HMAC-SHA1", // eslint-disable-next-line camelcase diff --git a/tests/e2e/api/setup.js b/tests/e2e/api/setup.js index d69f8484..0d3df898 100644 --- a/tests/e2e/api/setup.js +++ b/tests/e2e/api/setup.js @@ -59,9 +59,9 @@ const createAttributes = async () => { } const createVariableProducts = async () => { + let i = 0; for( const variableProduct of json.products.variable ) { let attributeId = 0; - let i = 0; json.products.attribute.forEach(element => { if(element.name === json.products.variable[i].attribute.name) { attributeId = element.id diff --git a/tests/e2e/api/woocommerce.js b/tests/e2e/api/woocommerce.js index 2dd16179..995d4ccb 100644 --- a/tests/e2e/api/woocommerce.js +++ b/tests/e2e/api/woocommerce.js @@ -1,4 +1,4 @@ -import kcoURLS from "../helpers/kcoURLS"; +import urls from "../helpers/urls"; import { createRequest, post, put } from "./index"; const { @@ -11,7 +11,7 @@ const { API_SESSION_ENDPOINT, API_WC_OPTIONS, API_WC_PRICE_INC_EXC, -} = kcoURLS; +} = urls; const getProducts = () => { return createRequest(API_PRODUCTS_ENDPOINT); diff --git a/tests/e2e/config/config.data.json b/tests/e2e/config/config.data.json deleted file mode 100644 index a2db1a96..00000000 --- a/tests/e2e/config/config.data.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "url": "http://localhost:8000/", - "baseUrl": "", - "users": { - "admin": { - "username": "admin", - "password": "password", - "klarnaOrderEndpoint": "https://api.playground.klarna.com/ordermanagement/v1/orders/" - }, - "customer": { - "username": "ruben", - "password": "password", - "cardNumber": "4111 1111 1111 1111", - "pinNumber": "410321-9202", - "email": "test@krokedil.se", - "first_name": "RUBEN", - "last_name": "HENRIKSSON", - "phone": "070-999 91 23", - "organizationName": "KROKEDIL", - "billingData": { - "organizationIDSelector": "[data-cid='am.organization_registration_id']", - "organizationID": "002031-0132", - "organizationNameSelector": "[data-cid='am.organization_name']", - "organizationName": "KROKEDIL", - "firstNameSelector": "[data-cid='am.given_name']", - "firstName": "RUBEN", - "lastNameSelector": "[data-cid='am.family_name']", - "lastName": "HENRIKSSON", - "telephoneSelector": "[data-cid='am.phone']", - "telephone": "070-999 91 23", - "emailSelector": "[data-cid='am.email']", - "email": "test@krokedil.se", - "postalCodeSelector": "[data-cid='am.postal_code']", - "postalCode": "12600", - "submitSelector": "button[id='button-primary']" - }, - "customerType": { - "b2c": "B2C", - "b2b": "B2B", - "b2cb": "B2CB", - "b2bc": "B2BC" - }, - "credentialsAndSelectors": { - "username": "admin", - "password": "password", - "selectorForName": "#username", - "selectorForPass": "#password" - }, - "shippingSelectors": { - "iframe": { - "iframeShipping": "no" - }, - "methods": { - "freeShipping": "free", - "flatRate": "flat" - }, - "targets": { - "flatRateTarget": "_flat_rate", - "freeShippingTarget": "_free_shipping" - } - }, - "coupons": { - "fixed_cart": "fixedcart", - "fixed_product": "fixedproduct", - "percent": "percentage", - "free_shipping_100": "free" - }, - "payment": { - "selectedMethod": { - "creditMethod": "credit", - "debitMethod": "debit", - "invoiceMethod": "invoice" - } - }, - "billing": { - "first_name": "RUBEN", - "last_name": "HENRIKSSON", - "company": "", - "address_1": "Getstigen 4", - "address_2": "", - "city": "Hägersten", - "state": "", - "postcode": "12600", - "country": "SE", - "phone": "070-999 91 23", - "email": "test@krokedil.se" - }, - "shipping": { - "first_name": "RUBEN", - "last_name": "HENRIKSSON", - "company": "", - "address_1": "Getstigen 4", - "address_2": "", - "city": "Hägersten", - "state": "", - "postcode": "12600", - "country": "SE", - "email": "test@krokedil.se" - }, - "api": { - "consumerKey": "ck_6b26ae8bf280ffe5fd140d793ff14243c56a343a", - "consumerSecret": "cs_4b7dc229c7f65cf54e5e30c5dc79287c2eae16d2" - } - } - }, - "products": { - "product_id": { - "out_of_stock": "11", - "variable_25": "12", - "downloadable_0": "17", - "downloadable_25": "18", - "downloadable_shipping_0": "20", - "downloadable_shipping_25": "21", - "simple_12": "22", - "simple_6": "23", - "virtual_0": "26", - "virtual_25": "28", - "virtual_downloadable_0": "29", - "virtual_downloadable_25": "30", - "many_characters": "31" - } - }, - "timeoutTime": 2500, - "puppeteerOptions": { - "headless": false, - "defaultViewport": null, - "args": [ - "--disable-infobars", - "--disable-web-security", - "--disable-features=IsolateOrigins,site-per-process" - ] - } -} diff --git a/tests/e2e/config/config.js b/tests/e2e/config/config.js deleted file mode 100644 index 75d35249..00000000 --- a/tests/e2e/config/config.js +++ /dev/null @@ -1,113 +0,0 @@ -import config from "./config.data.json"; - -export const adminData = config?.users?.admin; -export const customerData = config.users.customer; -export const productIdData = config.products.product_id; - -const settingsArray = { - woocommerce_kco_settings: { - enabled: "yes", - title: "Klarna", - description: "Klarna Checkout for WooCommerce Test", - select_another_method_text: "", - testmode: "yes", - logging: "yes", - credentials_eu: "", - merchant_id_eu: "", - shared_secret_eu: "", - test_merchant_id_eu: process.env.API_KEY, - test_shared_secret_eu: process.env.API_SECRET, - credentials_us: "", - merchant_id_us: "", - shared_secret_us: "", - test_merchant_id_us: "", - test_shared_secret_us: "", - shipping_section: "", - allow_separate_shipping: "no", - shipping_methods_in_iframe: - customerData.shippingSelectors.iframe.iframeShipping, - shipping_details: "", - checkout_section: "", - send_product_urls: "yes", - dob_mandatory: "no", - display_privacy_policy_text: "no", - add_terms_and_conditions_checkbox: "no", - allowed_customer_types: "B2CB", - title_mandatory: "yes", - prefill_consent: "yes", - quantity_fields: "yes", - color_settings_title: "", - color_button: "", - color_button_text: "", - color_checkbox: "", - color_checkbox_checkmark: "", - color_header: "", - color_link: "", - radius_border: "", - add_to_email: "no", - }, -}; - -export const shippingTargets = customerData.shipping.targets; -export const paymentSelectedMethod = customerData.payment.selectedMethod; -export const customerKey = customerData.api.consumerKey; -export const customerSecret = customerData.api.consumerSecret; -export const klarnaAuth = customerData.klarnaCredentials; - -export const shippingSel = customerData.shippingSelectors; -export const freeShippingMethod = shippingSel.methods.freeShipping; -export const flatRateMethod = shippingSel.methods.flatRate; -export const freeShippingMethodTarget = shippingSel.targets.freeShippingTarget; -export const flatRateMethodTarget = shippingSel.targets.flatRateTarget; - -export const creditPaymentMethod = paymentSelectedMethod.creditMethod; -export const debitPaymentMethod = paymentSelectedMethod.debitMethod; -export const invoicePaymentMethod = paymentSelectedMethod.invoiceMethod; - -export const customerName = customerData.first_name; -export const customerLastname = customerData.last_name; -export const customerEmail = customerData.email; -export const customerUsername = customerData.username; - -export const outOfStock = productIdData.out_of_stock; -export const variable25 = productIdData.variable_25; -export const downloadable0 = productIdData.downloadable_0; -export const downloadable25 = productIdData.downloadable_25; -export const downloadableShipping0 = productIdData.downloadable_shipping_0; -export const downloadableShipping25 = productIdData.downloadable_shipping_25; -export const simple12 = productIdData.simple_12; -export const simple6 = productIdData.simple_6; -export const virtual0 = productIdData.virtual_0; -export const virtual25 = productIdData.virtual_25; -export const virtualDownloadable0 = productIdData.virtual_downloadable_0; -export const virtualDownloadable25 = productIdData.virtual_downloadable_25; -export const manyCharacters = productIdData.many_characters; - -export const couponFixedCart = customerData.coupons.fixed_cart; -export const couponFixedProduct = customerData.coupons.fixed_product; -export const couponPercent = customerData.coupons.percent; -export const couponTotalFreeShipping = customerData.coupons.free_shipping; -export const couponTotalWithShipping = customerData.coupons.charged_shipping; - -export const { pinNumber } = customerData; -export const { cardNumber } = customerData; - -export const timeOutTime = config.timeoutTime; -export const { billing } = customerData; -export const { shipping } = customerData; -export const customerAPIData = { - email: customerEmail, - first_name: customerName, - last_name: customerLastname, - username: customerUsername, - billing, - shipping, -}; -export const { billingData } = customerData; - -export const userCredentials = customerData.credentialsAndSelectors; - -export const { klarnaOrderEndpoint } = adminData; -export const { puppeteerOptions } = config; - -export const KCOSettingsArray = settingsArray; diff --git a/tests/e2e/config/tests.json b/tests/e2e/config/tests.json index 45bf8dc3..5fa6b957 100644 --- a/tests/e2e/config/tests.json +++ b/tests/e2e/config/tests.json @@ -1,7 +1,7 @@ [ - {"name": "Simple 0% and 25%, shipping in iframe, b2c, inclusive tax, guest", "loggedIn": false, "inclusiveTax": "yes", "shippingInIframe": "yes", "products": ["Simple 25%", "Simple 0%"], "shippingMethod": "flat_rate", "coupons":["percent"], "customerType":"person"}, - {"name": "Simple 0% and 25%, shipping not in iframe, b2b, exclusive tax, guest", "loggedIn": false, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Simple 25%", "Simple 0%"], "shippingMethod": "free_shipping", "coupons":[], "customerType":"company"}, - {"name": "Simple Virtual 0% and 25%, shipping in iframe, b2b, inclusive tax", "loggedIn": true, "inclusiveTax": "yes", "shippingInIframe": "yes", "products": ["Simple Virtual 25%", "Simple Virtual 0%"], "shippingMethod": "", "coupons":["fixedcart"], "customerType":"company"}, - {"name": "Simple Virtual 0% and 25%, shipping not in iframe, b2c, exclusive tax", "loggedIn": true, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Simple Virtual 25%", "Simple Virtual 0%"], "shippingMethod": "", "coupons":[], "customerType":"person"}, - {"name": "Variable 12%, shipping not in iframe, b2c, exclusive tax, guest", "loggedIn": true, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Variable 12%:black"], "shippingMethod": "", "coupons":[], "customerType":"person"} + {"name": "Simple 0% and 25%, shipping in iframe, b2c, inclusive tax, guest", "loggedIn": false, "inclusiveTax": "yes", "shippingInIframe": "yes", "products": ["Simple 25%", "Simple 0%"], "shippingMethod": "flat_rate", "coupons":["percent"], "customerType":"person", "expectedTotal": 147.98, "expectedOrderLines": 2}, + {"name": "Simple 0% and 25%, shipping not in iframe, b2b, exclusive tax, guest", "loggedIn": false, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Simple 25%", "Simple 0%"], "shippingMethod": "free_shipping", "coupons":[], "customerType":"company", "expectedTotal": 134.98, "expectedOrderLines": 2}, + {"name": "Simple Virtual 0% and 25%, shipping in iframe, b2b, inclusive tax", "loggedIn": true, "inclusiveTax": "yes", "shippingInIframe": "yes", "products": ["Simple Virtual 25%", "Simple Virtual 0%"], "shippingMethod": "", "coupons":["fixedcart"], "customerType":"company", "expectedTotal": 78.27, "expectedOrderLines": 2}, + {"name": "Simple Virtual 0% and 25%, shipping not in iframe, b2c, exclusive tax", "loggedIn": true, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Simple Virtual 25%", "Simple Virtual 0%"], "shippingMethod": "", "coupons":[], "customerType":"person", "expectedTotal": 91.48, "expectedOrderLines": 2}, + {"name": "Variable 12%, shipping not in iframe, b2c, exclusive tax, guest", "loggedIn": true, "inclusiveTax": "no", "shippingInIframe": "no", "products": ["Variable 12%:black"], "shippingMethod": "", "coupons":[], "customerType":"person", "expectedTotal": 161.59, "expectedOrderLines": 1} ] \ No newline at end of file diff --git a/tests/e2e/helpers/iframeHandler.js b/tests/e2e/helpers/iframeHandler.js new file mode 100644 index 00000000..5900d44b --- /dev/null +++ b/tests/e2e/helpers/iframeHandler.js @@ -0,0 +1,191 @@ +const timeOutTime = 1500; + +const setCustomerType = async (page, kcoIframe, customerTyoe) => { + if ( await kcoIframe.$('[data-cid="am.customer_type"]') ) { + let inputField = await kcoIframe.$('[data-cid="am.customer_type"]'); + await inputField.click(); + await page.waitForTimeout(0.1 * timeOutTime); + if (customerTyoe === "person"){ + await kcoIframe.click('[data-cid="row person"]'); + await kcoIframe.waitForTimeout(1 * timeOutTime); + + } else if (customerTyoe === "company") { + await kcoIframe.click('[data-cid="row organization"]'); + await kcoIframe.waitForTimeout(1 * timeOutTime); + } + } +} + +const processKcoForm = async (page, kcoIframe, customerType) => { + if ( await kcoIframe.$("[data-cid='am.postal_code']") ) { + let inputField = await kcoIframe.$("[data-cid='am.postal_code']"); + await inputField.click({clickCount: 3}); + await inputField.type("67131"); + await kcoIframe.waitForTimeout(0.5 * timeOutTime); + } + + if (customerType === "company"){ + if ( await kcoIframe.$("[data-cid='am.organization_registration_id']") ) { + let inputField = await kcoIframe.$("[data-cid='am.organization_registration_id']"); + await inputField.click({clickCount: 3}); + await inputField.type("002031-0132"); + await kcoIframe.waitForTimeout(1 * timeOutTime); + } + } else { + if ( await kcoIframe.$("[data-cid='am.email']") ) { + let inputField = await kcoIframe.$("[data-cid='am.email']"); + await inputField.click({clickCount: 3}); + await inputField.type("e2e@krokedil.se"); + await kcoIframe.waitForTimeout(1 * timeOutTime); + } + } + + if ( await kcoIframe.$("[data-cid='am.continue_button']") ) { + await kcoIframe.click('[data-cid="am.continue_button"]'); + } + + await page.waitForTimeout(0.5 * timeOutTime); + + if (customerType === "company"){ + if ( await kcoIframe.$("[data-cid='am.email']") ) { + let inputField = await kcoIframe.$("[data-cid='am.email']"); + await inputField.click({clickCount: 3}); + await inputField.type("e2e@krokedil.se"); + } + + if ( await kcoIframe.$("[data-cid='am.organization_name']") ) { + let inputField = await kcoIframe.$("[data-cid='am.organization_name']"); + await inputField.click({clickCount: 3}); + await inputField.type("Krokedil"); + } + } + + if ( await kcoIframe.$("[data-cid='am.given_name']") ) { + let inputField = await kcoIframe.$("[data-cid='am.given_name']"); + await inputField.click({clickCount: 3}); + await inputField.type("Test"); + } + + if ( await kcoIframe.$("[data-cid='am.family_name']") ) { + let inputField = await kcoIframe.$("[data-cid='am.family_name']"); + await inputField.click({clickCount: 3}); + await inputField.type("Testsson"); + } + + if ( await kcoIframe.$("[data-cid='am.street_address']") ) { + let inputField = await kcoIframe.$("[data-cid='am.street_address']"); + await inputField.click({clickCount: 3}); + await inputField.type("Hamngatan 2"); + } + + if ( await kcoIframe.$("[data-cid='am.city']") ) { + let inputField = await kcoIframe.$("[data-cid='am.city']"); + await inputField.click({clickCount: 3}); + await inputField.type("Arvika"); + } + + if ( await kcoIframe.$("[data-cid='am.phone']") ) { + let inputField = await kcoIframe.$("[data-cid='am.phone']"); + await inputField.click({clickCount: 3}); + await inputField.type("0701234567"); + } + + if ( await kcoIframe.$("[data-cid='am.continue_button']") ) { + await kcoIframe.click('[data-cid="am.continue_button"]'); + } + + await page.waitForTimeout(3.5 * timeOutTime); +} + +const processShipping = async (page, kcoIframe, shippingMethod, shippingInIframe) => { + if ( shippingInIframe === "yes" ) { + let shippingSelection = await kcoIframe.$$( + '[data-cid="SHIPMO-shipping-option-basic"]' + ); + + if (shippingMethod === "flat_rate") { + await shippingSelection[0].click(); + } else if (shippingMethod === "free_shipping") { + await shippingSelection[1].click(); + } + } else { + let shippingMethodTarget = `[id*="_${shippingMethod}"]`; + + if (shippingMethod !== "") { + await page.waitForSelector(shippingMethodTarget).id; + await page.click(shippingMethodTarget).id; + await page.waitForTimeout(2 * timeOutTime); + } + } +} + +const completeOrder = async (page, kcoIframe) => { + if ( await kcoIframe.$("[data-cid='button.buy_button']") ) { + await kcoIframe.click('[data-cid="button.buy_button"]'); + } + + await page.waitForTimeout(4 * timeOutTime); + + const fullscreenIframe = await page.frames().find((frame) => frame.name() === "klarna-fullscreen-iframe"); + + // Check if we have a fullscreenIframe. We might not, since the above step might have already completed the order in some cases. + if( fullscreenIframe ) { + if ( await fullscreenIframe.$("[data-cid='payment-selector-method.invoice']") ) { + await fullscreenIframe.click('[data-cid="payment-selector-method.invoice"]'); + } + + await page.waitForTimeout(0.25 * timeOutTime); + + if ( await fullscreenIframe.$("[data-cid='button.buy_button']") ) { + await fullscreenIframe.click('[data-cid="button.buy_button"]'); + } + + await page.waitForTimeout(1 * timeOutTime); + + if ( await fullscreenIframe.$("[id='nin']") ) { + let inputField = await fullscreenIframe.$("[id='nin']"); + await inputField.click({clickCount: 3}); + await inputField.type("410321-9202"); + } + + await page.waitForTimeout(0.25 * timeOutTime); + + if ( await fullscreenIframe.$('[id="supplement_nin_dialog__footer-button-wrapper"]') ) { + await fullscreenIframe.click('[id="supplement_nin_dialog__footer-button-wrapper"]'); + } + } +} + +const getOrderData = async (thankyouIframe) => { + let selector = "[data-cid='payment-method.invoice"; + if( await thankyouIframe.$("[data-cid='payment-method.invoice']") ) { + selector = "[data-cid='payment-method.invoice']"; + } else if( await thankyouIframe.$("[data-cid='payment-method.b2b_invoice") ) { + selector = "[data-cid='payment-method.b2b_invoice']"; + } + + let data = await thankyouIframe.$eval(selector, (element) => { + let orderLineData = element.childNodes[0]; + let orderTotalData = element.childNodes[1]; + let orderLines = 0; + + for(let i = 0; i < orderLineData.childNodes.length; i++) { + if(orderLineData.childNodes[i].getElementsByTagName("p").length > 0 && orderLineData.childNodes[i].firstChild.innerHTML !== "Delivery") { + orderLines++ + } + } + + let orderTotal = parseFloat( orderTotalData.firstChild.querySelector("div").childNodes[1].innerHTML.replace(",", ".").replace(" kr", "") ); + return [orderLines, orderTotal]; + }); + + return data; +} + +export default { + setCustomerType, + processKcoForm, + processShipping, + completeOrder, + getOrderData, +} \ No newline at end of file diff --git a/tests/e2e/helpers/kcoCart.js b/tests/e2e/helpers/kcoCart.js deleted file mode 100644 index 88ce8f10..00000000 --- a/tests/e2e/helpers/kcoCart.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Adds one product to the cart. - * - * @param page - * @param productId - * @returns {Promise} - */ - -import kcoURLS from "./kcoURLS"; - -/** - * - * Adds single product to cart. - * - * @param page - * @param productId - */ -const addSingleProductToCart = async (page, productId) => { - const productSelector = productId; - - try { - await page.goto(`${kcoURLS.ADD_TO_CART}${productSelector}`); - await page.goto(kcoURLS.SHOP); - } catch { - // Proceed - } -}; - -/** - * Adds multiple products to the cart. - * - * @param page - * @param products - * @returns {Promise} - */ -const addMultipleProductsToCart = async (page, products, data) => { - const timer = products.length; - - await page.waitForTimeout(timer * 800); - let ids = []; - - products.forEach( name => { - data.products.simple.forEach(product => { - if(name === product.name) { - ids.push(product.id); - } - }); - - data.products.variable.forEach(product => { - product.attribute.options.forEach(variation => { - if(name === variation.name) { - ids.push(variation.id); - } - }); - }); - }); - - (async function addEachProduct() { - for (let i = 0; i < ids.length + 1; i += 1) { - await addSingleProductToCart(page, ids[i]); - } - })(); - - await page.waitForTimeout(timer * 800); -}; - -export default { - addSingleProductToCart, - addMultipleProductsToCart, -}; diff --git a/tests/e2e/helpers/kcoCompRes.js b/tests/e2e/helpers/kcoCompRes.js deleted file mode 100644 index 83374ed1..00000000 --- a/tests/e2e/helpers/kcoCompRes.js +++ /dev/null @@ -1,43 +0,0 @@ -export const klarnaValues = { - orderId: [], - firstName: "klarna", - lastName: "klarna", - company: "klarna", - currency: "klarna", - addressOne: "klarna", - addressTwo: "klarna", - city: "klarna", - region: "klarna", - postcode: "klarna", - country: "klarna", - email: "klarna", - sku: [], - totalAmount: [], - shippingMethod: [], - quantity: [], - phone: "klarna", - totalTax: [], - productName: [], -}; - -export const wooValues = { - orderId: [], - firstName: "woo", - lastName: "woo", - company: "woo", - currency: "woo", - addressOne: "woo", - addressTwo: "woo", - city: "woo", - region: "woo", - postcode: "woo", - country: "woo", - email: "woo", - sku: [], - totalAmount: [], - shippingMethod: [], - quantity: [], - phone: "woo", - totalTax: [], - productName: [], -}; diff --git a/tests/e2e/helpers/kcoFrame.js b/tests/e2e/helpers/kcoFrame.js deleted file mode 100644 index 91e81b2f..00000000 --- a/tests/e2e/helpers/kcoFrame.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * - * @param page - * @param name - * @returns {Promise<*|Frame>} - */ -const loadIFrame = async (page, name) => - page.frames().find((frame) => frame.name() === name); - -/** - * - * @param frame - * @param data - * @returns {Promise} - */ - -const submitBillingForm = async (frame, data, customerType) => { - const { - emailSelector, - email, - postalCodeSelector, - postalCode, - organizationIDSelector, - organizationID, - organizationNameSelector, - organizationName, - firstNameSelector, - firstName, - lastNameSelector, - lastName, - telephoneSelector, - telephone - - } = data; - - const emptyField = async (fieldName) => { - if (await frame.$(fieldName)){ - let inputField = await frame.$(fieldName); - await frame.waitForTimeout(200); - await inputField.click({clickCount: 3}); - await inputField.press("Backspace"); - await frame.waitForTimeout(200); - } - } - - // Fill out input field - const fillOutFrameField = async (fieldName, inputFieldFillIn) => { - if (await frame.$(fieldName)){ - let inputField = await frame.$(fieldName); - await frame.waitForTimeout(200); - await inputField.type(inputFieldFillIn); - await frame.waitForTimeout(200); - } - } - - // Fill out the form - const completeForm = async () => { - await emptyField(organizationIDSelector); - await emptyField(organizationNameSelector); - await emptyField(firstNameSelector); - await emptyField(lastNameSelector); - await emptyField(emailSelector); - await emptyField(telephoneSelector); - // ---------------------------------------------------------------- // - await fillOutFrameField(organizationIDSelector,organizationID ); - await fillOutFrameField(organizationNameSelector, organizationName); - await fillOutFrameField(firstNameSelector, firstName); - await fillOutFrameField(lastNameSelector, lastName); - await fillOutFrameField(emailSelector, email); - await fillOutFrameField(telephoneSelector, telephone); - } - - // Check for miniaturized frame - if( frame && await frame.$('[id="preview__link"]')) { - await frame.waitForTimeout(1000); - await frame.click('[id="preview__link"]'); - await frame.waitForTimeout(1000); - } - - // Fork from B2CB switches - if ( frame && await frame.$('[data-cid="am.customer_type"]')) { - - await frame.waitForTimeout(1000); - await frame.click('[data-cid="am.customer_type"]'); - await frame.waitForTimeout(1000); - - if (customerType === "person"){ - await frame.click('[data-cid="row person"]'); - await frame.waitForTimeout(1000); - await completeForm() - - } else if (customerType === "company") { - await frame.click('[data-cid="row organization"]'); - await frame.waitForTimeout(1000); - await completeForm() - } - - let postalCodeSelectorInput = await frame.$(postalCodeSelector); - - await postalCodeSelectorInput.click({clickCount: 3}); - await postalCodeSelectorInput.press('Backspace'); - await frame.type(postalCodeSelector, postalCode); - - await frame.click('[data-cid="am.continue_button"]'); - await frame.waitForTimeout(1000); - - if(frame && await frame.$('[data-cid="am.continue_button"]')){ - await completeForm() - await frame.click('[data-cid="am.continue_button"]'); - } - } -}; - -/** - * - * @param frame - * @param buttonSelector - * @returns {*} - */ -const createOrder = async (frame, buttonSelector) => { - await frame.waitForSelector(buttonSelector); - await frame.click(buttonSelector); -}; - -export default { - loadIFrame, - submitBillingForm, - createOrder, -}; diff --git a/tests/e2e/helpers/kcoTestRunner.js b/tests/e2e/helpers/kcoTestRunner.js deleted file mode 100644 index cc9b2507..00000000 --- a/tests/e2e/helpers/kcoTestRunner.js +++ /dev/null @@ -1,28 +0,0 @@ -const createWcCustomer = async () => { - try { - const customerResponse = await API.getWCCustomers(); - const { data } = customerResponse; - if (parseInt(data.length, 10) < 1) { - try { - await API.createWCCustomer(customerAPIData); - } catch (error) { - console.log(error); - } - } - } catch (error) { - console.log(error); - } -} - -const loginUser = async () => { - // Check for user logged in - if (isUserLoggedIn) { - // Login with User Credentials - await page.goto(kcoURLS.MY_ACCOUNT); - await user.login(userCredentials, { page }); - } -} - -export default { - createWcCustomer -} \ No newline at end of file diff --git a/tests/e2e/helpers/kcoUser.js b/tests/e2e/helpers/kcoUser.js deleted file mode 100644 index 7edf8b1e..00000000 --- a/tests/e2e/helpers/kcoUser.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * - * @param userCredentials - * @param options - * @returns {Promise} - */ -const login = async (userCredentials, options) => { - const { - username, - password, - selectorForName, - selectorForPass, - } = userCredentials; - const { page } = options; - - await page.type(selectorForName, username); - await page.type(selectorForPass, password); - await page.waitForSelector("button[name=login]"); - await page.click("button[name=login]"); -}; - -export default { - login, -}; diff --git a/tests/e2e/helpers/kcoUtils.js b/tests/e2e/helpers/kcoUtils.js deleted file mode 100644 index ec6133aa..00000000 --- a/tests/e2e/helpers/kcoUtils.js +++ /dev/null @@ -1,179 +0,0 @@ -import API from "../api/API"; -import { KCOSettingsArray } from "../config/config"; - -/** - * - * @param page - * @param selector - * @returns {Promise} - */ -const selectPayment = async (page, selector) => { - if (await page.$(selector)) { - await page.evaluate( - (paymentMethod) => paymentMethod.click(), - await page.$(selector) - ); - } -}; - -/** - * - * @param page - * @param selector - * @returns {Promise} - */ -const acceptTerms = async (page, selector) => { - await page.waitForSelector(selector); - await page.evaluate((cb) => cb.click(), await page.$(selector)); -}; - -/** - * Check for selector - continue if false - */ -const expectSelector = async (frame, page, selector, time) => { - try { - await page.waitForTimeout(2 * time); - await frame.click(selector); - } catch { - // Proceed - } -}; - -/** - * - * Check for input - continue if flase - * - * @param {*} frame - * @param {*} page - * @param {*} inputValue - * @param {*} selector - * @param {*} time - */ -const expectInput = async (frame, page, inputValue, selector, time) => { - try { - await page.waitForTimeout(2 * time); - await frame.type(selector, inputValue); - } catch { - // Proceed - } -}; - -/** - * Add coupons - * - * @param {*} page - * @param {*} isUserLoggedIn - * @param {*} appliedCoupons - */ -const addCouponsOnCheckout = async (page, isUserLoggedIn, appliedCoupons) => { - await page.waitForTimeout(1000); - - if (isUserLoggedIn) { - await page.$eval('[id="wpadminbar"]', (adminBar) => - adminBar.setAttribute("style", "display:none") - ); - } - - if (appliedCoupons.length > 0) { - await appliedCoupons.forEach(async (singleCoupon) => { - await page.waitForTimeout(1000); - await page.click('[class="showcoupon"]'); - await page.waitForTimeout(1000); - await page.type('[name="coupon_code"]', singleCoupon); - await page.waitForTimeout(1000); - await page.click('[name="apply_coupon"]'); - await page.waitForTimeout(1000); - }); - } -}; - -/** - * Select shipping method - * - * @param {*} page - * @param {*} frame - * @param {*} iframeShipping - * @param {*} shippingMethod - * @param {*} freeShippingMethodTarget - * @param {*} flatRateMethodTarget - * @param {*} timeOutTime - */ -const chooseKlarnaShippingMethod = async ( - page, - frame, - iframeShipping, - shippingMethod, - timeOutTime -) => { - let shippingMethodTarget; - - if (iframeShipping !== "yes") { - shippingMethodTarget = `[id*="_${shippingMethod}"]`; - - if (shippingMethod !== "") { - await page.waitForTimeout(timeOutTime); - await page.waitForSelector(shippingMethodTarget).id; - await page.waitForTimeout(timeOutTime); - await page.click(shippingMethodTarget).id; - await page.waitForTimeout(timeOutTime); - } - } else { - await page.waitForTimeout(timeOutTime); - const iframeShippingMethod = shippingMethod; - - const frameShippingTab = await frame.$$( - '[data-cid="SHIPMO-shipping-option-basic"]' - ); - - if (iframeShippingMethod === "flat_rate") { - await frameShippingTab[0].click(); - } else if (iframeShippingMethod === "free_shipping") { - await frameShippingTab[1].click(); - } - } -}; - -/** - * Select shipping method through KCO iFrame or standard WC checkout selection - */ -const toggleIFrame = async (toggleSwitch) => { - KCOSettingsArray.woocommerce_kco_settings.shipping_methods_in_iframe = toggleSwitch; - await API.updateOptions(KCOSettingsArray); -}; - -/** - * - * @param {*} mainArray - * @param {*} helperArray - */ -const createHelperArray = (mainArray, helperArray) => { - mainArray.forEach((element) => { - if (!helperArray.includes(element)) { - helperArray.push(element); - } - }); -}; - -/** - * - * @param value - * @returns {Promise} - */ -const wcPricesIncludeTax = async (value) => { - await API.pricesIncludeTax(value); -}; - -/** - * Export data - */ -export default { - acceptTerms, - selectPayment, - expectSelector, - expectInput, - addCouponsOnCheckout, - chooseKlarnaShippingMethod, - toggleIFrame, - createHelperArray, - wcPricesIncludeTax, -}; diff --git a/tests/e2e/helpers/kcoURLS.js b/tests/e2e/helpers/urls.js similarity index 100% rename from tests/e2e/helpers/kcoURLS.js rename to tests/e2e/helpers/urls.js diff --git a/tests/e2e/helpers/utils.js b/tests/e2e/helpers/utils.js new file mode 100644 index 00000000..2b4a2c3f --- /dev/null +++ b/tests/e2e/helpers/utils.js @@ -0,0 +1,135 @@ +import API from "../api/API"; +import urls from "./urls"; + +const timeOutTime = 1500; +const KCOSettingsArray = { + woocommerce_kco_settings: { + enabled: "yes", + title: "Klarna", + description: "Klarna Checkout for WooCommerce Test", + select_another_method_text: "", + testmode: "yes", + logging: "yes", + credentials_eu: "", + merchant_id_eu: "", + shared_secret_eu: "", + test_merchant_id_eu: process.env.API_KEY, + test_shared_secret_eu: process.env.API_SECRET, + credentials_us: "", + merchant_id_us: "", + shared_secret_us: "", + test_merchant_id_us: "", + test_shared_secret_us: "", + shipping_section: "", + allow_separate_shipping: "no", + shipping_methods_in_iframe: "yes", + shipping_details: "", + checkout_section: "", + send_product_urls: "yes", + dob_mandatory: "no", + display_privacy_policy_text: "no", + add_terms_and_conditions_checkbox: "no", + allowed_customer_types: "B2CB", + title_mandatory: "yes", + prefill_consent: "yes", + quantity_fields: "yes", + color_settings_title: "", + color_button: "", + color_button_text: "", + color_checkbox: "", + color_checkbox_checkmark: "", + color_header: "", + color_link: "", + radius_border: "", + add_to_email: "no", + }, +}; + +const login = async (page, username, password) => { + await page.type("#username", username); + await page.type("#password", password); + await page.waitForSelector("button[name=login]"); + await page.click("button[name=login]"); +}; + +const applyCoupons = async (page, appliedCoupons) => { + if (appliedCoupons.length > 0) { + await appliedCoupons.forEach(async (singleCoupon) => { + await page.click('[class="showcoupon"]'); + await page.waitForTimeout(500); + await page.type('[name="coupon_code"]', singleCoupon); + await page.click('[name="apply_coupon"]'); + }); + } + await page.waitForTimeout(3 * timeOutTime); +}; + +const addSingleProductToCart = async (page, productId) => { + const productSelector = productId; + + try { + await page.goto(`${urls.ADD_TO_CART}${productSelector}`); + await page.goto(urls.SHOP); + } catch { + // Proceed + } +}; + +const addMultipleProductsToCart = async (page, products, data) => { + const timer = products.length; + + await page.waitForTimeout(timer * 800); + let ids = []; + + products.forEach( name => { + data.products.simple.forEach(product => { + if(name === product.name) { + ids.push(product.id); + } + }); + + data.products.variable.forEach(product => { + product.attribute.options.forEach(variation => { + if(name === variation.name) { + ids.push(variation.id); + } + }); + }); + }); + + (async function addEachProduct() { + for (let i = 0; i < ids.length + 1; i += 1) { + await addSingleProductToCart(page, ids[i]); + } + })(); + + await page.waitForTimeout(timer * 800); +}; + +const setPricesIncludesTax = async (value) => { + await API.pricesIncludeTax(value); +}; + +const setIframeShipping = async (toggleSwitch) => { + KCOSettingsArray.woocommerce_kco_settings.shipping_methods_in_iframe = toggleSwitch; + await API.updateOptions(KCOSettingsArray); +}; + +const selectKco = async (page) => { + if (await page.$('input[id="payment_method_kco"]')) { + await page.evaluate( + (paymentMethod) => paymentMethod.click(), + await page.$('input[id="payment_method_kco"]') + ); + } +} + +export default { + login, + applyCoupons, + addSingleProductToCart, + addMultipleProductsToCart, + setPricesIncludesTax, + setIframeShipping, + selectKco, +}; diff --git a/tests/e2e/package.json b/tests/e2e/package.json index 875bfc0d..ece1582d 100644 --- a/tests/e2e/package.json +++ b/tests/e2e/package.json @@ -42,7 +42,7 @@ "docker:setup": "docker-compose run --rm wordpress-cli ./wp-content/plugins/klarna-checkout-for-woocommerce/tests/e2e/bin/setup.sh", "docker:import-data": "docker-compose run --rm wordpress-cli ./wp-content/plugins/klarna-checkout-for-woocommerce/tests/e2e/bin/import.sh", "docker:site-init": "npm run docker:setup && npm run docker:import-data", - "jettison": "jest --detectOpenHandles --forceExit", + "jettison": "jest --detectOpenHandles", "wp:install": "node ./cli/install.js", "e2e:test": "yarn docker:up && yarn wp:install && yarn jettison && yarn docker:down" }, diff --git a/tests/e2e/tests/kcoFlow.specasdasdasd.js b/tests/e2e/tests/kcoFlow.specasdasdasd.js deleted file mode 100644 index e7f0d82b..00000000 --- a/tests/e2e/tests/kcoFlow.specasdasdasd.js +++ /dev/null @@ -1,670 +0,0 @@ -import puppeteer from "puppeteer"; -import kcoURLS from "../helpers/kcoURLS"; -import user from "../helpers/kcoUser"; -import cart from "../helpers/kcoCart"; -import kcoFrame from "../helpers/kcoFrame"; -import kcoUtils from "../helpers/kcoUtils"; -import { wooValues, klarnaValues } from "../helpers/kcoCompRes"; - -import { - puppeteerOptions as options, - customerAPIData, - klarnaOrderEndpoint, - - /** - * General data - */ - billingData, - userCredentials, - timeOutTime, - cardNumber, - pinNumber, - - /** - * Shipping methods - */ - freeShippingMethod, - freeShippingMethodTarget, - flatRateMethod, - flatRateMethodTarget, - - /** - * Payment methods - */ - invoicePaymentMethod, - debitPaymentMethod, - creditPaymentMethod, - - /** - * Coupons - */ - couponFixedCart, - couponFixedProduct, - couponPercent, - couponTotalFreeShipping, - couponTotalWithShipping, - - /** - * Products - */ - outOfStock, - variable25, - downloadable0, - downloadable25, - downloadableShipping0, - downloadableShipping25, - simple12, - simple6, - virtual0, - virtual25, - virtualDownloadable0, - virtualDownloadable25, - manyCharacters, -} from "../config/config"; - -import API from "../api/API"; -import woocommerce from "../api/woocommerce"; - -// Main selectors -let page; -let browser; -let context; -const productCounterArray = []; - -/** - * TEST ELEMENTS SELECTORS - * Input variables that are to be applied for the test - */ - -// User logged-in (true) / Guest (false) -const isUserLoggedIn = true; - -// Products selection -const productsToCart = [downloadable0, simple12, virtualDownloadable25]; - -kcoUtils.createHelperArray(productsToCart, productCounterArray); - -// Shipping method selection -const shippingMethod = freeShippingMethod; - -// Private individual ("person") / Organization or Company ("company") -const customerType = "company"; - -// Payment method selection -const selectedPaymentMethod = invoicePaymentMethod; - -// Coupon selection -const appliedCoupons = [couponPercent]; - -// Shipping in KCO iFrame ("yes") / Standard WC ("no") -const iframeShipping = "yes"; - -// Tax Inclusive ( yes ) / Exclusive ( no ) -const inclusivePrice = "yes"; - -/*describe("KCO", () => { - beforeAll(async () => { - browser = await puppeteer.launch(options); - context = await browser.createIncognitoBrowserContext(); - page = await context.newPage(); - try { - const customerResponse = await API.getWCCustomers(); - const { data } = customerResponse; - if (parseInt(data.length, 10) < 1) { - try { - await API.createWCCustomer(customerAPIData); - console.log(await API.createWCCustomer(customerAPIData);) - } catch (error) { - console.log(error); - } - } - } catch (error) { - console.log(error); - } - - await kcoUtils.wcPricesIncludeTax({ - value: inclusivePrice, - }); - - // Check for user logged in - if (isUserLoggedIn) { - // Login with User Credentials - await page.goto(kcoURLS.MY_ACCOUNT); - await user.login(userCredentials, { page }); - } - console.log(process.env) - await kcoUtils.toggleIFrame(iframeShipping); - - await page.goto(kcoURLS.CHECKOUT, { waitUntil: "networkidle0" }); - }, 250000); - - // Close Chromium on test end (will close on both success and fail) - afterAll(() => { - if (!page.isClosed()) { - browser.close(); - // context.close(); - } - }, 900000);*/ - - /** - * Begin test suite - */ - /*test("second flow should be on the my account page", async () => { - // Add products to Cart - await page.waitForTimeout(timeOutTime); - await cart.addMultipleProductsToCart(page, productsToCart); - await page.waitForTimeout(timeOutTime); - - await page.goto(kcoURLS.CHECKOUT); - await page.waitForTimeout(timeOutTime); - - // Choose Klarna as payment method - if (await page.$('input[id="payment_method_kco"]')) { - await page.evaluate( - (paymentMethod) => paymentMethod.click(), - await page.$('input[id="payment_method_kco"]') - ); - } - - await page.waitForSelector('input[id="terms"]'); - await page.evaluate( - (cb) => cb.click(), - await page.$('input[id="terms"]') - ); - - await page.waitForTimeout(timeOutTime); - - const originalFrame = await kcoFrame.loadIFrame( - page, - "klarna-checkout-iframe" - ); - - await page.waitForTimeout(2 * timeOutTime); - - // Submit billing data - await kcoFrame.submitBillingForm( - originalFrame, - billingData, - customerType - ); - - // Apply coupons - await kcoUtils.addCouponsOnCheckout( - page, - isUserLoggedIn, - appliedCoupons - ); - - await kcoUtils.expectSelector( - originalFrame, - page, - '[data-cid="am.continue_button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - originalFrame, - page, - 'input[id="payment-selector-pay_now"]', - timeOutTime - ); - - // Check for Klarna iFrame shipping and implement shipping method - await kcoUtils.chooseKlarnaShippingMethod( - page, - originalFrame, - iframeShipping, - shippingMethod, - freeShippingMethodTarget, - flatRateMethodTarget, - timeOutTime - ); - - const frameNew = await kcoFrame.loadIFrame( - page, - "klarna-fullscreen-iframe" - ); - - await page.waitForTimeout(timeOutTime); - await kcoUtils.expectSelector( - originalFrame, - page, - '[data-cid="button.buy_button"]', - timeOutTime - ); - - if (selectedPaymentMethod === "credit") { - await kcoUtils.expectSelector( - frameNew, - page, - 'div[id*=".paynow_card."]', - timeOutTime - ); - - const frameCreditCard = await kcoFrame.loadIFrame( - page, - "pgw-iframe-paynow_card" - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - cardNumber, - 'input[id="cardNumber"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "1122", - 'input[id="expire"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "123", - 'input[id="securityCode"]', - 0.25 * timeOutTime - ); - } else if (selectedPaymentMethod === "debit") { - await kcoUtils.expectSelector( - frameNew, - page, - '[data-cid="payment-selector-method.direct_debit"]', - timeOutTime - ); - } else if (selectedPaymentMethod === "invoice") { - await kcoUtils.expectSelector( - frameNew, - page, - 'input[id*=".invoice."]', - timeOutTime - ); - } - - await kcoUtils.expectSelector( - frameNew, - page, - '[data-cid="button.buy_button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - 'button[data-cid="skip-favorite-dialog-confirm-button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[id="nin"]', - timeOutTime - ); - - await kcoUtils.expectInput( - frameNew, - page, - pinNumber, - '[id="nin"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[id="supplement_nin_dialog__footer-button-wrapper"]', - timeOutTime - ); - - await page.waitForTimeout(2 * timeOutTime); - await kcoUtils.expectSelector( - page - .frames() - .find((fr) => fr.name() === "klarna-fullscreen-iframe"), - page, - '[id="confirm_bank_account_dialog__footer-button-wrapper"]', - page, - '[id="confirm_bank_account_dialog__footer-button-wrapper"]', - timeOutTime - ); - - await page.waitForTimeout(2 * timeOutTime); - const currentURL = await page.url(); - const currentKCOId = currentURL.split("kco_order_id=")[1]; - const response = await API.getKlarnaOrderById( - page, - klarnaOrderEndpoint, - currentKCOId - ); - - const orderId = currentURL - .split("/") - .filter((urlPart) => /^\d+$/.test(urlPart))[0]; - - const wooCommerceOrder = await API.getWCOrderById(orderId); - - const klarnaOrderLinesContainer = []; - const wooOrderLinesContainer = []; - - response.data.order_lines.forEach((klarnaOrderLinesItemType) => { - if (klarnaOrderLinesItemType.type !== "shipping_fee") { - klarnaOrderLinesContainer.push(klarnaOrderLinesItemType); - } - }); - - wooCommerceOrder.data.line_items.forEach((wooOrderLinesItemType) => { - if (wooOrderLinesItemType.type !== "shipping_fee") { - wooOrderLinesContainer.push(wooOrderLinesItemType); - } - }); - - for (let i = 0; i < klarnaOrderLinesContainer.length; i += 1) { - if ( - klarnaOrderLinesContainer[i].reference === - wooOrderLinesContainer[i].sku - ) { - if ( - parseFloat(klarnaOrderLinesContainer[i].total_amount) === - parseInt( - Math.round( - (parseFloat(wooOrderLinesContainer[i].total) + - parseFloat( - wooOrderLinesContainer[i].total_tax - )) * - 100 - ).toFixed(2), - 10 - ) - ) { - klarnaValues.totalAmount.push( - klarnaOrderLinesContainer[i].total_amount - ); - wooValues.totalAmount.push( - parseInt( - Math.round( - (parseFloat(wooOrderLinesContainer[i].total) + - parseFloat( - wooOrderLinesContainer[i].total_tax - )) * - 100 - ).toFixed(2), - 10 - ) - ); - } - - if ( - klarnaOrderLinesContainer[i].quantity === - wooOrderLinesContainer[i].quantity - ) { - klarnaValues.quantity.push( - klarnaOrderLinesContainer[i].quantity - ); - wooValues.quantity.push(wooOrderLinesContainer[i].quantity); - } - - if ( - klarnaOrderLinesContainer[i].total_tax_amount === - wooOrderLinesContainer[i].total_tax * 100 - ) { - klarnaValues.totalTax.push( - klarnaOrderLinesContainer[i].total_tax_amount - ); - wooValues.totalTax.push( - wooOrderLinesContainer[i].total_tax * 100 - ); - } - - if ( - klarnaOrderLinesContainer[i].name === - wooOrderLinesContainer[i].name - ) { - klarnaValues.productName.push( - klarnaOrderLinesContainer[i].name - ); - wooValues.productName.push(wooOrderLinesContainer[i].name); - } - - if ( - klarnaOrderLinesContainer[i].reference === - wooOrderLinesContainer[i].sku - ) { - klarnaValues.sku.push( - klarnaOrderLinesContainer[i].reference - ); - wooValues.sku.push(wooOrderLinesContainer[i].sku); - } - } - } - - if (response.data.order_id === wooCommerceOrder.data.transaction_id) { - klarnaValues.orderId = response.data.order_id; - wooValues.orderId = wooCommerceOrder.data.transaction_id; - } - - if ( - response.data.shipping_address.given_name === - wooCommerceOrder.data.billing.first_name - ) { - klarnaValues.firstName = response.data.shipping_address.given_name; - wooValues.firstName = wooCommerceOrder.data.billing.first_name; - } - - if ( - response.data.shipping_address.family_name === - wooCommerceOrder.data.billing.last_name - ) { - klarnaValues.lastName = response.data.shipping_address.family_name; - wooValues.lastName = wooCommerceOrder.data.billing.last_name; - } - - // Case for B2CB individual - if (customerType === "person") { - if ( - response.data.shipping_address.title === - wooCommerceOrder.data.billing.company - ) { - klarnaValues.company = response.data.shipping_address.title; - wooValues.company = wooCommerceOrder.data.billing.company; - } - - // Case for B2CB for company - } else if (customerType === "company") { - if ( - response.data.shipping_address.organization_name === - wooCommerceOrder.data.billing.company - ) { - klarnaValues.company = - response.data.shipping_address.organization_name; - wooValues.company = wooCommerceOrder.data.billing.company; - } - } - - if ( - response.data.shipping_address.street_address === - wooCommerceOrder.data.billing.address_1 - ) { - klarnaValues.addressOne = - response.data.shipping_address.street_address; - wooValues.addressOne = wooCommerceOrder.data.billing.address_1; - } - - if ( - response.data.shipping_address.street_address2 === - wooCommerceOrder.data.billing.address_2 - ) { - klarnaValues.addressTwo = - response.data.shipping_address.street_address2; - wooValues.addressTwo = wooCommerceOrder.data.billing.address_2; - } - - if ( - response.data.shipping_address.city === - wooCommerceOrder.data.billing.city - ) { - klarnaValues.city = response.data.shipping_address.city; - wooValues.city = wooCommerceOrder.data.billing.city; - } - - if ( - response.data.shipping_address.region === - wooCommerceOrder.data.billing.state - ) { - klarnaValues.region = response.data.shipping_address.region; - wooValues.region = wooCommerceOrder.data.billing.state; - } - - if ( - response.data.shipping_address.postal_code.replace(/\s/g, "") === - wooCommerceOrder.data.billing.postcode - ) { - klarnaValues.postcode = - response.data.shipping_address.postal_code.replace(/\s/g, ""); - wooValues.postcode = wooCommerceOrder.data.billing.postcode; - } - - if ( - response.data.shipping_address.country === - wooCommerceOrder.data.billing.country - ) { - klarnaValues.country = response.data.shipping_address.country; - wooValues.country = wooCommerceOrder.data.billing.country; - } - - if ( - response.data.shipping_address.email === - wooCommerceOrder.data.billing.email - ) { - klarnaValues.email = response.data.shipping_address.email; - wooValues.email = wooCommerceOrder.data.billing.email; - } - - if ( - response.data.shipping_address.phone === - wooCommerceOrder.data.billing.phone.replace(/\s/g, "") - ) { - klarnaValues.phone = response.data.shipping_address.phone; - wooValues.phone = wooCommerceOrder.data.billing.phone.replace( - /\s/g, - "" - ); - } - - if ( - response.data.purchase_currency === wooCommerceOrder.data.currency - ) { - klarnaValues.currency = response.data.purchase_currency; - wooValues.currency = wooCommerceOrder.data.currency; - } - - if ( - response.data.order_lines[productCounterArray.length].name === - wooCommerceOrder.data.shipping_lines[0].method_title - ) { - klarnaValues.shippingMethod = - response.data.order_lines[productCounterArray.length].name; - wooValues.shippingMethod = - wooCommerceOrder.data.shipping_lines[0].method_title; - } - - await page.waitForTimeout(timeOutTime); - const value = await page.$eval(".entry-title", (e) => e.textContent); - expect(value).toBe("Order received"); - }, 190000);*/ - - /** - * Compare expected and received values - */ - /*test("Compare IDs", async () => { - expect(toString(klarnaValues.orderId)).toBe( - toString(wooValues.orderId) - ); - }, 190000); - - test("Compare names", async () => { - expect(klarnaValues.firstName).toBe(wooValues.firstName); - }, 190000); - - test("Compare last names", async () => { - expect(klarnaValues.lastName).toBe(wooValues.lastName); - }, 190000); - - test("Compare cities", async () => { - expect(klarnaValues.city).toBe(wooValues.city); - }, 190000); - - test("Compare regions", async () => { - expect(klarnaValues.region).toBe(wooValues.region); - }, 190000); - - test("Compare countries", async () => { - expect(klarnaValues.country).toBe(wooValues.country); - }, 190000); - - test("Compare post codes", async () => { - expect(klarnaValues.postcode).toBe(wooValues.postcode); - }, 190000); - - test("Compare companies", async () => { - expect(klarnaValues.company).toBe(wooValues.company); - }, 190000); - - test("Compare first address", async () => { - expect(klarnaValues.addressOne).toBe(wooValues.addressOne); - }, 190000); - - test("Compare second address", async () => { - expect(klarnaValues.addressTwo).toBe(wooValues.addressTwo); - }, 190000); - - test("Compare emails", async () => { - expect(klarnaValues.email).toBe(wooValues.email); - }, 190000); - - test("Compare telephones", async () => { - expect(klarnaValues.phone).toBe(wooValues.phone); - }, 190000); - - test("Compare SKU-s", async () => { - expect(toString(klarnaValues.sku)).toBe(toString(wooValues.sku)); - }, 190000); - - test("Compare total amounts", async () => { - expect(toString(klarnaValues.totalAmount)).toBe( - toString(wooValues.totalAmount) - ); - }, 190000); - - test("Compare total taxes", async () => { - expect(toString(klarnaValues.totalTax)).toBe( - toString(wooValues.totalTax) - ); - }, 190000); - - test("Compare product names", async () => { - expect(toString(klarnaValues.productName)).toBe( - toString(wooValues.productName) - ); - }, 190000); - - test("Compare Shipping methods", async () => { - expect(toString(klarnaValues.shippingMethod)).toBe( - toString(wooValues.shippingMethod) - ); - }, 190000); - - test("Compare Quantities", async () => { - expect(toString(klarnaValues.quantity)).toBe( - toString(wooValues.quantity) - ); - }, 190000); - - test("Compare currencies", async () => { - expect(klarnaValues.currency).toBe(wooValues.currency); - }, 190000); -});*/ diff --git a/tests/e2e/tests/kcoTest.spec.js b/tests/e2e/tests/kcoTest.spec.js index 947d6683..37fc0588 100644 --- a/tests/e2e/tests/kcoTest.spec.js +++ b/tests/e2e/tests/kcoTest.spec.js @@ -1,27 +1,27 @@ import puppeteer from "puppeteer"; -import kcoURLS from "../helpers/kcoURLS"; -import user from "../helpers/kcoUser"; -import cart from "../helpers/kcoCart"; -import kcoFrame from "../helpers/kcoFrame"; -import kcoUtils from "../helpers/kcoUtils"; -import { wooValues, klarnaValues } from "../helpers/kcoCompRes"; - -import { - puppeteerOptions as options, - userCredentials, - billingData, -} from "../config/config"; - -import tests from "../config/tests.json" -import setup from "../api/setup"; import API from "../api/API"; +import setup from "../api/setup"; +import urls from "../helpers/urls"; +import utils from "../helpers/utils"; +import iframeHandler from "../helpers/iframeHandler"; +import tests from "../config/tests.json" import data from "../config/data.json"; +const options = { + "headless": false, + "defaultViewport": null, + "args": [ + "--disable-infobars", + "--disable-web-security", + "--disable-features=IsolateOrigins,site-per-process" + ] +}; + // Main selectors let page; let browser; let context; -let timeOutTime = 5000; +let timeOutTime = 1500; let json = data; describe("KCO E2E tests", () => { @@ -42,7 +42,6 @@ describe("KCO E2E tests", () => { afterEach(async () => { if (!page.isClosed()) { browser.close(); - // context.close(); } API.clearWCSession(); }), @@ -50,622 +49,60 @@ describe("KCO E2E tests", () => { test.each(tests)( "$name", async (args) => { - if(args.loggedIn) { - await page.goto(kcoURLS.MY_ACCOUNT); - await user.login(userCredentials, { page }); - } - - await kcoUtils.wcPricesIncludeTax({value: args.inclusiveTax}); - await kcoUtils.toggleIFrame(args.shippingInIframe); - - await cart.addMultipleProductsToCart(page, args.products, json); - - await page.waitForTimeout(timeOutTime); + try { + // --------------- GUEST/LOGGED IN --------------- // + if(args.loggedIn) { + await page.goto(urls.MY_ACCOUNT); + await utils.login(page, "admin", "password"); + } - await page.goto(kcoURLS.CHECKOUT); - await page.waitForTimeout(timeOutTime); + // --------------- SETTINGS --------------- // + await utils.setPricesIncludesTax({value: args.inclusiveTax}); + await utils.setIframeShipping(args.shippingInIframe); - // Choose Klarna as payment method - if (await page.$('input[id="payment_method_kco"]')) { - await page.evaluate( - (paymentMethod) => paymentMethod.click(), - await page.$('input[id="payment_method_kco"]') - ); - } + // --------------- ADD PRODUCTS TO CART --------------- // + await utils.addMultipleProductsToCart(page, args.products, json); - await page.waitForTimeout(2 * timeOutTime); + // --------------- GO TO CHECKOUT --------------- // + await page.goto(urls.CHECKOUT); + await page.waitForTimeout(timeOutTime); + await utils.selectKco(page); + await page.waitForTimeout(4 * timeOutTime); - const originalFrame = await kcoFrame.loadIFrame( - page, - "klarna-checkout-iframe" - ); + // --------------- COUPON HANDLER --------------- // + await utils.applyCoupons(page, args.coupons); - // Submit billing data - await kcoFrame.submitBillingForm( - originalFrame, - billingData, - args.customerType - ); + // --------------- START OF IFRAME --------------- // + const kcoIframe = await page.frames().find((frame) => frame.name() === "klarna-checkout-iframe"); - // Apply coupons - if( args.coupons.length > 0 ) { - await kcoUtils.addCouponsOnCheckout( - page, - args.loggedIn, - args.coupons - ); - } + // --------------- B2B/B2C SELECTOR --------------- // + await iframeHandler.setCustomerType(page, kcoIframe, args.customerType); - await kcoUtils.expectSelector( - originalFrame, - page, - '[data-cid="am.continue_button"]', - timeOutTime - ); + // --------------- FORM SUBMISSION --------------- // + await iframeHandler.processKcoForm(page, kcoIframe, args.customerType); - await kcoUtils.expectSelector( - originalFrame, - page, - 'input[id="payment-selector-pay_now"]', - timeOutTime - ); + // --------------- SHIPPING HANDLER --------------- // + await iframeHandler.processShipping(page, kcoIframe, args.shippingMethod, args.shippingInIframe) + + // --------------- COMPLETE ORDER --------------- // + await iframeHandler.completeOrder(page, kcoIframe); - // Check for Klarna iFrame shipping and implement shipping method - if( args.shippingMethod !== "" ) { - await kcoUtils.chooseKlarnaShippingMethod( - page, - originalFrame, - args.shippingInIframe, - args.shippingMethod, - timeOutTime - ); + } catch(e) { + console.log("Error placing order", e) } - const frameNew = await kcoFrame.loadIFrame( - page, - "klarna-fullscreen-iframe" - ); - - await page.waitForTimeout(timeOutTime); - await kcoUtils.expectSelector( - originalFrame, - page, - '[data-cid="button.buy_button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - 'div[id*=".paynow_card."]', - timeOutTime - ); - - const frameCreditCard = await kcoFrame.loadIFrame( - page, - "pgw-iframe-paynow_card" - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "4111111111111111", - 'input[id="cardNumber"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "1122", - 'input[id="expire"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "123", - 'input[id="securityCode"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[data-cid="button.buy_button"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - 'button[data-cid="skip-favorite-dialog-confirm-button"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[id="nin"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameNew, - page, - "410321-9202", - '[id="nin"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[id="supplement_nin_dialog__footer-button-wrapper"]', - 0.25 * timeOutTime - ); - - await page.waitForTimeout(2 * timeOutTime); - await kcoUtils.expectSelector( - page - .frames() - .find((fr) => fr.name() === "klarna-fullscreen-iframe"), - page, - '[id="confirm_bank_account_dialog__footer-button-wrapper"]', - page, - '[id="confirm_bank_account_dialog__footer-button-wrapper"]', - timeOutTime - ); - - /* TMP COMMENTS - await page.waitForTimeout(2 * timeOutTime); - const currentURL = await page.url(); - const currentKCOId = currentURL.split("kco_order_id=")[1]; - const response = await API.getKlarnaOrderById( - page, - klarnaOrderEndpoint, - currentKCOId - ); - const orderId = currentURL - .split("/") - .filter((urlPart) => /^\d+$/.test(urlPart))[0]; - */ + // --------------- POST PURCHASE CHECKS --------------- // - await page.waitForTimeout(timeOutTime); + await page.waitForTimeout(8 * timeOutTime); const value = await page.$eval(".entry-title", (e) => e.textContent); expect(value).toBe("Order received"); - } - ) - - /** - * Begin test suite - */ - /*test("Test", async () => { - // Add products to Cart - await page.waitForTimeout(timeOutTime); - await cart.addMultipleProductsToCart(page, productsToCart); - await page.waitForTimeout(timeOutTime); - - await page.goto(kcoURLS.CHECKOUT); - await page.waitForTimeout(timeOutTime); - - // Choose Klarna as payment method - if (await page.$('input[id="payment_method_kco"]')) { - await page.evaluate( - (paymentMethod) => paymentMethod.click(), - await page.$('input[id="payment_method_kco"]') - ); - } - - await page.waitForSelector('input[id="terms"]'); - await page.evaluate( - (cb) => cb.click(), - await page.$('input[id="terms"]') - ); - - await page.waitForTimeout(timeOutTime); - - const originalFrame = await kcoFrame.loadIFrame( - page, - "klarna-checkout-iframe" - ); - - await page.waitForTimeout(2 * timeOutTime); - - // Submit billing data - await kcoFrame.submitBillingForm( - originalFrame, - billingData, - customerType - ); - - // Apply coupons - await kcoUtils.addCouponsOnCheckout( - page, - isUserLoggedIn, - appliedCoupons - ); - - await kcoUtils.expectSelector( - originalFrame, - page, - '[data-cid="am.continue_button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - originalFrame, - page, - 'input[id="payment-selector-pay_now"]', - timeOutTime - ); - - // Check for Klarna iFrame shipping and implement shipping method - await kcoUtils.chooseKlarnaShippingMethod( - page, - originalFrame, - iframeShipping, - shippingMethod, - freeShippingMethodTarget, - flatRateMethodTarget, - timeOutTime - ); - - const frameNew = await kcoFrame.loadIFrame( - page, - "klarna-fullscreen-iframe" - ); - - await page.waitForTimeout(timeOutTime); - await kcoUtils.expectSelector( - originalFrame, - page, - '[data-cid="button.buy_button"]', - timeOutTime - ); - - if (selectedPaymentMethod === "credit") { - await kcoUtils.expectSelector( - frameNew, - page, - 'div[id*=".paynow_card."]', - timeOutTime - ); - - const frameCreditCard = await kcoFrame.loadIFrame( - page, - "pgw-iframe-paynow_card" - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - cardNumber, - 'input[id="cardNumber"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "1122", - 'input[id="expire"]', - 0.25 * timeOutTime - ); - - await kcoUtils.expectInput( - frameCreditCard, - page, - "123", - 'input[id="securityCode"]', - 0.25 * timeOutTime - ); - } else if (selectedPaymentMethod === "debit") { - await kcoUtils.expectSelector( - frameNew, - page, - '[data-cid="payment-selector-method.direct_debit"]', - timeOutTime - ); - } else if (selectedPaymentMethod === "invoice") { - await kcoUtils.expectSelector( - frameNew, - page, - 'input[id*=".invoice."]', - timeOutTime - ); - } - - await kcoUtils.expectSelector( - frameNew, - page, - '[data-cid="button.buy_button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - 'button[data-cid="skip-favorite-dialog-confirm-button"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[id="nin"]', - timeOutTime - ); - - await kcoUtils.expectInput( - frameNew, - page, - pinNumber, - '[id="nin"]', - timeOutTime - ); - - await kcoUtils.expectSelector( - frameNew, - page, - '[id="supplement_nin_dialog__footer-button-wrapper"]', - timeOutTime - ); - - await page.waitForTimeout(2 * timeOutTime); - await kcoUtils.expectSelector( - page - .frames() - .find((fr) => fr.name() === "klarna-fullscreen-iframe"), - page, - '[id="confirm_bank_account_dialog__footer-button-wrapper"]', - page, - '[id="confirm_bank_account_dialog__footer-button-wrapper"]', - timeOutTime - ); - - await page.waitForTimeout(2 * timeOutTime); - const currentURL = await page.url(); - const currentKCOId = currentURL.split("kco_order_id=")[1]; - const response = await API.getKlarnaOrderById( - page, - klarnaOrderEndpoint, - currentKCOId - ); - - const orderId = currentURL - .split("/") - .filter((urlPart) => /^\d+$/.test(urlPart))[0]; - - const wooCommerceOrder = await API.getWCOrderById(orderId); - - const klarnaOrderLinesContainer = []; - const wooOrderLinesContainer = []; - - response.data.order_lines.forEach((klarnaOrderLinesItemType) => { - if (klarnaOrderLinesItemType.type !== "shipping_fee") { - klarnaOrderLinesContainer.push(klarnaOrderLinesItemType); - } - }); - - wooCommerceOrder.data.line_items.forEach((wooOrderLinesItemType) => { - if (wooOrderLinesItemType.type !== "shipping_fee") { - wooOrderLinesContainer.push(wooOrderLinesItemType); - } - }); - - for (let i = 0; i < klarnaOrderLinesContainer.length; i += 1) { - if ( - klarnaOrderLinesContainer[i].reference === - wooOrderLinesContainer[i].sku - ) { - if ( - parseFloat(klarnaOrderLinesContainer[i].total_amount) === - parseInt( - Math.round( - (parseFloat(wooOrderLinesContainer[i].total) + - parseFloat( - wooOrderLinesContainer[i].total_tax - )) * - 100 - ).toFixed(2), - 10 - ) - ) { - klarnaValues.totalAmount.push( - klarnaOrderLinesContainer[i].total_amount - ); - wooValues.totalAmount.push( - parseInt( - Math.round( - (parseFloat(wooOrderLinesContainer[i].total) + - parseFloat( - wooOrderLinesContainer[i].total_tax - )) * - 100 - ).toFixed(2), - 10 - ) - ); - } - - if ( - klarnaOrderLinesContainer[i].quantity === - wooOrderLinesContainer[i].quantity - ) { - klarnaValues.quantity.push( - klarnaOrderLinesContainer[i].quantity - ); - wooValues.quantity.push(wooOrderLinesContainer[i].quantity); - } - - if ( - klarnaOrderLinesContainer[i].total_tax_amount === - wooOrderLinesContainer[i].total_tax * 100 - ) { - klarnaValues.totalTax.push( - klarnaOrderLinesContainer[i].total_tax_amount - ); - wooValues.totalTax.push( - wooOrderLinesContainer[i].total_tax * 100 - ); - } - - if ( - klarnaOrderLinesContainer[i].name === - wooOrderLinesContainer[i].name - ) { - klarnaValues.productName.push( - klarnaOrderLinesContainer[i].name - ); - wooValues.productName.push(wooOrderLinesContainer[i].name); - } - - if ( - klarnaOrderLinesContainer[i].reference === - wooOrderLinesContainer[i].sku - ) { - klarnaValues.sku.push( - klarnaOrderLinesContainer[i].reference - ); - wooValues.sku.push(wooOrderLinesContainer[i].sku); - } - } - } - - if (response.data.order_id === wooCommerceOrder.data.transaction_id) { - klarnaValues.orderId = response.data.order_id; - wooValues.orderId = wooCommerceOrder.data.transaction_id; - } - - if ( - response.data.shipping_address.given_name === - wooCommerceOrder.data.billing.first_name - ) { - klarnaValues.firstName = response.data.shipping_address.given_name; - wooValues.firstName = wooCommerceOrder.data.billing.first_name; - } - - if ( - response.data.shipping_address.family_name === - wooCommerceOrder.data.billing.last_name - ) { - klarnaValues.lastName = response.data.shipping_address.family_name; - wooValues.lastName = wooCommerceOrder.data.billing.last_name; - } - - // Case for B2CB individual - if (customerType === "person") { - if ( - response.data.shipping_address.title === - wooCommerceOrder.data.billing.company - ) { - klarnaValues.company = response.data.shipping_address.title; - wooValues.company = wooCommerceOrder.data.billing.company; - } - - // Case for B2CB for company - } else if (customerType === "company") { - if ( - response.data.shipping_address.organization_name === - wooCommerceOrder.data.billing.company - ) { - klarnaValues.company = - response.data.shipping_address.organization_name; - wooValues.company = wooCommerceOrder.data.billing.company; - } - } - - if ( - response.data.shipping_address.street_address === - wooCommerceOrder.data.billing.address_1 - ) { - klarnaValues.addressOne = - response.data.shipping_address.street_address; - wooValues.addressOne = wooCommerceOrder.data.billing.address_1; - } - - if ( - response.data.shipping_address.street_address2 === - wooCommerceOrder.data.billing.address_2 - ) { - klarnaValues.addressTwo = - response.data.shipping_address.street_address2; - wooValues.addressTwo = wooCommerceOrder.data.billing.address_2; - } - - if ( - response.data.shipping_address.city === - wooCommerceOrder.data.billing.city - ) { - klarnaValues.city = response.data.shipping_address.city; - wooValues.city = wooCommerceOrder.data.billing.city; - } - - if ( - response.data.shipping_address.region === - wooCommerceOrder.data.billing.state - ) { - klarnaValues.region = response.data.shipping_address.region; - wooValues.region = wooCommerceOrder.data.billing.state; - } - - if ( - response.data.shipping_address.postal_code.replace(/\s/g, "") === - wooCommerceOrder.data.billing.postcode - ) { - klarnaValues.postcode = - response.data.shipping_address.postal_code.replace(/\s/g, ""); - wooValues.postcode = wooCommerceOrder.data.billing.postcode; - } - - if ( - response.data.shipping_address.country === - wooCommerceOrder.data.billing.country - ) { - klarnaValues.country = response.data.shipping_address.country; - wooValues.country = wooCommerceOrder.data.billing.country; - } - - if ( - response.data.shipping_address.email === - wooCommerceOrder.data.billing.email - ) { - klarnaValues.email = response.data.shipping_address.email; - wooValues.email = wooCommerceOrder.data.billing.email; - } - - if ( - response.data.shipping_address.phone === - wooCommerceOrder.data.billing.phone.replace(/\s/g, "") - ) { - klarnaValues.phone = response.data.shipping_address.phone; - wooValues.phone = wooCommerceOrder.data.billing.phone.replace( - /\s/g, - "" - ); - } - - if ( - response.data.purchase_currency === wooCommerceOrder.data.currency - ) { - klarnaValues.currency = response.data.purchase_currency; - wooValues.currency = wooCommerceOrder.data.currency; - } - - if ( - response.data.order_lines[productCounterArray.length].name === - wooCommerceOrder.data.shipping_lines[0].method_title - ) { - klarnaValues.shippingMethod = - response.data.order_lines[productCounterArray.length].name; - wooValues.shippingMethod = - wooCommerceOrder.data.shipping_lines[0].method_title; - } - await page.waitForTimeout(timeOutTime); - const value = await page.$eval(".entry-title", (e) => e.textContent); - expect(value).toBe("Order received"); - }, 190000);*/ + // Get the thankyou page iframe and run checks. + const thankyouIframe = await page.frames().find((frame) => frame.name() === "klarna-checkout-iframe"); + await thankyouIframe.click("[id='section-order-details__link']"); + await page.waitForTimeout(1 * timeOutTime); + const kcoOrderData = await iframeHandler.getOrderData(thankyouIframe); + expect(kcoOrderData[0]).toBe(args.expectedOrderLines); + expect(kcoOrderData[1]).toBe(args.expectedTotal); + }, 190000); }); diff --git a/tests/e2e/yarn.lock b/tests/e2e/yarn.lock index 0a7d7ea4..10686b57 100644 --- a/tests/e2e/yarn.lock +++ b/tests/e2e/yarn.lock @@ -1478,6 +1478,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/debug@^4.0.0": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + "@types/graceful-fs@^4.1.2": version "4.1.4" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.4.tgz#4ff9f641a7c6d1a3508ff88bc3141b152772e753" @@ -1514,6 +1521,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/node@*": version "14.14.14" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae" @@ -1760,6 +1772,14 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +axios-debug-log@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/axios-debug-log/-/axios-debug-log-0.8.4.tgz#2f311d70bbe36725562b1bb9c86e202ac3cd26fe" + integrity sha512-DvmaJiYusndhfAjQ94HqlvhaVoEjOetwo9cpb+OVtOZNZTqdz0VAVed3ZjSQKpyM1g8jDXUXFx0Pg1DhUZzAdw== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + axios@^0.21.1: version "0.21.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" @@ -2341,6 +2361,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.0.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + decimal.js@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" From 1f55f74af6f951d2f63c09f335a019c8c174e28a Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 08:55:56 +0200 Subject: [PATCH 07/23] Cleanup of sql file and increase timeouts --- tests/e2e/bin/data.sql | 224 ----------------------------- tests/e2e/helpers/iframeHandler.js | 2 +- tests/e2e/helpers/utils.js | 2 +- tests/e2e/tests/kcoTest.spec.js | 5 +- 4 files changed, 5 insertions(+), 228 deletions(-) diff --git a/tests/e2e/bin/data.sql b/tests/e2e/bin/data.sql index 7d6296da..d1821ba3 100644 --- a/tests/e2e/bin/data.sql +++ b/tests/e2e/bin/data.sql @@ -1,227 +1,3 @@ -#http://localhost:8000# ************************************************************ -# Sequel Pro SQL dump -# Version 4541 -# -# http://www.sequelpro.com/ -# https://github.com/sequelpro/sequelpro -# -# Host: 192.168.95.100 (MySQL 5.6.34) -# Database: local -# Generation Time: 2021-06-03 12:21:08 +0000 -# ************************************************************ - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - - -# Dump of table wp_actionscheduler_actions -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_actionscheduler_actions`; - -CREATE TABLE `wp_actionscheduler_actions` ( - `action_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `hook` varchar(191) COLLATE utf8mb4_unicode_520_ci NOT NULL, - `status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL, - `scheduled_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `scheduled_date_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `args` varchar(191) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, - `schedule` longtext COLLATE utf8mb4_unicode_520_ci, - `group_id` bigint(20) unsigned NOT NULL DEFAULT '0', - `attempts` int(11) NOT NULL DEFAULT '0', - `last_attempt_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `last_attempt_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `claim_id` bigint(20) unsigned NOT NULL DEFAULT '0', - `extended_args` varchar(8000) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, - PRIMARY KEY (`action_id`), - KEY `hook` (`hook`), - KEY `status` (`status`), - KEY `scheduled_date_gmt` (`scheduled_date_gmt`), - KEY `args` (`args`), - KEY `group_id` (`group_id`), - KEY `last_attempt_gmt` (`last_attempt_gmt`), - KEY `claim_id` (`claim_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - -LOCK TABLES `wp_actionscheduler_actions` WRITE; -/*!40000 ALTER TABLE `wp_actionscheduler_actions` DISABLE KEYS */; - -INSERT INTO `wp_actionscheduler_actions` (`action_id`, `hook`, `status`, `scheduled_date_gmt`, `scheduled_date_local`, `args`, `schedule`, `group_id`, `attempts`, `last_attempt_gmt`, `last_attempt_local`, `claim_id`, `extended_args`) -VALUES -(16,'action_scheduler/migration_hook','complete','2021-05-19 10:29:56','2021-05-19 10:29:56','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621420196;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621420196;}',1,1,'2021-05-19 10:30:06','2021-05-19 10:30:06',0,NULL), -(17,'woocommerce_update_marketplace_suggestions','complete','2021-05-19 10:29:33','2021-05-19 10:29:33','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621420173;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621420173;}',0,1,'2021-05-19 10:30:06','2021-05-19 10:30:06',0,NULL), -(18,'action_scheduler/migration_hook','complete','2021-05-19 12:48:49','2021-05-19 12:48:49','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621428529;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621428529;}',1,1,'2021-05-19 12:49:30','2021-05-19 12:49:30',0,NULL), -(19,'action_scheduler/migration_hook','complete','2021-05-19 12:58:11','2021-05-19 12:58:11','[]','O:30:\"ActionScheduler_SimpleSchedule\":2:{s:22:\"\0*\0scheduled_timestamp\";i:1621429091;s:41:\"\0ActionScheduler_SimpleSchedule\0timestamp\";i:1621429091;}',1,1,'2021-05-19 12:58:51','2021-05-19 12:58:51',0,NULL); - -/*!40000 ALTER TABLE `wp_actionscheduler_actions` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table wp_actionscheduler_claims -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_actionscheduler_claims`; - -CREATE TABLE `wp_actionscheduler_claims` ( - `claim_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `date_created_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - PRIMARY KEY (`claim_id`), - KEY `date_created_gmt` (`date_created_gmt`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - - - -# Dump of table wp_actionscheduler_groups -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_actionscheduler_groups`; - -CREATE TABLE `wp_actionscheduler_groups` ( - `group_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `slug` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, - PRIMARY KEY (`group_id`), - KEY `slug` (`slug`(191)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - -LOCK TABLES `wp_actionscheduler_groups` WRITE; -/*!40000 ALTER TABLE `wp_actionscheduler_groups` DISABLE KEYS */; - -INSERT INTO `wp_actionscheduler_groups` (`group_id`, `slug`) -VALUES -(1,'action-scheduler-migration'), -(2,'wc-admin-data'); - -/*!40000 ALTER TABLE `wp_actionscheduler_groups` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table wp_actionscheduler_logs -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_actionscheduler_logs`; - -CREATE TABLE `wp_actionscheduler_logs` ( - `log_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `action_id` bigint(20) unsigned NOT NULL, - `message` text COLLATE utf8mb4_unicode_520_ci NOT NULL, - `log_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `log_date_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - PRIMARY KEY (`log_id`), - KEY `action_id` (`action_id`), - KEY `log_date_gmt` (`log_date_gmt`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - -LOCK TABLES `wp_actionscheduler_logs` WRITE; -/*!40000 ALTER TABLE `wp_actionscheduler_logs` DISABLE KEYS */; - -INSERT INTO `wp_actionscheduler_logs` (`log_id`, `action_id`, `message`, `log_date_gmt`, `log_date_local`) -VALUES -(31,16,'action created','2021-05-19 10:28:56','2021-05-19 10:28:56'), -(32,17,'action created','2021-05-19 10:29:33','2021-05-19 10:29:33'), -(33,16,'action started via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), -(34,16,'action complete via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), -(35,17,'action started via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), -(36,17,'action complete via WP Cron','2021-05-19 10:30:06','2021-05-19 10:30:06'), -(37,18,'action created','2021-05-19 12:47:49','2021-05-19 12:47:49'), -(38,18,'action started via Async Request','2021-05-19 12:49:30','2021-05-19 12:49:30'), -(39,18,'action complete via Async Request','2021-05-19 12:49:30','2021-05-19 12:49:30'), -(40,19,'action created','2021-05-19 12:57:11','2021-05-19 12:57:11'), -(41,19,'action started via WP Cron','2021-05-19 12:58:51','2021-05-19 12:58:51'), -(42,19,'action complete via WP Cron','2021-05-19 12:58:51','2021-05-19 12:58:51'); - -/*!40000 ALTER TABLE `wp_actionscheduler_logs` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table wp_commentmeta -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_commentmeta`; - -CREATE TABLE `wp_commentmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0', - `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_520_ci, - PRIMARY KEY (`meta_id`), - KEY `comment_id` (`comment_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - - - -# Dump of table wp_comments -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_comments`; - -CREATE TABLE `wp_comments` ( - `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', - `comment_author` tinytext COLLATE utf8mb4_unicode_520_ci NOT NULL, - `comment_author_email` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `comment_author_url` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `comment_author_IP` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `comment_content` text COLLATE utf8mb4_unicode_520_ci NOT NULL, - `comment_karma` int(11) NOT NULL DEFAULT '0', - `comment_approved` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '1', - `comment_agent` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `comment_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'comment', - `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', - `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`comment_ID`), - KEY `comment_post_ID` (`comment_post_ID`), - KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), - KEY `comment_date_gmt` (`comment_date_gmt`), - KEY `comment_parent` (`comment_parent`), - KEY `comment_author_email` (`comment_author_email`(10)), - KEY `woo_idx_comment_type` (`comment_type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - -LOCK TABLES `wp_comments` WRITE; -/*!40000 ALTER TABLE `wp_comments` DISABLE KEYS */; - -INSERT INTO `wp_comments` (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`, `comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt`, `comment_content`, `comment_karma`, `comment_approved`, `comment_agent`, `comment_type`, `comment_parent`, `user_id`) -VALUES -(1,1,'A WordPress Commenter','wapuu@wordpress.example','https://wordpress.org/','','2021-02-21 01:36:49','2021-02-21 01:36:49','Hi, this is a comment.\nTo get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\nCommenter avatars come from Gravatar.',0,'1','','comment',0,0); - -/*!40000 ALTER TABLE `wp_comments` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table wp_links -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `wp_links`; - -CREATE TABLE `wp_links` ( - `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `link_url` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `link_name` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `link_image` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `link_target` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `link_description` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `link_visible` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'Y', - `link_owner` bigint(20) unsigned NOT NULL DEFAULT '1', - `link_rating` int(11) NOT NULL DEFAULT '0', - `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `link_rel` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - `link_notes` mediumtext COLLATE utf8mb4_unicode_520_ci NOT NULL, - `link_rss` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', - PRIMARY KEY (`link_id`), - KEY `link_visible` (`link_visible`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; - - - # Dump of table wp_options # ------------------------------------------------------------ diff --git a/tests/e2e/helpers/iframeHandler.js b/tests/e2e/helpers/iframeHandler.js index 5900d44b..d1ab1ffd 100644 --- a/tests/e2e/helpers/iframeHandler.js +++ b/tests/e2e/helpers/iframeHandler.js @@ -1,4 +1,4 @@ -const timeOutTime = 1500; +const timeOutTime = 2500; const setCustomerType = async (page, kcoIframe, customerTyoe) => { if ( await kcoIframe.$('[data-cid="am.customer_type"]') ) { diff --git a/tests/e2e/helpers/utils.js b/tests/e2e/helpers/utils.js index 2b4a2c3f..d673dc03 100644 --- a/tests/e2e/helpers/utils.js +++ b/tests/e2e/helpers/utils.js @@ -1,7 +1,7 @@ import API from "../api/API"; import urls from "./urls"; -const timeOutTime = 1500; +const timeOutTime = 2500; const KCOSettingsArray = { woocommerce_kco_settings: { enabled: "yes", diff --git a/tests/e2e/tests/kcoTest.spec.js b/tests/e2e/tests/kcoTest.spec.js index 37fc0588..5feb7c50 100644 --- a/tests/e2e/tests/kcoTest.spec.js +++ b/tests/e2e/tests/kcoTest.spec.js @@ -21,7 +21,7 @@ const options = { let page; let browser; let context; -let timeOutTime = 1500; +let timeOutTime = 2500; let json = data; describe("KCO E2E tests", () => { @@ -62,6 +62,7 @@ describe("KCO E2E tests", () => { // --------------- ADD PRODUCTS TO CART --------------- // await utils.addMultipleProductsToCart(page, args.products, json); + await page.waitForTimeout(1 * timeOutTime); // --------------- GO TO CHECKOUT --------------- // await page.goto(urls.CHECKOUT); @@ -93,7 +94,7 @@ describe("KCO E2E tests", () => { // --------------- POST PURCHASE CHECKS --------------- // - await page.waitForTimeout(8 * timeOutTime); + await page.waitForTimeout(5 * timeOutTime); const value = await page.$eval(".entry-title", (e) => e.textContent); expect(value).toBe("Order received"); From a1766d34697445cfdf1d7f7a44a870b29ac6409a Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 11:15:05 +0200 Subject: [PATCH 08/23] Updated readme --- tests/e2e/bin/README.md | 261 ---------------------------------------- tests/e2e/readme.md | 92 ++++++++++++++ 2 files changed, 92 insertions(+), 261 deletions(-) delete mode 100644 tests/e2e/bin/README.md create mode 100644 tests/e2e/readme.md diff --git a/tests/e2e/bin/README.md b/tests/e2e/bin/README.md deleted file mode 100644 index 2e818e71..00000000 --- a/tests/e2e/bin/README.md +++ /dev/null @@ -1,261 +0,0 @@ -# Klarna Checkout for WooCommerce automated testing documentation - -The Klarna Checkout for WooCommerce (KCO) automated testing process consists of running a simulated shopping experience through a WooCommerce Store. - -This shopping experience is performed from the testers’ side by inserting the parameters for a different shopping iteration in each separate test file (Test Suite) and commencing a test run via a single command. In turn, this will make a one-by-one run of the iterations and return a list of completed or failed results. - -# 1. Basic Elements and terms -***Test Suite*** : A single test file containing automated testing logic and test parameters. - -***Test*** : A single test within a test suite, which compares the order lines (amount, address, order ID etc.) in the response received with the ones sent in the order for the current Test Suite. - -Each Test Suites test will return as PASSED if the results returned from the KCO order match the ones expected, or FAILED in all other cases. - -Each KCO Test Suite contains 20 separate tests. - -***Terminal*** : This refers to the terminal screen containing the command console and display the test process and results. - -***Console*** : The command console which will receive the input from the tester. - -# 2. Basic code structure for testers - -- >*PLUGIN_PATH* > tests - - All of the files which require access from the user are within the **e2e** folder. - - This folder’s location is also the suggested path for the console when performing commands and any actions which are to be committed to the repository later on. - -- >*PLUGIN_PATH* > tests > e2e > config > config.data.json - - The file named **config.data.json** contains the base parameters that will be used within the plugin’s test environment setup from (customer billing data, credentials, coupon names, product ID’s etc.). - - ( ***! IMPORTANT*** : The file **config.data.json** is not included in the packages cloned from a repository, it has to be included via a simple copy/paste into this path by the testers upon the initial plugin test initialization. - - The file is not to be committed to the repository, as it contains sensitive information, such as access credentials. - In order to omit such mistakes, the file has been excluded from git detection upon changes ) - - For testers, the most important element within this file is the **timeoutTime** key-value pair, which sets the amount of time used in pauses between actions. - - Please see Section 4 for further instructions on the use of the **timeoutTime** variable. - -- >*PLUGIN_PATH* > tests > e2e > tests - - The folder containing the Test Suites. - -- >*PLUGIN_PATH* > tests > e2e > tests > {test file name} - - A Test Suite. - - Each of the files within the ***PLUGIN_PATH > tests > e2e > tests*** folder represents a single Test Suite. - - Upon the creation of a new Test Suite, the tester must give it a unique name following the naming conventions described in ***Section 6*** and add **.spec.js** to it as an extension. - - -- >*PLUGIN_PATH* > tests > e2e > bin > data.sql - - The database file which will be used for the formation of the admin data, included plugins, coupons and products within a WooCommerce store. - - ( ***! IMPORTANT*** : The file **data.sql** is not included in the packages cloned from a repository, it has to be included via a simple copy/paste into this path by the testers upon the initial plugin test initialization. - - The file is not to be committed to the repository, as it contains sensitive information, such as access credentials. - In order to omit such mistakes, the file has been excluded from git detection upon changes ) - -# 3. Environment setup - -**BEFORE ALL** : -- Install the NodeJS and the yarn package manager onto your system. -- Install Docker onto your system. - -1. Clone the repository branch containing the E2E Automated Testing. -2. Copy and paste from an external source: - -- data.sql - ->*PLUGIN_PATH* > tests > e2e > bin > { here } - -- config.data.json - ->*PLUGIN_PATH* > tests > e2e > config > { here } - -- .env - ->*PLUGIN_PATH* > tests > e2e > { here } - -3. Open your Terminal, and use the Console to navigate to ***PLUGIN_PATH > tests > e2e*** -4. Install the required NodeJS packages ***PLUGIN_PATH > tests > e2e*** - -- yarn install - -5. Input the following command: - -- yarn docker:up - -6. Monitor the loading progress from your Docker Desktop GUI. -7. Input the following command: - -- yarn jettison - -8. From here on, each time you use the “yarn jettison” command, the automated testing will run all of the created Test Suites one by one. - -**AFTER ALL** : Bring the Docker image down with the following command: - -- yarn docker:down - -# 4. Test setup - -- >*PLUGIN_PATH* > tests > e2e > config > config.data.json - - ***Time Out Time*** - - The **timeoutTime** key’s value (set in the ***config.data.json*** file) defines the number of milliseconds the testing run for each Test Suite will pause after completing an action. - - Being that the plugin heavily dependent on responses from a server, the loading times for iFrames and different stages of the checkout process may vary independently and inconsistently. - -- >*PLUGIN_PATH* > tests > e2e > tests > {Test Suite} - - - ***Logged in user / Guest*** - - Toggled by turning the **isUserLoggedIn** variable to *true* (logged in user) or *false* (guest). - - - ***Products to be added to cart*** - - Added by inserting the product name variables into the array. - - EXAMPLE: - Add a Variable product 25% Tax blue, a Simple product 25%, and a Variable product 25% Green to cart. - - >const productsToCart = [ - variableProduct25Blue, - simpleProduct25, - variableProduct25Green - ]; - - To add multiple instances of a single product, just add the product name variable that many times into the array. - - The list of the product names is included in the entry portion of the Test Suite, while the product ID’s are within the **config.data.json** file. - - - ***Select the shipping method*** - - Toggled by turning the **shippingMethod** variable to *freeShippingMethod* (free shipping) or *flatRateMethod* (flat rate shipping). - - - ***Select the payment method*** - - Toggled by turning the **selectedPaymentMethod** variable to *invoicePaymentMethod* (invoice) or *creditPaymentMethod* (credit card). - - - ***Applied coupons*** - - Added by inserting the coupon name variables into the array. - - EXAMPLE: - Apply the percentage total cart discount coupon. - - >const appliedCoupons = [couponPercent]; - - The list of the coupon names is included in the entry portion of the Test Suite, while the coupon raw name strings are within the **config.data.json** file. - - - ***KCO iFrame shipping method selection*** - - Toggled by turning the “iframeShipping” variable to “yes” (KCO iframe shipping) or “no” (standard WooCommerce checkout shipping selection). - - ( ***! IMPORTANT*** : Changing any other parameters within the **data.sql** or other installation setup files will require a restart of the Docker image by bringing it down, and then up again (see ***Section 3***)) - -# 5. Test Suite Creation (Unofficial Tip) - - 1. Select All text (CTRL/Command + A) - 2. Copy Text (CTRL/Command + C) - 3. Create new Test Suite file with a unique name - 4. Paste Text (CTRL/Command + V) within the new Test Suite file - 5. Change the test parameters - -# 6. Naming convention: - -The naming conventions for the Test Suites is as follows, each separated with a dash: - - 1. Logged-in User / Guest - 2. Products - 3. Shipping Method - 4. Payment Method - 5. Coupons - 6. Shipping method selection - -1. **Logged-in User / Guest** - -- LI - Logged In -- G - Guest - -2. **Products** - - The Products piece begins with the letter **P** and proceeds with the abbreviated product name, then tax amount numeral, and (in case of variable products) abbreviated variation colors, in case of product repeating, end the product line lower case *x* and the number of repetitions: - -- S - Simple product - -- V - Variable product - - - g - green - - bb - black - - bl - blue - - br - brown - -- VT - Virtual product - -- D - Downloadable product - - PS25 - - Simple Product 25% - - PV25blx2-PV12bb-PS0x4 - - 2 x Variable Product 25% Blue - - Variable Product 12% Black - - 4 x Simple Product 0% - -3. **Shipping method** - -- FS - Free shipping -- FLT - Flat rate shipping - -4. **Payment method** - -- INV - Invoice - -- CRD - Credit card - -5. **Coupons** - - The Coupons piece begins an upper-case Q with the coupon type in capital letters, and percent or fixed discount choice in lower-case letters. - -- C - Cart -- P - Product -- pr - Percent -- fx - Fixed -- TT - Total discount -- TTF - Total discount with free shipping - - QCpr50 - - Coupon 50% cart discount - -6. **iFrame** -- IFR - KCO Shipping iFrame -- {none} - Standard WooCommerce shipping selection - ---- - - EXAMPLE #1 - - - LI-PS25-FLT-CRD-QCpr50-IFR - * Logged-in User - * simple product 25 - * Flat rate shipping - * Credit card - * Coupon 50% cart - * iFrame shipping - - - - - EXAMPLE #2 - - - G-PV12bl-PV25g-FSS-INV-QP12fx - * Guest - * Product variable 12% blue - * Product variable 25% green - * Free shipping - * Invoice - * Coupon 12kr product fixed - * Standard shipping selector \ No newline at end of file diff --git a/tests/e2e/readme.md b/tests/e2e/readme.md new file mode 100644 index 00000000..55c11973 --- /dev/null +++ b/tests/e2e/readme.md @@ -0,0 +1,92 @@ +# End to End testing + +## Installation +To use this E2E testing suite you will need a few things installed. +- Docker +- NodeJS +- Yarn + +After cloning the repository, open the `/test/e2e` folder in your command line and trigger the `yarn install` command. This will install the needed node packages that is needed. + +## Usage +To run the tests in your environment, you can do so by opening the folder `/test/e2e` in your terminal. Then entering the command `yarn e2e:test`. This will start the process to create the docker container, install WordPress and WooCommerce, and run the tests. After the tests are done, the docker container will be destroyed and the results of the tests will be printed out in the terminal. + +## Writing tests +The core of the testing is around placing orders and making sure that the process goes well. This is done by the main test file that we have in the `/test/e2e/tests` folder. This will loop through a list of tests that are described by the `tests.json` file that we have in the `/test/e2e/config` folder. + +A test will look like this: +```` + { + "name": "Test name", + "loggedIn": bool, + "inclusiveTax": "yes", + "shippingInIframe": "yes", + "products": ["Product 1 name", "Product 2 name"], + "shippingMethod": "shipping_method", + "coupons": ["coupon code"], + "customerType": "person", + "expectedTotal": float, + "expectedOrderLines": int + } +```` +To create a new test, simply add a line to the tests.json file and include the following keys with the values you need for your tests. +- name: The name that you want the test to have in the logs that are printed out after the test is done. It is good to mention in the name what the test actually includes. +- loggedIn: Set this to `true` or `false`. True for if the customer is not a guest, but should be logged in to an account. And false if the customer is a guest for this test. +- inclusiveTax: `"yes"` or `"no"` depending on if you want prices to be entered inclusive of tax in WooCommerce. This can be good to change depending on what you want to test for different calculation results. A product that costs 100 with taxes inclusive will always be 100. But with this set to no, the end price in the cart will be 125 if the tax amount is 25%. +- shippingInIframe: `"yes"` or `"no"`. For Klarna checkout we have the option to include shipping options in the iframe or not. +- products: An array of the names of the products you wish to add to the cart for the test. +- shippingMethod: The shipping method name/id that you wish to use for the test. Send an empty string ( `""` ) if you don't wish to add one. +- coupons: Same as products, but send in the coupon codes that you want to apply to the cart during checkout. +- customerType: `"person"` or `"company"`. Person for B2C tests, and Company for B2B tests. +- expectedTotal: A float value of the expected price that you expect the test to return. We will check the Klarna order to make sure this matches at the end. +- expectedOrderLines: A int of how many order lines you expect the test to return. We will check the Klarna order to make sure this matches at the end. + +## Adding products, shipping methods and coupons to the environment. +Similarly to the tests above, we have a json file for all the products, coupons, shipping methods an more that the environment needs to run the tests. These can be expanded on in the same way as above. + +### Products +```` +{ + "id": null, + "name": "Product name", + "sku": "product-sku", + "regular_price": "100.00", + "virtual": bool, + "downloadable": bool, + "tax_class": "25" +} +```` +- id: Always add this as null. This will be set automatically by our code later. +- name: The name of the product to be added. +- sku: The SKU of the product to be added. +- regular_price: The price of the product sent as a string but formated as a float. +- virtual: `true` or `false` based on if this is a virtual product or not. +- downloadable: `true` or `false` based on if this is a downloadable product or not. +- tax_class: The name of the tax class you wish to apply to the product. We currently have 25, 12, 06 and 00 who all add the tax rate similar to their names. + +### Shipping methods +```` + { + "name": "Sweden", + "location": { "code": "SE", "type": "country" }, + "methods": [ + { "method": "flat_rate", "amount": 49 }, + { "method": "free_shipping", "amount": 0 } + ] + } +```` +- name: The name of the shipping zone. +- location: The location object for the shipping zone. The code is for the country/region/zip code that you want to add, and the type is either country, region or zipcode. +- methods: An array of methods to add to the shipping zone. Method is the id for the method type being added. And amount is how much the option should cost. + +### Coupons +```` + { + "code": "coupon_code", + "amount": "10", + "discountType": "fixed_cart" + } +```` +- code: The coupon code to be used. +- amount: The amount that the coupon should apply. +- discountType: The different discount types of coupons that WooCommerce offers. Check the WooCommerce documentation for the different types. But the most common are fixed_cart and percent \ No newline at end of file From 278b252af24c40b8fa9dacaf344b99ea1d6cbd57 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 11:23:13 +0200 Subject: [PATCH 09/23] Update e2e_tests.yml --- .github/workflows/e2e_tests.yml | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml index 628c4d07..4f5315a7 100644 --- a/.github/workflows/e2e_tests.yml +++ b/.github/workflows/e2e_tests.yml @@ -2,19 +2,30 @@ name: E2E tests on: push: branches: - - develop + - develop-e2e-v2 jobs: - build: - name: Run tests - runs-on: ubuntu-latest + test-plugin: + name: Run E2E Tests + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] env: API_KEY: ${{secrets.E2E_API_KEY}} API_SECRET: ${{secrets.E2E_API_SECRET}} steps: - - uses: convictional/trigger-workflow-and-wait@v1.3.0 + - name: Create dirs. + run: | + mkdir -p kco + - name: Setup KCO + uses: actions/checkout@v2 with: - owner: krokedil - repo: e2e-tests - github_token: ${{ secrets.GH_ACCESS_TOKEN }} - workflow_file_name: e2e-tests.yml - ref: master + path: kco + - name: Setup Yarn + run: | + cd ./kco/tests/e2e/ + yarn install + - name: Run Tests + run: | + cd ./kco/tests/e2e/ + yarn e2e:test From 96e6752e57c639cd7746e9547b9158cac8158a89 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 11:25:24 +0200 Subject: [PATCH 10/23] Update kcoTest.spec.js --- tests/e2e/tests/kcoTest.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/tests/kcoTest.spec.js b/tests/e2e/tests/kcoTest.spec.js index 5feb7c50..8b9d0127 100644 --- a/tests/e2e/tests/kcoTest.spec.js +++ b/tests/e2e/tests/kcoTest.spec.js @@ -8,7 +8,7 @@ import tests from "../config/tests.json" import data from "../config/data.json"; const options = { - "headless": false, + "headless": true, "defaultViewport": null, "args": [ "--disable-infobars", From fd5afff14bb59c9f28f6be909aaeccdebecbf41d Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 13:47:25 +0200 Subject: [PATCH 11/23] Remove old test files --- tests/.gitignore | 4 - tests/bin/install-wp-tests.sh | 152 --- tests/bin/mysql/create_db.sql | 1 - tests/bin/set-env.sh | 11 - tests/bootstrap.php | 239 ---- tests/config.php | 11 - tests/e2e/config/data.json | 257 +++- tests/e2e/helpers/iframeHandler.js | 6 +- .../customer/class-krokedil-customer.php | 144 --- .../customer/interface-krokedil-customer.php | 15 - .../class-krokedil-order-item-product.php | 69 - .../class-krokedil-order-item-shipping.php | 64 - .../order/class-krokedil-order.php | 264 ---- .../order/class-krokedil-shipping-rate.php | 86 -- .../interface-krokedil-order-item-product.php | 30 - .../interface-krokedil-order-statues.php | 44 - .../order/interface-krokedil-order.php | 29 - .../payment/class-krokedil-payment-token.php | 26 - ...abstract-class-krokedil-product-helper.php | 90 -- .../class-krokedil-external-product.php | 1 - .../class-krokedil-grouped-product.php | 1 - .../class-krokedil-product-attribute.php | 175 --- .../product/class-krokedil-simple-product.php | 1 - .../class-krokedil-variable-product.php | 1 - .../class-krokedil-variation-product.php | 1 - .../product/interface-krokedil-product.php | 28 - .../shipping/class-krokedil-wc-shipping.php | 41 - ...abstract-class-krokedil-unit-test-case.php | 161 --- .../core/class-krokedil-constants.php | 40 - .../krokedil/core/class-krokedil-crud.php | 41 - .../core/class-krokedil-db-helper.php | 50 - .../krokedil/core/interface-krokedil-wc.php | 26 - tests/init | 48 - .../kco-api-helpers/test-kco-cart-helpers.php | 1124 ----------------- 34 files changed, 234 insertions(+), 3047 deletions(-) delete mode 100644 tests/.gitignore delete mode 100644 tests/bin/install-wp-tests.sh delete mode 100644 tests/bin/mysql/create_db.sql delete mode 100644 tests/bin/set-env.sh delete mode 100644 tests/bootstrap.php delete mode 100644 tests/config.php delete mode 100644 tests/framework/helpers/woocommerce/customer/class-krokedil-customer.php delete mode 100644 tests/framework/helpers/woocommerce/customer/interface-krokedil-customer.php delete mode 100644 tests/framework/helpers/woocommerce/order/class-krokedil-order-item-product.php delete mode 100644 tests/framework/helpers/woocommerce/order/class-krokedil-order-item-shipping.php delete mode 100644 tests/framework/helpers/woocommerce/order/class-krokedil-order.php delete mode 100644 tests/framework/helpers/woocommerce/order/class-krokedil-shipping-rate.php delete mode 100644 tests/framework/helpers/woocommerce/order/interface-krokedil-order-item-product.php delete mode 100644 tests/framework/helpers/woocommerce/order/interface-krokedil-order-statues.php delete mode 100644 tests/framework/helpers/woocommerce/order/interface-krokedil-order.php delete mode 100644 tests/framework/helpers/woocommerce/payment/class-krokedil-payment-token.php delete mode 100644 tests/framework/helpers/woocommerce/product/abstract-class-krokedil-product-helper.php delete mode 100644 tests/framework/helpers/woocommerce/product/class-krokedil-external-product.php delete mode 100644 tests/framework/helpers/woocommerce/product/class-krokedil-grouped-product.php delete mode 100644 tests/framework/helpers/woocommerce/product/class-krokedil-product-attribute.php delete mode 100644 tests/framework/helpers/woocommerce/product/class-krokedil-simple-product.php delete mode 100644 tests/framework/helpers/woocommerce/product/class-krokedil-variable-product.php delete mode 100644 tests/framework/helpers/woocommerce/product/class-krokedil-variation-product.php delete mode 100644 tests/framework/helpers/woocommerce/product/interface-krokedil-product.php delete mode 100644 tests/framework/helpers/woocommerce/shipping/class-krokedil-wc-shipping.php delete mode 100644 tests/framework/krokedil/core/abstract-class-krokedil-unit-test-case.php delete mode 100644 tests/framework/krokedil/core/class-krokedil-constants.php delete mode 100644 tests/framework/krokedil/core/class-krokedil-crud.php delete mode 100644 tests/framework/krokedil/core/class-krokedil-db-helper.php delete mode 100644 tests/framework/krokedil/core/interface-krokedil-wc.php delete mode 100644 tests/init delete mode 100644 tests/unit-tests/kco-api-helpers/test-kco-cart-helpers.php diff --git a/tests/.gitignore b/tests/.gitignore deleted file mode 100644 index cf625da2..00000000 --- a/tests/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -.vscode -/vendor/ -*.DS_Store \ No newline at end of file diff --git a/tests/bin/install-wp-tests.sh b/tests/bin/install-wp-tests.sh deleted file mode 100644 index 39fc67cb..00000000 --- a/tests/bin/install-wp-tests.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env bash - -if [ $# -lt 3 ]; then - echo "usage: $0 [db-host] [wp-version] [skip-database-creation]" - exit 1 -fi - -DB_NAME=$1 -DB_USER=$2 -DB_PASS=$3 -DB_HOST=${4-localhost} -WP_VERSION=${5-latest} -SKIP_DB_CREATE=${6-false} - -TMPDIR=${TMPDIR-/tmp} -TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//") -WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib} -WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress/} - -download() { - if [ `which curl` ]; then - curl -s "$1" > "$2"; - elif [ `which wget` ]; then - wget -nv -O "$2" "$1" - fi -} - -if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+\-(beta|RC)[0-9]+$ ]]; then - WP_BRANCH=${WP_VERSION%\-*} - WP_TESTS_TAG="branches/$WP_BRANCH" - -elif [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then - WP_TESTS_TAG="branches/$WP_VERSION" -elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then - if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then - # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x - WP_TESTS_TAG="tags/${WP_VERSION%??}" - else - WP_TESTS_TAG="tags/$WP_VERSION" - fi -elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then - WP_TESTS_TAG="trunk" -else - # http serves a single offer, whereas https serves multiple. we only want one - download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json - grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json - LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//') - if [[ -z "$LATEST_VERSION" ]]; then - echo "Latest WordPress version could not be found" - exit 1 - fi - WP_TESTS_TAG="tags/$LATEST_VERSION" -fi -set -ex - -install_wp() { - - if [ -d $WP_CORE_DIR ]; then - return; - fi - - mkdir -p $WP_CORE_DIR - - if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then - mkdir -p $TMPDIR/wordpress-nightly - download https://wordpress.org/nightly-builds/wordpress-latest.zip $TMPDIR/wordpress-nightly/wordpress-nightly.zip - unzip -q $TMPDIR/wordpress-nightly/wordpress-nightly.zip -d $TMPDIR/wordpress-nightly/ - mv $TMPDIR/wordpress-nightly/wordpress/* $WP_CORE_DIR - else - if [ $WP_VERSION == 'latest' ]; then - local ARCHIVE_NAME='latest' - elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then - # https serves multiple offers, whereas http serves single. - download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json - if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then - # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x - LATEST_VERSION=${WP_VERSION%??} - else - # otherwise, scan the releases and get the most up to date minor version of the major release - local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'` - LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1) - fi - if [[ -z "$LATEST_VERSION" ]]; then - local ARCHIVE_NAME="wordpress-$WP_VERSION" - else - local ARCHIVE_NAME="wordpress-$LATEST_VERSION" - fi - else - local ARCHIVE_NAME="wordpress-$WP_VERSION" - fi - download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz - tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR - fi - - download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php -} - -install_test_suite() { - # portable in-place argument for both GNU sed and Mac OSX sed - if [[ $(uname -s) == 'Darwin' ]]; then - local ioption='-i.bak' - else - local ioption='-i' - fi - - # set up testing suite if it doesn't yet exist - if [ ! -d $WP_TESTS_DIR ]; then - # set up testing suite - mkdir -p $WP_TESTS_DIR - svn co --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes - svn co --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data - fi - - if [ ! -f wp-tests-config.php ]; then - download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php - # remove all forward slashes in the end - WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::") - sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php - sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php - sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php - sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php - sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php - fi - -} - -install_db() { - - if [ ${SKIP_DB_CREATE} = "true" ]; then - return 0 - fi - - # parse DB_HOST for port or socket references - local PARTS=(${DB_HOST//\:/ }) - local DB_HOSTNAME=${PARTS[0]}; - local DB_SOCK_OR_PORT=${PARTS[1]}; - local EXTRA="" - - if ! [ -z $DB_HOSTNAME ] ; then - if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then - EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp" - elif ! [ -z $DB_SOCK_OR_PORT ] ; then - EXTRA=" --socket=$DB_SOCK_OR_PORT" - elif ! [ -z $DB_HOSTNAME ] ; then - EXTRA=" --host=$DB_HOSTNAME --protocol=tcp" - fi - fi -} - -install_wp -install_test_suite -install_db diff --git a/tests/bin/mysql/create_db.sql b/tests/bin/mysql/create_db.sql deleted file mode 100644 index 1bdd1c70..00000000 --- a/tests/bin/mysql/create_db.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE DATABASE IF NOT EXISTS wordpress_test \ No newline at end of file diff --git a/tests/bin/set-env.sh b/tests/bin/set-env.sh deleted file mode 100644 index 4e2d6fa2..00000000 --- a/tests/bin/set-env.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -apt-get update > /dev/null -which svn > /dev/null -if [ $? -eq 1 ]; then - echo Installing subversion... - apt-get install subversion -y -fi -echo Installing phpunit 7.5 -wget https://phar.phpunit.de/phpunit-7.5.phar > /dev/null -chmod +x phpunit-7.5.phar -mv phpunit-7.5.phar /usr/local/bin/phpunit \ No newline at end of file diff --git a/tests/bootstrap.php b/tests/bootstrap.php deleted file mode 100644 index 6b33fc9b..00000000 --- a/tests/bootstrap.php +++ /dev/null @@ -1,239 +0,0 @@ - 'woocommerce.php', - ); - - /** - * Plugin configuration - * - * @var array - */ - protected $config = array(); - - /** - * True if running with Docker. Changes include path. - * - * @var boolean - */ - protected $docker = false; - - /** - * - * Setup the unit testing environment. - * - * @throws Exception If file does not exist. - */ - public function __construct() { - if ( file_exists( __DIR__ . DIRECTORY_SEPARATOR . 'config.php' ) ) { - $this->config = require 'config.php'; - } else { - throw new Exception( 'Configuration file is missing!' ); - } - - $this->set_args(); - - // init plugin paths. - $this->set_paths(); - - // load test functions. - require_once $this->wp_tests_dir . '/includes/functions.php'; - - // activate plugin. - tests_add_filter( 'muplugins_loaded', array( $this, 'load_plugin' ) ); - - tests_add_filter( 'setup_theme', array( $this, 'install_wc' ) ); - - // load the WP testing environment. - require_once $this->wp_tests_dir . '/includes/bootstrap.php'; - - $this->includes(); - - } - - /** - * Sets required paths. - * - * @since 1.0.0 - */ - protected function set_paths() { - - // plugin test dir. - $this->tests_dir = __DIR__; - - // plugin path. - $this->plugin_dir = dirname( $this->tests_dir ); - - // plugins path. - $this->plugins_dir = realpath( $this->plugin_dir . DIRECTORY_SEPARATOR . '..' ); - - // wordpress-tests-lib. - $this->wp_tests_dir = rtrim( sys_get_temp_dir(), '/\\' ) . '/wordpress-tests-lib'; - - } - - - /** - * Load plugin. - * - * @since 1.0.0 - */ - public function load_plugin() { - if ( ! empty( $this->dependencies ) ) { - foreach ( $this->dependencies as $dir => $plugin_file ) { - if ( $this->docker ) { - require_once $this->plugin_dir . DIRECTORY_SEPARATOR . '.wp' . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $plugin_file; - } else { - require_once $this->plugins_dir . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $plugin_file; - } - } - } - require_once $this->plugin_dir . DIRECTORY_SEPARATOR . $this->config['name']; - } - - /** - * Load krokedil-specific test cases. - * - * @since 1.0.0 - */ - public function includes() { - // framework. - require_once $this->tests_dir . '/framework/krokedil/core/class-krokedil-constants.php'; - require_once $this->tests_dir . '/framework/krokedil/core/class-krokedil-crud.php'; - require_once $this->tests_dir . '/framework/krokedil/core/interface-krokedil-wc.php'; - require_once $this->tests_dir . '/framework/krokedil/core/abstract-class-krokedil-unit-test-case.php'; - - // order. - require_once $this->tests_dir . '/framework/helpers/woocommerce/order/interface-krokedil-order.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/order/interface-krokedil-order-statues.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/order/interface-krokedil-order-item-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/order/class-krokedil-order.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/order/class-krokedil-order-item-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/order/interface-krokedil-order.php'; - - // product. - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/interface-krokedil-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/abstract-class-krokedil-product-helper.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/class-krokedil-simple-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/class-krokedil-external-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/class-krokedil-grouped-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/class-krokedil-variable-product.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/product/class-krokedil-variation-product.php'; - // customer. - require_once $this->tests_dir . '/framework/helpers/woocommerce/customer/interface-krokedil-customer.php'; - require_once $this->tests_dir . '/framework/helpers/woocommerce/customer/class-krokedil-customer.php'; - // shipping. - require_once $this->tests_dir . '/framework/helpers/woocommerce/shipping/class-krokedil-wc-shipping.php'; - } - - /** - * Get the single class instance. - * - * @return Krokedil_Unit_Tests_Bootstrap - * @throws Exception If the configuration file does not exist. - * @since 1.0.0 - */ - public static function get_instance(): \Krokedil_Unit_Tests_Bootstrap { - - if ( null === self::$instance ) { - self::$instance = new self(); - } - - return self::$instance; - } - - public function install_wc() { - WC_Install::install(); - - // Only if WC is 4.0 or higher. - if ( class_exists( '\Automattic\WooCommerce\Admin\Install' ) ) { - // Initialize the WC API extensions. - \Automattic\WooCommerce\Admin\Install::create_tables(); - \Automattic\WooCommerce\Admin\Install::create_events(); - } - - // Reload capabilities after install, see https://core.trac.wordpress.org/ticket/28374. - if ( version_compare( $GLOBALS['wp_version'], '4.7', '<' ) ) { - $GLOBALS['wp_roles']->reinit(); - } else { - $GLOBALS['wp_roles'] = null; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited - wp_roles(); - } - - echo esc_html( 'Installing WooCommerce...' . PHP_EOL ); - } - - /** - * Sets the args for the test run. - * - * @return void - */ - public function set_args() { - $this->docker = $_ENV['docker']; - } -} - -try { - Krokedil_Unit_Tests_Bootstrap::get_instance(); -} catch ( Exception $e ) { - echo $e->getMessage() . PHP_EOL; // phpcs:ignore -} - - diff --git a/tests/config.php b/tests/config.php deleted file mode 100644 index fef528d9..00000000 --- a/tests/config.php +++ /dev/null @@ -1,11 +0,0 @@ - 'klarna-checkout-for-woocommerce.php', - 'version' => '1.0.0', -); diff --git a/tests/e2e/config/data.json b/tests/e2e/config/data.json index 83827226..f1c8e66f 100644 --- a/tests/e2e/config/data.json +++ b/tests/e2e/config/data.json @@ -1,45 +1,250 @@ { "taxes": [ - { "name": "25", "rate": "25" }, - { "name": "12", "rate": "12" }, - { "name": "06", "rate": "6" }, - { "name": "00", "rate": "0" } + { + "name": "25", + "rate": "25" + }, + { + "name": "12", + "rate": "12" + }, + { + "name": "06", + "rate": "6" + }, + { + "name": "00", + "rate": "0" + } ], - "products": { - "simple": [ - { "id": null, "name": "Simple 25%", "sku": "simple-25", "regular_price": "99.99", "virtual": false, "downloadable": false, "tax_class": "25" }, - { "id": null, "name": "Simple 12%", "sku": "simple-12", "regular_price": "158.39", "virtual": false, "downloadable": false, "tax_class": "12" }, - { "id": null, "name": "Simple 6%", "sku": "simple-06", "regular_price": "84.49", "virtual": false, "downloadable": false, "tax_class": "06" }, - { "id": null, "name": "Simple 0%", "sku": "simple-00", "regular_price": "9.99", "virtual": false, "downloadable": false, "tax_class": "00" }, - { "id": null, "name": "Simple Virtual 25%", "sku": "simple-virtual-25", "regular_price": "12.85", "virtual": true, "downloadable": true, "tax_class": "25" }, - { "id": null, "name": "Simple Virtual 12%", "sku": "simple-virtual-12", "regular_price": "6.54", "virtual": true, "downloadable": true, "tax_class": "12" }, - { "id": null, "name": "Simple Virtual 6%", "sku": "simple-virtual-06", "regular_price": "48.24", "virtual": true, "downloadable": true, "tax_class": "06" }, - { "id": null, "name": "Simple Virtual 0%", "sku": "simple-virtual-00", "regular_price": "75.42", "virtual": true, "downloadable": true, "tax_class": "00" } + "simple": [ + { + "id": null, + "name": "Simple 25%", + "sku": "simple-25", + "regular_price": "99.99", + "virtual": false, + "downloadable": false, + "tax_class": "25" + }, + { + "id": null, + "name": "Simple 12%", + "sku": "simple-12", + "regular_price": "158.39", + "virtual": false, + "downloadable": false, + "tax_class": "12" + }, + { + "id": null, + "name": "Simple 6%", + "sku": "simple-06", + "regular_price": "84.49", + "virtual": false, + "downloadable": false, + "tax_class": "06" + }, + { + "id": null, + "name": "Simple 0%", + "sku": "simple-00", + "regular_price": "9.99", + "virtual": false, + "downloadable": false, + "tax_class": "00" + }, + { + "id": null, + "name": "Simple Virtual 25%", + "sku": "simple-virtual-25", + "regular_price": "12.85", + "virtual": true, + "downloadable": true, + "tax_class": "25" + }, + { + "id": null, + "name": "Simple Virtual 12%", + "sku": "simple-virtual-12", + "regular_price": "6.54", + "virtual": true, + "downloadable": true, + "tax_class": "12" + }, + { + "id": null, + "name": "Simple Virtual 6%", + "sku": "simple-virtual-06", + "regular_price": "48.24", + "virtual": true, + "downloadable": true, + "tax_class": "06" + }, + { + "id": null, + "name": "Simple Virtual 0%", + "sku": "simple-virtual-00", + "regular_price": "75.42", + "virtual": true, + "downloadable": true, + "tax_class": "00" + } ], "variable": [ - { "id": null, "name": "Variable 25%", "sku": "variable-product-25", "regular_price": "26.75", "virtual": false, "downloadable": false, "tax_class": "25", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 25%:black", "option": "black" }, { "id": null, "name": "Variable 25%:red", "option": "red"}, { "id": null, "name": "Variable 25%:green", "option": "green" } ] } }, - { "id": null, "name": "Variable 12%", "sku": "variable-product-12", "regular_price": "95.28", "virtual": false, "downloadable": false, "tax_class": "12", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 12%:black", "option": "black" }, { "id": null, "name": "Variable 12%:red", "option": "red"}, { "id": null, "name": "Variable 12%:green", "option": "green" } ] } }, - { "id": null, "name": "Variable 6%", "sku": "variable-product-06", "regular_price": "26.79", "virtual": false, "downloadable": false, "tax_class": "06", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 6%:black", "option": "black" }, { "id": null, "name": "Variable 6%:red", "option": "red"}, { "id": null, "name": "Variable 6%:green", "option": "green" } ] } }, - { "id": null, "name": "Variable 0%", "sku": "variable-product-00", "regular_price": "52.90", "virtual": false, "downloadable": false, "tax_class": "00", "attribute": { "name": "color", "options": [ { "id": null, "name": "Variable 0%:black", "option": "black" }, { "id": null, "name": "Variable 0%:red", "option": "red"}, { "id": null, "name": "Variable 0%:green", "option": "green" } ] } } + { + "id": null, + "name": "Variable 25%", + "sku": "variable-product-25", + "regular_price": "26.75", + "virtual": false, + "downloadable": false, + "tax_class": "25", + "attribute": { + "name": "color", + "options": [ + { + "id": null, + "name": "Variable 25%:black", + "option": "black" + }, + { + "id": null, + "name": "Variable 25%:red", + "option": "red" + }, + { + "id": null, + "name": "Variable 25%:green", + "option": "green" + } + ] + } + }, + { + "id": null, + "name": "Variable 12%", + "sku": "variable-product-12", + "regular_price": "95.28", + "virtual": false, + "downloadable": false, + "tax_class": "12", + "attribute": { + "name": "color", + "options": [ + { + "id": null, + "name": "Variable 12%:black", + "option": "black" + }, + { + "id": null, + "name": "Variable 12%:red", + "option": "red" + }, + { + "id": null, + "name": "Variable 12%:green", + "option": "green" + } + ] + } + }, + { + "id": null, + "name": "Variable 6%", + "sku": "variable-product-06", + "regular_price": "26.79", + "virtual": false, + "downloadable": false, + "tax_class": "06", + "attribute": { + "name": "color", + "options": [ + { + "id": null, + "name": "Variable 6%:black", + "option": "black" + }, + { + "id": null, + "name": "Variable 6%:red", + "option": "red" + }, + { + "id": null, + "name": "Variable 6%:green", + "option": "green" + } + ] + } + }, + { + "id": null, + "name": "Variable 0%", + "sku": "variable-product-00", + "regular_price": "52.90", + "virtual": false, + "downloadable": false, + "tax_class": "00", + "attribute": { + "name": "color", + "options": [ + { + "id": null, + "name": "Variable 0%:black", + "option": "black" + }, + { + "id": null, + "name": "Variable 0%:red", + "option": "red" + }, + { + "id": null, + "name": "Variable 0%:green", + "option": "green" + } + ] + } + } ], "attribute": [ - { "id": null, "name": "color" } + { + "id": null, + "name": "color" + } ] }, - "coupons": [ - { "code": "fixedcart", "amount": "10", "discountType": "fixed_cart" }, - { "code": "percent", "amount": "10", "discountType": "percent" } + { + "code": "fixedcart", + "amount": "10", + "discountType": "fixed_cart" + }, + { + "code": "percent", + "amount": "10", + "discountType": "percent" + } ], - "shipping": [ { "name": "Sweden", - "location": { "code": "SE", "type": "country" }, + "location": { + "code": "SE", + "type": "country" + }, "methods": [ - { "method": "flat_rate", "amount": 49 }, - { "method": "free_shipping", "amount": 0 } + { + "method": "flat_rate", + "amount": 49 + }, + { + "method": "free_shipping", + "amount": 0 + } ] } ] diff --git a/tests/e2e/helpers/iframeHandler.js b/tests/e2e/helpers/iframeHandler.js index d1ab1ffd..586e3265 100644 --- a/tests/e2e/helpers/iframeHandler.js +++ b/tests/e2e/helpers/iframeHandler.js @@ -1,15 +1,15 @@ const timeOutTime = 2500; -const setCustomerType = async (page, kcoIframe, customerTyoe) => { +const setCustomerType = async (page, kcoIframe, customerType) => { if ( await kcoIframe.$('[data-cid="am.customer_type"]') ) { let inputField = await kcoIframe.$('[data-cid="am.customer_type"]'); await inputField.click(); await page.waitForTimeout(0.1 * timeOutTime); - if (customerTyoe === "person"){ + if (customerType === "person"){ await kcoIframe.click('[data-cid="row person"]'); await kcoIframe.waitForTimeout(1 * timeOutTime); - } else if (customerTyoe === "company") { + } else if (customerType === "company") { await kcoIframe.click('[data-cid="row organization"]'); await kcoIframe.waitForTimeout(1 * timeOutTime); } diff --git a/tests/framework/helpers/woocommerce/customer/class-krokedil-customer.php b/tests/framework/helpers/woocommerce/customer/class-krokedil-customer.php deleted file mode 100644 index b9844c74..00000000 --- a/tests/framework/helpers/woocommerce/customer/class-krokedil-customer.php +++ /dev/null @@ -1,144 +0,0 @@ - 1, - 'date_modified' => null, - 'billing_country' => 'US', - 'billing_state' => 'PA', - 'billing_postcode' => '19123', - 'billing_city' => 'Philadelphia', - 'billing_address' => '123 South Street', - 'billing_address_2' => 'Apt 1', - 'shipping_country' => 'US', - 'shipping_state' => 'PA', - 'shipping_postcode' => '19123', - 'shipping_city' => 'Philadelphia', - 'shipping_address' => '123 South Street', - 'shipping_address_2' => 'Apt 1', - 'is_vat_exempt' => false, - 'calculated_shipping' => false, - 'username' => 'testusername', - 'password' => 'testpass', - 'email' => 'customer@local.com', - - ]; - - /** - * Krokedil_Customer constructor. - * - * @param array $data data. - */ - public function __construct( array $data = [] ) { - $this->data = wp_parse_args( $data, $this->data ); - } - - /** - * Creates customer - * - * @return WC_Customer - * @throws Exception If customer not exist. - */ - public function create(): WC_Customer { - $customer = new WC_Customer(); - foreach ( $this->data as $key => $value ) { - $customer->{"set_$key"}( $value ); - } - - if ( $this->save() ) { - $customer->save(); - } - return $customer; - - } - - /** - * Get the expected output for the store's base location settings. - * - * @return array - */ - public static function get_expected_store_location() { - return array( 'GB', '', '', '' ); - } - - /** - * Get the customer's shipping and billing info from the session. - * - * @return array - */ - public static function get_customer_details() { - return WC()->session->get( 'customer' ); - } - - /** - * Get the user's chosen shipping method. - * - * @return array - */ - public static function get_chosen_shipping_methods(): array { - return WC()->session->get( 'chosen_shipping_methods' ); - } - - /** - * Get the "Tax Based On" WooCommerce option. - * - * @return string base or billing - */ - public static function get_tax_based_on(): string { - return get_option( 'woocommerce_tax_based_on' ); - } - - /** - * Set the the current customer's billing details in the session. - * - * @param $customer_details - */ - public static function set_customer_details( $customer_details ) { - WC()->session->set( 'customer', array_map( 'strval', $customer_details ) ); - } - - /** - * Set the user's chosen shipping method. - * - * @param $chosen_shipping_methods - */ - public static function set_chosen_shipping_methods( $chosen_shipping_methods ) { - WC()->session->set( 'chosen_shipping_methods', $chosen_shipping_methods ); - } - - /** - * Set the "Tax Based On" WooCommerce option. - * - * @param string $default_shipping_method Shipping Method slug - */ - public static function set_tax_based_on( $default_shipping_method ) { - update_option( 'woocommerce_tax_based_on', $default_shipping_method ); - } - - /** - * Indicate whether to save or not. - * - * @return bool - */ - public function save(): bool { - return true; - } -} diff --git a/tests/framework/helpers/woocommerce/customer/interface-krokedil-customer.php b/tests/framework/helpers/woocommerce/customer/interface-krokedil-customer.php deleted file mode 100644 index ec8ee48f..00000000 --- a/tests/framework/helpers/woocommerce/customer/interface-krokedil-customer.php +++ /dev/null @@ -1,15 +0,0 @@ - 0, - 'variation_id' => 0, - 'quantity' => 1, - 'tax_class' => '', - 'subtotal' => 0, - 'subtotal_tax' => 0, - 'total' => 0, - 'total_tax' => 0, - 'taxes' => [ - 'subtotal' => [], - 'total' => [], - ], - ]; - - /** - * Krokedil_Order_item_Product constructor. - * - * @param array $data order data. - */ - public function __construct( $data = [] ) { - $this->data = wp_parse_args( $data, $this->data ); - } - - - /** - * Indicate whether to save or not. - * - * @return bool - */ - public function save(): bool { - return true; - } - - /** - * Creates order item. - */ - public function create(): WC_Order_Item_Product { - $item = new WC_Order_Item_Product(); - $item->set_props( $this->data ); - if ( $this->save() ) { - $item->save(); - } - return $item; - } -} diff --git a/tests/framework/helpers/woocommerce/order/class-krokedil-order-item-shipping.php b/tests/framework/helpers/woocommerce/order/class-krokedil-order-item-shipping.php deleted file mode 100644 index 77029be1..00000000 --- a/tests/framework/helpers/woocommerce/order/class-krokedil-order-item-shipping.php +++ /dev/null @@ -1,64 +0,0 @@ - '', - 'method_id' => '', - 'instance_id' => '', - 'total' => 0, - 'total_tax' => 0, - 'taxes' => array( - 'total' => array(), - ), - ]; - - /** - * Item shipping. - * - * @var WC_Order_Item_Shipping $order_item_shipping item shipping. - */ - protected $order_item_shipping = null; - - /** - * Krokedil_Order_Item_Shipping constructor. - * - * @param array $data data. - */ - public function __construct( array $data = [] ) { - $this->data = wp_parse_args( $data, $this->data ); - $this->order_item_shipping = new WC_Order_Item_Shipping(); - $this->order_item_shipping->set_props( $this->data ); - } - - /** - * Returns data. - * - * @return array - */ - public function get_data(): array { - return $this->data; - } - - /** - * Returns order item shipping. - * - * @return WC_Order_Item_Shipping - */ - public function get_order_items_shipping(): WC_Order_Item_Shipping { - return $this->order_item_shipping; - } -} diff --git a/tests/framework/helpers/woocommerce/order/class-krokedil-order.php b/tests/framework/helpers/woocommerce/order/class-krokedil-order.php deleted file mode 100644 index 32a08f4e..00000000 --- a/tests/framework/helpers/woocommerce/order/class-krokedil-order.php +++ /dev/null @@ -1,264 +0,0 @@ - null, - 'customer_id' => null, - 'customer_note' => null, - 'parent' => null, - 'created_via' => null, - 'cart_hash' => null, - 'order_id' => 0, - 'first_name' => 'Elkrokedilo', - 'last_name' => 'Krokedil', - 'company' => 'Code pursuit', - 'address1' => 'Super address 1', - 'address2' => '', - 'city' => 'Arvika', - 'state' => 'SE', - 'postcode' => 12345, - 'country' => 'RS', - 'emial' => 'mail@mail.com', - 'phone' => '555-32123', - ]; - - /** - * Totals - * - * @var array key value pair - */ - - protected $totals = [ - 'shipping_total' => 10, - 'discount_total' => 0, - 'discount_tax' => 0, - 'cart_tax' => 0, - 'shipping_tax' => 0, - 'total' => 50, - ]; - - /** - * Product. - * - * @var WC_Product|null - */ - protected $product = null; - - /** - * Customer - * - * @var WC_Customer|null $customer customer. - */ - protected $customer = null; - - /** - * Items. - * - * @var array $product_items items. - */ - protected $product_items = null; - - /** - * Rate - * - * @var WC_Shipping_Rate $rate rate - */ - protected $rate = null; - - /** - * Item - * - * @var array $items items - */ - protected $items = []; - - /** - * Krokedil_Order constructor. - * - * @param WC_Product $product product. - * @param WC_Customer $customer customer. - * @param array $items items. - * @param array $data data. - * @param null $rate rate. - */ - public function __construct( $product = null, $customer = null, array $items = [], $data = [], $rate = null ) { - $this->set_product( $product ); - $this->set_customer( $customer ); - $this->set_data( $data ); - $this->set_rate( $rate ); - $this->items = $items; - Krokedil_WC_Shipping::create_simple_flat_rate(); - } - - /** - * Sets customer. - * - * @param WC_Customer $customer customer. - */ - private function set_customer( $customer ) { - if ( null === $customer || ! $customer instanceof WC_Customer ) { - try { - $this->customer = ( new Krokedil_Customer() )->create(); - } catch ( Exception $e ) { - exit( $e->getMessage() ); // phpcs:ignore - } - return; - } - $this->customer = $customer; - } - - /** - * Sets an product. - * - * @param WC_Product $product product. - */ - private function set_product( $product ) { - if ( null === $product || ! ( $product instanceof WC_Product ) ) { - $this->product = ( new Krokedil_Simple_Product( - [ - 'name' => 'Simple product name', - 'regular_price' => 10, - 'sale_price' => 9, - ] - ) )->create(); - return; - } - $this->product = $product; - } - - /** - * Sets rate - * - * @param WC_Shipping_Rate $rate rate. - */ - private function set_rate( $rate ) { - if ( null === $rate || ! $rate instanceof WC_Shipping_Rate ) { - $this->rate = ( new Krokedil_Shipping_Rate() )->get_shipping_rate(); - } - } - - /** - * Set order items. - * - * @param array $items items. - */ - private function set_items( $items ) { - if ( ! empty( $items ) ) { - $this->items = $items; - } - } - - - - /** - * Sets order data - * - * @param array $data data. - */ - private function set_data( $data ) { - $this->data = wp_parse_args( $data, $this->data ); - } - - /** - * Sets product item - * - * @param array $product_items items. - */ - private function set_product_items( array $product_items ) { - if ( empty( $product_items ) ) { - $this->product_items[] = ( new Krokedil_Order_Item_Product( - [ - 'product' => $this->product, - 'quantity' => 4, - 'subtotal' => wc_get_price_excluding_tax( $this->product, array( 'qty' => 4 ) ), - 'total' => wc_get_price_excluding_tax( $this->product, array( 'qty' => 4 ) ), - ] - ) )->create(); - } else { - foreach ( $product_items as $item ) { - $item->save(); - $this->product_items[] = $item; - } - } - } - - /** - * List of order statuses. - * - * @return array - */ - public function get_statuses(): array { - return Krokedil_Order_Status::STATUSES; - } - - /** - * Return order id. - * - * @return int - */ - public function get_order_id(): int { - return $this->data['order_id']; - } - - /** - * Return order id. - * - * @return int - */ - public function get_customer_id(): int { - return $this->data['customer_id']; - } - - /** - * Indicate whether to save or not. - */ - public function save(): bool { - return true; - } - - /** - * Creates order. - * - * @return WC_Order - */ - public function create(): WC_Order { - $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; // Required, else wc_create_order throws an exception. - /** - * Order - * - * @var WC_Order $order - */ - $order = wc_create_order( $this->data ); - foreach ( $this->items as $item ) { - $order->add_item( $item ); - } - $payment_gateways = WC()->payment_gateways->payment_gateways(); - $order->set_payment_method( $payment_gateways['bacs'] ); - // Totals. - foreach ( $this->totals as $key => $value ) { - $order->{"set_$key"}( $value ); - } - $order->save(); - return $order; - } -} diff --git a/tests/framework/helpers/woocommerce/order/class-krokedil-shipping-rate.php b/tests/framework/helpers/woocommerce/order/class-krokedil-shipping-rate.php deleted file mode 100644 index f2c10d30..00000000 --- a/tests/framework/helpers/woocommerce/order/class-krokedil-shipping-rate.php +++ /dev/null @@ -1,86 +0,0 @@ - '', - 'method_id' => '', - 'instance_id' => 0, - 'label' => '', - 'cost' => 0, - 'taxes' => array(), - ); - - /** - * Shipping rate - * - * @var WC_Shipping_Rate $shipping_rate - */ - protected $shipping_rate = null; - - /** - * Shipping taxes - * - * @var array $shipping_taxes taxes. - */ - protected $shipping_taxes = null; - - /** - * Krokedil_Shipping_Rate constructor. - * - * @param array $data data. - * @param array $shipping_taxes taxes. - */ - public function __construct( array $data = [], array $shipping_taxes = [] ) { - $this->data = wp_parse_args( $data, $this->data ); - $this->set_shipping_taxes( $shipping_taxes ); - $this->set_shipping_rate(); - } - - /** - * Sets taxes. - * - * @param array $shipping_taxes taxes. - */ - private function set_shipping_taxes( $shipping_taxes ) { - if ( empty( $shipping_taxes ) ) { - $this->shipping_taxes = WC_Tax::calc_shipping_tax( '10', WC_Tax::get_shipping_tax_rates() ); - } else { - $this->shipping_rate = $shipping_taxes; - } - } - - /** - * Sets shipping rate. - */ - private function set_shipping_rate() { - $id = 'flat_rate_shipping'; - $label = 'Flat rate shipping'; - $flat_rate = 'flat_rate'; - $this->shipping_rate = new WC_Shipping_Rate( $id, $label, $this->shipping_taxes, $flat_rate ); - } - - /** - * Returns shipping rate. - */ - public function get_shipping_rate() :WC_Shipping_Rate { - if ( null !== $this->shipping_rate ) { - return $this->shipping_rate; - } - - return null; - } -} diff --git a/tests/framework/helpers/woocommerce/order/interface-krokedil-order-item-product.php b/tests/framework/helpers/woocommerce/order/interface-krokedil-order-item-product.php deleted file mode 100644 index 6fbbbdfe..00000000 --- a/tests/framework/helpers/woocommerce/order/interface-krokedil-order-item-product.php +++ /dev/null @@ -1,30 +0,0 @@ -get_meta( 'extra' ); - } - - /** - * @param $extra - */ - public function set_extra( $extra ) { - $this->add_meta_data( 'extra', $extra, true ); - } -} \ No newline at end of file diff --git a/tests/framework/helpers/woocommerce/product/abstract-class-krokedil-product-helper.php b/tests/framework/helpers/woocommerce/product/abstract-class-krokedil-product-helper.php deleted file mode 100644 index 40911036..00000000 --- a/tests/framework/helpers/woocommerce/product/abstract-class-krokedil-product-helper.php +++ /dev/null @@ -1,90 +0,0 @@ - 'Default product name', - 'slug' => '', - 'date_created' => null, - 'date_modified' => null, - 'status' => false, - 'featured' => false, - 'catalog_visibility' => 'visible', - 'description' => '', - 'short_description' => '', - 'sku' => '', - 'price' => '', - 'regular_price' => '150', - 'sale_price' => '100', - 'date_on_sale_from' => null, - 'date_on_sale_to' => null, - 'total_sales' => '0', - 'tax_status' => 'taxable', - 'tax_class' => '', - 'manage_stock' => false, - 'stock_quantity' => null, - 'stock_status' => 'instock', - 'backorders' => 'no', - 'low_stock_amount' => '', - 'sold_individually' => false, - 'weight' => '', - 'length' => '', - 'width' => '', - 'height' => '', - 'upsell_ids' => [], - 'cross_sell_ids' => [], - 'parent_id' => 0, - 'reviews_allowed' => true, - 'purchase_note' => '', - 'attributes' => [], - 'default_attributes' => [], - 'menu_order' => 0, - 'post_password' => '', - 'virtual' => false, - 'downloadable' => false, - 'category_ids' => [], - 'tag_ids' => [], - 'shipping_class_id' => 0, - 'downloads' => [], - 'image_id' => '', - 'gallery_image_ids' => [], - 'download_limit' => -1, - 'download_expiry' => -1, - 'rating_counts' => [], - 'average_rating' => 0, - 'review_count' => 0, - ]; - - /** - * AKrokedil_WC_Product_Helper constructor. - * - * @param array $data data. - */ - public function __construct( array $data = [] ) { - $this->data = wp_parse_args( $data, $this->data ); - } - - /** - * Returns data. - * - * @return array data. - */ - final public function get_data() : array { - return $this->data; - } -} diff --git a/tests/framework/helpers/woocommerce/product/class-krokedil-external-product.php b/tests/framework/helpers/woocommerce/product/class-krokedil-external-product.php deleted file mode 100644 index 76d0f3d5..00000000 --- a/tests/framework/helpers/woocommerce/product/class-krokedil-external-product.php +++ /dev/null @@ -1 +0,0 @@ -set_props( $this->get_data() ); if ( $this->save() ) { $wc_product->save(); return wc_get_product( $wc_product ); } return $wc_product; } } \ No newline at end of file diff --git a/tests/framework/helpers/woocommerce/product/class-krokedil-grouped-product.php b/tests/framework/helpers/woocommerce/product/class-krokedil-grouped-product.php deleted file mode 100644 index cf997130..00000000 --- a/tests/framework/helpers/woocommerce/product/class-krokedil-grouped-product.php +++ /dev/null @@ -1 +0,0 @@ -simple_products [] = ( new Krokedil_Simple_Product( [ 'name' => 'Simple product', 'regular_price' => 200, 'sale_price' => 150, ] ) )->create(); } else { $this->simple_products = $simple_products; } } /** * Indicate whether to save or not. * * @return bool */ public function save(): bool { return true; } /** * Creates a grouped product * * @return WC_Product_Grouped product. */ public function create(): WC_Product { $wc_product = new WC_Product_Grouped(); $wc_product->set_props( $this->get_data() ); foreach ( $this->simple_products as $simple_product ) { $simple_product->save(); } $wc_product->set_children( array_map( static function ( $simple_product ) { /** * Product * * @var WC_Product_Simple $simple_product */ return $simple_product->get_id(); }, $this->simple_products ) ); if ( $this->save() ) { $wc_product->save(); return wc_get_product( $wc_product ); } return $wc_product; } } \ No newline at end of file diff --git a/tests/framework/helpers/woocommerce/product/class-krokedil-product-attribute.php b/tests/framework/helpers/woocommerce/product/class-krokedil-product-attribute.php deleted file mode 100644 index 89b40b6f..00000000 --- a/tests/framework/helpers/woocommerce/product/class-krokedil-product-attribute.php +++ /dev/null @@ -1,175 +0,0 @@ -name = $name; - $this->terms = $terms; - $this->init_data(); - } - - /** - * Init data attributes - */ - public function init_data() { - if ( ! empty( $this->name ) && ! empty( $this->terms ) ) { - $this->attribute_data = self::create_attribute( $this->name, $this->terms ); - } else { - $this->attribute_data = self::create_attribute(); - } - $this->product_attribute = new WC_Product_Attribute(); - $this->product_attribute->set_id( $this->attribute_data['attribute_id'] ); - $this->product_attribute->set_name( $this->attribute_data['attribute_taxonomy'] ); - $this->product_attribute->set_options( $this->attribute_data['term_ids'] ); - $this->product_attribute->set_position( 1 ); - $this->product_attribute->set_visible( true ); - $this->product_attribute->set_variation( true ); - } - - /** - * Returns product attribute. - * - * @return WC_Product_Attribute - */ - public function get_product_attribute(): WC_Product_Attribute { - return $this->product_attribute; - } - - /** - * Create a dummy attribute. - * - * @since 2.3 - * - * @param string $raw_name Name of attribute to create. - * @param array(string) $terms Terms to create for the attribute. - * @return array - */ - public static function create_attribute( $raw_name = 'size', $terms = array( 'small' ) ): array { - /** - * Helps IDE - * - * @var WC_Product_Attribute[] $wc_product_attributes - */ - global $wc_product_attributes; - - // Make sure caches are clean. - delete_transient( 'wc_attribute_taxonomies' ); - if ( method_exists( 'WC_Cache_Helper', 'invalidate_cache_group' ) ) { - WC_Cache_Helper::invalidate_cache_group( 'woocommerce-attributes' ); - } - - // These are exported as labels, so convert the label to a name if possible first. - $attribute_labels = wp_list_pluck( wc_get_attribute_taxonomies(), 'attribute_label', 'attribute_name' ); - $attribute_name = array_search( $raw_name, $attribute_labels, true ); - - if ( ! $attribute_name ) { - $attribute_name = wc_sanitize_taxonomy_name( $raw_name ); - } - - $attribute_id = wc_attribute_taxonomy_id_by_name( $attribute_name ); - - if ( ! $attribute_id ) { - $taxonomy_name = wc_attribute_taxonomy_name( $attribute_name ); - - // Degister taxonomy which other tests may have created... - unregister_taxonomy( $taxonomy_name ); - - $attribute_id = wc_create_attribute( - array( - 'name' => $raw_name, - 'slug' => $attribute_name, - 'type' => 'select', - 'order_by' => 'menu_order', - 'has_archives' => 0, - ) - ); - - // Register as taxonomy. - register_taxonomy( - $taxonomy_name, - apply_filters( 'woocommerce_taxonomy_objects_' . $taxonomy_name, array( 'product' ) ), - apply_filters( - 'woocommerce_taxonomy_args_' . $taxonomy_name, - array( - 'labels' => array( - 'name' => $raw_name, - ), - 'hierarchical' => false, - 'show_ui' => false, - 'query_var' => true, - 'rewrite' => false, - ) - ) - ); - - // Set product attributes global. - $wc_product_attributes = array(); - - foreach ( wc_get_attribute_taxonomies() as $taxonomy ) { - $wc_product_attributes[ wc_attribute_taxonomy_name( $taxonomy->attribute_name ) ] = $taxonomy; - } - } - - $attribute = wc_get_attribute( $attribute_id ); - $return = array( - 'attribute_name' => $attribute->name, - 'attribute_taxonomy' => $attribute->slug, - 'attribute_id' => $attribute_id, - 'term_ids' => array(), - ); - - foreach ( $terms as $term ) { - $result = term_exists( $term, $attribute->slug ); - - if ( ! $result ) { - $result = wp_insert_term( $term, $attribute->slug ); - $return['term_ids'][] = $result['term_id']; - } else { - $return['term_ids'][] = $result['term_id']; - } - } - - return $return; - } -} diff --git a/tests/framework/helpers/woocommerce/product/class-krokedil-simple-product.php b/tests/framework/helpers/woocommerce/product/class-krokedil-simple-product.php deleted file mode 100644 index b7b121ad..00000000 --- a/tests/framework/helpers/woocommerce/product/class-krokedil-simple-product.php +++ /dev/null @@ -1 +0,0 @@ -set_props( $this->data ); if ( $this->save() ) { $wc_product->save(); return wc_get_product( $wc_product ); } return $wc_product; } } \ No newline at end of file diff --git a/tests/framework/helpers/woocommerce/product/class-krokedil-variable-product.php b/tests/framework/helpers/woocommerce/product/class-krokedil-variable-product.php deleted file mode 100644 index 805af8c2..00000000 --- a/tests/framework/helpers/woocommerce/product/class-krokedil-variable-product.php +++ /dev/null @@ -1 +0,0 @@ -set_attributes( $attributes ); $this->set_variations( $variations ); } /** * Indicate whether to save or not. * * @return bool */ public function save(): bool { return true; } /** * Creates attributes if are $attributes is empty * * @param array $attributes attributes. */ private function set_attributes( $attributes ) { if ( empty( $attributes ) ) { $size = ( new Krokedil_Product_Attribute( 'size', [ 'small', 'large', 'huge', ] ) )->get_product_attribute(); $colour = ( new Krokedil_Product_Attribute( 'colour', [ 'red', 'blue', 'green', ] ) )->get_product_attribute(); $this->attributes [] = $size; $this->attributes [] = $colour; } else { $this->attributes = $attributes; } } /** * Sets variations * * @param WC_Product_Variation[] $variations product variations. */ public function set_variations( $variations ) { if ( empty( $variations ) ) { $variation_one = ( new Krokedil_Variation_Product( [ 'sku' => 'DUMMY SKU VARIABLE SMALL', 'regular_price' => 10, ] ) )->create(); $this->variations = $variation_one; } else { $this->variations = $variations; } } /** * Creates a grouped product * * @return WC_Product_Variable product. */ public function create(): WC_Product { $wc_product = new WC_Product_Variable(); $wc_product->set_props( $this->get_data() ); $wc_product->set_attributes( $this->attributes ); foreach ( $this->variations as $variation ) { /** * Product variation * * @var WC_Product_Variation $variation */ $variation->set_parent_id( $wc_product->get_id() ); $variation->save(); } if ( $this->save() ) { $wc_product->save(); return wc_get_product( $wc_product ); } return $wc_product; } } \ No newline at end of file diff --git a/tests/framework/helpers/woocommerce/product/class-krokedil-variation-product.php b/tests/framework/helpers/woocommerce/product/class-krokedil-variation-product.php deleted file mode 100644 index 5810d0ab..00000000 --- a/tests/framework/helpers/woocommerce/product/class-krokedil-variation-product.php +++ /dev/null @@ -1 +0,0 @@ -attributes = [ 'pa_size' => 'small' ]; } else { $this->attributes = $attributes; } } /** * Indicate whether to save or not. * * @return bool */ public function save(): bool { return true; } /** * Creates a grouped product * * @return WC_Product_Variation product. */ public function create(): WC_Product { $wc_product = new WC_Product_Variation(); $wc_product->set_props( $this->get_data() ); $wc_product->set_attributes( $this->attributes ); if ( $this->save() ) { $wc_product->save(); return wc_get_product( $wc_product ); } return $wc_product; } } \ No newline at end of file diff --git a/tests/framework/helpers/woocommerce/product/interface-krokedil-product.php b/tests/framework/helpers/woocommerce/product/interface-krokedil-product.php deleted file mode 100644 index a1a56327..00000000 --- a/tests/framework/helpers/woocommerce/product/interface-krokedil-product.php +++ /dev/null @@ -1,28 +0,0 @@ - 'yes', - 'title' => 'Flat rate', - 'availability' => 'all', - 'countries' => '', - 'tax_status' => 'taxable', - 'cost' => '10', - ); - - update_option( 'woocommerce_flat_rate_settings', $flat_rate_settings ); - update_option( 'woocommerce_flat_rate', array() ); - WC_Cache_Helper::get_transient_version( 'shipping', true ); - WC()->shipping()->load_shipping_methods(); - } - - /** - * Delete the simple flat rate. - * - * @since 2.3 - */ - public static function delete_simple_flat_rate() { - delete_option( 'woocommerce_flat_rate_settings' ); - delete_option( 'woocommerce_flat_rate' ); - WC_Cache_Helper::get_transient_version( 'shipping', true ); - WC()->shipping()->unregister_shipping_methods(); - } -} diff --git a/tests/framework/krokedil/core/abstract-class-krokedil-unit-test-case.php b/tests/framework/krokedil/core/abstract-class-krokedil-unit-test-case.php deleted file mode 100644 index 3963f29f..00000000 --- a/tests/framework/krokedil/core/abstract-class-krokedil-unit-test-case.php +++ /dev/null @@ -1,161 +0,0 @@ -activate_plugins(); - parent::__construct(); - } - - - /** - * List of a plugins. - * - * @var array - */ - public $plugins = array( - // key is a dir and a value is filename.php. - 'woocommerce' => 'woocommerce.php', - ); - - /** - * Activate plugins - * - * @return void - */ - protected function activate_plugins() { - foreach ( $this->plugins as $dir => $plugin_file ) { - // if a plugin is not already active, activate it then. - if ( ! is_plugin_active( self::DS . $dir . self::DS . $plugin_file ) ) { - // activate plugin. - do_action( 'activate_' . self::PLUGIN_BASENAME . self::DS . $dir . self::DS . $plugin_file ); - } - } - } - - /** - * It must be defined as final to prevent overriding in a subclass definition. - * Prepare the environment for the test. - * - * @return void - */ - final public function setUp() { - $this->create(); - $this->update(); - $this->view(); - } - - /** - * Function is called after every test. - * - * @return void - */ - final public function tearDown() { - $this->delete(); - } - - /** - * Crud setter - * - * @param IKrokedil_CRUD $crud concrete class. - * - * @return void - */ - public function set_crud( IKrokedil_CRUD $crud ) { - $this->crud = $crud; - } - - /** - * Helper function for creation user. - * - * @param null $role of the user. - * @param array|null $attributes of the user. - * - * @return WP_User|null - */ - public function create_user( $role = null, array $attributes = null ) { - /** - * New user. - * - * @var $user WP_User|int - */ - $user = null; - if ( empty( $attributes ) ) { - $user = self::factory()->user->create_and_get(); - } else { - $user = self::factory()->user->create( $attributes ); - } - if ( ! empty( $role ) && in_array( $role, self::DEFAULT_WP_ROLES, true ) ) { - $user->set_role( $role ); - } - - return $user; - - } - - /** - * /** - * Create product by type - * - * @param string $type product type. - * @param array $data product data. - * @return WC_Product - */ - public static function create_wc_product( $type, $data ) :WC_Product { - if ( IKrokedilConstants::PRODUCT_SIMPLE === $type ) { - return ( new Krokedil_Simple_Product( $data ) )->create(); - } - // todo add other product types. - } - - /** - * Helper function for creation posts. - * - * @param array $data of the post. - * - * @return void - */ - public function create_post( array $data ) { - self::factory()->post->create( $data ); - } - - /** - * Allows to add plugin on the fly - * - * @param string $plugin_dir plugin directory. - * @param string $plugin_file_name name of plugin file. - * - * @return void - */ - protected function add_plugin( $plugin_dir, $plugin_file_name ) { - if ( ! array_key_exists( $plugin_dir, $this->plugins ) ) { - $this->plugins[ $plugin_dir ] = $plugin_file_name; - $this->activate_plugins(); - } - } -} diff --git a/tests/framework/krokedil/core/class-krokedil-constants.php b/tests/framework/krokedil/core/class-krokedil-constants.php deleted file mode 100644 index be29c428..00000000 --- a/tests/framework/krokedil/core/class-krokedil-constants.php +++ /dev/null @@ -1,40 +0,0 @@ -query( "TRUNCATE TABLE {$table_name}" );// phpcs:ignore - } - - /** - * Get the single class instance. - * - * @since 1.0.0 - * @return Krokedil_DB_Helper - */ - public static function get_instance(): \Krokedil_DB_Helper { - - if ( null === self::$instance ) { - self::$instance = new self(); - } - - return self::$instance; - } - -} diff --git a/tests/framework/krokedil/core/interface-krokedil-wc.php b/tests/framework/krokedil/core/interface-krokedil-wc.php deleted file mode 100644 index b3f0800a..00000000 --- a/tests/framework/krokedil/core/interface-krokedil-wc.php +++ /dev/null @@ -1,26 +0,0 @@ - '$input', - 'version' => '1.0.0', -); -"; -fwrite($config, $content); -fclose($config); - -if (file_exists($filename)) { - echo 'Successfully generated file' . PHP_EOL; -} \ No newline at end of file diff --git a/tests/unit-tests/kco-api-helpers/test-kco-cart-helpers.php b/tests/unit-tests/kco-api-helpers/test-kco-cart-helpers.php deleted file mode 100644 index 78ae5931..00000000 --- a/tests/unit-tests/kco-api-helpers/test-kco-cart-helpers.php +++ /dev/null @@ -1,1124 +0,0 @@ -tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $order_amount_25_inc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $order_amount_12_inc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $order_amount_6_inc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $order_amount_0_inc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // Exclusive tax. - update_option( 'woocommerce_prices_include_tax', 'no' ); - - // 25% exc tax. - $this->settup_cart( '25' ); - $order_amount_25_exc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12' ); - $order_amount_12_exc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6' ); - $order_amount_6_exc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0' ); - $order_amount_0_exc = ( new KCO_Request_Cart() )->get_order_amount(); - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 10000, $order_amount_25_inc, 'get_order_amount 25% inc tax' ); - $this->assertEquals( 10000, $order_amount_12_inc, 'get_order_amount 12% inc tax' ); - $this->assertEquals( 10000, $order_amount_6_inc, 'get_order_amount 6% inc tax' ); - $this->assertEquals( 10000, $order_amount_0_inc, 'get_order_amount 0% inc tax' ); - $this->assertEquals( 12500, $order_amount_25_exc, 'get_order_amount 25% exc tax' ); - $this->assertEquals( 11200, $order_amount_12_exc, 'get_order_amount 12% exc tax' ); - $this->assertEquals( 10600, $order_amount_6_exc, 'get_order_amount 6% exc tax' ); - $this->assertEquals( 10000, $order_amount_0_exc, 'get_order_amount 0% exc tax' ); - } - - /** - * Test KCO_Request_Cart::get_order_tax_amount - * - * @return void - */ - public function test_get_order_tax_amount() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $order_tax_amount_25_inc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $order_tax_amount_12_inc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $order_tax_amount_6_inc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $order_tax_amount_0_inc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $order_tax_amount_25_exc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $order_tax_amount_12_exc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $order_tax_amount_6_exc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $order_tax_amount_0_exc = $this->get_order_tax_amount(); - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 2000, $order_tax_amount_25_inc, 'get_order_tax_amount 25% inc tax' ); - $this->assertEquals( 1071, $order_tax_amount_12_inc, 'get_order_tax_amount 12% inc tax' ); - $this->assertEquals( 566, $order_tax_amount_6_inc, 'get_order_tax_amount 6% inc tax' ); - $this->assertEquals( 0, $order_tax_amount_0_inc, 'get_order_tax_amount 0% inc tax' ); - $this->assertEquals( 2500, $order_tax_amount_25_exc, 'get_order_tax_amount 25% exc tax' ); - $this->assertEquals( 1200, $order_tax_amount_12_exc, 'get_order_tax_amount 12% exc tax' ); - $this->assertEquals( 600, $order_tax_amount_6_exc, 'get_order_tax_amount 6% exc tax' ); - $this->assertEquals( 0, $order_tax_amount_0_exc, 'get_order_tax_amount 0% exc tax' ); - } - - /** - * Test KCO_Request_Cart::get_item_name - * - * @return void - */ - public function test_get_item_name() { - WC()->cart->add_to_cart( $this->simple_product->get_id(), 1 ); - WC()->cart->calculate_totals(); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $name = ( new KCO_Request_Cart() )->get_item_name( $cart_item ); - $this->assertEquals( 'Default product name', $name ); - } - WC()->cart->empty_cart(); - } - - /** - * Test KCO_Request_Cart::get_item_quantity - * - * @return void - */ - public function test_get_item_quantity() { - WC()->cart->add_to_cart( $this->simple_product->get_id(), 1 ); - WC()->cart->calculate_totals(); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $quantity = ( new KCO_Request_Cart() )->get_item_quantity( $cart_item ); - $this->assertEquals( 1, $quantity ); - } - WC()->cart->empty_cart(); - } - - /** - * Test KCO_Request_Cart::get_item_unit_price - * - * @return void - */ - public function test_get_item_unit_price() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_25_inc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_12_inc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_6_inc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_0_inc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_25_exc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_12_exc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_6_exc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $item_price_0_exc = $cart_helper->get_item_price( $cart_item ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 10000, $item_price_25_inc, 'get_order_tax_amount 25% inc tax' ); - $this->assertEquals( 10000, $item_price_12_inc, 'get_order_tax_amount 12% inc tax' ); - $this->assertEquals( 10000, $item_price_6_inc, 'get_order_tax_amount 6% inc tax' ); - $this->assertEquals( 10000, $item_price_0_inc, 'get_order_tax_amount 0% inc tax' ); - $this->assertEquals( 12500, $item_price_25_exc, 'get_order_tax_amount 25% exc tax' ); - $this->assertEquals( 11200, $item_price_12_exc, 'get_order_tax_amount 12% exc tax' ); - $this->assertEquals( 10600, $item_price_6_exc, 'get_order_tax_amount 6% exc tax' ); - $this->assertEquals( 10000, $item_price_0_exc, 'get_order_tax_amount 0% exc tax' ); - } - - /** - * Test KCO_Request_Cart::get_item_tax_rate - * - * @return void - */ - public function test_get_item_tax_rate() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_25_inc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_12_inc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_6_inc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_0_inc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_25_exc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_12_exc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_6_exc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_rate_0_exc = ( new KCO_Request_Cart() )->get_item_tax_rate( $cart_item, $product ); - } - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 2500, $item_tax_rate_25_inc, 'get_item_tax_rate 25% inc tax' ); - $this->assertEquals( 1200, $item_tax_rate_12_inc, 'get_item_tax_rate 12% inc tax' ); - $this->assertEquals( 600, $item_tax_rate_6_inc, 'get_item_tax_rate 6% inc tax' ); - $this->assertEquals( 0, $item_tax_rate_0_inc, 'get_item_tax_rate 0% inc tax' ); - $this->assertEquals( 2500, $item_tax_rate_25_exc, 'get_item_tax_rate 25% exc tax' ); - $this->assertEquals( 1200, $item_tax_rate_12_exc, 'get_item_tax_rate 12% exc tax' ); - $this->assertEquals( 600, $item_tax_rate_6_exc, 'get_item_tax_rate 6% exc tax' ); - $this->assertEquals( 0, $item_tax_rate_0_exc, 'get_item_tax_rate 0% exc tax' ); - - } - - /** - * Test KCO_Request_Cart::get_item_total_amount - * - * @return void - */ - public function test_get_item_total_amount() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_25_inc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_12_inc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_6_inc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_0_inc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_25_exc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_12_exc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_6_exc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_total_amount_0_exc = $cart_helper->get_item_total_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 10000, $item_total_amount_25_inc, 'get_item_total_amount 25% inc tax' ); - $this->assertEquals( 10000, $item_total_amount_12_inc, 'get_item_total_amount 12% inc tax' ); - $this->assertEquals( 10000, $item_total_amount_6_inc, 'get_item_total_amount 6% inc tax' ); - $this->assertEquals( 10000, $item_total_amount_0_inc, 'get_item_total_amount 0% inc tax' ); - $this->assertEquals( 12500, $item_total_amount_25_exc, 'get_item_total_amount 25% exc tax' ); - $this->assertEquals( 11200, $item_total_amount_12_exc, 'get_item_total_amount 12% exc tax' ); - $this->assertEquals( 10600, $item_total_amount_6_exc, 'get_item_total_amount 6% exc tax' ); - $this->assertEquals( 10000, $item_total_amount_0_exc, 'get_item_total_amount 0% exc tax' ); - - } - - /** - * Test KCO_Request_Cart::get_item_tax_amount - * - * @return void - */ - public function test_get_item_tax_amount() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_25_inc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_12_inc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_6_inc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_0_inc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_25_exc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_12_exc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_6_exc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0' ); - $cart_items = WC()->cart->get_cart(); - $cart_helper = new KCO_Request_Cart(); - $cart_helper->process_cart(); - foreach ( $cart_items as $cart_item ) { - $product = $this->get_product( $cart_item ); - $item_tax_amount_0_exc = $cart_helper->get_item_tax_amount( $cart_item, $product ); - } - $cart_helper = null; - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 2000, $item_tax_amount_25_inc, 'get_item_tax_amount 25% inc tax' ); - $this->assertEquals( 1071, $item_tax_amount_12_inc, 'get_item_tax_amount 12% inc tax' ); - $this->assertEquals( 566, $item_tax_amount_6_inc, 'get_item_tax_amount 6% inc tax' ); - $this->assertEquals( 0, $item_tax_amount_0_inc, 'get_item_tax_amount 0% inc tax' ); - $this->assertEquals( 2500, $item_tax_amount_25_exc, 'get_item_tax_amount 25% exc tax' ); - $this->assertEquals( 1200, $item_tax_amount_12_exc, 'get_item_tax_amount 12% exc tax' ); - $this->assertEquals( 600, $item_tax_amount_6_exc, 'get_item_tax_amount 6% exc tax' ); - $this->assertEquals( 0, $item_tax_amount_0_exc, 'get_item_tax_amount 0% exc tax' ); - } - - /** - * Test KCO_Request_Cart::get_shipping_name - * - * @return void - */ - public function test_get_shipping_name() { - WC()->cart->add_to_cart( $this->simple_product->get_id(), 1 ); - $this->create_shipping_method(); - WC()->session->set( 'chosen_shipping_methods', array( 'flat_rate' ) ); - WC()->cart->calculate_totals(); - $shipping_name = ( new KCO_Request_Cart() )->get_shipping_name(); - - // Clear data. - WC()->session->set( 'chosen_shipping_methods', array( '' ) ); - $this->delete_shipping_method(); - - // Assertion. - $this->assertEquals( 'Flat rate', $shipping_name, 'get_shipping_name' ); - } - - /** - * Test KCO_Request_Cart::get_shipping_amount - * - * @return void - */ - public function test_get_shipping_amount() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - // Create shipping method. - $this->create_shipping_method(); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25', 'flat_rate' ); - $shipping_amount_25_inc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12', 'flat_rate' ); - $shipping_amount_12_inc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6', 'flat_rate' ); - $shipping_amount_6_inc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0', 'flat_rate' ); - $shipping_amount_0_inc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25', 'flat_rate' ); - $shipping_amount_25_exc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12', 'flat_rate' ); - $shipping_amount_12_exc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6', 'flat_rate' ); - $shipping_amount_6_exc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0', 'flat_rate' ); - $shipping_amount_0_exc = ( new KCO_Request_Cart() )->get_shipping_amount(); - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 1000, $shipping_amount_25_inc, 'get_shipping_amount 25% inc tax' ); - $this->assertEquals( 1120, $shipping_amount_12_inc, 'get_shipping_amount 12% inc tax' ); - $this->assertEquals( 1060, $shipping_amount_6_inc, 'get_shipping_amount 6% inc tax' ); - $this->assertEquals( 1000, $shipping_amount_0_inc, 'get_shipping_amount 0% inc tax' ); - $this->assertEquals( 1250, $shipping_amount_25_exc, 'get_shipping_amount 25% exc tax' ); - $this->assertEquals( 1120, $shipping_amount_12_exc, 'get_shipping_amount 12% exc tax' ); - $this->assertEquals( 1060, $shipping_amount_6_exc, 'get_shipping_amount 6% exc tax' ); - $this->assertEquals( 1000, $shipping_amount_0_exc, 'get_shipping_amount 0% exc tax' ); - } - - /** - * Test KCO_Request_Cart::get_shipping_tax_amount - * - * @return void - */ - public function test_get_shipping_tax_amount() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - // Create shipping method. - $this->create_shipping_method(); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25', 'flat_rate' ); - $shipping_tax_amount_25_inc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12', 'flat_rate' ); - $shipping_tax_amount_12_inc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6', 'flat_rate' ); - $shipping_tax_amount_6_inc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0', 'flat_rate' ); - $shipping_tax_amount_0_inc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25', 'flat_rate' ); - $shipping_tax_amount_25_exc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12', 'flat_rate' ); - $shipping_tax_amount_12_exc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6', 'flat_rate' ); - $shipping_tax_amount_6_exc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0', 'flat_rate' ); - $shipping_tax_amount_0_exc = ( new KCO_Request_Cart() )->get_shipping_tax_amount(); - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 250, $shipping_tax_amount_25_inc, 'get_shipping_tax_amount 25% inc tax' ); - $this->assertEquals( 120, $shipping_tax_amount_12_inc, 'get_shipping_tax_amount 12% inc tax' ); - $this->assertEquals( 60, $shipping_tax_amount_6_inc, 'get_shipping_tax_amount 6% inc tax' ); - $this->assertEquals( 0, $shipping_tax_amount_0_inc, 'get_shipping_tax_amount 0% inc tax' ); - $this->assertEquals( 250, $shipping_tax_amount_25_exc, 'get_shipping_tax_amount 25% exc tax' ); - $this->assertEquals( 120, $shipping_tax_amount_12_exc, 'get_shipping_tax_amount 12% exc tax' ); - $this->assertEquals( 60, $shipping_tax_amount_6_exc, 'get_shipping_tax_amount 6% exc tax' ); - $this->assertEquals( 0, $shipping_tax_amount_0_exc, 'get_shipping_tax_amount 0% exc tax' ); - } - - /** - * Test KCO_Request_Cart::get_shipping_tax_rate - * - * @return void - */ - public function test_get_shipping_tax_rate() { - // Create tax rates. - $this->tax_rate_ids[] = $this->create_tax_rate( '25' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '12' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '6' ); - $this->tax_rate_ids[] = $this->create_tax_rate( '0' ); - - // Create shipping method. - $this->create_shipping_method(); - - update_option( 'woocommerce_prices_include_tax', 'yes' ); - // 25% inc tax. - $this->settup_cart( '25', 'flat_rate' ); - $shipping_tax_rate_25_inc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // 12% inc tax. - $this->settup_cart( '12', 'flat_rate' ); - $shipping_tax_rate_12_inc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // 6% inc tax. - $this->settup_cart( '6', 'flat_rate' ); - $shipping_tax_rate_6_inc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // 0% inc tax. - $this->settup_cart( '0', 'flat_rate' ); - $shipping_tax_rate_0_inc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - update_option( 'woocommerce_prices_include_tax', 'no' ); - // 25% exc tax. - $this->settup_cart( '25', 'flat_rate' ); - $shipping_tax_rate_25_exc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // 12% exc tax. - $this->settup_cart( '12', 'flat_rate' ); - $shipping_tax_rate_12_exc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // 6% exc tax. - $this->settup_cart( '6', 'flat_rate' ); - $shipping_tax_rate_6_exc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // 0% exc tax. - $this->settup_cart( '0', 'flat_rate' ); - $shipping_tax_rate_0_exc = ( new KCO_Request_Cart() )->get_shipping_tax_rate(); - WC()->cart->empty_cart(); - - // Clear data. - foreach ( $this->tax_rate_ids as $tax_rate_id ) { - WC_Tax::_delete_tax_rate( $tax_rate_id ); - } - $this->tax_rate_ids = null; - - // Assertions. - $this->assertEquals( 2500, $shipping_tax_rate_25_inc, 'get_shipping_tax_rate 25% inc tax' ); - $this->assertEquals( 1200, $shipping_tax_rate_12_inc, 'get_shipping_tax_rate 12% inc tax' ); - $this->assertEquals( 600, $shipping_tax_rate_6_inc, 'get_shipping_tax_rate 6% inc tax' ); - $this->assertEquals( 0, $shipping_tax_rate_0_inc, 'get_shipping_tax_rate 0% inc tax' ); - $this->assertEquals( 2500, $shipping_tax_rate_25_exc, 'get_shipping_tax_rate 25% exc tax' ); - $this->assertEquals( 1200, $shipping_tax_rate_12_exc, 'get_shipping_tax_rate 12% exc tax' ); - $this->assertEquals( 600, $shipping_tax_rate_6_exc, 'get_shipping_tax_rate 6% exc tax' ); - $this->assertEquals( 0, $shipping_tax_rate_0_exc, 'get_shipping_tax_rate 0% exc tax' ); - } - - /** - * Creates data for tests. - * - * @return void - */ - public function create() { - $settings = array( - 'enabled' => 'yes', - 'title' => 'Klarna', - 'description' => '', - 'select_another_method_text' => '', - 'testmode' => 'yes', - 'logging' => 'yes', - 'credentials_eu' => '', - 'merchant_id_eu' => '', - 'shared_secret_eu' => '', - 'test_merchant_id_eu' => '', - 'test_shared_secret_eu' => '', - 'credentials_us' => '', - 'merchant_id_us' => '', - 'shared_secret_us' => '', - 'test_merchant_id_us' => '', - 'test_shared_secret_us' => '', - 'shipping_section' => '', - 'allow_separate_shipping' => 'no', - // 'shipping_methods_in_iframe' => 'no', - 'shipping_methods_in_iframe' => 'yes', - 'shipping_details' => '', - 'checkout_section' => '', - 'send_product_urls' => 'yes', - 'dob_mandatory' => 'no', - 'display_privacy_policy_text' => 'no', - 'add_terms_and_conditions_checkbox' => 'no', - 'allowed_customer_types' => 'B2C', - 'title_mandatory' => 'yes', - 'prefill_consent' => 'yes', - 'quantity_fields' => 'no', - 'color_settings_title' => '', - 'color_button' => '', - 'color_button_text' => '', - 'color_checkbox' => '', - 'color_checkbox_checkmark' => '', - 'color_header' => '', - 'color_link' => '', - 'radius_border' => '', - ); - - $this->simple_product = ( new Krokedil_Simple_Product() )->create(); - - // Default settings. - update_option( 'woocommerce_calc_taxes', 'yes' ); - update_option( 'woocommerce_kco_settings', $settings ); - update_option( 'woocommerce_currency', 'SEK' ); - update_option( 'woocommerce_allowed_countries', 'specific' ); - update_option( 'woocommerce_specific_allowed_countries', array( 'SE' ) ); - - // Create cart. - add_filter( 'woocommerce_customer_get_shipping_country', array( $this, 'set_shipping_country' ) ); - add_filter( 'woocommerce_customer_get_shipping_postcode', array( $this, 'set_shipping_postcode' ) ); - - WC()->customer->set_billing_country( 'SE' ); - } - - /** - * Updates data for tests. - * - * @return void - */ - public function update() { - return; - } - - /** - * Gets data for tests. - * - * @return void - */ - public function view() { - return; - } - - /** - * Resets needed data for tests. - * - * @return void - */ - public function delete() { - $this->simple_product->delete(); - $this->simple_product = null; - } - - /** - * Helper to create tax rates and class. - * - * @param string $rate The tax rate. - * @return int - */ - public function create_tax_rate( $rate ) { - // Create the tax class. - WC_Tax::create_tax_class( "${rate}percent", "${rate}percent" ); - - // Set tax data. - $tax_data = array( - 'tax_rate_country' => '', - 'tax_rate_state' => '', - 'tax_rate' => $rate, - 'tax_rate_name' => "Vat $rate", - 'tax_rate_priority' => 1, - 'tax_rate_compound' => 0, - 'tax_rate_shipping' => 1, - 'tax_rate_order' => 1, - 'tax_rate_class' => "${rate}percent", - ); - return WC_Tax::_insert_tax_rate( $tax_data ); - } - - /** - * Force set shipping country. - * - * @return string - */ - public function set_shipping_country() { - return 'SE'; - } - - /** - * Force set shipping postcode. - * - * @return string - */ - public function set_shipping_postcode() { - return '12345'; - } - - /** - * Create shipping method helper function. - * - * @return void - */ - public function create_shipping_method() { - Krokedil_WC_Shipping::create_simple_flat_rate(); - } - - /** - * Delete shipping method helper function. - * - * @return void - */ - public function delete_shipping_method() { - Krokedil_WC_Shipping::delete_simple_flat_rate(); - } - - /** - * Helper function for test_get_order_tax_amount - * - * @return int - */ - public function get_order_tax_amount() { - // Process cart data. - $helper = new KCO_Request_Cart(); - $helper->process_data(); - - // Get data. - $order_lines = $helper->get_order_lines(); - $order_tax_amount = $helper->get_order_tax_amount( $order_lines ); - - return $order_tax_amount; - } - - /** - * Helper function to get product from cart item. - * - * @param array $cart_item The WooCommerce cart item. - * @return WC_Product - */ - public function get_product( $cart_item ) { - if ( $cart_item['variation_id'] ) { - $product = wc_get_product( $cart_item['variation_id'] ); - } else { - $product = wc_get_product( $cart_item['product_id'] ); - } - - return $product; - } - - /** - * Sets up the cart for the test. - * - * @param string $tax_rate The tax rate to be used. - * @param string|bool $shipping The shipping to be used. - * @return void - */ - public function settup_cart( $tax_rate, $shipping = false ) { - $this->simple_product->set_tax_class( $tax_rate . 'percent' ); - $this->simple_product->save(); - WC()->cart->add_to_cart( $this->simple_product->get_id(), 1 ); - if ( false !== $shipping ) { - WC()->session->set( 'chosen_shipping_methods', array( $shipping ) ); - } - WC()->cart->calculate_totals(); - } -} From 932e74a580b2ce19dd825cb9c8e2f754902dee63 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 13:50:50 +0200 Subject: [PATCH 12/23] Update e2e_tests.yml --- .github/workflows/e2e_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml index 4f5315a7..6affe985 100644 --- a/.github/workflows/e2e_tests.yml +++ b/.github/workflows/e2e_tests.yml @@ -2,7 +2,7 @@ name: E2E tests on: push: branches: - - develop-e2e-v2 + - develop jobs: test-plugin: name: Run E2E Tests From 505764e4e48aedefcd7283493d0b203ecc115376 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 14:29:07 +0200 Subject: [PATCH 13/23] PHPCS fix --- classes/class-kco-api.php | 1 + classes/class-kco-templates.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/class-kco-api.php b/classes/class-kco-api.php index a01a4c0e..e4aabf74 100644 --- a/classes/class-kco-api.php +++ b/classes/class-kco-api.php @@ -18,6 +18,7 @@ class KCO_API { /** * Creates a Klarna Checkout order. * + * @param int $order_id The WooCommerce order id. * @return mixed */ public function create_klarna_order( $order_id = false ) { diff --git a/classes/class-kco-templates.php b/classes/class-kco-templates.php index 3709d449..f8302532 100644 --- a/classes/class-kco-templates.php +++ b/classes/class-kco-templates.php @@ -129,7 +129,8 @@ public function override_template( $template, $template_name ) { } if ( 'kco' === $order->get_payment_method() ) { - if ( ! isset( $_GET['confirm'] ) ) { + $confirm = filter_input( INPUT_GET, 'confirm', FILTER_SANITIZE_STRING ); + if ( empty( $confirm ) ) { $template = $klarna_checkout_template; } } From 29932163ad9b5b87cb44e3795e7711c65d01ec02 Mon Sep 17 00:00:00 2001 From: MichaelBengtsson Date: Mon, 16 Aug 2021 14:35:30 +0200 Subject: [PATCH 14/23] Fix nonce issue --- classes/class-kco-templates.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/class-kco-templates.php b/classes/class-kco-templates.php index f8302532..c353287f 100644 --- a/classes/class-kco-templates.php +++ b/classes/class-kco-templates.php @@ -139,7 +139,7 @@ public function override_template( $template, $template_name ) { if ( empty( $order->get_payment_method() ) ) { reset( $available_gateways ); if ( 'kco' === key( $available_gateways ) ) { - if ( ! isset( $_GET['confirm'] ) ) { + if ( empty( $confirm ) ) { $template = $klarna_checkout_template; } } From 72f0aec055b8ae6c55d18a419584be911184ead8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20H=C3=B6gefjord?= Date: Wed, 25 Aug 2021 11:52:57 +0200 Subject: [PATCH 15/23] PHP notice fix --- classes/class-kco-checkout.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/class-kco-checkout.php b/classes/class-kco-checkout.php index cc8abc83..ba237eb4 100644 --- a/classes/class-kco-checkout.php +++ b/classes/class-kco-checkout.php @@ -79,7 +79,7 @@ public function update_klarna_order() { $klarna_order = KCO_WC()->api->get_klarna_order( $klarna_order_id ); - if ( 'checkout_incomplete' === $klarna_order['status'] ) { + if ( $klarna_order && 'checkout_incomplete' === $klarna_order['status'] ) { // If it is, update order. $klarna_order = KCO_WC()->api->update_klarna_order( $klarna_order_id ); } From 67e5124fc443fea7b556855143b2537060c8b4aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20H=C3=B6gefjord?= Date: Wed, 25 Aug 2021 12:00:28 +0200 Subject: [PATCH 16/23] Remove old status report html file --- includes/kco-status-report.php | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 includes/kco-status-report.php diff --git a/includes/kco-status-report.php b/includes/kco-status-report.php deleted file mode 100644 index 63c3afab..00000000 --- a/includes/kco-status-report.php +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - -
-

-
From 716d3c5eef7894afb5da5745ee00198ea0140ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20H=C3=B6gefjord?= Date: Wed, 25 Aug 2021 12:00:51 +0200 Subject: [PATCH 17/23] Add log to db feature --- classes/class-kco-logger.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/classes/class-kco-logger.php b/classes/class-kco-logger.php index 1b562680..64d40438 100644 --- a/classes/class-kco-logger.php +++ b/classes/class-kco-logger.php @@ -27,6 +27,7 @@ class KCO_Logger { */ public static function log( $data ) { $settings = get_option( 'woocommerce_kco_settings' ); + if ( 'yes' === $settings['logging'] ) { $message = self::format_data( $data ); if ( empty( self::$log ) ) { @@ -34,6 +35,10 @@ public static function log( $data ) { } self::$log->add( 'klarna-checkout-for-woocommerce', wp_json_encode( $message ) ); } + + if ( isset( $data['response']['code'] ) && ( $data['response']['code'] < 200 || $data['response']['code'] > 299 ) ) { + self::log_to_db( $data ); + } } /** @@ -112,4 +117,22 @@ public static function get_stack() { return $stack; } + /** + * Logs an event in the WP DB. + * + * @param array $data The data to be logged. + */ + public static function log_to_db( $data ) { + $logs = get_option( 'krokedil_debuglog_kco', array() ); + + if ( ! empty( $logs ) ) { + $logs = json_decode( $logs ); + } + + $logs = array_slice( $logs, -14 ); + $logs[] = $data; + $logs = wp_json_encode( $logs ); + update_option( 'krokedil_debuglog_kco', $logs ); + } + } From 01999a4cae7bee769476855e8bd26e48fc6dd1f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20H=C3=B6gefjord?= Date: Wed, 25 Aug 2021 12:01:08 +0200 Subject: [PATCH 18/23] New status page admin view --- classes/class-kco-status.php | 1 + includes/admin/views/status-report.php | 67 ++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 includes/admin/views/status-report.php diff --git a/classes/class-kco-status.php b/classes/class-kco-status.php index 54b8a1d0..932fbcdb 100644 --- a/classes/class-kco-status.php +++ b/classes/class-kco-status.php @@ -29,6 +29,7 @@ public function __construct() { * @return void */ public function add_status_page_box() { + include_once KCO_WC_PLUGIN_PATH . '/includes/admin/views/status-report.php'; } } $wc_collector_checkout_status = new KCO_Status(); diff --git a/includes/admin/views/status-report.php b/includes/admin/views/status-report.php new file mode 100644 index 00000000..7a8061b9 --- /dev/null +++ b/includes/admin/views/status-report.php @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+
, Response code: , Response message: , Correlation ID: +
From e03c43da4c56888dab6211bc15376a523469170a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20H=C3=B6gefjord?= Date: Wed, 25 Aug 2021 12:22:02 +0200 Subject: [PATCH 19/23] Only print error_code and error_messages instead of entire body --- includes/admin/views/status-report.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/includes/admin/views/status-report.php b/includes/admin/views/status-report.php index 7a8061b9..1be1780a 100644 --- a/includes/admin/views/status-report.php +++ b/includes/admin/views/status-report.php @@ -40,6 +40,8 @@ $log_title = isset( $log['title'] ) ? $log['title'] : ''; $code = isset( $log['response']['code'] ) ? $log['response']['code'] : ''; $body = isset( $log['response']['body'] ) ? json_encode( $log['response']['body'] ) : ''; + $error_code = isset( $log['response']['body']['error_code'] ) ? 'Error code: ' . $log['response']['body']['error_code'] . '.' : ''; + $error_messages = isset( $log['response']['body']['error_messages'] ) ? 'Error messages: ' . json_encode( $log['response']['body']['error_messages'] ) : ''; $correlation_id = isset( $log['response']['body']['correlation_id'] ) ? $log['response']['body']['correlation_id'] : ''; ?> @@ -48,7 +50,7 @@ , Response code: , Response message: , Correlation ID: - + Date: Wed, 25 Aug 2021 12:28:35 +0200 Subject: [PATCH 20/23] Coding standards --- includes/admin/views/status-report.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/admin/views/status-report.php b/includes/admin/views/status-report.php index 1be1780a..28c685c5 100644 --- a/includes/admin/views/status-report.php +++ b/includes/admin/views/status-report.php @@ -39,9 +39,9 @@ $timestamp = isset( $log['timestamp'] ) ? $log['timestamp'] : ''; $log_title = isset( $log['title'] ) ? $log['title'] : ''; $code = isset( $log['response']['code'] ) ? $log['response']['code'] : ''; - $body = isset( $log['response']['body'] ) ? json_encode( $log['response']['body'] ) : ''; + $body = isset( $log['response']['body'] ) ? wp_json_encode( $log['response']['body'] ) : ''; $error_code = isset( $log['response']['body']['error_code'] ) ? 'Error code: ' . $log['response']['body']['error_code'] . '.' : ''; - $error_messages = isset( $log['response']['body']['error_messages'] ) ? 'Error messages: ' . json_encode( $log['response']['body']['error_messages'] ) : ''; + $error_messages = isset( $log['response']['body']['error_messages'] ) ? 'Error messages: ' . wp_json_encode( $log['response']['body']['error_messages'] ) : ''; $correlation_id = isset( $log['response']['body']['correlation_id'] ) ? $log['response']['body']['correlation_id'] : ''; ?> From 0a9d6a7375724739093525c73539cecb8c79b6bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20H=C3=B6gefjord?= Date: Wed, 25 Aug 2021 12:41:11 +0200 Subject: [PATCH 21/23] Coding standards --- includes/admin/views/status-report.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/views/status-report.php b/includes/admin/views/status-report.php index 28c685c5..1ea75604 100644 --- a/includes/admin/views/status-report.php +++ b/includes/admin/views/status-report.php @@ -14,7 +14,7 @@ -

+

From cf9a636ef2d451a64f09edf5952acf41c1571f5a Mon Sep 17 00:00:00 2001 From: Michael Bengtsson Date: Wed, 25 Aug 2021 13:54:19 +0200 Subject: [PATCH 22/23] Rename global variable for status page. --- classes/class-kco-status.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/class-kco-status.php b/classes/class-kco-status.php index 932fbcdb..a1134936 100644 --- a/classes/class-kco-status.php +++ b/classes/class-kco-status.php @@ -32,4 +32,4 @@ public function add_status_page_box() { include_once KCO_WC_PLUGIN_PATH . '/includes/admin/views/status-report.php'; } } -$wc_collector_checkout_status = new KCO_Status(); +$kco_status = new KCO_Status(); From 98bd1bb667fed66973ac90d9243695d6dc438197 Mon Sep 17 00:00:00 2001 From: Michael Bengtsson Date: Wed, 25 Aug 2021 14:03:34 +0200 Subject: [PATCH 23/23] Version 2.6.0 --- klarna-checkout-for-woocommerce.php | 6 +++--- readme.txt | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/klarna-checkout-for-woocommerce.php b/klarna-checkout-for-woocommerce.php index 2a6e4e3f..b8d836e0 100644 --- a/klarna-checkout-for-woocommerce.php +++ b/klarna-checkout-for-woocommerce.php @@ -5,12 +5,12 @@ * Description: Klarna Checkout payment gateway for WooCommerce. * Author: Krokedil * Author URI: https://krokedil.com/ - * Version: 2.5.9 + * Version: 2.6.0 * Text Domain: klarna-checkout-for-woocommerce * Domain Path: /languages * * WC requires at least: 3.2.0 - * WC tested up to: 5.5.2 + * WC tested up to: 5.6.0 * * Copyright (c) 2017-2021 Krokedil * @@ -35,7 +35,7 @@ /** * Required minimums and constants */ -define( 'KCO_WC_VERSION', '2.5.9' ); +define( 'KCO_WC_VERSION', '2.6.0' ); define( 'KCO_WC_MIN_PHP_VER', '5.6.0' ); define( 'KCO_WC_MIN_WC_VER', '3.9.0' ); define( 'KCO_WC_MAIN_FILE', __FILE__ ); diff --git a/readme.txt b/readme.txt index 33ac5d14..0a6c9dfe 100644 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Requires at least: 4.0 Tested up to: 5.8.0 Requires PHP: 5.6 WC requires at least: 3.4.0 -WC tested up to: 5.5.2 +WC tested up to: 5.6.0 Stable tag: trunk License: GPLv3 or later License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -62,6 +62,11 @@ For help setting up and configuring Klarna Checkout for WooCommerce please refer * This plugin integrates with Klarnas V3 platform. You need an agreement with Klarna specific to the V3 platform to use this plugin. == Changelog == += 2021.08.25 - version 2.6.0 = +* Feature - We now support Pay for order. You can now create an order in advance on the admin page and send a pay link to a customer, where they can finish the payment using Klarna Checkout. +* Feature - We will now save the last 15 requests to Klarna that had an API error and display them on the WooCommerce status page. This should help with getting error messages when you need to debug issues without going through the logs. These will also be in the status report that you can send to us for support tickets. +* Fix - Fixed some error notices related to PHP 8.0. + = 2021.08.03 - version 2.5.9 = * Enhancement - Added a filter to the fields we ignore when moving extra checkout fields on the checkout page. This filter is "kco_ignored_checkout_fields" and expects an array of strings that are the HTML element IDs of the fields you wish to not have moved. * Fix - Fixed a bug causing you to have to click some setting groups twice to have them properly expand.