From cd9d77c8db246420f41d12df891455ac4741768e Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Thu, 23 May 2019 13:44:02 +0200 Subject: [PATCH 001/115] PP instalments: getting started with new provider --- .../Content/instalments-sm.png | Bin 0 -> 4392 bytes .../SmartStore.PayPal/Content/instalments.png | Bin 0 -> 17263 bytes .../PayPalInstalmentsController.cs | 30 +++++++++++ src/Plugins/SmartStore.PayPal/Plugin.cs | 51 +++++++++++------- .../Providers/PayPalInstalmentsProvider.cs | 42 +++++++++++++++ .../Settings/PayPalInstalmentsSettings.cs | 12 +++++ .../SmartStore.PayPal.csproj | 9 ++++ 7 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Content/instalments-sm.png create mode 100644 src/Plugins/SmartStore.PayPal/Content/instalments.png create mode 100644 src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs create mode 100644 src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs create mode 100644 src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs diff --git a/src/Plugins/SmartStore.PayPal/Content/instalments-sm.png b/src/Plugins/SmartStore.PayPal/Content/instalments-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..39e6b7e24445cfe2b07e7ca1b9e8c9f11997edd0 GIT binary patch literal 4392 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 + { + public PayPalInstalmentsController( + IPayPalService payPalService) : base( + PayPalInstalmentsProvider.SystemName, + payPalService) + { + } + + public override ProcessPaymentRequest GetPaymentInfo(FormCollection form) + { + throw new NotImplementedException(); + } + + public override IList ValidatePaymentForm(FormCollection form) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Plugin.cs b/src/Plugins/SmartStore.PayPal/Plugin.cs index 054332ca29..5d53065003 100644 --- a/src/Plugins/SmartStore.PayPal/Plugin.cs +++ b/src/Plugins/SmartStore.PayPal/Plugin.cs @@ -39,6 +39,7 @@ public override void Install() _settingService.SaveSetting(new PayPalDirectPaymentSettings()); _settingService.SaveSetting(new PayPalStandardPaymentSettings()); _settingService.SaveSetting(new PayPalPlusPaymentSettings()); + _settingService.SaveSetting(new PayPalInstalmentsSettings()); _localizationService.ImportPluginResourcesFromXml(this.PluginDescriptor); @@ -47,34 +48,44 @@ public override void Install() public override void Uninstall() { - try - { - var settings = _settingService.LoadSetting(); - if (settings.WebhookId.HasValue()) - { - var session = new PayPalSessionData(); - var result = _payPalService.Value.EnsureAccessToken(session, settings); - - if (result.Success) - result = _payPalService.Value.DeleteWebhook(settings, session); - - if (!result.Success) - Logger.Log(LogLevel.Error, null, result.ErrorMessage, null); - } - } - catch (Exception exception) - { - Logger.Log(LogLevel.Error, exception, null, null); - } + DeleteWebhook(_settingService.LoadSetting()); + DeleteWebhook(_settingService.LoadSetting()); _settingService.DeleteSetting(); _settingService.DeleteSetting(); _settingService.DeleteSetting(); _settingService.DeleteSetting(); + _settingService.DeleteSetting(); - _localizationService.DeleteLocaleStringResources(PluginDescriptor.ResourceRootKey); + _localizationService.DeleteLocaleStringResources(PluginDescriptor.ResourceRootKey); base.Uninstall(); } + + private void DeleteWebhook(PayPalApiSettingsBase settings) + { + try + { + if (settings?.WebhookId.HasValue() ?? false) + { + var session = new PayPalSessionData(); + var result = _payPalService.Value.EnsureAccessToken(session, settings); + + if (result.Success) + { + result = _payPalService.Value.DeleteWebhook(settings, session); + } + + if (!result.Success) + { + Logger.Log(LogLevel.Error, null, result.ErrorMessage, null); + } + } + } + catch (Exception ex) + { + Logger.Log(LogLevel.Error, ex, null, null); + } + } } } diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs new file mode 100644 index 0000000000..3a2500bd19 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs @@ -0,0 +1,42 @@ +using System; +using System.Web.Routing; +using SmartStore.Core.Plugins; +using SmartStore.PayPal.Controllers; +using SmartStore.Services.Payments; + +namespace SmartStore.PayPal.Providers +{ + [SystemName("Payments.PayPalInstalments")] + [FriendlyName("Ratenzahlung Powered by PayPal")] + [DisplayOrder(1)] + public class PayPalInstalmentsProvider : PaymentMethodBase + { + public static string SystemName => "Payments.PayPalInstalments"; + + public override PaymentMethodType PaymentMethodType => PaymentMethodType.StandardAndRedirection; + + public override Type GetControllerType() + { + return typeof(PayPalInstalmentsController); + } + + public override void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues) + { + actionName = "Configure"; + controllerName = "PayPalInstalments"; + routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; + } + + public override void GetPaymentInfoRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues) + { + actionName = "PaymentInfo"; + controllerName = "PayPalInstalments"; + routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; + } + + public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest processPaymentRequest) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs b/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs new file mode 100644 index 0000000000..e0f9977324 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs @@ -0,0 +1,12 @@ +using SmartStore.Core.Configuration; + +namespace SmartStore.PayPal.Settings +{ + public class PayPalInstalmentsSettings : PayPalApiSettingsBase, ISettings + { + public PayPalInstalmentsSettings() + { + TransactMode = TransactMode.Authorize; + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 343820715b..fc21072f0c 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -126,6 +126,7 @@ Properties\AssemblyVersionInfo.cs + @@ -144,6 +145,7 @@ + @@ -152,6 +154,7 @@ + @@ -202,6 +205,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest From b72822b8d3aad1d416ff2f6d275fcb0c9803866d Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Mon, 3 Jun 2019 22:27:50 +0200 Subject: [PATCH 002/115] PayPal: Further work on instalments provider --- .../Content/smartstore.paypal.css | 4 -- .../Controllers/PayPalControllerBase.cs | 68 ++++++++++++++++++- .../PayPalInstalmentsController.cs | 34 ++++++++++ .../Controllers/PayPalPlusController.cs | 58 +++------------- .../Localization/resources.de-de.xml | 14 +++- .../Localization/resources.en-us.xml | 14 +++- .../Models/ApiConfigurationModels.cs | 67 ++---------------- .../PayPalInstalmentsConfigModel.cs | 13 ++++ .../PayPalPlusConfigurationModel.cs | 45 ++++++++++++ .../SmartStore.PayPal.csproj | 2 + .../Views/PayPalPlus/Configure.cshtml | 3 +- 11 files changed, 203 insertions(+), 119 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs create mode 100644 src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalPlusConfigurationModel.cs diff --git a/src/Plugins/SmartStore.PayPal/Content/smartstore.paypal.css b/src/Plugins/SmartStore.PayPal/Content/smartstore.paypal.css index 8c2faa5c54..cdd0819284 100644 --- a/src/Plugins/SmartStore.PayPal/Content/smartstore.paypal.css +++ b/src/Plugins/SmartStore.PayPal/Content/smartstore.paypal.css @@ -3,7 +3,3 @@ font-weight: bold; padding: 12px 15px 5px 0; } - -.paypal-standard-public { - margin-bottom: 10px; -} diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs index 61fda2d379..fa830e2216 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs @@ -7,6 +7,7 @@ using System.Text; using System.Web; using System.Web.Mvc; +using SmartStore.ComponentModel; using SmartStore.Core.Configuration; using SmartStore.Core.Domain.Orders; using SmartStore.Core.Domain.Payments; @@ -16,10 +17,11 @@ using SmartStore.Services.Orders; using SmartStore.Services.Payments; using SmartStore.Web.Framework.Controllers; +using SmartStore.Web.Framework.Settings; namespace SmartStore.PayPal.Controllers { - public abstract class PayPalPaymentControllerBase : PaymentControllerBase + public abstract class PayPalPaymentControllerBase : PaymentControllerBase { protected void PrepareConfigurationModel(ApiConfigurationModel model, int storeScope) { @@ -29,7 +31,69 @@ protected void PrepareConfigurationModel(ApiConfigurationModel model, int storeS model.PrimaryStoreCurrencyCode = store.PrimaryStoreCurrency.CurrencyCode; } - } + + protected bool SaveConfigurationModel(ApiConfigurationModel model, FormCollection form) where TSetting : PayPalApiSettingsBase, ISettings, new() + { + var storeDependingSettingHelper = new StoreDependingSettingHelper(ViewData); + var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); + var settings = Services.Settings.LoadSetting(storeScope); + + var oldClientId = settings.ClientId; + var oldSecret = settings.Secret; + var oldProfileId = settings.ExperienceProfileId; + + var validator = new PayPalApiConfigValidator(T, x => + { + return storeScope == 0 || storeDependingSettingHelper.IsOverrideChecked(settings, x, form); + }); + + validator.Validate(model, ModelState); + + if (!ModelState.IsValid) + { + return false; + } + + ModelState.Clear(); + model.TransactMode = TransactMode.AuthorizeAndCapture; + + MiniMapper.Map(model, settings); + settings.ApiAccountName = model.ApiAccountName.TrimSafe(); + settings.ApiAccountPassword = model.ApiAccountPassword.TrimSafe(); + settings.ClientId = model.ClientId.TrimSafe(); + settings.ExperienceProfileId = model.ExperienceProfileId.TrimSafe(); + settings.Secret = model.Secret.TrimSafe(); + settings.Signature = model.Signature.TrimSafe(); + settings.WebhookId = model.WebhookId.TrimSafe(); + + // Credentials changed: reset profile and webhook id to avoid errors. + if (!oldClientId.IsCaseInsensitiveEqual(settings.ClientId) || !oldSecret.IsCaseInsensitiveEqual(settings.Secret)) + { + if (oldProfileId.IsCaseInsensitiveEqual(settings.ExperienceProfileId)) + { + settings.ExperienceProfileId = null; + } + + settings.WebhookId = null; + } + + using (Services.Settings.BeginScope()) + { + storeDependingSettingHelper.UpdateSettings(settings, form, storeScope, Services.Settings); + } + + using (Services.Settings.BeginScope()) + { + // Multistore context not possible, see IPN handling. + Services.Settings.SaveSetting(settings, x => x.UseSandbox, 0, false); + } + + NotifySuccess(T("Admin.Common.DataSuccessfullySaved")); + + return true; + } + } + public abstract class PayPalControllerBase : PayPalPaymentControllerBase where TSetting : PayPalSettingsBase, ISettings, new() { diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index 649cbf5c74..8af5cbf404 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -1,10 +1,16 @@ using System; using System.Collections.Generic; using System.Web.Mvc; +using SmartStore.ComponentModel; +using SmartStore.PayPal.Models; using SmartStore.PayPal.Providers; using SmartStore.PayPal.Services; using SmartStore.PayPal.Settings; using SmartStore.Services.Payments; +using SmartStore.Web.Framework.Controllers; +using SmartStore.Web.Framework.Security; +using SmartStore.Web.Framework.Settings; +using SmartStore.Web.Framework.Theming; namespace SmartStore.PayPal.Controllers { @@ -26,5 +32,33 @@ public override IList ValidatePaymentForm(FormCollection form) { throw new NotImplementedException(); } + + [ChildActionOnly, AdminAuthorize, LoadSetting, AdminThemed] + public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope) + { + var model = new PayPalInstalmentsConfigModel + { + ConfigGroups = T("Plugins.SmartStore.PayPal.ConfigGroups").Text.SplitSafe(";") + }; + + MiniMapper.Map(settings, model); + PrepareConfigurationModel(model, storeScope); + + return View(model); + } + + [HttpPost, ChildActionOnly, AdminAuthorize, AdminThemed] + public ActionResult Configure(PayPalInstalmentsConfigModel model, FormCollection form) + { + if (!SaveConfigurationModel(model, form)) + { + var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); + var settings = Services.Settings.LoadSetting(storeScope); + + return Configure(settings, storeScope); + } + + return RedirectToConfiguration(PayPalInstalmentsProvider.SystemName, false); + } } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs index d3433312a2..9d706cc766 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using SmartStore.ComponentModel; using SmartStore.Core.Domain.Customers; using SmartStore.Core.Domain.Orders; using SmartStore.Core.Domain.Stores; @@ -166,8 +167,8 @@ public ActionResult Configure(PayPalPlusPaymentSettings settings, int storeScope // It's better to also offer inactive methods here but filter them out in frontend. var paymentMethods = _paymentService.LoadAllPaymentMethods(storeScope); - model.Copy(settings, true); - PrepareConfigurationModel(model, storeScope); + MiniMapper.Map(settings, model); + PrepareConfigurationModel(model, storeScope); model.AvailableThirdPartyPaymentMethods = paymentMethods .Where(x => @@ -182,53 +183,16 @@ public ActionResult Configure(PayPalPlusPaymentSettings settings, int storeScope [HttpPost, AdminAuthorize, ChildActionOnly, AdminThemed] public ActionResult Configure(PayPalPlusConfigurationModel model, FormCollection form) { - var storeDependingSettingHelper = new StoreDependingSettingHelper(ViewData); - var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); - var settings = Services.Settings.LoadSetting(storeScope); - - var oldClientId = settings.ClientId; - var oldSecret = settings.Secret; - var oldProfileId = settings.ExperienceProfileId; - - var validator = new PayPalPlusConfigValidator(T, x => - { - return storeScope == 0 || storeDependingSettingHelper.IsOverrideChecked(settings, x, form); - }); - - validator.Validate(model, ModelState); - - if (!ModelState.IsValid) - { - return Configure(settings, storeScope); - } - - ModelState.Clear(); - model.Copy(settings, false); - - // Credentials changed: reset profile and webhook id to avoid errors. - if (!oldClientId.IsCaseInsensitiveEqual(settings.ClientId) || !oldSecret.IsCaseInsensitiveEqual(settings.Secret)) - { - if (oldProfileId.IsCaseInsensitiveEqual(settings.ExperienceProfileId)) - settings.ExperienceProfileId = null; - - settings.WebhookId = null; - } - - using (Services.Settings.BeginScope()) - { - storeDependingSettingHelper.UpdateSettings(settings, form, storeScope, Services.Settings); - } - - using (Services.Settings.BeginScope()) - { - // Multistore context not possible, see IPN handling. - Services.Settings.SaveSetting(settings, x => x.UseSandbox, 0, false); - } + if (!SaveConfigurationModel(model, form)) + { + var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); + var settings = Services.Settings.LoadSetting(storeScope); - NotifySuccess(T("Admin.Common.DataSuccessfullySaved")); + return Configure(settings, storeScope); + } - return RedirectToConfiguration(PayPalPlusProvider.SystemName, false); - } + return RedirectToConfiguration(PayPalPlusProvider.SystemName, false); + } public ActionResult PaymentInfo() { diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index 4c9d5a1eeb..d680db25ab 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -4,7 +4,7 @@ PayPal Zahlungsarten - Stellt die PayPal-Zahlungsarten PayPal Standard, PayPal Direct, PayPal Express und PayPal PLUS zur Verfügung. + Stellt die PayPal-Zahlungsarten zur Verfügung. @@ -444,4 +444,16 @@ Unter + + Ratenzahlung Powered by PayPal + + + + + + + + + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index bc6404c3f9..0bb96f1c96 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -4,7 +4,7 @@ PayPal Payment Methods - Provides the PayPal payment methods PayPal Standard, PayPal Direct, PayPal Express and PayPal PLUS. + Provides the PayPal payment methods. @@ -450,4 +450,16 @@ Go to + + Ratenzahlung Powered by PayPal + + + + + + + + + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs b/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs index 8544216277..8bbf7e80f5 100644 --- a/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs +++ b/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs @@ -1,17 +1,16 @@ -using System.Collections.Generic; +using System; using System.ComponentModel.DataAnnotations; +using FluentValidation; using SmartStore.ComponentModel; +using SmartStore.Core.Localization; using SmartStore.PayPal.Settings; using SmartStore.Web.Framework; using SmartStore.Web.Framework.Modelling; using SmartStore.Web.Framework.Validators; -using SmartStore.Core.Localization; -using System; -using FluentValidation; namespace SmartStore.PayPal.Models { - public abstract class ApiConfigurationModel : ModelBase + public abstract class ApiConfigurationModel : ModelBase { public string[] ConfigGroups { get; set; } public string PrimaryStoreCurrencyCode { get; set; } @@ -107,61 +106,5 @@ public void Copy(PayPalExpressPaymentSettings settings, bool fromSettings) settings.Signature = Signature.TrimSafe(); } } - } - - public class PayPalPlusConfigurationModel : ApiConfigurationModel - { - public PayPalPlusConfigurationModel() - { - TransactMode = TransactMode.AuthorizeAndCapture; - } - - [SmartResourceDisplayName("Plugins.Payments.PayPalPlus.ThirdPartyPaymentMethods")] - public List ThirdPartyPaymentMethods { get; set; } - public IList AvailableThirdPartyPaymentMethods { get; set; } - - [SmartResourceDisplayName("Plugins.Payments.PayPalPlus.DisplayPaymentMethodLogo")] - public bool DisplayPaymentMethodLogo { get; set; } - - [SmartResourceDisplayName("Plugins.Payments.PayPalPlus.DisplayPaymentMethodDescription")] - public bool DisplayPaymentMethodDescription { get; set; } - - - public void Copy(PayPalPlusPaymentSettings settings, bool fromSettings) - { - if (fromSettings) - { - MiniMapper.Map(settings, this); - } - else - { - TransactMode = TransactMode.AuthorizeAndCapture; - - MiniMapper.Map(this, settings); - settings.ApiAccountName = ApiAccountName.TrimSafe(); - settings.ApiAccountPassword = ApiAccountPassword.TrimSafe(); - settings.ClientId = ClientId.TrimSafe(); - settings.ExperienceProfileId = ExperienceProfileId.TrimSafe(); - settings.Secret = Secret.TrimSafe(); - settings.Signature = Signature.TrimSafe(); - settings.WebhookId = WebhookId.TrimSafe(); - } - } - } - - public class PayPalPlusConfigValidator : SmartValidatorBase - { - public PayPalPlusConfigValidator(Localizer T, Func addRule) - { - if (addRule("ClientId")) - { - RuleFor(x => x.ClientId).NotEmpty(); - } - - if (addRule("Secret")) - { - RuleFor(x => x.Secret).NotEmpty(); - } - } - } + } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs new file mode 100644 index 0000000000..e77cce84fd --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs @@ -0,0 +1,13 @@ +using SmartStore.PayPal.Settings; + +namespace SmartStore.PayPal.Models +{ + public class PayPalInstalmentsConfigModel : ApiConfigurationModel + { + public PayPalInstalmentsConfigModel() + { + TransactMode = TransactMode.AuthorizeAndCapture; + } + + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalPlusConfigurationModel.cs b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalPlusConfigurationModel.cs new file mode 100644 index 0000000000..b104dfdd0a --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalPlusConfigurationModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using FluentValidation; +using SmartStore.Core.Localization; +using SmartStore.PayPal.Settings; +using SmartStore.Web.Framework; +using SmartStore.Web.Framework.Validators; + +namespace SmartStore.PayPal.Models +{ + public class PayPalPlusConfigurationModel : ApiConfigurationModel + { + public PayPalPlusConfigurationModel() + { + TransactMode = TransactMode.AuthorizeAndCapture; + } + + [SmartResourceDisplayName("Plugins.Payments.PayPalPlus.ThirdPartyPaymentMethods")] + public List ThirdPartyPaymentMethods { get; set; } + public IList AvailableThirdPartyPaymentMethods { get; set; } + + [SmartResourceDisplayName("Plugins.Payments.PayPalPlus.DisplayPaymentMethodLogo")] + public bool DisplayPaymentMethodLogo { get; set; } + + [SmartResourceDisplayName("Plugins.Payments.PayPalPlus.DisplayPaymentMethodDescription")] + public bool DisplayPaymentMethodDescription { get; set; } + } + + + public class PayPalApiConfigValidator : SmartValidatorBase + { + public PayPalApiConfigValidator(Localizer T, Func addRule) + { + if (addRule("ClientId")) + { + RuleFor(x => x.ClientId).NotEmpty(); + } + + if (addRule("Secret")) + { + RuleFor(x => x.Secret).NotEmpty(); + } + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index fc21072f0c..9e5b6b7ec7 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -140,6 +140,8 @@ + + diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml index efce2e5bbc..ccfcf68cb9 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml @@ -5,9 +5,8 @@ @model PayPalPlusConfigurationModel @{ Layout = ""; - Html.AddCssFileParts(true, "~/Plugins/SmartStore.PayPal/Content/smartstore.paypal.css"); - var hasCredentials = (Model.ClientId.HasValue() && Model.Secret.HasValue()); + var hasCredentials = Model.ClientId.HasValue() && Model.Secret.HasValue(); }
From ad05cc5a99ca48c8a6bdfd6077ba9a90d96bbf6f Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Tue, 4 Jun 2019 11:31:15 +0200 Subject: [PATCH 003/115] PayPal: Further work on instalments provider --- .../Controllers/PayPalControllerBase.cs | 2 +- .../PayPalInstalmentsController.cs | 6 +- .../Controllers/PayPalPlusController.cs | 6 +- .../Localization/resources.de-de.xml | 8 +- .../Localization/resources.en-us.xml | 8 +- .../Models/ApiConfigurationModels.cs | 7 +- .../Providers/PayPalInstalmentsProvider.cs | 33 ++++- .../SmartStore.PayPal.csproj | 6 + .../Views/PayPalInstalments/Configure.cshtml | 68 +++++++++++ .../Views/PayPalPlus/Configure.cshtml | 112 +---------------- .../Shared/Partials/ApiConfiguration.cshtml | 115 ++++++++++++++++++ 11 files changed, 237 insertions(+), 134 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml create mode 100644 src/Plugins/SmartStore.PayPal/Views/Shared/Partials/ApiConfiguration.cshtml diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs index fa830e2216..191148bf4e 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs @@ -30,7 +30,7 @@ protected void PrepareConfigurationModel(ApiConfigurationModel model, int storeS : Services.StoreService.GetStoreById(storeScope); model.PrimaryStoreCurrencyCode = store.PrimaryStoreCurrency.CurrencyCode; - } + } protected bool SaveConfigurationModel(ApiConfigurationModel model, FormCollection form) where TSetting : PayPalApiSettingsBase, ISettings, new() { diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index 8af5cbf404..e9b67206b8 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -36,11 +36,7 @@ public override IList ValidatePaymentForm(FormCollection form) [ChildActionOnly, AdminAuthorize, LoadSetting, AdminThemed] public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope) { - var model = new PayPalInstalmentsConfigModel - { - ConfigGroups = T("Plugins.SmartStore.PayPal.ConfigGroups").Text.SplitSafe(";") - }; - + var model = new PayPalInstalmentsConfigModel(); MiniMapper.Map(settings, model); PrepareConfigurationModel(model, storeScope); diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs index 9d706cc766..3b8f851e1d 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs @@ -159,14 +159,10 @@ public override ProcessPaymentRequest GetPaymentInfo(FormCollection form) [LoadSetting, AdminAuthorize, ChildActionOnly, AdminThemed] public ActionResult Configure(PayPalPlusPaymentSettings settings, int storeScope) { - var model = new PayPalPlusConfigurationModel - { - ConfigGroups = T("Plugins.SmartStore.PayPal.ConfigGroups").Text.SplitSafe(";") - }; - // It's better to also offer inactive methods here but filter them out in frontend. var paymentMethods = _paymentService.LoadAllPaymentMethods(storeScope); + var model = new PayPalPlusConfigurationModel(); MiniMapper.Map(settings, model); PrepareConfigurationModel(model, storeScope); diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index d680db25ab..61850331fd 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -7,10 +7,10 @@ Stellt die PayPal-Zahlungsarten zur Verfügung. - - API Zugang;Datenaustausch;Sonstiges - - + + Zugangsdaten + + {0}]]> diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 0bb96f1c96..0df21c1c07 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -7,10 +7,10 @@ Provides the PayPal payment methods. - - API access;Data exchange;Miscellaneous - - + + Access data + + {0}]]> diff --git a/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs b/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs index 8bbf7e80f5..65d8c5b6af 100644 --- a/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs +++ b/src/Plugins/SmartStore.PayPal/Models/ApiConfigurationModels.cs @@ -1,18 +1,13 @@ -using System; -using System.ComponentModel.DataAnnotations; -using FluentValidation; +using System.ComponentModel.DataAnnotations; using SmartStore.ComponentModel; -using SmartStore.Core.Localization; using SmartStore.PayPal.Settings; using SmartStore.Web.Framework; using SmartStore.Web.Framework.Modelling; -using SmartStore.Web.Framework.Validators; namespace SmartStore.PayPal.Models { public abstract class ApiConfigurationModel : ModelBase { - public string[] ConfigGroups { get; set; } public string PrimaryStoreCurrencyCode { get; set; } [SmartResourceDisplayName("Plugins.Payments.PayPal.UseSandbox")] diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs index 3a2500bd19..d333bd6a5d 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs @@ -1,7 +1,12 @@ using System; +using System.Collections.Generic; using System.Web.Routing; +using SmartStore.Core.Domain.Orders; using SmartStore.Core.Plugins; using SmartStore.PayPal.Controllers; +using SmartStore.PayPal.Settings; +using SmartStore.Services; +using SmartStore.Services.Orders; using SmartStore.Services.Payments; namespace SmartStore.PayPal.Providers @@ -9,8 +14,19 @@ namespace SmartStore.PayPal.Providers [SystemName("Payments.PayPalInstalments")] [FriendlyName("Ratenzahlung Powered by PayPal")] [DisplayOrder(1)] - public class PayPalInstalmentsProvider : PaymentMethodBase + public class PayPalInstalmentsProvider : PaymentMethodBase, IConfigurable { + private readonly ICommonServices _services; + private readonly IOrderTotalCalculationService _orderTotalCalculationService; + + public PayPalInstalmentsProvider( + ICommonServices services, + IOrderTotalCalculationService orderTotalCalculationService) + { + _services = services; + _orderTotalCalculationService = orderTotalCalculationService; + } + public static string SystemName => "Payments.PayPalInstalments"; public override PaymentMethodType PaymentMethodType => PaymentMethodType.StandardAndRedirection; @@ -34,6 +50,21 @@ public override void GetPaymentInfoRoute(out string actionName, out string contr routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; } + public override decimal GetAdditionalHandlingFee(IList cart) + { + var result = decimal.Zero; + + try + { + var settings = _services.Settings.LoadSetting(); + + result = this.CalculateAdditionalFee(_orderTotalCalculationService, cart, settings.AdditionalFee, settings.AdditionalFeePercentage); + } + catch { } + + return result; + } + public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest processPaymentRequest) { throw new NotImplementedException(); diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 9e5b6b7ec7..37f8026f86 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -312,6 +312,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + Designer diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml new file mode 100644 index 0000000000..9b17635c37 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml @@ -0,0 +1,68 @@ +@using SmartStore.PayPal.Models; +@using SmartStore.Web.Framework; +@model PayPalInstalmentsConfigModel +@{ + Layout = ""; +} + +
+ +
+ +
+ +@{ Html.RenderAction("StoreScopeConfiguration", "Setting", new { area = "Admin" }); } + +@Html.ValidationSummary(false) + +@using (Html.BeginForm()) +{ + @Html.HiddenFor(model => model.TransactMode) + + @Html.Partial("ApiConfiguration") + + + + + + + + + + + + + +
+
+
+ @T("Common.Misc") +
+
+
+ @Html.SmartLabelFor(model => model.AdditionalFee) + + @Html.SettingEditorFor(model => model.AdditionalFee, null, new { postfix = Model.PrimaryStoreCurrencyCode }) + @Html.ValidationMessageFor(model => model.AdditionalFee) +
+ @Html.SmartLabelFor(model => model.AdditionalFeePercentage) + + @Html.SettingEditorFor(model => model.AdditionalFeePercentage) + @Html.ValidationMessageFor(model => model.AdditionalFeePercentage) +
+} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml index ccfcf68cb9..a4f7f4476c 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalPlus/Configure.cshtml @@ -1,12 +1,8 @@ -@using SmartStore.PayPal; -@using SmartStore.PayPal.Models; +@using SmartStore.PayPal.Models; @using SmartStore.Web.Framework; -@using SmartStore.Web.Framework.UI; @model PayPalPlusConfigurationModel @{ Layout = ""; - - var hasCredentials = Model.ClientId.HasValue() && Model.Secret.HasValue(); }
@@ -38,114 +34,14 @@ { @Html.HiddenFor(model => model.TransactMode) - - - - - - - - - - - - - - - - - - - - - - - - - - - +
-
-
- @Model.ConfigGroups.SafeGet(0) -
-
-
- @Html.SmartLabelFor(model => model.UseSandbox) - - @Html.EditorFor(model => model.UseSandbox) - @Html.ValidationMessageFor(model => model.UseSandbox) -
- @Html.SmartLabelFor(model => model.ClientId) - - @Html.SettingEditorFor(model => model.ClientId) - @Html.ValidationMessageFor(model => model.ClientId) -
- @Html.SmartLabelFor(model => model.Secret) - - @Html.SettingEditorFor(model => model.Secret) - @Html.ValidationMessageFor(model => model.Secret) -
-
-
- @Model.ConfigGroups.SafeGet(1) -
-
-
- @Html.SmartLabelFor(model => model.ExperienceProfileId) - - @Html.SettingEditorFor(model => model.ExperienceProfileId) - - - - @T(Model.ExperienceProfileId.HasValue() ? "Common.Refresh" : "Common.AddNew") - + @Html.Partial("ApiConfiguration") - @if (Model.ExperienceProfileId.HasValue()) - { - - - @T("Admin.Common.Delete") - - } - - @Html.ValidationMessageFor(model => model.ExperienceProfileId) -
- @Html.SmartLabelFor(model => model.WebhookId) - -
- @* IPNs and webhook messages have no store context, so multistore configuration not possible here *@ - @Html.EditorFor(model => model.WebhookId) - -
- @if (Model.WebhookId.HasValue()) - { - - - @T("Admin.Common.Delete") - - } - else - { - - - @T("Common.AddNew") - - } -
-
- @Html.ValidationMessageFor(model => model.WebhookId) -
diff --git a/src/Plugins/SmartStore.PayPal/Views/Shared/Partials/ApiConfiguration.cshtml b/src/Plugins/SmartStore.PayPal/Views/Shared/Partials/ApiConfiguration.cshtml new file mode 100644 index 0000000000..b0d068e120 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/Shared/Partials/ApiConfiguration.cshtml @@ -0,0 +1,115 @@ +@using SmartStore.PayPal; +@using SmartStore.PayPal.Models; +@using SmartStore.Web.Framework; +@using SmartStore.Web.Framework.UI; +@model ApiConfigurationModel +@{ + Layout = ""; + + var hasCredentials = Model.ClientId.HasValue() && Model.Secret.HasValue(); +} + +
- @Model.ConfigGroups.SafeGet(2) + @T("Common.Misc")
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ @T("Plugins.SmartStore.PayPal.AccessData") +
+
+
+ @Html.SmartLabelFor(model => model.UseSandbox) + + @Html.EditorFor(model => model.UseSandbox) + @Html.ValidationMessageFor(model => model.UseSandbox) +
+ @Html.SmartLabelFor(model => model.ClientId) + + @Html.SettingEditorFor(model => model.ClientId) + @Html.ValidationMessageFor(model => model.ClientId) +
+ @Html.SmartLabelFor(model => model.Secret) + + @Html.SettingEditorFor(model => model.Secret) + @Html.ValidationMessageFor(model => model.Secret) +
+
+
+ @T("Admin.Common.DataExchange") +
+
+
+ @Html.SmartLabelFor(model => model.ExperienceProfileId) + + @Html.SettingEditorFor(model => model.ExperienceProfileId) + + + + @T(Model.ExperienceProfileId.HasValue() ? "Common.Refresh" : "Common.AddNew") + + + @if (Model.ExperienceProfileId.HasValue()) + { + + + @T("Admin.Common.Delete") + + } + + @Html.ValidationMessageFor(model => model.ExperienceProfileId) +
+ @Html.SmartLabelFor(model => model.WebhookId) + +
+ @* IPNs and webhook messages have no store context, so multistore configuration not possible here *@ + @Html.EditorFor(model => model.WebhookId) + +
+ @if (Model.WebhookId.HasValue()) + { + + + @T("Admin.Common.Delete") + + } + else + { + + + @T("Common.AddNew") + + } +
+
+ @Html.ValidationMessageFor(model => model.WebhookId) +
From d5ef664a48e379325d82201912be920637030910 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Tue, 4 Jun 2019 15:34:08 +0200 Subject: [PATCH 004/115] PayPal: Further work on instalments provider --- .../PayPalRestApiControllerBase.cs | 8 +- .../Localization/resources.de-de.xml | 21 ++++- .../Localization/resources.en-us.xml | 21 ++++- .../PayPalInstalmentsConfigModel.cs | 6 ++ .../Services/PayPalPaymentFilter.cs | 83 +++++++++++++++++++ .../Services/PayPalService.cs | 52 +++++++----- .../Settings/PayPalInstalmentsSettings.cs | 5 ++ .../SmartStore.PayPal.csproj | 1 + .../Views/PayPalInstalments/Configure.cshtml | 18 ++++ 9 files changed, 188 insertions(+), 27 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs index c28bb24fcd..7869fa2c6f 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs @@ -11,7 +11,7 @@ namespace SmartStore.PayPal.Controllers { - public abstract class PayPalRestApiControllerBase : PayPalPaymentControllerBase where TSetting : PayPalApiSettingsBase, ISettings, new() + public abstract class PayPalRestApiControllerBase : PayPalPaymentControllerBase where TSetting : PayPalApiSettingsBase, ISettings, new() { public PayPalRestApiControllerBase( string systemName, @@ -162,11 +162,11 @@ public ActionResult Webhook() var settings = Services.Settings.LoadSetting(); - result = PayPalService.ProcessWebhook(settings, Request.Headers, json, PayPalPlusProvider.SystemName); + result = PayPalService.ProcessWebhook(settings, Request.Headers, json, SystemName); } - catch (Exception exception) + catch (Exception ex) { - Logger.Log(LogLevel.Warning, exception, null, null); + Logger.Log(LogLevel.Warning, ex, null, null); } return new HttpStatusCodeResult(result); diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index 61850331fd..67870f8cff 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -451,9 +451,28 @@ Unter - + So richten Sie Ratenzahlung Powered by PayPal ein: +
    +
  1. Legen Sie unter My Apps & Credentials eine neue REST API Anwendung an. +Unter Manage your applications finden Sie weitere Informationen zum Thema PayPal Anwendungen (Englisch).
  2. +
  3. Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
  4. +
  5. Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
  6. +
  7. Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.
  8. +
]]> + + Mindestbestellwert + + + Legt den Mindestbestellwert fest, ab dem die Zahlart angeboten werden soll. + + + Maximalbestellwert + + + Legt den Maximalestellwert fest, bis zu dem die Zahlart angeboten werden soll. + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 0df21c1c07..4aa4b6ce4c 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -457,9 +457,28 @@ Go to - + How to set up Ratenzahlung Powered by PayPal: +
    +
  1. Create a new REST API application under My Apps & Credentials. +Go to Manage your applications to get more information about PayPal applications.
  2. +
  3. Click the name of the application and enter Client-ID and Secret below on this page. Save.
  4. +
  5. Optional: Click Add next to Experience profile ID to create a new profile. Your shop data (name, logo etc.) can now be displayed to customers when paying on PayPal pages.
  6. +
  7. Optional: Click Add next to Webhook-ID to create a webhook. Through a webhook the shop receives PayPal messages und possibly updates the payment state of your orders.
  8. +
]]> + + Minimum order amount + + + Specifies the minimum order amount from which on the payment method should be offered. + + + Maximum order amount + + + Specifies the maximum order amount up to which the payment methods should be offered. + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs index e77cce84fd..d36eea734d 100644 --- a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs +++ b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs @@ -1,4 +1,5 @@ using SmartStore.PayPal.Settings; +using SmartStore.Web.Framework; namespace SmartStore.PayPal.Models { @@ -9,5 +10,10 @@ public PayPalInstalmentsConfigModel() TransactMode = TransactMode.AuthorizeAndCapture; } + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.OrderAmountMin")] + public decimal OrderAmountMin { get; set; } + + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.OrderAmountMax")] + public decimal OrderAmountMax { get; set; } } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs new file mode 100644 index 0000000000..d4a0c03961 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs @@ -0,0 +1,83 @@ +using System; +using SmartStore.PayPal.Providers; +using SmartStore.PayPal.Settings; +using SmartStore.Services; +using SmartStore.Services.Orders; +using SmartStore.Services.Payments; + +namespace SmartStore.PayPal.Services +{ + public partial class PayPalPaymentFilter : IPaymentMethodFilter + { + protected readonly ICommonServices _services; + protected readonly Lazy _orderTotalCalculationService; + + public PayPalPaymentFilter( + ICommonServices services, + Lazy orderTotalCalculationService) + { + _services = services; + _orderTotalCalculationService = orderTotalCalculationService; + } + + public string GetConfigurationUrl(string systemName) => null; + + public bool IsExcluded(PaymentFilterRequest request) + { + if (request.Customer == null) + { + return false; + } + + var method = request.PaymentMethod?.Metadata?.SystemName; + + if (method.IsCaseInsensitiveEqual(PayPalInstalmentsProvider.SystemName)) + { + return IsPaymentExcluded(request); + } + + return false; + } + + protected bool CanPayOrderAmount(PayPalInstalmentsSettings settings, PaymentFilterRequest request) + { + var cartTotal = ((decimal?)_orderTotalCalculationService.Value.GetShoppingCartTotal(request.Cart)) ?? decimal.Zero; + + if (cartTotal == decimal.Zero) + { + return false; + } + + return cartTotal >= settings.OrderAmountMin && cartTotal <= settings.OrderAmountMax; + } + + protected bool IsPaymentExcluded(PaymentFilterRequest request) + { + var ba = request.Customer.BillingAddress; + var sa = request.Customer.ShippingAddress; + + if (ba?.Country != null && !ba.Country.TwoLetterIsoCode.IsCaseInsensitiveEqual("DE")) + { + return true; + } + if (sa != null && sa.Country != null && !sa.Country.TwoLetterIsoCode.IsCaseInsensitiveEqual("DE")) + { + return true; + } + + var settings = _services.Settings.LoadSetting(request.StoreId); + + if (settings.ClientId.IsEmpty() || settings.Secret.IsEmpty()) + { + return true; + } + + if (!CanPayOrderAmount(settings, request)) + { + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs index 0289f48f6f..3cd43ccd1c 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs @@ -32,7 +32,7 @@ namespace SmartStore.PayPal.Services { - public class PayPalService : IPayPalService + public class PayPalService : IPayPalService { private readonly Lazy> _orderRepository; private readonly ICommonServices _services; @@ -535,17 +535,17 @@ public PayPalResponse CallApi(string method, string path, string accessToken, Pa webResponse = request.GetResponse() as HttpWebResponse; result.Success = ((int)webResponse.StatusCode < 400); } - catch (WebException wexc) + catch (WebException wex) { result.Success = false; - result.ErrorMessage = wexc.ToString(); - webResponse = wexc.Response as HttpWebResponse; + result.ErrorMessage = wex.ToString(); + webResponse = wex.Response as HttpWebResponse; } - catch (Exception exception) + catch (Exception ex) { result.Success = false; - result.ErrorMessage = exception.ToString(); - Logger.Log(LogLevel.Error, exception, null, null); + result.ErrorMessage = ex.ToString(); + Logger.Log(LogLevel.Error, ex, null, null); } try @@ -646,18 +646,18 @@ public PayPalResponse CallApi(string method, string path, string accessToken, Pa sb.AppendLine(rawResponse); } } - catch (Exception exception) + catch (Exception ex) { - exception.Dump(); + ex.Dump(); } Logger.Log(LogLevel.Error, new Exception(sb.ToString()), result.ErrorMessage, null); } } } - catch (Exception exception) + catch (Exception ex) { - Logger.Log(LogLevel.Error, exception, null, null); + Logger.Log(LogLevel.Error, ex, null, null); } finally { @@ -1112,24 +1112,34 @@ public HttpStatusCode ProcessWebhook( case PaymentStatus.Pending: break; case PaymentStatus.Authorized: - if (_orderProcessingService.CanMarkOrderAsAuthorized(order)) - _orderProcessingService.MarkAsAuthorized(order); + if (_orderProcessingService.CanMarkOrderAsAuthorized(order)) + { + _orderProcessingService.MarkAsAuthorized(order); + } break; case PaymentStatus.Paid: - if (_orderProcessingService.CanMarkOrderAsPaid(order)) - _orderProcessingService.MarkOrderAsPaid(order); + if (_orderProcessingService.CanMarkOrderAsPaid(order)) + { + _orderProcessingService.MarkOrderAsPaid(order); + } break; case PaymentStatus.Refunded: - if (_orderProcessingService.CanRefundOffline(order)) - _orderProcessingService.RefundOffline(order); + if (_orderProcessingService.CanRefundOffline(order)) + { + _orderProcessingService.RefundOffline(order); + } break; case PaymentStatus.PartiallyRefunded: - if (_orderProcessingService.CanPartiallyRefundOffline(order, Math.Abs(total))) - _orderProcessingService.PartiallyRefundOffline(order, Math.Abs(total)); + if (_orderProcessingService.CanPartiallyRefundOffline(order, Math.Abs(total))) + { + _orderProcessingService.PartiallyRefundOffline(order, Math.Abs(total)); + } break; case PaymentStatus.Voided: - if (_orderProcessingService.CanVoidOffline(order)) - _orderProcessingService.VoidOffline(order); + if (_orderProcessingService.CanVoidOffline(order)) + { + _orderProcessingService.VoidOffline(order); + } break; } diff --git a/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs b/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs index e0f9977324..a5805aca0c 100644 --- a/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs +++ b/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs @@ -7,6 +7,11 @@ public class PayPalInstalmentsSettings : PayPalApiSettingsBase, ISettings public PayPalInstalmentsSettings() { TransactMode = TransactMode.Authorize; + OrderAmountMin = 99.0M; + OrderAmountMax = 5000.0M; } + + public decimal OrderAmountMin { get; set; } + public decimal OrderAmountMax { get; set; } } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 37f8026f86..5e0b7ac095 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -155,6 +155,7 @@ + diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml index 9b17635c37..474b8bae8f 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml @@ -46,6 +46,24 @@
+ + + @Html.SmartLabelFor(x => x.OrderAmountMin) + + + @Html.SettingEditorFor(x => x.OrderAmountMin, null, new { postfix = Model.PrimaryStoreCurrencyCode }) + @Html.ValidationMessageFor(x => x.OrderAmountMin) + + + + + @Html.SmartLabelFor(x => x.OrderAmountMax) + + + @Html.SettingEditorFor(x => x.OrderAmountMax, null, new { postfix = Model.PrimaryStoreCurrencyCode }) + @Html.ValidationMessageFor(x => x.OrderAmountMax) + + @Html.SmartLabelFor(model => model.AdditionalFee) From 5d8f8f081abefe11e2fbc6a3bae37f69008c3287 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Tue, 4 Jun 2019 21:14:10 +0200 Subject: [PATCH 005/115] PayPal: Further work on instalments provider --- .../Content/instalments-sm.png | Bin 4392 -> 5379 bytes .../PayPalInstalmentsController.cs | 16 +++++++++++++--- .../Localization/resources.de-de.xml | 3 +++ .../Localization/resources.en-us.xml | 3 +++ .../SmartStore.PayPal.csproj | 3 +++ .../PayPalInstalments/PaymentInfo.cshtml | 15 +++++++++++++++ 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PaymentInfo.cshtml diff --git a/src/Plugins/SmartStore.PayPal/Content/instalments-sm.png b/src/Plugins/SmartStore.PayPal/Content/instalments-sm.png index 39e6b7e24445cfe2b07e7ca1b9e8c9f11997edd0..614d558ab2a703fdba067f7c870845f251256224 100644 GIT binary patch literal 5379 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 Mr<_Ga!7S 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 ValidatePaymentForm(FormCollection form) + { + return new List(); + } + public override ProcessPaymentRequest GetPaymentInfo(FormCollection form) { - throw new NotImplementedException(); + var paymentInfo = new ProcessPaymentRequest + { + OrderGuid = Guid.NewGuid() + }; + + return paymentInfo; } - public override IList ValidatePaymentForm(FormCollection form) + public ActionResult PaymentInfo() { - throw new NotImplementedException(); + return PartialView(); } [ChildActionOnly, AdminAuthorize, LoadSetting, AdminThemed] diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index 67870f8cff..aff176867b 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -461,6 +461,9 @@ Unter ]]> + + Wir ermöglichen Ihnen die Finanzierung Ihres Einkaufs mithilfe der Ratenzahlung Powered by PayPal. In Sekundenschnelle, vollständig online, vorbehaltlich Bonitätsprüfung. + Mindestbestellwert diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 4aa4b6ce4c..5403d902f3 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -467,6 +467,9 @@ Go to ]]> + + We enable you to finance your purchase with the installment payment Powered by PayPal. In seconds, fully online, subject to credit check. + Minimum order amount diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 5e0b7ac095..9bfd060d13 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -319,6 +319,9 @@ PreserveNewest + + PreserveNewest + Designer diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PaymentInfo.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PaymentInfo.cshtml new file mode 100644 index 0000000000..df13c69869 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PaymentInfo.cshtml @@ -0,0 +1,15 @@ +@{ + Layout = ""; +} +
+
+ +
+
+
+
+ @Html.Raw(T("Plugins.Payments.PayPalInstalments.PaymentInfo")) +
+
+
+
\ No newline at end of file From 9d6ec101085edebb5aba28efb86502b41d809555 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 5 Jun 2019 13:56:40 +0200 Subject: [PATCH 006/115] PayPal: Further work on instalments provider --- .../Controllers/PayPalPlusController.cs | 4 +- .../PayPalRestApiControllerBase.cs | 64 ++++++---- .../Extensions/MiscExtensions.cs | 16 +-- src/Plugins/SmartStore.PayPal/Plugin.cs | 9 +- .../Providers/PayPalInstalmentsProvider.cs | 51 +------- .../Providers/PayPalRestApiProviderBase.cs | 43 ++++--- .../Services/IPayPalService.cs | 6 +- .../Services/PayPalService.cs | 110 +++++++++++------- 8 files changed, 154 insertions(+), 149 deletions(-) diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs index 3b8f851e1d..4835db0153 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs @@ -260,7 +260,7 @@ public ActionResult PaymentWall() var returnUrl = Url.Action("CheckoutReturn", "PayPalPlus", new { area = Plugin.SystemName }, protocol); var cancelUrl = Url.Action("CheckoutCancel", "PayPalPlus", new { area = Plugin.SystemName }, protocol); - result = PayPalService.CreatePayment(settings, session, cart, PayPalPlusProvider.SystemName, returnUrl, cancelUrl); + result = PayPalService.CreatePayment(settings, session, cart, returnUrl, cancelUrl); if (result == null) { // No payment required. @@ -329,7 +329,7 @@ public ActionResult PatchShipping() var settings = Services.Settings.LoadSetting(store.Id); var cart = customer.GetCartItems(ShoppingCartType.ShoppingCart, store.Id); - var result = PayPalService.PatchShipping(settings, session, cart, PayPalPlusProvider.SystemName); + var result = PayPalService.PatchShipping(settings, session, cart); var errorMessage = result.ErrorMessage; if (!result.Success && result.IsValidationError) diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs index 7869fa2c6f..ddde09fd8a 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalRestApiControllerBase.cs @@ -36,9 +36,9 @@ public ActionResult UpsertExperienceProfile() var settings = Services.Settings.LoadSetting(storeScope); var store = Services.StoreService.GetStoreById(storeScope == 0 ? Services.StoreContext.CurrentStore.Id : storeScope); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = SystemName }; - var result = PayPalService.EnsureAccessToken(session, settings); + var result = PayPalService.EnsureAccessToken(session, settings); if (result.Success) { result = PayPalService.UpsertCheckoutExperience(settings, session, store); @@ -49,10 +49,14 @@ public ActionResult UpsertExperienceProfile() } } - if (result.Success) - NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); - else - NotifyError(result.ErrorMessage); + if (result.Success) + { + NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); + } + else + { + NotifyError(result.ErrorMessage); + } return RedirectToAction("ConfigureProvider", "Plugin", new { area = "admin", systemName = SystemName }); } @@ -62,9 +66,9 @@ public ActionResult DeleteExperienceProfile() { var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); var settings = Services.Settings.LoadSetting(storeScope); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = SystemName }; - var result = PayPalService.EnsureAccessToken(session, settings); + var result = PayPalService.EnsureAccessToken(session, settings); if (result.Success) { result = PayPalService.DeleteCheckoutExperience(settings, session); @@ -75,10 +79,14 @@ public ActionResult DeleteExperienceProfile() } } - if (result.Success) - NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); - else - NotifyError(result.ErrorMessage); + if (result.Success) + { + NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); + } + else + { + NotifyError(result.ErrorMessage); + } return RedirectToAction("ConfigureProvider", "Plugin", new { area = "admin", systemName = SystemName }); } @@ -87,9 +95,9 @@ public ActionResult DeleteExperienceProfile() public ActionResult CreateWebhook() { var settings = Services.Settings.LoadSetting(); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = SystemName }; - using (Services.Settings.BeginScope()) + using (Services.Settings.BeginScope()) { if (settings.WebhookId.HasValue()) { @@ -110,10 +118,14 @@ public ActionResult CreateWebhook() } } - if (result.Success) - NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); - else - NotifyError(result.ErrorMessage); + if (result.Success) + { + NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); + } + else + { + NotifyError(result.ErrorMessage); + } } return RedirectToAction("ConfigureProvider", "Plugin", new { area = "admin", systemName = SystemName }); @@ -123,9 +135,9 @@ public ActionResult CreateWebhook() public ActionResult DeleteWebhook() { var settings = Services.Settings.LoadSetting(); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = SystemName }; - if (settings.WebhookId.HasValue()) + if (settings.WebhookId.HasValue()) { var result = PayPalService.EnsureAccessToken(session, settings); if (result.Success) @@ -138,10 +150,14 @@ public ActionResult DeleteWebhook() } } - if (result.Success) - NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); - else - NotifyError(result.ErrorMessage); + if (result.Success) + { + NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); + } + else + { + NotifyError(result.ErrorMessage); + } } return RedirectToAction("ConfigureProvider", "Plugin", new { area = "admin", systemName = SystemName }); diff --git a/src/Plugins/SmartStore.PayPal/Extensions/MiscExtensions.cs b/src/Plugins/SmartStore.PayPal/Extensions/MiscExtensions.cs index 13e6e80e1a..0f141e5461 100644 --- a/src/Plugins/SmartStore.PayPal/Extensions/MiscExtensions.cs +++ b/src/Plugins/SmartStore.PayPal/Extensions/MiscExtensions.cs @@ -16,24 +16,24 @@ public static string GetPayPalUrl(this PayPalSettingsBase settings) "https://www.paypal.com/cgi-bin/webscr"; } - public static PayPalSessionData GetPayPalState(this HttpContextBase httpContext, string key) + public static PayPalSessionData GetPayPalState(this HttpContextBase httpContext, string providerSystemName) { - Guard.NotEmpty(key, nameof(key)); + Guard.NotEmpty(providerSystemName, nameof(providerSystemName)); var state = httpContext.GetCheckoutState(); - if (!state.CustomProperties.ContainsKey(key)) + if (!state.CustomProperties.ContainsKey(providerSystemName)) { - state.CustomProperties.Add(key, new PayPalSessionData()); + state.CustomProperties.Add(providerSystemName, new PayPalSessionData { ProviderSystemName = providerSystemName }); } - var session = state.CustomProperties.Get(key) as PayPalSessionData; + var session = state.CustomProperties.Get(providerSystemName) as PayPalSessionData; return session; } public static PayPalSessionData GetPayPalState( this HttpContextBase httpContext, - string key, + string providerSystemName, Customer customer, int storeId, IGenericAttributeService genericAttributeService) @@ -42,13 +42,13 @@ public static PayPalSessionData GetPayPalState( Guard.NotNull(customer, nameof(customer)); Guard.NotNull(genericAttributeService, nameof(genericAttributeService)); - var session = httpContext.GetPayPalState(key); + var session = httpContext.GetPayPalState(providerSystemName); if (session.AccessToken.IsEmpty() || session.PaymentId.IsEmpty()) { try { - var str = customer.GetAttribute(key + ".SessionData", genericAttributeService, storeId); + var str = customer.GetAttribute(providerSystemName + ".SessionData", genericAttributeService, storeId); if (str.HasValue()) { var storedSessionData = JsonConvert.DeserializeObject(str); diff --git a/src/Plugins/SmartStore.PayPal/Plugin.cs b/src/Plugins/SmartStore.PayPal/Plugin.cs index 5d53065003..c1eadfb6dc 100644 --- a/src/Plugins/SmartStore.PayPal/Plugin.cs +++ b/src/Plugins/SmartStore.PayPal/Plugin.cs @@ -1,6 +1,7 @@ using System; using SmartStore.Core.Logging; using SmartStore.Core.Plugins; +using SmartStore.PayPal.Providers; using SmartStore.PayPal.Services; using SmartStore.PayPal.Settings; using SmartStore.Services.Configuration; @@ -48,8 +49,8 @@ public override void Install() public override void Uninstall() { - DeleteWebhook(_settingService.LoadSetting()); - DeleteWebhook(_settingService.LoadSetting()); + DeleteWebhook(_settingService.LoadSetting(), PayPalPlusProvider.SystemName); + DeleteWebhook(_settingService.LoadSetting(), PayPalInstalmentsProvider.SystemName); _settingService.DeleteSetting(); _settingService.DeleteSetting(); @@ -62,13 +63,13 @@ public override void Uninstall() base.Uninstall(); } - private void DeleteWebhook(PayPalApiSettingsBase settings) + private void DeleteWebhook(PayPalApiSettingsBase settings, string providerSystemName) { try { if (settings?.WebhookId.HasValue() ?? false) { - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = providerSystemName }; var result = _payPalService.Value.EnsureAccessToken(session, settings); if (result.Success) diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs index d333bd6a5d..f7c345284a 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs @@ -1,12 +1,7 @@ using System; -using System.Collections.Generic; -using System.Web.Routing; -using SmartStore.Core.Domain.Orders; using SmartStore.Core.Plugins; using SmartStore.PayPal.Controllers; using SmartStore.PayPal.Settings; -using SmartStore.Services; -using SmartStore.Services.Orders; using SmartStore.Services.Payments; namespace SmartStore.PayPal.Providers @@ -14,17 +9,11 @@ namespace SmartStore.PayPal.Providers [SystemName("Payments.PayPalInstalments")] [FriendlyName("Ratenzahlung Powered by PayPal")] [DisplayOrder(1)] - public class PayPalInstalmentsProvider : PaymentMethodBase, IConfigurable + public class PayPalInstalmentsProvider : PayPalRestApiProviderBase { - private readonly ICommonServices _services; - private readonly IOrderTotalCalculationService _orderTotalCalculationService; - - public PayPalInstalmentsProvider( - ICommonServices services, - IOrderTotalCalculationService orderTotalCalculationService) + public PayPalInstalmentsProvider() + : base(SystemName) { - _services = services; - _orderTotalCalculationService = orderTotalCalculationService; } public static string SystemName => "Payments.PayPalInstalments"; @@ -35,39 +24,5 @@ public override Type GetControllerType() { return typeof(PayPalInstalmentsController); } - - public override void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues) - { - actionName = "Configure"; - controllerName = "PayPalInstalments"; - routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; - } - - public override void GetPaymentInfoRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues) - { - actionName = "PaymentInfo"; - controllerName = "PayPalInstalments"; - routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; - } - - public override decimal GetAdditionalHandlingFee(IList cart) - { - var result = decimal.Zero; - - try - { - var settings = _services.Settings.LoadSetting(); - - result = this.CalculateAdditionalFee(_orderTotalCalculationService, cart, settings.AdditionalFee, settings.AdditionalFeePercentage); - } - catch { } - - return result; - } - - public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest processPaymentRequest) - { - throw new NotImplementedException(); - } } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs index 7b83e6d349..c0b459d780 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs @@ -215,19 +215,23 @@ public override CapturePaymentResult Capture(CapturePaymentRequest capturePaymen }; var settings = Services.Settings.LoadSetting(capturePaymentRequest.Order.StoreId); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = _providerSystemName }; - var apiResult = PayPalService.EnsureAccessToken(session, settings); + var apiResult = PayPalService.EnsureAccessToken(session, settings); if (apiResult.Success) { apiResult = PayPalService.Capture(settings, session, capturePaymentRequest); - if (apiResult.Success) - result.NewPaymentStatus = PaymentStatus.Paid; + if (apiResult.Success) + { + result.NewPaymentStatus = PaymentStatus.Paid; + } } - if (!apiResult.Success) - result.Errors.Add(apiResult.ErrorMessage); + if (!apiResult.Success) + { + result.Errors.Add(apiResult.ErrorMessage); + } return result; } @@ -240,23 +244,24 @@ public override RefundPaymentResult Refund(RefundPaymentRequest refundPaymentReq }; var settings = Services.Settings.LoadSetting(refundPaymentRequest.Order.StoreId); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = _providerSystemName }; - var apiResult = PayPalService.EnsureAccessToken(session, settings); + var apiResult = PayPalService.EnsureAccessToken(session, settings); if (apiResult.Success) { apiResult = PayPalService.Refund(settings, session, refundPaymentRequest); if (apiResult.Success) { - if (refundPaymentRequest.IsPartialRefund) - result.NewPaymentStatus = PaymentStatus.PartiallyRefunded; - else - result.NewPaymentStatus = PaymentStatus.Refunded; + result.NewPaymentStatus = refundPaymentRequest.IsPartialRefund + ? PaymentStatus.PartiallyRefunded + : PaymentStatus.Refunded; } } - if (!apiResult.Success) - result.Errors.Add(apiResult.ErrorMessage); + if (!apiResult.Success) + { + result.Errors.Add(apiResult.ErrorMessage); + } return result; } @@ -269,9 +274,9 @@ public override VoidPaymentResult Void(VoidPaymentRequest voidPaymentRequest) }; var settings = Services.Settings.LoadSetting(voidPaymentRequest.Order.StoreId); - var session = new PayPalSessionData(); + var session = new PayPalSessionData { ProviderSystemName = _providerSystemName }; - var apiResult = PayPalService.EnsureAccessToken(session, settings); + var apiResult = PayPalService.EnsureAccessToken(session, settings); if (apiResult.Success) { apiResult = PayPalService.Void(settings, session, voidPaymentRequest); @@ -281,8 +286,10 @@ public override VoidPaymentResult Void(VoidPaymentRequest voidPaymentRequest) } } - if (!apiResult.Success) - result.Errors.Add(apiResult.ErrorMessage); + if (!apiResult.Success) + { + result.Errors.Add(apiResult.ErrorMessage); + } return result; } diff --git a/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs index c4a911fa4f..107965735e 100644 --- a/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs @@ -9,7 +9,7 @@ namespace SmartStore.PayPal.Services { - public interface IPayPalService + public interface IPayPalService { void AddOrderNote(PayPalSettingsBase settings, Order order, string anyString, bool isIpn = false); @@ -29,15 +29,13 @@ PayPalResponse CreatePayment( PayPalApiSettingsBase settings, PayPalSessionData session, List cart, - string providerSystemName, string returnUrl, string cancelUrl); PayPalResponse PatchShipping( PayPalApiSettingsBase settings, PayPalSessionData session, - List cart, - string providerSystemName); + List cart); PayPalResponse ExecutePayment(PayPalApiSettingsBase settings, PayPalSessionData session); diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs index 3cd43ccd1c..eccb635543 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs @@ -18,6 +18,7 @@ using SmartStore.Core.Domain.Tax; using SmartStore.Core.Localization; using SmartStore.Core.Logging; +using SmartStore.PayPal.Providers; using SmartStore.PayPal.Settings; using SmartStore.Services; using SmartStore.Services.Catalog; @@ -112,12 +113,14 @@ private Dictionary CreateAddress(Address addr, bool addRecipient } private Dictionary CreateAmount( - Store store, + PayPalSessionData session, + Store store, Customer customer, List cart, - string providerSystemName, List> items) { + Guard.NotEmpty(session.ProviderSystemName, nameof(session.ProviderSystemName)); + var amount = new Dictionary(); var amountDetails = new Dictionary(); var language = _services.WorkContext.WorkingLanguage; @@ -137,7 +140,7 @@ private Dictionary CreateAmount( var shipping = Math.Round(_orderTotalCalculationService.GetShoppingCartShippingTotal(cart) ?? decimal.Zero, 2); - var additionalHandlingFee = _paymentService.GetAdditionalHandlingFee(cart, providerSystemName); + var additionalHandlingFee = _paymentService.GetAdditionalHandlingFee(cart, session.ProviderSystemName); var paymentFeeBase = _taxService.GetPaymentMethodAdditionalFee(additionalHandlingFee, customer); var paymentFee = Math.Round(_currencyService.ConvertFromPrimaryStoreCurrency(paymentFeeBase, currency), 2); @@ -708,10 +711,9 @@ public PayPalResponse GetPayment(PayPalApiSettingsBase settings, PayPalSessionDa } public PayPalResponse CreatePayment( - PayPalApiSettingsBase settings, - PayPalSessionData session, + PayPalApiSettingsBase settings, + PayPalSessionData session, List cart, - string providerSystemName, string returnUrl, string cancelUrl) { @@ -723,46 +725,71 @@ public PayPalResponse CreatePayment( var data = new Dictionary(); var redirectUrls = new Dictionary(); var payer = new Dictionary(); - //var payerInfo = new Dictionary(); var transaction = new Dictionary(); var items = new List>(); var itemList = new Dictionary(); - // "PayPal PLUS only supports transaction type “Sale” (instant settlement)" - if (providerSystemName == PayPalPlusProvider.SystemName) - data.Add("intent", "sale"); - else - data.Add("intent", settings.TransactMode == TransactMode.AuthorizeAndCapture ? "sale" : "authorize"); + // "PayPal PLUS only supports transaction type “Sale” (instant settlement)" + if (session.ProviderSystemName == PayPalPlusProvider.SystemName) + { + data.Add("intent", "sale"); + } + else + { + data.Add("intent", settings.TransactMode == TransactMode.AuthorizeAndCapture ? "sale" : "authorize"); + } - if (settings.ExperienceProfileId.HasValue()) - data.Add("experience_profile_id", settings.ExperienceProfileId); + if (settings.ExperienceProfileId.HasValue()) + { + data.Add("experience_profile_id", settings.ExperienceProfileId); + } - // redirect urls - if (returnUrl.HasValue()) - redirectUrls.Add("return_url", returnUrl); + // Redirect URLs. + if (returnUrl.HasValue()) + { + redirectUrls.Add("return_url", returnUrl); + } + if (cancelUrl.HasValue()) + { + redirectUrls.Add("cancel_url", cancelUrl); + } + if (redirectUrls.Any()) + { + data.Add("redirect_urls", redirectUrls); + } - if (cancelUrl.HasValue()) - redirectUrls.Add("cancel_url", cancelUrl); + // payer, payer_info + // PayPal review: do not transmit payer_info for PP PLUS. + if (session.ProviderSystemName == PayPalInstalmentsProvider.SystemName) + { + var payerInfo = new Dictionary(); + payerInfo.Add("email", customer.FindEmail().EmptyNull()); + payerInfo.Add("first_name", customer.FirstName.EmptyNull()); + payerInfo.Add("last_name", customer.LastName.EmptyNull()); - if (redirectUrls.Any()) - data.Add("redirect_urls", redirectUrls); + //if (dateOfBirth.HasValue) + //{ + // payerInfo.Add("birth_date", dateOfBirth.Value.ToString("yyyy-MM-dd")); + //} - // payer, payer_info - // paypal review: do not transmit - //if (dateOfBirth.HasValue) - //{ - // payerInfo.Add("birth_date", dateOfBirth.Value.ToString("yyyy-MM-dd")); - //} - //if (customer.BillingAddress != null) - //{ - // payerInfo.Add("billing_address", CreateAddress(customer.BillingAddress, false)); - //} + if (customer.BillingAddress != null) + { + payerInfo.Add("billing_address", CreateAddress(customer.BillingAddress, false)); + } + + payer.Add("external_selected_funding_instrument_type", "Credit"); + payer.Add("payer_info", payerInfo); - payer.Add("payment_method", "paypal"); - //payer.Add("payer_info", payerInfo); + if (customer.ShippingAddress != null) + { + itemList.Add("shipping_address", CreateAddress(customer.ShippingAddress, false)); + } + } + + payer.Add("payment_method", "paypal"); data.Add("payer", payer); - var amount = CreateAmount(store, customer, cart, providerSystemName, items); + var amount = CreateAmount(session, store, customer, cart, items); if (!amount.Any()) { return null; @@ -770,7 +797,7 @@ public PayPalResponse CreatePayment( itemList.Add("items", items); - transaction.Add("amount", amount); + transaction.Add("amount", amount); transaction.Add("item_list", itemList); transaction.Add("invoice_number", session.OrderGuid.ToString()); @@ -789,10 +816,9 @@ public PayPalResponse CreatePayment( } public PayPalResponse PatchShipping( - PayPalApiSettingsBase settings, - PayPalSessionData session, - List cart, - string providerSystemName) + PayPalApiSettingsBase settings, + PayPalSessionData session, + List cart) { var data = new List>(); var amountTotal = new Dictionary(); @@ -810,7 +836,7 @@ public PayPalResponse PatchShipping( } // update of whole amount object required. patching single amount values not possible (MALFORMED_REQUEST). - var amount = CreateAmount(store, customer, cart, providerSystemName, null); + var amount = CreateAmount(session, store, customer, cart, null); amountTotal.Add("op", "replace"); amountTotal.Add("path", "/transactions/0/amount"); @@ -881,6 +907,7 @@ public PayPalResponse Capture(PayPalApiSettingsBase settings, PayPalSessionData amount.Add("currency", store.PrimaryStoreCurrency.CurrencyCode); data.Add("amount", amount); + data.Add("is_final_capture", "true"); var result = CallApi("POST", path, session.AccessToken, settings, JsonConvert.SerializeObject(data)); @@ -1167,7 +1194,8 @@ public PayPalSessionData() OrderGuid = Guid.NewGuid(); } - public bool SessionExpired { get; set; } + public string ProviderSystemName { get; set; } + public bool SessionExpired { get; set; } public string AccessToken { get; set; } public DateTime TokenExpiration { get; set; } public string PaymentId { get; set; } From 973986e952e5fbc256ee91c61740711c261eadf1 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 5 Jun 2019 20:19:33 +0200 Subject: [PATCH 007/115] PayPal: Further work on instalments provider --- .../Orders/OrderService.cs | 5 +- .../PayPalInstalmentsController.cs | 71 ++++++++++++++++++- .../Localization/resources.de-de.xml | 11 ++- .../Localization/resources.en-us.xml | 10 ++- src/Plugins/SmartStore.PayPal/Plugin.cs | 59 ++++++++++++--- .../Providers/PayPalInstalmentsProvider.cs | 15 +++- .../SmartStore.PayPal.csproj | 6 ++ .../OrderDetails.Print.cshtml | 15 ++++ .../PayPalInstalments/OrderDetails.cshtml | 15 ++++ 9 files changed, 189 insertions(+), 18 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.Print.cshtml create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.cshtml diff --git a/src/Libraries/SmartStore.Services/Orders/OrderService.cs b/src/Libraries/SmartStore.Services/Orders/OrderService.cs index 85959f1d5b..e0970a58fc 100644 --- a/src/Libraries/SmartStore.Services/Orders/OrderService.cs +++ b/src/Libraries/SmartStore.Services/Orders/OrderService.cs @@ -10,10 +10,11 @@ using SmartStore.Core.Domain.Payments; using SmartStore.Core.Domain.Shipping; using SmartStore.Core.Events; +using SmartStore.Data.Caching; namespace SmartStore.Services.Orders { - public partial class OrderService : IOrderService + public partial class OrderService : IOrderService { private readonly IRepository _orderRepository; private readonly IRepository _orderItemRepository; @@ -48,7 +49,7 @@ public virtual Order GetOrderById(int orderId) if (orderId == 0) return null; - return _orderRepository.GetById(orderId); + return _orderRepository.GetByIdCached(orderId, "db.order.id-" + orderId); } public virtual IList GetOrdersByIds(int[] orderIds) diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index 3eff613ca3..dc588f366a 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -1,11 +1,17 @@ using System; using System.Collections.Generic; using System.Web.Mvc; +using Newtonsoft.Json; using SmartStore.ComponentModel; +using SmartStore.Core.Logging; using SmartStore.PayPal.Models; using SmartStore.PayPal.Providers; using SmartStore.PayPal.Services; using SmartStore.PayPal.Settings; +using SmartStore.Services.Catalog; +using SmartStore.Services.Common; +using SmartStore.Services.Directory; +using SmartStore.Services.Orders; using SmartStore.Services.Payments; using SmartStore.Web.Framework.Controllers; using SmartStore.Web.Framework.Security; @@ -16,11 +22,23 @@ namespace SmartStore.PayPal.Controllers { public class PayPalInstalmentsController : PayPalRestApiControllerBase { + private readonly IGenericAttributeService _genericAttributeService; + private readonly IOrderService _orderService; + private readonly ICurrencyService _currencyService; + private readonly IPriceFormatter _priceFormatter; + public PayPalInstalmentsController( - IPayPalService payPalService) : base( - PayPalInstalmentsProvider.SystemName, - payPalService) + IPayPalService payPalService, + IGenericAttributeService genericAttributeService, + IOrderService orderService, + ICurrencyService currencyService, + IPriceFormatter priceFormatter) + : base(PayPalInstalmentsProvider.SystemName, payPalService) { + _genericAttributeService = genericAttributeService; + _orderService = orderService; + _currencyService = currencyService; + _priceFormatter = priceFormatter; } public override IList ValidatePaymentForm(FormCollection form) @@ -43,6 +61,51 @@ public ActionResult PaymentInfo() return PartialView(); } + // Widget zone on order details (page and print). + [ChildActionOnly] + public ActionResult OrderDetails(int orderId, bool print) + { + try + { + var order = _orderService.GetOrderById(orderId); + if (order != null && order.PaymentMethodSystemName.IsCaseInsensitiveEqual(PayPalInstalmentsProvider.SystemName)) + { + var str = order.GetAttribute(PayPalInstalmentsOrderAttribute.Key, _genericAttributeService, order.StoreId); + if (str.HasValue()) + { + // Get additional order values in primary store currency. + var orderAttribute = JsonConvert.DeserializeObject(str); + + // Convert into order currency. + var language = Services.WorkContext.WorkingLanguage; + var store = Services.StoreService.GetStoreById(order.StoreId) ?? Services.StoreContext.CurrentStore; + var currency = _currencyService.GetCurrencyByCode(order.CustomerCurrencyCode) ?? store.PrimaryStoreCurrency; + + var financingCosts = _currencyService.ConvertFromPrimaryStoreCurrency(orderAttribute.FinancingCosts, currency, store); + var totalInclFinancingCosts = _currencyService.ConvertFromPrimaryStoreCurrency(orderAttribute.TotalInclFinancingCosts, currency, store); + + ViewBag.FinancingCosts = _priceFormatter.FormatPrice(financingCosts, true, currency, language, false, false); + ViewBag.TotalInclFinancingCosts = _priceFormatter.FormatPrice(totalInclFinancingCosts, true, currency, language, false, false); + + if (print) + { + return PartialView("OrderDetails.Print"); + } + + return PartialView(); + } + } + } + catch (Exception ex) + { + Logger.Error(ex); + } + + return new EmptyResult(); + } + + #region Admin + [ChildActionOnly, AdminAuthorize, LoadSetting, AdminThemed] public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope) { @@ -66,5 +129,7 @@ public ActionResult Configure(PayPalInstalmentsConfigModel model, FormCollection return RedirectToConfiguration(PayPalInstalmentsProvider.SystemName, false); } + + #endregion } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index aff176867b..15ba72066f 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -1,11 +1,14 @@  - PayPal Zahlungsarten Stellt die PayPal-Zahlungsarten zur Verfügung. + + PayPal + + Zugangsdaten @@ -464,6 +467,12 @@ Unter
Wir ermöglichen Ihnen die Finanzierung Ihres Einkaufs mithilfe der Ratenzahlung Powered by PayPal. In Sekundenschnelle, vollständig online, vorbehaltlich Bonitätsprüfung. + + Finanzierungskosten + + + Gesamt inkl. Finanzierungskosten + Mindestbestellwert diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 5403d902f3..718a9fe5e1 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -1,11 +1,13 @@  - PayPal Payment Methods Provides the PayPal payment methods. + + PayPal + Access data @@ -470,6 +472,12 @@ Go to We enable you to finance your purchase with the installment payment Powered by PayPal. In seconds, fully online, subject to credit check. + + Financing costs + + + Total incl. financing costs + Minimum order amount diff --git a/src/Plugins/SmartStore.PayPal/Plugin.cs b/src/Plugins/SmartStore.PayPal/Plugin.cs index c1eadfb6dc..5f3f5801ff 100644 --- a/src/Plugins/SmartStore.PayPal/Plugin.cs +++ b/src/Plugins/SmartStore.PayPal/Plugin.cs @@ -1,16 +1,22 @@ using System; +using System.Collections.Generic; +using System.Web.Routing; using SmartStore.Core.Logging; using SmartStore.Core.Plugins; using SmartStore.PayPal.Providers; using SmartStore.PayPal.Services; using SmartStore.PayPal.Settings; +using SmartStore.Services.Cms; using SmartStore.Services.Configuration; using SmartStore.Services.Localization; +using SmartStore.Web.Models.Order; namespace SmartStore.PayPal { - public class Plugin : BasePlugin - { + [SystemName("Widgets.PayPal")] + [FriendlyName("PayPal")] + public class Plugin : BasePlugin, IWidget + { private readonly ISettingService _settingService; private readonly ILocalizationService _localizationService; private readonly Lazy _payPalService; @@ -29,17 +35,14 @@ public Plugin( public ILogger Logger { get; set; } - public static string SystemName - { - get { return "SmartStore.PayPal"; } - } + public static string SystemName => "SmartStore.PayPal"; public override void Install() { - _settingService.SaveSetting(new PayPalExpressPaymentSettings()); - _settingService.SaveSetting(new PayPalDirectPaymentSettings()); - _settingService.SaveSetting(new PayPalStandardPaymentSettings()); - _settingService.SaveSetting(new PayPalPlusPaymentSettings()); + _settingService.SaveSetting(new PayPalExpressPaymentSettings()); + _settingService.SaveSetting(new PayPalDirectPaymentSettings()); + _settingService.SaveSetting(new PayPalStandardPaymentSettings()); + _settingService.SaveSetting(new PayPalPlusPaymentSettings()); _settingService.SaveSetting(new PayPalInstalmentsSettings()); _localizationService.ImportPluginResourcesFromXml(this.PluginDescriptor); @@ -63,6 +66,42 @@ public override void Uninstall() base.Uninstall(); } + public IList GetWidgetZones() + { + return new List + { + "orderdetails_page_aftertotal", + "invoice_aftertotal" + }; + } + + public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, out string actionName, out string controllerName, out RouteValueDictionary routeValues) + { + actionName = controllerName = null; + routeValues = new RouteValueDictionary + { + { "Namespaces", "SmartStore.PayPal.Controllers" }, + { "area", SystemName } + }; + + if (widgetZone.IsCaseInsensitiveEqual("orderdetails_page_aftertotal") || widgetZone.IsCaseInsensitiveEqual("invoice_aftertotal")) + { + actionName = "OrderDetails"; + controllerName = "PayPalInstalments"; + + var orderId = 0; + var print = widgetZone.IsCaseInsensitiveEqual("invoice_aftertotal"); + var viewModel = model as OrderDetailsModel; + if (viewModel != null) + { + orderId = viewModel.Id; + } + + routeValues.Add(nameof(orderId), orderId); + routeValues.Add(nameof(print), print); + } + } + private void DeleteWebhook(PayPalApiSettingsBase settings, string providerSystemName) { try diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs index f7c345284a..5dcc5f43d8 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs @@ -1,4 +1,5 @@ using System; +using Newtonsoft.Json; using SmartStore.Core.Plugins; using SmartStore.PayPal.Controllers; using SmartStore.PayPal.Settings; @@ -6,9 +7,10 @@ namespace SmartStore.PayPal.Providers { + [DisplayOrder(1)] [SystemName("Payments.PayPalInstalments")] [FriendlyName("Ratenzahlung Powered by PayPal")] - [DisplayOrder(1)] + [DependentWidgets("Widgets.PayPal")] public class PayPalInstalmentsProvider : PayPalRestApiProviderBase { public PayPalInstalmentsProvider() @@ -25,4 +27,15 @@ public override Type GetControllerType() return typeof(PayPalInstalmentsController); } } + + + [Serializable] + public class PayPalInstalmentsOrderAttribute + { + [JsonIgnore] + public static string Key => string.Concat(PayPalInstalmentsProvider.SystemName, ".OrderAttribute"); + + public decimal FinancingCosts { get; set; } + public decimal TotalInclFinancingCosts { get; set; } + } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 9bfd060d13..ee248b1699 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -322,6 +322,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + Designer diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.Print.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.Print.cshtml new file mode 100644 index 0000000000..436f83b119 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.Print.cshtml @@ -0,0 +1,15 @@ +@{ + var financingCosts = ViewBag.FinancingCosts as string; + var totalInclFinancingCosts = ViewBag.TotalInclFinancingCosts as string; +} + + + + + + + + + + +
@T("Plugins.Payments.PayPalInstalments.FinancingCosts"):@financingCosts
@T("Plugins.Payments.PayPalInstalments.TotalInclFinancingCosts"):@totalInclFinancingCosts
\ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.cshtml new file mode 100644 index 0000000000..7d013a8e25 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/OrderDetails.cshtml @@ -0,0 +1,15 @@ +@{ + var financingCosts = ViewBag.FinancingCosts as string; + var totalInclFinancingCosts = ViewBag.TotalInclFinancingCosts as string; +} + + + + + + + + + + +
@T("Plugins.Payments.PayPalInstalments.FinancingCosts"):@financingCosts
@T("Plugins.Payments.PayPalInstalments.TotalInclFinancingCosts"):@totalInclFinancingCosts
\ No newline at end of file From 7b6c25d3aa379e78aff4036bc9aafbd45d6089fa Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Mon, 10 Jun 2019 11:19:36 +0200 Subject: [PATCH 008/115] Resolves #1635 Remove OrderService.LoadAllOrders --- .../Orders/IOrderService.cs | 6 - .../Orders/OrderService.cs | 5 - .../Controllers/SettingController.cs | 187 ++++++++++-------- .../Views/Setting/GeneralCommon.cshtml | 2 +- 4 files changed, 102 insertions(+), 98 deletions(-) diff --git a/src/Libraries/SmartStore.Services/Orders/IOrderService.cs b/src/Libraries/SmartStore.Services/Orders/IOrderService.cs index 44ce9cc26f..e0d8dddfc4 100644 --- a/src/Libraries/SmartStore.Services/Orders/IOrderService.cs +++ b/src/Libraries/SmartStore.Services/Orders/IOrderService.cs @@ -130,12 +130,6 @@ IPagedList SearchOrders(int storeId, int customerId, DateTime? startTime, /// Orders IPagedList GetAllOrders(int affiliateId, int pageIndex, int pageSize); - /// - /// Load all orders - /// - /// Order collection - IList LoadAllOrders(); - /// /// Gets all orders by affiliate identifier /// diff --git a/src/Libraries/SmartStore.Services/Orders/OrderService.cs b/src/Libraries/SmartStore.Services/Orders/OrderService.cs index 85959f1d5b..e1c872264b 100644 --- a/src/Libraries/SmartStore.Services/Orders/OrderService.cs +++ b/src/Libraries/SmartStore.Services/Orders/OrderService.cs @@ -219,11 +219,6 @@ public virtual IPagedList GetAllOrders(int affiliateId, int pageIndex, in return orders; } - public virtual IList LoadAllOrders() - { - return SearchOrders(0, 0, null, null, null, null, null, null, null, null, 0, int.MaxValue); - } - public virtual IList GetOrdersByAffiliateId(int affiliateId) { var query = from o in _orderRepository.Table diff --git a/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs b/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs index 6eadcc7fcf..9476514a76 100644 --- a/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs +++ b/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs @@ -1221,120 +1221,135 @@ public ActionResult GeneralCommon(GeneralCommonSettingsModel model, FormCollecti public ActionResult ChangeEnryptionKey(GeneralCommonSettingsModel model) { if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageSettings)) + { return AccessDeniedView(); + } // Set page timeout to 5 minutes. Server.ScriptTimeout = 300; var storeScope = this.GetActiveStoreScopeConfiguration(_services.StoreService, _services.WorkContext); var securitySettings = _services.Settings.LoadSetting(storeScope); + var oldEncryptionPrivateKey = securitySettings.EncryptionKey; + var newEncryptionPrivateKey = model.SecuritySettings.EncryptionKey.EmptyNull(); - try + if (newEncryptionPrivateKey.IsEmpty() || newEncryptionPrivateKey.Length != 16) { - if (model.SecuritySettings.EncryptionKey == null) - model.SecuritySettings.EncryptionKey = ""; - - model.SecuritySettings.EncryptionKey = model.SecuritySettings.EncryptionKey.Trim(); - - var newEncryptionPrivateKey = model.SecuritySettings.EncryptionKey; - if (newEncryptionPrivateKey.IsEmpty() || newEncryptionPrivateKey.Length != 16) - throw new SmartException(T("Admin.Configuration.Settings.GeneralCommon.EncryptionKey.TooShort")); + NotifyError(T("Admin.Configuration.Settings.GeneralCommon.EncryptionKey.TooShort")); + return RedirectToAction("GeneralCommon"); + } - var oldEncryptionPrivateKey = securitySettings.EncryptionKey; - if (oldEncryptionPrivateKey == newEncryptionPrivateKey) - throw new SmartException(T("Admin.Configuration.Settings.GeneralCommon.EncryptionKey.TheSame")); + if (oldEncryptionPrivateKey == newEncryptionPrivateKey) + { + NotifyError(T("Admin.Configuration.Settings.GeneralCommon.EncryptionKey.TheSame")); + return RedirectToAction("GeneralCommon"); + } + try + { // Update encrypted order info. - var orders = _orderService.LoadAllOrders(); - foreach (var order in orders) + var orderQuery = _orderService.GetOrders(0, 0, null, null, null, null, null, null, null); + orderQuery = orderQuery.OrderByDescending(x => x.CreatedOnUtc); + IPagedList orders = null; + var pageIndex = 0; + + do { - // New credit card encryption. - string decryptedCardType = _encryptionService.DecryptText(order.CardType, oldEncryptionPrivateKey); - string decryptedCardName = _encryptionService.DecryptText(order.CardName, oldEncryptionPrivateKey); - string decryptedCardNumber = _encryptionService.DecryptText(order.CardNumber, oldEncryptionPrivateKey); - string decryptedMaskedCreditCardNumber = _encryptionService.DecryptText(order.MaskedCreditCardNumber, oldEncryptionPrivateKey); - string decryptedCardCvv2 = _encryptionService.DecryptText(order.CardCvv2, oldEncryptionPrivateKey); - string decryptedCardExpirationMonth = _encryptionService.DecryptText(order.CardExpirationMonth, oldEncryptionPrivateKey); - string decryptedCardExpirationYear = _encryptionService.DecryptText(order.CardExpirationYear, oldEncryptionPrivateKey); - - string encryptedCardType = _encryptionService.EncryptText(decryptedCardType, newEncryptionPrivateKey); - string encryptedCardName = _encryptionService.EncryptText(decryptedCardName, newEncryptionPrivateKey); - string encryptedCardNumber = _encryptionService.EncryptText(decryptedCardNumber, newEncryptionPrivateKey); - string encryptedMaskedCreditCardNumber = _encryptionService.EncryptText(decryptedMaskedCreditCardNumber, newEncryptionPrivateKey); - string encryptedCardCvv2 = _encryptionService.EncryptText(decryptedCardCvv2, newEncryptionPrivateKey); - string encryptedCardExpirationMonth = _encryptionService.EncryptText(decryptedCardExpirationMonth, newEncryptionPrivateKey); - string encryptedCardExpirationYear = _encryptionService.EncryptText(decryptedCardExpirationYear, newEncryptionPrivateKey); - - order.CardType = encryptedCardType; - order.CardName = encryptedCardName; - order.CardNumber = encryptedCardNumber; - order.MaskedCreditCardNumber = encryptedMaskedCreditCardNumber; - order.CardCvv2 = encryptedCardCvv2; - order.CardExpirationMonth = encryptedCardExpirationMonth; - order.CardExpirationYear = encryptedCardExpirationYear; - - // New direct debit encryption. - string decryptedAccountHolder = _encryptionService.DecryptText(order.DirectDebitAccountHolder, oldEncryptionPrivateKey); - string decryptedAccountNumber = _encryptionService.DecryptText(order.DirectDebitAccountNumber, oldEncryptionPrivateKey); - string decryptedBankCode = _encryptionService.DecryptText(order.DirectDebitBankCode, oldEncryptionPrivateKey); - string decryptedBankName = _encryptionService.DecryptText(order.DirectDebitBankName, oldEncryptionPrivateKey); - string decryptedBic = _encryptionService.DecryptText(order.DirectDebitBIC, oldEncryptionPrivateKey); - string decryptedCountry = _encryptionService.DecryptText(order.DirectDebitCountry, oldEncryptionPrivateKey); - string decryptedIban = _encryptionService.DecryptText(order.DirectDebitIban, oldEncryptionPrivateKey); - - string encryptedAccountHolder = _encryptionService.EncryptText(decryptedAccountHolder, newEncryptionPrivateKey); - string encryptedAccountNumber = _encryptionService.EncryptText(decryptedAccountNumber, newEncryptionPrivateKey); - string encryptedBankCode = _encryptionService.EncryptText(decryptedBankCode, newEncryptionPrivateKey); - string encryptedBankName = _encryptionService.EncryptText(decryptedBankName, newEncryptionPrivateKey); - string encryptedBic = _encryptionService.EncryptText(decryptedBic, newEncryptionPrivateKey); - string encryptedCountry = _encryptionService.EncryptText(decryptedCountry, newEncryptionPrivateKey); - string encryptedIban = _encryptionService.EncryptText(decryptedIban, newEncryptionPrivateKey); - - order.DirectDebitAccountHolder = encryptedAccountHolder; - order.DirectDebitAccountNumber = encryptedAccountNumber; - order.DirectDebitBankCode = encryptedBankCode; - order.DirectDebitBankName = encryptedBankName; - order.DirectDebitBIC = encryptedBic; - order.DirectDebitCountry = encryptedCountry; - order.DirectDebitIban = encryptedIban; - - _orderService.UpdateOrder(order); + orders = new PagedList(orderQuery, pageIndex++, 1000); + + foreach (var order in orders) + { + // New credit card encryption. + string decryptedCardType = _encryptionService.DecryptText(order.CardType, oldEncryptionPrivateKey); + string decryptedCardName = _encryptionService.DecryptText(order.CardName, oldEncryptionPrivateKey); + string decryptedCardNumber = _encryptionService.DecryptText(order.CardNumber, oldEncryptionPrivateKey); + string decryptedMaskedCreditCardNumber = _encryptionService.DecryptText(order.MaskedCreditCardNumber, oldEncryptionPrivateKey); + string decryptedCardCvv2 = _encryptionService.DecryptText(order.CardCvv2, oldEncryptionPrivateKey); + string decryptedCardExpirationMonth = _encryptionService.DecryptText(order.CardExpirationMonth, oldEncryptionPrivateKey); + string decryptedCardExpirationYear = _encryptionService.DecryptText(order.CardExpirationYear, oldEncryptionPrivateKey); + + string encryptedCardType = _encryptionService.EncryptText(decryptedCardType, newEncryptionPrivateKey); + string encryptedCardName = _encryptionService.EncryptText(decryptedCardName, newEncryptionPrivateKey); + string encryptedCardNumber = _encryptionService.EncryptText(decryptedCardNumber, newEncryptionPrivateKey); + string encryptedMaskedCreditCardNumber = _encryptionService.EncryptText(decryptedMaskedCreditCardNumber, newEncryptionPrivateKey); + string encryptedCardCvv2 = _encryptionService.EncryptText(decryptedCardCvv2, newEncryptionPrivateKey); + string encryptedCardExpirationMonth = _encryptionService.EncryptText(decryptedCardExpirationMonth, newEncryptionPrivateKey); + string encryptedCardExpirationYear = _encryptionService.EncryptText(decryptedCardExpirationYear, newEncryptionPrivateKey); + + order.CardType = encryptedCardType; + order.CardName = encryptedCardName; + order.CardNumber = encryptedCardNumber; + order.MaskedCreditCardNumber = encryptedMaskedCreditCardNumber; + order.CardCvv2 = encryptedCardCvv2; + order.CardExpirationMonth = encryptedCardExpirationMonth; + order.CardExpirationYear = encryptedCardExpirationYear; + + // New direct debit encryption. + string decryptedAccountHolder = _encryptionService.DecryptText(order.DirectDebitAccountHolder, oldEncryptionPrivateKey); + string decryptedAccountNumber = _encryptionService.DecryptText(order.DirectDebitAccountNumber, oldEncryptionPrivateKey); + string decryptedBankCode = _encryptionService.DecryptText(order.DirectDebitBankCode, oldEncryptionPrivateKey); + string decryptedBankName = _encryptionService.DecryptText(order.DirectDebitBankName, oldEncryptionPrivateKey); + string decryptedBic = _encryptionService.DecryptText(order.DirectDebitBIC, oldEncryptionPrivateKey); + string decryptedCountry = _encryptionService.DecryptText(order.DirectDebitCountry, oldEncryptionPrivateKey); + string decryptedIban = _encryptionService.DecryptText(order.DirectDebitIban, oldEncryptionPrivateKey); + + string encryptedAccountHolder = _encryptionService.EncryptText(decryptedAccountHolder, newEncryptionPrivateKey); + string encryptedAccountNumber = _encryptionService.EncryptText(decryptedAccountNumber, newEncryptionPrivateKey); + string encryptedBankCode = _encryptionService.EncryptText(decryptedBankCode, newEncryptionPrivateKey); + string encryptedBankName = _encryptionService.EncryptText(decryptedBankName, newEncryptionPrivateKey); + string encryptedBic = _encryptionService.EncryptText(decryptedBic, newEncryptionPrivateKey); + string encryptedCountry = _encryptionService.EncryptText(decryptedCountry, newEncryptionPrivateKey); + string encryptedIban = _encryptionService.EncryptText(decryptedIban, newEncryptionPrivateKey); + + order.DirectDebitAccountHolder = encryptedAccountHolder; + order.DirectDebitAccountNumber = encryptedAccountNumber; + order.DirectDebitBankCode = encryptedBankCode; + order.DirectDebitBankName = encryptedBankName; + order.DirectDebitBIC = encryptedBic; + order.DirectDebitCountry = encryptedCountry; + order.DirectDebitIban = encryptedIban; + + _orderService.UpdateOrder(order); + } } + while (orders.HasNextPage); - // Update user information. - // Optimization - load only users with PasswordFormat.Encrypted. - - var query = _customerService.GetAllCustomersByPasswordFormat(PasswordFormat.Encrypted).SourceQuery; + // Update user information. + var customerQuery = _customerService.GetAllCustomersByPasswordFormat(PasswordFormat.Encrypted).SourceQuery; + PagedList customers = null; + pageIndex = 0; - for (var pageIndex = 0; pageIndex < 9999999; ++pageIndex) - { - var customers = new PagedList(query, pageIndex, 1000); - - foreach (var customer in customers) - { - string decryptedPassword = _encryptionService.DecryptText(customer.Password, oldEncryptionPrivateKey); - string encryptedPassword = _encryptionService.EncryptText(decryptedPassword, newEncryptionPrivateKey); + do + { + customers = new PagedList(customerQuery, pageIndex++, 1000); - customer.Password = encryptedPassword; - } + if (customers.Any()) + { + foreach (var customer in customers) + { + var decryptedPassword = _encryptionService.DecryptText(customer.Password, oldEncryptionPrivateKey); + var encryptedPassword = _encryptionService.EncryptText(decryptedPassword, newEncryptionPrivateKey); - Services.DbContext.SaveChanges(); + customer.Password = encryptedPassword; + } - if (!customers.HasNextPage) - break; - } + Services.DbContext.SaveChanges(); + } + } + while (customers.HasNextPage); securitySettings.EncryptionKey = newEncryptionPrivateKey; _services.Settings.SaveSetting(securitySettings); NotifySuccess(T("Admin.Configuration.Settings.GeneralCommon.EncryptionKey.Changed")); } - catch (Exception exc) + catch (Exception ex) { - NotifyError(exc); + NotifyError(ex); + Logger.Error(ex); } - return RedirectToAction("GeneralCommon"); + return RedirectToAction("GeneralCommon"); } [HttpPost] diff --git a/src/Presentation/SmartStore.Web/Administration/Views/Setting/GeneralCommon.cshtml b/src/Presentation/SmartStore.Web/Administration/Views/Setting/GeneralCommon.cshtml index c0173ffc6e..85be9d9d7b 100644 --- a/src/Presentation/SmartStore.Web/Administration/Views/Setting/GeneralCommon.cshtml +++ b/src/Presentation/SmartStore.Web/Administration/Views/Setting/GeneralCommon.cshtml @@ -241,7 +241,7 @@
@Html.EditorFor(model => model.SecuritySettings.EncryptionKey, new { @class = "form-control" }) -
From c0369dc5ef6376ab14a82499f1adfcf07c088dd5 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Mon, 10 Jun 2019 11:37:15 +0200 Subject: [PATCH 009/115] Resolves #1646 Setting ManufacturerItemsToDisplayOnHomepage to 1 will not show any manufacturer --- .../Controllers/CatalogController.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs index d55af20b45..c5443e0d79 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs @@ -435,15 +435,16 @@ public ActionResult ManufacturerAll() [ChildActionOnly] public ActionResult HomepageManufacturers() { - if (_catalogSettings.ManufacturerItemsToDisplayOnHomepage == 0 || _catalogSettings.ShowManufacturersOnHomepage == false) - return Content(""); - - var model = _helper.PrepareManufacturerNavigationModel(_catalogSettings.ManufacturerItemsToDisplayOnHomepage - 1); - - if (model.Manufacturers.Count == 0) - return Content(""); + if (_catalogSettings.ManufacturerItemsToDisplayOnHomepage > 0 && _catalogSettings.ShowManufacturersOnHomepage) + { + var model = _helper.PrepareManufacturerNavigationModel(_catalogSettings.ManufacturerItemsToDisplayOnHomepage); + if (model.Manufacturers.Any()) + { + return PartialView(model); + } + } - return PartialView(model); + return new EmptyResult(); } #endregion From 29d15ea7f9fba26602fb3ca6cee4523d85f24d9c Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Mon, 10 Jun 2019 12:39:47 +0200 Subject: [PATCH 010/115] Resolves #1647 All manufacturers page: link of last character missing in alphabetical letter list --- changelog.md | 4 ++ .../Controllers/CatalogController.cs | 10 +-- .../Views/Catalog/ManufacturerAll.cshtml | 63 ++++++------------- 3 files changed, 27 insertions(+), 50 deletions(-) diff --git a/changelog.md b/changelog.md index 4f4a7f4567..e0fa82de67 100644 --- a/changelog.md +++ b/changelog.md @@ -9,6 +9,10 @@ * Page Builder: multistore support for stories. * #1639 Shipping.ByTotal: Add option to calculate the shipping rate based on the net total instead of the gross total. +### Bugfixes +* #1646 Setting ManufacturerItemsToDisplayOnHomepage to 1 will not show any manufacturer. +* #1647 All manufacturers page: link of last character missing in alphabetical letter list. + ## SmartStore.NET 3.2.1 diff --git a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs index c5443e0d79..e97d8d19e2 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs @@ -420,15 +420,15 @@ public ActionResult ManufacturerAll() var manufacturers = _manufacturerService.GetAllManufacturers(null, _services.StoreContext.CurrentStore.Id); foreach (var manufacturer in manufacturers) { - var modelMan = manufacturer.ToModel(); - - // prepare picture model - modelMan.PictureModel = _helper.PrepareManufacturerPictureModel(manufacturer, modelMan.Name); - model.Add(modelMan); + var manuModel = manufacturer.ToModel(); + manuModel.PictureModel = _helper.PrepareManufacturerPictureModel(manufacturer, manuModel.Name); + model.Add(manuModel); } _services.DisplayControl.AnnounceRange(manufacturers); + ViewBag.SortManufacturersAlphabetically = _catalogSettings.SortManufacturersAlphabetically; + return View(model); } diff --git a/src/Presentation/SmartStore.Web/Views/Catalog/ManufacturerAll.cshtml b/src/Presentation/SmartStore.Web/Views/Catalog/ManufacturerAll.cshtml index c434b793d0..76c9711f04 100644 --- a/src/Presentation/SmartStore.Web/Views/Catalog/ManufacturerAll.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Catalog/ManufacturerAll.cshtml @@ -1,7 +1,4 @@ -@using SmartStore.Core.Infrastructure; -@using SmartStore.Web.Models.Catalog; -@using SmartStore.Core.Domain.Catalog; - +@using SmartStore.Web.Models.Catalog; @model IList @{ Layout = "_Layout"; @@ -9,10 +6,8 @@ Html.AddTitleParts(T("PageTitle.Manufacturers").Text); var numericList = Model.Where(x => Char.IsNumber(x.Name.Value[0])).OrderBy(x => x.Name); - var alphabeticalList = Model.Except(numericList).OrderBy(x => x.Name); - var currentLetter = String.Empty; - var areaLetter = alphabeticalList.FirstOrDefault()?.Name?.Value.EmptyNull().Substring(0, 1).ToUpper(); - var catalogSettings = EngineContext.Current.Resolve(); + var alphabeticalList = Model.Except(numericList).Where(x => x.Name.HasValue()).OrderBy(x => x.Name); + var sortManufacturersAlphabetically = (bool)ViewBag.SortManufacturersAlphabetically; }
@@ -22,30 +17,20 @@
@{ Html.RenderWidget("manufacturers_all_top"); } - @if (catalogSettings.SortManufacturersAlphabetically) + @if (sortManufacturersAlphabetically) { + var groupedManus = alphabeticalList.GroupBy(x => char.ToUpper(x.Name.Value[0])); +
-
@@ -60,32 +45,20 @@ }
} - -

@areaLetter

-
- @foreach (var item in alphabeticalList) - { - currentLetter = item.Name.Value.Substring(0, 1).ToUpper(); - - if (!currentLetter.Equals(areaLetter)) + foreach (var manu in groupedManus) + { +

@manu.Key

+
+ @foreach (var item in manu) { - @:
- -

@currentLetter

- - @:
- - areaLetter = currentLetter; + @RenderManufacturer(item); } - - @RenderManufacturer(item); - } -
+
+ } } else { -
@foreach (var item in Model) { From 5ea8af906be3270268f86ba1dc1760d09a6a29f0 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Tue, 11 Jun 2019 10:41:06 +0200 Subject: [PATCH 011/115] Amazon Pay: occurrence of InvalidPaymentMethod requires a new confirmation --- .../Controllers/AmazonPayCheckoutController.cs | 2 +- .../SmartStore.AmazonPay/Services/AmazonPayService.cs | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Plugins/SmartStore.AmazonPay/Controllers/AmazonPayCheckoutController.cs b/src/Plugins/SmartStore.AmazonPay/Controllers/AmazonPayCheckoutController.cs index 0ee144ab77..35fbe06a06 100644 --- a/src/Plugins/SmartStore.AmazonPay/Controllers/AmazonPayCheckoutController.cs +++ b/src/Plugins/SmartStore.AmazonPay/Controllers/AmazonPayCheckoutController.cs @@ -197,7 +197,7 @@ public ActionResult ConfirmationResult(string authenticationStatus) else { // authenticationStatus == "Abandoned": The buyer took action to close/cancel the MFA challenge. - // Review: redirect back to wallet widget (like InvalidPaymentMethod). + // Review: redirect to checkout payment page (like InvalidPaymentMethod). state.IsConfirmed = false; state.FormData = null; diff --git a/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs b/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs index abbaa3e7f8..a24c0646f7 100644 --- a/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs +++ b/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs @@ -1001,12 +1001,6 @@ public bool ConfirmOrderReference() { try { - var failureReason = _httpContext.Session["AmazonPayFailedPaymentReason"] as string; - if (failureReason.IsCaseInsensitiveEqual("InvalidPaymentMethod") || failureReason.IsCaseInsensitiveEqual("AuthenticationStatusFailure")) - { - return false; - } - var store = _services.StoreContext.CurrentStore; var settings = _services.Settings.LoadSetting(store.Id); var state = _httpContext.GetAmazonPayState(_services.Localization); @@ -1154,6 +1148,10 @@ public ProcessPaymentResult ProcessPayment(ProcessPaymentRequest request) // Must be redirected to checkout payment page. _httpContext.Session["AmazonPayFailedPaymentReason"] = reason; + // Review: confirmation required to get order reference object from suspended to open state again. + state.IsConfirmed = false; + state.FormData = null; + var urlHelper = new UrlHelper(_httpContext.Request.RequestContext); _httpContext.Response.Redirect(urlHelper.Action("PaymentMethod", "Checkout", new { area = "" })); } From c31146b937e8ec3d027e4e06ffee6d6fc91fdfe1 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Tue, 11 Jun 2019 11:49:22 +0200 Subject: [PATCH 012/115] Amazon Pay: show throbber when simulating buy button click --- .../Migrations/MigrationsConfiguration.cs | 4 ++++ .../ScriptingReadWidgets.cshtml | 2 +- .../Views/Checkout/Confirm.cshtml | 24 +++++++++++-------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs index 44eaed27f5..a969e473f0 100644 --- a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs +++ b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs @@ -53,6 +53,10 @@ public void MigrateLocaleResources(LocaleResourcesBuilder builder) builder.AddOrUpdate("Admin.Configuration.Languages.NoAvailableLanguagesFound", "There were no other available languages found for version {0}. On translate.smartstore.com you will find more details about available resources.", "Es wurden keine weiteren verfügbaren Sprachen für Version {0} gefunden. Auf translate.smartstore.com finden Sie weitere Details zu verfügbaren Ressourcen."); + + builder.AddOrUpdate("Checkout.OrderCompletes", + "Your order will be completed.", + "Ihre Bestellung wird abgeschlossen."); } } } diff --git a/src/Plugins/SmartStore.AmazonPay/Views/AmazonPayShoppingCart/ScriptingReadWidgets.cshtml b/src/Plugins/SmartStore.AmazonPay/Views/AmazonPayShoppingCart/ScriptingReadWidgets.cshtml index 67662e6972..86fe47e92c 100644 --- a/src/Plugins/SmartStore.AmazonPay/Views/AmazonPayShoppingCart/ScriptingReadWidgets.cshtml +++ b/src/Plugins/SmartStore.AmazonPay/Views/AmazonPayShoppingCart/ScriptingReadWidgets.cshtml @@ -111,8 +111,8 @@ jQuery(document).ready(function () { var clickBuyButtonEvent = jQuery.Event('clickBuyButton'); - clickBuyButtonEvent.scrollTo = true; clickBuyButtonEvent.customerAgreed = true; + clickBuyButtonEvent.showThrobber = true; $(document).trigger(clickBuyButtonEvent); }); diff --git a/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml b/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml index 6f23ff4003..76047c3ade 100644 --- a/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml @@ -161,13 +161,13 @@ .addClass(disable ? 'fa-spinner fa-spin' : 'fa-angle-right'); } - function processBuyButtonClick(customerAgreed) { + function processBuyButtonClick(customerAgreed, showThrobber) { var termOfServiceOk = true, userAgreementsOk = true, esdRevocationWaiverOk = true, cartItems = $('#cart-items'); - if (customerAgreed) { + if (_.isTrue(customerAgreed)) { // Reverse apply. We do that just to indicate that no entered data is lost. $("#CustomerComment").val($("#customercommenthidden").val()); } @@ -192,7 +192,7 @@ // Agree user agreement for downloadable products. cartItems.find('input[name^=AgreeUserAgreement]').each(function () { - if (customerAgreed) { + if (_.isTrue(customerAgreed)) { $(this).prop('checked', true); } else if (!$(this).is(':checked')) { @@ -210,7 +210,7 @@ { cartItems.find('input[name^=AgreeEsdRevocationWaiver]').each(function () { - if (customerAgreed) { + if (_.isTrue(customerAgreed)) { $(this).prop('checked', true); } else if (!$(this).is(':checked')) { @@ -234,7 +234,15 @@ $(document).trigger(submitOrderEvent); if (true === submitOrderEvent.isOrderValid) { - setBuyButtonState(true); + try { + setBuyButtonState(true); + + if (_.isTrue(showThrobber)) { + $.throbber.show({ white: true, small: false, speed: 0, message: '@T("Checkout.OrderCompletes").ToString().EncodeJsString('"', false)' }); + } + } + catch (e) { } + $('#confirm-order-form').submit(); } else if (true === submitOrderEvent.disableBuyButton) { @@ -250,11 +258,7 @@ // Simulate buy button click. $(document).on('clickBuyButton', function (e) { - if (e.scrollTo) { - $.scrollTo(buyButton, 800, { offset: -20 }); - } - - processBuyButtonClick(e.customerAgreed); + processBuyButtonClick(e.customerAgreed, e.showThrobber); }); // Report error. From 5ff4f06e0be3bb621fd16229ccfad48d9e67ba25 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Tue, 11 Jun 2019 20:15:59 +0200 Subject: [PATCH 013/115] SEO: disallow login and register routes with query strings --- .../SmartStore.Web/Controllers/CommonController.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Presentation/SmartStore.Web/Controllers/CommonController.cs b/src/Presentation/SmartStore.Web/Controllers/CommonController.cs index 7e089a7072..9c92ae578a 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CommonController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CommonController.cs @@ -638,8 +638,10 @@ public ActionResult RobotsTextFile() "/Config$", "/Settings$", "/Login$", - "/Register$" - }; + "/Login?*", + "/Register$", + "/Register?*" + }; const string newLine = "\r\n"; //Environment.NewLine From dc46426f925f1befcab417258dcb869b26a8e301 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Tue, 11 Jun 2019 20:40:32 +0200 Subject: [PATCH 014/115] Closes #1625 Quantity resets to 1 after attribute change --- src/Presentation/SmartStore.Web/Controllers/CatalogHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Presentation/SmartStore.Web/Controllers/CatalogHelper.cs b/src/Presentation/SmartStore.Web/Controllers/CatalogHelper.cs index cff0ef57bc..55d145af46 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CatalogHelper.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CatalogHelper.cs @@ -1202,7 +1202,7 @@ public ProductDetailsModel PrepareProductDetailModel( #region 'Add to cart' model model.AddToCart.ProductId = product.Id; - model.AddToCart.EnteredQuantity = product.OrderMinimumQuantity; + model.AddToCart.EnteredQuantity = product.OrderMinimumQuantity > selectedQuantity ? product.OrderMinimumQuantity : selectedQuantity; model.AddToCart.MinOrderAmount = product.OrderMinimumQuantity; model.AddToCart.MaxOrderAmount = product.OrderMaximumQuantity; model.AddToCart.QuantityUnitName = model.QuantityUnitName; // TODO: (mc) remove 'QuantityUnitName' from parent model later From 2b4304ebe60e2a8b987bb26d362dd173250a5eb8 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 12 Jun 2019 10:52:22 +0200 Subject: [PATCH 015/115] Minor improvement --- .../SmartStore.Web/Views/Checkout/Confirm.cshtml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml b/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml index 76047c3ade..78643d738d 100644 --- a/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Checkout/Confirm.cshtml @@ -277,8 +277,13 @@ var warnings = $('#confirm-warnings'); warnings.html(str); - setBuyButtonState(false); - $.scrollTo(warnings, 800, { offset: -20 }); + + try { + setBuyButtonState(false); + $.throbber.hide(true); + $.scrollTo(warnings, 800, { offset: -20 }); + } + catch (e) { } } }); }); From 3e99d18dc80984f6e9ce6cc5d25179f2c2eeefa1 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 12 Jun 2019 12:38:06 +0200 Subject: [PATCH 016/115] Updates an unclear string resource --- .../Migrations/MigrationsConfiguration.cs | 10 ++++++++++ .../SmartStore.Services/Orders/ShoppingCartService.cs | 10 ++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs index a969e473f0..6bd75d12d9 100644 --- a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs +++ b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs @@ -57,6 +57,16 @@ public void MigrateLocaleResources(LocaleResourcesBuilder builder) builder.AddOrUpdate("Checkout.OrderCompletes", "Your order will be completed.", "Ihre Bestellung wird abgeschlossen."); + + builder.AddOrUpdate("Admin.Catalog.Attributes.CheckoutAttributes.Fields.TextPrompt", + "Text prompt", + "Text Eingabeaufforderung", + "Specifies the prompt text.", + "Legt den Text zur Eingabeaufforderung fest."); + + builder.AddOrUpdate("Admin.Catalog.Products.ProductVariantAttributes.Attributes.Fields.TextPrompt", + "Text prompt", + "Text Eingabeaufforderung"); } } } diff --git a/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs b/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs index 47e05d3015..d0880c760d 100644 --- a/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs +++ b/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs @@ -942,10 +942,16 @@ public virtual IList GetShoppingCartWarnings(IList a.TextPrompt))) - warnings.Add(ca2.GetLocalized(a => a.TextPrompt)); + string textPrompt = ca2.GetLocalized(a => a.TextPrompt); + + if (textPrompt.HasValue()) + { + warnings.Add(textPrompt); + } else + { warnings.Add(T("ShoppingCart.SelectAttribute", ca2.GetLocalized(a => a.Name))); + } } } } From 4025fe40e0c858b656de5449292a3ffeba9cbf44 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 12 Jun 2019 17:26:04 +0200 Subject: [PATCH 017/115] PayPal: Further work on instalments provider --- .../PayPalInstalmentsController.cs | 30 ++++++ .../Controllers/PayPalPlusController.cs | 3 - .../SmartStore.PayPal/DependencyRegistrar.cs | 4 +- .../PayPalInstalmentsCheckoutFilter.cs | 99 +++++++++++++++++++ .../Localization/resources.de-de.xml | 4 +- .../Localization/resources.en-us.xml | 4 +- .../Services/PayPalService.cs | 32 +++--- .../SmartStore.PayPal.csproj | 1 + 8 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index dc588f366a..e4173c276b 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Web; using System.Web.Mvc; using Newtonsoft.Json; using SmartStore.ComponentModel; @@ -22,12 +23,14 @@ namespace SmartStore.PayPal.Controllers { public class PayPalInstalmentsController : PayPalRestApiControllerBase { + private readonly HttpContextBase _httpContext; private readonly IGenericAttributeService _genericAttributeService; private readonly IOrderService _orderService; private readonly ICurrencyService _currencyService; private readonly IPriceFormatter _priceFormatter; public PayPalInstalmentsController( + HttpContextBase httpContext, IPayPalService payPalService, IGenericAttributeService genericAttributeService, IOrderService orderService, @@ -35,6 +38,7 @@ public PayPalInstalmentsController( IPriceFormatter priceFormatter) : base(PayPalInstalmentsProvider.SystemName, payPalService) { + _httpContext = httpContext; _genericAttributeService = genericAttributeService; _orderService = orderService; _currencyService = currencyService; @@ -104,6 +108,32 @@ public ActionResult OrderDetails(int orderId, bool print) return new EmptyResult(); } + // Redirect from PayPal. + public ActionResult CheckoutReturn(string systemName, string paymentId, string PayerID) + { + // Request.QueryString: + // paymentId: PAY-0TC88803RP094490KK4KM6AI, token (not the access token): EC-5P379249AL999154U, PayerID: 5L9K773HHJLPN + + var store = Services.StoreContext.CurrentStore; + var customer = Services.WorkContext.CurrentCustomer; + var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + + if (paymentId.HasValue() && session.PaymentId.IsEmpty()) + { + session.PaymentId = paymentId; + } + + session.PayerId = PayerID; + + return RedirectToAction("Confirm", "Checkout", new { area = "" }); + } + + // Redirect from PayPal. + public ActionResult CheckoutCancel() + { + return RedirectToAction("PaymentMethod", "Checkout", new { area = "" }); + } + #region Admin [ChildActionOnly, AdminAuthorize, LoadSetting, AdminThemed] diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs index 4835db0153..02f8258c98 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalPlusController.cs @@ -356,7 +356,6 @@ public ActionResult CheckoutCompleted() return new EmptyResult(); } - [ValidateInput(false)] public ActionResult CheckoutReturn(string systemName, string paymentId, string PayerID) { // Request.QueryString: @@ -364,7 +363,6 @@ public ActionResult CheckoutReturn(string systemName, string paymentId, string P var store = Services.StoreContext.CurrentStore; var customer = Services.WorkContext.CurrentCustomer; - var settings = Services.Settings.LoadSetting(store.Id); var session = _httpContext.GetPayPalState(PayPalPlusProvider.SystemName); if (systemName.IsEmpty()) @@ -389,7 +387,6 @@ public ActionResult CheckoutReturn(string systemName, string paymentId, string P return RedirectToAction("Confirm", "Checkout", new { area = "" }); } - [ValidateInput(false)] public ActionResult CheckoutCancel() { // Request.QueryString: diff --git a/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs b/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs index 9d75b41f77..fc3e6ea374 100644 --- a/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs +++ b/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs @@ -27,7 +27,9 @@ public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, b builder.RegisterType() .AsActionFilterFor(x => x.Completed()) .InstancePerRequest(); - } + + builder.RegisterType().AsActionFilterFor().InstancePerRequest(); + } } public int Order diff --git a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs new file mode 100644 index 0000000000..35aee9e8cb --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs @@ -0,0 +1,99 @@ +using System; +using System.Web.Mvc; +using SmartStore.Core.Domain.Customers; +using SmartStore.Core.Domain.Orders; +using SmartStore.Core.Logging; +using SmartStore.PayPal.Providers; +using SmartStore.PayPal.Services; +using SmartStore.PayPal.Settings; +using SmartStore.Services; +using SmartStore.Services.Common; +using SmartStore.Services.Customers; + +namespace SmartStore.PayPal.Filters +{ + public class PayPalInstalmentsCheckoutFilter : IActionFilter + { + private readonly ICommonServices _services; + private readonly Lazy _payPalService; + private readonly Lazy _genericAttributeService; + + public PayPalInstalmentsCheckoutFilter( + ICommonServices services, + Lazy payPalService, + Lazy genericAttributeService) + { + _services = services; + _payPalService = payPalService; + _genericAttributeService = genericAttributeService; + } + + public void OnActionExecuting(ActionExecutingContext filterContext) + { + if (filterContext?.ActionDescriptor == null || filterContext?.HttpContext?.Request == null) + { + return; + } + + var action = filterContext.ActionDescriptor.ActionName; + if (action.IsCaseInsensitiveEqual("Confirm")) + { + var store = _services.StoreContext.CurrentStore; + } + } + + public void OnActionExecuted(ActionExecutedContext filterContext) + { + } + + private void CreatePayment(ActionExecutingContext context) + { + var store = _services.StoreContext.CurrentStore; + var customer = _services.WorkContext.CurrentCustomer; + var settings = _services.Settings.LoadSetting(store.Id); + + var session = context.HttpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + session.PaymentId = null; + session.ApprovalUrl = null; + + var result = _payPalService.Value.EnsureAccessToken(session, settings); + if (result.Success) + { + var urlHelper = new UrlHelper(context.HttpContext.Request.RequestContext); + var protocol = store.SslEnabled ? "https" : "http"; + var returnUrl = urlHelper.Action("CheckoutReturn", "PayPalInstalments", new { area = Plugin.SystemName }, protocol); + var cancelUrl = urlHelper.Action("CheckoutCancel", "PayPalInstalments", new { area = Plugin.SystemName }, protocol); + var cart = customer.GetCartItems(ShoppingCartType.ShoppingCart, store.Id); + + result = _payPalService.Value.CreatePayment(settings, session, cart, returnUrl, cancelUrl); + if (result == null) + { + // No payment required. + } + else if (result.Success && result.Json != null) + { + foreach (var link in result.Json.links) + { + if (((string)link.rel).IsCaseInsensitiveEqual("approval_url")) + { + session.PaymentId = result.Id; + session.ApprovalUrl = link.href; + + context.Result = new RedirectResult(link.href, false); + break; + } + } + } + else + { + _genericAttributeService.Value.SaveAttribute(customer, SystemCustomerAttributeNames.SelectedPaymentMethod, null, store.Id); + + var url = urlHelper.Action("PaymentMethod", "Checkout", new { area = "" }); + context.Result = new RedirectResult(url, false); + + _services.Notifier.Error(result.ErrorMessage); + } + } + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index 15ba72066f..b4e970f8bd 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -454,14 +454,14 @@ Unter - So richten Sie Ratenzahlung Powered by PayPal ein: + So richten Sie Ratenzahlung Powered by PayPal ein:

  1. Legen Sie unter My Apps & Credentials eine neue REST API Anwendung an. Unter Manage your applications finden Sie weitere Informationen zum Thema PayPal Anwendungen (Englisch).
  2. Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
  3. Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
  4. Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.
  5. -
]]> +

Once an order has been placed, the order total and order items may no longer be changed!

]]> diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 718a9fe5e1..1fd2984944 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -459,14 +459,14 @@ Go to - How to set up Ratenzahlung Powered by PayPal: + How to set up Ratenzahlung Powered by PayPal:

  1. Create a new REST API application under My Apps & Credentials. Go to Manage your applications to get more information about PayPal applications.
  2. Click the name of the application and enter Client-ID and Secret below on this page. Save.
  3. Optional: Click Add next to Experience profile ID to create a new profile. Your shop data (name, logo etc.) can now be displayed to customers when paying on PayPal pages.
  4. Optional: Click Add next to Webhook-ID to create a webhook. Through a webhook the shop receives PayPal messages und possibly updates the payment state of your orders.
  5. -
]]> +

]]>
diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs index eccb635543..68b2d8607b 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs @@ -729,8 +729,8 @@ public PayPalResponse CreatePayment( var items = new List>(); var itemList = new Dictionary(); - // "PayPal PLUS only supports transaction type “Sale” (instant settlement)" - if (session.ProviderSystemName == PayPalPlusProvider.SystemName) + // "PayPal PLUS only supports transaction type “Sale” (instant settlement)". + if (session.ProviderSystemName == PayPalPlusProvider.SystemName || session.ProviderSystemName == PayPalInstalmentsProvider.SystemName) { data.Add("intent", "sale"); } @@ -944,7 +944,7 @@ public PayPalResponse UpsertCheckoutExperience(PayPalApiSettingsBase settings, P var presentation = new Dictionary(); var inpuFields = new Dictionary(); - // find existing profile id, only one profile per profile name possible + // Find existing profile id, only one profile per profile name possible. if (settings.ExperienceProfileId.IsEmpty()) { result = CallApi("GET", path, session.AccessToken, settings, null); @@ -964,9 +964,11 @@ public PayPalResponse UpsertCheckoutExperience(PayPalApiSettingsBase settings, P presentation.Add("brand_name", name); presentation.Add("locale_code", _services.WorkContext.WorkingLanguage.UniqueSeoCode.EmptyNull().ToUpper()); - - if (logo != null) - presentation.Add("logo_image", _pictureService.Value.GetUrl(logo, 0, false, _services.StoreService.GetHost(store))); + + if (logo != null) + { + presentation.Add("logo_image", _pictureService.Value.GetUrl(logo, 0, false, _services.StoreService.GetHost(store))); + } inpuFields.Add("allow_note", false); inpuFields.Add("no_shipping", 0); @@ -976,17 +978,23 @@ public PayPalResponse UpsertCheckoutExperience(PayPalApiSettingsBase settings, P data.Add("presentation", presentation); data.Add("input_fields", inpuFields); - if (settings.ExperienceProfileId.HasValue()) - path = string.Concat(path, "/", HttpUtility.UrlPathEncode(settings.ExperienceProfileId)); + if (settings.ExperienceProfileId.HasValue()) + { + path = string.Concat(path, "/", HttpUtility.UrlPathEncode(settings.ExperienceProfileId)); + } result = CallApi(settings.ExperienceProfileId.HasValue() ? "PUT" : "POST", path, session.AccessToken, settings, JsonConvert.SerializeObject(data)); if (result.Success) { - if (result.Json != null) - result.Id = (string)result.Json.id; - else - result.Id = settings.ExperienceProfileId; + if (result.Json != null) + { + result.Id = (string)result.Json.id; + } + else + { + result.Id = settings.ExperienceProfileId; + } } return result; diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index ee248b1699..4e3c248ac1 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -137,6 +137,7 @@ + From 5c1d8b20371461a5e728d1aa1ae07efc26e1de23 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 12 Jun 2019 20:18:47 +0200 Subject: [PATCH 018/115] PayPal: Further work on instalments provider --- .../Controllers/PayPalInstalmentsController.cs | 4 +--- .../Filters/PayPalInstalmentsCheckoutFilter.cs | 6 ++---- .../Providers/PayPalRestApiProviderBase.cs | 11 ++++------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index e4173c276b..4b635ed896 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -109,13 +109,11 @@ public ActionResult OrderDetails(int orderId, bool print) } // Redirect from PayPal. - public ActionResult CheckoutReturn(string systemName, string paymentId, string PayerID) + public ActionResult CheckoutReturn(string paymentId, string PayerID) { // Request.QueryString: // paymentId: PAY-0TC88803RP094490KK4KM6AI, token (not the access token): EC-5P379249AL999154U, PayerID: 5L9K773HHJLPN - var store = Services.StoreContext.CurrentStore; - var customer = Services.WorkContext.CurrentCustomer; var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); if (paymentId.HasValue() && session.PaymentId.IsEmpty()) diff --git a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs index 35aee9e8cb..59a8c35104 100644 --- a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs +++ b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs @@ -38,7 +38,7 @@ public void OnActionExecuting(ActionExecutingContext filterContext) var action = filterContext.ActionDescriptor.ActionName; if (action.IsCaseInsensitiveEqual("Confirm")) { - var store = _services.StoreContext.CurrentStore; + CreatePayment(filterContext); } } @@ -49,17 +49,16 @@ public void OnActionExecuted(ActionExecutedContext filterContext) private void CreatePayment(ActionExecutingContext context) { var store = _services.StoreContext.CurrentStore; - var customer = _services.WorkContext.CurrentCustomer; var settings = _services.Settings.LoadSetting(store.Id); var session = context.HttpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); session.PaymentId = null; - session.ApprovalUrl = null; var result = _payPalService.Value.EnsureAccessToken(session, settings); if (result.Success) { var urlHelper = new UrlHelper(context.HttpContext.Request.RequestContext); + var customer = _services.WorkContext.CurrentCustomer; var protocol = store.SslEnabled ? "https" : "http"; var returnUrl = urlHelper.Action("CheckoutReturn", "PayPalInstalments", new { area = Plugin.SystemName }, protocol); var cancelUrl = urlHelper.Action("CheckoutCancel", "PayPalInstalments", new { area = Plugin.SystemName }, protocol); @@ -77,7 +76,6 @@ private void CreatePayment(ActionExecutingContext context) if (((string)link.rel).IsCaseInsensitiveEqual("approval_url")) { session.PaymentId = result.Id; - session.ApprovalUrl = link.href; context.Result = new RedirectResult(link.href, false); break; diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs index c0b459d780..e47f1932b4 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs @@ -43,10 +43,7 @@ protected string GetControllerName() return GetControllerType().Name.EmptyNull().Replace("Controller", ""); } - public static string CheckoutCompletedKey - { - get { return "PayPalCheckoutCompleted"; } - } + public static string CheckoutCompletedKey => "PayPalCheckoutCompleted"; public override bool SupportCapture { @@ -102,7 +99,7 @@ public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest proces session.SessionExpired = true; result.AddError(T("Plugins.SmartStore.PayPal.SessionExpired")); - // Redirect to payment wall and create new payment (we need the payment id). + // Redirect to payment page and create new payment (we need the payment id). var urlHelper = new UrlHelper(HttpContext.Request.RequestContext); HttpContext.Response.Redirect(urlHelper.Action("PaymentMethod", "Checkout", new { area = "" })); @@ -298,14 +295,14 @@ public override void GetConfigurationRoute(out string actionName, out string con { actionName = "Configure"; controllerName = GetControllerName(); - routeValues = new RouteValueDictionary { { "area", "SmartStore.PayPal" } }; + routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; } public override void GetPaymentInfoRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues) { actionName = "PaymentInfo"; controllerName = GetControllerName(); - routeValues = new RouteValueDictionary { { "area", "SmartStore.PayPal" } }; + routeValues = new RouteValueDictionary { { "area", Plugin.SystemName } }; } } } From 53cdfc34663a5a10d6e670f802185b2072fd3478 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Thu, 13 Jun 2019 02:05:04 +0200 Subject: [PATCH 019/115] Range slider ticks should not wrap --- src/Presentation/SmartStore.Web/Content/shared/_rangeslider.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Presentation/SmartStore.Web/Content/shared/_rangeslider.scss b/src/Presentation/SmartStore.Web/Content/shared/_rangeslider.scss index 62b40192a8..77d0dc0ac3 100644 --- a/src/Presentation/SmartStore.Web/Content/shared/_rangeslider.scss +++ b/src/Presentation/SmartStore.Web/Content/shared/_rangeslider.scss @@ -72,6 +72,7 @@ height: 5px; border-radius: 1px; background-color: $custom-range-track-bg; + white-space: nowrap; &:after { position: absolute; From 24eeacb8cf97621d87d4834a949af179492a7638 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Thu, 13 Jun 2019 03:27:54 +0200 Subject: [PATCH 020/115] (SEO advice) Renamed RequireHttpsByConfig to RewriteUrlAttribute and combined with CanonicalHostNameAttribute. Prevents successive 301 redirects. --- .../SmartStore.Core/Domain/Stores/Store.cs | 2 +- .../SmartStore.Core/Fakes/FakeHttpRequest.cs | 7 +- .../Controllers/AdminControllerBase.cs | 2 +- .../Controllers/PublicControllerBase.cs | 3 +- .../Filters/StoreIpAddressAttribute.cs | 2 +- .../Security/RequireHttpsByConfigAttribute.cs | 92 ---------- .../Security/RewriteUrlAttribute.cs | 137 ++++++++++++++ .../Seo/CanonicalHostNameAttribute.cs | 75 -------- .../SmartStore.Web.Framework.csproj | 3 +- .../Controllers/BlogController.cs | 2 +- .../Controllers/BoardsController.cs | 4 +- .../Controllers/CatalogController.cs | 16 +- .../Controllers/CheckoutController.cs | 2 +- .../Controllers/CustomerController.cs | 32 ++-- .../Controllers/HomeController.cs | 6 +- .../Controllers/MediaController.cs | 2 +- .../Controllers/NewsController.cs | 2 +- .../Controllers/OrderController.cs | 6 +- .../Controllers/PrivateMessagesController.cs | 2 +- .../Controllers/ProductController.cs | 8 +- .../Controllers/ProfileController.cs | 2 +- .../Controllers/ReturnRequestController.cs | 2 +- .../Controllers/SearchController.cs | 2 +- .../Controllers/ShoppingCartController.cs | 6 +- .../Controllers/RewriteUrlAttributeTests.cs | 167 ++++++++++++++++++ .../SmartStore.Web.MVC.Tests.csproj | 1 + 26 files changed, 361 insertions(+), 224 deletions(-) delete mode 100644 src/Presentation/SmartStore.Web.Framework/Security/RequireHttpsByConfigAttribute.cs create mode 100644 src/Presentation/SmartStore.Web.Framework/Security/RewriteUrlAttribute.cs delete mode 100644 src/Presentation/SmartStore.Web.Framework/Seo/CanonicalHostNameAttribute.cs create mode 100644 src/Tests/SmartStore.Web.MVC.Tests/Framework/Controllers/RewriteUrlAttributeTests.cs diff --git a/src/Libraries/SmartStore.Core/Domain/Stores/Store.cs b/src/Libraries/SmartStore.Core/Domain/Stores/Store.cs index 0fb734efbd..d9325aa60a 100644 --- a/src/Libraries/SmartStore.Core/Domain/Stores/Store.cs +++ b/src/Libraries/SmartStore.Core/Domain/Stores/Store.cs @@ -97,7 +97,7 @@ public partial class Store : BaseEntity /// /// Gets the security mode for the store /// - public HttpSecurityMode GetSecurityMode(bool? useSsl = null) + public virtual HttpSecurityMode GetSecurityMode(bool? useSsl = null) { if (useSsl ?? SslEnabled) { diff --git a/src/Libraries/SmartStore.Core/Fakes/FakeHttpRequest.cs b/src/Libraries/SmartStore.Core/Fakes/FakeHttpRequest.cs index 5238183265..ee5ecc7928 100644 --- a/src/Libraries/SmartStore.Core/Fakes/FakeHttpRequest.cs +++ b/src/Libraries/SmartStore.Core/Fakes/FakeHttpRequest.cs @@ -115,8 +115,8 @@ public override string ApplicationPath { get { - //we know that relative paths always start with ~/ - //ApplicationPath should start with / + // We know that relative paths always start with ~/ + // ApplicationPath should start with / if (_relativeUrl != null && _relativeUrl.StartsWith("~/")) return _relativeUrl.Remove(0, 1); return null; @@ -137,10 +137,11 @@ public override string UserHostAddress } public override string RawUrl => this.ApplicationPath; - public override bool IsSecureConnection => false; + public override bool IsSecureConnection => _url?.Scheme?.EmptyNull().StartsWith("https", StringComparison.OrdinalIgnoreCase) == true; public override bool IsAuthenticated => false; public override string[] UserLanguages => new string[] { }; public override string UserAgent => "SmartStore.NET"; + public override bool IsLocal => false; public override RequestContext RequestContext { diff --git a/src/Presentation/SmartStore.Web.Framework/Controllers/AdminControllerBase.cs b/src/Presentation/SmartStore.Web.Framework/Controllers/AdminControllerBase.cs index c79c787de1..f04be13344 100644 --- a/src/Presentation/SmartStore.Web.Framework/Controllers/AdminControllerBase.cs +++ b/src/Presentation/SmartStore.Web.Framework/Controllers/AdminControllerBase.cs @@ -27,7 +27,7 @@ public void OnActionExecuted(ActionExecutedContext filterContext) } [AdminValidateIpAddress(Order = 100)] - [RequireHttpsByConfig(SslRequirement.Yes, Order = 110)] + [RewriteUrl(SslRequirement.Yes, Order = 110)] [CustomerLastActivity(Order = 100)] [StoreIpAddress(Order = 100)] [AdminThemed(Order = -1)] diff --git a/src/Presentation/SmartStore.Web.Framework/Controllers/PublicControllerBase.cs b/src/Presentation/SmartStore.Web.Framework/Controllers/PublicControllerBase.cs index 189014d893..fee48defb5 100644 --- a/src/Presentation/SmartStore.Web.Framework/Controllers/PublicControllerBase.cs +++ b/src/Presentation/SmartStore.Web.Framework/Controllers/PublicControllerBase.cs @@ -6,8 +6,7 @@ namespace SmartStore.Web.Framework.Controllers { - [CanonicalHostName(Order = 100)] - [RequireHttpsByConfigAttribute(SslRequirement.Retain, Order = 110)] + [RewriteUrl(SslRequirement.Retain)] [StoreClosed(Order = -1)] [PublicStoreAllowNavigation(Order = -1)] [LanguageSeoCode(Order = -1)] diff --git a/src/Presentation/SmartStore.Web.Framework/Filters/StoreIpAddressAttribute.cs b/src/Presentation/SmartStore.Web.Framework/Filters/StoreIpAddressAttribute.cs index 716cc5b6ef..8a65cd046a 100644 --- a/src/Presentation/SmartStore.Web.Framework/Filters/StoreIpAddressAttribute.cs +++ b/src/Presentation/SmartStore.Web.Framework/Filters/StoreIpAddressAttribute.cs @@ -19,7 +19,7 @@ public virtual void OnActionExecuting(ActionExecutingContext filterContext) if (!DataSettings.DatabaseIsInstalled()) return; - if (filterContext == null || filterContext.HttpContext == null || filterContext.HttpContext.Request == null) + if (filterContext?.HttpContext?.Request == null) return; // Don't apply filter to child methods. diff --git a/src/Presentation/SmartStore.Web.Framework/Security/RequireHttpsByConfigAttribute.cs b/src/Presentation/SmartStore.Web.Framework/Security/RequireHttpsByConfigAttribute.cs deleted file mode 100644 index 4fa6c14d76..0000000000 --- a/src/Presentation/SmartStore.Web.Framework/Security/RequireHttpsByConfigAttribute.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Web.Mvc; -using SmartStore.Core; -using SmartStore.Core.Data; -using SmartStore.Core.Domain.Security; - -namespace SmartStore.Web.Framework.Security -{ - public class RequireHttpsByConfigAttribute : FilterAttribute, IAuthorizationFilter - { - public RequireHttpsByConfigAttribute(SslRequirement sslRequirement) - { - this.SslRequirement = sslRequirement; - } - - public Lazy SecuritySettings { get; set; } - public Lazy StoreContext { get; set; } - public Lazy WebHelper { get; set; } - - public virtual void OnAuthorization(AuthorizationContext filterContext) - { - // don't apply filter to child methods - if (filterContext.IsChildAction) - return; - - // only redirect for GET requests, - // otherwise the browser might not propagate the verb and request body correctly. - if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) - return; - - if (!DataSettings.DatabaseIsInstalled()) - return; - - var securitySettings = SecuritySettings.Value; - var isLocalRequest = filterContext.HttpContext.Request.IsLocal; - - if (!securitySettings.UseSslOnLocalhost && isLocalRequest) - return; - - var webHelper = WebHelper.Value; - - var currentConnectionSecured = webHelper.IsCurrentConnectionSecured(); - var storeContext = StoreContext.Value; - var currentStore = storeContext.CurrentStore; - - if (currentStore.ForceSslForAllPages) - { - // all pages are forced to be SSL no matter of the specified value - this.SslRequirement = SslRequirement.Yes; - } - - switch (this.SslRequirement) - { - case SslRequirement.Yes: - { - if (!currentConnectionSecured) - { - if (currentStore != null && currentStore.GetSecurityMode() > HttpSecurityMode.Unsecured) - { - // redirect to HTTPS version of page - // string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl; - - string url = webHelper.GetThisPageUrl(true, true); - filterContext.Result = new RedirectResult(url, !isLocalRequest); - } - } - } - break; - case SslRequirement.No: - { - if (currentConnectionSecured) - { - // redirect to HTTP version of page - // string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl; - string url = webHelper.GetThisPageUrl(true, false); - filterContext.Result = new RedirectResult(url, !isLocalRequest); - } - } - break; - case SslRequirement.Retain: - { - //do nothing - } - break; - default: - throw new SmartException("Unsupported SslRequirement parameter"); - } - } - - public SslRequirement SslRequirement { get; set; } - } -} diff --git a/src/Presentation/SmartStore.Web.Framework/Security/RewriteUrlAttribute.cs b/src/Presentation/SmartStore.Web.Framework/Security/RewriteUrlAttribute.cs new file mode 100644 index 0000000000..f63ad4b5ba --- /dev/null +++ b/src/Presentation/SmartStore.Web.Framework/Security/RewriteUrlAttribute.cs @@ -0,0 +1,137 @@ +using System; +using System.Web.Mvc; +using SmartStore.Core; +using SmartStore.Core.Data; +using SmartStore.Core.Domain.Security; +using SmartStore.Core.Domain.Seo; + +namespace SmartStore.Web.Framework.Security +{ + public class RewriteUrlAttribute : FilterAttribute, IAuthorizationFilter + { + public RewriteUrlAttribute(SslRequirement sslRequirement) + { + this.SslRequirement = sslRequirement; + this.Order = 100; + } + + public Lazy SeoSettings { get; set; } + public Lazy SecuritySettings { get; set; } + public Lazy StoreContext { get; set; } + public Lazy WebHelper { get; set; } + + public virtual void OnAuthorization(AuthorizationContext filterContext) + { + // don't apply filter to child methods + if (filterContext.IsChildAction) + return; + + // only redirect for GET requests, + // otherwise the browser might not propagate the verb and request body correctly. + if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) + return; + + if (!DataSettings.DatabaseIsInstalled()) + return; + + var securitySettings = SecuritySettings.Value; + var isLocalRequest = filterContext.HttpContext.Request.IsLocal; + + if (!securitySettings.UseSslOnLocalhost && isLocalRequest) + return; + + var webHelper = WebHelper.Value; + + var currentConnectionSecured = webHelper.IsCurrentConnectionSecured(); + var currentStore = StoreContext.Value.CurrentStore; + + if (currentStore.ForceSslForAllPages) + { + // all pages are forced to be SSL no matter of the specified value + this.SslRequirement = SslRequirement.Yes; + } + + var securityMode = currentStore.GetSecurityMode(); + + switch (this.SslRequirement) + { + case SslRequirement.Yes: + { + if (!currentConnectionSecured && securityMode > HttpSecurityMode.Unsecured) + { + // Redirect to HTTPS version of page + string url = webHelper.GetThisPageUrl(true, true); + filterContext.Result = new RedirectResult(url, !isLocalRequest); + } + } + break; + case SslRequirement.No: + { + if (currentConnectionSecured) + { + // Redirect to HTTP version of page + string url = webHelper.GetThisPageUrl(true, false); + filterContext.Result = new RedirectResult(url, !isLocalRequest); + } + } + break; + case SslRequirement.Retain: + { + // Do nothing + } + break; + default: + throw new SmartException("Unsupported SslRequirement parameter"); + } + + ApplyCanonicalHostNameRule(filterContext, isLocalRequest, securityMode); + } + + private void ApplyCanonicalHostNameRule(AuthorizationContext filterContext, bool isLocalRequest, HttpSecurityMode securityMode) + { + var rule = SeoSettings.Value.CanonicalHostNameRule; + if (rule == CanonicalHostNameRule.NoRule) + return; + + var uri = filterContext.Result != null + ? new Uri(((RedirectResult)filterContext.Result).Url) + : filterContext.HttpContext.Request.Url; + + if (uri.IsLoopback) + { + // allows testing of "localtest.me" + return; + } + + var url = uri.ToString(); + var protocol = uri.Scheme.ToLower(); + var isHttps = protocol.IsCaseInsensitiveEqual("https"); + var startsWith = "{0}://www.".FormatInvariant(protocol); + var hasPrefix = url.StartsWith(startsWith, StringComparison.OrdinalIgnoreCase); + + if (isHttps) + { + if (securityMode == HttpSecurityMode.SharedSsl) + { + // Don't attempt to redirect when shared SSL is being used and current request is secured. + // Redirecting from http://ssl.bla.com to https://www.ssl.bla.com will most probably fail. + return; + } + } + + if (hasPrefix && rule == CanonicalHostNameRule.OmitWww) + { + url = url.Replace("://www.", "://"); + filterContext.Result = new RedirectResult(url, !isLocalRequest); + } + + if (!hasPrefix && rule == CanonicalHostNameRule.RequireWww) + { + url = url.Replace("{0}://".FormatInvariant(protocol), startsWith); + filterContext.Result = new RedirectResult(url, !isLocalRequest); + } + } + + public SslRequirement SslRequirement { get; set; } + } +} diff --git a/src/Presentation/SmartStore.Web.Framework/Seo/CanonicalHostNameAttribute.cs b/src/Presentation/SmartStore.Web.Framework/Seo/CanonicalHostNameAttribute.cs deleted file mode 100644 index 2c9188b241..0000000000 --- a/src/Presentation/SmartStore.Web.Framework/Seo/CanonicalHostNameAttribute.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Web.Mvc; -using SmartStore.Core; -using SmartStore.Core.Data; -using SmartStore.Core.Domain.Seo; -using SmartStore.Core.Infrastructure; - -namespace SmartStore.Web.Framework.Seo -{ - public class CanonicalHostNameAttribute : FilterAttribute, IAuthorizationFilter - { - public Lazy SeoSettings { get; set; } - public Lazy WebHelper { get; set; } - public Lazy StoreContext { get; set; } - - public virtual void OnAuthorization(AuthorizationContext filterContext) - { - if (filterContext == null) - throw new ArgumentNullException("filterContext"); - - if (filterContext.IsChildAction) - return; - - // only redirect for GET requests - if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) - return; - - if (!DataSettings.DatabaseIsInstalled()) - return; - - var rule = SeoSettings.Value.CanonicalHostNameRule; - if (rule == CanonicalHostNameRule.NoRule) - return; - - var uri = filterContext.HttpContext.Request.Url; - - if (uri.IsLoopback) - { - // allows testing of "localtest.me" - return; - } - - var url = uri.ToString(); - var protocol = uri.Scheme.ToLower(); - var isHttps = protocol.IsCaseInsensitiveEqual("https"); - var startsWith = "{0}://www.".FormatInvariant(protocol); - var hasPrefix = url.StartsWith(startsWith, StringComparison.OrdinalIgnoreCase); - - if (isHttps) - { - var securityMode = StoreContext.Value.CurrentStore.GetSecurityMode(); - if (securityMode == HttpSecurityMode.SharedSsl) - { - // Don't attempt to redirect when shared SSL is being used and current request is secured. - // Redirecting from http://ssl.bla.com to https://www.ssl.bla.com will most probably fail. - return; - } - } - - if (hasPrefix && rule == CanonicalHostNameRule.OmitWww) - { - url = url.Replace("://www.", "://"); - filterContext.Result = new RedirectResult(url, true); - } - - if (!hasPrefix && rule == CanonicalHostNameRule.RequireWww) - { - url = url.Replace("{0}://".FormatInvariant(protocol), startsWith); - filterContext.Result = new RedirectResult(url, true); - } - - } - - } -} diff --git a/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj b/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj index 4af5211677..bc4419c6b9 100644 --- a/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj +++ b/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj @@ -285,7 +285,6 @@ - @@ -406,7 +405,7 @@ - + diff --git a/src/Presentation/SmartStore.Web/Controllers/BlogController.cs b/src/Presentation/SmartStore.Web/Controllers/BlogController.cs index 9d03d6d8a9..e8de124ab7 100644 --- a/src/Presentation/SmartStore.Web/Controllers/BlogController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/BlogController.cs @@ -33,7 +33,7 @@ namespace SmartStore.Web.Controllers { - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public partial class BlogController : PublicControllerBase { #region Fields diff --git a/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs b/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs index 9400a5b33c..18a89c1eb1 100644 --- a/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs @@ -35,7 +35,7 @@ namespace SmartStore.Web.Controllers { - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public partial class BoardsController : PublicControllerBase { private readonly IForumService _forumService; @@ -1780,7 +1780,7 @@ public ActionResult InstantSearch(ForumSearchQuery query) return PartialView(model); } - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult Search(ForumSearchQuery query) { if (!_forumSettings.ForumsEnabled) diff --git a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs index e97d8d19e2..b50e5afc74 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs @@ -98,7 +98,7 @@ public CatalogController( #region Categories - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult Category(int categoryId, CatalogSearchQuery query) { var category = _categoryService.GetCategoryById(categoryId); @@ -307,7 +307,7 @@ public ActionResult HomepageCategories() #region Manufacturers - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult Manufacturer(int manufacturerId, CatalogSearchQuery query) { var manufacturer = _manufacturerService.GetManufacturerById(manufacturerId); @@ -411,7 +411,7 @@ public ActionResult Manufacturer(int manufacturerId, CatalogSearchQuery query) return View(templateViewPath, model); } - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult ManufacturerAll() { var model = new List(); @@ -552,7 +552,7 @@ public ActionResult PopularProductTags() return PartialView(cacheModel); } - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult ProductsByTag(int productTagId, CatalogSearchQuery query) { var productTag = _productTagService.GetProductTagById(productTagId); @@ -580,7 +580,7 @@ public ActionResult ProductsByTag(int productTagId, CatalogSearchQuery query) return View(model); } - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult ProductTagsAll() { var model = new PopularProductTagsModel(); @@ -609,7 +609,7 @@ public ActionResult ProductTagsAll() #region Recently[...]Products - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult RecentlyViewedProducts(CatalogSearchQuery query) { if (!_catalogSettings.RecentlyViewedProductsEnabled || _catalogSettings.RecentlyViewedProductsNumber <= 0) @@ -648,7 +648,7 @@ public ActionResult RecentlyViewedProductsBlock() return PartialView(model); } - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult RecentlyAddedProducts(CatalogSearchQuery query) { if (!_catalogSettings.RecentlyAddedProductsEnabled || _catalogSettings.RecentlyAddedProductsNumber <= 0) @@ -830,7 +830,7 @@ public ActionResult RemoveProductFromCompareListAjax(int id) }); } - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult CompareProducts() { if (!_catalogSettings.CompareProductsEnabled) diff --git a/src/Presentation/SmartStore.Web/Controllers/CheckoutController.cs b/src/Presentation/SmartStore.Web/Controllers/CheckoutController.cs index ae224ae6cf..6bc4aa6324 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CheckoutController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CheckoutController.cs @@ -30,7 +30,7 @@ namespace SmartStore.Web.Controllers { - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public partial class CheckoutController : PublicControllerBase { #region Fields diff --git a/src/Presentation/SmartStore.Web/Controllers/CustomerController.cs b/src/Presentation/SmartStore.Web/Controllers/CustomerController.cs index 4e844694ff..cd94cbba93 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CustomerController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CustomerController.cs @@ -406,7 +406,7 @@ protected CustomerOrderListModel PrepareCustomerOrderListModel(Customer customer #region Login / logout / register - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Login(bool? checkoutAsGuest) { var model = new LoginModel(); @@ -501,7 +501,7 @@ public ActionResult Login(LoginModel model, string returnUrl, bool captchaValid) return View(model); } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] [GdprConsent] public ActionResult Register() { @@ -935,7 +935,7 @@ public ActionResult Logout() } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult AccountActivation(string token, string email) { var customer = _customerService.GetCustomerByEmail(email); @@ -968,7 +968,7 @@ public ActionResult AccountActivation(string token, string email) #endregion - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Info() { if (!IsCurrentUserRegistered()) @@ -1156,7 +1156,7 @@ public ActionResult Info(CustomerInfoModel model) #region Addresses - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Addresses() { if (!IsCurrentUserRegistered()) @@ -1175,7 +1175,7 @@ public ActionResult Addresses() return View(model); } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult AddressDelete(int id) { if (id < 1) @@ -1199,7 +1199,7 @@ public ActionResult AddressDelete(int id) return RedirectToAction("Addresses"); } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult AddressAdd() { if (!IsCurrentUserRegistered()) @@ -1245,7 +1245,7 @@ public ActionResult AddressAdd(CustomerAddressEditModel model) return View(model); } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult AddressEdit(int id) { if (id < 1) @@ -1296,7 +1296,7 @@ public ActionResult AddressEdit(CustomerAddressEditModel model, int id) #region Orders - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Orders(int? page) { if (!IsCurrentUserRegistered()) @@ -1348,7 +1348,7 @@ public ActionResult CancelRecurringPayment(FormCollection form) #region Return request - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult ReturnRequests() { if (!IsCurrentUserRegistered()) @@ -1390,7 +1390,7 @@ public ActionResult ReturnRequests() #region Downloable products - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult DownloadableProducts() { if (!IsCurrentUserRegistered()) @@ -1473,7 +1473,7 @@ public ActionResult UserAgreement(Guid id /* orderItemId */, string fileVersion #region Reward points - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult RewardPoints() { if (!IsCurrentUserRegistered()) @@ -1507,7 +1507,7 @@ public ActionResult RewardPoints() #region Change password - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult ChangePassword() { if (!IsCurrentUserRegistered()) @@ -1552,7 +1552,7 @@ public ActionResult ChangePassword(ChangePasswordModel model) #region Avatar - [RequireHttpsByConfig(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Avatar() { if (!IsCurrentUserRegistered()) @@ -1633,7 +1633,7 @@ public ActionResult RemoveAvatar() #region Password recovery - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult PasswordRecovery() { var model = new PasswordRecoveryModel(); @@ -1670,7 +1670,7 @@ public ActionResult PasswordRecoverySend(PasswordRecoveryModel model) } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult PasswordRecoveryConfirm(string token, string email) { var customer = _customerService.GetCustomerByEmail(email); diff --git a/src/Presentation/SmartStore.Web/Controllers/HomeController.cs b/src/Presentation/SmartStore.Web/Controllers/HomeController.cs index f4b4bdef72..8eeb8f8b70 100644 --- a/src/Presentation/SmartStore.Web/Controllers/HomeController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/HomeController.cs @@ -54,7 +54,7 @@ public HomeController( _privacySettings = privacySettings; } - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult Index() { return View(); @@ -65,7 +65,7 @@ public ActionResult StoreClosed() return View(); } - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] [GdprConsent] public ActionResult ContactUs() { @@ -133,7 +133,7 @@ public ActionResult ContactUsSend(ContactUsModel model, bool captchaValid) return View(model); } - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult Sitemap() { return RedirectPermanent(Services.StoreContext.CurrentStore.Url); diff --git a/src/Presentation/SmartStore.Web/Controllers/MediaController.cs b/src/Presentation/SmartStore.Web/Controllers/MediaController.cs index 000007fa75..a5eff39dee 100644 --- a/src/Presentation/SmartStore.Web/Controllers/MediaController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/MediaController.cs @@ -74,7 +74,7 @@ public MediaController( #region XML sitemap [Compress] - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public async Task XmlSitemap(int? index = null) { if (!_seoSettings.Value.XmlSitemapEnabled) diff --git a/src/Presentation/SmartStore.Web/Controllers/NewsController.cs b/src/Presentation/SmartStore.Web/Controllers/NewsController.cs index 6c3f7acf4e..15a51d5cf4 100644 --- a/src/Presentation/SmartStore.Web/Controllers/NewsController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/NewsController.cs @@ -30,7 +30,7 @@ namespace SmartStore.Web.Controllers { - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public partial class NewsController : PublicControllerBase { #region Fields diff --git a/src/Presentation/SmartStore.Web/Controllers/OrderController.cs b/src/Presentation/SmartStore.Web/Controllers/OrderController.cs index 0f161e799c..b0de75f4ad 100644 --- a/src/Presentation/SmartStore.Web/Controllers/OrderController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/OrderController.cs @@ -168,7 +168,7 @@ protected ShipmentDetailsModel PrepareShipmentDetailsModel(Shipment shipment) #region Order details - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Details(int id) { var order = _orderService.GetOrderById(id); @@ -183,7 +183,7 @@ public ActionResult Details(int id) return View(model); } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Print(int id, bool pdf = false) { var order = _orderService.GetOrderById(id); @@ -330,7 +330,7 @@ public ActionResult RePostPayment(int id) return RedirectToAction("Details", "Order", new { id = order.Id }); } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult ShipmentDetails(int id /* shipmentId */) { var shipment = _shipmentService.GetShipmentById(id); diff --git a/src/Presentation/SmartStore.Web/Controllers/PrivateMessagesController.cs b/src/Presentation/SmartStore.Web/Controllers/PrivateMessagesController.cs index 1d7f7ce196..b54c6a53c5 100644 --- a/src/Presentation/SmartStore.Web/Controllers/PrivateMessagesController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/PrivateMessagesController.cs @@ -16,7 +16,7 @@ namespace SmartStore.Web.Controllers { - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public partial class PrivateMessagesController : PublicControllerBase { #region Fields diff --git a/src/Presentation/SmartStore.Web/Controllers/ProductController.cs b/src/Presentation/SmartStore.Web/Controllers/ProductController.cs index af517b9df4..4bf2d308ad 100644 --- a/src/Presentation/SmartStore.Web/Controllers/ProductController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/ProductController.cs @@ -113,7 +113,7 @@ public ProductController( #region Products - [RequireHttpsByConfigAttribute(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult ProductDetails(int productId, string attributes, ProductVariantQuery query) { var product = _productService.GetProductById(productId); @@ -674,7 +674,7 @@ public ActionResult ProductTags(int productId) #region Product reviews [ActionName("Reviews")] - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] [GdprConsent] public ActionResult Reviews(int id) { @@ -847,7 +847,7 @@ where prh.WasHelpful #region Ask product question - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] [GdprConsent] public ActionResult AskQuestion(int id) { @@ -921,7 +921,7 @@ public ActionResult AskQuestionSend(ProductAskQuestionModel model, bool captchaV #region Email a friend - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] [GdprConsent] public ActionResult EmailAFriend(int id) { diff --git a/src/Presentation/SmartStore.Web/Controllers/ProfileController.cs b/src/Presentation/SmartStore.Web/Controllers/ProfileController.cs index 7f81a663ad..9fafff96b4 100644 --- a/src/Presentation/SmartStore.Web/Controllers/ProfileController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/ProfileController.cs @@ -20,7 +20,7 @@ namespace SmartStore.Web.Controllers { - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public partial class ProfileController : PublicControllerBase { private readonly IForumService _forumService; diff --git a/src/Presentation/SmartStore.Web/Controllers/ReturnRequestController.cs b/src/Presentation/SmartStore.Web/Controllers/ReturnRequestController.cs index 9046d04361..c929477310 100644 --- a/src/Presentation/SmartStore.Web/Controllers/ReturnRequestController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/ReturnRequestController.cs @@ -121,7 +121,7 @@ protected SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequest #region Return requests - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult ReturnRequest(int id /* orderId */) { var order = _orderService.GetOrderById(id); diff --git a/src/Presentation/SmartStore.Web/Controllers/SearchController.cs b/src/Presentation/SmartStore.Web/Controllers/SearchController.cs index 0d124f5c9e..389fe9b89c 100644 --- a/src/Presentation/SmartStore.Web/Controllers/SearchController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/SearchController.cs @@ -130,7 +130,7 @@ public ActionResult InstantSearch(CatalogSearchQuery query) return PartialView(model); } - [RequireHttpsByConfig(SslRequirement.No)] + [RewriteUrl(SslRequirement.No)] public ActionResult Search(CatalogSearchQuery query) { var model = new SearchResultModel(query); diff --git a/src/Presentation/SmartStore.Web/Controllers/ShoppingCartController.cs b/src/Presentation/SmartStore.Web/Controllers/ShoppingCartController.cs index 2df6edadd5..b861e3794c 100644 --- a/src/Presentation/SmartStore.Web/Controllers/ShoppingCartController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/ShoppingCartController.cs @@ -1599,7 +1599,7 @@ public ActionResult UploadFileProductAttribute(int productId, int productAttribu } - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Cart(ProductVariantQuery query) { if (!_permissionService.Authorize(StandardPermissionProvider.EnableShoppingCart)) @@ -2345,7 +2345,7 @@ public ActionResult CartSummary(bool cart = false, bool wishlist = false, bool c #region Wishlist - [RequireHttpsByConfigAttribute(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] public ActionResult Wishlist(Guid? customerGuid) { if (!_permissionService.Authorize(StandardPermissionProvider.EnableWishlist)) @@ -2507,7 +2507,7 @@ public ActionResult MoveItemBetweenCartAndWishlistAjax(int cartItemId, ShoppingC }); } - [RequireHttpsByConfig(SslRequirement.Yes)] + [RewriteUrl(SslRequirement.Yes)] [GdprConsent] public ActionResult EmailWishlist() { diff --git a/src/Tests/SmartStore.Web.MVC.Tests/Framework/Controllers/RewriteUrlAttributeTests.cs b/src/Tests/SmartStore.Web.MVC.Tests/Framework/Controllers/RewriteUrlAttributeTests.cs new file mode 100644 index 0000000000..bc937e0178 --- /dev/null +++ b/src/Tests/SmartStore.Web.MVC.Tests/Framework/Controllers/RewriteUrlAttributeTests.cs @@ -0,0 +1,167 @@ +using System; +using System.Web.Mvc; +using NUnit.Framework; +using Rhino.Mocks; +using SmartStore.Core; +using SmartStore.Core.Domain.Security; +using SmartStore.Core.Domain.Seo; +using SmartStore.Core.Domain.Stores; +using SmartStore.Core.Fakes; +using SmartStore.Web.Framework.Security; + +namespace SmartStore.Web.MVC.Tests.Framework.Controllers +{ + [TestFixture] + public class RewriteUrlAttributeTests + { + [Test] + public void Can_enforce_Ssl_Www() + { + var store = new Store + { + SslEnabled = true, + ForceSslForAllPages = true, + Url = "http://www.shop.com" + }; + + var attr = CreateRewriteUrlAttribute(store, "http://shop.com", CanonicalHostNameRule.RequireWww, out var context); + + attr.OnAuthorization(context); + var result = context.Result as RedirectResult; + + Assert.IsAssignableFrom(result); + StringAssert.StartsWith("https://www.shop.com", result.Url); + } + + [Test] + public void Can_enforce_Ssl() + { + var store = new Store + { + SslEnabled = true, + ForceSslForAllPages = true, + Url = "http://www.shop.com" + }; + + var attr = CreateRewriteUrlAttribute(store, "http://shop.com", CanonicalHostNameRule.NoRule, out var context); + + attr.OnAuthorization(context); + var result = context.Result as RedirectResult; + + Assert.IsAssignableFrom(result); + StringAssert.StartsWith("https://shop.com", result.Url); + } + + [Test] + public void Can_enforce_Www() + { + var store = new Store { Url = "http://www.shop.com" }; + + var attr = CreateRewriteUrlAttribute(store, "http://shop.com", CanonicalHostNameRule.RequireWww, out var context); + + attr.OnAuthorization(context); + var result = context.Result as RedirectResult; + + Assert.IsAssignableFrom(result); + StringAssert.StartsWith("http://www.shop.com", result.Url); + } + + [Test] + public void Can_omit_Www() + { + var store = new Store { Url = "http://www.shop.com" }; + + var attr = CreateRewriteUrlAttribute(store, "http://www.shop.com", CanonicalHostNameRule.OmitWww, out var context); + + attr.OnAuthorization(context); + var result = context.Result as RedirectResult; + + Assert.IsAssignableFrom(result); + StringAssert.StartsWith("http://shop.com", result.Url); + } + + [Test] + public void Can_enforce_NonSsl() + { + var store = new Store + { + SslEnabled = false, + ForceSslForAllPages = false, + Url = "http://www.shop.com" + }; + + var attr = CreateRewriteUrlAttribute(store, "https://www.shop.com", CanonicalHostNameRule.NoRule, out var context); + attr.SslRequirement = SslRequirement.No; + + attr.OnAuthorization(context); + var result = context.Result as RedirectResult; + + Assert.IsAssignableFrom(result); + StringAssert.StartsWith("http://www.shop.com", result.Url); + } + + [Test] + public void Can_retain_Ssl_Www() + { + var store = new Store + { + SslEnabled = true, + ForceSslForAllPages = true, + Url = "https://www.shop.com" + }; + + var attr = CreateRewriteUrlAttribute(store, "https://www.shop.com", CanonicalHostNameRule.RequireWww, out var context); + + attr.OnAuthorization(context); + var result = context.Result as RedirectResult; + + Assert.IsNull(result); + } + + private RewriteUrlAttribute CreateRewriteUrlAttribute( + Store store, + string requestUrl, + CanonicalHostNameRule rule, + out AuthorizationContext filterContext) + { + filterContext = null; + + var attr = new RewriteUrlAttribute(SslRequirement.Yes) + { + SeoSettings = new Lazy(() => new SeoSettings + { + CanonicalHostNameRule = rule + }), + SecuritySettings = new Lazy(() => new SecuritySettings + { + UseSslOnLocalhost = true + }) + }; + + var storeContext = MockRepository.GenerateMock(); + storeContext.Expect(x => x.CurrentStore).Return(store); + attr.StoreContext = new Lazy(() => storeContext); + + var httpContext = new FakeHttpContext("~/", "GET"); + var httpRequest = new FakeHttpRequest("~/", new Uri(requestUrl), null); + httpContext.SetRequest(httpRequest); + + var isHttps = httpRequest.IsSecureConnection; + string secureUrl = isHttps ? requestUrl : requestUrl.Replace("http:", "https:"); + string nonSecureUrl = isHttps ? requestUrl.Replace("https:", "http:") : requestUrl; + + var webHelper = MockRepository.GenerateMock(); + webHelper.Expect(x => x.IsCurrentConnectionSecured()).Return(isHttps); + webHelper.Expect(x => x.GetThisPageUrl(true, true)).Return(secureUrl); + webHelper.Expect(x => x.GetThisPageUrl(true, false)).Return(nonSecureUrl); + attr.WebHelper = new Lazy(() => webHelper); + + filterContext = new AuthorizationContext + { + HttpContext = httpContext + }; + + return attr; + } + } +} diff --git a/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj b/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj index e3f9c77f4f..00f00f9d2a 100644 --- a/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj +++ b/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj @@ -118,6 +118,7 @@ + From d47e5a927f934934c84b7a5b97cb86f35f8b31b2 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Thu, 13 Jun 2019 13:07:15 +0200 Subject: [PATCH 021/115] PayPal: Further work on instalments provider --- .../PayPalInstalmentsController.cs | 41 +++++++++++++++++++ .../PayPalInstalmentsCheckoutFilter.cs | 17 +++++++- .../Providers/PayPalInstalmentsProvider.cs | 17 ++++++++ .../Providers/PayPalRestApiProviderBase.cs | 6 +-- .../Services/PayPalService.cs | 3 ++ .../SmartStore.PayPal.csproj | 3 ++ .../PayPalInstalments/FinancingDetails.cshtml | 15 +++++++ 7 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/FinancingDetails.cshtml diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index 4b635ed896..f32ee1f8ea 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -4,6 +4,7 @@ using System.Web.Mvc; using Newtonsoft.Json; using SmartStore.ComponentModel; +using SmartStore.Core.Domain.Customers; using SmartStore.Core.Logging; using SmartStore.PayPal.Models; using SmartStore.PayPal.Providers; @@ -65,6 +66,46 @@ public ActionResult PaymentInfo() return PartialView(); } + // Widget zone on checkout confirm page. + [ChildActionOnly] + public ActionResult FinancingDetails() + { + try + { + var store = Services.StoreContext.CurrentStore; + var language = Services.WorkContext.WorkingLanguage; + var currency = Services.WorkContext.WorkingCurrency; + var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + + if (session.FinancingCosts == decimal.Zero || session.TotalInclFinancingCosts == decimal.Zero) + { + var settings = Services.Settings.LoadSetting(store.Id); + var result = PayPalService.GetPayment(settings, session); + if (result.Success) + { + // TODO: get details. + //var total = (string)result.Json.....; + //session.FinancingCosts = ; + //session.TotalInclFinancingCosts = total.Convert(CultureInfo.InvariantCulture); + } + } + + var financingCosts = _currencyService.ConvertFromPrimaryStoreCurrency(session.FinancingCosts, currency, store); + var totalInclFinancingCosts = _currencyService.ConvertFromPrimaryStoreCurrency(session.TotalInclFinancingCosts, currency, store); + + ViewBag.FinancingCosts = _priceFormatter.FormatPrice(financingCosts, true, currency, language, false, false); + ViewBag.TotalInclFinancingCosts = _priceFormatter.FormatPrice(totalInclFinancingCosts, true, currency, language, false, false); + + return PartialView(); + } + catch (Exception ex) + { + Logger.Error(ex); + } + + return new EmptyResult(); + } + // Widget zone on order details (page and print). [ChildActionOnly] public ActionResult OrderDetails(int orderId, bool print) diff --git a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs index 59a8c35104..b02427772c 100644 --- a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs +++ b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs @@ -9,6 +9,7 @@ using SmartStore.Services; using SmartStore.Services.Common; using SmartStore.Services.Customers; +using SmartStore.Web.Framework.UI; namespace SmartStore.PayPal.Filters { @@ -17,15 +18,18 @@ public class PayPalInstalmentsCheckoutFilter : IActionFilter private readonly ICommonServices _services; private readonly Lazy _payPalService; private readonly Lazy _genericAttributeService; + private readonly Lazy _widgetProvider; public PayPalInstalmentsCheckoutFilter( ICommonServices services, Lazy payPalService, - Lazy genericAttributeService) + Lazy genericAttributeService, + Lazy widgetProvider) { _services = services; _payPalService = payPalService; _genericAttributeService = genericAttributeService; + _widgetProvider = widgetProvider; } public void OnActionExecuting(ActionExecutingContext filterContext) @@ -38,7 +42,16 @@ public void OnActionExecuting(ActionExecutingContext filterContext) var action = filterContext.ActionDescriptor.ActionName; if (action.IsCaseInsensitiveEqual("Confirm")) { - CreatePayment(filterContext); + var store = _services.StoreContext.CurrentStore; + var customer = _services.WorkContext.CurrentCustomer; + var selectedMethod = customer.GetAttribute(SystemCustomerAttributeNames.SelectedPaymentMethod, store.Id); + + if (selectedMethod.IsCaseInsensitiveEqual(PayPalInstalmentsProvider.SystemName)) + { + _widgetProvider.Value.RegisterAction("order_summary_totals_after", "FinancingDetails", "PayPalInstalments", new { area = Plugin.SystemName }); + + CreatePayment(filterContext); + } } } diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs index 5dcc5f43d8..b98f85e6de 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalInstalmentsProvider.cs @@ -26,6 +26,23 @@ public override Type GetControllerType() { return typeof(PayPalInstalmentsController); } + + public override void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest) + { + var order = postProcessPaymentRequest.Order; + var customer = order.Customer ?? Services.WorkContext.CurrentCustomer; + var session = HttpContext.GetPayPalState(SystemName, customer, order.StoreId, GenericAttributeService); + + var orderAttribute = new PayPalInstalmentsOrderAttribute + { + FinancingCosts = session.FinancingCosts, + TotalInclFinancingCosts = session.TotalInclFinancingCosts + }; + + GenericAttributeService.SaveAttribute(order, PayPalInstalmentsOrderAttribute.Key, JsonConvert.SerializeObject(orderAttribute), order.StoreId); + + base.PostProcessPayment(postProcessPaymentRequest); + } } diff --git a/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs b/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs index e47f1932b4..4909efc78d 100644 --- a/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs +++ b/src/Plugins/SmartStore.PayPal/Providers/PayPalRestApiProviderBase.cs @@ -191,9 +191,9 @@ public override ProcessPaymentResult ProcessPayment(ProcessPaymentRequest proces public override void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest) { - var storeId = postProcessPaymentRequest.Order.StoreId; - var customer = Services.WorkContext.CurrentCustomer; - var session = HttpContext.GetPayPalState(_providerSystemName, customer, storeId, GenericAttributeService); + var order = postProcessPaymentRequest.Order; + var customer = order.Customer ?? Services.WorkContext.CurrentCustomer; + var session = HttpContext.GetPayPalState(_providerSystemName, customer, order.StoreId, GenericAttributeService); var instruction = PayPalService.CreatePaymentInstruction(session.PaymentInstruction); if (instruction.HasValue()) diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs index 68b2d8607b..ba6f9714c7 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs @@ -1212,6 +1212,9 @@ public PayPalSessionData() public Guid OrderGuid { get; private set; } public PayPalPaymentInstruction PaymentInstruction { get; set; } + public decimal FinancingCosts { get; set; } + public decimal TotalInclFinancingCosts { get; set; } + public override string ToString() { var sb = new StringBuilder(); diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 4e3c248ac1..5e2400d1b9 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -329,6 +329,9 @@ PreserveNewest + + PreserveNewest + Designer diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/FinancingDetails.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/FinancingDetails.cshtml new file mode 100644 index 0000000000..7d013a8e25 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/FinancingDetails.cshtml @@ -0,0 +1,15 @@ +@{ + var financingCosts = ViewBag.FinancingCosts as string; + var totalInclFinancingCosts = ViewBag.TotalInclFinancingCosts as string; +} + + + + + + + + + + +
@T("Plugins.Payments.PayPalInstalments.FinancingCosts"):@financingCosts
@T("Plugins.Payments.PayPalInstalments.TotalInclFinancingCosts"):@totalInclFinancingCosts
\ No newline at end of file From a931f7bc0ef2b0fc044796dd6efde27ecd294913 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Fri, 14 Jun 2019 02:45:18 +0200 Subject: [PATCH 022/115] Set max. file upload size in root web.config --- .../Administration/Controllers/PictureController.cs | 4 +++- src/Presentation/SmartStore.Web/Web.config | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Presentation/SmartStore.Web/Administration/Controllers/PictureController.cs b/src/Presentation/SmartStore.Web/Administration/Controllers/PictureController.cs index c6ba479a31..c831a228fd 100644 --- a/src/Presentation/SmartStore.Web/Administration/Controllers/PictureController.cs +++ b/src/Presentation/SmartStore.Web/Administration/Controllers/PictureController.cs @@ -1,4 +1,6 @@ -using System.Web.Mvc; +using System; +using System.Linq; +using System.Web.Mvc; using SmartStore.Core.Domain.Media; using SmartStore.Data.Utilities; using SmartStore.Services.Media; diff --git a/src/Presentation/SmartStore.Web/Web.config b/src/Presentation/SmartStore.Web/Web.config index f04ec389c3..65b4bdb96e 100644 --- a/src/Presentation/SmartStore.Web/Web.config +++ b/src/Presentation/SmartStore.Web/Web.config @@ -81,7 +81,8 @@ - + + @@ -192,6 +193,8 @@ + + From 5fbb616f2edda9e37138c67f66976c3ba51445d1 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Fri, 14 Jun 2019 03:21:40 +0200 Subject: [PATCH 023/115] Activated url compression by web.config --- .../SmartStore.Web.Framework/Filters/CompressAttribute.cs | 2 +- .../Administration/Controllers/OrderController.cs | 2 +- src/Presentation/SmartStore.Web/Controllers/BlogController.cs | 1 - .../SmartStore.Web/Controllers/BoardsController.cs | 2 -- .../SmartStore.Web/Controllers/CatalogController.cs | 1 - src/Presentation/SmartStore.Web/Controllers/MediaController.cs | 1 - src/Presentation/SmartStore.Web/Controllers/NewsController.cs | 2 +- src/Presentation/SmartStore.Web/Web.config | 3 ++- 8 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/Presentation/SmartStore.Web.Framework/Filters/CompressAttribute.cs b/src/Presentation/SmartStore.Web.Framework/Filters/CompressAttribute.cs index 24ba430c44..bdbde8447f 100644 --- a/src/Presentation/SmartStore.Web.Framework/Filters/CompressAttribute.cs +++ b/src/Presentation/SmartStore.Web.Framework/Filters/CompressAttribute.cs @@ -26,7 +26,7 @@ public override void OnActionExecuting(ActionExecutingContext filterContext) response.AppendHeader("Content-Encoding", "deflate"); } - //response.AppendHeader("Vary", "Content-Encoding"); + response.AppendHeader("Vary", "Content-Encoding"); } } } diff --git a/src/Presentation/SmartStore.Web/Administration/Controllers/OrderController.cs b/src/Presentation/SmartStore.Web/Administration/Controllers/OrderController.cs index 3a03a6aa2b..bcdfa2e8f0 100644 --- a/src/Presentation/SmartStore.Web/Administration/Controllers/OrderController.cs +++ b/src/Presentation/SmartStore.Web/Administration/Controllers/OrderController.cs @@ -1063,7 +1063,7 @@ public ActionResult GoToOrderId(OrderListModel model) #region Export / Import - [HttpPost, Compress] + [HttpPost] public ActionResult ExportPdf(bool all, string selectedIds = null) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) diff --git a/src/Presentation/SmartStore.Web/Controllers/BlogController.cs b/src/Presentation/SmartStore.Web/Controllers/BlogController.cs index e8de124ab7..e58f2c9408 100644 --- a/src/Presentation/SmartStore.Web/Controllers/BlogController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/BlogController.cs @@ -247,7 +247,6 @@ public ActionResult BlogByMonth(string month, BlogPagingFilteringModel command) return View("List", model); } - [Compress] public ActionResult ListRss(int? languageId) { languageId = languageId ?? _workContext.WorkingLanguage.Id; diff --git a/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs b/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs index 18a89c1eb1..759b7f776c 100644 --- a/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/BoardsController.cs @@ -426,7 +426,6 @@ public ActionResult Forum(int id, int page = 1) return View(model); } - [Compress] public ActionResult ForumRss(int id = 0) { if (!_forumSettings.ForumsEnabled) @@ -587,7 +586,6 @@ public ActionResult ActiveDiscussions(int forumId = 0) return View(model); } - [Compress] public ActionResult ActiveDiscussionsRss(int forumId = 0) { if (!_forumSettings.ForumsEnabled) diff --git a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs index b50e5afc74..7bb1b9d963 100644 --- a/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/CatalogController.cs @@ -671,7 +671,6 @@ public ActionResult RecentlyAddedProducts(CatalogSearchQuery query) return View(model); } - [Compress] public ActionResult RecentlyAddedProductsRss(CatalogSearchQuery query) { // TODO: (mc) find a more prominent place for the "NewProducts" link (may be in main menu?) diff --git a/src/Presentation/SmartStore.Web/Controllers/MediaController.cs b/src/Presentation/SmartStore.Web/Controllers/MediaController.cs index a5eff39dee..627823f590 100644 --- a/src/Presentation/SmartStore.Web/Controllers/MediaController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/MediaController.cs @@ -73,7 +73,6 @@ public MediaController( #region XML sitemap - [Compress] [RewriteUrl(SslRequirement.No)] public async Task XmlSitemap(int? index = null) { diff --git a/src/Presentation/SmartStore.Web/Controllers/NewsController.cs b/src/Presentation/SmartStore.Web/Controllers/NewsController.cs index 15a51d5cf4..75029b26e7 100644 --- a/src/Presentation/SmartStore.Web/Controllers/NewsController.cs +++ b/src/Presentation/SmartStore.Web/Controllers/NewsController.cs @@ -226,7 +226,7 @@ public ActionResult List(NewsPagingFilteringModel command) return View(model); } - [ActionName("rss"), Compress] + [ActionName("rss")] public ActionResult ListRss(int? languageId) { languageId = languageId ?? _workContext.WorkingLanguage.Id; diff --git a/src/Presentation/SmartStore.Web/Web.config b/src/Presentation/SmartStore.Web/Web.config index 65b4bdb96e..780dc91b09 100644 --- a/src/Presentation/SmartStore.Web/Web.config +++ b/src/Presentation/SmartStore.Web/Web.config @@ -194,7 +194,7 @@ - + @@ -203,6 +203,7 @@ + From 530761c30076dd115d07bf3ca8e2d15932de1c99 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Fri, 14 Jun 2019 04:14:42 +0200 Subject: [PATCH 024/115] XML sitemap generator should yield nodes, not return them --- .../Seo/XmlSitemapGenerator.cs | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/Libraries/SmartStore.Services/Seo/XmlSitemapGenerator.cs b/src/Libraries/SmartStore.Services/Seo/XmlSitemapGenerator.cs index 49a9cde4b2..17a8e5356e 100644 --- a/src/Libraries/SmartStore.Services/Seo/XmlSitemapGenerator.cs +++ b/src/Libraries/SmartStore.Services/Seo/XmlSitemapGenerator.cs @@ -295,7 +295,7 @@ public virtual async Task RebuildAsync(XmlSitemapBuildContext ctx) using (new DbContextScope(autoDetectChanges: false, forceNoTracking: true, proxyCreation: false, lazyLoading: false)) { - var entities = await EnumerateEntitiesAsync(queries); + var entities = EnumerateEntities(queries); foreach (var batch in entities.Slice(MaximumSiteMapNodeCount)) { @@ -474,24 +474,33 @@ private void SaveFinal(LanguageData data) } } - private async Task> EnumerateEntitiesAsync(QueryHolder queries) + private IEnumerable EnumerateEntities(QueryHolder queries) { if (queries.Categories != null) { - var categories = await queries.Categories.Select(x => new { x.Id, x.UpdatedOnUtc }).ToListAsync(); - return categories.Select(x => new NamedEntity { EntityName = "Category", Id = x.Id, LastMod = x.UpdatedOnUtc }); + var categories = queries.Categories.Select(x => new { x.Id, x.UpdatedOnUtc }).ToList(); + foreach (var x in categories) + { + yield return new NamedEntity { EntityName = "Category", Id = x.Id, LastMod = x.UpdatedOnUtc }; + } } if (queries.Manufacturers != null) { - var manufacturers = await queries.Manufacturers.Select(x => new { x.Id, x.UpdatedOnUtc }).ToListAsync(); - return manufacturers.Select(x => new NamedEntity { EntityName = "Manufacturer", Id = x.Id, LastMod = x.UpdatedOnUtc }); + var manufacturers = queries.Manufacturers.Select(x => new { x.Id, x.UpdatedOnUtc }).ToList(); + foreach (var x in manufacturers) + { + yield return new NamedEntity { EntityName = "Manufacturer", Id = x.Id, LastMod = x.UpdatedOnUtc }; + } } if (queries.Topics != null) { - var topics = await queries.Topics.Select(x => new { x.Id }).ToListAsync(); - return topics.Select(x => new NamedEntity { EntityName = "Topic", Id = x.Id, LastMod = DateTime.UtcNow }); + var topics = queries.Topics.Select(x => new { x.Id }).ToList(); + foreach (var x in topics) + { + yield return new NamedEntity { EntityName = "Topic", Id = x.Id, LastMod = DateTime.UtcNow }; + } } if (queries.Products != null) @@ -502,12 +511,12 @@ private async Task> EnumerateEntitiesAsync(QueryHolder //var limit = 0; while (maxId > 1) { - var products = await query + var products = query .Where(x => x.Id < maxId) .OrderByDescending(x => x.Id) .Take(() => MaximumSiteMapNodeCount) .Select(x => new { x.Id, x.UpdatedOnUtc }) - .ToListAsync(); + .ToList(); //limit++; //if (limit >= 100) @@ -522,11 +531,12 @@ private async Task> EnumerateEntitiesAsync(QueryHolder maxId = products.Last().Id; - return products.Select(x => new NamedEntity { EntityName = "Product", Id = x.Id, LastMod = x.UpdatedOnUtc }); + foreach (var x in products) + { + yield return new NamedEntity { EntityName = "Product", Id = x.Id, LastMod = x.UpdatedOnUtc }; + } } } - - return Enumerable.Empty(); } private IDictionary GetUrlRecordCollectionsForBatch(IEnumerable batch, int[] languageIds) From d018c1993d7d44bd5bc76ca55dacd6818b172266 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Fri, 14 Jun 2019 16:14:28 +0200 Subject: [PATCH 025/115] PayPal: Further work on instalments provider --- .../Controllers/PayPalControllerBase.cs | 5 +- .../PayPalInstalmentsController.cs | 76 +++++++++++++++- .../SmartStore.PayPal/DependencyRegistrar.cs | 3 + .../SmartStore.PayPal/Filters/PayPalFilter.cs | 48 +++++++++++ .../Localization/resources.de-de.xml | 65 +++++++++++--- .../Localization/resources.en-us.xml | 62 ++++++++++--- .../PayPalInstalmentsConfigModel.cs | 31 +++++-- .../Models/PromotionModel.cs | 10 +++ src/Plugins/SmartStore.PayPal/Plugin.cs | 71 +++++++++------ .../Services/IPayPalService.cs | 8 +- .../SmartStore.PayPal/Services/PayPalEnums.cs | 9 +- .../Services/PayPalPaymentFilter.cs | 2 +- .../Services/PayPalService.Credit.cs | 28 ++++++ .../Services/PayPalService.cs | 9 +- .../Settings/PayPalInstalmentsSettings.cs | 28 +++++- .../SmartStore.PayPal.csproj | 6 ++ .../Views/PayPalInstalments/Configure.cshtml | 86 ++++++++++++++++--- .../Views/PayPalInstalments/Promotion.cshtml | 4 + 18 files changed, 469 insertions(+), 82 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Filters/PayPalFilter.cs create mode 100644 src/Plugins/SmartStore.PayPal/Models/PromotionModel.cs create mode 100644 src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs index 191148bf4e..8305ea1b02 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalControllerBase.cs @@ -32,7 +32,7 @@ protected void PrepareConfigurationModel(ApiConfigurationModel model, int storeS model.PrimaryStoreCurrencyCode = store.PrimaryStoreCurrency.CurrencyCode; } - protected bool SaveConfigurationModel(ApiConfigurationModel model, FormCollection form) where TSetting : PayPalApiSettingsBase, ISettings, new() + protected bool SaveConfigurationModel(ApiConfigurationModel model, FormCollection form, Action map = null) where TSetting : PayPalApiSettingsBase, ISettings, new() { var storeDependingSettingHelper = new StoreDependingSettingHelper(ViewData); var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); @@ -66,6 +66,9 @@ protected void PrepareConfigurationModel(ApiConfigurationModel model, int storeS settings.Signature = model.Signature.TrimSafe(); settings.WebhookId = model.WebhookId.TrimSafe(); + // Additional mapping. + map?.Invoke(settings); + // Credentials changed: reset profile and webhook id to avoid errors. if (!oldClientId.IsCaseInsensitiveEqual(settings.ClientId) || !oldSecret.IsCaseInsensitiveEqual(settings.Secret)) { diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index f32ee1f8ea..cdd5d414aa 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -1,11 +1,14 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Web; using System.Web.Mvc; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using SmartStore.ComponentModel; -using SmartStore.Core.Domain.Customers; +using SmartStore.Core.Domain.Stores; using SmartStore.Core.Logging; +using SmartStore.Core.Plugins; using SmartStore.PayPal.Models; using SmartStore.PayPal.Providers; using SmartStore.PayPal.Services; @@ -15,10 +18,12 @@ using SmartStore.Services.Directory; using SmartStore.Services.Orders; using SmartStore.Services.Payments; +using SmartStore.Web.Framework; using SmartStore.Web.Framework.Controllers; using SmartStore.Web.Framework.Security; using SmartStore.Web.Framework.Settings; using SmartStore.Web.Framework.Theming; +using SmartStore.Web.Framework.UI; namespace SmartStore.PayPal.Controllers { @@ -28,7 +33,10 @@ public class PayPalInstalmentsController : PayPalRestApiControllerBase _paymentService; + private readonly IWidgetProvider _widgetProvider; private readonly IPriceFormatter _priceFormatter; + private readonly Lazy _pluginFinder; public PayPalInstalmentsController( HttpContextBase httpContext, @@ -36,14 +44,20 @@ public PayPalInstalmentsController( IGenericAttributeService genericAttributeService, IOrderService orderService, ICurrencyService currencyService, - IPriceFormatter priceFormatter) + Lazy paymentService, + IWidgetProvider widgetProvider, + IPriceFormatter priceFormatter, + Lazy pluginFinder) : base(PayPalInstalmentsProvider.SystemName, payPalService) { _httpContext = httpContext; _genericAttributeService = genericAttributeService; _orderService = orderService; _currencyService = currencyService; + _paymentService = paymentService; + _widgetProvider = widgetProvider; _priceFormatter = priceFormatter; + _pluginFinder = pluginFinder; } public override IList ValidatePaymentForm(FormCollection form) @@ -83,6 +97,7 @@ public ActionResult FinancingDetails() var result = PayPalService.GetPayment(settings, session); if (result.Success) { + result.Json.ToString().Dump(); // TODO: get details. //var total = (string)result.Json.....; //session.FinancingCosts = ; @@ -106,6 +121,46 @@ public ActionResult FinancingDetails() return new EmptyResult(); } + // Widget zone on product detail page. + [ChildActionOnly] + public ActionResult ProductPagePromotion(decimal price) + { + try + { + var store = Services.StoreContext.CurrentStore; + var settings = Services.Settings.LoadSetting(store.Id); + + if (settings.ProductPagePromotion.HasValue && settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(price)) + { + if (_pluginFinder.Value.IsPluginReady(Services.Settings, Plugin.SystemName, store.Id)) + { + if (_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) + { + var model = new PromotionModel + { + Promotion = settings.ProductPagePromotion.Value + }; + + return PartialView("Promotion", model); + } + } + } + } + catch (Exception ex) + { + Logger.Error(ex); + } + + return new EmptyResult(); + } + + // Widget zones for promotion. + //[ChildActionOnly] + //public ActionResult Promote() + //{ + // return new EmptyResult(); + //} + // Widget zone on order details (page and print). [ChildActionOnly] public ActionResult OrderDetails(int orderId, bool print) @@ -180,6 +235,16 @@ public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope { var model = new PayPalInstalmentsConfigModel(); MiniMapper.Map(settings, model); + //model.PromotionWidgetZones = settings.PromotionWidgetZones.SplitSafe(","); + + model.ProductPagePromotions = settings.ProductPagePromotion.HasValue + ? settings.ProductPagePromotion.Value.ToSelectList(true).ToList() + : PayPalPromotion.FinancingExample.ToSelectList(false).ToList(); + + model.CartPagePromotions = settings.CartPagePromotion.HasValue + ? settings.CartPagePromotion.Value.ToSelectList(true).ToList() + : PayPalPromotion.FinancingExample.ToSelectList(false).ToList(); + PrepareConfigurationModel(model, storeScope); return View(model); @@ -188,7 +253,12 @@ public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope [HttpPost, ChildActionOnly, AdminAuthorize, AdminThemed] public ActionResult Configure(PayPalInstalmentsConfigModel model, FormCollection form) { - if (!SaveConfigurationModel(model, form)) + Action additionalMapping = (x) => + { + //x.PromotionWidgetZones = string.Join(",", model.PromotionWidgetZones ?? new string[0]).NullEmpty(); + }; + + if (!SaveConfigurationModel(model, form, additionalMapping)) { var storeScope = this.GetActiveStoreScopeConfiguration(Services.StoreService, Services.WorkContext); var settings = Services.Settings.LoadSetting(storeScope); diff --git a/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs b/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs index fc3e6ea374..8c828802a5 100644 --- a/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs +++ b/src/Plugins/SmartStore.PayPal/DependencyRegistrar.cs @@ -5,6 +5,7 @@ using SmartStore.PayPal.Filters; using SmartStore.PayPal.Services; using SmartStore.Web.Controllers; +using SmartStore.Web.Framework.Controllers; namespace SmartStore.PayPal { @@ -29,6 +30,8 @@ public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, b .InstancePerRequest(); builder.RegisterType().AsActionFilterFor().InstancePerRequest(); + + //builder.RegisterType().AsActionFilterFor(); } } diff --git a/src/Plugins/SmartStore.PayPal/Filters/PayPalFilter.cs b/src/Plugins/SmartStore.PayPal/Filters/PayPalFilter.cs new file mode 100644 index 0000000000..5d313429e9 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Filters/PayPalFilter.cs @@ -0,0 +1,48 @@ +using System; +using System.Web.Mvc; +using SmartStore.PayPal.Settings; +using SmartStore.Web.Framework.UI; + +namespace SmartStore.PayPal.Filters +{ + //public class PayPalFilter : IActionFilter + //{ + // private readonly Lazy _widgetProvider; + // private readonly Lazy _payPalInstalmentsSettings; + + // public PayPalFilter( + // Lazy widgetProvider, + // Lazy payPalInstalmentsSettings) + // { + // _widgetProvider = widgetProvider; + // _payPalInstalmentsSettings = payPalInstalmentsSettings; + // } + + // public void OnActionExecuting(ActionExecutingContext filterContext) + // { + // } + + // public void OnActionExecuted(ActionExecutedContext filterContext) + // { + // if (filterContext.IsChildAction) + // return; + + // if (!filterContext.Result.IsHtmlViewResult()) + // return; + + // if (filterContext.HttpContext.Request.HttpMethod != "GET") + // return; + + // // Promotion for instalments payment. + // if (_payPalInstalmentsSettings.Value.Promote && _payPalInstalmentsSettings.Value.PromotionWidgetZones.HasValue()) + // { + // _widgetProvider.Value.RegisterAction( + // _payPalInstalmentsSettings.Value.PromotionWidgetZones.SplitSafe(","), + // "Promote", + // "PayPalInstalments", + // new { area = Plugin.SystemName }, + // _payPalInstalmentsSettings.Value.PromotionDisplayOrder); + // } + // } + //} +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index b4e970f8bd..5588b55fe8 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -9,6 +9,12 @@ PayPal
+ + Inklusive Finanzierungsbeispiel + + + Nur Text + Zugangsdaten @@ -49,8 +55,11 @@ PayPal konnte die übermittelten Daten nicht verifizieren. - - + + Promotion + + + Client-ID @@ -77,8 +86,8 @@ Legt die Webhook-ID fest. Über einen Webhook sendet PayPal Statusänderungen von Zahlungen an Ihren Shop, wodurch der Zahlungsstatus Ihrer Aufträge automatisch aktualisert werden kann. - - + + Sandbox benutzen @@ -461,7 +470,7 @@ Unter Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
  • Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
  • Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.
  • -

    Once an order has been placed, the order total and order items may no longer be changed!

    ]]> +

    Nach Auftragserteilung dürfen die Auftragssumme und die Auftragspositionen nicht mehr geändert werden!

    ]]>
    @@ -473,18 +482,48 @@ Unter Gesamt inkl. Finanzierungskosten
    - - Mindestbestellwert + + Minimaler Finanzierungsbetrag + + + Legt den minimalen Betrag fest, ab dem eine Ratenzahlung angeboten werden soll. + + + Maximaler Finanzierungsbetrag + + + Legt den maximalen Betrag fest, bis zu dem eine Ratenzahlung angeboten werden soll. + + + Auf Produktseiten + + + Legt fest, ob und wie die Ratenzahlung auf Produktseiten beworben werden soll. + + + Auf der Warenkorbseite + + + Legt fest, ob und wie die Ratenzahlung auf der Warenkorbseite beworben werden soll. + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 1fd2984944..d2e1cc7c6f 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -9,6 +9,13 @@ PayPal
    + + Including financing example + + + Only text + + Access data @@ -51,8 +58,11 @@ PayPal was unable to verify the transmitted data. + + Promotion + - + Client ID @@ -466,11 +476,11 @@ Go to Click the name of the application and enter Client-ID and Secret below on this page. Save.
  • Optional: Click Add next to Experience profile ID to create a new profile. Your shop data (name, logo etc.) can now be displayed to customers when paying on PayPal pages.
  • Optional: Click Add next to Webhook-ID to create a webhook. Through a webhook the shop receives PayPal messages und possibly updates the payment state of your orders.
  • -

    ]]> +

    Once an order has been placed, the order total and order items may no longer be changed!

    ]]>
    - We enable you to finance your purchase with the installment payment Powered by PayPal. In seconds, fully online, subject to credit check. + We enable you to finance your purchase with the instalment payment Powered by PayPal. In seconds, fully online, subject to credit check. Financing costs @@ -478,18 +488,48 @@ Go to Total incl. financing costs
    - - Minimum order amount + + Minimum financing amount + + + Specifies the minimum anount from which to offer a payment by instalments. + + + Maximum financing amount + + + Specifies the maximum amount up to which to offer a payment by instalments. + + + On product pages + + + Specifies whether and how to promote payment by instalments on product pages. + + + On cart page + + + Specifies whether and how to promote payment by instalments on the cart page. + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs index d36eea734d..edc44d4e1e 100644 --- a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs +++ b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs @@ -1,4 +1,7 @@ -using SmartStore.PayPal.Settings; +using System.Collections.Generic; +using System.Web.Mvc; +using SmartStore.PayPal.Services; +using SmartStore.PayPal.Settings; using SmartStore.Web.Framework; namespace SmartStore.PayPal.Models @@ -10,10 +13,28 @@ public PayPalInstalmentsConfigModel() TransactMode = TransactMode.AuthorizeAndCapture; } - [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.OrderAmountMin")] - public decimal OrderAmountMin { get; set; } + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.FinancingMin")] + public decimal FinancingMin { get; set; } - [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.OrderAmountMax")] - public decimal OrderAmountMax { get; set; } + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.FinancingMax")] + public decimal FinancingMax { get; set; } + + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.ProductPagePromotion")] + public PayPalPromotion? ProductPagePromotion { get; set; } + public IList ProductPagePromotions { get; set; } + + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.CartPagePromotion")] + public PayPalPromotion? CartPagePromotion { get; set; } + public IList CartPagePromotions { get; set; } + + //[SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.Promote")] + //public bool Promote { get; set; } + + //[SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.PromotionWidgetZones")] + //[UIHint("WidgetZone")] + //public string[] PromotionWidgetZones { get; set; } + + //[SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.PromotionDisplayOrder")] + //public int PromotionDisplayOrder { get; set; } } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Models/PromotionModel.cs b/src/Plugins/SmartStore.PayPal/Models/PromotionModel.cs new file mode 100644 index 0000000000..8ae30ed50c --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Models/PromotionModel.cs @@ -0,0 +1,10 @@ +using SmartStore.PayPal.Services; +using SmartStore.Web.Framework.Modelling; + +namespace SmartStore.PayPal.Models +{ + public class PromotionModel : ModelBase + { + public PayPalPromotion Promotion { get; set; } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Plugin.cs b/src/Plugins/SmartStore.PayPal/Plugin.cs index 5f3f5801ff..1defcacee9 100644 --- a/src/Plugins/SmartStore.PayPal/Plugin.cs +++ b/src/Plugins/SmartStore.PayPal/Plugin.cs @@ -6,9 +6,10 @@ using SmartStore.PayPal.Providers; using SmartStore.PayPal.Services; using SmartStore.PayPal.Settings; +using SmartStore.Services; using SmartStore.Services.Cms; -using SmartStore.Services.Configuration; -using SmartStore.Services.Localization; +using SmartStore.Services.Directory; +using SmartStore.Web.Models.Catalog; using SmartStore.Web.Models.Order; namespace SmartStore.PayPal @@ -17,18 +18,18 @@ namespace SmartStore.PayPal [FriendlyName("PayPal")] public class Plugin : BasePlugin, IWidget { - private readonly ISettingService _settingService; - private readonly ILocalizationService _localizationService; + private readonly ICommonServices _services; private readonly Lazy _payPalService; + private readonly Lazy _currencyService; - public Plugin( - ISettingService settingService, - ILocalizationService localizationService, - Lazy payPalService) + public Plugin( + ICommonServices services, + Lazy payPalService, + Lazy currencyService) { - _settingService = settingService; - _localizationService = localizationService; + _services = services; _payPalService = payPalService; + _currencyService = currencyService; Logger = NullLogger.Instance; } @@ -39,29 +40,29 @@ public Plugin( public override void Install() { - _settingService.SaveSetting(new PayPalExpressPaymentSettings()); - _settingService.SaveSetting(new PayPalDirectPaymentSettings()); - _settingService.SaveSetting(new PayPalStandardPaymentSettings()); - _settingService.SaveSetting(new PayPalPlusPaymentSettings()); - _settingService.SaveSetting(new PayPalInstalmentsSettings()); + _services.Settings.SaveSetting(new PayPalExpressPaymentSettings()); + _services.Settings.SaveSetting(new PayPalDirectPaymentSettings()); + _services.Settings.SaveSetting(new PayPalStandardPaymentSettings()); + _services.Settings.SaveSetting(new PayPalPlusPaymentSettings()); + _services.Settings.SaveSetting(new PayPalInstalmentsSettings()); - _localizationService.ImportPluginResourcesFromXml(this.PluginDescriptor); + _services.Localization.ImportPluginResourcesFromXml(this.PluginDescriptor); base.Install(); } public override void Uninstall() { - DeleteWebhook(_settingService.LoadSetting(), PayPalPlusProvider.SystemName); - DeleteWebhook(_settingService.LoadSetting(), PayPalInstalmentsProvider.SystemName); + DeleteWebhook(_services.Settings.LoadSetting(), PayPalPlusProvider.SystemName); + DeleteWebhook(_services.Settings.LoadSetting(), PayPalInstalmentsProvider.SystemName); - _settingService.DeleteSetting(); - _settingService.DeleteSetting(); - _settingService.DeleteSetting(); - _settingService.DeleteSetting(); - _settingService.DeleteSetting(); + _services.Settings.DeleteSetting(); + _services.Settings.DeleteSetting(); + _services.Settings.DeleteSetting(); + _services.Settings.DeleteSetting(); + _services.Settings.DeleteSetting(); - _localizationService.DeleteLocaleStringResources(PluginDescriptor.ResourceRootKey); + _services.Localization.DeleteLocaleStringResources(PluginDescriptor.ResourceRootKey); base.Uninstall(); } @@ -70,6 +71,7 @@ public IList GetWidgetZones() { return new List { + "productdetails_add_info", "orderdetails_page_aftertotal", "invoice_aftertotal" }; @@ -84,7 +86,26 @@ public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, { "area", SystemName } }; - if (widgetZone.IsCaseInsensitiveEqual("orderdetails_page_aftertotal") || widgetZone.IsCaseInsensitiveEqual("invoice_aftertotal")) + if (widgetZone.IsCaseInsensitiveEqual("productdetails_add_info")) + { + actionName = "ProductPagePromotion"; + controllerName = "PayPalInstalments"; + + var price = decimal.Zero; + var viewModel = model as ProductDetailsModel; + if (viewModel != null) + { + price = viewModel.ProductPrice.PriceWithDiscountValue > decimal.Zero + ? viewModel.ProductPrice.PriceWithDiscountValue + : viewModel.ProductPrice.PriceValue; + + // Convert because price is in working currency. + price = _currencyService.Value.ConvertToPrimaryStoreCurrency(price, _services.WorkContext.WorkingCurrency); + } + + routeValues.Add(nameof(price), price); + } + else if (widgetZone.IsCaseInsensitiveEqual("orderdetails_page_aftertotal") || widgetZone.IsCaseInsensitiveEqual("invoice_aftertotal")) { actionName = "OrderDetails"; controllerName = "PayPalInstalments"; diff --git a/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs index 107965735e..5ea7d8b6e0 100644 --- a/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs @@ -58,5 +58,11 @@ HttpStatusCode ProcessWebhook( NameValueCollection headers, string rawJson, string providerSystemName); - } + + #region Credit + + PayPalResponse GetFinancingOptions(PayPalApiSettingsBase settings, PayPalSessionData session, decimal amount); + + #endregion + } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalEnums.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalEnums.cs index d5bba1b72c..5211bf9cc0 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalEnums.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalEnums.cs @@ -1,5 +1,4 @@ - -namespace SmartStore.PayPal.Services +namespace SmartStore.PayPal.Services { public enum PayPalPaymentInstructionItem { @@ -24,4 +23,10 @@ public enum PayPalMessage Amount, PaymentId } + + public enum PayPalPromotion + { + FinancingExample = 0, + TextOnly + } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs index d4a0c03961..73d8ff91de 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalPaymentFilter.cs @@ -48,7 +48,7 @@ protected bool CanPayOrderAmount(PayPalInstalmentsSettings settings, PaymentFilt return false; } - return cartTotal >= settings.OrderAmountMin && cartTotal <= settings.OrderAmountMax; + return cartTotal >= settings.FinancingMin && cartTotal <= settings.FinancingMax; } protected bool IsPaymentExcluded(PaymentFilterRequest request) diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs new file mode 100644 index 0000000000..b981b10b54 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using SmartStore.PayPal.Settings; + +namespace SmartStore.PayPal.Services +{ + public partial class PayPalService + { + public PayPalResponse GetFinancingOptions(PayPalApiSettingsBase settings, PayPalSessionData session, decimal amount) + { + var data = new Dictionary(); + var store = _services.StoreContext.CurrentStore; + var currencyCode = store.PrimaryStoreCurrency.CurrencyCode; + var merchantCountry = _countryService.Value.GetCountryById(_companyInfoSettings.Value.CountryId) ?? _countryService.Value.GetAllCountries().FirstOrDefault(); + + var transactionAmount = new Dictionary(); + transactionAmount.Add("value", amount.FormatInvariant()); + transactionAmount.Add("currency_code", currencyCode); + + data.Add("financing_country_code", merchantCountry.TwoLetterIsoCode); + data.Add("transaction_amount", transactionAmount); + + var result = CallApi("POST", "/v1/credit/calculated-financing-options", session.AccessToken, settings, JsonConvert.SerializeObject(data)); + return result; + } + } +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs index ba6f9714c7..27296a9511 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.cs @@ -33,7 +33,7 @@ namespace SmartStore.PayPal.Services { - public class PayPalService : IPayPalService + public partial class PayPalService : IPayPalService { private readonly Lazy> _orderRepository; private readonly ICommonServices _services; @@ -45,7 +45,8 @@ public class PayPalService : IPayPalService private readonly ITaxService _taxService; private readonly ICurrencyService _currencyService; private readonly Lazy _pictureService; - private readonly Lazy _companyInfoSettings; + private readonly Lazy _countryService; + private readonly Lazy _companyInfoSettings; public PayPalService( Lazy> orderRepository, @@ -58,7 +59,8 @@ public PayPalService( ITaxService taxService, ICurrencyService currencyService, Lazy pictureService, - Lazy companyInfoSettings) + Lazy countryService, + Lazy companyInfoSettings) { _orderRepository = orderRepository; _services = services; @@ -70,6 +72,7 @@ public PayPalService( _taxService = taxService; _currencyService = currencyService; _pictureService = pictureService; + _countryService = countryService; _companyInfoSettings = companyInfoSettings; T = NullLocalizer.Instance; diff --git a/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs b/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs index a5805aca0c..6ab7d27013 100644 --- a/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs +++ b/src/Plugins/SmartStore.PayPal/Settings/PayPalInstalmentsSettings.cs @@ -1,4 +1,5 @@ using SmartStore.Core.Configuration; +using SmartStore.PayPal.Services; namespace SmartStore.PayPal.Settings { @@ -7,11 +8,30 @@ public class PayPalInstalmentsSettings : PayPalApiSettingsBase, ISettings public PayPalInstalmentsSettings() { TransactMode = TransactMode.Authorize; - OrderAmountMin = 99.0M; - OrderAmountMax = 5000.0M; + FinancingMin = 99.0M; + FinancingMax = 5000.0M; + ProductPagePromotion = PayPalPromotion.FinancingExample; + CartPagePromotion = PayPalPromotion.FinancingExample; } - public decimal OrderAmountMin { get; set; } - public decimal OrderAmountMax { get; set; } + public decimal FinancingMin { get; set; } + public decimal FinancingMax { get; set; } + + //public bool Promote { get; set; } + //public string PromotionWidgetZones { get; set; } + //public int PromotionDisplayOrder { get; set; } + + public PayPalPromotion? ProductPagePromotion { get; set; } + public PayPalPromotion? CartPagePromotion { get; set; } + + public bool IsAmountFinanceable(decimal amount) + { + if (amount == decimal.Zero) + { + return false; + } + + return amount >= FinancingMin && amount <= FinancingMax; + } } } \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 5e2400d1b9..ff967275b3 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -137,6 +137,7 @@ + @@ -147,6 +148,7 @@ + @@ -157,6 +159,7 @@ + @@ -332,6 +335,9 @@ PreserveNewest + + PreserveNewest + Designer diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml index 474b8bae8f..8d8d068317 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Configure.cshtml @@ -32,11 +32,71 @@ @using (Html.BeginForm()) { - @Html.HiddenFor(model => model.TransactMode) + @Html.HiddenFor(x => x.TransactMode) @Html.Partial("ApiConfiguration") + + + + + + + + + + + + + @* + + + + + + + + + + + + + *@ +
    +
    +
    + @T("Plugins.SmartStore.PayPal.Promotion") +
    +
    +
    + @Html.SmartLabelFor(x => x.ProductPagePromotion) + + @Html.SettingEditorFor(x => x.ProductPagePromotion, + @Html.DropDownListFor(x => x.ProductPagePromotion, Model.ProductPagePromotions, T("Common.Unspecified"))) + @Html.ValidationMessageFor(x => x.ProductPagePromotion) +
    + @Html.SmartLabelFor(x => x.CartPagePromotion) + + @Html.SettingEditorFor(x => x.CartPagePromotion, + @Html.DropDownListFor(x => x.CartPagePromotion, Model.CartPagePromotions, T("Common.Unspecified"))) + @Html.ValidationMessageFor(x => x.CartPagePromotion) +
    + @Html.SmartLabelFor(x => x.Promote) + + @Html.SettingEditorFor(x => x.Promote, Html.CheckBoxFor(x => x.Promote, new { data_toggler_for = "#pnlPromote" })) + @Html.ValidationMessageFor(x => x.Promote) +
    + @Html.SmartLabelFor(x => x.PromotionWidgetZones) + + @Html.SettingEditorFor(x => x.PromotionWidgetZones, @Html.EditorFor(x => x.PromotionWidgetZones)) + @Html.ValidationMessageFor(x => x.PromotionWidgetZones) +
    + @Html.SmartLabelFor(x => x.PromotionDisplayOrder) + + @Html.SettingEditorFor(x => x.PromotionDisplayOrder) + @Html.ValidationMessageFor(x => x.PromotionDisplayOrder) +
    @@ -48,38 +108,38 @@
    - @Html.SmartLabelFor(x => x.OrderAmountMin) + @Html.SmartLabelFor(x => x.FinancingMin) - @Html.SettingEditorFor(x => x.OrderAmountMin, null, new { postfix = Model.PrimaryStoreCurrencyCode }) - @Html.ValidationMessageFor(x => x.OrderAmountMin) + @Html.SettingEditorFor(x => x.FinancingMin, null, new { postfix = Model.PrimaryStoreCurrencyCode }) + @Html.ValidationMessageFor(x => x.FinancingMin)
    - @Html.SmartLabelFor(x => x.OrderAmountMax) + @Html.SmartLabelFor(x => x.FinancingMax) - @Html.SettingEditorFor(x => x.OrderAmountMax, null, new { postfix = Model.PrimaryStoreCurrencyCode }) - @Html.ValidationMessageFor(x => x.OrderAmountMax) + @Html.SettingEditorFor(x => x.FinancingMax, null, new { postfix = Model.PrimaryStoreCurrencyCode }) + @Html.ValidationMessageFor(x => x.FinancingMax)
    - @Html.SmartLabelFor(model => model.AdditionalFee) + @Html.SmartLabelFor(x => x.AdditionalFee) - @Html.SettingEditorFor(model => model.AdditionalFee, null, new { postfix = Model.PrimaryStoreCurrencyCode }) - @Html.ValidationMessageFor(model => model.AdditionalFee) + @Html.SettingEditorFor(x => x.AdditionalFee, null, new { postfix = Model.PrimaryStoreCurrencyCode }) + @Html.ValidationMessageFor(x => x.AdditionalFee)
    - @Html.SmartLabelFor(model => model.AdditionalFeePercentage) + @Html.SmartLabelFor(x => x.AdditionalFeePercentage) - @Html.SettingEditorFor(model => model.AdditionalFeePercentage) - @Html.ValidationMessageFor(model => model.AdditionalFeePercentage) + @Html.SettingEditorFor(x => x.AdditionalFeePercentage) + @Html.ValidationMessageFor(x => x.AdditionalFeePercentage)
    diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml new file mode 100644 index 0000000000..b28dc73582 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml @@ -0,0 +1,4 @@ +@using SmartStore.PayPal.Models; +@model PromotionModel +@{ +} From ec5026f5df92a4a16a03c60e5475467f1c06f6a7 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Fri, 14 Jun 2019 22:29:30 +0200 Subject: [PATCH 026/115] Search query model binder: don't throw exception when casting fails --- changelog.md | 9 ++++----- .../Catalog/Modelling/CatalogSearchQueryFactory.cs | 2 +- .../Search/Forum/Modelling/ForumSearchQueryFactory.cs | 2 +- .../Search/SearchQueryFactoryBase.cs | 10 ++++------ 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/changelog.md b/changelog.md index e0fa82de67..c01971a062 100644 --- a/changelog.md +++ b/changelog.md @@ -2,12 +2,11 @@ ## SmartStore.NET 3.2.2 -### Improvements -* Amazon Pay: PSD2. Strong customer authentication (SCA) upgrade. - ### New Features * Page Builder: multistore support for stories. * #1639 Shipping.ByTotal: Add option to calculate the shipping rate based on the net total instead of the gross total. +### Improvements +* Amazon Pay: PSD2. Strong customer authentication (SCA) upgrade. ### Bugfixes * #1646 Setting ManufacturerItemsToDisplayOnHomepage to 1 will not show any manufacturer. @@ -446,7 +445,7 @@ * Added config setting *sm:PdfEngineBaseUrl*. There are cases where the PDF converter exits with a network error, when it is unable to load automatically resolved URLs. * (Dev) Added *Retry* utility class * #1176 Admin > Product Search: It ain't possible to search for parts of a product name - + ### Bugfixes * #1145: Fixed HTTP 404 after switching language * Fixed null reference exception in product lists if sorting is not allowed @@ -1355,7 +1354,7 @@ * [SMNET-202] - SmartTabSelection mit verschachtelten Tabs fehlerhaft nach Reload einer Seite ### Improvement - + * [SMNET-13] - Attributwerte: der Text "Aufpreis" muss um "Minderpreis" erweitert werden. * [SMNET-15] - Umgestaltung der Darstellung der Staffelpreise (Popover ab dem fünften Element) * [SMNET-30] - MessageTemplates teilweise auf Englisch diff --git a/src/Libraries/SmartStore.Services/Search/Catalog/Modelling/CatalogSearchQueryFactory.cs b/src/Libraries/SmartStore.Services/Search/Catalog/Modelling/CatalogSearchQueryFactory.cs index 88bb3da613..3c30544a0d 100644 --- a/src/Libraries/SmartStore.Services/Search/Catalog/Modelling/CatalogSearchQueryFactory.cs +++ b/src/Libraries/SmartStore.Services/Search/Catalog/Modelling/CatalogSearchQueryFactory.cs @@ -595,7 +595,7 @@ protected virtual void OnConverted(CatalogSearchQuery query, RouteData routeData protected virtual bool GetValueFor(CatalogSearchQuery query, string key, FacetGroupKind kind, out T value) { - return GetValueFor(_catalogSearchQueryAliasMapper.GetCommonFacetAliasByGroupKind(kind, query.LanguageId ?? 0) ?? key, out value); + return TryGetValueFor(_catalogSearchQueryAliasMapper.GetCommonFacetAliasByGroupKind(kind, query.LanguageId ?? 0) ?? key, out value); } } } diff --git a/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs b/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs index 05f89aa954..d4c9c754d5 100644 --- a/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs +++ b/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs @@ -252,7 +252,7 @@ protected virtual void OnConverted(ForumSearchQuery query, RouteData routeData, protected virtual bool GetValueFor(ForumSearchQuery query, string key, FacetGroupKind kind, out T value) { - return GetValueFor(_forumSearchQueryAliasMapper.GetCommonFacetAliasByGroupKind(kind, query.LanguageId ?? 0) ?? key, out value); + return TryGetValueFor(_forumSearchQueryAliasMapper.GetCommonFacetAliasByGroupKind(kind, query.LanguageId ?? 0) ?? key, out value); } protected virtual void AddDates(FacetDescriptor descriptor, DateTime? selectedFrom, DateTime? selectedTo) diff --git a/src/Libraries/SmartStore.Services/Search/SearchQueryFactoryBase.cs b/src/Libraries/SmartStore.Services/Search/SearchQueryFactoryBase.cs index 998503180d..0fa710c25d 100644 --- a/src/Libraries/SmartStore.Services/Search/SearchQueryFactoryBase.cs +++ b/src/Libraries/SmartStore.Services/Search/SearchQueryFactoryBase.cs @@ -62,21 +62,19 @@ protected virtual Multimap Aliases protected virtual T GetValueFor(string key) { - T value; - return GetValueFor(key, out value) ? value : default(T); + return TryGetValueFor(key, out T value) ? value : default; } - protected virtual bool GetValueFor(string key, out T value) + protected virtual bool TryGetValueFor(string key, out T value) { var strValue = _httpContext.Request?.Unvalidated.Form?[key] ?? _httpContext.Request?.Unvalidated.QueryString?[key]; if (strValue.HasValue()) { - value = strValue.Convert(); - return true; + return CommonHelper.TryConvert(strValue, out value); } - value = default(T); + value = default; return false; } From e02f02045bf2ed394cfb84d228441fe50406d72c Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Sat, 15 Jun 2019 02:33:41 +0200 Subject: [PATCH 027/115] Updated changelog --- changelog.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/changelog.md b/changelog.md index c01971a062..0821c19ebc 100644 --- a/changelog.md +++ b/changelog.md @@ -7,10 +7,18 @@ * #1639 Shipping.ByTotal: Add option to calculate the shipping rate based on the net total instead of the gross total. ### Improvements * Amazon Pay: PSD2. Strong customer authentication (SCA) upgrade. +* Removed HTML encoding for meta tags and document title. +* (SEO) combined SSL and canonical host 301 redirections to prevent successive redirects. +* (SEO) Activated GZIP compression for all dynamic and static responses. +* Set max. file upload size to 2 GB (globally) +* (Dev) Added a sample block for the *Page Builder* in DevTools plugin. +* Various other minor improvements ### Bugfixes +* Fixed wrong XML sitemap index numbering. * #1646 Setting ManufacturerItemsToDisplayOnHomepage to 1 will not show any manufacturer. * #1647 All manufacturers page: link of last character missing in alphabetical letter list. +* Various other minor fixes ## SmartStore.NET 3.2.1 From b8cda43dc0a6928d902e8adf71355b8d58dad906 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Mon, 17 Jun 2019 16:16:11 +0200 Subject: [PATCH 028/115] PayPal: Further work on instalments provider --- .../Content/instalments-sm.png | Bin 5379 -> 4782 bytes .../PayPalInstalmentsController.cs | 118 +++++++++------- .../PayPalInstalmentsCheckoutFilter.cs | 3 +- .../Localization/resources.de-de.xml | 117 +++++++++------- .../Localization/resources.en-us.xml | 126 ++++++++++-------- .../PayPalInstalmentsConfigModel.cs | 3 + .../Models/PromotionModel.cs | 10 -- src/Plugins/SmartStore.PayPal/Plugin.cs | 52 +++++--- .../Services/IPayPalService.cs | 2 +- .../Services/PayPalService.Credit.cs | 59 +++++++- .../Services/PayPalService.cs | 22 ++- .../Settings/PayPalInstalmentsSettings.cs | 1 + .../SmartStore.PayPal.csproj | 1 - .../Views/PayPalInstalments/Configure.cshtml | 9 ++ .../Views/PayPalInstalments/Promotion.cshtml | 51 ++++++- 15 files changed, 393 insertions(+), 181 deletions(-) delete mode 100644 src/Plugins/SmartStore.PayPal/Models/PromotionModel.cs diff --git a/src/Plugins/SmartStore.PayPal/Content/instalments-sm.png b/src/Plugins/SmartStore.PayPal/Content/instalments-sm.png index 614d558ab2a703fdba067f7c870845f251256224..81b6f59820e08378167173edd26205ad74da7e7e 100644 GIT binary patch delta 4772 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 bL&D5f&F6D6T(&Geo?w37L0)xSLE8TT4?#ii literal 5379 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 Mr<(store.Id); - - if (settings.ProductPagePromotion.HasValue && settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(price)) - { - if (_pluginFinder.Value.IsPluginReady(Services.Settings, Plugin.SystemName, store.Id)) - { - if (_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) - { - var model = new PromotionModel - { - Promotion = settings.ProductPagePromotion.Value - }; - - return PartialView("Promotion", model); - } - } - } - } - catch (Exception ex) - { - Logger.Error(ex); - } - - return new EmptyResult(); - } - - // Widget zones for promotion. - //[ChildActionOnly] - //public ActionResult Promote() - //{ - // return new EmptyResult(); - //} - // Widget zone on order details (page and print). [ChildActionOnly] - public ActionResult OrderDetails(int orderId, bool print) + public ActionResult OrderDetailsTotal(int orderId, bool print) { try { @@ -204,7 +164,7 @@ public ActionResult OrderDetails(int orderId, bool print) return new EmptyResult(); } - // Redirect from PayPal. + // Redirect from PayPal to the shop. public ActionResult CheckoutReturn(string paymentId, string PayerID) { // Request.QueryString: @@ -222,12 +182,72 @@ public ActionResult CheckoutReturn(string paymentId, string PayerID) return RedirectToAction("Confirm", "Checkout", new { area = "" }); } - // Redirect from PayPal. + // Redirect from PayPal to the shop. public ActionResult CheckoutCancel() { + var store = Services.StoreContext.CurrentStore; + var customer = Services.WorkContext.CurrentCustomer; + + _genericAttributeService.SaveAttribute(customer, SystemCustomerAttributeNames.SelectedPaymentMethod, null, store.Id); + return RedirectToAction("PaymentMethod", "Checkout", new { area = "" }); } + #region Promotion + + // Widget zone on product detail or cart page. + [ChildActionOnly] + public ActionResult Promotion(bool isProductPage, decimal amount) + { + try + { + var store = Services.StoreContext.CurrentStore; + var settings = Services.Settings.LoadSetting(store.Id); + var promotion = isProductPage ? settings.ProductPagePromotion : settings.CartPagePromotion; + + if (promotion.HasValue && settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(amount)) + { + if (_pluginFinder.Value.IsPluginReady(Services.Settings, Plugin.SystemName, store.Id)) + { + if (_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) + { + var options = new FinancingOptions(); + + //if (settings.ProductPagePromotion == PayPalPromotion.FinancingExample) + //{ + // var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + // var result = PayPalService.EnsureAccessToken(session, settings); + // if (result.Success) + // { + // options = PayPalService.GetFinancingOptions(settings, session, amount); + // } + //} + + options.Promotion = promotion.Value; + options.Lender = settings.Lender; + + return PartialView(options); + } + } + } + } + catch (Exception ex) + { + Logger.Error(ex); + } + + return new EmptyResult(); + } + + // Widget zones for promotion. + //[ChildActionOnly] + //public ActionResult Promote() + //{ + // return new EmptyResult(); + //} + + #endregion + #region Admin [ChildActionOnly, AdminAuthorize, LoadSetting, AdminThemed] @@ -247,6 +267,12 @@ public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope PrepareConfigurationModel(model, storeScope); + if (model.Lender == null) + { + var cs = Services.Settings.LoadSetting(); + model.Lender = $"{cs.CompanyName.EmptyNull()}, {cs.Street.EmptyNull()}, {cs.ZipCode.EmptyNull()} {cs.City.EmptyNull()}"; + } + return View(model); } diff --git a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs index b02427772c..5e30b1678a 100644 --- a/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs +++ b/src/Plugins/SmartStore.PayPal/Filters/PayPalInstalmentsCheckoutFilter.cs @@ -48,7 +48,7 @@ public void OnActionExecuting(ActionExecutingContext filterContext) if (selectedMethod.IsCaseInsensitiveEqual(PayPalInstalmentsProvider.SystemName)) { - _widgetProvider.Value.RegisterAction("order_summary_totals_after", "FinancingDetails", "PayPalInstalments", new { area = Plugin.SystemName }); + _widgetProvider.Value.RegisterAction("order_summary_totals_after", "OrderSummaryTotals", "PayPalInstalments", new { area = Plugin.SystemName }); CreatePayment(filterContext); } @@ -66,6 +66,7 @@ private void CreatePayment(ActionExecutingContext context) var session = context.HttpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); session.PaymentId = null; + session.FinancingCosts = session.TotalInclFinancingCosts = decimal.Zero; var result = _payPalService.Value.EnsureAccessToken(session, settings); if (result.Success) diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index 5588b55fe8..4165d24201 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -174,21 +174,21 @@ Stellen Sie bitte sicher, dass PayPal die Primärwährung Ihres Shops unterstützt, falls Sie dieses Gateway benutzen!

    1. Loggen Sie sich in Ihr PayPal-Konto ein.
    2. -
    3. Klicken Sie auf den Register Mein Profil.
    4. -
    5. Klicken Sie unter Verkäufer/Händler auf API-Zugriff.
    6. -
    7. Klicken Sie auf API-Berechtigung anfordern.
    8. -
    9. Wählen Sie die Option Fordern Sie eine API-Signature an.
    10. -
    11. Klicken Sie auf Zustimmen und senden.
    12. +
    13. Klicken Sie auf den Register Mein Profil.
    14. +
    15. Klicken Sie unter Verkäufer/Händler auf API-Zugriff.
    16. +
    17. Klicken Sie auf API-Berechtigung anfordern.
    18. +
    19. Wählen Sie die Option Fordern Sie eine API-Signature an.
    20. +
    21. Klicken Sie auf Zustimmen und senden.

    Aktivieren Sie optional den PayPal-Service zum Empfang von IPN-Nachrichten (Instant Payment Notification):

    1. In Ihr Premier- oder Business-Konto einloggen.
    2. -
    3. Auf den Register Mein Profil klicken.
    4. -
    5. Unter Sprach-Kodierung > Weitere Einstellungen wählen Sie bitte UTF-8.
    6. -
    7. Sofortige Zahlungsbestätigung klicken.
    8. -
    9. Einstellungen für sofortige Zahlungsbestätigungen wählen klicken.
    10. -
    11. Bei Benachrichtigungs-URL die URL Ihres IPN-Handlers (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalExpress/IPNHandler) eingeben.
    12. -
    13. Speichern klicken. Danach sollten Sie eine Nachricht über die erfolgreiche Aktivierung von IPN erhalten.
    14. +
    15. Auf den Register Mein Profil klicken.
    16. +
    17. Unter Sprach-Kodierung > Weitere Einstellungen wählen Sie bitte UTF-8.
    18. +
    19. Sofortige Zahlungsbestätigung klicken.
    20. +
    21. Einstellungen für sofortige Zahlungsbestätigungen wählen klicken.
    22. +
    23. Bei Benachrichtigungs-URL die URL Ihres IPN-Handlers (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalExpress/IPNHandler) eingeben.
    24. +
    25. Speichern klicken. Danach sollten Sie eine Nachricht über die erfolgreiche Aktivierung von IPN erhalten.
    ]]>
    @@ -248,21 +248,21 @@ Stellen Sie bitte sicher, dass PayPal die Primärwährung Ihres Shops unterstützt, falls Sie dieses Gateway benutzen!

    1. Loggen Sie sich in Ihr PayPal-Konto ein.
    2. -
    3. Klicken Sie auf den Register Mein Profil.
    4. -
    5. Klicken Sie unter Verkäufer/Händler auf API-Zugriff.
    6. -
    7. Klicken Sie auf API-Berechtigung anfordern.
    8. -
    9. Wählen Sie die Option Fordern Sie eine API-Signature an.
    10. -
    11. Klicken Sie auf Zustimmen und senden.
    12. +
    13. Klicken Sie auf den Register Mein Profil.
    14. +
    15. Klicken Sie unter Verkäufer/Händler auf API-Zugriff.
    16. +
    17. Klicken Sie auf API-Berechtigung anfordern.
    18. +
    19. Wählen Sie die Option Fordern Sie eine API-Signature an.
    20. +
    21. Klicken Sie auf Zustimmen und senden.

    Aktivieren Sie optional den PayPal-Service zum Empfang von IPN-Nachrichten (Instant Payment Notification):

    1. In Ihr Premier- oder Business-Konto einloggen.
    2. -
    3. Auf den Register Mein Profil klicken.
    4. -
    5. Unter Sprach-Kodierung > Weitere Einstellungen wählen Sie bitte UTF-8.
    6. -
    7. Sofortige Zahlungsbestätigung klicken.
    8. -
    9. Einstellungen für sofortige Zahlungsbestätigungen wählen klicken.
    10. -
    11. Bei Benachrichtigungs-URL die URL Ihres IPN-Handlers (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalDirect/IPNHandler) eingeben.
    12. -
    13. Speichern klicken. Danach sollten Sie eine Nachricht über die erfolgreiche Aktivierung von IPN erhalten.
    14. +
    15. Auf den Register Mein Profil klicken.
    16. +
    17. Unter Sprach-Kodierung > Weitere Einstellungen wählen Sie bitte UTF-8.
    18. +
    19. Sofortige Zahlungsbestätigung klicken.
    20. +
    21. Einstellungen für sofortige Zahlungsbestätigungen wählen klicken.
    22. +
    23. Bei Benachrichtigungs-URL die URL Ihres IPN-Handlers (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalDirect/IPNHandler) eingeben.
    24. +
    25. Speichern klicken. Danach sollten Sie eine Nachricht über die erfolgreiche Aktivierung von IPN erhalten.
    ]]> @@ -294,28 +294,28 @@ Folgen Sie den Schritten, um Ihr Konto für PDT zu konfigurieren:

    1. Loggen Sie sich in Ihr PayPal-Konto ein.
    2. -
    3. Klicken Sie auf den Register Mein Profil.
    4. -
    5. Klicken Sie unter Verkäufer/Händler auf Website-Einstellungen.
    6. -
    7. Aktivieren Sie Automatische Rückleitung.
    8. -
    9. Als Rückleitungs-URL geben Sie bitte die Seite Ihres Shops ein, die die Transaktions-ID von PayPal nach einer Kundenzahlung empfängt (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalStandard/PDTHandler).
    10. -
    11. Aktivieren Sie Übertragung der Zahlungsdaten.
    12. -
    13. Klicken Sie auf Speichern.
    14. -
    15. Klicken Sie unter Verkäufer/Händler auf Website-Einstellungen.
    16. -
    17. Scrollen Sie runter zu Übertragung der Zahlungsdaten, um den PDT-Identitäts-Token einzusehen.
    18. +
    19. Klicken Sie auf den Register Mein Profil.
    20. +
    21. Klicken Sie unter Verkäufer/Händler auf Website-Einstellungen.
    22. +
    23. Aktivieren Sie Automatische Rückleitung.
    24. +
    25. Als Rückleitungs-URL geben Sie bitte die Seite Ihres Shops ein, die die Transaktions-ID von PayPal nach einer Kundenzahlung empfängt (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalStandard/PDTHandler).
    26. +
    27. Aktivieren Sie Übertragung der Zahlungsdaten.
    28. +
    29. Klicken Sie auf Speichern.
    30. +
    31. Klicken Sie unter Verkäufer/Händler auf Website-Einstellungen.
    32. +
    33. Scrollen Sie runter zu Übertragung der Zahlungsdaten, um den PDT-Identitäts-Token einzusehen.

    Es gibt zwei Wege, um IPN-Nachrichten (Instant Payment Notification) zu empfangen (optional):

      -
    1. Unten IPN aktivieren abhaken. Die URL zu Ihrem IPN-Handler wird dann über die Anfrage übermittelt.
    2. +
    3. Unten IPN aktivieren abhaken. Die URL zu Ihrem IPN-Handler wird dann über die Anfrage übermittelt.
    4. Ihr PayPal-Konto für diesen Service konfigurieren. Schritte hierzu:
      1. In Ihr Premier- oder Business-Konto einloggen.
      2. -
      3. Auf den Register Mein Profil klicken.
      4. -
      5. Unter Sprach-Kodierung > Weitere Einstellungen wählen Sie bitte UTF-8.
      6. -
      7. Zurück zu Mein Profil und auf Sofortige Zahlungsbestätigung klicken.
      8. -
      9. Einstellungen für sofortige Zahlungsbestätigungen wählen klicken.
      10. -
      11. Bei Benachrichtigungs-URL die URL Ihres IPN-Handlers (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalStandard/IPNHandler) eingeben.
      12. -
      13. Speichern klicken. Danach sollten Sie eine Nachricht über die erfolgreiche Aktivierung von IPN erhalten.
      14. +
      15. Auf den Register Mein Profil klicken.
      16. +
      17. Unter Sprach-Kodierung > Weitere Einstellungen wählen Sie bitte UTF-8.
      18. +
      19. Zurück zu Mein Profil und auf Sofortige Zahlungsbestätigung klicken.
      20. +
      21. Einstellungen für sofortige Zahlungsbestätigungen wählen klicken.
      22. +
      23. Bei Benachrichtigungs-URL die URL Ihres IPN-Handlers (https://www.yourStore.com/Plugins/SmartStore.PayPal/PayPalStandard/IPNHandler) eingeben.
      24. +
      25. Speichern klicken. Danach sollten Sie eine Nachricht über die erfolgreiche Aktivierung von IPN erhalten.
    ]]> @@ -418,12 +418,12 @@ Die Bezahlung auf Rechnung steht möglicherweise nicht allen Händlern zur Verf

    PayPal PLUS ersetzt die Zahlartenliste im Kassenbereich durch die PayPal Payment Wall. Sie können der Payment Wall jedoch bis zu 10 weitere Offline- bzw. Weiterleitungszahlarten hinzufügen.

    So richten Sie PayPal PLUS ein:

      -
    1. Legen Sie unter My Apps & Credentials eine neue REST API Anwendung an. -Unter Manage your applications finden Sie weitere Informationen zum Thema PayPal Anwendungen (Englisch).
    2. -
    3. Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
    4. -
    5. Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
    6. -
    7. Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.
    8. -

    Um Bilder zu weiteren Zahlarten festzulegen sind im Content-Ordner des betreffenden Plugins Dateien mit folgendem Namensmuster zu hinterlegen: branding.<Plugin-Systemname|Provider-Systemname>.<jpg|jpeg|png|gif>
    Für Vorkasse lautet der Pfad z.B. \Plugins\SmartStore.OfflinePayment\Content\branding.Payments.Prepayment.jpg. Wichtig: Der Shop muss hierfür SSL unterstützen.

    ]]> +
  • Legen Sie unter My Apps & Credentials eine neue REST API Anwendung an. +Unter Manage your applications finden Sie weitere Informationen zum Thema PayPal Anwendungen (Englisch).
  • +
  • Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
  • +
  • Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
  • +
  • Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.
  • +

    Um Bilder zu weiteren Zahlarten festzulegen sind im Content-Ordner des betreffenden Plugins Dateien mit folgendem Namensmuster zu hinterlegen: branding.<Plugin-Systemname|Provider-Systemname>.<jpg|jpeg|png|gif>
    Für Vorkasse lautet der Pfad z.B. \Plugins\SmartStore.OfflinePayment\Content\branding.Payments.Prepayment.jpg. Wichtig: Der Shop muss hierfür SSL unterstützen.

    ]]> @@ -465,11 +465,11 @@ Unter So richten Sie Ratenzahlung Powered by PayPal ein:

      -
    1. Legen Sie unter My Apps & Credentials eine neue REST API Anwendung an. -Unter Manage your applications finden Sie weitere Informationen zum Thema PayPal Anwendungen (Englisch).
    2. -
    3. Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
    4. -
    5. Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
    6. -
    7. Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.
    8. +
    9. Legen Sie unter My Apps & Credentials eine neue REST API Anwendung an. +Unter Manage your applications finden Sie weitere Informationen zum Thema PayPal Anwendungen (Englisch).
    10. +
    11. Klicken Sie auf den Namen der Anwendung und tragen Sie Client-ID und Secret weiter unten auf dieser Seite ein. Speichern.
    12. +
    13. Optional: Klicken Sie unten bei Experience Profil-ID auf Hinzufügen, um ein Profil zu erstellen. Ihre Shop-Daten (Name, Logo etc.) werden Käufern dadurch beim Bezahlen auf den PayPal-Seiten angezeigt.
    14. +
    15. Optional: Klicken Sie unten bei Webhook-ID auf Hinzufügen, um einen Webhook zu erstellen. Über einen Webhook empfängt der Shop PayPal-Mitteilungen und aktualisiert u.U. den Zahlungsstatus Ihrer Aufträge.

    Nach Auftragserteilung dürfen die Auftragssumme und die Auftragspositionen nicht mehr geändert werden!

    ]]>
    @@ -482,6 +482,21 @@ Unter Gesamt inkl. Finanzierungskosten + + Information zu möglichen Raten. + + + Finanzierung gewünscht? + + + Finanzierung ab {0} im Monat + + + Finanzierung ab {0} in {1} monatlichen Raten mit Ratenzahlung Powered by PayPal. + + + Repräsentatives Beispiel gem. § 6a PAngV + Minimaler Finanzierungsbetrag @@ -506,6 +521,12 @@ Unter Legt fest, ob und wie die Ratenzahlung auf der Warenkorbseite beworben werden soll. + + Darlehensgeber + + + Firmenname und -anschrift + last monthly payment is different\lower.*@ @T("Plugins.Payments.PayPalInstalments.TotalPayableAmount"): - @(option.TotalCost.ToString()) + @(option.TotalCost.ToString()) @T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", option.Term): - @(option.MonthlyPayment.ToString()) + @(option.MonthlyPayment.ToString())
    From fd0cc2a8438467acb7186fbba3cea7491395b406 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 19 Jun 2019 15:40:32 +0200 Subject: [PATCH 031/115] PayPal: Further work on instalments provider --- .../SmartStore.PayPal/Content/instalments.png | Bin 17263 -> 6905 bytes .../PayPalInstalmentsController.cs | 49 ++++++++++++--- .../Localization/resources.de-de.xml | 15 +++++ .../Localization/resources.en-us.xml | 15 +++++ src/Plugins/SmartStore.PayPal/Plugin.cs | 6 +- .../Services/PayPalService.Credit.cs | 9 +++ .../SmartStore.PayPal.csproj | 3 + .../Views/PayPalInstalments/Promotion.cshtml | 48 +++++++++++--- .../PayPalInstalments/PromotionDetails.cshtml | 59 ++++++++++++++++++ 9 files changed, 183 insertions(+), 21 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml diff --git a/src/Plugins/SmartStore.PayPal/Content/instalments.png b/src/Plugins/SmartStore.PayPal/Content/instalments.png index d082dfc0a45ec4c7eaf8d32cf3d4c8914f558cbd..6a942f97cddcbc48eb09bab223a04fdc7ff12cba 100644 GIT binary patch literal 6905 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 Rw()lb^4S*XagR!8{SQeE5xM{X literal 17263 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 _paymentService; - private readonly IWidgetProvider _widgetProvider; private readonly IPriceFormatter _priceFormatter; private readonly Lazy _pluginFinder; @@ -45,7 +43,6 @@ public PayPalInstalmentsController( IOrderService orderService, ICurrencyService currencyService, Lazy paymentService, - IWidgetProvider widgetProvider, IPriceFormatter priceFormatter, Lazy pluginFinder) : base(PayPalInstalmentsProvider.SystemName, payPalService) @@ -55,7 +52,6 @@ public PayPalInstalmentsController( _orderService = orderService; _currencyService = currencyService; _paymentService = paymentService; - _widgetProvider = widgetProvider; _priceFormatter = priceFormatter; _pluginFinder = pluginFinder; } @@ -202,14 +198,15 @@ public ActionResult Promotion(bool isProductPage, decimal amount) try { var store = Services.StoreContext.CurrentStore; - var settings = Services.Settings.LoadSetting(store.Id); - var promotion = isProductPage ? settings.ProductPagePromotion : settings.CartPagePromotion; - if (promotion.HasValue && settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(amount)) + if (_pluginFinder.Value.IsPluginReady(Services.Settings, Plugin.SystemName, store.Id)) { - if (_pluginFinder.Value.IsPluginReady(Services.Settings, Plugin.SystemName, store.Id)) + if (_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) { - if (_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) + var settings = Services.Settings.LoadSetting(store.Id); + var promotion = isProductPage ? settings.ProductPagePromotion : settings.CartPagePromotion; + + if (promotion.HasValue && settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(amount)) { var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); var model = PayPalService.GetFinancingOptions(settings, session, promotion.Value, amount); @@ -227,6 +224,40 @@ public ActionResult Promotion(bool isProductPage, decimal amount) return new EmptyResult(); } + // Ajax. + public ActionResult PromotionDetails(decimal amount) + { + try + { + var store = Services.StoreContext.CurrentStore; + + if (!_pluginFinder.Value.IsPluginReady(Services.Settings, Plugin.SystemName, store.Id) || + !_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) + { + return HttpNotFound(); + } + + var settings = Services.Settings.LoadSetting(store.Id); + + if (settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(amount)) + { + var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + var model = PayPalService.GetFinancingOptions(settings, session, PayPalPromotion.FinancingExample, amount); + + return PartialView(model); + } + else + { + return Content("
    {0}
    ".FormatInvariant(T("Plugins.Payments.PayPalInstalments.NoFinancingDetails"))); + } + } + catch (Exception ex) + { + Logger.Error(ex); + return Content("
    {0}
    ".FormatInvariant(ex.ToAllMessages().HtmlEncode())); + } + } + // Widget zones for promotion. //[ChildActionOnly] //public ActionResult Promote() diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index fbd5104431..e4a3b35915 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -497,6 +497,9 @@ Unter
    Repräsentatives Beispiel gem. § 6a PAngV + + Plan {0} + Nettodarlehensbetrag @@ -512,6 +515,18 @@ Unter {0} monatliche Raten in Höhe von + + Zinsbetrag + + + Es liegen keine Finanzierungsdetails vor. + + + Zahlen Sie bequem und einfach in monatlichen Raten. + + + Ihre Ratenzahlung und den passenden Finanzierungsplan können Sie im Rahmen des Bestellprozesses auswählen. Ihr Antrag erfolgt komplett online und wird in wenigen Schritten hier im Shop abgeschlossen. + Minimaler Finanzierungsbetrag diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index eeb4ab91d7..5eeea8736f 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -503,6 +503,9 @@ Go to Representative example according to § 6a PAngV + + Plan {0} + Net loan amount @@ -518,6 +521,18 @@ Go to {0} monthly installments in the amount of + + Interest amount + + + No financing details are available. + + + Pay conveniently and easily in monthly installments. + + + You can select your installment payment and the appropriate financing plan during the ordering process. Your application is processed online and can be completed here in the shop in just a few steps. + Minimum financing amount diff --git a/src/Plugins/SmartStore.PayPal/Plugin.cs b/src/Plugins/SmartStore.PayPal/Plugin.cs index 3af9e07e8e..f89c78aea7 100644 --- a/src/Plugins/SmartStore.PayPal/Plugin.cs +++ b/src/Plugins/SmartStore.PayPal/Plugin.cs @@ -94,7 +94,7 @@ public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, { "area", SystemName } }; - if (widgetZone.IsCaseInsensitiveEqual("productdetails_add_info")) + if (widgetZone == "productdetails_add_info") { var viewModel = model as ProductDetailsModel; if (viewModel != null) @@ -113,7 +113,7 @@ public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, routeValues.Add("amount", price); } } - else if (widgetZone.IsCaseInsensitiveEqual("order_summary_totals_after")) + else if (widgetZone == "order_summary_totals_after") { var viewModel = model as ShoppingCartModel; if (viewModel != null && viewModel.IsEditable) @@ -129,7 +129,7 @@ public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, routeValues.Add("amount", subTotalWithDiscountBase); } } - else if (widgetZone.IsCaseInsensitiveEqual("orderdetails_page_aftertotal") || widgetZone.IsCaseInsensitiveEqual("invoice_aftertotal")) + else if (widgetZone == "orderdetails_page_aftertotal" || widgetZone == "invoice_aftertotal") { var viewModel = model as OrderDetailsModel; if (viewModel != null) diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs index 9099a4e4d2..7d1af52a66 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs @@ -27,6 +27,7 @@ public FinancingOptions GetFinancingOptions(PayPalInstalmentsSettings settings, var response = EnsureAccessToken(session, settings); if (response.Success) { + var index = 0; var dc = decimal.Zero; var data = new Dictionary(); var transactionAmount = new Dictionary(); @@ -64,6 +65,13 @@ public FinancingOptions GetFinancingOptions(PayPalInstalmentsSettings settings, result.Qualified.Add(option); } + + result.Qualified = result.Qualified + .OrderBy(x => x.Term) + .ThenBy(x => x.MonthlyPayment.Amount) + .ToList(); + + result.Qualified.Each(x => x.Index = ++index); } } } @@ -87,6 +95,7 @@ public FinancingOptions() public class Option { + public int Index { get; set; } public decimal AnnualPercentageRate { get; set; } public decimal NominalRate { get; set; } public int Term { get; set; } diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 75533ba9ca..f71ab1b240 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -337,6 +337,9 @@ PreserveNewest + + PreserveNewest + Designer diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml index 1df520450b..1576f31362 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml @@ -1,4 +1,5 @@ -@using SmartStore.PayPal.Services; +@using SmartStore.PayPal; +@using SmartStore.PayPal.Services; @model FinancingOptions @{ var option = Model.Qualified.FirstOrDefault(x => x.MonthlyPayment.Amount > decimal.Zero && x.AnnualPercentageRate == decimal.Zero); @@ -8,40 +9,41 @@ option = Model.Qualified .Where(x => x.MonthlyPayment.Amount > decimal.Zero) .OrderByDescending(x => x.AnnualPercentageRate) - .ThenBy(x => x.MonthlyPayment.Amount).FirstOrDefault(); + .ThenBy(x => x.MonthlyPayment.Amount) + .FirstOrDefault(); } }
    @if (Model.Promotion == PayPalPromotion.FinancingExample && option != null && option.AnnualPercentageRate > decimal.Zero) {
    -
    @T("Plugins.Payments.PayPalInstalments.FinancingPerXMonth", option.MonthlyPayment.ToString(), option.Term)
    +
    @T("Plugins.Payments.PayPalInstalments.FinancingPerXMonth", option.MonthlyPayment.ToString(), option.Term)
    @T("Plugins.Payments.PayPalInstalments.FinancingExampleIntro"):
    @*German: Darlehehnsbetrag.*@ - + @*German: Nominalzins. Is the same as Sollzins.*@ - + @*German: Effektivzins.*@ - + @*MonthlyPayment * Term != TotalCost --> last monthly payment is different\lower.*@ - + - +
    @T("Plugins.Payments.PayPalInstalments.NetLoanAmount"):@(Model.NetLoanAmount.ToString())@(Model.NetLoanAmount.ToString())
    @T("Plugins.Payments.PayPalInstalments.FixedNominalRate"):@(Math.Round(option.NominalRate, 2).ToString("0.00")) %@(Math.Round(option.NominalRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.AnnualPercentageRate"):@(Math.Round(option.AnnualPercentageRate, 2).ToString("0.00")) %@(Math.Round(option.AnnualPercentageRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.TotalPayableAmount"):@(option.TotalCost.ToString())@(option.TotalCost.ToString())
    @T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", option.Term):@(option.MonthlyPayment.ToString())@(option.MonthlyPayment.ToString())
    @@ -73,12 +75,40 @@ }
    +@{ + using (Html.BeginZoneContent("end", key: "pp-instalments-promotion-modal")) + { + Html.SmartStore().Window() + .Name("paypal-promotion-modal") + .Size(WindowSize.FlexSmall) + .RenderAtPageEnd(true) + .FooterContent(@) + .Render(); + } +} + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml new file mode 100644 index 0000000000..ad5f074943 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml @@ -0,0 +1,59 @@ +@using SmartStore.PayPal.Services; +@model FinancingOptions +@{ + var defaultOptionIndex = Model.Qualified + .Where(x => x.MonthlyPayment.Amount > decimal.Zero) + .OrderByDescending(x => x.AnnualPercentageRate) + .ThenBy(x => x.MonthlyPayment.Amount) + .Select(x => x.Index) + .FirstOrDefault(); +} +
    +
    + @T( +
    +
    @T("Plugins.Payments.PayPalInstalments.FinancingDetailsTitle")
    +
    @Html.Raw(T("Plugins.Payments.PayPalInstalments.FinancingDetailsIntro"))
    +
    @T("Plugins.Payments.PayPalInstalments.NetLoanAmount"): @Model.NetLoanAmount.ToString()
    +
    + @foreach (var option in Model.Qualified) + { +
    +
    + @(T("Plugins.Payments.PayPalInstalments.PlanX", option.Index)) @(option.Index == defaultOptionIndex ? " *" : "") +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    @T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", option.Term):@(option.MonthlyPayment.ToString())
    @T("Plugins.Payments.PayPalInstalments.FixedNominalRate"):@(Math.Round(option.NominalRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.AnnualPercentageRate"):@(Math.Round(option.AnnualPercentageRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.InterestAmount"):@(option.TotalInterest.ToString())
    @T("Plugins.Payments.PayPalInstalments.TotalPayableAmount"):@(option.TotalCost.ToString())
    +
    +
    + } +
    +
    +
    * @T("Plugins.Payments.PayPalInstalments.FinancingExampleIntro").
    +
    @T("Plugins.Payments.PayPalInstalments.Lender"): @Html.Raw(Model.Lender)
    +
    +
    +
    +
    \ No newline at end of file From 130b95b02e7e6808437338fb34b8ee62af2d38c5 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Thu, 20 Jun 2019 03:40:50 +0200 Subject: [PATCH 032/115] ExtraRobotsDisallows saved as comma joined string (must be NewLine) --- .../TypeConversion/EnumerableConverter.cs | 2 +- .../Extensions/StringExtensions.cs | 27 +++++++++---------- .../Controllers/SettingController.cs | 2 ++ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/Libraries/SmartStore.Core/ComponentModel/TypeConversion/EnumerableConverter.cs b/src/Libraries/SmartStore.Core/ComponentModel/TypeConversion/EnumerableConverter.cs index 5687317362..ae60b58488 100644 --- a/src/Libraries/SmartStore.Core/ComponentModel/TypeConversion/EnumerableConverter.cs +++ b/src/Libraries/SmartStore.Core/ComponentModel/TypeConversion/EnumerableConverter.cs @@ -125,7 +125,7 @@ public override object ConvertTo(CultureInfo culture, string format, object valu if (value is IEnumerable enumerable) { - // we don't use string.Join() because it doesn't support invariant culture + // We don't use string.Join() because it doesn't support invariant culture foreach (var token in enumerable) { var str = _elementTypeConverter.ConvertTo(culture, format, token, typeof(string)); diff --git a/src/Libraries/SmartStore.Core/Extensions/StringExtensions.cs b/src/Libraries/SmartStore.Core/Extensions/StringExtensions.cs index 9258d0b49b..211fb926af 100644 --- a/src/Libraries/SmartStore.Core/Extensions/StringExtensions.cs +++ b/src/Libraries/SmartStore.Core/Extensions/StringExtensions.cs @@ -611,30 +611,29 @@ public static string[] SplitSafe(this string value, string separator) if (string.IsNullOrEmpty(value)) return new string[0]; - // do not use separator.IsEmpty() here because whitespace like " " is a valid separator. + // Do not use separator.IsEmpty() here because whitespace like " " is a valid separator. // an empty separator "" returns array with value. if (separator == null) { - separator = "|"; - - if (value.IndexOf(separator) < 0) + for (var i = 0; i < value.Length; i++) { - if (value.IndexOf(';') > -1) - { - separator = ";"; - } - else if (value.IndexOf(',') > -1) + var c = value[i]; + if (c == ';' || c == ',' || c == '|') { - separator = ","; + return value.Split(new char[] { c }, StringSplitOptions.RemoveEmptyEntries); } - else if (value.IndexOf(Environment.NewLine) > -1) + if (c == '\r' && (i + 1) < value.Length & value[i + 1] == '\n') { - separator = Environment.NewLine; + return value.GetLines(false, true).ToArray(); } } - } - return value.Split(new string[] { separator }, StringSplitOptions.RemoveEmptyEntries); + return new string[] { value }; + } + else + { + return value.Split(new string[] { separator }, StringSplitOptions.RemoveEmptyEntries); + } } /// Splits a string into two strings diff --git a/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs b/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs index 9476514a76..521c96998a 100644 --- a/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs +++ b/src/Presentation/SmartStore.Web/Administration/Controllers/SettingController.cs @@ -1056,6 +1056,8 @@ public ActionResult GeneralCommon() // SEO. var seoSettings = _services.Settings.LoadSetting(storeScope); MiniMapper.Map(seoSettings, model.SeoSettings); + // Fix Disallows joined with comma in MiniMapper (we need NewLine). + model.SeoSettings.ExtraRobotsDisallows = string.Join(Environment.NewLine, seoSettings.ExtraRobotsDisallows); StoreDependingSettings.GetOverrideKeys(seoSettings, model.SeoSettings, storeScope, _services.Settings, false); From b285f0c588b36c41edde4f6c5f34242548b09824 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Fri, 21 Jun 2019 11:04:00 +0200 Subject: [PATCH 033/115] PayPal: Further work on instalments provider --- .../PayPalInstalmentsController.cs | 37 +++-- .../Localization/resources.de-de.xml | 16 ++- .../Localization/resources.en-us.xml | 16 ++- .../PayPalInstalmentsConfigModel.cs | 4 + src/Plugins/SmartStore.PayPal/Plugin.cs | 31 ++-- .../Services/IPayPalService.cs | 7 +- .../Services/PayPalService.Credit.cs | 136 +++++++++++++++--- .../Settings/PayPalInstalmentsSettings.cs | 1 + .../SmartStore.PayPal.csproj | 5 +- .../Views/PayPalInstalments/Configure.cshtml | 10 ++ .../PayPalInstalments/PaymentInfo.cshtml | 23 +-- .../Promotion.Content.cshtml | 101 +++++++++++++ .../Views/PayPalInstalments/Promotion.cshtml | 119 +-------------- ...onDetails.cshtml => PromotionPopup.cshtml} | 18 ++- 14 files changed, 325 insertions(+), 199 deletions(-) create mode 100644 src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.Content.cshtml rename src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/{PromotionDetails.cshtml => PromotionPopup.cshtml} (85%) diff --git a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs index 05ad9c36b5..d0c49d547c 100644 --- a/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs +++ b/src/Plugins/SmartStore.PayPal/Controllers/PayPalInstalmentsController.cs @@ -73,7 +73,21 @@ public override ProcessPaymentRequest GetPaymentInfo(FormCollection form) public ActionResult PaymentInfo() { - return PartialView(); + FinancingOptions model = null; + + try + { + var store = Services.StoreContext.CurrentStore; + var settings = Services.Settings.LoadSetting(store.Id); + var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + model = PayPalService.GetFinancingOptions(settings, session, "paymentinfo", decimal.Zero); + } + catch (Exception ex) + { + Logger.Error(ex); + } + + return PartialView(model ?? new FinancingOptions("paymentinfo")); } // Widget zone on checkout confirm page. @@ -193,7 +207,7 @@ public ActionResult CheckoutCancel() // Widget zone on product detail or cart page. [ChildActionOnly] - public ActionResult Promotion(bool isProductPage, decimal amount) + public ActionResult Promotion(string origin, decimal amount) { try { @@ -204,13 +218,11 @@ public ActionResult Promotion(bool isProductPage, decimal amount) if (_paymentService.Value.IsPaymentMethodActive(PayPalInstalmentsProvider.SystemName, store.Id)) { var settings = Services.Settings.LoadSetting(store.Id); - var promotion = isProductPage ? settings.ProductPagePromotion : settings.CartPagePromotion; + var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + var model = PayPalService.GetFinancingOptions(settings, session, origin, amount); - if (promotion.HasValue && settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(amount)) + if (model != null) { - var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); - var model = PayPalService.GetFinancingOptions(settings, session, promotion.Value, amount); - return PartialView(model); } } @@ -225,7 +237,7 @@ public ActionResult Promotion(bool isProductPage, decimal amount) } // Ajax. - public ActionResult PromotionDetails(decimal amount) + public ActionResult PromotionPopup(string origin, decimal amount) { try { @@ -238,12 +250,11 @@ public ActionResult PromotionDetails(decimal amount) } var settings = Services.Settings.LoadSetting(store.Id); + var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); + var model = PayPalService.GetFinancingOptions(settings, session, origin, amount, PayPalPromotion.FinancingExample); - if (settings.ClientId.HasValue() && settings.Secret.HasValue() && settings.IsAmountFinanceable(amount)) + if (model != null) { - var session = _httpContext.GetPayPalState(PayPalInstalmentsProvider.SystemName); - var model = PayPalService.GetFinancingOptions(settings, session, PayPalPromotion.FinancingExample, amount); - return PartialView(model); } else @@ -284,6 +295,8 @@ public ActionResult Configure(PayPalInstalmentsSettings settings, int storeScope ? settings.CartPagePromotion.Value.ToSelectList(true).ToList() : PayPalPromotion.FinancingExample.ToSelectList(false).ToList(); + model.PaymentListPromotions = PayPalPromotion.FinancingExample.ToSelectList(false).ToList(); + PrepareConfigurationModel(model, storeScope); if (model.Lender == null) diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index e4a3b35915..c66e527599 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -492,9 +492,9 @@ Unter
    Finanzierung ab {0} im Monat. - Finanzierung ab {0} in {1} monatlichen Raten mit Ratenzahlung Powered by PayPal. + Finanzierung ab {0} in {1} monatlichen Raten. - + Repräsentatives Beispiel gem. § 6a PAngV @@ -521,11 +521,11 @@ Unter Es liegen keine Finanzierungsdetails vor. - + Zahlen Sie bequem und einfach in monatlichen Raten. - - Ihre Ratenzahlung und den passenden Finanzierungsplan können Sie im Rahmen des Bestellprozesses auswählen. Ihr Antrag erfolgt komplett online und wird in wenigen Schritten hier im Shop abgeschlossen. + + Ihre Ratenzahlung und den passenden Finanzierungsplan können Sie im Rahmen des Bestellprozesses auswählen. Ihr Antrag erfolgt komplett online über Ratenzahlung Powered by PayPal und wird in wenigen Schritten hier im Shop abgeschlossen. Minimaler Finanzierungsbetrag @@ -551,6 +551,12 @@ Unter Legt fest, ob und wie die Ratenzahlung auf der Warenkorbseite beworben werden soll. + + Bei der Zahlartenauswahl + + + Legt fest, ob und wie die Ratenzahlung bei der Zahlartenauswahl beworben werden soll. + Darlehensgeber diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index 5eeea8736f..a3939ee059 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -498,9 +498,9 @@ Go to Financing from {0} per month. - Financing from {0} in {1} monthly installments with payment in installments powered by PayPal. + Financing from {0} in {1} monthly installments. - + Representative example according to § 6a PAngV @@ -527,11 +527,11 @@ Go to No financing details are available. - + Pay conveniently and easily in monthly installments. - - You can select your installment payment and the appropriate financing plan during the ordering process. Your application is processed online and can be completed here in the shop in just a few steps. + + You can select your installment payment and the appropriate financing plan during the ordering process. Your application is processed online via Ratenzahlung Powered by PayPal and can be completed here in the shop in just a few steps. Minimum financing amount @@ -557,6 +557,12 @@ Go to Specifies whether and how to promote payment in installments on the cart page. + + When selecting payment methods + + + Specifies whether and how to promote when selecting payment methods. + Lender diff --git a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs index 7fb65a0e82..aa10dac96c 100644 --- a/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs +++ b/src/Plugins/SmartStore.PayPal/Models/Congfiguration/PayPalInstalmentsConfigModel.cs @@ -27,6 +27,10 @@ public PayPalInstalmentsConfigModel() public PayPalPromotion? CartPagePromotion { get; set; } public IList CartPagePromotions { get; set; } + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.PaymentListPromotion")] + public PayPalPromotion? PaymentListPromotion { get; set; } + public IList PaymentListPromotions { get; set; } + [SmartResourceDisplayName("Plugins.Payments.PayPalInstalments.Lender")] public string Lender { get; set; } diff --git a/src/Plugins/SmartStore.PayPal/Plugin.cs b/src/Plugins/SmartStore.PayPal/Plugin.cs index f89c78aea7..d9ed50b677 100644 --- a/src/Plugins/SmartStore.PayPal/Plugin.cs +++ b/src/Plugins/SmartStore.PayPal/Plugin.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Web.Routing; -using SmartStore.Core.Domain.Orders; using SmartStore.Core.Logging; using SmartStore.Core.Plugins; using SmartStore.PayPal.Providers; @@ -9,9 +8,7 @@ using SmartStore.PayPal.Settings; using SmartStore.Services; using SmartStore.Services.Cms; -using SmartStore.Services.Customers; using SmartStore.Services.Directory; -using SmartStore.Services.Orders; using SmartStore.Web.Models.Catalog; using SmartStore.Web.Models.Order; using SmartStore.Web.Models.ShoppingCart; @@ -24,18 +21,15 @@ public class Plugin : BasePlugin, IWidget { private readonly ICommonServices _services; private readonly Lazy _payPalService; - private readonly Lazy _orderTotalCalculationService; private readonly Lazy _currencyService; public Plugin( ICommonServices services, Lazy payPalService, - Lazy orderTotalCalculationService, Lazy currencyService) { _services = services; _payPalService = payPalService; - _orderTotalCalculationService = orderTotalCalculationService; _currencyService = currencyService; Logger = NullLogger.Instance; @@ -99,18 +93,21 @@ public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, var viewModel = model as ProductDetailsModel; if (viewModel != null) { - actionName = "Promotion"; - controllerName = "PayPalInstalments"; - var price = viewModel.ProductPrice.PriceWithDiscountValue > decimal.Zero ? viewModel.ProductPrice.PriceWithDiscountValue : viewModel.ProductPrice.PriceValue; - // Convert price because it is in working currency. - price = _currencyService.Value.ConvertToPrimaryStoreCurrency(price, _services.WorkContext.WorkingCurrency); + if (price > decimal.Zero) + { + actionName = "Promotion"; + controllerName = "PayPalInstalments"; + + // Convert price because it is in working currency. + price = _currencyService.Value.ConvertToPrimaryStoreCurrency(price, _services.WorkContext.WorkingCurrency); - routeValues.Add("isProductPage", true); - routeValues.Add("amount", price); + routeValues.Add("origin", "productpage"); + routeValues.Add("amount", price); + } } } else if (widgetZone == "order_summary_totals_after") @@ -121,12 +118,8 @@ public void GetDisplayWidgetRoute(string widgetZone, object model, int storeId, actionName = "Promotion"; controllerName = "PayPalInstalments"; - var cart = _services.WorkContext.CurrentCustomer.GetCartItems(ShoppingCartType.ShoppingCart, _services.StoreContext.CurrentStore.Id); - - _orderTotalCalculationService.Value.GetShoppingCartSubTotal(cart, out _, out _, out _, out var subTotalWithDiscountBase); - - routeValues.Add("isProductPage", false); - routeValues.Add("amount", subTotalWithDiscountBase); + routeValues.Add("origin", "cart"); + routeValues.Add("amount", decimal.Zero); } } else if (widgetZone == "orderdetails_page_aftertotal" || widgetZone == "invoice_aftertotal") diff --git a/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs b/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs index 873f263671..7806355648 100644 --- a/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs +++ b/src/Plugins/SmartStore.PayPal/Services/IPayPalService.cs @@ -66,7 +66,12 @@ HttpStatusCode ProcessWebhook( #region Credit - FinancingOptions GetFinancingOptions(PayPalInstalmentsSettings settings, PayPalSessionData session, PayPalPromotion promotion, decimal amount); + FinancingOptions GetFinancingOptions( + PayPalInstalmentsSettings settings, + PayPalSessionData session, + string origin, + decimal amount, + PayPalPromotion? promotion = null); #endregion } diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs index 7d1af52a66..7b0ea840b7 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs @@ -1,22 +1,78 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using Newtonsoft.Json; +using SmartStore.Core.Domain.Orders; using SmartStore.PayPal.Settings; +using SmartStore.Services.Customers; namespace SmartStore.PayPal.Services { public partial class PayPalService { - public FinancingOptions GetFinancingOptions(PayPalInstalmentsSettings settings, PayPalSessionData session, PayPalPromotion promotion, decimal amount) + public FinancingOptions GetFinancingOptions( + PayPalInstalmentsSettings settings, + PayPalSessionData session, + string origin, + decimal amount, + PayPalPromotion? promotion = null) { - var result = new FinancingOptions + Guard.NotNull(settings, nameof(settings)); + Guard.NotNull(session, nameof(session)); + Guard.NotEmpty(origin, nameof(origin)); + + var store = _services.StoreContext.CurrentStore; + + // Get promotion type. + if (!promotion.HasValue) + { + switch (origin) + { + case "productpage": + promotion = settings.ProductPagePromotion; + break; + case "cart": + promotion = settings.CartPagePromotion; + break; + case "paymentinfo": + promotion = settings.PaymentListPromotion; + break; + } + } + + if (!promotion.HasValue || settings.ClientId.IsEmpty() || settings.Secret.IsEmpty()) + { + return null; + } + + // Get financing amount. + if (origin == "cart" || origin == "paymentinfo") + { + var cart = _services.WorkContext.CurrentCustomer.GetCartItems(ShoppingCartType.ShoppingCart, store.Id); + decimal? cartTotal = _orderTotalCalculationService.GetShoppingCartTotal(cart, usePaymentMethodAdditionalFee: false); + if (!cartTotal.HasValue) + { + _orderTotalCalculationService.GetShoppingCartSubTotal(cart, out _, out _, out _, out amount); + } + else + { + amount = cartTotal.Value; + } + } + + if (!settings.IsAmountFinanceable(amount)) + { + return null; + } + + // Get financing options from API. + var result = new FinancingOptions(origin) { Promotion = promotion, Lender = settings.Lender }; - var store = _services.StoreContext.CurrentStore; var sourceCurrency = store.PrimaryStoreCurrency; var targetCurrency = _services.WorkContext.WorkingCurrency; @@ -40,30 +96,32 @@ public FinancingOptions GetFinancingOptions(PayPalInstalmentsSettings settings, response = CallApi("POST", "/v1/credit/calculated-financing-options", settings, session, JsonConvert.SerializeObject(data)); - ((string)response.Json.ToString()).Dump(); - if (response.Success && response.Json.financing_options != null) { foreach (var fo in response.Json.financing_options[0].qualifying_financing_options) { var option = new FinancingOptions.Option(); - if (decimal.TryParse(((string)fo.credit_financing.apr).EmptyNull(), NumberStyles.Number, CultureInfo.InvariantCulture, out dc)) - { - option.AnnualPercentageRate = dc; - } - if (decimal.TryParse(((string)fo.credit_financing.nominal_rate).EmptyNull(), NumberStyles.Number, CultureInfo.InvariantCulture, out dc)) - { - option.NominalRate = dc; - } - - option.Term = ((string)fo.credit_financing.term).ToInt(); - option.MinAmount = Parse((string)fo.min_amount.value, sourceCurrency, targetCurrency, store); option.MonthlyPayment = Parse((string)fo.monthly_payment.value, sourceCurrency, targetCurrency, store); - option.TotalInterest = Parse((string)fo.total_interest.value, sourceCurrency, targetCurrency, store); - option.TotalCost = Parse((string)fo.total_cost.value, sourceCurrency, targetCurrency, store); - result.Qualified.Add(option); + if (option.MonthlyPayment.Amount > decimal.Zero) + { + if (decimal.TryParse(((string)fo.credit_financing.apr).EmptyNull(), NumberStyles.Number, CultureInfo.InvariantCulture, out dc)) + { + option.AnnualPercentageRate = dc; + } + if (decimal.TryParse(((string)fo.credit_financing.nominal_rate).EmptyNull(), NumberStyles.Number, CultureInfo.InvariantCulture, out dc)) + { + option.NominalRate = dc; + } + + option.Term = ((string)fo.credit_financing.term).ToInt(); + option.MinAmount = Parse((string)fo.min_amount.value, sourceCurrency, targetCurrency, store); + option.TotalInterest = Parse((string)fo.total_interest.value, sourceCurrency, targetCurrency, store); + option.TotalCost = Parse((string)fo.total_cost.value, sourceCurrency, targetCurrency, store); + + result.Qualified.Add(option); + } } result.Qualified = result.Qualified @@ -83,15 +141,47 @@ public FinancingOptions GetFinancingOptions(PayPalInstalmentsSettings settings, public class FinancingOptions { - public FinancingOptions() + public FinancingOptions(string origin) { + Origin = origin; Qualified = new List
    -
    - +@using SmartStore.PayPal.Services; +@model FinancingOptions +@if (Model.Promotion.HasValue) +{ +
    + @{ Html.RenderPartial("Promotion.Content"); }
    +} +else +{
    + @T(
    -
    - @Html.Raw(T("Plugins.Payments.PayPalInstalments.PaymentInfo")) -
    + @Html.Raw(T("Plugins.Payments.PayPalInstalments.PaymentInfo"))
    -
    \ No newline at end of file +} \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.Content.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.Content.cshtml new file mode 100644 index 0000000000..e350ab0a68 --- /dev/null +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.Content.cshtml @@ -0,0 +1,101 @@ +@using SmartStore.PayPal; +@using SmartStore.PayPal.Services; +@model FinancingOptions +@{ + var defaultOption = Model.GetDefaultOption(); +} +
    +@T( +
    +@if (Model.Promotion == PayPalPromotion.FinancingExample && defaultOption != null && defaultOption.AnnualPercentageRate > decimal.Zero) +{ +
    + @T("Plugins.Payments.PayPalInstalments.FinancingPerXMonth", defaultOption.MonthlyPayment.ToString(), defaultOption.Term) +
    +
    + @T("Plugins.Payments.PayPalInstalments.RepresentativeExample"): +
    +
    + + + @*German: Darlehehnsbetrag.*@ + + + + + @*German: Nominalzins. Is the same as Sollzins.*@ + + + + + @*German: Effektivzins.*@ + + + + + @*MonthlyPayment * Term != TotalCost --> last monthly payment is different\lower.*@ + + + + + + + +
    @T("Plugins.Payments.PayPalInstalments.NetLoanAmount"):@(Model.NetLoanAmount.ToString())
    @T("Plugins.Payments.PayPalInstalments.FixedNominalRate"):@(Math.Round(defaultOption.NominalRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.AnnualPercentageRate"):@(Math.Round(defaultOption.AnnualPercentageRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.TotalPayableAmount"):@(defaultOption.TotalCost.ToString())
    @T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", defaultOption.Term):@(defaultOption.MonthlyPayment.ToString())
    +
    +
    @T("Plugins.Payments.PayPalInstalments.Lender"): @Html.Raw(Model.Lender)
    +} +else +{ +
    + @if (defaultOption != null) + { + @T("Plugins.Payments.PayPalInstalments.FinancingPerMonth", defaultOption.MonthlyPayment.ToString()) + } + else + { + @T("Plugins.Payments.PayPalInstalments.FinancingWanted") + } +
    +} +
    + +@{ + using (Html.BeginZoneContent("end", key: "pp-instalments-promotion-modal")) + { + Html.SmartStore().Window() + .Name("paypal-promotion-modal") + .Size(WindowSize.FlexSmall) + .RenderAtPageEnd(true) + .FooterContent(@) + .Render(); + } +} + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml index 1576f31362..ab7d6645c1 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/Promotion.cshtml @@ -1,114 +1,7 @@ -@using SmartStore.PayPal; -@using SmartStore.PayPal.Services; +@using SmartStore.PayPal.Services; @model FinancingOptions -@{ - var option = Model.Qualified.FirstOrDefault(x => x.MonthlyPayment.Amount > decimal.Zero && x.AnnualPercentageRate == decimal.Zero); - - if (option == null) - { - option = Model.Qualified - .Where(x => x.MonthlyPayment.Amount > decimal.Zero) - .OrderByDescending(x => x.AnnualPercentageRate) - .ThenBy(x => x.MonthlyPayment.Amount) - .FirstOrDefault(); - } -} -
    - @if (Model.Promotion == PayPalPromotion.FinancingExample && option != null && option.AnnualPercentageRate > decimal.Zero) - { -
    -
    @T("Plugins.Payments.PayPalInstalments.FinancingPerXMonth", option.MonthlyPayment.ToString(), option.Term)
    -
    @T("Plugins.Payments.PayPalInstalments.FinancingExampleIntro"):
    -
    - - - @*German: Darlehehnsbetrag.*@ - - - - - @*German: Nominalzins. Is the same as Sollzins.*@ - - - - - @*German: Effektivzins.*@ - - - - - @*MonthlyPayment * Term != TotalCost --> last monthly payment is different\lower.*@ - - - - - - - -
    @T("Plugins.Payments.PayPalInstalments.NetLoanAmount"):@(Model.NetLoanAmount.ToString())
    @T("Plugins.Payments.PayPalInstalments.FixedNominalRate"):@(Math.Round(option.NominalRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.AnnualPercentageRate"):@(Math.Round(option.AnnualPercentageRate, 2).ToString("0.00")) %
    @T("Plugins.Payments.PayPalInstalments.TotalPayableAmount"):@(option.TotalCost.ToString())
    @T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", option.Term):@(option.MonthlyPayment.ToString())
    -
    -
    @T("Plugins.Payments.PayPalInstalments.Lender"): @Html.Raw(Model.Lender)
    - -
    - } - else - { -
    - @T( -
    -
    -
    - @if (option != null) - { - @T("Plugins.Payments.PayPalInstalments.FinancingPerMonth", option.MonthlyPayment.ToString()) - } - else - { - @T("Plugins.Payments.PayPalInstalments.FinancingWanted") - } -
    - -
    - } -
    - -@{ - using (Html.BeginZoneContent("end", key: "pp-instalments-promotion-modal")) - { - Html.SmartStore().Window() - .Name("paypal-promotion-modal") - .Size(WindowSize.FlexSmall) - .RenderAtPageEnd(true) - .FooterContent(@) - .Render(); - } -} - - \ No newline at end of file +
    +
    + @{ Html.RenderPartial("Promotion.Content"); } +
    +
    \ No newline at end of file diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml similarity index 85% rename from src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml rename to src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml index ad5f074943..46b81f871d 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionDetails.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml @@ -1,27 +1,22 @@ @using SmartStore.PayPal.Services; @model FinancingOptions @{ - var defaultOptionIndex = Model.Qualified - .Where(x => x.MonthlyPayment.Amount > decimal.Zero) - .OrderByDescending(x => x.AnnualPercentageRate) - .ThenBy(x => x.MonthlyPayment.Amount) - .Select(x => x.Index) - .FirstOrDefault(); + var defaultOption = Model.GetDefaultOption(false); }
    @T(
    -
    @T("Plugins.Payments.PayPalInstalments.FinancingDetailsTitle")
    -
    @Html.Raw(T("Plugins.Payments.PayPalInstalments.FinancingDetailsIntro"))
    +
    @T("Plugins.Payments.PayPalInstalments.PromotionDetailsTitle")
    +
    @Html.Raw(T("Plugins.Payments.PayPalInstalments.PromotionDetailsIntro"))
    @T("Plugins.Payments.PayPalInstalments.NetLoanAmount"): @Model.NetLoanAmount.ToString()
    @foreach (var option in Model.Qualified) {
    - @(T("Plugins.Payments.PayPalInstalments.PlanX", option.Index)) @(option.Index == defaultOptionIndex ? " *" : "") + @(T("Plugins.Payments.PayPalInstalments.PlanX", option.Index)) @(defaultOption != null && defaultOption.Index == option.Index ? " *" : "")
    @@ -51,7 +46,10 @@ }
    -
    * @T("Plugins.Payments.PayPalInstalments.FinancingExampleIntro").
    + @if (defaultOption != null) + { +
    * @T("Plugins.Payments.PayPalInstalments.RepresentativeExample").
    + }
    @T("Plugins.Payments.PayPalInstalments.Lender"): @Html.Raw(Model.Lender)
    From cecaf4b942175f838fd3102fedf8a01a6c179e2c Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Fri, 21 Jun 2019 12:00:16 +0200 Subject: [PATCH 034/115] Money: prevent stack overflow in IEquatable implementation --- src/Libraries/SmartStore.Core/Money.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Libraries/SmartStore.Core/Money.cs b/src/Libraries/SmartStore.Core/Money.cs index e4bdf4a24f..33244b92ef 100644 --- a/src/Libraries/SmartStore.Core/Money.cs +++ b/src/Libraries/SmartStore.Core/Money.cs @@ -135,8 +135,14 @@ int IComparable.CompareTo(object obj) public override bool Equals(object obj) { - return Equals(obj as Money); - } + // Prevent stack overflow. + if (obj != null) + { + return Equals(obj as Money); + } + + return false; + } bool IEquatable.Equals(Money other) { From c22abea88f27ee3d184916ebcfcc23676fc99662 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Fri, 21 Jun 2019 14:17:12 +0200 Subject: [PATCH 035/115] PayPal: Further work on instalments provider --- .../Localization/resources.de-de.xml | 5 ++++- .../Localization/resources.en-us.xml | 3 +++ .../Services/PayPalService.Credit.cs | 11 +++++++++++ .../Views/PayPalInstalments/PromotionPopup.cshtml | 9 ++++++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml index c66e527599..0e4c377084 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.de-de.xml @@ -513,7 +513,10 @@ Unter Zu zahlender Gesamtbetrag - {0} monatliche Raten in Höhe von + {0} monatliche Raten zu je + + + letzte Rate zu Zinsbetrag diff --git a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml index a3939ee059..0ae7584597 100644 --- a/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml +++ b/src/Plugins/SmartStore.PayPal/Localization/resources.en-us.xml @@ -521,6 +521,9 @@ Go to {0} monthly installments in the amount of + + last installment of + Interest amount diff --git a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs index 7b0ea840b7..26159e7bff 100644 --- a/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs +++ b/src/Plugins/SmartStore.PayPal/Services/PayPalService.Credit.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.Linq; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using SmartStore.Core.Domain.Orders; using SmartStore.PayPal.Settings; using SmartStore.Services.Customers; @@ -120,6 +121,15 @@ public FinancingOptions GetFinancingOptions( option.TotalInterest = Parse((string)fo.total_interest.value, sourceCurrency, targetCurrency, store); option.TotalCost = Parse((string)fo.total_cost.value, sourceCurrency, targetCurrency, store); + var instalments = fo.estimated_installments as JArray; + var lastInstalment = instalments?.LastOrDefault()?.SelectToken("total_payment.value")?.ToString(); + option.LastInstalment = Parse(lastInstalment, sourceCurrency, targetCurrency, store); + + if (option.LastInstalment.Amount == decimal.Zero) + { + option.LastInstalment = new Money(option.MonthlyPayment.Amount, targetCurrency); + } + result.Qualified.Add(option); } } @@ -191,6 +201,7 @@ public class Option public int Term { get; set; } public Money MinAmount { get; set; } public Money MonthlyPayment { get; set; } + public Money LastInstalment { get; set; } public Money TotalInterest { get; set; } public Money TotalCost { get; set; } diff --git a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml index 46b81f871d..3aa45f390d 100644 --- a/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml +++ b/src/Plugins/SmartStore.PayPal/Views/PayPalInstalments/PromotionPopup.cshtml @@ -21,9 +21,16 @@
    - + + @if (option.MonthlyPayment.Amount != option.LastInstalment.Amount) + { + + + + + } From db82ed8e295026a74d493501ddf161148e51b34d Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Mon, 24 Jun 2019 13:30:31 +0200 Subject: [PATCH 036/115] Avoids the permanent generation of random numbers in category navigation --- .../UI/Menus/Providers/CatalogMenuItemProvider.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Presentation/SmartStore.Web.Framework/UI/Menus/Providers/CatalogMenuItemProvider.cs b/src/Presentation/SmartStore.Web.Framework/UI/Menus/Providers/CatalogMenuItemProvider.cs index dfc8526743..e611511664 100644 --- a/src/Presentation/SmartStore.Web.Framework/UI/Menus/Providers/CatalogMenuItemProvider.cs +++ b/src/Presentation/SmartStore.Web.Framework/UI/Menus/Providers/CatalogMenuItemProvider.cs @@ -8,6 +8,7 @@ using SmartStore.Services.Localization; using SmartStore.Services.Media; using SmartStore.Services.Seo; +using SmartStore.Utilities; namespace SmartStore.Web.Framework.UI { @@ -47,6 +48,7 @@ public override TreeNode Append(MenuItemProviderRequest request) var tree = _categoryService.GetCategoryTree(0, false, _services.StoreContext.CurrentStore.Id); var allPictureIds = tree.Flatten().Select(x => x.PictureId.GetValueOrDefault()); var allPictureInfos = _pictureService.GetPictureInfos(allPictureIds); + var randomId = CommonHelper.GenerateRandomInteger(0, 1000000); if (request.Entity.BeginGroup) { @@ -60,7 +62,7 @@ public override TreeNode Append(MenuItemProviderRequest request) // Do not append the root itself. foreach (var child in tree.Children) { - AppendToParent(request, ConvertNode(request, child, allPictureInfos)); + AppendToParent(request, ConvertNode(request, child, allPictureInfos, ref randomId)); } } @@ -80,13 +82,15 @@ protected override void ApplyLink(MenuItemProviderRequest request, TreeNode ConvertNode( MenuItemProviderRequest request, TreeNode categoryNode, - IDictionary allPictureInfos) + IDictionary allPictureInfos, + ref int randomId) { var node = categoryNode.Value; var name = node.Id > 0 ? node.GetLocalized(x => x.Name) : null; var menuItem = new MenuItem { + Id = randomId++.ToString(), EntityId = node.Id, EntityName = nameof(Category), Text = name?.Value ?? node.Name, @@ -129,7 +133,7 @@ private TreeNode ConvertNode( { foreach (var childNode in categoryNode.Children) { - convertedNode.Append(ConvertNode(request, childNode, allPictureInfos)); + convertedNode.Append(ConvertNode(request, childNode, allPictureInfos, ref randomId)); } } From 86cb8e78fa4053f705f94556931b0ca0c3a8c2af Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Mon, 24 Jun 2019 19:39:59 +0200 Subject: [PATCH 037/115] Removed obsolete code --- src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs b/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs index a31bc04bcb..9eb50ecb00 100644 --- a/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs +++ b/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs @@ -30,9 +30,6 @@ public void Invoke(ConsumerDescriptor descriptor, IConsumer consumer, var p = descriptor.WithEnvelope ? (object)envelope : envelope.Message; var fastInvoker = FastInvoker.GetInvoker(d.Method); - var items = HttpContext.Current.GetItem("ConsumerInvoker", () => new List()); - items.Add(d); - if (!d.FireForget && !d.IsAsync) { // The all synch case From 7f8b7588608b953882388564ccf96e676e0f92b2 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Mon, 24 Jun 2019 19:44:08 +0200 Subject: [PATCH 038/115] Made CommonHelper._random field [ThreadStatic] --- .../SmartStore.Core/Utilities/CommonHelper.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Libraries/SmartStore.Core/Utilities/CommonHelper.cs b/src/Libraries/SmartStore.Core/Utilities/CommonHelper.cs index 8c7f9e1a70..1fb1f2240d 100644 --- a/src/Libraries/SmartStore.Core/Utilities/CommonHelper.cs +++ b/src/Libraries/SmartStore.Core/Utilities/CommonHelper.cs @@ -19,8 +19,20 @@ namespace SmartStore.Utilities public static partial class CommonHelper { private static bool? _isDevEnvironment; - private readonly static Random _random = new Random(); + + [ThreadStatic] + private static Random _random; + private static Random GetRandomizer() + { + if (_random == null) + { + _random = new Random(); + } + + return _random; + } + /// /// Generate random digit code /// @@ -31,7 +43,7 @@ public static string GenerateRandomDigitCode(int length) var buffer = new int[length]; for (int i = 0; i < length; ++i) { - buffer[i] = _random.Next(10); + buffer[i] = GetRandomizer().Next(10); } return string.Join("", buffer); From 034c7c9688aad4f4da257c797a46589bbd410f99 Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Tue, 25 Jun 2019 02:02:27 +0200 Subject: [PATCH 039/115] Updated build script --- build.bat | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/build.bat b/build.bat index ef0004b549..db94e178bc 100644 --- a/build.bat +++ b/build.bat @@ -1,37 +1,41 @@ -for /f "usebackq tokens=1* delims=: " %%i in (`lib\vswhere\vswhere -latest -requires Microsoft.Component.MSBuild`) do ( - if /i "%%i"=="installationPath" set InstallDir=%%j +SETLOCAL ENABLEDELAYEDEXPANSION + +for /f "usebackq tokens=1* delims=: " %%i in (`lib\vswhere\vswhere -version "[15.0,16.0)" -requires Microsoft.Component.MSBuild`) do ( + if /i "%%i"=="installationPath" ( + set InstallDir=%%j + echo !InstallDir! + if exist "!InstallDir!\MSBuild\15.0\Bin\MSBuild.exe" ( + echo "Using MSBuild from Visual Studio 2017" + set msbuild="!InstallDir!\MSBuild\15.0\Bin\MSBuild.exe" + goto build + ) + ) ) FOR %%b in ( - "%InstallDir%\Common7\Tools\VsMSBuildCmd.bat" - "%VS140COMNTOOLS%\Common7\Tools\vsvars32.bat" + "%VS140COMNTOOLS%\vsvars32.bat" + "%VS120COMNTOOLS%\vsvars32.bat" + "%VS110COMNTOOLS%\vsvars32.bat" ) do ( if exist %%b ( - call %%b - goto findmsbuild + echo "Using MSBuild from %%b" + call %%b + set msbuild="msbuild" + goto build ) ) echo "Unable to detect suitable environment. Build may not succeed." -:findmsbuild - -SETLOCAL ENABLEDELAYEDEXPANSION - -if exist "%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe" ( - if not defined MsBuildPath ( - SET "MsBuildPath=%InstallDir%\MSBuild\15.0\Bin\MsBuild.exe" - goto build - ) -) - - -echo "Unable to detect suitable MsBuild version (15.0). Build may not succeed." - :build + cd /d %~dp0 echo "Restoring NuGet packages" lib\nuget\nuget.exe restore "src\SmartStoreNET.sln" -call "!MsBuildPath!" SmartStoreNET.proj /p:SlnName=SmartStoreNET /m /p:DebugSymbols=false /p:DebugType=None /maxcpucount %* +%msbuild% SmartStoreNET.proj /p:SlnName=SmartStoreNET /m /p:DebugSymbols=false /p:DebugType=None /maxcpucount %* + +:end + +pause From 3fb291c2b342e075f08a3ef7831b6e56274d732d Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Tue, 25 Jun 2019 19:51:03 +0200 Subject: [PATCH 040/115] Added VS2019 support to build script --- build.bat | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/build.bat b/build.bat index db94e178bc..94a6c72519 100644 --- a/build.bat +++ b/build.bat @@ -1,6 +1,6 @@ SETLOCAL ENABLEDELAYEDEXPANSION -for /f "usebackq tokens=1* delims=: " %%i in (`lib\vswhere\vswhere -version "[15.0,16.0)" -requires Microsoft.Component.MSBuild`) do ( +for /f "usebackq tokens=1* delims=: " %%i in (`lib\vswhere\vswhere -latest -requires Microsoft.Component.MSBuild`) do ( if /i "%%i"=="installationPath" ( set InstallDir=%%j echo !InstallDir! @@ -9,10 +9,16 @@ for /f "usebackq tokens=1* delims=: " %%i in (`lib\vswhere\vswhere -version "[15 set msbuild="!InstallDir!\MSBuild\15.0\Bin\MSBuild.exe" goto build ) + if exist "!InstallDir!\MSBuild\Current\Bin\MSBuild.exe" ( + echo "Using MSBuild from Visual Studio 2019" + set msbuild="!InstallDir!\MSBuild\Current\Bin\MSBuild.exe" + goto build + ) ) ) FOR %%b in ( + "%VS150COMNTOOLS%\vsvars32.bat" "%VS140COMNTOOLS%\vsvars32.bat" "%VS120COMNTOOLS%\vsvars32.bat" "%VS110COMNTOOLS%\vsvars32.bat" @@ -37,5 +43,3 @@ lib\nuget\nuget.exe restore "src\SmartStoreNET.sln" %msbuild% SmartStoreNET.proj /p:SlnName=SmartStoreNET /m /p:DebugSymbols=false /p:DebugType=None /maxcpucount %* :end - -pause From d0c2f78783b364e1115104af5daa00233f69fc6d Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Tue, 25 Jun 2019 20:51:18 +0200 Subject: [PATCH 041/115] Updated ToolsVersion in all project files --- src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs | 2 +- src/Libraries/SmartStore.Core/SmartStore.Core.csproj | 2 +- src/Libraries/SmartStore.Data/SmartStore.Data.csproj | 2 +- src/Libraries/SmartStore.Services/SmartStore.Services.csproj | 2 +- src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj | 2 +- src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj | 2 +- src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj | 2 +- .../SmartStore.DiscountRules/SmartStore.DiscountRules.csproj | 2 +- .../SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj | 2 +- .../SmartStore.GoogleAnalytics.csproj | 2 +- .../SmartStore.GoogleMerchantCenter.csproj | 2 +- .../SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj | 2 +- src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj | 2 +- src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj | 2 +- .../SmartStore.ShippingByWeight.csproj | 2 +- src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj | 2 +- .../SmartStore.Web.Framework/SmartStore.Web.Framework.csproj | 2 +- .../SmartStore.Web/Administration/SmartStore.Admin.csproj | 2 +- src/Presentation/SmartStore.Web/SmartStore.Web.csproj | 2 +- src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj | 2 +- src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj | 2 +- .../SmartStore.Services.Tests/SmartStore.Services.Tests.csproj | 2 +- src/Tests/SmartStore.Tests/SmartStore.Tests.csproj | 2 +- .../SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj | 2 +- src/Tools/SmartStore.Packager/SmartStore.Packager.csproj | 2 +- .../SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs b/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs index 7160bcf30c..9d1d5f5bce 100644 --- a/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs @@ -81,7 +81,7 @@ public SeoSettings() public string SeoNameCharConversion { get; set; } public bool CanonicalUrlsEnabled { get; set; } - public CanonicalHostNameRule CanonicalHostNameRule { get; set; } + public CanonicalHostNameRule CanonicalHostNameRule { get; set; } /// /// Slugs (sename) reserved for some other needs diff --git a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj index 60553396a0..dad3499702 100644 --- a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj +++ b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj index df1c4a283b..7d18f0ae09 100644 --- a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj +++ b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj index 7304770fc0..3d845b3e67 100644 --- a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj +++ b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj index bf51e793d2..6c0fb6daf6 100644 --- a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj +++ b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj index abcbcb82e0..3c828d4792 100644 --- a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj +++ b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj b/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj index f63234905f..20e91013ac 100644 --- a/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj +++ b/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj b/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj index a91c5b48ac..795f7ea9bf 100644 --- a/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj +++ b/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj b/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj index 3c3eac8964..0cbde416f6 100644 --- a/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj +++ b/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj b/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj index 1927f9a6bf..7bff1bf355 100644 --- a/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj +++ b/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj b/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj index cf87aa8f56..248b434157 100644 --- a/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj +++ b/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj index 46fa73c6bb..7419b21cfd 100644 --- a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj +++ b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 343820715b..8d086e9c82 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj b/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj index 5492feba91..1bd1e8392c 100644 --- a/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj +++ b/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj b/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj index 0392e89152..448c20c7fb 100644 --- a/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj +++ b/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj b/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj index 7b93e203b3..3d63189b94 100644 --- a/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj +++ b/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj b/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj index bc4419c6b9..c101357d2c 100644 --- a/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj +++ b/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj b/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj index 7857f08e68..316a4fb401 100644 --- a/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj +++ b/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj @@ -1,5 +1,5 @@  - + Debug diff --git a/src/Presentation/SmartStore.Web/SmartStore.Web.csproj b/src/Presentation/SmartStore.Web/SmartStore.Web.csproj index 14f0ca7515..875301bc29 100644 --- a/src/Presentation/SmartStore.Web/SmartStore.Web.csproj +++ b/src/Presentation/SmartStore.Web/SmartStore.Web.csproj @@ -1,5 +1,5 @@  - + diff --git a/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj b/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj index 85ebd4be35..a5594b3ecd 100644 --- a/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj +++ b/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj b/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj index 8a35ceb469..42d4c496de 100644 --- a/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj +++ b/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj b/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj index 5cc108a71d..080e5f8c5d 100644 --- a/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj +++ b/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj b/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj index 0e8bd571e7..84a62a73ae 100644 --- a/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj +++ b/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj b/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj index 00f00f9d2a..3f018c605d 100644 --- a/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj +++ b/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj b/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj index 3a15f36499..794db96f12 100644 --- a/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj +++ b/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj @@ -1,5 +1,5 @@  - + Debug diff --git a/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj b/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj index 470f4b115c..556fa2a9d4 100644 --- a/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj +++ b/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj @@ -1,5 +1,5 @@  - + Debug From afa48b488ad45c254d2cf67deae0c49ef680f54b Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Tue, 25 Jun 2019 21:20:58 +0200 Subject: [PATCH 042/115] Imported DotNetCompilerPlatform.props to all project files --- src/Libraries/SmartStore.Core/SmartStore.Core.csproj | 1 + src/Libraries/SmartStore.Data/SmartStore.Data.csproj | 1 + src/Libraries/SmartStore.Services/SmartStore.Services.csproj | 1 + src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj | 2 +- src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj | 1 + src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj | 1 + .../SmartStore.DiscountRules/SmartStore.DiscountRules.csproj | 2 +- .../SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj | 1 + .../SmartStore.GoogleAnalytics.csproj | 1 + .../SmartStore.GoogleMerchantCenter.csproj | 1 + .../SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj | 1 + src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj | 2 +- src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj | 1 + .../SmartStore.ShippingByWeight.csproj | 1 + src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj | 1 + .../SmartStore.Web.Framework/SmartStore.Web.Framework.csproj | 1 + .../SmartStore.Web/Administration/SmartStore.Admin.csproj | 1 + src/Presentation/SmartStore.Web/SmartStore.Web.csproj | 2 +- src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj | 1 + src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj | 1 + .../SmartStore.Services.Tests/SmartStore.Services.Tests.csproj | 1 + src/Tests/SmartStore.Tests/SmartStore.Tests.csproj | 1 + .../SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj | 1 + src/Tools/SmartStore.Packager/SmartStore.Packager.csproj | 1 + .../SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj | 1 + 25 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj index dad3499702..e89e76c15d 100644 --- a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj +++ b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj index 7d18f0ae09..2068884c2e 100644 --- a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj +++ b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj index 3d845b3e67..11304f4d70 100644 --- a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj +++ b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj index 6c0fb6daf6..b2db65457e 100644 --- a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj +++ b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj @@ -1,6 +1,6 @@  - + diff --git a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj index 3c828d4792..decee9a5f7 100644 --- a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj +++ b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj b/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj index 20e91013ac..025ef8e5bf 100644 --- a/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj +++ b/src/Plugins/SmartStore.DevTools/SmartStore.DevTools.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj b/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj index 795f7ea9bf..97356664ed 100644 --- a/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj +++ b/src/Plugins/SmartStore.DiscountRules/SmartStore.DiscountRules.csproj @@ -1,6 +1,6 @@  - + diff --git a/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj b/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj index 0cbde416f6..832cc36b51 100644 --- a/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj +++ b/src/Plugins/SmartStore.FacebookAuth/SmartStore.FacebookAuth.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj b/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj index 7bff1bf355..b48e5d3f5d 100644 --- a/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj +++ b/src/Plugins/SmartStore.GoogleAnalytics/SmartStore.GoogleAnalytics.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj b/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj index 248b434157..0a93c5cd18 100644 --- a/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj +++ b/src/Plugins/SmartStore.GoogleMerchantCenter/SmartStore.GoogleMerchantCenter.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj index 7419b21cfd..d7f708d887 100644 --- a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj +++ b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj index 8d086e9c82..6c8ab54a79 100644 --- a/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj +++ b/src/Plugins/SmartStore.PayPal/SmartStore.PayPal.csproj @@ -1,6 +1,6 @@  - + diff --git a/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj b/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj index 1bd1e8392c..8d59d2df62 100644 --- a/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj +++ b/src/Plugins/SmartStore.Shipping/SmartStore.Shipping.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj b/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj index 448c20c7fb..30c483ab7c 100644 --- a/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj +++ b/src/Plugins/SmartStore.ShippingByWeight/SmartStore.ShippingByWeight.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj b/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj index 3d63189b94..21dbe5eef1 100644 --- a/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj +++ b/src/Plugins/SmartStore.Tax/SmartStore.Tax.csproj @@ -1,5 +1,6 @@  + diff --git a/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj b/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj index c101357d2c..bcf02806b0 100644 --- a/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj +++ b/src/Presentation/SmartStore.Web.Framework/SmartStore.Web.Framework.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj b/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj index 316a4fb401..44b280e563 100644 --- a/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj +++ b/src/Presentation/SmartStore.Web/Administration/SmartStore.Admin.csproj @@ -1,5 +1,6 @@  + Debug diff --git a/src/Presentation/SmartStore.Web/SmartStore.Web.csproj b/src/Presentation/SmartStore.Web/SmartStore.Web.csproj index 875301bc29..2f119ad9f5 100644 --- a/src/Presentation/SmartStore.Web/SmartStore.Web.csproj +++ b/src/Presentation/SmartStore.Web/SmartStore.Web.csproj @@ -1,11 +1,11 @@  + - Debug diff --git a/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj b/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj index a5594b3ecd..498af716eb 100644 --- a/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj +++ b/src/Tests/SmartStore.Core.Tests/SmartStore.Core.Tests.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj b/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj index 42d4c496de..1e0a831df9 100644 --- a/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj +++ b/src/Tests/SmartStore.Data.Tests/SmartStore.Data.Tests.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj b/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj index 080e5f8c5d..11966dd618 100644 --- a/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj +++ b/src/Tests/SmartStore.Services.Tests/SmartStore.Services.Tests.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj b/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj index 84a62a73ae..f1a85a4976 100644 --- a/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj +++ b/src/Tests/SmartStore.Tests/SmartStore.Tests.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj b/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj index 3f018c605d..555a89d265 100644 --- a/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj +++ b/src/Tests/SmartStore.Web.MVC.Tests/SmartStore.Web.MVC.Tests.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU diff --git a/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj b/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj index 794db96f12..1393435f6b 100644 --- a/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj +++ b/src/Tools/SmartStore.Packager/SmartStore.Packager.csproj @@ -1,5 +1,6 @@  + Debug diff --git a/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj b/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj index 556fa2a9d4..8c4832553c 100644 --- a/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj +++ b/src/Tools/SmartStore.WebApi.Client/SmartStore.WebApi.Client.csproj @@ -1,5 +1,6 @@  + Debug From 6cae111a48ea98fff481488fe3ddc5e444c4d3b1 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 26 Jun 2019 12:49:45 +0200 Subject: [PATCH 043/115] Resolves #1662 Quantity Units: add field for plural --- changelog.md | 3 + .../Domain/Directory/QuantityUnit.cs | 12 +- .../Mapping/Directory/QuantityUnitMap.cs | 13 +- ...2008551_QuantityUnitNamePlural.Designer.cs | 29 +++ .../201906252008551_QuantityUnitNamePlural.cs | 170 ++++++++++++++++++ ...01906252008551_QuantityUnitNamePlural.resx | 126 +++++++++++++ .../Setup/SeedData/InvariantSeedData.cs | 66 ++++--- .../SmartStore.Data/SmartStore.Data.csproj | 7 + .../Export/DynamicEntityHelper.cs | 4 +- .../DataExchange/Export/ExportXmlHelper.cs | 3 +- .../Controllers/QuantityUnitController.cs | 108 +++++------ .../Models/Directory/QuantityUnitModel.cs | 10 +- .../Views/QuantityUnit/List.cshtml | 38 ++-- .../Views/QuantityUnit/_CreateOrUpdate.cshtml | 22 ++- .../Installation/DeDESeedData.cs | 94 ++++++++++ .../Installation/InstallDataSeeder.cs | 3 +- 16 files changed, 593 insertions(+), 115 deletions(-) create mode 100644 src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.Designer.cs create mode 100644 src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.cs create mode 100644 src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.resx diff --git a/changelog.md b/changelog.md index 0821c19ebc..a6d45bf3fb 100644 --- a/changelog.md +++ b/changelog.md @@ -14,6 +14,9 @@ * (Dev) Added a sample block for the *Page Builder* in DevTools plugin. * Various other minor improvements +### Improvements +* #1662 Quantity Units: add field for plural. + ### Bugfixes * Fixed wrong XML sitemap index numbering. * #1646 Setting ManufacturerItemsToDisplayOnHomepage to 1 will not show any manufacturer. diff --git a/src/Libraries/SmartStore.Core/Domain/Directory/QuantityUnit.cs b/src/Libraries/SmartStore.Core/Domain/Directory/QuantityUnit.cs index f10f0543c3..4e671a5384 100644 --- a/src/Libraries/SmartStore.Core/Domain/Directory/QuantityUnit.cs +++ b/src/Libraries/SmartStore.Core/Domain/Directory/QuantityUnit.cs @@ -1,6 +1,5 @@ -using System; -using SmartStore.Core.Domain.Localization; using System.Runtime.Serialization; +using SmartStore.Core.Domain.Localization; namespace SmartStore.Core.Domain.Directory { @@ -16,6 +15,12 @@ public partial class QuantityUnit : BaseEntity, ILocalizedEntity [DataMember] public string Name { get; set; } + /// + /// Gets or sets the name plural. + /// + [DataMember] + public string NamePlural { get; set; } + /// /// Gets or sets the description /// @@ -38,7 +43,6 @@ public partial class QuantityUnit : BaseEntity, ILocalizedEntity /// Gets or sets the default quantity unit /// [DataMember] - public bool IsDefault { get; set; } - + public bool IsDefault { get; set; } } } diff --git a/src/Libraries/SmartStore.Data/Mapping/Directory/QuantityUnitMap.cs b/src/Libraries/SmartStore.Data/Mapping/Directory/QuantityUnitMap.cs index 7bd783bcad..a840571e67 100644 --- a/src/Libraries/SmartStore.Data/Mapping/Directory/QuantityUnitMap.cs +++ b/src/Libraries/SmartStore.Data/Mapping/Directory/QuantityUnitMap.cs @@ -7,12 +7,13 @@ public partial class QuantityUnitMap : EntityTypeConfiguration { public QuantityUnitMap() { - this.ToTable("QuantityUnit"); - this.HasKey(c => c.Id); - this.Property(c => c.Name).IsRequired().HasMaxLength(50); - this.Property(c => c.Description).HasMaxLength(50); - this.Property(c => c.DisplayLocale).HasMaxLength(50); - this.Property(c => c.DisplayOrder); + ToTable("QuantityUnit"); + HasKey(c => c.Id); + Property(c => c.Name).IsRequired().HasMaxLength(50); + Property(c => c.NamePlural).IsRequired().HasMaxLength(50); + Property(c => c.Description).HasMaxLength(50); + Property(c => c.DisplayLocale).HasMaxLength(50); + Property(c => c.DisplayOrder); } } } \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.Designer.cs b/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.Designer.cs new file mode 100644 index 0000000000..186f72e27d --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.Designer.cs @@ -0,0 +1,29 @@ +// +namespace SmartStore.Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class QuantityUnitNamePlural : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(QuantityUnitNamePlural)); + + string IMigrationMetadata.Id + { + get { return "201906252008551_QuantityUnitNamePlural"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.cs b/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.cs new file mode 100644 index 0000000000..a6b8c09525 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.cs @@ -0,0 +1,170 @@ +namespace SmartStore.Data.Migrations +{ + using System.Collections.Generic; + using System.Data.Entity.Migrations; + using System.Linq; + using SmartStore.Core.Data; + using SmartStore.Core.Domain.Directory; + using SmartStore.Core.Domain.Localization; + using SmartStore.Data.Setup; + + public partial class QuantityUnitNamePlural : DbMigration, IDataSeeder + { + public override void Up() + { + AddColumn("dbo.QuantityUnit", "NamePlural", c => c.String(nullable: false, maxLength: 50, defaultValue: "" )); + } + + public override void Down() + { + DropColumn("dbo.QuantityUnit", "NamePlural"); + } + + public bool RollbackOnFailure => true; + + public void Seed(SmartObjectContext context) + { + context.MigrateLocaleResources(MigrateLocaleResources); + context.SaveChanges(); + + if (!DataSettings.DatabaseIsInstalled()) + { + return; + } + + var quPluralDe = new Dictionary + { + { "Stck", "Stcke" }, + { "Schachtel", "Schachteln" }, + { "Paket", "Pakete" }, + { "Palette", "Paletten" }, + { "Kiste", "Kisten" }, + { "Einheit", "Einheiten" }, + { "Sack", "Scke" }, + { "Tte", "Tten" }, + { "Dose", "Dosen" }, + { "Stange", "Stangen" }, + { "Flasche", "Flaschen" }, + { "Glas", "Glser" }, + { "Bund", "Bnde" }, + { "Rolle", "Rollen" }, + { "Fass", "Fsser" }, + { "Set", "Sets" } + }; + + var quPluralEn = new Dictionary + { + { "Piece", "Pieces" }, + { "Box", "Boxes" }, + { "Parcel", "Parcels" }, + { "Palette", "Pallets" }, + { "Unit", "Units" }, + { "Sack", "Sacks" }, + { "Bag", "Bags" }, + { "Can", "Cans" }, + { "Tin", "Tins" }, + { "Packet", "Packets" }, + { "Package", "Packages" }, + { "Bar", "Bars" }, + { "Bottle", "Bottles" }, + { "Glass", "Glasses" }, + { "Bunch", "Bunches" }, + { "Roll", "Rolls" }, + { "Cup", "Cups" }, + { "Bundle", "Bundles" }, + { "Barrel", "Barrels" }, + { "Set", "Sets" }, + { "Bucket", "Buckets" } + }; + + using (var scope = new DbContextScope(ctx: context, validateOnSave: false, hooksEnabled: false, autoCommit: false)) + { + var languages = context.Set().ToDictionary(x => x.Id, x => x); + var defaultLang = languages.Values.OrderBy(x => x.DisplayOrder).First(); + + // Quantity units. + var quantityUnits = context.Set().ToList(); + if (quantityUnits.Any()) + { + foreach (var quantityUnit in quantityUnits) + { + var name = quantityUnit.Name.EmptyNull(); + string namePlural = null; + + if (defaultLang.UniqueSeoCode.IsCaseInsensitiveEqual("de")) + { + quPluralDe.TryGetValue(name, out namePlural); + } + else if (defaultLang.UniqueSeoCode.IsCaseInsensitiveEqual("en")) + { + quPluralEn.TryGetValue(name, out namePlural); + } + + quantityUnit.NamePlural = namePlural.NullEmpty() ?? name; + } + + scope.Commit(); + } + + // Localized properties. + var lpSet = context.Set(); + var pluralCount = lpSet + .Where(x => x.LocaleKeyGroup == "QuantityUnit" && x.LocaleKey == "NamePlural") + .Count(); + + if (pluralCount == 0) + { + var localizedProperties = lpSet + .Where(x => x.LocaleKeyGroup == "QuantityUnit" && x.LocaleKey == "Name") + .ToList(); + + if (localizedProperties.Any()) + { + foreach (var lp in localizedProperties) + { + if (languages.TryGetValue(lp.LanguageId, out var language)) + { + var name = lp.LocaleValue.EmptyNull(); + string namePlural = null; + + if (language.UniqueSeoCode.IsCaseInsensitiveEqual("de")) + { + quPluralDe.TryGetValue(name, out namePlural); + } + else if (language.UniqueSeoCode.IsCaseInsensitiveEqual("en")) + { + quPluralEn.TryGetValue(name, out namePlural); + } + + if (namePlural.HasValue()) + { + lpSet.Add(new LocalizedProperty + { + EntityId = lp.EntityId, + LanguageId = lp.LanguageId, + LocaleKeyGroup = lp.LocaleKeyGroup, + LocaleKey = "NamePlural", + LocaleValue = namePlural + }); + } + } + } + + scope.Commit(); + } + } + } + } + + public void MigrateLocaleResources(LocaleResourcesBuilder builder) + { + builder.AddOrUpdate("Common.Plural", "Plural", "Mehrzahl"); + + builder.AddOrUpdate("Admin.Configuration.QuantityUnit.Fields.NamePlural", + "Name plural", + "Name Mehrzahl", + "Sets the name in plural. Example: \"Barrels\" for the unit \"Barrel\".", + "Legt den Namen in Mehrzahl fest. Beispiel: \"Fsser\" fr die Verpackungseinheit \"Fass\"."); + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.resx b/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.resx new file mode 100644 index 0000000000..887e09fc9d --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/201906252008551_QuantityUnitNamePlural.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs index 7294343e2f..c2c4ca13f4 100644 --- a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs +++ b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs @@ -13163,34 +13163,44 @@ public IList DeliveryTimes() public IList QuantityUnits() { - var entities = new List() - { - new QuantityUnit - { - Name = "Piece", - Description = "Piece", - IsDefault = true, - DisplayOrder = 0, - }, - new QuantityUnit - { - Name = "Box", - Description = "Box", - DisplayOrder = 1, - }, - new QuantityUnit - { - Name = "Parcel", - Description = "Parcel", - DisplayOrder = 2, - }, - new QuantityUnit - { - Name = "Palette", - Description = "Palette", - DisplayOrder = 3, - }, - }; + var count = 0; + var entities = new List(); + + var quPluralEn = new Dictionary + { + { "Piece", "Pieces" }, + { "Box", "Boxes" }, + { "Parcel", "Parcels" }, + { "Palette", "Pallets" }, + { "Unit", "Units" }, + { "Sack", "Sacks" }, + { "Bag", "Bags" }, + { "Can", "Cans" }, + { "Packet", "Packets" }, + { "Bar", "Bars" }, + { "Bottle", "Bottles" }, + { "Glass", "Glasses" }, + { "Bunch", "Bunches" }, + { "Roll", "Rolls" }, + { "Cup", "Cups" }, + { "Bundle", "Bundles" }, + { "Barrel", "Barrels" }, + { "Set", "Sets" }, + { "Bucket", "Buckets" } + }; + + foreach (var qu in quPluralEn) + { + entities.Add(new QuantityUnit + { + Name = qu.Key, + NamePlural = qu.Value, + Description = qu.Key, + IsDefault = qu.Key == "Piece", + DisplayOrder = count++ + }); + } + this.Alter(entities); return entities; } diff --git a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj index 2068884c2e..bc8d3209fa 100644 --- a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj +++ b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj @@ -674,6 +674,10 @@ 201905271110370_V321Resources.cs + + + 201906252008551_QuantityUnitNamePlural.cs + @@ -1207,6 +1211,9 @@ 201905271110370_V321Resources.cs + + 201906252008551_QuantityUnitNamePlural.cs + diff --git a/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs b/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs index ac18b7edac..8c89087b72 100644 --- a/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs +++ b/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs @@ -461,10 +461,12 @@ private dynamic ToDynamic(DataExporterContext ctx, QuantityUnit quantityUnit) var translations = ctx.Translations[nameof(QuantityUnit)]; result.Name = translations.GetValue(ctx.LanguageId, quantityUnit.Id, nameof(quantityUnit.Name)) ?? quantityUnit.Name; - result.Description = translations.GetValue(ctx.LanguageId, quantityUnit.Id, nameof(quantityUnit.Description)) ?? quantityUnit.Description; + result.NamePlural = translations.GetValue(ctx.LanguageId, quantityUnit.Id, nameof(quantityUnit.NamePlural)) ?? quantityUnit.NamePlural; + result.Description = translations.GetValue(ctx.LanguageId, quantityUnit.Id, nameof(quantityUnit.Description)) ?? quantityUnit.Description; result._Localized = GetLocalized(ctx, translations, null, quantityUnit, x => x.Name, + x => x.NamePlural, x => x.Description); return result; diff --git a/src/Libraries/SmartStore.Services/DataExchange/Export/ExportXmlHelper.cs b/src/Libraries/SmartStore.Services/DataExchange/Export/ExportXmlHelper.cs index df53b4cb3f..4af3ac1836 100644 --- a/src/Libraries/SmartStore.Services/DataExchange/Export/ExportXmlHelper.cs +++ b/src/Libraries/SmartStore.Services/DataExchange/Export/ExportXmlHelper.cs @@ -318,7 +318,8 @@ public void WriteQuantityUnit(dynamic quantityUnit, string node) _writer.Write("Id", entity.Id.ToString()); _writer.Write("Name", (string)quantityUnit.Name); - _writer.Write("Description", (string)quantityUnit.Description); + _writer.Write("NamePlural", (string)quantityUnit.NamePlural); + _writer.Write("Description", (string)quantityUnit.Description); _writer.Write("DisplayLocale", entity.DisplayLocale); _writer.Write("DisplayOrder", entity.DisplayOrder.ToString()); _writer.Write("IsDefault", entity.IsDefault.ToString()); diff --git a/src/Presentation/SmartStore.Web/Administration/Controllers/QuantityUnitController.cs b/src/Presentation/SmartStore.Web/Administration/Controllers/QuantityUnitController.cs index 3649c5522f..6c429e4e48 100644 --- a/src/Presentation/SmartStore.Web/Administration/Controllers/QuantityUnitController.cs +++ b/src/Presentation/SmartStore.Web/Administration/Controllers/QuantityUnitController.cs @@ -3,7 +3,6 @@ using System.Web.Mvc; using SmartStore.Admin.Models.Directory; using SmartStore.Core.Domain.Directory; -using SmartStore.Services; using SmartStore.Services.Directory; using SmartStore.Services.Localization; using SmartStore.Services.Security; @@ -17,45 +16,20 @@ namespace SmartStore.Admin.Controllers [AdminAuthorize] public class QuantityUnitController : AdminControllerBase { - #region Fields - private readonly IQuantityUnitService _quantityUnitService; private readonly ILocalizedEntityService _localizedEntityService; private readonly ILanguageService _languageService; - private readonly ICommonServices _services; - - #endregion - - #region Constructors public QuantityUnitController( IQuantityUnitService quantityUnitService, ILocalizedEntityService localizedEntityService, - ILanguageService languageService, - ICommonServices services) + ILanguageService languageService) { _quantityUnitService = quantityUnitService; _localizedEntityService = localizedEntityService; _languageService = languageService; - _services = services; } - #endregion - - #region Utilities - - [NonAction] - public void UpdateLocales(QuantityUnit quantityUnit, QuantityUnitModel model) - { - foreach (var localized in model.Locales) - { - _localizedEntityService.SaveLocalizedValue(quantityUnit, x => x.Name, localized.Name, localized.LanguageId); - _localizedEntityService.SaveLocalizedValue(quantityUnit, x => x.Description, localized.Description, localized.LanguageId); - } - } - - #endregion - #region Methods public ActionResult Index() @@ -65,20 +39,25 @@ public ActionResult Index() public ActionResult List() { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { return AccessDeniedView(); + } - var quantityUnitModel = _quantityUnitService.GetAllQuantityUnits().Select(x => x.ToModel()).ToList(); + var quantityUnitModel = _quantityUnitService.GetAllQuantityUnits() + .Select(x => x.ToModel()) + .ToList(); var gridModel = new GridModel { Data = quantityUnitModel, Total = quantityUnitModel.Count() }; + return View(gridModel); } - //ajax + // Ajax. public ActionResult AllQuantityUnits(string label, int selectedId) { var quantityUnits = _quantityUnitService.GetAllQuantityUnits(); @@ -104,11 +83,12 @@ public ActionResult AllQuantityUnits(string label, int selectedId) public ActionResult Create() { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { return AccessDeniedView(); + } var model = new QuantityUnitModel(); - //locales AddLocales(_languageService, model.Locales); return View(model); @@ -117,40 +97,46 @@ public ActionResult Create() [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")] public ActionResult Create(QuantityUnitModel model, bool continueEditing) { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { return AccessDeniedView(); + } if (ModelState.IsValid) { var quantityUnit = model.ToEntity(); _quantityUnitService.InsertQuantityUnit(quantityUnit); - //locales + UpdateLocales(quantityUnit, model); NotifySuccess(T("Admin.Configuration.QuantityUnit.Added")); return continueEditing ? RedirectToAction("Edit", new { id = quantityUnit.Id }) : RedirectToAction("List"); } - //If we got this far, something failed, redisplay form return View(model); } public ActionResult Edit(int id) { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { return AccessDeniedView(); + } var quantityUnit = _quantityUnitService.GetQuantityUnitById(id); if (quantityUnit == null) + { return RedirectToAction("List"); + } var model = quantityUnit.ToModel(); AddLocales(_languageService, model.Locales, (locale, languageId) => { locale.Name = quantityUnit.GetLocalized(x => x.Name, languageId, false, false); - locale.Description = quantityUnit.GetLocalized(x => x.Description, languageId, false, false); + locale.NamePlural = quantityUnit.GetLocalized(x => x.NamePlural, languageId, false, false); + locale.Description = quantityUnit.GetLocalized(x => x.Description, languageId, false, false); }); return View(model); @@ -159,12 +145,16 @@ public ActionResult Edit(int id) [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")] public ActionResult Edit(QuantityUnitModel model, bool continueEditing) { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { return AccessDeniedView(); + } var quantityUnit = _quantityUnitService.GetQuantityUnitById(model.Id); if (quantityUnit == null) + { return RedirectToAction("List"); + } if (ModelState.IsValid) { @@ -181,39 +171,57 @@ public ActionResult Edit(QuantityUnitModel model, bool continueEditing) return View(model); } + [HttpPost] + public ActionResult Save(FormCollection formValues) + { + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { + return AccessDeniedView(); + } + + return RedirectToAction("List", "QuantityUnit"); + } + [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) + { return AccessDeniedView(); + } var quantityUnit = _quantityUnitService.GetQuantityUnitById(id); if (quantityUnit == null) - //No delivery time found with the specified id + { return RedirectToAction("List"); + } try { - _quantityUnitService.DeleteQuantityUnit(quantityUnit); - NotifySuccess(T("Admin.Configuration.QuantityUnits.Deleted")); + NotifySuccess(T("Admin.Common.TaskSuccessfullyProcessed")); return RedirectToAction("List"); } - catch (Exception exc) + catch (Exception ex) { - NotifyError(exc); + NotifyError(ex); return RedirectToAction("Edit", new { id = quantityUnit.Id }); } } - [HttpPost] - public ActionResult Save(FormCollection formValues) - { - if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageMeasures)) - return AccessDeniedView(); + #endregion - return RedirectToAction("List", "QuantityUnit"); + #region Utilities + + private void UpdateLocales(QuantityUnit quantityUnit, QuantityUnitModel model) + { + foreach (var localized in model.Locales) + { + _localizedEntityService.SaveLocalizedValue(quantityUnit, x => x.Name, localized.Name, localized.LanguageId); + _localizedEntityService.SaveLocalizedValue(quantityUnit, x => x.NamePlural, localized.NamePlural, localized.LanguageId); + _localizedEntityService.SaveLocalizedValue(quantityUnit, x => x.Description, localized.Description, localized.LanguageId); + } } #endregion diff --git a/src/Presentation/SmartStore.Web/Administration/Models/Directory/QuantityUnitModel.cs b/src/Presentation/SmartStore.Web/Administration/Models/Directory/QuantityUnitModel.cs index f44da303ce..f87e50dae0 100644 --- a/src/Presentation/SmartStore.Web/Administration/Models/Directory/QuantityUnitModel.cs +++ b/src/Presentation/SmartStore.Web/Administration/Models/Directory/QuantityUnitModel.cs @@ -16,7 +16,10 @@ public QuantityUnitModel() [SmartResourceDisplayName("Admin.Configuration.QuantityUnit.Fields.Name")] public string Name { get; set; } - [SmartResourceDisplayName("Common.Description")] + [SmartResourceDisplayName("Admin.Configuration.QuantityUnit.Fields.NamePlural")] + public string NamePlural { get; set; } + + [SmartResourceDisplayName("Common.Description")] [AllowHtml] public string Description { get; set; } @@ -36,7 +39,10 @@ public class QuantityUnitLocalizedModel : ILocalizedModelLocal [SmartResourceDisplayName("Admin.Configuration.QuantityUnit.Fields.Name")] public string Name { get; set; } - [SmartResourceDisplayName("Common.Description")] + [SmartResourceDisplayName("Admin.Configuration.QuantityUnit.Fields.NamePlural")] + public string NamePlural { get; set; } + + [SmartResourceDisplayName("Common.Description")] public string Description { get; set; } } } \ No newline at end of file diff --git a/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/List.cshtml b/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/List.cshtml index 536eb76f19..9b04b55a9d 100644 --- a/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/List.cshtml +++ b/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/List.cshtml @@ -19,23 +19,25 @@
    @(Html.Telerik().Grid() - .Name("measure-unit-grid") - .BindTo(Model.Data) - .Columns(columns => - { - columns.Bound(x => x.Name) - .Template(x => Html.ActionLink(x.Name, "Edit", new { id = x.Id })) - .ClientTemplate("<#= Name #>"); - columns.Bound(x => x.Description) - .Centered(); - columns.Bound(x => x.DisplayOrder) - .Width(100) - .Centered(); - columns.Bound(x => x.IsDefault) - .Template(item => @Html.SymbolForBool(item.IsDefault)) - .ClientTemplate(@Html.SymbolForBool("IsDefault")) - .Width(100) - .Centered(); - }) + .Name("measure-unit-grid") + .BindTo(Model.Data) + .Columns(columns => + { + columns.Bound(x => x.Name) + .Template(x => Html.ActionLink(x.Name, "Edit", new { id = x.Id })) + .ClientTemplate("<#= Name #>"); + columns.Bound(x => x.NamePlural) + .Title(T("Common.Plural").Text); + columns.Bound(x => x.Description) + .Centered(); + columns.Bound(x => x.DisplayOrder) + .Width(180) + .Centered(); + columns.Bound(x => x.IsDefault) + .Template(item => @Html.SymbolForBool(item.IsDefault)) + .ClientTemplate(@Html.SymbolForBool("IsDefault")) + .Width(180) + .Centered(); + }) )
    \ No newline at end of file diff --git a/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/_CreateOrUpdate.cshtml b/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/_CreateOrUpdate.cshtml index ef74e483f3..7c1c850279 100644 --- a/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/_CreateOrUpdate.cshtml +++ b/src/Presentation/SmartStore.Web/Administration/Views/QuantityUnit/_CreateOrUpdate.cshtml @@ -1,8 +1,4 @@ @model QuantityUnitModel -@using Telerik.Web.Mvc.UI; -@{ - var cultures = System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.SpecificCultures).ToList(); -} @Html.HiddenFor(model => model.Id) @(Html.LocalizedEditor("measure-unit-info-localized", @@ -19,6 +15,15 @@ @Html.ValidationMessageFor(model => model.Locales[item].Name)
    + + + + + + + + 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 delta 87528 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 diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-brands-400.woff2 b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-brands-400.woff2 index 2abc94a5990a1b1fca2dc152bf7378bbf0bf66cd..e27b0bfaf805d30fa467a0332b7c61ac95ba616e 100644 GIT binary patch literal 74508 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 z zW_XJ-O5&;B=)AJMPQ#HVC1Z%EU@Tm+|Iv6vlV>StTcShj;YXd}Q1a;Q4_v2;q9DUK z^n;BO?jrn~_K~(LQ3H_B^ddgcW*dN;8e`Z20b`lW|H9nWI0DY!4B;L1@aD<7YRjYc z)YDw@^W)3iA=y^y-MMpVmv0Uvl%!C@3b+KD@9l1PP?z)*^1>^5p@>$~92aC@Tk%Bs zne1q*#GU`RD&voy1_fdqov}b5C>X9^x<#vJf#K>wB85s1cF|HX^~w9ljcJ4{e*Vpi z2f*>e*I9k*!M*O`!?c@B2RJt{bjAU@vEJ^t=v!a8Pib)h2Gw#Rp*mG7rAoX1* zPi_(hRHYMZgju#C9Js1Cgw?M1Q4w9NThK(v1KvaJy55{|z18{f8;jF^ZAnIUC&stU zV@Zz=O{^9ZKPox>cpJmh|i80_V}lK*C|XntUwOHy0QMz)vd->H_L0S zsm@HtVr^T$zB-NZKWTesp|9zZVe>hd(D>Wo>iDEALmXhM&2SLld-p9GnlX9!*u2T2 zHn%UZ&Im%R=BJ~*DMt-_*Qqn6o+&;8SNdNtRyQtKNhUlY+uJ0(0v+~}5}n(r6p|yG z7#A`F^mOt-_ZBgq$k}Bu$}T;lwQy~;1LQ175>hJ-XJq-c-;8qnz%%OYZ0)VRoTO*@ z(f!i<=8Ob+%KXoU{m%NprlIQshUE8L!CG> zEt9e(UM)Egj8Tnxbt6>9h+-NgC(Hx0+6``@flW+z9>MKmdz#X&?()t=yt;}Mk*3=g zTTuZ!j1F972$7d_^Ah^g%Y(dp2-47!aB1n& z`l2qa-+!^r+i&$|=x%N1vxZ3KAFT54p7-@DwpM5QTiT?AevKMT?e;KE9^`=Gg5K!= zsJIordWY~DfRS^G3cUew;NOh&T8_E`|VF@G7TS(1!7fA;V1#M}l2d;@mzU`FftVz>P85~IEeNFLBR9M?xU;>jS4_ZR3&CXS? zoT&ivYqI-oo8#uiY=0g3!AB|oY~RL(<=pr*dQp^{nXsK(o`kb$Oqv{1G+S^?|96u> zn2M$FJT-Dwx~1+%yWtG;btiBCpB}zFnRc$6dq#pj;0&kRpG>ue4lXY*t-(`t*IIh{ z+EXl_G0MG}PD!5H!#f|_ztZa(^sijl>n`K0WbsBt?#J6CZ;?Aq5#dJHfptVK8 zLMx!H-ffSdYl=Vg*KFyV+f{(GU`1G6Y=62&kW~)`5!txfmyTB#hbE$Ff><_@1owu+ z+OG!ee#M?w9KOpFH!Dk)0_xlY{oB|C>^IR@sngD_B~;@;e!VJ>96(#LA%j1lZ0DfT zIT;>PG?%R2Iskph2tu6t084fxg7t9qquj2efdafyn*Q+j3{9w`PY{ zE)$)8IyfAu1%fXlZVmC#X<=a?5NE0Z7L9&6t{Z*nyNAj`$48?e07g)$Vyf>xp>M8i z@a1uVEPb+8&QCQ8Wbw*g`3bJC8{Lh8V5Y^@VVR$NT%6%Fch`j*a%i z=UF~H6y1BHP_p@Yfev%w`;j@XY}>ED*(#j*)u8abUm)PU-?vWvreFT@<*l+uCB7qG z+Nr$tT2?&&-e&Q%TVe?JgJJ21-wvHGe!1(sQ8V6i##U9V0nv2F}gj(Z|31?X3GyUpcQ7n9Z@ATqwvJp%8v(eVwrLr*qS81Cb3*`3yte6YZ z={xb{WUGJmAyt(z2x0pj(az+dIQHr^xKDU{xtBLhO1#RUKZ_3@| zT8WkCt-7`4pOn@2*A>(#moTz!`e{smb`Zy1{~H7oUzD@PYi8_66EHc>i*YZe2C( zL@5;K4Re+2getJZtXR9Y%n4f|>qF*o!NKuq<@+*8`pVQ(3ikUizT|d`WXVC5H?|eY zSp(b!d*RIRnFm+J5|oNf!bA_!=7paItFWW=R6tUI^)doTsmr#Pb?kZsk#fSd#j^Fn zG!;gXgeoi`OKkv*V$j8j014|V6=le0nq6=sM+n1&DJ`hpcoXPffGqCV=TthIcqM&=y;7G}S@DoFD&P4IjZ(5}Zl20xTg_`7+7PeuN@&bxVWo`cwpH@oU z%W!r;N(i^!B&jzX9q5$%=8VT#nGFq|vk5hBc1y`dg)+sxBz488%i}8X0NBvhbBaLX z^l3rd>XT4w{tyt1(@$L#C8;&}iRK12&)Z`{ju^*cqPway;&;>8D7JoK;qvO@tUD%p zJn^K#4=fbFSabdV)FHsV0Blw!(UcZ9gt_miF+t@ye1S~)nj2;nPL`)ryHwuC^%^`s#cG`;`7z>P|y7NfJ8`e+#M$HEmc{^o6L^eJx z)KwuL1}BE*>P36?!rYCd#G)c#aodh!@1!f-YP&ZFa{(va?QRswTSpNN;P+s4N9hwS z>%JHo<@=-TR9=YS;cRa%I^J)w`u3gTly&wN`N<_=KjTMZHB1^Ka`O(?Y-HK;+E#^h z6o#5p6ZRx5tFl;K;FPf1L0`x!DjGvY+Gb_4GTpLkqrwVQ&_Dk>&NrkKq}LZ^|0iB) zJ{*y`VQtWV5}qB*?dbmt81ueyvR-zL6(MU#XB!?^?rHk``4>iePo(*CP5zH3qF!dj z%AI>TLe*N#)18m7gtzhjqkC8=9-F(?5vCu826N6LpFB-FIG@S1g28vTNls3B;^ z#r!YjFET1?wyi#q@$6HVc6dCBTnY5Zq?|;4kwRuJqh+{{&Laz!ZlZ61$^|zz8-l5N z<+^$=Mm8Qa=@Oag#vP?VbC4455MBauXBvG$Y>seNfiFifl;c}Qs$E=(pG0$r6p2)H z9L=KBZ+1&QVafBp_G$0)yU!4(K0TcGue>C)RQSdo!CVK&Pn}^}lYK)zRMk(~ef3E} z-1sEN9yR5rWk@pdN;EtVTzRh(IjnR`Y%hdwif~P4bVOYe;=jR87V`B z3NAv9EEei*_XEdQEd`)==?e?C9vJCbA$qEdP;49A7R+g-!DYu+o|8XrKs#Z;fDy@~ zC8;Ce37a{ZQpT|@DmDwchd{KGM49h2+X?*i!u0z7ZWv^b8LFHLzti8^DgOLQ@+c4u z7Nw4KX=}XYu+IuX$D{uw#3NnG-KCUO8zK(JALunVFF(_NMoS{Ql=Z&q{oCWSSo{?Y>pN47KuRncr>?b-|^n-x&>iVxvg!SikH~9IX{ETV>Vb zbGP%fqsH_cR%(?Ub7nc?7aVtNdU9fU_LbQui?TFDzMpuM-*EN+m#OURi{RU(cg3{k zL|~s=xl_j%M9P%{hsHWEmABTjr7=joD0_g<>*TT&jEERANk1~e8>g$3S*(XDWkD)3c ziXWjINtwgwU03QO4q3iA#iXK$0>dSm8$g=vM58j2ui_J;*sqpPI@6LHn8ZP>sQ7Xd zk4n&145{h}>W4@G%99_yKjjj;RsMpU+nalt+&w_A_wzSTFFh=644T(vS5%6PN!eMI zeMde8Z{5Q2+^^@q`a9TofE_(h1VFgnaquz!@At7@fB)BnHJG|5>@f9x{XmJOALFrg zC3zCrSC+0fp5yg~<)liQRA&HFRt=io^!soMUVeS9I&8SUV^$IT{z!9ZHVJWj>^DBO zm8}oE<)93tgo1aesHR_UU7WZl7|%&*7NFzFByU6v8WMB;#2Wq>D^y+Jh9pqW=0+95 z=2^!24mWt*&C{iew@#^AEruwOu;y4bfspiwX<=<^-hC=i@!7hC40|SVh;39_-gT$& zR)g%r#CJ7eb1C2wY<#_4$Y2fUYmW_3S*_NG0t#U zQAFI4JjXknGY8!>GpQKu+kO;kUMYSLG>)FiBID zkY=mcnNEe~f^u&R&Ir1(^S~;qT;h>~eWNi2?WWPv;3xcw6!<}-c|Tk1(!Xo{>CG1e z!vHgGL)|N7Yy<0TdQpO8R}3V3(D$nh%Ka;8@P^tL74_)t2j4t8e)@2JtT1KCTAW;7 zc48!Wv;C*_U1pV|@|g(?y91I}MB&!20DU4>Xdc0@@W^V$Ix93e;1 zGo*l>)@QzUpYXIw3Jss!R;G5}!w)YQh=7+~vi3GwBtiz9-`I5k=X#CKg)45X+;6}y%YT+u2*Y?x}XCs$#U zoS2(uNNWs6*vfZ$aqlaDT{je3wtpVhe*1v6eR@U3*yd^Br(*3)D_hx+nWFW6B#DHfVwHi_wmVCFE#&5Odrk>k9Dxz_e`_kNWR`{e0zOl&f*EG6C zp$#qrE=@K)ZG@eJjgsz#$x*P4n%^DF_}#^W?hnK6mZvkoB6q()+1iG2q)~;-DvyN# zy&oyA`AE*|g#5_ufo=pg@V6JmDoCO=BVkqtVh&N59r3#jea4~9dv-nXDoH(9;3$?eeDq_IR5q>1BJm6|1L*cD~VS) z;tPa==A0CCFP=^e*^3hU=e9-6ba8hO7UdI`<`D?3!b3e#WhnIV>#yzU0aM?83Q{ zx87SkKYU2Icjzp?kPdmecVykc2=P6|%fpMazn-Z*DK3l;W(j>R{d*^|`lArNzBBcU zU=c9$z6_|Ba;B7y1IaF$lw5F&q0~AX*p~QI(BW;nkq&Q#ACyE;(I4KW)Cj2*<8CP> zK{t{eg4v#1FPdCPjaOWRQzq=FDY5lxO10=PS1m}r0GVPzQc~_h@f0a`p3}eP4P0lQ zo_lAkzgP0Y?Js*FH#o z79GqI;1w1_DTsq>p(`E%5uhOmB?wjo^I?iZX-NQJnZzp@%FziR1N1bG63{?kj$B|T z;<1kUeIq>!Sc13c%n`Un0>K_#Km=$k9fp;HOFufNh{$~_ap6*Hf{>HO{|LlQE-^SP zEStCqT83H=Ja7g|W_SlNrknT~&Hz*!KY%Owme4KoKyb(MWqJMGT5DscDizj3l|Cf+ zuI7Pa30x=mCXz6~uq%z`ugdi3@^Ch%+m|z2_lNr^3unFBy~Crk!hoHVmDV*oin9qapIYUmQXIE=brQMKxIM!}Z7 z3%`B|zoBdV5#&qa*cH-&RCRo^bJ{hzrac*c%`UY#yo^6O*8qJv?S;T7$L={msqPY)Rw2-kw_BN==!8hmY}R7p4nJ`hcs z)T6?tX{UWpP@ohW=G%hjw1!NWvi(jaOG}|kF_IF1D$8h`OPcUV{R-<3LZ%2Lc47ZV zZUu741bb;#L&Pf9P!E?8z&pdLm19)L%*<@O_nUe@o%-8LK5V*1SBFab+Je(k6 zto7X7P$Da=`aG~*BCLJJgkhG8WoQvV>vw2wMLQY)L665p3z@aV(#?zfK=3*7Q9I}2J4 z5(h3@+-uYBdUgEQU2zCDC#Q1fJ60mTSi7w?#WT?U{!Fz8)K&?q!E!6cqoj-Xc~ zs_HBYnPb@xi1P%z_9hwW@V=tp@H{eDt`xwpfiKeQVvZ^)p2xa zzDb|p1+_8Ai#pa?+X^S_;0+cDj}?Y7OVi^y#E$=`YPI@=qQ z=FAvorJeEhFtr)hdXhk{GgNj~tPSnDDY)9mxY-5Tro*9%LQfXc<=oLO-ypC zBPgp7qZRjM_yZ^ZVcnqzw~Tj|Dh8;wKk^<^1*guM=eg*G;DZd!thN?fXL+XtpbVCU zaF}t)6sCJsGr{tc<}tbzE7z5cRQPCva4+cC z^=p>Nsn&*;U&Hgees_69`&Ydu_^>wKppGC~1Cw9m!^Pz@<)rN3$}nh0oW!R;^XB>g zRPcoWNkF#0gpD(eb0_bt)xf4`wtHZ!EbydQ@@y@qI3w|S51oTW`DX%Z>E&fmi74p=trY``%}yD z24qm>Zwj762Sy+qQt$EKA%HvL&{+Rnu9c%DZ8=nC>{Pajm10-@a#&M>bET)1;b4)u zrwRLr4F3aYLXDQBBn2Zv1dp`EKJ&i>-d-7)J913x+y8lg zV59)6%YA~ijWX;PZ+kF@$`XMxf)AgEw*ESRn})4Qr|M48QTVK$?XxDzS^|d{#CV+a zG{Ti0pt`89%Dp*#+bK#?GF8n7SgccwuT)+_Yvh%xuHnlVBK21*^J-`>&8p6LHCI8N zE~vFwT}c@MBofT4PTY}2;#L%8TDT-QYa)0p*wBZj7EQtT8moBgdoS0&WH^p8<1;)i z#_5U`z4ZWCN~{oILGmv#i!yyJXU`?+6GV73VQbMktS4*M5}v$h=2k;6K2dPe*(46_1TGJ&Hy32yH|YUW_i(u&)$ zx>?&Au}VmfWgO-17k;xT3o38dYx##oQyJ-=Hc@ngT!`jxmoWp4?Y>{mXZ(ZcQfE$c zgO5^w*3kB9$kyY_Ebc^ZW>+399PMYpCGG8g61nM$weYIDx=S-f;OyRTh;-3vsd^!( z5S!2;^pK@dg@wI6kAp@pHbCeH)N^9<+|%Gll*oQ)<$vALCaipzaUG7I+iq*6mmNR( z2p92W)X7Y!SMr_I&%<88Rw+mP#UrhY{ryD)xeF7nIuo+N0M6Hbtl{Wg)1*Akv~&>+-tyC7KFl7I#Rh!wl2QHo=~KyMA+;GN zx+kQA)_`Cg8+M-_T#*o_!jegcYI9NifXJJEvD#P#MAaI{u+4xuQWCfVI+B zF+R4GREV%PZm3SAM(&|4qc>n-GOHtwo*6r=9<;$AbNa2-{w8EvW3v>xJa4Cj!4JE* z()$K*p?$O`GSNRyvvtkSItz#{zqVD^o?X*LxN|=%!@*PMg(;H3^a5$lPVgq5sN#hq zw1IQ;baAG@Vsx!J8+M!R*atg@p9SU8Ab;$p{rZo2==?qKx3^jU-;sn2gSwWP#;Hku-&dDYGg-IWgRB&ie*A4FKRGEpMxnT&M4UdtT%={Z znGOrY^=cEF2fh}h05%TN$|Rn1dccR{(b;G~1$QD!X{4}+kgR>N?*+|dubfs)YE5vi z=%g*tG*g*JaML<^6~ePz0!#m9YLY7(+TShry|(6JO@`-X2mfTgYG$3Fruzy>)Ywuu9SduzLP zKT`@W@~X`7-{)BnY79m#Xtz;3^bG`FOb%&4!t2r!59YGG&LlFZSr_J$@zw9BAGJHx zzBDYaM{*>W^?ipJc$MBOmXHv@0xBvF7r0p6@uc8a_a6ly=3Erw}h~Q`Lelhpvp+{$21x#U^4n?p5Ms-=_mh$!qq z`DjT)+L*xG<3}4Ze$c%#`Rw}E3^GnBOMS2QO&U`+F)+(5cECq(2)52XFmGCQ{lvSx z4=C5SX7xa8DFuPc856M5SMAR}oEtm|H>PpB1wu+5%zS)Iv&r*Kd}D@oGK}0%Eq+pf zBhzBlwD`<0x2T0BmHgcKs$amzOHjb$Q-)nsQ2Vt&dbLzE$^PGbBBXglA9b%k2`_Eo zr?BkW{%RYVa#irI3Bp(!WqdxPqX&%Mw5a~hL!`3+0on)vxKx|)1^SwXb{mWpI&;Z_ z1UDEeCfoUn#2;dl!-S4J-sx6xO$D3Kgt#;e54N@{d8PqV)7lz@{*0U$BgPgz1Hg$@7Fn*XyOD;ZKvUEhSz4% z{TYq*id(~;h*MakckUdpcSiwHwEDEE>8Lks+TfcgV<~K-|e*(^X(QqL!gKxx?F^%5O z6HKeHLaME0MNKkMBV0j-B74QxngSjdiD>qpBP(q0Ks`lI7fCeU&TW>Mo%~qqn)>dD zA;CD_3at;WT$~24%*gVA^Uc#Inq<%Mtg?SH_wwgFc|jN7znZrF`rQ%(zwqp^^zGX< z?9}^7ocqntm#-i4w(xcx-;2z5x7k;2QQT`o=YKuy^m~KCcW=qxyp_Txzv%~g=AknU zA{er|;Ch_q9-dhCdW5Y{HrG~EIRStyV#X%FQV}YJdk$lhbySGd5r~N&=7vfMQsV?l zDb(K_7=jrUnuQrJRB0(H0r8z%VAIHz8-Y6l!()V?A`4X++4FFyFsk9G#=H;Aom+MF zA9|)7Dp-0{1=oL<%mnCz?NJvJE+y?|Q#MK3>Q{~>hK!`r5rUh?$j(8xo35vISO-JfI*l?qz<@IB`1eEYwk4{@EH~Dt0TTMiGs}g8Ke|WihGI#6v zIxM8Vh;Y+U3#oE;w|V}o(3z<*HgQY$9L7nuKut=NtlBq!j+C$s%cfC`l?%TBr`oMq zm|TDPha6-XH!lp*z?;`%S5X;ZtH2OahMFrB$;O|2ozqVpmWzhiVs%eQmlrlDjL9-^ z5D6~Ol+!11Y?Ec!wBDMmcRe0+;yK2o33%Quk|i3OoN!}j9+{SE_#%7djIEAPV;x9=KTX+@^r4IK?tAD7EyFi# zum==J>d&Yiw#!?HQeHr;peorS6@=&c4gQ~t99g_Gg{WCu8lV#j<^bU3c*~&*$wy{n zYK6-zqB5~b68obTXo>Z_;Yn@R4J2A6DwHF8j>L{7jg<^pk}M}ABNuo}{=OvwoHoEG zk}33h}r@FZM;jXQ(js!-$Ijpq@;gVEK0iV=@xxwm6oVPo0 z=MJCwn7T3sAtwbxvck?1U3n&aVRk^zFJn~XhOoIo#%20l6hrkpX#lSbqd*vCJ&WsH z4^T|#->wJXB>&KK3~ZKbax?M193AxG$KgdNT7DXMKt(MkURUB{fgB-`HXkkUagQhY zV6qfAJ|FT~Wz?!-c>0rEJL1)d0;q+g3E|(|6{uDZJoOz*9R?EUm89j(7CvSq)+f0W zRLhU7lhg@>*Mwnzp>|{)y&E)9+*z(ILo=jA1tVk(3{inc_ z@(CtvX$jKD!^8nrj&~zJn`A+J@C@R){ePgD&z<7CDl!)9->0)d7yxSk?dkqS7Wcbs zkM>;Rp_SQGiwZ1Qq+V2DK}O{yCBuf;Eap*p#iCvfWFO-q_(>_RAj4W{6?R;MPsWiA z=et$HpFW;%mf{J3-X1!hC?6zxEIKoTIe^BeEOUzAB_$x_k=HB|@6EQRkY)QV!G3Yr zF}!k)c*BYcYUmugzu?YQvSdivQpa4B+vjcRVPI=p$TA}3GSoti6$}p&TLrr_3=SVU>qKU1Wo&Fu&fYd@wGF#|idLR*(T`6LeYyc~DY&sQHz*@IPSpUuQc{gM@sKi* zMd5rHzeF#D2?7QhRtN%W*doMiw~>R8(~787V6+9!pIGNSQqW4N>9bIR4h}Yo@x7~m z&wrlCbbqMVmr8j-1+(^irK9nXtUNihM?$#%)TaU_oxQhTbqVN{On!P<*^JA!P*pK-yknxa;3mEKCcMpgpdPLK|Lz zffJkr#zW*Wquen`BWOQ=1)zU1%zD9vWR#zFo%w@^UGYBnVKlB;&IY6XCW% zvKs*m*K9^~L6Q-(L2)VQQ!OYlD$%%Xk~F{?VJWnyDoe#gYyuD}ZrfAa^!pE{9u3um zJXVMpdh?553sn#BYXUycOMGjFbQ*+2O^Q7kc3s_9660*37p(69CP|aEA=YZz@MNye zXAHH=o1f2U+cq){SnT9fJKytYa0>nHDZlOJhOX|`rhZ-qxjyYyzwyFVvW6zvSeCZR z=u)u}TJGM3CPQ1>0X9NbxQrXF)#@C<9W|HPZ@Wu~lVp5MiFjo@cta+^fFsP8*kl&&bryoLm ztObcdxX_|mDbQ;@StCZJAIV^+)eIHmJ)o^HH%uXun2E0gG?c%Wu~AHd z{Lg8cd*n%LD)pXvncL2x#&ZO2WBYfH0*~$;ENs1ws5af-KP{ z0b#pqxQr$2c1(ALV@0-5yu2meCmd%@7_Le}x;5cqA>{&P6*S<;ItqXSI+8C;;gz$L z91q35;C675I2oV-6SPU-dY4;N6;fJmMxLQ^zeN=Stzge+b}_RRb<0T$XK_K~sEWP{ zl0X)S@Xb2D%hYD%umDFzlO>UqZlPRsY`dcKioK9&+^98hjr}ES68pq;#OoyJ#g{H- znG!h(Lp1Ch%BclQD6tUPIKUygP+i4LazFG$g^{uC|2^ZjoxKZ&mC2|nB|L*nam&|U zP~D2|6Du1zp$7R4Yf}lXoLW#xH6hGaD3K2$0ClsD*52+ri#SvM%FV;vQ>PdycSvc- zXD0qXvqYe~tOn8*V(%Q8uQrIFePQ; zIWSVG$*4dhW{z~Esie!lUpA0sM6ph4kyUovD)HuUv_b3-n!zoM35%uQxdaf_;YASf zxceA+q!Wa^{-(|6cummdb-@p>@2!ukizT}shl{(s0Dd;T*!TUsM%`}O5PW)guPE8F z+ghvFJAP}gUAHgLq_E@VNcor-HxG$u<+UKOc<+jHsx`~6XS2c*YJ+NbUa6dV06-D@Was(l06dpNz6Z#BKmJ^8Ki zk@^1g>)S5}rNS8;$p?LmRPdNyE&Ekb2U~#63U7s*oA-;|=ck=0ZNkCwr^1?yk;qp` zEk-H&@Vjb=Vf$5ugx{ui4|~##@NQtG*9gOv&pHo7lIMQly2C?9XZU*ht zFfmUqDBp`YH&!n=b1H+?pMQwHy>rHLf5|eV)Np$S3---|-NCz{MxTpRlULD8pX?2g zAa~U%Z*8D5m$cm9iGInwk2U?V-m<1=wKLOftANN##NZUgfge~+nzBe*Y^3(9I6+Ds zaEAW~K33-UAK;4~PXr7ST9C({n7icRCyPlWS>-W>!$iJ#QgrKN!h8dJ#a0md-^MX> zX(gwmRQA(8M%J)Ig|>}A06Lv(KEaVRDQnjr7vW(aJgRCuoV><+k~s2_q}X0R%nJ&( z9DW_Qnr0N2ekijee)NnK2^q`W<6h^DNJ6m5Q1K0hX0WujcU;zWC0yO~0)+X7 z({)E$BwYVw8oFekpfH2k#Oh**C>AjSj3G9LkEniEYx;_sdoFs5sxU$2f8(9Z_<8`l z%gWyEXn(h4=IzujsG4S?JiFQSq!6KRU5xq|z!ztYk4C}pL1ysHjXTXUz+2ar&l#J= zlRu_bO~YLpJ<*+yOOv{bfp-JSVr*nwJ&`bF8w* zhk%gZrN?tCO&pb&VoESyoRPuMI_Lyj!uB?-3G5XZrpm#DBSWyM^Gfdr|NNPI+!@n; zwR_vQFpq8BJZ8Dgn0?mVwpV*SVK;$sqUv;(U8!SaeM_gG z+f(cgbNNs)XeL^rKN1l{ZH3z#z2{t)?B1+KC}HB2i()XRb6Cjc^*XZFZbGfaknO$( zRjp|l#izqSlXMWBn6S1rVc?zf1!ZgD15=ACR${>hCA9q)lToCihR$CZVk_tu)40vN z;SEFV!0rUi43OfC2t(LJH|5fjKu2 z8(s71rA}yhf9RJlc@jdLJIw$6hsDb-=Yz`ChTK06U955L!;P8aZ`;nFwhI^hLBa8h z0KA23H*Wao+I3`CR`urfYc7`MC4)Er@1#HB{;5UszQ=aPPU^>*Q)utfi>ICm1-m@G zq?iem!^No;2^wL^FU+iJZXhRdsk&^0fBb?`rYZl=>5s>Z_gwRhb0<$0&9|?;xcTww zE#_V~{OMo5rT=8XgknHD*d;H7nTKg^YHoDga+bzc>MOjE?GnZ&<%xqWD~x?)kf>Z_ z1*uCcqCx-xpSdz~5F^v|wzePowEk557=8b(A0kfO9l~qVPEk*fZe#rnZIra2^i9Ky z?Sg)yP3S7SZJR|b%-vF)%|am3_}bR;i0cioT>(&$7kjk^6LM+oXs=&3ems2iXk&$2 z^>tS7-d$O3G=%+n3!wZP!|RWQ-Tq>^4XIMc{BI$_J`ddn1| zYjpII`6KZ1QZASi5MRi`?VJmWM;6sgbK-CNL+Y$XKm^P{3_tSigtASeUEZH>hr#}{ zb!z5&=hv?e)zxulS+QD4(B5k(NtW|ESFsd~yfa&4nL%QgXF z4o^gy2;L?D@*{R)MA<@1Q&4DBr@@YglAC(<@YPy)(1jT4F&0FLI+is&lJ5Z?!`k%h znC_-m_Iho$C8m=ji?nw7>i+6o>rfiRP$Z2zl6$Ua&dnKT(wMtAkWgM8D$dj&metTo zfZ8os*Pwx{A4W)PY(?XJNi40VZ^+l~6cioN1Z%d7Wq1q<@mv+o*JH9-0ob#sLfUnq z|4uSJ!{bE)LH!)bKM|UnLU}gf9AH+WRHEPn>++u$tb)eGDBc5?vvesXA%WIUexCB9 zq!eytoSj!zN%1P=Ui~>zL^GPJ8iS!I1vcUT0E+poRU0-7j|Qu-cOyGmnK=#YdB+(k zzCuWI3VF_;0dx>{gQaIs!ZLgkAtQ(-rmh6V5I9{>v#^TQP}kXn24DnV3`H`eVkWLC zkfDGKfDH(`>)5wpc8&ZyLI@Z0?pv5hR=mQy&NO#HLiQCGw|z!{7}TL8Z0y9^g;`p) z+{?mC7%Yxj3*&`~4lfR7%gNXsU0m$J!_oP%&_*i0Ef^QLXi=?X4l{cc>sO!H8<0)` zz#23Pk)1ii8%w{CI>grs1Sf>M&@aZs!V3buJzJ88YD4~0aPb%Vd!r?*UzGH(`%_|K z=ATjbSu?QQcf|g)ZC0EYjek$eP70VOlFbx~xcshAJy#D&Wb6BKqC0lL-t$bb@(X(Q+ znd{|ZePOEtM~4I{(RdfmBQ^W9s<|M|AzupZ(I1W8bZHxuMl-= z)z+wbyXbQI_DiV@AWLr5x8{&#qoNAY*M8w=*~rKgXIzHC;<6Y|2XrDx(WD7&3+gVj z5rCz%8KZ&Cq7dB@YYoI(<#a2P5UD@Chr!XB@5Z(Y@thD_5|T{I0pWBw@H~sI-H_PV zw(BeK;})7|Nt<89G5M>~7(KtP&s}NwY7heyRBcHI{}zeFRXnD~|}7^MS?wa{cMe!5=h;TJEzz$ny_=RKAg=`1*XJ z8qN1VTDmIAI4QP@^Yd^8^brkn3&RNJXhBA_d>x+^GknH9Rv^r6+ z=Fc$9I24&8@{=h(P6TNf`pS(7(JR!C(W2lJ@!k<# z#+1ER>=OM~!1<@2N1qZeB_fd+CyEbtC=Spe3x=v!Sx~w1T19bwOzZB%5Q+07ZLX|1vznS#WWj>ij!Lu!)!0auSWKJjtZc5i?U8eo<3-S z|EV({W|B=|lSp;&rT3@Ce~Y3eI;I*8jA)`NnCa=-hp_5iiMW_=+chphc#>*k2#rs? zc|$)y2EW}Hy$2miUW#0-RzIc-TcF9Wg`ryQIsZ051WfGh4m)|#bGOJWQ`uCY&@2`v zb*4&^XIF(EW`H8@OtGqjLfPWH8QTMiJvKrJizzqBrbJ`$CX0%nmsLR??p7afAFE4s z=As6}q8cQ!M(wxu?E#loQT8^M=39jqW`sb61fjqT`w@n?NxTU3vtlBVmNhApDC$&b z4PhVEx1*^Bw=OsV!1LpXRfiI_lLVYi0z_E4|Gg3F6py5i8CS(H^Bib>XXH)`GRhA4 z(aXk3tlq!JpObv9R9SUeh7SO2VO^c_w~C$V_t!6rX&(T&U%wo)p1&^~O+uMIEi&L_ zwRjdwOOODy@WQ2@JwHCxbS$o1c}r)|h_a9nD$f9zv)bo*saS<7Pz*A$K48lO`~AzH z*hEEqt_E4r^)y|yX;X8-cCVhl(A3_nYs%CR36e(1_&Tk=vV#C_tAkg%@je5fnMKJG z!aMZteuP1?EajU`DQ1L8`Q0-E#A)M-5dvE@Cq@rC>8utouSN-$IjcfR0Qa*10A6&F z7%62Gs%d2gTAmIt?sg5*EBuz$**1i@i*8wtA8Q()gMy&62tz?s-&9B3OU}0pq2ZJf zj!2(!qt5_xZJUvt07%w(-MOQ6CR7W-gbKAb0#F7z1_3&jF>7kLQ^ztx?Bva#-$RSd1O7?CvSn1)})|&_pmcTrzJQ(Zlek0Ry4xsh#Hds zn4`56FM{?FF(FLr76n+ffUOi03^x6R2r6}iR*#vRhUwrbHn@z96BYkn?R#4rDqfg6 zA$da88c@|7n=6dU0LJ!uyp%8&tsw-LPm+gGO9Hr#?!72@z(kTe@&o}W*D{sbVMw8B zfS{b7>ZdFqgOg7hDyZ;u3M9tXL9yTT0&_RMP~(h~Yp@BFsgReBP*j32tjzMYL{-s_ zBGgbInqd)eiUcMm+}>ERSqKcs%Fq#r1Que%VL>s|bw3fR91>(H2vkMGX(hs4<}QRf z2tbZ7X<|+%o_OkrqKDXgcL1*e{L5Nn3z&%p zLL-t2B$@@%80tgakt)_62H?C7Bv*k9gSC-09fsdn);DJmMjf7b`x&kZR1kMH=fc26 zjE$j@M2eY#S?0+;Lb#G}vv?;l&HmGnF)V~z47(;QnFTH|=T&)nGjS7Hp_EtYvjRn< zP;d=p0cW5^l@rH^a;u`4J2Mala5-LYifvpkrce|{q7en~5{5bz_7@!lQCwt`R5q1y zky^+Hg{Yne6m>gC_>6dO6&#);wbu7VHI+l!865N>S*4yNz|hl154pAdD5=+qI<)0b z#g8sFol%6(`pe*xpA)lv#%;8A~Tq-4|SA`Ge`dE$lF^(hNlh z@Llf;rSYFLw;1XrttN<}e89{i>TfBAjkVM5~j+p8*5tBzTXZwY|UMig#$w2Wfjg+&5?41f_mYS z=$Ww=-!&_nFol}J7}`NWzcOwqH^EQ{s|kXt(O`nuJ~KCPVVtza$wjSL;qxv+lFwbv z$lzcd3_h+Zyrfx63ya9Gs8Tg7Q#A%hO^HQX zdI;lD!Lz#QrLt&S@oAA3A)%&*xJj|fi}Aga7jA~gdcj&%%DT)2PPmEpaL1HlVhS0$ zhj@=Z9(RV}v4 zLI4c(Lj@7vGD@!hrPEw-32rd_y?wVuf~WN)01bNaT5Gm_Q+Z=P2dx`z)M=wevl@T< zuI9!HIlfdX#YYHj!?wli4DBQiuEb;ys<3cK0l$=8B$QU-eNRyQBk!GPD63Ks$7bio z%)=7PXSKB2m4t8Y@^P%U@01Qs+Us&RbQug>~xzg6h0}0iD_Aky2Go+*D-W2hz(Th>#>^2D` zskiG2|1`g(k51tMIet}$e_p!1N#?oaZWZTm=ogvRuLjsO(t}D~2`vEPNhzOePdmH< zDbESZt*O^eReR;A;3Qkc?GFb&KKK+WsRYsutADXmRCLy!#_5*3rQPpSI5nJ)i!Ahl zZr04DD93oRYL?Y$HmC?uTE>bQ15vI9diM_U>r%1%SD=AM(dx6M%O`_YGk zTu1T;{ppYTpmOYT{e9uPF96tye&+>)%_4(cT_(ut*klANtH7%BAWKN~2E_-+O+jS4 zuwV%4LW?YD4X;WtY0+X9g{JkIgy!jQX_r+@iVMABOg$yKhh5?^UH><|_XsZa$zHDZfwr zE=K@>MSB|?8KEZPiyZ5)hXlcLxH@P2QE^pn;PzN{LvFD)n*2OB7o-vOVW>~E!RQ=c{?)@PNPx{Zro2qeWqjz88M9=&H z;zGX+1-}}aBuC%LA4br)t0ftW7Zt17MtmyahpR_Ea0Kwp9}AXefbo#SkECLTSHI&+ z?O+32I1yfDZ7;IXzmhOSyxV+vBKPJ_Zn4oif{p066iKPrGtG}nYvS2vdY?7Bi!z9( zUYtxw!S%&trJLUL`sii&Uk z1en`A9DD+>HCkP=So&aX_F+UY?Sp=$_m`qhKdeg+`w+eQs*-Q4imqLJKCw8$v;9to zD)03U9W^L5zO;*v<6ny2LlBu>_>`&-tndh0*`~0=Mo+|g70yh< zm?FSVDMf3nT$j0BNE|aExTT4iGDgH;rqbW$&vLLuwvN`rjh!-F-|XK%{7SdCwEht! zb++}ZGKZ~}62v(-wL%04Jc@vUC~uPjLfn>R5&#q$j7#DRx)12)dq~GtIj#paY%u`L zbJ3|i8skRFVWX9rmYEX&athD}@~(J)@Fapawp=VViv;P?vd1et z-T?>-(f07}?ah^gtu;>_a=BB^w-D9xqvj>Y{rJ#JR(O65mKe5je_yggg&-V{7PW{` zBVEX-h^RDatSq#9|2xSegoHlu4ML>Ntv2*>TqE8he`))Mx?+v2b3;9;ajPw44{uDW z+i6+bb^Qj6O8k2-ygZ9yeS3Ek8@TX}J*s9e3qqS)2Qv|SgcnX-QshC-9^I4>PDiI< zSvPJXjm?vT%6-un?eB`8%qg%~ibh#}NI=*vN{4stY}pFiTb29$adBqyw!c1l{W`rv zFS`BHjY_HmcC~>~2#8v0sFFC0OuNdz_w*O&Oy)8xBTJ$$-n{(UL3s7my)zgLr1sWK z>i*V??=JO+U*3P0d%6GKyRW7P#rs3A91eJl)I1S<3uS7RrkYEVw%lvlUCy(EtgC+v zLmneWCLR4_VXp7)R)>d&!&zm{e~>=rsG^Y;%9uug;C)MQ!|(H2xrJ)0RY%LW1-;lU zN}Y8VffKI77_CX!YI13Ek#JfcGq7j#+dCrV$MnG=Lw+%`vqYzk+q+v6j~aqeow#R4 z%8-p6Xz!H)(%F>#z_K;BXbn9oB!H7{h+8*Er!LQ#oUVFQwUgCFeGC#V7Nq8PN-UL& z?x+j+=IR1z(!=R*&U8z>!U^(|BOM5W-?L$bg^d@|AJsyZIUR7C9aam6bua$bWOFW` zYK>2O#l7N~#kw1N4^q92`u@h(_VCSLqciuhw%3>Yr4g6)I{Mc~{No>p!!?P&bV{W< zoq=?+PCbD6+WaSg5&}-VbH4S!q|(DmjvdW6f1U`+dA7Vev&pb9R~-nvhxY3`)hdM0 zcxiPVz#Z-y9$%SuLp#H&^_B5>CbTm5$;{Hkm`Rb@J59U6s5%uA@t6%R2@hb*TFB>I zdFAHI3ztcE&jV~+!z4=&3n$qmn+ue7A&^O8t-HkYGs=$La7i(YudaDFT+-~9M6IP% z?FP%eUM1rBs=uTE1S7WC8SzTgy(TtBJaE90UM)T{F>{?jKf0KGplS$jDgUXjMfaW6 zy^PbU6VTCnbggyX

    -Hg5pn*k=^Wv=7`1700%n19iHtTuE1SnnkkNNw`ejCYwaA5@4H7J>ioS(~3~VT~(^N%(N)B zusQ6j7VbUBghyLDJ1527<7>z6RpZY;Q7wNLh^N9Zz=ng5Pk$~eQP8M*L9H~;sfpNF zp&x1i&Qz}igtxI;U}btn3VjYK5*_o*`m15=;=9pQ^4y_b+<1}*g(!F#TEC7s6gn56 zbKPqdIm1qVe13_EP8`jCcG!7Lv42|tV7$eGoF@oxNQn~_{U?prk>P9YFbCU5-&rZw?rFK*)^n8j2Us#Y+ z=-bqyM(P!trDPHwO?(&@gJjXSQH=EOi*n0*sVoT&%VC_OVc<+gK4x}$TATf z;qKVk_n~B_ZX08x>afO{*)PiVNwVM+0?9T}qA77#pDzwKOFz6}BKG6+WyYjQ{&>Ip zFn}?wIn}Uxx)n4>SNG+TQ7qbbio+7OAUv84o^@9GCXKR6MCKmpN(66jKD2ni@tF<5 z&Q8Wt!-{X$i#6s_{k#oVmX3%joGxWh%wtw+3F6~NOep+6cxHokj((Mk$`GUH=6Q}c zXO-xPs0=Onpp}8QeAKBOp;M!4PbJ9y1R=&t=P>Ak8( zS)T>tW9Qgj6Lu-w(wv;LEE{<3>=>cAK_#g`MQnA~tjS%zMpk)cx#$)$F) z(631+ee;2D#X3-glHbqa{KvC{HqY8Fk-Y6);;QRvGy9uEHuSp|w?VPwo3G6DCNa+s zvRa0gVQ75cFQ;guz)6wH5FR~1PeXyao)QRX%ABvE>H78*251-n6&YM~Lz$I6b&2*m zMSQ-=caYb#LYug9fayEcR+7d-io1W0aDQFa6#U+e1-JtQOufN z6pR${@tLjRl3N_={s%{|4|7f(_+5Ql%Z}@KcCPU=Th%f4`%)> z!6a1RTSnk@N#?WIo3HhvQ&OeuwPlW;z3X1J(ok%s7=pU9+A1s#aQuS#;#d}wm#j|f zrT2D_mI{M?$JyjvI9d_FW`5st(9L6O!d8UKLx+Q&yL@6+bxDGys%lMgv_z|=_k8(P zUj;_JK`Kj%uGChdA^@d?CJ+RwGQBcy(|>q>q4Q?F=Kel^rY&=rOq&r)7LSZw4t(mdH)PHR$cE&sQ+>Iq^nTlXMrGgF16x;>74B*M? zp`*T!KOQeE&1|mon&K}gOC!3{)~8c05PCk9CS2JDFDvQ@vCFyk5C=1VDXPMe{fsw) zYmOt)iY#zEJ|w-HJ3S;r{pnK3MSj5*TN$Jp5Z}}u*j&Qo^eOPwPY1w1uxwZNd)xgp zqgdPn$v*JyTL@xWf4hLo(&uimEEVa7W4i*jE~{T)!)%1CV2joNX(3t~@#AdQY$sUr z8;BEoGiPF~M50JH-78w0g0iw3$ecO<6>b!pP&Rf$(PrpXLaV#69AhIAXFp=Pi$h{? zBIPfWLlEvIeC}_jDiF*YCTcJvv3fT}-DGkI#zKYaM!<;fP3*KOrI@x=*q~EBrIkhT z2AaN}N%zLTd{!=LpErHer~Nj>LI?XD7u$yhpQV=E zj-cv`YaAC2ct?#q=v+MNW-1V`z6K$Dqnrlca%cw;(};M+MZ&%u2GM;w59aVn=V735 zIjj+Q-o1a0G3bY3={Re@a#M?md;^PBmp#Y?o{GdN&SGqDh>D&aT$G988)*71xJsoq zW{_g)+(cSoN8B{=>);Ra29jCH~@?RVTFb^6Q1 zRsu8RpV-y4-$z;bMWeiQ#71%h75iDc4{Tp_V3&0F=i9$lH;4M}XHf8|9`}W*#I>>E z$tF5(-uG=Ej^c=hP>%dW33m-A?>MpxNW)Q|&-~5FU-v0?y-=i<%9E4jR3RCrxk}qY zb;xDrk~tXOh?8~n z)`p6aO0xL}qFnm%d@aPqkFPp{KFK^yNi?~@KXM`{id~~&wxXOacSt))@MuvR_cI~? za3TPXoyJOEoD6An;rA3JGTinF&eov@R+4C8(a)vNq_=ULH;|dkY7@#={yfx79uOu@ ztqYWJ1x|TNNoT+>tqj?t?zM>yZvMJ2UcuwB$gFgKP38Cf@2b@7NBHApCM1b$n=2N6HG{+skIdWe|);vYp`z zb7R)$)&$OZpYmO35<)uQ5FEsDSoD697+{4pb-`HP9SvBre}Vkwx15(OTI$o;ZE{TJ z1GB-Jm(TRtEYdg^!k+rv|Ce-@fGV~~wXQp%9G{oqW6m8acd3L>>*niqcyCUsGU0ei z)N`L0Ilkb94&$ByHjPxe`l{8wt~YJ;q^71Mr$E|rPS*Hnygh=`XsR*zEh2#-(bE?2 zv5dWSQD~W+m#lL0z^Z3WXLa`szfd9eTy*5L3Moe>d@#I6T(@`$upQ<`=J!vAR{KWqE8jrYaOfz1EeUpNaz{wK$N&5(V+T|b+u<6@j^V9fU0n$HS+ zwf#8OJH;8;{*CqIH%Fb{d?TxWusS!sdI{j0gM94*kWUtXD`Zwnc75qq;v9;ee`vX4 zX#*8EL``Jj{wWB~R?4~FX%8{9C=|OnCMGPKgi7S*aa+4e5tyP9Q9{w{$yBm9w6i0J z63PUN@U9uuu_KzHWcNKD!t;k=IX%(g+URJbanEj7e3t&%ArpsBmnW#H0pfqOKJpTW z%u?B3U#4r(L|r2rS&2T9)E^1a35X&YnGZ>+704Fh4mZRTEsi z$ClHPZ0Z~_nZX@;g0)NS60A!LSCnMxmb$-+Y&jQU`RS(tJ6GA7OvoJR6yvcHo+>8kzx@Qc@l=4Xh87v&@il|NEkMLkLlQ+UONMGL61 z-;O`kdw8ct8Pj7RIRjA~f7`ZLFaQ^^n^*)vuMh?U1gKI_|cO>MNsdb4`x$dr3V6x%E{1nH0P+ z2=Th8_~L!|^;eYJAu1R`FK|j#7e)9K2*{tD;-jC{RD*6Zy~bh+Layeh3Vr9syr^j> zRSW1S@?42rX*&gjL<66)a_0uCb_2*u$GiPk$Vz2MaPGgV@vl10VZMuXr%uh8^NkXj$lIDz|^nXQisbQjOMvbd{*) zITSQ2_g4kDHBbCKi}mijh)CRDCpOMi-qHw~N*jxP482pnXY(((q7n;o=!ky4^eO$3 zPWq;Wg}Lz}OhS_JX}V8#tK8(UgH&L5$W51RK$OD9D1^nB`!!$}+I8ei+F=iHJT^Vn z<@&S#XS2VJ?K}T}*NF#^u>a>0KFcnfewNBX-ktSMO7?b!$i6K-|B-xQQxmKNi&$9f zO54h}lFGhHnfk2gsOZdSJxlVrEJ+o_r)YL#!ia%ckkjpToJ;`B%*`*-Q@?7<+b z#V;r58=tGMZBF<=O(ecH&=y-{iwxAof^Wu(7_}Y?;aoF~rnLqBL~?pvs8vlFfl;Iu z3Q?q}ao6$VyBOOU2V`IsrkehlvePxCL|Ky1J>_G!U#5Ge%Y8Tavir`!?FkpSw9RZX z%gsB@;4)t+;j%j&`B-j!9o|dn&1JX#JEv1)17{@Sm~w|oVit)6WZ+dl)9r1Mw(XvT zA@hp;#)?SOK1vBbT-cAX`!R9Fd9-d$Q5n#bG;S)Avb2dv{RH|vkIpcSapvMC2_s&i z@3?TNW`$`$w_hvZAMh`#VWQ1V)p-K!7{a@RH#poNIDXu!mAu6L;9UzmMHytWo2QDR z1oTv6jwV#-O)wPQd!X!fJ>f>8pf1W=b(kg+qDN$ra{x&|w!iz7Y^)n+ZJ6O961Q2$ zAa+9L^uG|cJvRj-KO%Tn@{Fh7o@U^V*B5KSQ>MHZyq87X<;vgTM7Htxr2c@7>9fbN z>(=uj(IsUzG6w@1c>m-b1ZTxeZZBdwd@@HB$HmoESS50M!M?vgI2V01fBdvzEoZ7j zPN@TR{6#i9GErmAKzi9*{6aO;9&(v`Bw8walt#9^n?oc`mE099P3HWR;znE+1^qN=m#h%IKAF8B8IIaoP6u z{NZ<;B;MAgsj2tN6D~7YLKa~r9x!d5V*Gy?LVo_aw6x}?T<~S}cvGd%=edO36)mSh z`OWde4>`-Wx-3gc-UeP?Rgq0{qg=5)e^X70{7kGZ-p|Wj;rLUOpFAij@8J6Z(V+4w zl5tQ4d9rJRJR_WwGQtezuuxM>NQfr>pmUu;&iWr5TE=qm3Gn3=G1y){?%Ymqj!z_> zzi27rXmaPQIBJ|{yNAaLrhi1*L?*X?1??J?Z#a?-R;Yl#crskOECXu1vTS@=ciJ~1JvG}K4elsD{gz*`tra?b^akzqL%B#qD88eGFu3~ zjMoa8Xsmphcuf&}1FsPZP1alxF|ZJ$Oa|d>A}t|WwhR(uvu2|^6{gfEX{M`5q(#kU zl__;f4Oh9S5p_TJCImZtmZs_2(4p)Q@`%Z)FCpl_FqMTZ#v{lmjr%}^UA`jZ5quZV z2%#toH{W$>c=%m6{7(4IKIR|linWTWvm4`nkWElEww%#?}-BUO$>>OmIWt+M)WrasawW_5A@nSm#*qrC;s* zg|J$;(2_g|$lW_Okkp5kMnUf%>>&%MH=}&)SyWm`e&^_=ygSR9DHPm}{N%}>2X;8H zXkAS`1vWrkI&Mogwk=DTNOgG2?yeUK&QMgh56?6R!PyV1sag!E=$#8(`acSULpebY zzpYxvn|JQ{r?P3^#)5;_e4CJ6wA_WaqOZ{?Bns!|23`6#?ug6$5btHHzdgwb8lqA@ z8qduWeLphm+ofEugQ&U4{Au@BhFDkXRDZw0H_tv+yXMHTXK-}8K_PD;|^5!*wa8Ge$v6;@$52Oo1(7Rk>a_|kvgcjK21z)vN-8D-hY$B_7P zvsPuOP@^fB>V_z>%CY+9hk6`CnB*$gArzODD|!wk7-0}*BpRs*+!JVR&*_rbZ$zu- zo^E=&Yp&x*oQgU^DI?>$C>_eaH3vbT7mKE3!oOi(bhvWzKf~GuKQlAp}aki zNWUTF019>f`ff28JdUM{{(cbZT&5j2a+_E*rEHYID`QEm5+nrkPH@QuVS{yt-@8bF zRIp=DeM_%BE;m;nH>1EpdeLz6;c%BWI3pw2>z0g&7leOBMbwfx-tnp4V4s`w@Ufkt zI{Bi>Ew7kkbw7^OYDau7co#N#ksJuiM$hf4=A*_@tLjuvq{P{rV6`^EN>$Ff)uTYS zG;Ua`ik3A%+N52rPYX+ntI4(+t78v!H=8-`5_b;!ImzYu!R$wpM{G6?-@bf^-Sm6$ zXiEIBgoc)_L6c|ujn7!0kE10y^Kf;L!As&Qs`|Mw-eNHZ`Ga80%VaQwm_iJDRkjhW zhKCUwkJbCddw5i5k;W7_LdD}V1ws7r( zC-p4h?Cfu;R+1VbLlh@|w{m+#s?Md074L*|?L1JrdbXggEx9iyvLUK>*Ilc;FtV@V za)WQX9Vrg^JC?W(qVXK-x zcq5`ywGsHtyb&!wQ72lM>&J5c&RR_wvyAFbnv6FI6VOnsfCFB=-A<_g1`Y!@E_Lmn z0>X16@2qA1-orz=@&0cuNVQ%&wO_W(H`4D7QBd_HC-n5L!SYEY{FTAe5=l&6Na$nB zMDJ2I&Xg;csraeUv-B0HIUYRsUv>j3wv^2zI|1z=Y-4aj9CoNp4&mRiQ3inv)RW*3 zigqZ9@Dfwcsi|Pxczt`$g?i4m3G{^ohFcI`sB1vo*bxJZ&g zUCfhUl5+5RXU6g34-k$?{Bry<;x@-OtEUXyk;(I?8lTm9IJ*75*Nlp9nrNjp=c%LMjXYX1Nx@H7SV_T`W#7CB; zzN)&a#^ooKzFP)-KIs*)X2sNmwRvt4IsWTrP-9p5SB;GyEu6k9=$FfJbRQBBLH$c1O8f98!x*~?{Yqjz3x0V*F5?uF$-PaGxUQ7R zzmH`s3C&%5Y}Jr8=}*C$jfCp8NX;KYUj81Axq1_!`^*%LR3u&JNa49DeOmYqif(h) zv~W#Th&pVpLOEWSvm&N^tyvhao$V3kF`{3*OXYbK)kZ3y>0zs*SEMQdf;$m^Xv z@xNcuQqtqIP$2@(EFfDR?k$M5#%T@O7!@OaS zy9j0oG$PeR_{*l5_lJB?X@P?hDcr=S*eH)gcdsqzZdbF~Dl-a2sL(s;KV*h@s(GOG z!Bqjx);WIYx=W`)MfPs?t7 zZR$)L$8HbQx(}1(=_78hY-LGAL{?k9tvAT8{<>O%SC@gp*XUv1`E|8+LsoilWMDff zcrGCK1x@x~XKrVBV`1w>09qeMF6BB6Vr7OvRU!`R5m0RE7+MtAnKdb>lGr{r!|T}8 z;TRp`wfv_eu2t5s! zxRlRzODk}6GiJQYg_R;mLp2pZgpaMn808HPf}>uCCbkpA$``Ky(b!Tl*EMkWGN6Q2!$62^dE&PaxP3jwKe?F! z%c~=8nhi&fACZ2Y;Yvu3x22?maYb5#;7Qxqr@XlZR1A)*1beVsqh~VL)=B1vrkFXM zAR$Wv0XVbfq-P(EZb?;yL^nWJj_@ihEX_{?s!n8iQI>0roEyLyOVF9Esp%xZ87av_ z09NEQz#y_w>6*21Kn3FS3X8XSWq7~z&hUEW6YuRG4xj4AGH1UgXK|z4Iot@qcN8d! zCrv7rO)k>Tm|0U+&EK#|)!Y)xAGL17DAgLRMETzcQ`cF|xMp<*vOZhb)2qpOu}u9_ zywzEwJ`6gXyg%7Zzn+VVu(^4{J%%C6`hHK>DeFRG`}$%->w-1VulT0XvSNiL;VK9g zNMDAcO<0Us4Wv#L)NG>k_?#Yqn6fs=tZ>1SS z^m%!DTJkSd=srR@oQzR~O&QEbP9}T+^dbHNWN=u^Q(s!t5w1RzvW>iqK0IT-%n^^QX_kQkL3Slbmc=l9VXiq3(b||$4(GzE9-Va$z zF^@K3)$E(8sc2S@Nzc0IrChQ8HZ>!E>hXXH9<^cr_oSkVlVno$jISHezK7khZ`l7v z!;4_Qe_d^@fr*XMqRMWSdE~SV@OD)?xcV7a9v|_yZw5u#HW=QHkwgEZKh4(SMjtV6)1 zgGu%2X0gB?dBR)N((S)BU{>R~=R4F;GnDDZaVTnK^Hhe6M@};YLV2=KxJf7*rtX%Q zEs>!y8EIkC21xEC0^1GFG5KIzsYa8Q(b-cR$!hmhw%iOW?)gz$ar&av5fw2YX~SR^`*(J--KgVWdLtRZWsiFC#&W8gY~sKVW{-YQ7pD+R_3h zt_mJyFgTth7;5t`b$GEM^NG%22p(mz{92mf6N7h#9rNL6%|T{G&9~3b!*|>9DMZ~L zcp?5r9MPJ-m6_SnkC~l#M@!M5o6!jPb`|eG5WjqxG^7qJ9FcJ-pirAKr_>X~uq7x_ zR(9j`LHq{%wc};JQXCsAX$h+_{8-h?J`(zVlZfF%DVn+H4(q%aIvgEDlOgpKggs9` zFyhl~&(VkmD#QfYS<*}Q2C>1b751q=2h~~ei#}Gf$&5-0nWTJL6==1?o|d7)`Vb?! z8Z8q<&$aYpjRu9naFfGTZ-1va&hD*h)zdq@S|n+o^2a!qbqdRkD0#kVZbApOQ!A8) zkl5c?%hO*F%Z+~c&p;9TBm@pNUZejnL zY+5>BV(1<~`$N|j2?D&WC!UGh%LcK9jB$6<5?Jrtx1)UI!t3Q?X(9gcH@u8D3Qzx; znVzw+8n|GG&})yzMr689hKw!f+Z&NfQJ8d2GlYM^57CO(5OYGzt3$> z0FBQJw$Z)Rb@T52ZB`C4cx8cdDm6EaK}eW#vfxQ`hNeQ3==}_g?C~*?WukXGCpw7qQdV zXLaYD>O$7H6>S^+5AOHL4y(z-Il({~!^)oe?D4K(-SR5muefmYf?ear8O2)}uz<<5 zm<7@~3E``xeY?r-+vlseu;R_D*^E0GzbnMC-<8Xj&kLqtLg#!7&UJBxS*CM)LwY&+%QsNj&cuwBO`jA-Rj(i}&v{s;<8?7|SOUQDd%S z+`i}3YCaG#f58T)U(?xS#BO|QxjRrelae)soLO**kq#esAPnIXR@gbDy7HdQnnw(_ z!@I{)YQTo7;i96UqT*qi*HG`S%l~#6nyPTWc8Un~UsJR9eC<5gTkx#a@y*q-iH()k zbVahCJT)k;rYau%@fysh2vP*}t_KEhOwLyyq`p%e-?bvpOO4pWTe}xFXV!ZeW@q2# zt)=r9lmxnG>LOCb{zXHB#hQqkTCIN4I=wa}si7gsUO(MxYit60?i8t0;qHykFA=s~ zi##TJ_ip;?{Y6D!=>=w%lh4gjF|p0MEiv+*w)TozS{}}9DUGOJ8oLN!OA zr**9lVK(>e$f8cJy5ppeIYU9_c#Du@Jdj-LkdPVfk@Kn3S#kGpya>V9N3npp0%hF6 z5LInBaR=+d86RuUI?&y1)Q=d8{H3=flS5{loJo@?{NKF*!Dv=JWYyEDS`~psjl#$$ z3Wzf5UI<58l1WC$UaINUz)k#D_>aZc9_PM22aGPEFGnu(~Hs?6ve8G#>@&{5lZky*R0^n|7QE{+{n za2KVl$t~dVbp;!>j{pi3l{{kTKQ{^>Vee{~qwnfq=;VL`R@K4oS02`3;vxQle~vAl z?OBkEz(R|l*jY>i5oAzS&y4|&^ic?7*s#9alvok zi2-(dRbXzbB6sIA1MGRa`3`vQBGFg&G5T^bj{tDRfR4QgR?7gkI3DWi9svzsJXSX+SoB9-<+Wq8h;6j*Tc z8hM0e{78C|Pp80!DoVCG${DKHIi@CX?A%?!ez^3kZQrH)8dJey1hbC!HW-lE^E@s` z9tXPRBfYXp=VPBf$5)w?62&ft%VXXQw4Bz2Peo||*qgtY$sleUPUWVYew5cb0B}d} z)f|y)j%%Jxkoe^Miy=vbZ{pBc<&CkM*aO@@Iy!o@>Zfkg*Dk6&mL~)`=v==nB;4cR z1?I|W)9a$LJcA7-zP|6Z7%s;bm!|$RHAzseax%guA2QiQh3i9e=N}i?TSwMdvZhm` zfUth}!ez%t)Jb!Y72sDd#FAf=))?udNX+awdXWD<6F;52xXpSiwcE^2kuFmHFQSi1 zM7ER9RSm^32RvMhj~+Ahz|fq7AzDpQen8-1BT?zc^iq0xD!86vqPW@Y!v z_ZkrCwl`v(1A)0Lc}M1lTKRhvL59~kM|8W0MxxASd669H_7C$Px5&Ki+P6<@!GRCX zce=;wc|*tKrv#VzhCB3J{meOc-6UV8O-4NXWj$r${ZhI{T|-kfRG!dnTn23F|NJ_t zgCbuoDdg1T~@eRl-kHd^6g%U83_4vMPHeW(V=#lT$vE)mU9xI4KH zMS>fp^J8gw)8yLRKxoqFpuv`1KAzY9T!V{;P4RMU@#xlkRdL9T<6!+~{)NLNY=9!y zzA#p$NtVbOjZEBFWfH0mRxGW&=xL0Pu-hXL%ye<>+l&BZdVBl6CLlc|Hw08(Fy8F4 z?NKFkFU>BTHUIC($2UEYYfi?Uz6oBhMq>94d0>XY>?w>b zKY$NINLHlo&8+2CyqlXNGu0sY%3zf%mJ_OTGg;iFAxpWeOgj>&b_MjdbYwhG&!_mK zvFx>EY{cVEEbsU6M0#x&5AR$)5GX=Uv85ROzwZ_+L+Co@fY@j+j8GnuK^SA>`>7R4LLhFdBS+oGNIY9FJqgzQ! z8ugoWT<((4C0tzRG-C;t^Gp4`ihDEmTIUE%xtmh3++XTLO<|?KsQQ7&W(9DW-h>&wP+u(BER_>Vc8-xG z#ds_}W&t|dR*-~liZ7d)BFCh6+}L}Y=c{q*<`gdEloV?jKHh4EJF94AR9y0`o}bO8 zEg6{^>08YvX!C?NaB4iaXk-+2CMW4#xlX=2m@W>j2p|`f6_7#Q#-JUbOS!|9P|bDE zdo207fAji+!N#p0^h;E)|d$u&m|eiqefC8^N#jWt2V&f{169p$Nxm$;XaW z$dN#mfg}t_%o3B?wXZnYhSM9#^^z&cakJ}`Yt`_-9sQ18l@c&$?{bd!ij6@zoK;At zi>)`H)>XhhG}?SeeHg0Sta2@ExNvb#R_H5|q0hw2hQR4lg;9#4JA2RdwSs^3tf4cS zvIEAI-wEWweys%em~roBZIq!mNteNf;eC@_>ka1sAl{{iI^-J{Jn;KA`yVkxI07_W z{1S*V=5;pM0RAk4e0rjRL7g8@X?%Lc{tPjSf&@U0{0R2`>hfmbYKZBZOi>67;BtS1 z{6|-Qpzn1b`57taISD%#9bWEaiqyLb{wu~1J(FnA_~`OnszBX`nL2lIwH&A&vVN?+ zJ#>RX+?tU@Cdjg0hUeC&o~gcq@pTkP@RUk`Tm?c8C`$@VeId@%uFZD#=%esxPh+*D0dXvO+Y6z41VUMUqXX`pDSck^PN!|G{)usAsunFYE|P^mgBz z>^r@fcxnwv*dy{ZUHWgyrOj^;uZyQM8xEblIZEV(SP;8DN4FZvd4}`H|6}m;O7FbP zzf+~sVLIxLN29mMt7{A=>4)Q+)phl?{{3La>rE7@5QSAe$c3Mt)tZ^e49_S zJUZr$z*3PI3xR~84K%yza^SRoS@WiUD1ZQs?wnTE6spD;n?icpF?|@Az+c^5>S8fqP z)&f*7L;R)iUHdT-Q183BC5YZJ#|r|)InA54sN)*AmFnbuu9d&`X1PLK3z9sqh@Rj%KW```sl5 zv9lF$e!JO;8$j*DbYABtaVOj_4B5YE;UpgKph5qbx%NC~7kBbJrdq6mI|k`%c=mK} z5_>b?!X90Kz3-{ZhS>+6^T5M412b@@|4cnaug)|SiyyDJJ6;L- z4Mfe!%{AzA^ENzBZvcgLhw}DtH*+rz6?;%|UfGfh%;v@ahuZ~iC2cI-^REj=2j&(& z_+Y|*lL7WJHv>z>kC3i--sgF9C2c>$7nC0d*RrBPub^gig|t{bG}lu=;_Npqr#u(Ua#^L_lQhVx-`!Ya)1@giTCnhH9@(Q z5Bc*S8A$Cpti2Y){br%P^@^SJ-hAfeKVx`9XUdxb2y5s`Pu1Qbq(qE2M-KPB$~;0J zVY;|?P9=i*IMc5*F2r>oaZ_|>uzoiUeA}2qnW(LR+7`us+R6Wa`&k`dP-0@`--rm( z<+yj#)a==+2_e?x29Pg}!~6#BFO;o$&l}B6Qbt?Z~qtw!Gax-e;zQ zI_fw=sjjFzjX)_iB_qiVYCxHuGRK4KL5p($i&yMW$;% zW%`nZ5ubeeEr&tPKM8@40)lLj*`E{qcLhA~4(JVp=Sew95@sq*^Wh@G)(k)isanc6 z9cBI<=yYQEo_R2TGrH@SVAz}ylEfyGvYKSo5JM)v>u`@wTh;25T&YfKs)~zmoMz892UjY{GsBZ+5)2#aG^a&G z7}K2beN{R_c)M{o+QemFbZ(=+dOFYr--hE(%=Edm0vBs=@+*}r&EH3s$o+*xI~;K0 zyA_9CUWoOOMdnL6XDV$l@74wNRGJgR@v@aT#d!P9AbwHz<9-&s`hHyQzu4M$lo zzlEreD~{J=0wr8eQu`_C%KCiAj>0UpOqjjq#FJ@Pn}0y|Io$;MaQD zI26UfmF)~(QiV_Rm$6yqwx#7w#wqNYle6-(gn+KCjYH==x-U1e1by~pFaI4jL;&ws zot;a&y0+BSF72Ea;mFqMlJvSi^>K;LOO+T)`Dgx%uXxx-$I)R3!GnUH8AQdpD0AMz zjvknib);*Uv*5wmTH79!d;b?z1V^|jMsm7h(7{QZo9(jlgfo-(U;u1{bAM|XqesqK#SPLWY#w( zlC4k%v`#h65eyzvTKr^o`PeBshR8aXasIiAGczJKEZy0*tlguU7cez*9F9{C(mrG+ z6~jPy-|J=Pt1U0fKSz~BIGbuLQI?jVmPAr_vlFu}NfAq?Dc_aKCyel+!_WBqi5*`o zA%34XDHN2gQXHJ2K=yFUP@xZ(`6Y^-W}_8AOc?cXipdM2uXg0=VK7AM~Xk<%dyfe_N%gZxsCsjk#P+YejmGvnyFxo?m;Xk2N5&Ouke zE@0_$b6+EJ(YRs0Ir(F|#PlL6BX3W+UGS~MKO=X~nu0X&rTg`T3ypoWe<|+hJv?br zF!o8VE-jLHo-3$?A5v+kHiv^P$)5eT4L4o>QA$Cs|ycAGG%T3W4L zrOL7d{B*5k7^|H{>B~7W*ST$#x^c#_@4n0Yp|eH9PVid3dd3)}a;*Q`IYQrhI%#sN z0(Xl;SZ{=gT-^MNQaP7fk7Mp(glVO3voMU;iC>MH};Iwp?tXBucD6~O)Yjaa$VS<_j zjn-9Nn%8<$Jkdh3`lEz<>#$?bpSMy?L8_|f3&`E=)aVqFwdbi*2vtkei_|a#LGA~` zp(<-P+Ocov%oDpmhOr?*|3ywUX88sV!NRD?30yboKyBP>U zyspYFDN!?d`cNL3Z|U0H`qy2OdL45k|DCJFb=pYduecdy;uB|Kx5|uT6^3rO3-)0Z zXaVHE1W}Got}vl-(Yfy95j{Q5|0bP?0u&k7g|4Pi(l>r;M$n{+=7ZKxH$g%`0C1w^ z>P(YPjA69~2iKy-5Y(E%8FXrWqI{RMJhgPs+PA6_4rgj&%PezLc!Q}pElJ;gGOTP_ z7WkH&Vv;j0MkO@$psWT9S^gWf^Mc_}nMQ`#CuBo>?&?G$oeJa6aB>v+W(8zZIh|xd zU1#wkwYoN&lx_Wgc#_%BA^3fDd8sMVk6}eEp{_Cq`O`d^M)|J)e?0?A4m!kEvb-XH ziHDu^77I6YiG6e2SDQ|HhnEH}ObPp{sNsoD7^QM(y+s733PEDx&ZPohF!6?$hSmhA zg|y!Xc2iKxJ8AnfT!u2Uvklj|yR1$}YeRPhSVIQ*`O<_F4kzYU<%&Z=P_8Y?(}Mbk z&>;$&&?X9PYjzn)=D56)G5=;}(Y)B^iCc!O?gr=w`wMZ-hfm+07+g=@|J0vRHZM$U zEy^{mV6XadIMvYH@*!e$Gq0LiySfy&o(L+Md7CQRJ*hQYCl(4oaNgXlDeo?hc;=aw zdMxH|p~oVtE^K!&NHBM{Z@9&r^dP(^MWcKd_cWmr%>X0I1fwFGCvp<%OUQ0dvCpcd zd8omSTX^{6RCNRRGI~KE;(mtFz9^FTOXI=4xg5>bTDdX)HXnh2*qsEZDqv@ZfH89G8mHT3b@nT3S=dv20xwi_7LeX?m%Qzx8Q$SjC^j z*qqV8$d{kOX3r1&bSpBqh8Zo*a`G^Jgv=$6(1*#2fAmQkD>uwB=H0v0uHlSu1Ms^{ zpNWuC0?cB>&=Nt;46lHB5&Tpi0rcs-g_TkwpV7QL6$29=lw_$Z#wMd zd$eE1e;p0ueVh$WW4YY*0`WK==i%w~%aV(|Q?LCE!;fiaaxab(T|BH-b*k8@ z2&#>1CE4AiH$v5|(0U&^oN7c6eHDk@Mq={pgx}I_)yfMP`Or7@|AF27C61yLzWt0N+mraY*YBJFfXeyu^0S00glQT{o$2g4i2~vW6fz90rq~xWE8@%#CaM;=$@jym?jJax8Kuk z_iph*O52|)?swr9q0lkT3B?MWLN^p?tD?8)r9!jt=`rZVN5ljAkaZ|W(9TrN zR1DIC3e{}g?BWtaB#OcEjc$X2K{r)jXSl8YAE_Q&*WU&7jXra|iza*5&>@-Xd9IJH zvX`keUalledR`CX-jXCrA#XJmp@ z_`NKMFWSj-MCsBX+4tbH_o8o^$nD{$x3AyQd~@4|ZM$8G6#z+D)G+W0_9O)Xfob&V zF@vk_l+$2EcyQZ>@u9WbHymdAZGT;VvKx`tJB%N=nL7#n0)_LO7H#%MIYo-Zn(9IH zJm+k11KLx5Jb#~S6iAz8(400I?5a6XJ)hDmt;=1#6>pNu>biv zh)G8T!*ML@5ZU5!7cLiNWNupKkLu#|5s5?}hQ^=9eEzLbfU$TmsLVR z{5vvOA4TK18fhsyZeI(NEQlhGS3EhTr-QSE7?Nb5rF^p)2?k0E2u+|v;?)GVe%ict z$3duB!C4#v;?%VIUs~Oc;c`OiFl2!`m|x?sN%nXwOLWO^e{T+{$(n z&D>-0@zLxj@K0v?ilIYSHn{gD)o3+Cwxt~IRGtl_0x;MvXA`>VToyMu7rfCeAs$3u zNNm?R4i)N^z6N+phO)&WZemoyjOT^$e62CuGlL3iT)xP7poXhaNBL|$xS4d2Rqr)F z1PqY~bLrIRWbV=?29P!_ofz3Hb}M!yv4JVE3ZLA>YIz@Eda%!UkV7l~o1B?x_(8Pu zeMUTlBm+qgvMvkniG=?f@fs}+?mm%FEfP%_CcuIPQe+M8JC=4Vm_Z3?sL6>)v5@Gw zY1{P`%KW%LcUYt;yOtS(WC7KXb&Vzbo>$`B6DJN-G>}K&v&KAWn>NjaO0{wx^6ScMnv$Whl*SMpW5)#emCyf4aZWtCv_F*}B2(!j)kV%+K z;2V|2EJR3w)!;;soC98ds*k^!!Byqy*=+q@Ss-5|FV(ZJSByg!3HKU4( z*h!RjvXs29q30gU=$4Yg2*yU=V@!wdEySXQbe1W&5ql)H20j%tyDyjfzGMd($k z54~bRhQ77xWzmRTXR|!?kFy_p3QO(-S26wu$EQykg>(fzU=rG$id-$n%*Z- zF5UWc%R4g)+q3}Uf8TpkV7iqDXzIEb>!_?hsDv5YV;}^%a1z#EQQyjWsN}%=o)%vR z5a8dL0BE6bD8jH-&BdyP^PLbdgr_J1oywy6o5M?Z^TMDTQgSS-L>yWwqjT=rI_m>0NK}xe{U_D{7Wm8mGx|ZwSafc?f*sr zVyov42#CKbpmNCOtnU{8YJcd1GWAuIDGUDF6rzDd9NFzA1JY{1b_b_U3vQ|IWgU4D z0AUwg>THCD1GxC_1N!MXXMS$mQ219FHrFup{^^G9@;$q~##AcjW&Xl%zrj#g7!;BRyPv~gkv=N1VI~<}ztB<* z#w!Ef2Z%49cp22dViX14y8iBOp1?zd=Zbi&KPJpxn!q}7DE-sp>eNA zw*KYF6WI^%U@E|l29U@#b`l$)igut>+M3my znh3jgq(0mdg(8UQ$MTtQrj)6vPRFs6XA|yFj}jnsBJ3IoBVxI|O>|A^8|gCtU)U-G zxq>KR@9l{QkGT3Gp4p&ID^-N$08@OZa|UYr<==8LoI@?LoG?Xcn!17cxh5gu4i5|~ zT)_7>^AVP@ztMpRt{p+L>m=`(kLZt>Za<$JKK)SS^p>7Rf9sTjvL>{SjvDS*T!y%b zVIr^hiHQe_p*25h?^8rk%7e5xF>PA|Ygy^FX^H@nMhXN8sKJ+arW{eyCd@_QDNZgK zvpe_C?#g)b2vIbpJvCbq6;);^qY%8JM_H+J!917w1Ag0bS|_g^0Y@mX>}Qm0Yj#Zm zD7mHy)eMDe!WRsNYC=1ul5pX?{p^OSqkdlc8>b*Z@$?R(0~`JxZ67Rzy=R#0$vTJ43A zxf;^?s4Q~XUeuS-m#x3vUt*~KKgz)|sqvm@k6QphAuUW4RhFEb)laT;%~!NtC;t3L z$@ucyGwYEX_V=MR+iG?C2kD+J@xNwCLbj>4*|TyYRr%T0a-|AHEO2by2W2h@AkY4A zb1d*)Wbn7(vNim-M#6(X7s|7g$j zqCnF^UFhA_YF2PfGt3(9)r~xJApx?B)(0}r{lLb2g}j1XtQ&peEzs6+Mw9UUcl>f0 zRXlTR>1d}#b|zV$!4^s?-8ceZaYBm!ez1ze&)1?+^x7j*?c{Pw8eq>}NsZUQG7BW& zFk28ugaNVN?><=F5$MC9R`QQ!pLkr>*h)@6n;#GQ&BLQrNLHdhASIgUJ4D314`FTR zKz4Dpik~UwkB{$9fZ6*+=^(e?l3p`AEwfN zl^24MkCCcR(*-9BQfYA&a_<6bM3L_N!GuQ*=^;jzarq)nU@);&oIKB#9x9oj?Th6A zKs&D3fM*I-z|5o@73cU5PN3U9Z`zJ=x8=5!Hs6ygiI*q53y^ z2Sd1m>wVONr-ITx`RGc`-a+Oy!Fe#L=Y-*DpPKJIOna8|R&N@bKc2 z_*<-CJjhuE=T|7puD>KOH3K7TDuci9U1msuO373Nd_!?EVvrz#9wVzv0DL%@e{2Y& ziK?hgEFgpF37UxG+qx(q5g$n)IRZz>+eD5$NT>&Wa4-v@4h8iz?35E)0L^OvAJ;0P zlxUUc{DVt^Ec~(T1ThvbQVh5y$lU}4hDJp>g*J*+h`c%2AC5CdrJ@z<)|e`0M!LGy z@}}V{^YbO_`F@ah8J2x&?NHRO39wFSzk-cVKrKR zT;%*;x4=ichuKQ9p;`Au>jcQ&oFJqEpdesxqyBowjc(pBoW_Gz)P z)tMj40GkjrNyPrV=>d(Yz#nK6Nq_z`_vDHK7mveS23)-;?#($zMJCk#Rd|5w4uP7P z9M|BHM5g1BkSpcmEdT*|J|?gDmbi71-!O<2fCf&wfN7(^HYA^mvYXTEmnf*MK7<|t zXhD7ltxoaQI~87YKE(}Adir6vzk8KW-xDGZjqJB`?MouWIgAHYnx*^9wG+Z#wEFs1zKHQ2V>Yj?sqt{> zwX9icwe9SwXKd_ zYcGSx=?J^T5;Ah*UQW)kMR472c=i2Inu$0V;=O3SzceeKOmn=T27)sb>-o8}l~6N_ z6^*j`7~+_eDnwoM@HB-RY}UP8{RDgJ)YzO*YnfQ40}>pTq7MFCWFt{3W?YLS_W>&_ zc4`NQ23`!ErCcK0BxlHMud2hu{8@!uC(*{Ra0>^26^Avw(#RO{O0ZzzHUcWU2LK9k zhsR>vYfvNr$2^fP8-^!YoM}^7-sm0vpZVP(?mv~nmbq9$U?#Yb`eOi)s2X2Rp;%7F z0a<7VmihWe8*PZ=p1%#~#FKZ_n8Xu|lq|>U;E1aDWIMHydNjUjK7(;=$gwmov;|{* zuv;7ez}9?^xnGF$X89=s@6-*O`+t(1DH?ZeEw^?@HLFwL<^Hep8ERv`d0gdU#^=A5 z-m0JfAe`sh_E@qD8DZUv3_kO4x5gyKIZCSxZGi73341Z^EpcoFW=a&!RV?XtXr(j- z9h1)_970~z*c!rku5(!+4495pmvlIe>bq>zsqGLT_koU1K<^`wG~=d)fI+)-es$g0 zJk3vkwLqxQ~%>Wr|^2gBuEOaKxO1zJN3f}ADOY+9l8u)d`Pv%F)5 z{5xf1VHir}67u$o8F5J_)r_Voa0bz*KU5WhoYRs(lJuW{?U=>i1LVc~ksjf69 zxG|zwP;_G>v1%L|;~8!V=1R2_Sbb3rz^6OR&vo++zdD|u*mWJrQY^L3N@L7;Se!1% zokj4qcoW`*5k_H;lkOT?&snHU^7-`Zq@2C!`bKCuKaHf~R>1gPsdLx+1}nQM0P5=2ceB#~<0h z=b#5!eXv)A8r2wtjVgijcGKps-ox(i55SulWqCwHGbxnAIOp}oPUO^0_AFnM{}KQ9 zD5-0?Ip1W=8y;eZ&CaIk)wIUJ_-Ok%?c#Et8?SRIx@mQs37QdaKJtjBDc2!98C2*2 zoICbp(uptr*_~UE&8r>p;C}|$nuC6&M=4=e;~XgjpVEne(b*dT4AD-D48X{9Bh-r? z?nG?Av2Y}>_x9kpYM`M)R1Kk?|NC|?b6;O%-*7Rl27R}R_w+`X4;=e@Vlp&733-GI z=E0ge=A;85lMP}5><9jHCTKL(Z4_wLAe#D;hw|w864ZoaWk?V!u93oj(o24nRdVyo z=oP5SM#NvWSF(;_^XbMB|6Y*Jct1psiEFku7OHo}v3{|sK1MP^l1S!djC@ND`CT<1 zxr4SmKx(}maWM4#X;5cv#|?aTy)D5lP3;TkO@5}}#g8?f3^1y$vt zf5f6XVXUTBMC}9gLhk&Z;IX4%!PTZuatKy3fdwsqoa3#W@beIeqVju6Wlk}NkE{3k zQmY#(6S_Iszfsj)E1)UBY@i8_64KpH!ZVd|2)6VBu*VgOI@&3PIoZSLb_B4n>TN;F z-d*MWp+3Gn-vosKML@d0IE~AgC5$R11=?X`Y#P{-4UM!A!I4&}PQ4zBI4u@*spiI+rwbC24Gp_zMSzcn?6OUk`oa~LWDAfjx!bEbO>z( zUPc}6r%eDn*7I@UkA2MZnrZx9zvX!Ny4G4>X*%ZtKyTqK_|F1H&&vx9I@hq{T+oh& z^AHKm^=TS1G=5a^%uHB3P-__CwLeXZBHV<@pqw0JR+WWrnWEZ*UTJPCkMh~-8O2dl&1--qCd~oI&uKce8 z9P>u!0zXxpg;qWtHdxc3r?r~CF2LVsgL-Jx)SP9Cw~7=qMt`_20rr=m3q0G}C8y+l z%Yv>wgGtOh-MB45*MA<}z-GtgOrT-S?Pal<7_hHdD?I9RM98-O;%~{&UlT{@@|h|j zxhIQHmN2?ECKTh_N=)^H)6B{WEqZtd`up1CwQogos;P;z3M^2bYD)KAAiHeYD^i#w zT+U1_|KuphmFS~WmVt9yx$AhNM{_nGb?yEZ45uZ$ZNqx?@LZ$$Msj^x?PH0y;|6V1 zf2w}8N;lHWO^S-8s(#RN#lEII!zsBcz}s9=@vD8(zGuT%#5UJEZ>U-TC-+%q`1Hbs z3@DUZTDKG&^T`iS7Yu(#?Yp%OIXpebV$Fg z>!=~JGESLE6?ztVQWkQ0vw)MQv;5U!&_<*=NPz!S0*ZPFJi{^6!+8UWdFr3hqo|j) zplEancAv4Md=#V*f0VOv=c41U!iI8`1h9EVYjOK?Jv9GoM!(-RioS;|4=YXU9hMdt zl9sgTWRMX>l*O)*?`FKCgHh>pzT!1@aCcj$+j9Zt4Li;K)lp6?Y2`{1!!6bg?bEBi zw#RGSQ_@n)j%7+>ptL>i3tjCq4b#;hC4jOetXp%r=3GEmYznhc8b0s&w$B z43FDf*8O;~lm?mvTiJJ@{R*U)GUPB-O0JmU6OTYM;$#ZQ+A=r@RX)XZqlQotOso%$ zkT_U;YbCMnXx7j?&A|CS5}%~dZ7B)>+~j!}(a)^%mbS}(o}$U4j3sH}a@wgsFSoUp zGykMH)+DvR{O6aqOixdP*~3ednWkdCef7^@hs_{C>R5BeVP@l-tT#OlRdy6b*s~pu zk<}*jqXsH*g76@=E6`zp4D53T&Fp=Zy$SfQJ&T71i-9b>eF^x(@k=D#XNflh)$COr znJb-r)syuPdL0HmO4_kbcYO1*8`$hMf0w)9sNt3F4x~SA-H(es5UjZ+@9#IwO0x4Z zgYJp*&ij7hFr62z^Qd>aDZc5nlh*rTukfAoFZiDT%Dl#?D8cjG)xMqggDO8kI_Iq|?5?SfM) zOMdzzb<9VkAJvl@?-7x~XRP$C%jm*=1^X5*{BLqUy}c(~cOWQ@gZlB}acKAuTaqLX zWJ@9v(`adK9_bA&II0W-Dyf06_;$@g>XaE{^gH)$U1!h@JY8sOHw21f=F=Txgjlh; z7}w?$rb)q1p`yvR7qq-QNvnTRs}ByRu{)^xz;HDZhu*X zTOBMb<(2yQua*YZyr>oS|8i4uR}$xHdRq0>7bEfqt#dcEVZFW4h!D@0osSAbCHGAi)}6|2>&x zNHlU8HuNS6(uU1>NUwhe2~$$HpLQLDSu~7Azrq8adPvm#b*mL<5^jtNf@geG`<+kn z=Xi~qTJ4{eH4@y^j9-{PWFJ3MYMq7g*8V=_)rC*VN84EaaQ(xo-Z;V<@HKp{!s~Ji z(|MJ@aP)fi=c@U7ZqN&o5l><A_~MJB5V>?f-iha0y}_V#@3Icrp`0DMjJP zqYlEGXZj?(Pt0$bX(0h|;%c^QPY>ej2%`&r9-GC?PJmMgcEp99uwfknR+gB`W)fs^5q~FCB&N)0vD*^f5Y7*=_!hcbD(a#wm30>P zTha*2w^p9FTID0|97R}?DO)AWDBNu(H9HO14(jT7eSBpyK0KV%Hv#n?LjhkrSE(bI zBREGCG~aO?7cu~2^10pjD^L3n4g8W)(7CD+>hDy%Z{DgS7QOzmGq@uSOW^CvL0!LGaeWrQCyTy?T58_kjboyV=>_ z-Ms^%k620vqB{{q_HU#-=8>fm`r(utH&eoxBlreCOkm??*Q@T$wzp12^mp`{d0fvE zn=~0kj+2;Mc0MRu-H_0QGDtT&d}$A&ou@6sJZ3E;XWdEkP(d+A-=RR(;v<;j7=*;< zLDy0Y<>(`F;3~MJtB0NfYc@N<+9EKh8;Voi)sSwjYfabD^VC2jCc+4(W}e=&iYB7W zDH0)riclg?9n71=)XZ=kM7m5|F*yZ=sfIllJJ9TgwkXKxK3AN^ID=tybm}#o9XP=| zkVQx1C{l7%QN!>sMx~PoUkFLppEkM`?j)GF*Lg+Q5f@&o3U6G6_o zQ=-f#l1gi%^e#o|XLnE39My`bBJ3&18E;>YRj&sGNy)vH`cJyjC@li@aqZt6F z^76_9D}*aXwx=cL+47?4%!^f>AXAWOc8&G=f%r&QrgFYu^WAxO7;t_qGj(CDzFRdpw3(r{Sp8DJ<|P zTzjQ6MRBx_I2L{Ri(TmUXJFvsn6$94xYYJd_pgH^4TqXiB{493-t5%f^!Gs*B%ZPB z0v?x5FX8*2`Qw&_kFuXTTsjV9B;f~nFHf`tHCEj1qsGJ_t2h^?RE5`OXD+~}lnn&f zbP+ml4&(&if(Jt*H^Owec>}Ta*EJ~rJ;W=Eda#)+r7GHpa@j}P5l`%i07HnW7olvwn_aZk{rNRd2J)}p6FMju%9vqML(!){yX5_k!Q`tO;J=+ke3 z*IjtjUWP=ko_)I$&wBNt%mqD~l3Ct=J1k%zPn>%*kHF&GKqVUHBm6D>5y*Cdd^g;~^@-_|S>fAut?n zwCmPS2?YL9asbpNcQ0A6fD#@G`F7ZlwTO>A*c)+^3Dr%=(peC;5E4a^%m~LJMTS*G zu?a^N5p$5MnqhO|x1>&)p8pE0__-L^_)zyfP|{?A8-~c$M-#WPkb#-(Xhu+%&^uEY z7-?RS8wA7v0mqtQs)tXLIdx;k?0k7z^Zrc}x2&P%>xcILaX}tM`4o|1FfQPh@Y-%9 z)Au<+V{Fv$GP4xk3z+rM?lZj8!tEIn#@P8v#9;F-RcUxtvsh;rm5o9bNuhQ`BtjV^oLVF}gufTt!<(-arMN6* ztILjUttqn>yc(@mV#2VQOJ7ppt5r`pmm%2v#!=Y#++=O6zNGI)n?++VYSrkJ=7A$a z!LzmpZFiFc+9xMZOI}5mJhV-e$ zu-c1DVy}8V@sPEorRJwV&Oc=SI%~p;R-Ny)wn|!#3t!7c#8Ol<0%^g(EYZ)rvq?Uf zMZIJGwd2-Xii?wWEx5Mh&x@Hk?-Sz5Qp5&P&OLAZq(}DQF%ZaMW(N}W-~k6!*-yZ@hk?fu8~5uG;ME9{2*aOI&fO(A9t3d!Rw3XX=!g(-qhNTncYG|ilXyI#0o7D}484$%;T+(2 zP0FAG67WRE4CpQ3SE?kOhpS{#_7o6aDz2uAeJfu|K+@k9JYqrAhW*K{)^Jr`M8QJN zmI8tkR8>;RlL7<|-9%`}_8#CY4}rMX)^0JKVu8mjkh2-W;4DtTI98GOnZM%#3U0$; zhd7C_$MR+Atpfr&_)##8Mg@p2ML5zOjcCQOcV*jM?vA}#h);B%w*W( z99D}N9f)qT1jHT!GAjXnPp@iqnk#~EG<>3duDULrW@)Veq-bi5vV9qC5UzX+RVs`)fnvX5(q$4mO$)8ai#WqiUT*rV$vV%uo74PMUqm%z+a!ksNZ}W z!zx0DeGjjx)t~S@lM@#A?D9xsPF$u(X;zUo_T5u^SoL20H`Ol18ZSG9t6V5f)lc63 zj|03`ws0B21O(J(hGvO>?m^?rYOK2Qx%FE8_dM?y0Ba80PW&DlpYfKSgbO@_GifT1 zg4Ex6-tn@Tu_SR{H|*Pe-SswjuDY}Z8IefX#D250`vpc<4~bmO^2S)8wJIvp(O%{`?Wb|uQIHZ9SnN&w+g zJP&Va^oV>e=oz|UlwXAFRi@b7RkR+|tFP14_s3LoHRIfq0A5JqdEQ|TlT}TDz@2hF zqlzS}h^PLqmK^?R7jb$Y${rh`NfKV;2;J=-dYh-mrZlZ6%PUJXaf^6^&^yb8m3hcb zZrm5kD8*}Wxw{meui;y{Z1cE~sM|Lp$pOu^V8Se4<1D4N1!`K9<^}yNAP|IeW#O{a z0=%J|B{ZSkoOL*V zhE+68Wa<+KdvKHY6|h)0NjdD`cBUOji)eBn(~X?<15?^fiK;8;QYVx-CE5z{5FWxM zU`VbDoS}N4kRT^Z39@;}84ZQ?Rli)mvb2*=Q7EWAyxnN^v;@GiZ0`Xd-}JTPV&d1( zOB7hbmB1^;l1D?5q~oDreX6UX5=>w$JUlE@Nrcw`{eT(7HPC0He!jd5%OI(Q8Ou~U zes5JXYHNS1K_F6V={JX`ouZ)uA`P*?vUD}Q!Efgm*a*ljC|~+D)^YU4zB;tHh4F5q zTkkHiZ2J`=6gvs#<${q*#7fFRM2PpQg-8Nw!+fMj{0_MMT`flPM1@Sy!c8BS>@awx z%h{c~dH8rD(NK83aZqdx z0JzbXyIo34ErT2XbK_t8>$t}bIueiRlEUi?Xwp)=IT4e`ES%evhjTHT$AQ&^l@Sa^ z`2{PVjw)6@JsGkN)9KJ9;$B9D9GT8!sycQ=)9I|09UTmZ{$rsbUw9^YQ6g?_R20^> z0)^I0uqGyzguWYv_RZ9VT^L*Zjuthv$8J9#|jH6n)sg|>x z#Za(SOsQLrotf$vn6iiaUDS3ByXU_qO1)m}R{z?$9`if%1+9*dOl!vyyGpNSxDCq` z(agW+dP+5Ma_ovNQt2iKfx16){n#vMEmy&i%ujK*wAwAHEWCHo-gQpXwvGk!#WC)` z#{gkAo1DCG?d0o&_H1{-?wl}z`7kok{qvXWW(bJ)u|4ZJ?ky98@;4Ah?X-RTys~?v zZAJ*L2>i@Cc<b^&&Vgdc@~#tr z@C@%9KVbmkCFK%O7KV{y7!x85%m}fR$H3|soE(ZD*fwk6*-=1-fUKu>{@=Zz&28Rr zn-Tu1_DQpkn(yvSA-N->bE~AYMG(~IiV-kZyi|^hE*AHIf{E!5+q|b;!TI6&Ph2)S z!&R_tAny@a=Pa+ULISlddmiouuM%=X`N*@8cFp^X2Rn z&li+yA7qOqtQwr%Ps||k-6FYYE`Cf#@Dx?FB%cUnnWw5$4D@oL!*H)q_m9nDBmhk3 zp5$&wChEawki=?4%)+XkQt#S`FY2pHYOf zAG!I=^G*RnDu@CTk0YcMP%oU;NBi_;0 z^9c>e7Bu7Jx~h82dM~5`Mf*rrDwjb!68Ccsu2%+$MKnALM5BgDtS%s-sqh6F_3(5@ zV@8QN5W?j|-pK9$-aqFSK5~TWTUHhdcHNaZ8sNyir*A{y=^o34u*jAzJ++@|{KOX&{IYShIMfXh%&$=TdD8%>+FO=c z4NL|hq;}1#RKHyr&k+cwuT30^fWdt7OpTW$!Og>Hbq5A0oig%x<^0Yvj+73jr5>YH zaNVn#>M6Weh8s(2b3=%21f<8yY{sgTy{3Ij5WmHrWuL)S!zjNnuVU}%F4ekD8Q@Tz z_b;w{cCke~Csjj{?CD9NrpW?W*A~4Oj}6>3I0Rr~UVjZ%RX4hOkiZYfn~SVz`$2{QtCn zzj~$AC8fluSyS!W0udrEc++>laJli2V5E&# zPO$CiYkGQ0!E;?TPK)U1=D&180X!FpaZMAPauG*A^t(JJ=WQ5!I{y8K#KC+l@ugzens_>4=8duGtf_jkrdkj+>#2dUTW=Mw} z*m#JaB0X7N6rAIiKQx7R9{6H?aRgy?boRB5LsRXljadeykZWAc_KEC)2Jb{k7b52% zLD-1c!q(Dphzq8cic4+oRoSJ>)t~=U{}q5BF{Y|aXf#I%`C8|G%#uOyl8?GSg%eDl zeZ^wE+!tron5t8yvYnFmdx;C?&TQRDnbW#nG@2&nfzooa?cu8eYVVz!DNY)=fM3*8 z>4zu^DimGa`K_ByDH^oqR8!m9Jy+(+OENl&!onKapI(_X!GJ7+Y{$nhz71+MBcZoh z$KnC_apR3cQ82tnjL3arah5k?@?HcoNy;_Whv$$Gu=%Pyv^WD6Lrh$pzW81|=vm1U zvJ9gu)A&-d*!Hf&md>j1x_ULSBd=qkGp818UhR09xj+ifvY&Q8ol(v1P4Q+J9R5_4```$NSi%?!+bi&)?I94NfFuV4Xtm0=RAxuSe z2wXB_7{>o&vi8Nfa<;$_AKb|C@6b4AE}8SK&i8HlcOP{}ssN4y9%Yhm_$`V6Hu>KP z@;;C}p!=H)z_@Rc|J#)|BQBieTb4ZRofMM+vE4fyt@tv^J9iprR&3-_1QV^()~I%& z_;9=d5#ZOY!+Lv2QvrXIk^k^vgH*TZcn#mehR;}VT{3{6nAf|9YlRd!3dcIgnlvpt ziLW7-paT@&ABj1jFbK*p$@d71i3$*RSP}lry1|g%l&?a%1@eUj$E*|!gN8vcd#QjW zf?(n7`R9zZMe=aUT&a_4^&6q)qCi8QCX=TZfZ|OFOCb~RhYaJiFSCX<&3tt~gh4Zo zO~}%`+<#Gz(gwsWwY4qcAx9~Sjs@ULTZ36#J63}IK(^J|K=0<1DvBlFam`!X9hd`N{$8V7{X zy5Il!1DIxp`WJ^83Z%=aD4S;3W<^*m)&Mm&JZ!H1HTY+1mBG0eDUfa)oDHxt#_GFF zxOL8X=<)68!YAG!j;>au-g>6v>PbqD!^MK)~ z7j9)`vv;Y%7ZMg%3&C7nn5={kY)G4~+64ejb*f~n1R?(yahhYBxkad@#7O6G6b6a( zBB5Tm;%&d7@{xgpH~q#6=M9&7zu$NAi2)hX;LOmZh6eEYKvDpZ)^o>E@p%60YNlDj7yScONx{j$i6EYHFKe>bihY3~Q$V_#=}KGhnO z>TKV#P1NDMSh4@!HPc1A~ya%7y)kCH8mPWJn}5J060 zTVtawAVs>x%!fOI{%wBv>D(x*CP!8F3g-9gOGt)(gQ8ziE_5UIys{vL8JXoWUzGpc zIaFtFVSj`Mzi%(W-EaKg&&OQU82JC+gQ1J<&Yl1KqS^$-+c=BEBWQ)*5Kt@}OcJ1VsiJ^^&47h~+AvKnbDq5vRdK3D?Y zHt<@(UvgIGy3Q{?R7xxJ=-dqMDK-~p|Aq(UT|ak?pM{eRrLe|t@CTIB4#U-2rS$&( z1;njWsIj5X?#Qit`PY@-h>?5@*SRJ*ChqcMYxT8j94_+5sxaL7kFS=St=UA*@GH8| z2TxB{11I5?mrxzABwZ*TRvpd|k zai^_uMWd*3)PzPYEu0-TyKpJtj&}|y5P5`Fj@xWW3#*&?AO86em4gzfsW>6tAJdvd zu<=<#NOqH-$6rDmoi*OsCxXdz#q7;0XSlcLJsndzV1oh~ruI{dHBolMUu(U>8j}ct z-x$6L+-~@rMrCiG${6*ZIr7cRMXYICo$BBz=V*POTDR0sx89o+G0&Wi0w#t5+ z=W94F;6lt}%(_n^`>*%M>r>t&^6~bEbgJY{z;w4=>ErRt4N%we$tKTncPYWjF~2H? zw|KJwnx#d>MUgZDaVLd98Juf&XtcLi3Y=a7-~~;yXA3op$7|2;S+`eX{8Y!{-Er}c zL(9U~P0wTDY$=;?CiCZMF9^lYZ1J3uT;CDOLYb6vg~#{9Ar3UmO|W=Pu4bnS7=-+E zp~66d53bB@Rw3BmHL%3|yyTY^r4kPh4pDGLugR>ue&VINEz9w7@?t@t%!5lO7wDbr zfOY>~W(^eQ6skEYsaX`Nu4O-}mkw5J(lH`krC zFp4BXarUtuzBfgJ%O&m=C$W1?Qsd1G?z?p=w1|@YC`Wd8le8FdK@CRm3virAX$w_` zkV7z9Kq7sVlMY?IB1Sv;!*$z2=O(KxGF)uQRJwm}^r1&p3jj&zb zyUGC8K%A50rKRlPLzT*Vt>(lXSFLo#=OYHy1>HtQ=)-USOsIw%35LDL;gP~kLou4% z6@;t*5KQ9e5f2WsqB5|(I941LKi-?iQVh?ciwrT-r@)5jerVQ))$W=*$G@=-fbV7i z?LU3c_V$D28+D{G)7=uP5_Py}e1-9?>-8FNj=y|RwH_f7x zpED{%=E`p8SVZOt_Az*-B6eY=$ed~U9FyT@N{q7=;jZ8$z|$0|zR-y;8I_zHvt!_{ zD8l6y(+#AH|8l}CJW(3UPJnaR92W+%okP7mZOzvP2Ch+0czEOsJVQcluv;RR7+1SC z0J4;08e1GY(bHpyJX_OrjQk3&>0;fCCLhy!@)NF}-kP*^z$d{a!FRwp@ad}w{Df<# zf&^|KfaSoG{c=td%X#(d>EUGZ-bz*zdX&6!FPYP!WHoWfd->7PH%rgQ-jT`2npii% zUn_BLEAgEm!-GzC@Ij%F)IijYK}&)Wc-pp7Rx=-!*>#)~mHoU}?|O0l>J2A2V-;WH z=bec|o}X#JzgCRpoY=6sUcA27i?`qXR97alkK@qFYieKTZ*PzXUIUAL0nxWdwx_VC zNaDMA!0Q3>sR5_2`kIoKq-Z+fx})4R>mHSS(epf`TS4Op?4g?A{Kf)j(Of~&E&S7E zrTBZ*d%SenQ|_%K!CWveNxfv_GOTbvGW?r3@c`EE5FM9D2AO$VI@$|^s!~|1mV|~K zz_d(P-!*38mF&O&UMqf*yka@nHZy*6MQv(-+h;98QxM&E4R&D)$0LVWV|y-SwU_gR)i1;qDp<6poIqt zgu)}02c_xH_PC8;5+u`e86lqx(SpK(71^LB36ghniId~)Ued}iOi%z28!T4SVMB)# z9_SQ{574=^GEM0?cip&jvu-$*$QYhX!ZjNMR8S-y?&65^Hr*<~VVbUmAR&^NDZvCO zDB#!?w!?%{Ometd*I@&nwYPmnC9h{{vQ}e4sA_qQt`W6A*5nP9(?i|ebd7?*Y^)Kc z$vyu=EOrB8jsH$6+&L>C0<%X(+a|fB^AYfc@>x#EE|#LE2BqLx-U8L}m$AlTp3gZc zG)ADpa?#vgM+jY0ygq2!X*V)klHr6K8(&j>>6>m_mA#F~=cie*slQ*n?zO$!>Qnmq z&f(wUQMApYGVoOf%PX>U1elAvPdT~0-@c(k491srL`0b+(4^*N$OsGAIgj+N+4J=+ zEj{wUhHTSr-sAQ5C~-`~cR%&U4}7dVk&%D=Ga;Co7AOjcBXVdoEQJwcnA(J(X%EKm zQRme=&JGM;0R5OnsR6y_{h)tOt)KG7s^qF}*nQ7iBMUu#ucj7`z>R0`k*mKu)3G*% z5h|2UV87c3yWRC#Z!o&7K4NTaL&i{KDx|@vJGUO6c+G`BuQ@>?zHep7$ZgOm_2=&{ zPF4gJ=fGu;s5{K^NTow68AvK3C+5W>7$Zi6^4A4bQT!f(MD)qR$Ib9L2Ek*||G6B#UHas_2OiW;|f*gyU${90AD=>mDGv|?=TMpwS zMvQk#=ClDoQ9{Fj6ar*`oDBBVd?J7gv{*jO&vYT~62^Z30kmACM3A`CLQ|^40LWri z*8o!pk!>t_kbth1qX>dLb6YJEGXCUq0ZPQ9BVv%})pLeEIwyYn)+Md2)Z&fUODpPX z^p+qzxFJRQe(p#-czdnp`Aw0*(ClkjfKWA$K+Zr9&bUYl_Bi|T91z|yLAG@N@!?xG z4)hKfhYljdk>!ppZH=Vm?gIm#4w|vO;-(HgCnaCaQM|B*$Zj_UrNaikZ9-ZZHw}Bw z|D3B0%(LLiAV2y55m(tNLdVHi3t)=%TQum*4f}f!%2vNXfs*q!OgWDXgL^c z)E`RIPqHV|PI9AO-?&YmW;PFEdm2N}GCHdIyxHC$;XI|-Xe@qdaBb0Qu}Kau0tWW& zq+^S$ll}dMjNM0vMTvfiQ~oC!W0xmPn$m4SL(J`#LFKHI&L?eS87Yq+r|e-A6f&Ux zGZloJw{TWBCY+8??cVz7BoQgGSkpXeVr1f!>O|fC0e;G$z63mvno>5*o_{CUjD72O zL>qY41qLTCBiqbkdQVx=%i8GEl|=i(gmy`M_|F&e&?@8Pau? z|19hV%i-*&nN2eqSF~jL3X0J4+bXvfbH?FCAPu z*8yS2lq_q*Es&B1Lu8IBN102Z)b3NBLi~+v)VC4b4Znleup<}p#eqJA8bI-aE(Id z2n9_!gJj5u;d3h<1qk-gR0f+!+SC}M0*VkCs+B;D+d4X|sX@6|BMhO56&!o&wSdzO za696OY?3dA#%)F%kwnKYRKruu!rwr-Wski8(I{g6z9I_~eV-s3w{`*fPF$)(qJ{6CV!2(| zBHAsPWCy(X{Nqr1OLX~7^gRU;7*2-(qjm^)kAy&sh42M%=M4>QfYPy-HKabytS$LR zQs&J|Ig-C6Z~lBMpw!qw0Veo!RQg5w9n!-kHpX{s^1QD}&*T$2tJ@oQt2Vi=Xr#6# zD&G6KB}1q*=}rdd!ctSG#l}=dAW&}?cw85_<%H#i)l3)PyqO8xI&Icz4e?0t#@Gh; z-Je+yuJ=n!^vFr@*m>xsT6WBXd-?(}pLih0O%329H;VcW(>(-`^ZVTa>>6!};%6Pt z$>3OIPJk|cgyD=~A%yVa*D#;|{#KT=;5>;uF)<8)Lv<@wTt2fZ^m1dzTaWLTE`8&B z+3&X%D{95xi#~L|q1Al#)zQq$O`@x&^KsO<{glOd@EY-BQSGl)tqqDr-^0Ph{c`!S z2HW&#)C2L0Y<$ep!N%4h<{Qkptqti8DzZlC=^@o>+p3;WzYTEuw4f2(kosk@=XA4+ z)HcA{IEm$YKNZM!F%HSq>(;sS2s#`EcZ~Pu>A0)h(<*v?u8_ys!>3FcVwXFn$L~H_ zS><`UiAA^pUY;k%^~Y}D8s*CyvSwXXwsa!cH#0m%js7#>$i7ukt0oEGYHjqOoE+{d z%Z}SB^=j`n=+ib=qq+_Hq5+~CFP*luL6o#=fvUU=jr3}a@6^`MmUa7g<@x`*3l3-M z;jZ8GdAs&o-w}BFv-+J;Guf>%-|mr{zp*Zy$XqOOuCtv`VM`E$spzPUDyq^Y2&sna zGBan$JvXl?82(dV$2wNu&y$ldQ^Mc0V|c;QO*IP!p2vVrn;|N6S{LHCS&W&1ZNRT_ zT2hh6Gh%Bh7w|Z8-ov<~jS^msxh%F}&BL4{t_sUzzw#sOG)<9=f?R0D@f-)k`4}gx zgQ$eG9fdXRO-*(&ph+ma2$m7J62J&0KhOyg^q10*2Ehsmg4Ym^5d*(9l4Loa?=eEM zcS;-)hx@8$Oa<1-!Y#reRG}kjwShN>3`vbijlCJ$B_(xD!HOCph7WOz39KACtYKMk zPDI7?mJu^{Hs?l^Up>6#N`m>XyQZA5^ym|&*BMdO={5IFX64VJhq4YkhkPG1V_!lw zJ;4mN_>XxgT{>D?Cf$;>g_GW0Py&x4h)KfiUz&FbBn(2~gq4;Ya&C_1_Io157RWJ6 zOdd$|nt4TA%UzJ)-wbD)HU$|);N?DoYcTL$K5eyFWFY`d+@hkVuNbQp2KH07_dldC zSnHDr3!?bkC%ztO0bFI@cdUd)%q2`bwMv-T-F(W=vz6Stt}>J4E!n;2ExH;Y7XmPP zl}De)FP)X5zWFgKmaiNk9AOeWQaDmsOz-)Mo0SDcT{Q-LZwO2cn4hdJ3l#>x7n<2! zNQ6WKRe_phWmw`+JNWTJoW!Y8U7b~5JiD`bq?LzSVhSOGm5nVBgd-wqU+-Sx)^|)x zD(ub8DYz~;BAW2fUEdwd zK4w;#2Fq)@NA}0G9VQD7*@trw7Fze*>i<$I!c8z)MKX0jH7K@5dhcFzA1mXQRm*A1 z#L&O?^=fGhHipTSgYwg?0mX*B@Z3AsH>&2VGSxP%S-9KQU-)d{9SE7fN38_PeCu!a zEU$(bqNlmG+k~u72;_Nu*PFh0p$a9ApzmfP8DaJo%z}n-`^|5GRvaN0?ppmqWbu7Z zquMmriZz@HR>( zj81|zEmzI;TxWdJ@M+XVIPu*79cMm=Wa_!lilf|59;$ccy(rxATFBTaGhO%H4ddl| z3%Vc8JkHv4{QC_^?+03dKI%O&RF%!jMjj5?`&|Yf!E1L+d5KaVbJ9ikl+=+!Ep@l0 znrS&{w)F^9W1s|nA19s0=31OE15iOK@Oi_}Gjf#65`*?H`WlJPyRW3)W6rg`Rn=O9 zAQUzt{?pSCQ{@v_$JU~q-})j6>Yx9{8`lqCK*6J~aUD#~@R)lwY@eK%z4gfVPcm$t zpEn2O2Me|0hFpL|06t{6K_E#ZP@6&xM7W{ch)7D-pDMLv>I~5Q{5&#|s&Nj6a@_P9 zIQ3zs5kn<_PYz0{i@L#+_QPkzXk3Lqh7io^B0%zti_UCr4)n2kZD=ankG#qumN5TB zJ5+iWL-ZAd34TCe7P4>bQGqHUnohb1T%SlVdO_+c?#@79CdaZ zpg}@Co8!G=-A&q0Xeg|YaY;ks)U61)N!}W73K)hn@s$r5KLPQ4L zKu4svPc9KF%Lsl;#&?LKt9PK>3XSY(qB2md+JNq4z~1eoHUBJOew z2YVKc$Q6|DT4Tx*@tEQ=a&3{sI4|KOxJ4o$^uI;{IY$zPAcdtqOzu;WPy!;05i!QO z1SdxEtQ$9h@`?CZCl`}isWUAMJ$ZRbJv;?h0BK29WWJGaOAE%ctYm)>Ao%qt%M}1nI(%xD+ym#4Cet{4Z zhx(UovrVoflY$B4aW~91w!w%S(ZVZ9J2M|Ne>&h0&pbfTb!4|~l%mKvy#T zH~6tC3QBpAj$4`I$s^qnT!ky2$9G*(D;X4UYPdE0lTbSezC3uKV^b!ImdKO(>~FP8 zmr}^%A1^d?_cucbaN66cLO)K5x;9g*1*YDnnss?mqpq*0Kam8E$jQQ_BB4ll4m?au z?Axjji#_ep`a|jxe%Aq5?;I36eEO~l4)EI0pZ(|oCd1F{t+`v8t~h|FPM08Dp??r1O(Yo zRg;B;;Z;}-*w(C)02ZRQ6Uq6#FW4M?mE zA(o5Tf~_Ei6Q&{I3Rz+?5CGWdLM{`DSwu+3Bnpm;Tp~c(<0^YBf`s_eekh6MCXI4mOXbXnyz^9IrPlKwpY`(!aZR>+~LF6L$OZ;b!vG!DKU~cp6bSJdr4L~|zS|ZI^rzR;8OJD=G zfNCPTaW?z^X7Xg(gy5?QJ38XtVCh5iE&YGnU4eCZJG==@YCz4@{z+0tg>p%&Gsr73r{zbxALQY-bHFh2FE}od60`f!%K-kiMNjG0Hf*tSg~69^kq`Ejx^8@Qp(YFWPi(AVIt>^}=Yiy}c$A1~%iOt`MO5#~X z8woL%Jy3~z)`XptuxP_L2!s$t7akFBZ{hpBL-RoRGz9u?9cr$OFK6sgl}TaArC-pE zkh(y*ojU8jpI_g`ytZFUSuFMzV%UA@=De?5Y|V-$JO&63i2pqAPGGotCh!1!#!zrvKEA1nT~j5SEK!& z(n*5GtL;Y+{TOO7O$ zl&-M6Ub{z8KrABC`6k$oFFaMaP zg=4{Dh!EZm1+J&ea%h7mUPLLsslsquMp%FbYuq<^tiuB((nC zirDq8tkKRuuzI*&oxCB%nE^nuTU%wbTAN*b_cnYAW3UGb`-lGfMaAY@ed$a|x4ZDCqC^iahc}P?kb&E^BA#vrv@zkHN$aZLwdPOTj z297HSw@r=Ze?dlaZ=kOY9l)6fSnmp4p0=XRw`!yxTx=8Hw5dw;h<^6EPo9Z6%D%!b z;Pf%0ZbPPiYt6l8nb5E6UE#G5DJ_C2=H8SY(%`x5eBnX)8kym}+GJ}@4M(@+ZGpqW%-nyB3pPlyi=T90}z_ni!dGh0n$hQeE6v=&eD$UaR|u-VG_@{Z+y3+XAAdAJjs3 zKT7l@>!m?(9$AV4-%}2$2m%mY(&ly{$)%8<-TFbC@|0Y-cvq&#nH-`6nzDExZD!ih zBA}3VU>hdQqgBHN^_4G^DE&yekr}%&(dBo3AQ`}OYkZ5@i3Dp6zl~n7KD;?U+>D2o zU*HY!8j3N8Hj$Uw7k=C9rzq}xu-YuCkuQfG&qvLZ_{hv!YLm-aD$VJusKEH7i2evA zJaBZOAL|~Sq2So7l56+9@G;k@RzNigmjlmV*zV%nb+t{((NvW= zot8`5di^n1I9Yg$N3|8+UxhgM)y!2OWKFiN3z&=8se3j25&{;2#!)LTX<`_po@N}R zRbdwy5n)}*H_=yU(=u8p45%2Ypd~Hc-mlgQ=f}?kL`W1AZb4B28p`=ZFzyeF1#b3U z#PTt^U2K*&2S3czo$>sOILUE0Med)hSrlW4L-d`{--BQ>Pt6#|tfRu#<9q%tTOs+S z*)LL@l09s!HoeS*X=eJ<$aop`TT`*G4auu9zFTgc24`nGeFqV)*}|RAuBp6RA>^Wv&lUiJF23dEiqZV_9rZqb4eOKbGMAVei@tHCRmT(K z7fGbV)TGl0)l@UnQypMFw9JM5w~2n2Z(coM9B&9Ao>Py(xrsKP3rg{@b$lH8)_qYM z4H6~N%ue~Zc_!%j9a>)Zkfe)flC1=B`mhnJ#ACam0e6)(_7-EtMCSi0kfho_Gd5G_ zePW%@4 zEue>ld_X+@w(#GX{c)xCt$CS&^Rbo z(1@6G`HwS;VsZ`6DaF^M7-_K!e|bR+7TB|%rfU1j3hd)>liAriZnGcmz)cN)2KZB) z>p~gU?QX^U7@$%(Zp8tJL%%NxUxRo8MF}dYUV1X$$We@n&*R*z;E9yUXixmw4DUt- zyP(7@h=H4sk?9)P=a*e(u_MnK^^}ryZt)und>pBPV~wvJ=S+Ttr?vkcGZ0y=@8$~i z)PUN4iD)>IT3_)B;O1|{1(Xzb#T+=YxPGDuH+bDQgN#!XF{4QV5hF%lNcQ)&6XkdM>ZnaV= z`A?V14C5s|Y3U2aZOk7ct(_B{>SgygXR08+Va|>v!V9~v999$Jqs0?Bjg%o<}MPGI|J?Oz%jg-{Ibfi2E~rF zmwa%?0>(VrB<^@s7wxen0jeSr2E?L+qs<_I;CYkYl8=#{Qpbxbgu8#JzuG^;h8kU3w)A885+ZX2Xn*ArsS}?OY_-r4L(+(>VN{-;J%Jxi>E0d zc$ajY4D3dY5Cm;ZoHg1t z0FZ1oPv7tnA*HIhJ+}U@i2~SJdQ<|wVh88G^j=G7{Zk5+gM#iw-#gECEY)rIn>fhb zkNOwSd45HzrPuWn@SDoGx5&4}8H!Ko4;xWCIIktnBf#@1>#;u0pk zrw_uz?8t+36-8D)8elnG#BTWz&j&pei{I)1yRag3qXQh!ap1$hPjrV_CPj$ZLiDgx(Y@4KTv(&0aX0Mm}13=d>V*$S=O_@ce=h| zLI3iD4=z@z;1--3QaYE8Iu!XStRuH6u3i?fZ^EORvuZ2z=hl7a2Q&c$I9Dd zHycCW^s>+z1lSr}hr8(ENY4h)r91tXob_1Lc}yw!RXXN>$49mj_Up|KGGODV)Sp^) z(+VnS(>QPu$o#(b`q5!f;&t?p4e;4#=?qHmb!9q@It?lYM)5G%_t$RAnO{^DaK?*h z5)@dNNHS89>oUC7{VkOn*XpB}C_gP7&MpXq`Qq%=3aaDhm7Jh6*=LYIpBA^R#Y$d2 zfEZ?3d?L+)Q$&#a$$+WKITb8GyLY%J{^CXDz#g=e#$)Yf5V_eIKg#J;zu~?-Z!t%~oET zx-8!zmyX3GxF8;0@=yxnz0}iWD|cGV@BTvXf|ZvgS&fIZ76iy+4vyT9*K%s^6K}Lt zSy|^jSgp}VaqcvsTU#Lqhou2tG}lmyh714Iq@81Oe(ts}**cDGm*~8de1@kLrO|-? zd!!E+D2^pY#M4+VvSvLFyH2Y?wPUt11v)glL9N=fKg(fjH7ThyzqQQ={ayWa_gu5g z*|=jWA5GIsFJ%M=mM!y6II*I0iIc(!pDPWO(Z{;ia?jm&F+3fw&??;&D@W(DfuTJs zMSO2M8e#43#ar=I7~_xOc)m{DZ$bm{x8z;8l`sQtq&Ek;EviuPvvT!^R%-pp-X70U zy*iYnT^)*)V9`meq+w`y+SU;C{|E9!g=!`#LG0N@DjCYlaYMlqGrfk=v>JCsZIOfyxX$E zANtmLHy7ykbQcxWDGFDZD`Y0iJ%kOgnsR^6%nGyF{+S&hU@ta025G}73E-X{?=GB; z5lWIP6yoxPN0~b8|Lv+(EtW9k?$e=%5{!l?VjMfh(<-kxo)qQ9@+o z4!x^u^U@U?yIbMBuGCM)JaxUe476-5!mXX&)=nm=AlX^UD&C7!OrkxP6`>?H>4$~U zpp0~y4m_K+TJ5vn<>@=DWn>~VFe(baTp3$@0*8bL`}uz;)IuK0pJd{|?|vJ&?DKtt zDTS4U%${Jphp-@<1CADr)ek$N_eE~=F+a=wy5`3^s1rn1evk(@DH-~r^}cy^ZjFSP zGtE|7A}PK52^%Agk<7(GYSyfJWoFO{-H=JHSmv#QV%WU`@53Bq(Ph4OVWr=}5;z+9 z2VINMZL+hjquiH?!E~YR+6x6yL6%VxtUMwv>!Qae?m5dDa9*$S64PcQOgyYs+t*p; zEuzZm=ji1?jmKVFBPZFxq`KetS1MjTM>`Mzw<4$YqNP+R9)wzbUPj#n5uKSoFWz?) zwT!j$l1qs6gpm|nG_1~b%hFKMw2E=!ZmYetgYqVpDa!;&LDFVO6?8cb)mZK8r6x;t z9*gA{qVQuYIn^>nxO#Q$T|4dus=&O$hF{}o(v_yZHA^d`ZI|+sVnXKu&9PxOl8U4f z4CrwvScDoX{WqFgLoEc~vPvET?T80BWst*%7lFVOvK;{}x1tRfuM)y*FJJ=$4>lgC z`*K=Mq7sxfPA0qak7}afiuz>Z>Tp0xeDF=_#%ob2yT^!^ZYyUq#;IY) z{R`3+D9wL(S(Qw``amq;xqx>2k*w2yIQfHJjok<(S;%z_mBq&%u* z|88{YgwE)9pa@qTG&>x;K`^X!Y%)g(yFMmo<=Dw?@m{>?M1Xzy4GVCVL)s){V&f>7 z4k8b9w*|-sPZS}7N0Go^1zrwF`FJArGaxQ=lvWaD``E$tzH zEWd~6t8&C=Cf!t>Pft?j_hp$`Qi|}>Gqkr6Vn+kGW&!gr?NmU7xn&KJt4&3bjfch2 zp`F5-EH;ZcFA+DbYSaye6nO&Ga;vsbFQ}QZY)I7*ZlVuC27k*#4X&6FHBR1-JmCoc zQ&Oj68_RG5Y2l>tlCKU0(70h=*{H2Q?@Vn|D|@murZ-r(RAiHdt0UG!2|9X)L% z;Y3WNgsF0{@JoVOG$esTK#GP)@)Zg`CINx1 z3N$l|It00O*QdELOJFf9Tn=Yy>BEhEKAFRtTHLje9aIhH_<_(=3qA%h_gZ!Q!XD=e z>^8zMf@lVYt}m$V0A>^s?ASh&kU~pHZC#I!izR% z5YG2G>~N3`{qkpQ4#F+&<_34$rpuBMeyjQwyj|`OysUWw_qaEfqE&wkRBpL#)755k zoDBZZu)(5n#BMh=bJ`C=#eRkIQ|wsZA7qrq$~#7AlTnkg;kr{?p&NywyYE>SNN#13 z%kLL{7~b@|J;B!W6fBuxT}mvJEE!@NKtlQ}+ne%84sO7`AImQ>g2g~x9bL)7ppH8g z<9M!pq7l?|%Gh45zEIklQ3=xfA2d@+7aQD9)0gi3T|l-&-35Nqw5v{?dcLxrm&-qu zUw2Uk>k()DL-4yDe-9+&#;c3Lm<+T?Ua?5O-r031Q>*oBBNK4V`3Fb^n=9Fo@&MwH zaKDFr2_N@alBOkmoE%1pooz|+I~MfM?>HBqkK-emt49NQUM*@&_I1esPuPblly-8B z>RSd-Wu87 zn&8q~rx2KH^4l$8?DDXmG?E{>h+RCuQNU9(gyPW1aI*}d=F>2j{$KT>1y^9f4EB_= zJByd{S8`Z?B%IOaUy5JX97M#B3Ir7D+8N4Pt=oJFp&q(TZvs^>9zh(Di9BObwF!zr zbN~Iy#7aL@hArF#Vp`Y9s{U7v3BZs7H-c8}w|<^R2`?yX!&sk=zHY##PAHSDY3StU z|JB_8U(6pR0>2ef{I|m(G$SJ9sAF!Qu^PqfVHUS|$WVeNv0`+r%)sT`BUpSf(dyk} zl3??eAiot~npv*xP4YpZW%hT3?!lRa#8s|4l*I?+^)%Jw-RS4T%Z$DhMvmHwG2;1` zfH*l@?IiyK!zd}crpq`ke-pY6IrrmTh2vLNY3pWG|HUrn+1pp{!{{o8d&we}P`Rx_jq97);vG({+7XPXlM?BP@#$aQh+(<@O&!(4ROSN4Jz6~A-y*LwPMBb?p zn_#c%`kC%iH~uAcW${IwT`2avb{=L@i|I7kxfu7+Uv7QStRNka3Kxgy}jx}(Ph#j|rI?wJ% zhokmvnZUT1rep{k1yYyAkHH6F8T+2Cy<|8x0*Q%=^Uc}|S=B83vOb8j7h^-($iS$i zY9V^R_E+^GBt-vgBdktZ)B4A14Te0`joxe3@ab?xa&@gDNHjDTBcLICUq^ICe3Bhg z(j3|~e3A4?FYmor-PeKoV@*sZCj^A!dtIgWB;XP|nBS9b6_GRfTwm=DQHVTe2W|=MfPvAn&6m<` z3d7>6gtG%q1L2d=qyOfge9ZJ>w@SfnaI(F+Sf8 zUL2A$-_Hzn7lmENs^8PoRk*8z^m;UFBwxtlHS!dB3jC6ZeSUtzntPKj?1)W7D4P-e zEN_^2?)I-Nsw~T(^M-4DwqO|`sH8CedaP-p+0_SHlN&q=Q}2y?R%kE_-Z9#iw~9#( z6yO8{Ek)Bsy@PKMerSkp9rlEb%zW|kZ#-7U_$igLo>%4SxIaNh$lF@B?b~R!xCj;O zvq(Ga?2E~P)2Otch9#rxdHDp%2y`{*qEKq3e?%tSJLQ)o}I3tcag{lPx=SJo7Wp(RQt6)M(-P5ZZ)FU2kgn? z)ZmNMRl?PXlpST&*Q!T|1c0a2`cglWs5l^5cAYH9R_>XyKoW z{|U?`c46wuRz zqpss7>eK}|wq-Maw|{;5Hu5-7?zie3o1jl_`;QjmO1X62h%hkl=2A5Q4a-!rr25zC z=5VNnQrR(OmDF@)SX=BjQmH&)U64_GZ&wlkPuQc!#XVaNjN^SKu zaZOjRADcDn%eo<(9VP=^emY5r*Tz4CM!`Jx3e1)G^@Q|}4LP>zxN(uT^}B7WH-i42 zPQ5t9<*T72r#BVOE*wL7vd4_`)9E2Spvg=kTaY2kiExs$h}~YF`RKjuy&3asr{Ku! zXI));WiN+7avT!PM)(d4SrbqnsQoD5CgsGKx$fr4(DErg`4P`@VWKC^1r;!Ya5`uQ{@ zAuR0&;&|EQh~h^TH6pgg8EkG#a&2@8hR+~vn_wB6?c?G-`(w6C4HPDliF4F(l-WvNS6Q;5k z>0o~A>#O;3H-wfiNKs{>dHjuNchy+n{&Lw6v1qwkO8>0SZStYND=XsblFW!>s>a$t zzH*hRbp%r{#XhM)PgG_%jkV~eteS2q59rnwNZTxlG$q+B0q?mK0 zqA6PRxrAf-(Q>S4w#EA;QkLcw8VzHy;a1J>e*D>> zRo3p!^3oOFip5peg5t}b`}V7sycqeqhJ|C4ZURV?TCUSfl1*7-XF3q$=J`Gf7OL2Z zY1Czk4Rw`eYquv0ajnnzz87sA!R71nh^T8{BStkKuVLex)pH#^S5RM;xrrTSErS7N zOQSS6s~s`Hum)Z$(d2mx4i{^nnj(mNQqy0HPLTspAQMD#B@}D&9?OY)h7r=I*PruP zs05utPucCuXYq()6h{~YAaE7WtTi(NXa_OE&15<0e+yN9!Uk(ypWB!X_maj(p d-T9X1=!z(Y$#zf57cR#3bUT)uo$L(<^FPjCQy~BV literal 74768 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 z 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 diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.svg b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.svg index 80cf2b2936..751083ee48 100644 --- a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.svg +++ b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.svg @@ -1,12 +1,12 @@ -Created by FontForge 20190112 at Thu Mar 21 16:19:01 2019 +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 By Robert Madole Copyright (c) Font Awesome diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.ttf b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.ttf index 17b86c2f0a22733d3581f575536f4fef6979d929..eb3cb5ef66108375fa9405584df000de398d3244 100644 GIT binary patch delta 210 zcmZ3}#k8i2NrZusfq{XSp@D&!A;8To#J6jv?!Jj4F)X4Y4%;V|_&DgA+wNsxD1XAh zz#3YRUtIFX-*GnsL#+)11N&-_UPjN~&yAJmeu(F{`O3h}1T>6+;igQJDwNjQ#As5< zYRRC-U@-Y$r7WASsh*{t!Q=@wVZ6o+MhqYcO9l%Dlgaz5Om)G^7&I9ejEyYyEG3`O3h}1T>6+;l|Dlj!@cV6QfBb zs|AA|gW=?Zm9lKQrg|27hLb1Mgz*|P7%^A^CCowe;(?9O97=fEByW3Sn184cz&C&4BSi%AaGNrNfk=#{D1R* zCsRA)Ng$Vl0W1vwpH&VPvl}@s0)KAPKoExiwbNE@rK&AzL4?C11Wi=pL?w>uTu`Z$ z0~bV90TL(I-6mFJuVrr=^$~i3r{Khy6XL`p@DK>`09+Ywr-7ihLWstS_uHM{Gym8F z;Es3!fwSLjbeILIIAwM)gAdFu?h3(NK~=nFp2B_cnRyzwoGSAi9y)KB=YMh2`OdtE z8}2&u5@y_I%*&{{Z<$v}^M!epG(V`isLax?ZJm@X$nkS#2Mc(|?BWSNF;~zL_n4>f zRE(IX(GuU7=kUsDGta|wJ~A)jf$K6aVZnXOyo`?fl6i$R@0nLg^A+3B$Z&!jG5Q$5 zK%#~Sby|BAOYO-PMo=hdpMTJbZJnLuaerWBEvn0&PL13esX`|dyX+we-=@ro%iRv$ z`#8c7A)Vp(B+{3?Tq(Ju`bWc%f`4eo=l@o#K~WC@{aaVoZTMc`wXUb5N7%3q0&LQV zl&}2qD#vusX&+lf*VaAvU#CC>GJm^2_TRY3KWFnx z^Nq3jU7C~9Sea-KYm`h8va$<4C8nP)3I7zBF174`V~>a##(OD(Iaw={n#J!-)<(TRtJVF$;@T@N{(#hX`-w}(x=l`C}t7qmKeEtLg4*0LLRy|GxOglQ~ delta 653 zcmV;80&@MNg8`(20gx5~x}T949|;-&0010`(~0ttKy(BYPFtgqxLXMk000G5C^R|4 zlN*5%rw9!tbGKF?ykfaMY zMncrY)i4b0gm&&^=0d|GxY4I@<=T~TDP|IAzf zH`Q|}oc?a0DXdV&Yhedd_#o`!mQuncl+`QY3EWYig(q>{DGSfwzVk+S7JnaQurtAG0=|F!e{OEteR zUmKa<<#SRPD+=vlm5UJ<(;N%?sXb9=Wr%Huwl#4+vWkFL`y37LYt|jI#_%}U?L{<< z_EvKm=-g1M)1o28p-w1|30Dl@2Y>s0&k_5c|NCTKerB$~=TGs%_^AN1Ry|GxtYba6 diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.woff2 b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-regular-400.woff2 index c446ff7aecd6b60065fd60728a230367cdca6f2a..b9344a742ff2089c6bf862dcb92700cbed31cf0b 100644 GIT binary patch literal 13580 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 S)`hUC=>}_BlnnbyiU9!eaGWRr literal 13552 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 diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.eot b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.eot index dfc8921a364c4094743cfdccdb77ad6d2d63f31b..c77baa8d46ab45aff98845588c807e81b73c9d91 100644 GIT binary patch delta 17196 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 aK6c_zp`MD5@Wb!NdYV2GL1XNX#s3dh&;TO< diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.svg b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.svg index 132373b3ef..627128b82c 100644 --- a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.svg +++ b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.svg @@ -1,12 +1,12 @@ -Created by FontForge 20190112 at Thu Mar 21 16:19:01 2019 +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 By Robert Madole Copyright (c) Font Awesome @@ -23,7 +23,7 @@ Copyright (c) Font Awesome bbox="-0.983398 -64.9834 640.104 448.427" underline-thickness="25" underline-position="-51" - unicode-range="U+0020-F83E" + unicode-range="U+0020-F897" /> d="M512 304v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h88l12.2998 32.9004c7 18.6992 24.9004 31.0996 44.9004 31.0996h125.5c20 0 37.8994 -12.4004 44.8994 -31.0996l12.4004 -32.9004h88c26.5 0 48 -21.5 48 -48zM376 160 c0 66.2002 -53.7998 120 -120 120s-120 -53.7998 -120 -120s53.7998 -120 120 -120s120 53.7998 120 120zM344 160c0 -48.5 -39.5 -88 -88 -88s-88 39.5 -88 88s39.5 88 88 88s88 -39.5 88 -88z" /> +d="M432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h19.5801l-23.2998 64h-152.561l-23.2998 -64h19.5801c8.83203 0 16 -7.16797 16 -16v-32 +c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h23.4102l130.71 362.31c4.07422 11.9736 17.6465 21.6904 30.2939 21.6904h0.00585938h47.1602h0.00585938c12.6475 0 26.2197 -9.7168 30.2939 -21.6904 +l130.71 -362.31h23.4102zM176.85 176h94.3008l-47.1504 129.49z" /> +d="M333.49 210c34.4395 -27.54 55.5693 -71.1504 50.8301 -119.6c-6.86035 -70.6504 -70.2002 -122.4 -141 -122.4h-209.32c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16h31.8701v288h-31.8701c-8.83203 0 -16 7.16797 -16 16v48 +c0 8.83203 7.16797 16 16 16h199.42c74.5801 0 134.45 -64.4902 127.07 -140.79c-2.01367 -20.25 -14.1094 -49.4639 -27 -65.21zM145.66 336v-96h87.7598c26.4961 0 48 21.5039 48 48s-21.5039 48 -48 48h-87.7598zM233.42 48c30.9121 0 56 25.0879 56 56 +s-25.0879 56 -56 56h-87.7598v-112h87.7598z" /> +d="M320 400v-32c0 -8.83203 -7.16797 -16 -16 -16h-62.7598l-80 -320h46.7598c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-192c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h62.7598l80 320h-46.7598 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192c8.83203 0 16 -7.16797 16 -16z" /> +d="M304 416c8.83203 0 16 -7.16797 16 -16v-96c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32h-56v-304h40c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-160c-8.83203 0 -16 7.16797 -16 16v32 +c0 8.83203 7.16797 16 16 16h40v304h-56v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v96c0 8.83203 7.16797 16 16 16h288zM560 80c15.6396 0 20.6396 -18 11.3096 -27.3096l-80 -80c-2.58594 -2.58496 -7.65332 -4.68262 -11.3096 -4.68262 +s-8.72363 2.09766 -11.3096 4.68262l-80 80c-10.0107 10 -3 27.3096 11.3096 27.3096h48v224h-48c-15.6396 0 -20.6396 18 -11.3096 27.3096l80 80c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262l80 -80 +c10.0205 -10 3 -27.3096 -11.3096 -27.3096h-48v-224h48z" /> +d="M432 416c8.83203 0 16 -7.16797 16 -16v-80c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v16h-120v-112h24c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32 +c0 8.83203 7.16797 16 16 16h24v112h-120v-16c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v80c0 8.83203 7.16797 16 16 16h416zM363.31 155.31l80 -80c2.58496 -2.58594 4.68262 -7.65332 4.68262 -11.3096s-2.09766 -8.72363 -4.68262 -11.3096 +l-80 -80c-10 -10.0205 -27.3096 -3 -27.3096 11.3096v48h-224v-48c0 -15.6396 -18 -20.6396 -27.3096 -11.3096l-80 80c-2.58496 2.58594 -4.68262 7.65332 -4.68262 11.3096s2.09766 8.72363 4.68262 11.3096l80 80c10 10.0107 27.3096 3 27.3096 -11.3096v-48h224v48 +c0 15.6396 18 20.6396 27.3096 11.3096z" /> +d="M12.8301 96c-7.07715 0 -12.8301 5.74316 -12.8301 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34h0.00976562c7.07715 0 12.8203 -5.74316 12.8203 -12.8203v-0.00976562v-38.3398v-0.00976562 +c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34zM12.8301 352c-7.07715 0 -12.8301 5.74316 -12.8301 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34h0.00976562 +c7.07715 0 12.8203 -5.74316 12.8203 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34zM432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16 +v32c0 8.83203 7.16797 16 16 16h416zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" /> +d="M432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16 +v32c0 8.83203 7.16797 16 16 16h416zM108.1 352c-6.67871 0 -12.0996 5.4209 -12.0996 12.0996v39.8105c0 6.67383 5.41602 12.0898 12.0898 12.0898h0.00976562h231.811c6.67383 0 12.0898 -5.41602 12.0898 -12.0898v-39.8105v-0.00976562 +c0 -6.67383 -5.41602 -12.0898 -12.0898 -12.0898v0h-231.811zM339.91 96h-231.811c-6.67871 0 -12.0996 5.4209 -12.0996 12.0996v39.8105c0 6.67383 5.41602 12.0898 12.0898 12.0898h0.00976562h231.811c6.67383 0 12.0898 -5.41602 12.0898 -12.0898v-39.8105 +v-0.00976562c0 -6.67383 -5.41602 -12.0898 -12.0898 -12.0898v0z" /> +d="M16 224c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16 +v32c0 8.83203 7.16797 16 16 16h416zM435.17 416c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203 +v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34zM435.17 160c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34 +h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34z" /> +d="M432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM432 160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16 +v32c0 8.83203 7.16797 16 16 16h416zM432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM432 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16 +h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" /> +d="M80 80c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v64c0 8.83203 7.16797 16 16 16h64zM80 400c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v64 +c0 8.83203 7.16797 16 16 16h64zM80 240c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v64c0 8.83203 7.16797 16 16 16h64zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 384c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 224c8.83203 0 16 -7.16797 16 -16v-32 +c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320z" /> +d="M100.69 84.71l-96 95.9805c-2.58496 2.58594 -4.68262 7.65332 -4.68262 11.3096s2.09766 8.72363 4.68262 11.3096l96 96c9.97949 10 27.3096 3.01074 27.3096 -11.3096v-191.98c0 -14.2393 -17.3096 -21.3096 -27.3096 -11.3096zM432 32c8.83203 0 16 -7.16797 16 -16 +v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM435.17 160c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562 +h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM435.17 288c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562 +c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM432 416c8.83203 0 16 -7.16797 16 -16 +v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" /> +d="M27.3096 84.7002c-9.97949 -10 -27.3096 -3.00977 -27.3096 11.2998v192c0 14.2197 17.2695 21.3398 27.3096 11.3203l96 -96c2.58496 -2.58691 4.68262 -7.65332 4.68262 -11.3105c0 -3.65625 -2.09766 -8.72363 -4.68262 -11.3096zM432 32 +c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM435.17 160c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562 +c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM435.17 288 +c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562 +c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM432 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" /> @@ -567,11 +572,13 @@ d="M507.73 338.9c11.7891 -47.4102 -0.84082 -99.6602 -37.9102 -136.73c-39.9004 -3 c-16.5 50.1006 -5.58984 107.561 34.0498 147.2c37.0303 37.0195 89.2002 49.6699 136.58 37.9297c9.08984 -2.25977 12.2803 -13.54 5.66016 -20.1602l-74.3604 -74.3594l11.3105 -67.8799l67.8799 -11.3105l74.3604 74.3604 c6.58008 6.58008 17.8799 3.51953 20.1201 -5.50977zM64 -24c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z" /> +d="M139.61 412.5l17 -16.5c1.90234 -1.94531 3.44727 -5.7334 3.44727 -8.4541c0 -2.7627 -1.58496 -6.5918 -3.53809 -8.5459l-72.1992 -72.1904l-15.5898 -15.6191c-2.04297 -1.94238 -5.9873 -3.51758 -8.80566 -3.51758c-2.81738 0 -6.7627 1.5752 -8.80469 3.51758 +l-47.5898 47.3994c-1.94824 1.94141 -3.5293 5.75 -3.5293 8.5c0 2.75098 1.58105 6.55859 3.5293 8.5l15.7002 15.7197c1.94141 1.94824 5.74902 3.53027 8.5 3.53027c2.75 0 6.55762 -1.58203 8.5 -3.53027l22.6992 -22.1191l63.6807 63.3096 +c1.94141 1.94824 5.74902 3.5293 8.5 3.5293c2.75 0 6.55859 -1.58105 8.5 -3.5293zM139.61 253.31l16.9795 -17c1.89648 -1.93164 3.43457 -5.69727 3.43457 -8.4043c0 -2.74805 -1.5791 -6.55371 -3.52441 -8.49512l-72.2002 -72.2197l-15.7002 -15.6904 +c-2.04102 -1.94141 -5.9834 -3.5166 -8.7998 -3.5166s-6.75879 1.5752 -8.7998 3.5166l-47.4697 47.5c-1.94824 1.94141 -3.5293 5.74902 -3.5293 8.5s1.58105 6.55859 3.5293 8.5l15.7002 15.6904c1.94141 1.94824 5.74902 3.5293 8.5 3.5293 +c2.75 0 6.55762 -1.58105 8.5 -3.5293l22.6992 -22.1006l63.6807 63.7197c1.94141 1.94824 5.74902 3.53027 8.5 3.53027c2.75 0 6.55859 -1.58203 8.5 -3.53027zM64 80c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48c-26.4697 0 -48.5898 21.5 -48.5898 48 +s22.0996 48 48.5898 48zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288zM496 384c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288zM496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288z" /> @@ -627,30 +634,30 @@ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 - d="M16 316c-8.83691 0 -16 7.16309 -16 16v40c0 8.83691 7.16309 16 16 16h416c8.83691 0 16 -7.16309 16 -16v-40c0 -8.83691 -7.16309 -16 -16 -16h-416zM16 156c-8.83691 0 -16 7.16309 -16 16v40c0 8.83691 7.16309 16 16 16h416c8.83691 0 16 -7.16309 16 -16v-40 c0 -8.83691 -7.16309 -16 -16 -16h-416zM16 -4c-8.83691 0 -16 7.16309 -16 16v40c0 8.83691 7.16309 16 16 16h416c8.83691 0 16 -7.16309 16 -16v-40c0 -8.83691 -7.16309 -16 -16 -16h-416z" /> +d="M48 400c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48s-48 21.5039 -48 48s21.5039 48 48 48zM48 240c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48s-48 21.5039 -48 48s21.5039 48 48 48zM48 80c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48 +s-48 21.5039 -48 48s21.5039 48 48 48zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 384c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16 +h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320z" /> +d="M61.7695 47c19.6104 -5.12012 28.7002 -20.5 28.7305 -34.8799c0 -21.3701 -14.3398 -44.1201 -48.5 -44.1201c-16.6201 0 -29.29 4.75 -37 9.44043c-5.82031 4.21973 -6.34961 9.80957 -2.62988 15.9395l5.58984 9.31055c3.86035 6.61914 9.11035 7 15.5996 3.11914 +c4.10352 -1.68652 11.0342 -3.08496 15.4707 -3.11914c10.1602 0 14.3594 3.5 14.3594 8.21973c0 6.64941 -5.60938 9.08984 -15.9395 9.08984h-4.73047c-5.95996 0 -9.25 2.12012 -12.25 7.87988l-1.0498 1.92969c-2.4502 4.75 -1.2002 9.81055 2.7998 14.8809l5.61035 7 +c2.85742 3.55664 7.78516 9.07129 11 12.3096h-22.8301c-4.41602 0 -8 3.58398 -8 8v16c0 4.41602 3.58398 8 8 8h57c7.5 0 11.3398 -4 11.3398 -11.3496v-3.31055c0.0107422 -0.245117 0.0205078 -0.644531 0.0205078 -0.890625 +c0 -4.20801 -2.28027 -10.166 -5.09082 -13.2988zM496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 384c8.83203 0 16 -7.16797 16 -16v-32 +c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM16 288 +c-4.41602 0 -8 3.58398 -8 8v16c0 4.41602 3.58398 8 8 8h16v64h-8c-4.4082 0.0078125 -7.98535 3.5918 -7.98535 8c0 1.04297 0.378906 2.64746 0.845703 3.58008l8 16c1.21777 2.43457 4.41699 4.41504 7.13965 4.41992h24c4.41602 0 8 -3.58398 8 -8v-88h16 +c4.41602 0 8 -3.58398 8 -8v-16c0 -4.41602 -3.58398 -8 -8 -8h-64zM12.0898 128c-7.00977 0 -12.0898 4 -12.0898 11.4102v4c0 47.2803 51 56.3994 50.9697 69.1201c0 7.18945 -5.9502 8.75 -9.2793 8.75h-0.0546875c-3.02832 0 -7.24219 -1.7207 -9.40527 -3.83984 +c-5.12012 -4.91016 -10.5107 -7 -16.1201 -2.44043l-8.58008 6.87988c-5.7998 4.53027 -7.16992 9.78027 -2.7998 15.3701c6.65918 8.75 19.0996 18.75 40.46 18.75c19.4697 0 44.4697 -10.5 44.4697 -39.5596c0 -37.7607 -45.0498 -46.1504 -48.3398 -56.4404h38.6797 +c4.41602 0 8 -3.58398 8 -8v-16c0 -4.41602 -3.58398 -8 -8 -8h-67.9102z" /> +d="M496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-480c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h102.29c-11.6797 16.5303 -19.7803 35.4697 -21.7803 56.3604c-0.319336 3.29297 -0.579102 8.65137 -0.579102 11.96 +c0 68.2158 55.3633 123.624 123.579 123.68h68h0.0117188c43.6865 0 94.9863 -31.7188 114.509 -70.7998l0.529297 -1c0.930664 -1.86328 1.68652 -5.06641 1.68652 -7.14844c0 -5.45898 -3.96289 -11.8711 -8.8457 -14.3115l-42.9404 -21.4707 +c-1.86426 -0.931641 -5.06836 -1.6875 -7.15234 -1.6875c-5.45605 0 -11.8652 3.95996 -14.3076 8.83789c-7.61133 15.2246 -27.6025 27.5801 -44.624 27.5801h-0.0361328h-66.79c-24.0391 -0.000976562 -43.5488 -19.5107 -43.5488 -43.5498 +c0 -17.749 13.7666 -36.3945 30.7295 -41.6201l87.1699 -26.8301h202.1zM315.76 128h94.3906c2.21191 -6.56152 4.60352 -17.4746 5.33984 -24.3604c0.319336 -3.29297 0.579102 -8.65137 0.579102 -11.96c0 -68.2158 -55.3633 -123.624 -123.579 -123.68h-68h-0.0117188 +c-43.6865 0 -94.9863 31.7188 -114.509 70.7998l-0.529297 1c-0.930664 1.86328 -1.68652 5.06641 -1.68652 7.14844c0 5.45898 3.96289 11.8711 8.8457 14.3115l42.9404 21.4707c1.86426 0.931641 5.06836 1.6875 7.15234 1.6875 +c5.45605 0 11.8652 -3.95996 14.3076 -8.83789c7.61133 -15.2246 27.6025 -27.5801 44.624 -27.5801h0.0361328h66.79c24.0176 0.0224609 43.5273 19.5322 43.5498 43.5498c-0.00976562 13.1572 -9.07715 29.4863 -20.2402 36.4502z" /> +d="M32 384c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h144c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-160c0 -44.1602 35.8398 -80 80 -80s80 35.8398 80 80v160h-32c-8.83203 0 -16 7.16797 -16 16v32 +c0 8.83203 7.16797 16 16 16h144c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-160c0 -88.2197 -71.7803 -160 -160 -160s-160 71.7803 -160 160v160h-32zM432 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" /> +d="M496 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v96h-16c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32 +c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-144h16zM336 384c8.83203 0 16 -7.16797 16 -16v-48c0 -8.83203 -7.16797 -16 -16 -16h-33.4805l-77.8096 -112l77.8096 -112h33.4805c8.83203 0 16 -7.16797 16 -16v-48 +c0 -8.83203 -7.16797 -16 -16 -16h-67c-4.58984 0.0224609 -10.4404 3.10059 -13.0596 6.87012l-79.9004 115l-79.9004 -115c-2.63477 -3.79199 -8.52148 -6.87012 -13.1387 -6.87012h-0.000976562h-67c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16 +h33.4805l77.8096 112l-77.8096 112h-33.4805c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16h67c4.58984 -0.0224609 10.4404 -3.10059 13.0596 -6.87012l79.9004 -115l79.9004 115c2.63477 3.79199 8.52148 6.87012 13.1387 6.87012h0.000976562h67z" /> +d="M496 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v96h-16c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32 +c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-144h16zM336 384c8.83203 0 16 -7.16797 16 -16v-48c0 -8.83203 -7.16797 -16 -16 -16h-33.4805l-77.8096 -112l77.8096 -112h33.4805c8.83203 0 16 -7.16797 16 -16v-48 +c0 -8.83203 -7.16797 -16 -16 -16h-67c-4.58984 0.0224609 -10.4404 3.10059 -13.0596 6.87012l-79.9004 115l-79.9004 -115c-2.63477 -3.79199 -8.52148 -6.87012 -13.1387 -6.87012h-0.000976562h-67c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16 +h33.4805l77.8096 112l-77.8096 112h-33.4805c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16h67c4.58984 -0.0224609 10.4404 -3.10059 13.0596 -6.87012l79.9004 -115l79.9004 115c2.63477 3.79199 8.52148 6.87012 13.1387 6.87012h0.000976562h67z" /> @@ -1042,41 +1045,41 @@ d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 - c0 -6.59961 5.40039 -12 12 -12h168c6.59961 0 12 5.40039 12 12zM288 140v8c0 6.59961 -5.40039 12 -12 12h-168c-6.59961 0 -12 -5.40039 -12 -12v-8c0 -6.59961 5.40039 -12 12 -12h168c6.59961 0 12 5.40039 12 12zM288 212c0 6.59961 -5.40039 12 -12 12h-168 c-6.59961 0 -12 -5.40039 -12 -12v-8c0 -6.59961 5.40039 -12 12 -12h168c6.59961 0 12 5.40039 12 12v8zM384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004z" /> +d="M176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96c-10.0703 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32 +c8.83203 0 16 -7.16797 16 -16v-304h48zM416 160c8.83203 0 16 -7.16797 16 -16v-17.6299v-0.00292969c0 -7.93262 -4.81152 -18.6475 -10.7402 -23.917l-61.2598 -70.4502h56c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128 +c-8.83203 0 -16 7.16797 -16 16v17.6299v0.00292969c0 7.93262 4.81152 18.6475 10.7402 23.917l61.2598 70.4502h-56c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128zM447.06 245.38c0.514648 -1.44043 0.931641 -3.85059 0.931641 -5.37988 +c0 -8.82715 -7.16406 -15.9951 -15.9912 -16h-24.8398h-0.0449219c-6.42773 0 -13.249 4.96387 -15.2256 11.0801l-4.40918 12.9199h-71l-4.4209 -12.9199c-1.97559 -6.11621 -8.79688 -11.0801 -15.2246 -11.0801h-0.00488281h-24.8301 +c-8.82715 0.00488281 -15.9912 7.17285 -15.9912 16c0 1.5293 0.416992 3.93945 0.931641 5.37988l59.2695 160c2.09277 5.8623 8.84375 10.6201 15.0684 10.6201h0.00195312h41.4395h0.00195312c6.22461 0 12.9756 -4.75781 15.0684 -10.6201zM335.61 304h32.7793 +l-16.3896 48z" /> +d="M16 288c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32 +c-8.83203 0 -16 7.16797 -16 16v304h-48zM416 160c8.83203 0 16 -7.16797 16 -16v-17.6299v-0.00292969c0 -7.93262 -4.81152 -18.6475 -10.7402 -23.917l-61.2598 -70.4502h56c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128 +c-8.83203 0 -16 7.16797 -16 16v17.6299v0.00292969c0 7.93262 4.81152 18.6475 10.7402 23.917l61.2598 70.4502h-56c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128zM447.06 245.38c0.514648 -1.44043 0.931641 -3.85059 0.931641 -5.37988 +c0 -8.82715 -7.16406 -15.9951 -15.9912 -16h-24.8398h-0.0449219c-6.42773 0 -13.249 4.96387 -15.2256 11.0801l-4.40918 12.9199h-71l-4.4209 -12.9199c-1.97559 -6.11621 -8.79688 -11.0801 -15.2246 -11.0801h-0.00488281h-24.8301 +c-8.82715 0.00488281 -15.9912 7.17285 -15.9912 16c0 1.5293 0.416992 3.93945 0.931641 5.37988l59.2695 160c2.09277 5.8623 8.84375 10.6201 15.0684 10.6201h0.00195312h41.4395h0.00195312c6.22461 0 12.9756 -4.75781 15.0684 -10.6201zM335.61 304h32.7793 +l-16.3896 48z" /> +d="M304 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h64zM176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96 +c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96c-10.0801 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-304h48zM432 288 +c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-192c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192zM368 160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32 +c0 8.83203 7.16797 16 16 16h128zM496 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-256c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h256z" /> +d="M304 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h64zM16 288c-14.2305 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262 +s8.72363 -2.09766 11.3096 -4.68262l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v304h-48zM432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16 +h-192c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192zM368 160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128zM496 416c8.83203 0 16 -7.16797 16 -16v-32 +c0 -8.83203 -7.16797 -16 -16 -16h-256c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h256z" /> +d="M304 352c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-112h16c8.83203 0 16 -7.16797 16 -16v-32 +c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v64h-16zM330.15 189.09c53.4502 14.25 101.85 -25.8799 101.869 -77.0898v-10.7695c0 -70.3906 -28.25 -107.24 -86.25 -132 +c-8.36914 -3.58008 -18.0293 1.2793 -20.8994 9.90918l-9.90039 20c-2.62012 7.87012 0.610352 16.9404 8.18066 20.3408c6.2793 2.71387 15.6201 8.49805 20.8496 12.9092c-47.6396 4.76074 -83.0996 51.4805 -68.8496 102.53c6.80762 23.4512 31.4473 47.7197 55 54.1699z +M352 92c11.04 0 20 8.95996 20 20s-8.95996 20 -20 20s-20 -8.95996 -20 -20s8.95996 -20 20 -20zM176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262 +l-80 96c-10.0703 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-304h48z" /> +d="M330.17 189.09c53.4502 14.25 101.83 -25.8799 101.85 -77.0898v-10.7695c0 -70.3906 -28.25 -107.24 -86.25 -132c-8.36914 -3.58008 -18.0293 1.2793 -20.8994 9.90918l-9.90039 20c-2.62012 7.87012 0.610352 16.9404 8.18066 20.3408 +c6.2793 2.71387 15.6201 8.49805 20.8496 12.9092c-47.6396 4.76074 -83.0996 51.4805 -68.8301 102.53c6.80762 23.4512 31.4482 47.7197 55 54.1699zM352 92c11.04 0 20 8.95996 20 20s-8.95996 20 -20 20s-20 -8.95996 -20 -20s8.95996 -20 20 -20zM304 352 +c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-112h16c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v64h-16zM107.31 411.31l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v304h-48 +c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262z" /> +d="M448 352v-320h32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-160c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32v128h-192v-128h32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-160 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32v320h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-128h192v128h-32c-8.83203 0 -16 7.16797 -16 16v32 +c0 8.83203 7.16797 16 16 16h160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32z" /> +d="M448 400v-32c0 -8.83203 -7.16797 -16 -16 -16h-48v-368c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v368h-32v-368c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v112h-32c-88.3203 0 -160 71.6797 -160 160 +s71.6797 160 160 160h240c8.83203 0 16 -7.16797 16 -16z" /> +d="M74 240l-33.9102 90.3799c-0.5625 1.5 -1.01953 4.01758 -1.01953 5.62012c0 8.83203 7.16797 16 16 16h0.0195312h56.9102v32h-24c-4.41602 0 -8 3.58398 -8 8v16c0 4.41602 3.58398 8 8 8h24v24c0 4.41602 3.58398 8 8 8h16c4.41602 0 8 -3.58398 8 -8v-24h24 +c4.41602 0 8 -3.58398 8 -8v-16c0 -4.41602 -3.58398 -8 -8 -8h-24v-32h56.8896h0.0195312c8.83203 0 16 -7.16797 16 -16c0 -1.60254 -0.456055 -4.12012 -1.01953 -5.62012l-33.8896 -90.3799h10c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16 +h-15.9404c0.116211 -35.8613 7.25684 -93.2051 15.9404 -128h-128c8.68359 34.7949 15.8242 92.1387 15.9404 128h-15.9404c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h10zM247.16 -11.5801c4.87988 -2.44141 8.83984 -8.85156 8.83984 -14.3086 +v-0.000976562v-22.1104c0 -8.83203 -7.16797 -16 -16 -16h-224c-8.83203 0 -16 7.16797 -16 16v22.1104c0.000976562 5.45898 3.96582 11.8701 8.84961 14.3096l23.1504 11.5801v16c0 8.83203 7.16797 16 16 16h160c8.83203 0 16 -7.16797 16 -16v-16zM339.93 146.2 +l-24.5693 20.7998c-6.25684 5.28125 -11.3467 16.2119 -11.3604 24.4004v58.5996c0 3.31152 2.68848 6 6 6h26.3896c3.3125 0 6 -2.68848 6 -6v-26h24.71v26c0 3.31152 2.68848 6 6 6h53.8105c3.31152 0 6 -2.68848 6 -6v-26h24.71v26c0 3.31152 2.6875 6 6 6h26.3799 +c3.31152 0 6 -2.68848 6 -6v-58.54v-0.03125c0 -8.19238 -5.07617 -19.1367 -11.3301 -24.4287l-24.5996 -20.79l3.29004 -82.21h-126.721zM384 144v-32h32v32c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16zM503.16 -11.5801 +c4.87988 -2.44141 8.83984 -8.85156 8.83984 -14.3086v-0.000976562v-22.1104c0 -8.83203 -7.16797 -16 -16 -16h-192c-8.83203 0 -16 7.16797 -16 16v22.1104c0.000976562 5.45898 3.96582 11.8701 8.84961 14.3096l23.1504 11.5801v16c0 8.83203 7.16797 16 16 16h128 +c8.83203 0 16 -7.16797 16 -16v-16z" /> +d="M8 160.12c0 73.3799 59.8096 181.08 112.6 225.37c-14 3.41992 -24.5996 15.5098 -24.5996 30.5098c0 17.6641 14.3359 32 32 32h64c17.6641 0 32 -14.3359 32 -32c0 -15.0498 -10.5996 -27.0898 -24.5996 -30.5098c24.3994 -20.4902 50.0693 -54.6807 70.8691 -92.5898 +l-107.89 -107.931c-1.29199 -1.29297 -2.34082 -3.82617 -2.34082 -5.6543c0 -1.8291 1.04883 -4.3623 2.34082 -5.65527l11.3105 -11.3105c1.29297 -1.29199 3.82617 -2.34082 5.6543 -2.34082s4.3623 1.04883 5.65527 2.34082l100.31 100.33 +c15.96 -35.46 26.6904 -71.9492 26.6904 -102.56c0 -51.6006 -22.1396 -73.8301 -56 -84.6006v-43.5195h-192v43.5195c-33.8604 10.7705 -56 32.9609 -56 84.6006zM304 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288z" /> +d="M255.9 447.8v-64h-64v64h64zM0 383.83h64v-64h-64v64zM128 447.8v-64h-64v64h64zM192 191.9h64v-64h-64v64zM0 255.88h64v-64h-64v64zM383.85 447.8v-64h-64v64h64zM511.85 447.8v-64h-64v64h64zM128 191.9v-64h-64v64h64zM511.8 0h-64v64h64v-64zM511.8 128h-64v64h64 +v-64zM383.85 -64v64h64v-64h-64zM511.85 255.88h-64v64h64v-64zM128 -64v64h64v-64h-64zM0 -64v64h64v-64h-64zM255.9 -64v64h64v-64h-64zM0 127.93h64v-64h-64v64zM319.88 319.85h-64v64h64v-64zM255.88 191.85v64h64v-64h-64zM191.88 63.8496h64v-64h-64v64z +M319.88 127.85v64h64v-64h-64zM319.88 255.8v64h64v-64h-64zM319.88 63.8701h64v-64h-64v64zM64 63.9502h64v-64h-64v64zM192 319.85h-64v64h64v-64zM383.92 63.9502v64h64v-64h-64zM255.92 255.88h-64v64h64v-64zM383.92 383.83h64v-64h-64v64zM255.92 127.93h64v-64h-64 +v64zM191.92 255.88l0.0800781 -64h-64v64h63.9199zM383.84 191.88v64h64v-64h-64zM128 319.85v-64h-64v64h64zM128 127.93h64v-64h-64v64z" /> +d="M400 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352zM416 288c17.6504 -0.0136719 31.9756 -14.3496 31.9756 -32c0 -2.69434 -0.652344 -6.96777 -1.45605 -9.54004 +l-73.0791 -214.46h-298.881l-73.0791 214.46c-0.803711 2.57227 -1.45605 6.8457 -1.45605 9.54004c0 17.6504 14.3252 31.9863 31.9756 32h160v48h-40c-4.41602 0 -8 3.58398 -8 8v48c0 4.41602 3.58398 8 8 8h40v40c0 4.41602 3.58398 8 8 8h48c4.41602 0 8 -3.58398 8 -8 +v-40h40c4.41602 0 8 -3.58398 8 -8v-48c0 -4.41602 -3.58398 -8 -8 -8h-40v-48h160z" /> +d="M19 175.53c-10.4883 4.66211 -19 17.7627 -19 29.2402v0.0195312v137.21v0.0585938c0 5.47461 3.13574 13.0635 7 16.9414l9 9l-14.21 28.4199c-0.988281 1.97266 -1.79004 5.36328 -1.79004 7.56934v0.0107422c0 6.62402 5.37598 12 12 12h147.94 +c106 0 191.92 -86 191.92 -192v-192h-319.86v14.5195v0.0224609c0 27.2783 19.7969 59.3271 44.1904 71.5381l57.2197 28.6504c14.6445 7.32324 26.5303 26.5566 26.5303 42.9297v0.00976562v50.3301l-22.1201 -11.0801 +c-5.45117 -2.72559 -11.0732 -9.7373 -12.5508 -15.6504l-9.21973 -30.6494c-2.4502 -8.15332 -10.8545 -17.3379 -18.7598 -20.5l-12.7803 -5.12012c-3.1582 -1.2627 -8.48145 -2.28809 -11.8828 -2.28809c-3.74902 0 -9.57129 1.23535 -12.9971 2.75781zM52 320 +c-11.04 0 -20 -8.95996 -20 -20s8.95996 -20 20 -20s20 8.95996 20 20s-8.95996 20 -20 20zM368 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352z" /> +d="M105.1 224c-29.3896 18.3799 -49.0996 50.7803 -49.0996 88c0 57.4082 46.5918 104 104 104s104 -46.5918 104 -104c0 -37.2197 -19.71 -69.6201 -49.0996 -88h25.0996c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-16v-5.49023 +c0 -44 4.11035 -86.5996 24 -122.51h-176c19.8604 35.9102 24 78.5098 24 122.51v5.49023h-16c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h25.0996zM304 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288 +c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288z" /> +d="M256 336c-30.9121 0 -56 25.0879 -56 56s25.0879 56 56 56s56 -25.0879 56 -56s-25.0879 -56 -56 -56zM432 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352zM504.87 263.84 +c3.93457 -2.62109 7.12891 -8.58691 7.12891 -13.3154c0 -2.08496 -0.756836 -5.29004 -1.68945 -7.1543l-102.55 -211.37h-303.52l-102.55 211.33c-0.932617 1.86426 -1.68945 5.06934 -1.68945 7.1543c0 4.72852 3.19434 10.6943 7.12891 13.3154l28.5703 16 +c7.35938 4.91016 16.8096 2.5498 22.0898 -4.54004c7.86035 -10.6357 24.9736 -19.2676 38.1992 -19.2676c0.922852 0 2.41992 0.0527344 3.34082 0.118164c25.6699 1.73926 44.6699 24.7998 44.6699 50.4893c0 7.39746 6.00293 13.4004 13.4004 13.4004v0h38.7695 +c6.04004 0 11.6104 -3.99023 12.8604 -9.91016c4.42969 -21.0361 25.4717 -38.1094 46.9697 -38.1094s42.54 17.0732 46.9697 38.1094c1.25 5.91016 6.86035 9.91016 12.8604 9.91016h38.7695c7.39746 0 13.4004 -6.00293 13.4004 -13.4004 +c0 -23.5293 15.7002 -45.46 38.8398 -49.75c2.48926 -0.484375 6.56738 -0.878906 9.10352 -0.878906c13.166 0 30.2471 8.56152 38.127 19.1094c5.37988 7.13965 14.8496 9.67969 22.29 4.67969z" /> +d="M368 416c8.83203 0 16 -7.16797 16 -16v-176l-64 -32c0 -47.7197 1.54004 -95 13.21 -160h-282.42c11.6699 65 13.21 111.67 13.21 160l-64 32v176c0 8.83203 7.16797 16 16 16h56.0996c8.83203 0 16 -7.16797 16 -16v-48h47.9004v48c0 8.83203 7.16797 16 16 16h80 +c8.83203 0 16 -7.16797 16 -16v-48h48v48c0 8.83203 7.16797 16 16 16h56zM224 128v64c0 17.6641 -14.3359 32 -32 32s-32 -14.3359 -32 -32v-64h64zM368 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32 +c0 8.83203 7.16797 16 16 16h352z" /> +d="M224 192c-70.6562 0 -128 57.3438 -128 128s57.3438 128 128 128s128 -57.3438 128 -128s-57.3438 -128 -128 -128zM320 128v-160c0.0644531 -9.49707 4.05176 -23.833 8.90039 -32h-280.9c-26.4961 0 -48 21.5039 -48 48v41.5996 +c0.0166016 74.1729 60.2275 134.384 134.4 134.4h16.6992c19.1514 -8.83203 51.8105 -16 72.9004 -16s53.749 7.16797 72.9004 16h16.6992c5 0 9.7002 -1 14.5 -1.5c-4.41016 -7.84082 -8.03906 -21.5049 -8.09961 -30.5zM608 160c17.6641 0 32 -14.3359 32 -32v-160 +c0 -17.6641 -14.3359 -32 -32 -32h-224c-17.6641 0 -32 14.3359 -32 32v160c0 17.6641 14.3359 32 32 32h32v80c0 44.1602 35.8398 80 80 80s80 -35.8398 80 -80v-80h32zM496 16c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32z +M528 160v80c0 17.6641 -14.3359 32 -32 32s-32 -14.3359 -32 -32v-80h64z" /> @@ -2503,6 +2508,18 @@ c-15.8008 -17.0996 -28 -37.5 -36.3008 -59.2002c-1.89941 -0.0996094 -3.69922 -0.5 c20.9004 -10 43.9004 -16 68.5 -16c3.30078 0 6.5 0.400391 9.80078 0.599609c2.7998 -3.09961 6 -5.89941 9.7998 -8.09961l7.89941 -4.59961c-0.0996094 -2.60059 -0.0996094 -5.2002 0 -7.80078c-0.899414 -0.599609 -36.5 -15.7998 -25.7998 -50.2998 c7.90039 -25.7002 21.9004 -49.7998 40.2002 -69.5996c7.5 -8 18 -12.6006 28.9004 -12.6006c12.1992 0 19.2998 5 27.5 9.80078c2.19922 -1.30078 4.5 -2.7002 6.7998 -3.90039zM173.1 173.4c-40.2998 -22.1006 -68.8994 -62 -75.1992 -109.4h-65.9004 c-17.7002 0 -32 14.2998 -32 32v32c0 35.2998 28.7002 64 64 64h64c17.5996 0 33.5 -7.09961 45.0996 -18.5996z" /> + + +d="M505 273.2c9.2998 -9.2998 9.2998 -24.5 -0.0996094 -34l-296 -296.2c-9.30078 -9.40039 -24.5 -9.40039 -33.9004 0l-168 168.1c-9.40039 9.40039 -9.40039 24.6006 0 34l39.7002 39.7002c9.2998 9.40039 24.5 9.40039 33.8994 0l111.4 -111.5l239.5 239.5 +c9.2998 9.40039 24.5 9.40039 33.9004 0zM180.7 167.2l-112 112.2c-6.2002 6.19922 -6.2002 16.2998 0 22.5996l45.2998 45.2998c6.2002 6.2998 16.4004 6.2998 22.5996 0l55.4004 -55.5l151.5 151.5c6.2002 6.2998 16.4004 6.2998 22.5996 0l45.2002 -45.2998 +c6.2002 -6.2002 6.2002 -16.2998 0 -22.5996l-208 -208.2c-6.2002 -6.2998 -16.3994 -6.2998 -22.5996 0z" /> +d="M208 448c35.2998 0 64 -28.7002 64 -64v-376c0 -39.7998 -32.2002 -72 -72 -72c-31.7998 0 -58.4004 20.7002 -68 49.2002c-3.90039 -0.700195 -7.90039 -1.2002 -12 -1.2002c-39.7998 0 -72 32.2002 -72 72c0 4.7998 0.5 9.5 1.40039 14.0996 +c-29 12 -49.4004 40.6006 -49.4004 73.9004c0 29.7002 16.2998 55.2998 40.2998 69.0996c-5.09961 10.6006 -8.2998 22.3008 -8.2998 34.9004c0 33.4004 20.5 62 49.7002 74c-1.10059 4.5 -1.7002 9.2002 -1.7002 14c0 35.2998 28.7002 64 64 64 +c0.799805 0 1.40039 -0.200195 2.2002 -0.200195c7.09961 27.7002 31.8994 48.2002 61.7998 48.2002zM576 144c0 -33.2998 -20.4004 -61.9004 -49.4004 -73.9004c0.900391 -4.59961 1.40039 -9.2998 1.40039 -14.0996c0 -39.7998 -32.2002 -72 -72 -72 +c-4.09961 0 -8.09961 0.5 -12 1.2002c-9.59961 -28.5 -36.2002 -49.2002 -68 -49.2002c-39.7998 0 -72 32.2002 -72 72v376c0 35.4004 28.7002 64 64 64c29.9004 0 54.7002 -20.5 61.7998 -48.2002c0.700195 0 1.40039 0.200195 2.2002 0.200195 +c35.2998 0 64 -28.7002 64 -64c0 -4.7998 -0.700195 -9.5 -1.7002 -14c29.2002 -12 49.7002 -40.5996 49.7002 -74c0 -12.5996 -3.09961 -24.2998 -8.2998 -34.9004c24 -13.7998 40.2998 -39.3994 40.2998 -69.0996z" /> +d="M320.05 81.5195l-17.7402 29.6406h35.46zM419.26 247.52l-18.3994 -30.8193l-18.46 30.8193h36.8594zM48 448c26.5098 0 48 -14.3301 48 -32v-448c0 -17.6699 -21.4902 -32 -48 -32s-48 14.3301 -48 32v448c0 17.6699 21.4902 32 48 32zM220.74 136.5l18.3896 30.8203 +l18.46 -30.8203h-36.8496zM382.45 136.5l18.4102 30.7998l18.4492 -30.7998h-36.8594zM128 -16v416h384v-416h-384zM194.77 262.13c-1.53711 -2.65625 -2.78516 -7.30176 -2.78516 -10.3711c0 -3.20312 1.35059 -8.02246 3.01562 -10.7588l29.3604 -49l-29.21 -48.8398 +c-1.6709 -2.77344 -3.02637 -7.65234 -3.02637 -10.8906c0 -11.6523 9.45703 -21.1094 21.1104 -21.1094h0.015625h59.5l29.25 -48.8799c3.33105 -5.6416 11.3516 -10.2207 17.9023 -10.2207h0.0976562c6.64844 0.0136719 14.7842 4.67285 18.1602 10.4004l29.1299 48.7002 +h59.4697h0.0224609c6.8125 0 15.082 4.80273 18.458 10.7197c1.53418 2.65332 2.7793 7.29297 2.7793 10.3584c0 3.2041 -1.35254 8.02539 -3.01953 10.7617l-29.3701 49l29.2402 48.8496c1.66602 2.77246 3.01758 7.64648 3.01758 10.8809 +c0 11.6562 -9.46094 21.1182 -21.1182 21.1191h-59.5195l-29.25 48.8604c-3.3252 5.63574 -11.3359 10.21 -17.8799 10.21h-0.0703125h-0.0341797c-6.65137 0 -14.7988 -4.64551 -18.1855 -10.3701l-29.1299 -48.71h-59.4502h-0.0458984 +c-6.80469 0 -15.0635 -4.79785 -18.4346 -10.71zM592 448c26.5098 0 48 -14.3301 48 -32v-448c0 -17.6699 -21.4902 -32 -48 -32s-48 14.3301 -48 32v448c0 17.6699 21.4902 32 48 32zM320 302.47l17.6797 -29.6201h-35.46zM257.55 247.47l-18.3701 -30.7998 +l-18.4395 30.7998h36.8096zM287.13 136.47l-33.2295 55.5303l33.1699 55.5195h65.79l33.2295 -55.5195l-33.1699 -55.5303h-65.79z" /> +d="M328.2 192.2c0 28.5996 -15.2002 53.5 -37.7998 67.7998l80.3994 128.4c4.7998 7.69922 15.2998 10.0996 22.7002 4.7998c58.0996 -42 97.4004 -108.4 102.5 -184.2c0.599609 -9.09961 -7.09961 -16.7998 -16.2002 -16.7998h-151.6zM290.4 124.5l80.3994 -128.5 +c4.7998 -7.59961 2.40039 -18.0996 -5.59961 -22.4004c-34.9004 -18.7998 -74.7998 -29.5996 -117.2 -29.5996s-82.2998 10.7998 -117.2 29.5996c-8 4.30078 -10.3994 14.7002 -5.59961 22.4004l80.3994 128.5c12.4004 -7.7002 26.8008 -12.4004 42.4004 -12.4004 +s30.0996 4.7002 42.4004 12.4004zM248 144.2c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM16.2002 192.2c-9.10059 0 -16.7998 7.7002 -16.2002 16.7002c5.09961 75.7998 44.4004 142.199 102.5 184.199 +c7.40039 5.40039 17.9004 2.90039 22.7002 -4.7998l80.3994 -128.399c-22.5996 -14.2002 -37.7998 -39.1006 -37.7998 -67.7002h-151.6z" /> +d="M312 192c0 22.7998 -12.0996 42.7998 -30.0996 54l41.6992 66.7998c5.2002 8.2998 16.4004 9.90039 24 3.7998c32.5 -26 54.9004 -64.1992 59.5 -107.8c0.900391 -9.09961 -6.7998 -16.7998 -16 -16.7998h-79.0996zM214.2 137.9 +c9.7998 -6.2002 21.5 -9.90039 33.8994 -9.90039c12.4004 0 24 3.7002 33.8008 9.90039l41.7998 -66.9004c4.7998 -7.7998 2.39941 -18.4004 -5.7998 -22.5c-21.2002 -10.4004 -44.8008 -16.5 -69.9004 -16.5s-48.7002 6.09961 -69.7998 16.5 +c-8.2002 4.09961 -10.7002 14.7002 -5.7998 22.5zM104.9 192c-9.2002 0 -17 7.7002 -15.9004 16.9004c4.59961 43.5996 26.9004 81.7998 59.5 107.8c7.59961 6.09961 18.7998 4.5 24 -3.7998l41.7002 -66.8008c-18.1006 -11.2998 -30.2002 -31.2998 -30.2002 -54.0996 +h-79.0996zM248 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM248 376c-101.5 0 -184 -82.5 -184 -184s82.5 -184 184 -184s184 82.5 184 184s-82.5 184 -184 184zM248 160c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32 +s32 -14.2998 32 -32s-14.2998 -32 -32 -32z" /> +d="M0 384c0 35.2998 28.7002 64 64 64h192l128 -128v-320c0 -35.2998 -28.7002 -64 -64 -64h-256c-35.2998 0 -64 28.7002 -64 64v384zM224 192v64h-64v-64h64zM320 192v32c0 17.7002 -14.2998 32 -32 32h-32v-64h64zM256 64v-64h32c17.7002 0 32 14.2998 32 32v32h-64z +M160 64v-64h64v64h-64zM64 64v-32c0 -17.7002 14.2998 -32 32 -32h32v64h-64zM64 160v-64h256v64h-256zM64 224v-32h64v64h-32c-17.7002 0 -32 -14.2998 -32 -32z" /> + + + + + + + + + + + + + + + + + + diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.ttf b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.ttf index 97ae69b91737b4d97b021dec23806e64de61bcc7..c6c3dd4d40e6935dbda5f4fc671956c41b768a09 100644 GIT binary patch delta 16984 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�Yw6(>3h3Ki)UqBdO#joC{%U+==re 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

    7u1poN@kbMBL)rqD54 z{ZF(9Iv@SzXl`6kgz>tnvjz3~LyOAHk^e;d_!sHqT(2#PZO`2<)*IJDFO9{l;$DVtWTI$?`$l%8${Xey(?jG?^TD@^$gCbio-GLdT;o!| zSiy4Xl_LZxlQ(;G`HtoWzGERW4KWqHvB(V>Oh3WCCge|`%jLQe=@$!wck@qsl`M)G zI(OvZVM#$aBZ_i4N_m3l{=qL>>s=`KpO6V%b$v33R54wqOQhonSSqJQ70CrjDs=xf z^u50ll*)s5vvKf;!Y|P_!Z>I}_D3!SUxRk&+sn{oz$9oD-dO+#2dc&CvH(*bs!1_iugG4!X}>eQs)%|EEFP z%rJl1*x*rphyBO^Oeg~oZY01vZWawdwn9Q1COJTY2&W;529m!6|PL(pC3Ly&7g>`M)7C8uU)s=JCRyc37Jx<&F;a_XFsy_GKLX~qi z;*m`|;JJVlQW^-9&{R1kyx<%yLARWzD|YoLC8dx9bds;TU-0LBh2d?zg7!*ZLOx$} z*QH7Dg3s-py90e$`Xie*dTm2G1^q#06*bR21QaH5fBrnJUmDE2pw^kC^pSH9i48d- zW;e+ZvA*qu_6+lYrpv-$mWa=6Y}Joo!d?N>mvR&{PYmRVAXrtx)qN#Q!d9z>H7cVq zf2l|TtugyN#6;|j9Ha7Nq`f|>|NQ5T%75~H?n~E0Y+iT7P3`Bryz1}Iu~|F+Wj~%B zb$W3iew){O{dq5PzP?Q_cK`BuD#aZO&UZP~=*;k+{kNMd=*? za8k{{mWTO99>0-cQk}Z=UV1Y>ym0`_Xqc|9k#=HmNO|kLm_ilhg&R`>p1aOT-}|9^d99y61qiqGY{h-AYX-+?`SBZnyV7I; zglXrugiG(e_fqZ&71X;(`9qQRayAl4v^^4J2d=fjS(Bll)F9q<@1Amc?89X{Inh{d zm;zdj3en$v>g)D|UD&^;jO_A<#~otQYZEfIKSYba{?zYAVde&L!x4r(3fW>0L{89g zd~@V3mcS3= z^BlgF_Sb2^t43v~7tgmofd>yQ4F`+K8!;~i&TH#)gbd!=@ER~GD;tb=gXcn>N7r!Q zy65}hHUhZXb-$s=RasfLS?M1(dgYBZmd9ta`_YOIYs(ErJ^)!fvXoqlRMvOTQZ2}{0y--c9gP$Ks#0+i9O zi%nbIlVHoPk&1mFRKoOagcedl(yyf5zR0guj({$ffLLJ_k>9KGx2L|d%_1HUxuK%wOo8To~tjfuuL##=>2Cv>R`*Aq5uyF zj=Ox{OZ*2p0#V@%f_&uhdcE%FE&^Ucr~O^_`x^pmSU?WMiY5S{2&&99_=#FG=~Y^6 zS%V~I&OhF8=uX*^@BEe566;|}!IIIPj21I%nIf9ODv>q$ZD{S#{NkH2e)Hn|uhf(2 zAMF%Cbp4-d>=9?Q^0Uq-Dx;qeLs+(#e&+MGJ9jn^yF%4a!srdGpo%^)dAHC!H>)&xbGG&>} zr|1k#%@bL!s>r}IGuS{X+M!MShT_<^qx{B%c9*?+Jv`8oO{B~aGNaHZEAv$5NT;dr zG#?qX^D=bm^&CZV6QZOu<8Ncn6$+;Y3aXjDpVZe`F3|B!Fl*hS+u}hYWF5ndn6TL8=^C8j zvyow>9M$!sl+ly-0|QDoAw1fbb-#+X8OjmEIHG(n%%F0=Z$2g_z?Y%S!kzMn1T-nm z3~_!kkM?vge?kNO?ApiwL^V|6$ShN}y{8qIDWyC^38frw?ct~qr>}W8k(3dhWpw*1 z6WIbW3{uD@Ub)>5nF+;gM8R8ZAVUS@Qw)Kj4k#A5_hYNcK;f7;4#9JUY-M3|wWmO+ zWLH5)(2GSZRI;7Xg+d=vs{q+t*2NbCZa!Gg01J6PV6U~oLp$kJJ<1j~EL5XR6~uJ6 z+70Zk59bJg|1EiuNd-Z{SY%z&KXmQ>TD2_ph@l7m*p9yrRAC50)gLTgb8(cOpM(()gZZTV(I}E? z`HM$Cd38UQ0BBndY|EelptMb1_cC`;>iaD|^!Unzlrpu{IF;+F#28e@n6EtZ|t4}Bwk zc5@CG!ouKc9%9Z@J?Fq4_{Xi+s_K<$RxK@JOu0*8ak4vo$25J_l=YQ6x_@@FZVN8@ z8-CBVZ<$u3+mo8~lz}y?JtxAzm!@`)vh% ziOz%RjnshQyt05Xq2}+C3<|JTsn)_!>O-cf)D$syUENf6sp7R)PvnNo(dtC^jHUN! z!oTR|t5lUT&B~tKZz;Oyi0WEaAIi__x^W@6+ORchO?U{spVnt~llt%w7g(NZJ%=I| zSxx|}8G=VcmD+Vw7L`#+kq+MQUMwlQBneA@am~cUbSmvlcE4}g4@CQQyZHo;NpV3K znZKIEq@o}mpG%73Y;7d@F2eii&(T}ZD#KTTd|N!mm#>$#@;WdsmOg}mHj+w$hZ>@( z3z_%ig%>if$O~5j#Q8@@7wRJy^V05Dd5o!lkN?C9(-xozQ5Qx>TJpub_!)?E8RSK? zEU)UJo{cAnr6~n5G@$$M2~~jtychm7Sj=6IcD3oOp1yXPZri&)u`z4%76!}lHL|Xl z^0Q##*?mXx<52gny6#tD|MB7-yRSd6E}il>m{$K$aX{6tVqeA#)?{31xiNIZffijwijETV^psr7tdpxChH=Y)U&VlwioL#FiyL(|sz^?45K!In zzp(`0WxAbuTLa2B(T?n2C!LPH8 zOSr_lba(UH-n8xiupJ?$^cl!(<=zR^~r>I+}8 z+%{4z1%1nibw8)QP5ZKblly?S>^%4({jpDJ*E{>~bZ-hk1L#L66wn8|pA+Z=c1;oO zRtyrIU0yyLIdy7vd3p8JqwJW+Py_DyF7#V;wVs5L0~w#7ho{BnJWI`-^jhsjQ3mBU z1N8v!3SmLP(b~|7AD$ShMX_SncJ9qhc-};A@6KBH7j7m~%YOL*Vbm4G8SzmHqvh6~;3D58sP!f!pI2Mu#~B;(J;7BW!zglN2w@uv&1WTytTRN#*oM&PEs@ zB68S;MkwhE{}*KA33%YIQ>lPT0$#J25I5K;SaMwm8(`=yge%kwXsrX41^#bgbdTY9 z>fWiL2`onwj?w9KP-J10BPxt8I0hP>a}$$W6?tN)kQ*P-3@3=!AEN!7V>xf&3q!g; z1|-YK6Rht7o$f+=Ms$Yhmq#zSX7r}C7`GI1`ZQ6jxR|~vYP#>-rH-n*(#P*i>y6}f zu7u)3)w=#2(WJC@uau0w<9e$qCf*c_z3EpkvL)~O?w5_$o$0~2AJ8XkW4N~KVze{2YIZgkU_F|0()wCT@HO$>`HNRrNdQFl9)e*m8`HqZK8p-o(5M7U<~V5X4AC zpLsXE<4+M5kaAelrn+GC7zJEo)#_fwoCkiF-p!IW1UVyapuKT%{K#d`5XPaB@*6$lZiqy{&b+2wOjm}={CY6$VEy1xnvYuAg(nI!8 zTC1Zc**Dx;t-hN5+seOb#f>_)6Lk-*+gG}?Y`#B4Hdv9W0>FcZx(XS)9r z?OjP}md(()Xj1@tA#`k8T59dQ?JcM#{u>wz{56bYULHLEfo!VFkw_@-LJD+V19=x( z3~)tE#7SkoEd$jVOrY=?x=Ku8yER!v-S@l5ncIEA^#f@Ves!^vOwM1`x}b`6XSDk5 zsT(%vuIFBw?m7uvcb-LIf&bZyDX%|z{HTm%RT_I>jOa*y30{>ei&I#a1;-IhZHnR6 z{FKh^KStl+h^62}2kR@h^MPdw&cMpY4A~6H3n~xcjV&f`q0dGud90X<;Aq59g_4xa z(P1mv2}hu%I8WF2xl*BgEoBr{b4Ww=vCb7D(LH?c2C>by7O2dy|d;oog#R?CBOz5(_uO1ceJ#gs**{@CiAgY3Pox6So zqk{EagfjYXI#9bHJ6v3zFtzDaw!C$xU@6yS6=|ps3-{v-w(ml1(Z&ngMDNNS`jM+7 z=N&Km&g26J6;-U9Je2P~)|VImF!{^?zUU0?$u`UOdl}a!g;Yl%7W7p}A;o$lP^u>y zboFgC9ZDyQ^v_>y_~Mgbrt${M-w=WP;Y_Wx<|~&5PL~Va70U0e6ns!5zC)dJ+|Ezg zB!lM)h2{Q3unX2{nXS_!%)$pf+jfDKt@d(m6Yg2r$B!9Gb(d2^u*%uHKtDMzOKOf<3G-R0eywxAvSrQG@kAo z#JQ4>G*u0N_9%ves4)ye9lENPPAWt(MkaRI3@*#wH8En)l4QD;8XrlgN5+RO z&vv7NAi3-S$r$Y<<>8r$i39bmnxbf1>jx$#W`@f|(!rLmS4=D;D>mZ7KI+k6?eqqJvR3@`Cg@J*~FA>@%RM6_xUWJ#$Vt+1SgaEltIbp;R)g6Xs_5om`n zN3UQ4k)6;YXq(5{Mv}D_2>2XpD`2wGd)xV;%SP@Sxojxk?jLq0*7E2bx=)l{_ zQU4As8Iq0s8v?u<#PDBJpy7}BvJc_;@Tz_zykupLHMD{?~?$6onYdU+YmsN)Wa8GesH;;fT&f zZs_?OauLSI;ilcpLxRD`FwbCf*rrjRn_U!`9fI9f^S=QdZA>8IW<2^8M33IdC<3E{ z$!D{bR19M&;f&|KDj{-y93``(O4bu9SwV6#=>BXHjpt=Ts$PEFNk|wQu3pKij-{)D zkgW(_RvATWmFyumPrKHZ=t^(>Lw=k+Mu<9^p7xwrdQ>GOTd@*m_gQw#-ZP&62aDb= z*>w4jdgh^QMOKWcQpvLCVvYyvDIIiY&GY+?}4BQ|ukFLAO&_6oJ|f zqY5d~F9&7@vQ_Ytu0gnOvgn8Y(jLf*TM_zX%;O~HY=l!9FJ{DXB3p1)N?VM0_s`=f z5|`7~ik03Xm{`X|ELkiM7rGEQJk_%yL=&6;NQ&`#D%R>l^tEECdb~(-bJ1)}s}|-m zb91KSd;|$1mZC-4T0(yy7qdN8!lHnfT);8eK*l?~0SPM%-rPG1OL!GH?t$j>gbIFU zhdFeHr8!wc$xFh;w;QrhmUSU2XcuBp-ldW` ziQuCeBFK;?Fxf$`>9SbRQx)_>Q=;U;5+pM|Y*M!H7mDba!wE_%EJ2WELm5)FSV6`{ zlqgZhv0v|43Ck3TXcN+X12Hv)u1%DSFeu$3G7?iLfsv>tUyq6E;lhV*$&E=!P((vE z1-KhY|9#qahc?t_u&xV4oUq8qduJR&66c9*%ZlWg`8`lY1t&0>m*tol(kLgWr10R6KTsxc-RR9IaaC)vZRAYHjE7{d- zMH!ion^Yznrs5yvoB#o(`!^CHTMhaPdv!z?2zeWr+=v)XZBBQYapj)kv?xyJ(=2N$ z7(>_QM{=ek2#)?5Wjs^xy;=BFU6%ERtf)83Um|L!Ojju=%bNIS{VR0$V~j5pCAsCAON!EI$&wfe=e@4=GOb@8 zS!Pl{Td>Ohy4K`eI?LD!SL$Vwr0naQob(#C(k%DhZkOql_EkrLtHX%T+zNhq55=50 z6IWv2iqUPM&^xSTQB6^5sCy==JX=Mqp!%#5eVTEyujTyg8smQp>;!cGA!Dtay7g0q0qAfKQ!p~1pe!grDh-Pi#{GNv)8q&J-id92awlu`rOZ< z?K(vt#9gFEk+WM3V=F`F85sero=buQonN3NR;^~bkxW%3{}eZOSTXdaZX_2+tMOc? zyYlI6y1otWW=}Ey8GfMi3-6(07F;*zu+|e!6rJim&6J1TzeJIj&TzP2wEB zNf2&=9i@DDNT$1+cIv%IpDe`qo` zs?y6P6fZN63YN(O4h)ry(n&kQfb;331Z66);>Yfo?Y>)~@}IK8B3HN)D0H~Ou=Ghh zclf5mojZ@tvvX8Z*~K!O4MD0+e^k``NR37~S8fRO8Or5mEg>^p9p<$o zyhg&ppQ>i}$ELeqkJ2G3iVrU=^s{bmiCS~rwL1D~Qqw2WBWYBi3r0*7pVM6P|D*2B z-^ zl|YPv0F#6eav?zhZh(ZqB!n!G1m}h%B>65VBn0j+BpC9AkPB|z^PW@P(<6yB~mxrDAcABuN5 zG0Q`e8U5{7up|{E3qQu%)??VBTM~Zkv601^ac-fBLrC&j7^lXe(5z%w@&vE`8I)uF)7ID~o5o`aQpjdqC z^>h(je}#Q7-Q>H_&h$;5=PBWK;l;u$g|}YD%GL;)qxai>)?3~t=UIP>?Pt9OPq>`! z3lJC99X{FN6CFOu!6B#z@1vYv9z5LPV;>fV&mEpO$6~K_&KFo3)!<16osFg8(bt#L z?5!8l<)y;lNG1WL1k@guBEzE$7xCiLR0jbb87$Q32ziisS6;~U5K`F%>Ga?R=5}L% z)dJjdaI_F+%c;k`z-K|G)k@QEwf!#cBpoeWTUJ+z!-YnGjUd zY58AL3o&G;pC=!vSSccvZa9PsaxC`z2gb)!P9d4|sYrd>4X+f5V>lTR#ilI@z0afy zaDkk-dC##HDacvx-H-7Dl3U26PaM!^UOgs#m5Sowmr!*2i&IA2$pu>y^G2zF#`je| z=2i8rSPqb^cykC%>2X_>+^9k{62W=mWvq`+94s1pmM1>u<)q}V@&igVjol|B)74Bc zSv!UmBW}|lb?8BL)ZYkEI=djs55;YXc#SwiAQ%I~NVCygUkn9jsNmsCoO(l$s~**u z;zl=`ceMjI9?){-Ze|?*7};Of$+~Z6eRcE?31%W5wd9IdPUGpVTc@@8LPej;!-sor zY%SNc{@P_hS6DUJ~0~?y*TbP6~ zRU-uJl|evqWu57?HDFn2wTI8g4?==mf5x}tWqo~rEi7yZ3Q_WDsa zPiy47YrTl-S|<(xW5R11$59>T5sfHx#loUxokznNdbq8~3VipODm=no*eZ(w`7b!p z1-3h$amI4Fv9a7B8*SNgZT$|{>MnQt7hp2`2~U1mg(cQp79a*il`pGE3qRqRc>m%0 za+~3F9v*3Pn`bdxx#@Y0>cBrOZ+Nlu;^K{q;y$*V4<*S}{#x&@!)tx-HGjc-&<_4y z_~k1zi;FXgF<5hoJj?CDQ+uc8;iZ2dDS0dX?> zyk>}8-!B{&o+rFOcz{Y}Zx-Gu{F3nN&(7kyx$X5zoYBF5Q62XRb;LV#o3j|$dX069 zE??UEIY50iYvv_?y~}rPQftF5pl;~@fEk17&+&X>1X)Q;MCY+a)mlZxQ5iAND*F5)2~!LY;f+Vo>cby? z*lnniB)jwe)bI1J(;+(%HKU5YU3vJ!XBl=ixFWV_ zz;*e|nAYgD?NhCBW~#BHdq*N>-}+{>^&nb&&6#A9K8+wh(O5hKBp41##Z+(+S&~lY z#sP%2!;f5wZ2hKuAnVCwYg&BKF%{PPre>9JG+bq)U5>}EdLOd9qg(!{`L-Y$C zZa8vqT~7nw-zhp0+)BrSd+BKKa^cm&>p@Q&#Ew;|P{x8f$3QF#!YGM0h-IPilokg% zSZh6#f))o66Cj#}CNMv!!X`M0Y2^}I@*VIY{xB|_ejSqrTe4s9(RYZhlc+jwDM;~U zTQO$0BaP%}i`+hID7Ng&iZ!lAhqdG@SNc6UVol|4DCefE$Xy=pO4VTfGEqywkK??FT!_Yih$i%0O5l*HkW4@T*AOUP=2BM8gZcnbuN~>L}jWegi8h8s> zNG6wox*r@~jIiN1npggfQIUfG+NjuZ+3y}?r#}ckGb~VewYR+7Tje4GFSFe%OnqA!2^}6; zt}u|1mGjJZ^$BiU8+kr+!fvqFmpPgcAqc72#vJP+JKVe?cZs5@tA}qf73-c!C2pP>lT-5888fa- z&W_JE<69hOOT0Ndz91Hh;=iFZZl2H+QsPCbL2kH#80w1>o_?Z<)5y8Qijp07TGpLA zNYuLH<+Y?bpKUa<^J=nYwk9WAEHs1h2^Q#mQTe6ZfUuJif7koR7HMH zFfogi<%8GDr}l66VpeqG><-CRlc}qwl!#JpXBSF%PfXTuQKQ3?R>Yd@p@ORRFL-RH zXwjXbDAWEO+e4b=!mfaRZ|bU4QnkgMXD6uCle$FDdm|tVT}jWw90)sRsgAk%NSe)Q= zS5_Q9uavPu$1O3T?L4|uONf#zic(qesK7{{W~87eoTMuPcpm+)#Uv@FL12NcsER2n zq6&LdBq4+h(M>uDy%0$&3jOxqUs3mr*$5RBEQwxaZm!~q0Gdu)8nR=)C}Nx{L?f}B z8};LPxuhW^i4h55DxuSB5cL&VzE?xCWXp7)6oGw+6y7Bw9#eEQ?Obhgb?jph55+O@-dQ>{5D0j>9wcjwJQcDzDQq=gy7=&W^h^icPC2pZBF-5l| z8KuOigGC=Haum}V%6JshLu@N0Ds(>nSNbdr`Yi4dULw4LWxEiLltU#|7Cpuyuf=B7 z8(OcLJnRob(Si_{f%V;h^?o`dH=(scljC+vuyHasAhULQZJ5=oY&a*-wyEe`jR(+} zF!8EVJVle0SvI%^~=#cQT%y;MGz z#Im}5JCT)SE}v2*Jbh%Wl9XiaIce3haJH9KY@4LfD{?R1T^--4jt**Y<>gsD7` z(_)}3#I#&SGl5~Y7@x%YotF zk@0xTKR~O=faiaIAs($%Om}R|H7k{9eB=BdWt_#V)eW6Gyxma|pc#G!1i9PMCGh|a z^nIPXn)QEDOy!H+W%?i3H^CafGxI`*&f8?8427~GpBBZ>tinGYFtR*C)TxZb&p>A5 zPGB0^hQd(9B9AX*7=gA(#+Xl~IwL|h#yaL>6YPIYmW5RE$}HoEqoh%x@{N;Ig)qXb zTUfJP5=>8sV;YIZ(ZqB>fH4^!{hBnM1nS5_w|`-o2ZvusRSJInQ8@Z&-CuPr7srY@ zUvp4)ET%YA!DFt3N0Y^Z<@UPW4dX6H zQ=>L7HCh99nh~O!|8!B=ptNir(>8u zwKd*cSitxBwOW|$VsX0pHPERwa_$^U2ft)la4of9nlr51{HIHQelAQk@2)qdD%F;*yK>iQs#2F8WY3$}2F@ESTUaJ#~Q zme>y)2^)zaNfu*F9YqxJNr>m}x45>70cwSCVW+(jE;pXI?@u(pq$#9Bu1qcu- zYO*718guDJEnQDxrPlGwDMgFUMszB1#v~=;m3=4gdlvmBb`9C4njCsH{T=>`bS3q+ zPuw=XK%WyP6)ee95$(1J9p|(8V)JmmJ{MpGi*nq{+m(e1QVVJ%Q_C2H#N`OC=u$B5 zRmb(@yRfE@(*fPo2-U@`2o}w#DytF28a!w48UK>-tHOU5gmFm0tAM;UBe76^$T0W$ z(}aA0A!&Sz*>E8E6ht#{8Uro%E`TJ4+@m&&)}CRx{gp5Xp1vbmr87L_V5P@qfEsNAH2Ow62l<3VX)itU6sUKKku1=qbrgmWs0;1!i*TylD1+wmSQJs z0qk%KS}`L@GWH^d>E(SlCIJAG?oyRj^<5x|72Uu|nX1ir$$5zclgVhZRBn|GH@z+G z8njfRdnN;_3#(?z;l$=pO2kAUi*fpbV_P1r=|oJgxDXu^%SnhS zaGkQMmK_($$+9>WT_}2%4Spb4MJ2_~rbt9lR0&l%=F1=mZxpY=7Gey2a)eQ+QuTrs zX%fHfwb~Nc6@rlY0G&Uz=as=%Zm7JtQF-Uo{#x+LFr)4Hd!KK7;Q14e-gnj53+~g# z&~CMHbb5B;`GYwgaEvq|&b&;y5Gc2)EC6^QV_N3Kjl6NCtU;@=Tv;Enmp3h<)j?IX9MAO6_h5f-i08u=-N8cG z^m@x1v?bqD8XNIZgCDbv)_#IZa0d0B#k~zNYS62gUkn_lVG=H>k`N;bW^NYn#p2i* zKQN#Kpfm%ty(v+;$MsTAMuQ-F<=o7yE+vb`L0uZf$(aCFP=QYs5GFW?&4#8`Z|p+cu00I9Qo=c9HjH@Y;>Lj0 zs0FaZ^K+oDA}Qt0Rz4=nj$>)3od*y}>Lw=F0PPcc*moRR{#a#}PL6cjzJ_2^PZIQi zg9JL+Rd?&N$TOCy;*vX_O`JCrOj5?Hg48w4T4cSI1j~kpX7$}w20_J)NY|u-R~acx zuzo&~JwD8b=eqQqa8$VNirREU9AoNlW4_T2<{R^jS)v5&iq+8n+-feA>SKJE-iGGr zu7y(Niu&-|j3iZVW00nVd>_%39HS~`(m?X|*?s$FJy#)gxaoAN5I~P{{DCWJxexiW zEJl;EY0Al{D9gUMckl9EA}Y9Zw1aHYe>2xmrJJS{~#no;^a2cIe6W}4}bXKX-6mh ziw~WwE>?G({E!_>##D!n^C~f^I!ZDM(YDwz(={*MtI(5V2tAMPOw-dmeBHqg(N6BD z?ya1BXupz(#8TWTWGKXtC0SK;$)dZ>xOM67AqK+mIn;R;^J59tt;fX!#Rm7kl+j~|nyW8?WIgdl+a$gY?1;DK)E2x*}V_V%_7snp<; z11lfZ=$Zo{h5)yR+J!_93_2_*(tlO+eJ@o=&RDT%?$j#4rHfcyGcybiYGg|SG2wH!;DVEnT|W&Q$6bBfbHteO`OT__ zTi>wtx^DMh@5M9kXT|6X(O$zEUbo2de7Dl6oWI^s%wlG<`XIIhI5w{Y)`8GTs;W=T zyzueIUpO;uN}@%?Q!jhjDUtjlk>s|8h%8F`_JN>;thOwXBV&>&jm0!<$j;+me%w(k z6TR%$UWR^zOu2Q0)*2s2SUJ*?O=RrHct1R271{v$OM0zYp&(S~h&)Yav3Y0G?);$y?%ME*)-IOh0`Q2V_&O^oV#L z=~Za)AA9EVmRyiqHhb}dt}9AXHHk1vRwYT?xcNgxnd(3Fbx7&`I&!8I0D7`SopUHw+nYNd2gWiDQ)_= z8`U;_(p4$WVW;Q}QUw7cTC8G^Sx@5ths#ML`MePVB*0yl=Gc9sFk1j-O^MJGmgu4p z5UQBanGC%#7CjRkyEhtpXEgT49MxY^6$dTVI{gb(QA(#JMZ=v8HVmBUnE0|i=%lo}jcA>DVPym4j95(Sk%HOF_VQn=7#Xf^n#UQvnak)MM!P4A6*?;wqf@TZB2VHjV1Dl zPY?;GAJnvVe{Joe02Y8*s=~BQrDg|q2e65ad!kgifc{(#2jeqQm0c}T3Mm({lqAw z&o`N)?C#D|XJvJzv-HUUCN0y=yHt(^EZ%)!fefRbNa>PwF7;FB5BXl~lpCpt)OaA@xdC z%H<^0R;8&awhFfqIn)VWNEHubvkTysQ(+QtHLm*WR>=`Huo?iFqf@U%8=n$$KFAO ziy3s+E{VmKu*i}@!1b_cmE@o}8Gs7_FtzBb*U0%)g#p6WI&Pzp`B0ZO_ilte${Y9t z75qv%BL68fb1u7<1DSe^{wL*jYS(3}w!GYZ6!Ib-?JkX4Gem|B@_USLxjlmX#>Gj1 z`YO>6MpO#gWVmLjPJsTnQa{}6HV@Zp^?JRAjw-G*Izl^ftg8WfVW6UJuLrqoz1~dl z`6r+Je9-?kjRq&mO_uu)Jsf9Y`~oLE`T0c&FB<_pwk$i!);_+li$rsDEw5 zi)cqQOUj;5)e~9C(ypISV#>tzbXP8FX?F3(#mrnOIiYV?O)Fb{Sf9&7OQ^IYBui*! zaXhEf#v=QU8gY{wzCJwT4I++P#l;(EN^|L8d>>V-W(7e9EMS(SrU*7|KLslD)rDq)BdVuWS!nmv*z{V|d6J1&avP&9ex-8az-zUk$njL{KiNfe3n4p9WZ@8`hv{J;yT ze*9$ew%cy|U!U<+xkLB=f+V7uZ;IGolob)(Fo$IE7D-dy`9W3vU>33C(!=Su%0v`z z5oOf>3oM=jhUmqw{hX}&pFe+|z3<HH1Mfv@T`#eS0FWjvt()|~7 zU3s2c8TI-7B8z$2J{sQ$rhF#<=h0wDQ5wM}@=It#rX7RIMRacIQSG#;MrG3Gw%4cr z+v99JU*&mN<1q3duvMkY<1>#Ns+!hSyUxas8(M#}-g*C$HY_&cFuCeSv_HIx>92bM zaj*?-9bPbmKw4rW>+g9Yz^83m5MPZ3xJ1$4pIoAUYX)DDpLW zDbGcZ6iT9Wu->;+-M;EMpFX{%u|t-3?2=^VpB?=$mLgJA&D&b0>ln6V8?LfOC7lOs z(L6OZIT0uO7o8oY*)F{!$%!VV+)b^!lk_zt=VjfxRnt|HQFSdSn@Rj@W)vYej4%Bx zi^-W`m|~1s6>`HsBMX>+4&Z02Ea(pQ7N)DZIrQ#q8&QXTTTT11me^RYl3 z^J7kiic@~1w%eYVakB@|TN+nKwPf!4qCR2!hM6qI{4q6%C22ibi`1?=w%ZP@?0RfE zw-pp<59|s{!m_X;^n`Q5yM$j9K1`oJ!%<>{Z0#1HigBpXDNa~VyP@=Bh~`{&0q-z*U+3f;EpIgm~!6$zhURg`hb z!jo5Ta*kEq)Il6G<8;}JgH7sbVp+CLFJ)#5%kpEQh3_zoJFq3H{R`{1-rjl?Yms%?*!@~Kq* z<3z_jGV*K;ItTMUAV79zDAITVvy6GgCh&g2gK6^xn~K>ZXfOuQ_TY(yU#zmIR(=lU zlBnUvCEG}-tNikNjyZl&NS9T$z`z_0!%TZ=j3is6(-Mv)3chNUAj^LxRVhRx9RIO@ zK9o7b#=rwF3eww{3VVIDYL0ii>2mX^WSTgo#cG-;$&xC{S~?v=Dm+3usPD!rVJPyt zhhh+v%;u0!(dYCzDysme)w-5g;cyCLd<7F2G^a~xL4Nbv`{N{O>Qja>LEq?vVNB^} zlEm*KOtX0#*KgLu7ai|EMTh8^X4Fk{Mp0%=vuh^pdY`;1CfR|24NKR=GVf zR8TRG=4CPPgsEf@&&Tq{%0Ac*PcyThksVLXxu<7eGrJ|FW$Cl-|6oog{}Nj$$AybZ z-=NhX&Cbkdv|7sDGE3`?XHCOU=Vaw#yu1+m7ef1&Gm@LcF=wm7tZ=vRknn0cn!a23 zpztx_Gr}JUe@UNOW1b1grEtxx;Unw7;~T~Bc=10QrNIWwk*E=Qy;vS&lQ}EfXnlXM zUbNBt`i8%0aYJp|3kx0kf%QT9Sq2n|K9oe~*+h6~Bo((!j1y0Pl&_IW3=9SPNxq|| zvlTY>^6j7DtNBZgqJsJm?dzL-Xpgxxz=LZKmdm5qU5joP90R9yy=oiIuv8#)a1M9Y zFF&rDWRov#Qlb@w4P2stY;-w`1C?;WM@!h?QreAX>7?5xc?2aMGR*_4&O7JsCHcsw zJ2JlRNvGQ_6uP}a!Exwk1aTT8aAj8X>fQ)A-N5I| z=4pn<*=*wt5|l@8gx?I|EJA}D=_QvRn?oFus6_ z&BIuB4Lb7=L5cv27<@y&L&whrdXGT!$8N0JhA4D4)=?Q`Fvjy`y9^`zdP-K|Z;^y( zw;_8oVWf0oKsGWx!0c!v26!}x}&Q;`@6X3o5w3tiXz4iY~_w08IP4|cEC$frbf z&@dCG@daJ~0xNu7*H16NML)*m_X`Nx&uKc-l-7+jEaH@98xJ5{0m1Kh6?UJE>t)bxE9vs+lbxb4yt*9ZbUEXQ-8#w|S)} zxpa`GMH6fEXhMx+Jz)gS3^#^vems>35A(RN@6wm^v#3YkOOY{B%@6QZ!%4ryc&J)< z9-v48p;R80(4N0KG@noJ&gOSlQfAdmR=US-c7yv49XnIhv?46f+Bu+Ie$%jCG86_U?EeuE3P=k3^;8FUyY!k-4K6Dku~?}HPw-6 zYc1$wdirdo`<#fXsU)fsLf2?55;^j|N_RA_4{Q)80He6P(d#grbBmko8xrzv0)YhX zoN}XCl0xiakq#4gbOs1MR;T~u$i^K^Y)c$ufvB)Jh!Rw|>-BowWwf^ZNut%(X|igg zW!616?s%x%?+yJG{}J9FjD1H(^nVfzZ>Kt9cf_nk`}{5eDtFL$w~MsD;So;G5|ysR zWgt2TZfs{@B40ZEvt3wU2q#z9x+_;#NUpZB)Olwl8b>MD+R6qFCz4dIdC)!!zL!F+ zGk*^=L7rP;D`4bEx#jF+t}-Jotz56ty=<&F6|=Wz+9TMNU`xq{zBN7>LBtvrPyj)< zxu8&eq%!ulzj@o^Uw#}dt*#hXf8}bU|H-ZI-Ma1PQ19AZw`@OgV*4$-VzWidnw+$( z;^`nr4ss_}nM~(FuK6&s#s}l~AhM<$J|&1&XWB7LohXD@V)8e$@2A<7clx4`BIV)b+Wt&Q#BoxIorOb1@h+d9ZW=&5yl2I*BUo{y|p=CCk{YNH( zy)1n^J^D#c939tkk+Z%iC9G5P){K8jk@TD@d1*D5p<`dIxo!jEzR47@fQ|Sf8Sv|f z_c16AeTvP{jVR=T+?LRBSOCO9?iCz*0{f37DzZ||qLq{n?!N-}?}gl7=yzFOZD{XS z2FO&G15yoPsMcc^F&UEGUBU^AK7nP)mMrDBeoL`vLB?-+%Vm4sR;ZkO=wzjUMMHgs zs*4=1n7dOHs?ulZH%_0XH8WKG-@pH|J#UL{8w2C>*tTd&k3{r$Y|ua$pHPUQPX{N3 zf#(Oz7bKntk@CfBV6`)Z#qV#0)u2yag??9Xg?l01)*XmYdCvDiA3{mtvt20|8FJR? z57#ID1)#2UJmx(w|i5PamvdocdK;Q#I@0&8l`3 zMv$u?%vrUaJ8O3KL1uh8s;M_0v}hIkn4OTdC06@Ld;vQ_Boa7yA%27%UDD)){o#Yy z6cvQ9d{j{gX=y2p8E#WQ%r(d`862=hnYYg^LVz~l32`L%U4#>oZd7G2UAHdrOZHGE zmX3fzAN0Se>XHO-yOM}Hhz)yJU$*=pLv0Q{lxyy`LlYlP&ZSbmrD`e5H6o_1et2o+ z!iWoI^zW}$R##S5&v9D$4LBJQs)IftJiLyRF}OmG_8b936vE|R=wJe=*?uVIn_II0pb}VF19|sFpnR?Sl&o2N#YqsFgeD#L!5lw~rsEGP6PyjPoRh z6+2>S)0!2r6&xdZjOh_Vo8F*`9m&LBtHo@&b2cYO6kk)V{=JM7wRE2|#Z*Qy;P7l>#I1?BDstr0RA@B6Hk!~%0HYl#Z0p$M=m-FU@;@a=0m3mehQZNMEf_ z?wnZ5?4#rKa_?AsGM@2M#o1-Y3Go|&>#P^H^Fib-lTW$y#!Thh)$3mh`LoO=lOT%I z);24x7F;H#+|B|=QMl^47UUmjQFCWDyEE$XoSCOsYb=Lt66T)27IpM~`rP&i&lQCB zJV%SDgj}~QPMyPNZ=ity@Jk4u92=OScZoR`Tt$^p5+bJ!PQddGs_!XpmGQQzQWJ~1 zS}=*A-1pR-;BOJ#$szWIH#5^{FatPzm~0DybpY z=O0ilI}g@>uzC|8ucP5o6}!!+j&_xxAF|N2Yn({ty>8Pz?Yi&H94#GTrl|gp9zOjr zdXSZml#bF0^mvn2h&b19lEgE#g0Svq=HtK?kZA|w)L=BIf-u9f2{6O$0OEm#c7;<9 z_$_EB^!b*kBu}3|DXjx&uDc}3HZ(UMf~I|%t*ADu#>}Xqn)4>XQ8T8}9peeQl`Orl zQ=7t?m-BYekA|meopM%OoGCQzM7cOCB2-%*L4k_GccPXQ1dXG%J`&9W3xN#*_W z{6}qdoHiiYR?Cw0+-JA(Rb@I`oSiLZr|I-o>(tb88mV#0aAI5WjHg3;#aG-h9-{W<96ju`>9#h8u9eN)}ko zEt~VQLosG za!Bz3Sj(RyR|-$4kIjvN*OSTxn1sO=SozQNul}Hajc0iOa>xAsD$HFZE2E9Tc#{4Qh&8o(XG6zMO5Q3QdG&5G=)q} zO1fyuk>lU4?DhJe5s?(=B1VQUiK0Wl6^~1b-1~`k_x}(rkAxX~*3x2{En5m;Ny*aD zyGk1HTil9heX~R*K6(jAj!s67j~5~$mOP36VbKXBS=4n=mICJ|*!#~s@00$oLt%Z9kRnHGD-JJsh z3YPFZgD!It{TP=%Q4CRU%tm7*uD{@*)^aZmLmH>xN1)1SW1 zN$iSgMAKC@x|43-FN;MaI{E#Bolp3d5wQ$Ui@JH+QDmjYeq~m(bluv@maL3rEQ^Eu z3y7Kc+>mP&5XcEnP$aellQal2jH$y9;z3KiOeG7^SN=(}rECG1Q)DAm-Qpo}>o455 zRTTIA46#Lg`Xa;G<{B8kY4lmi(r-RZl~kK}Gu>VE8))l&zpxdFi$`Qk#Au;^hT(5N zz)S(x4D8r=n8&UOO<^aMKW-4t0)J>D>^ttzV&nyblv;>lsaKj_xFLp#4g()byV>CE zk?W*9yAi|s@=E2=#{{9vyuiJQD~wpKb5>PRr>4t)$kOLg;o@T3t?6+$~&M+gIp^Y-uqw7ewCu zHOpOFZzxXJ(CACWva0c}SMgvi&^ z7fVpEo%VZ2)c4VH>}C0>*2V-}jT=nD0C!&KC1Cq7zM3h8XXaRCHidyFlOdF9|uS4FZ-_YmjKk zNg%704epnqnZd;eE9Xp*}(PKb+0w7M{j54NALf&)8_rxvGN-lM`e6Xhm~J{=)O}psAmVc@2#tSUsA8lSjpivC3>Jff?(m@ra$_WG<&mp5dL zw4N+(s8*W(zo?byA`Js1xa_CsKf@A%s$N5KOcS*L1u9>v?wdB$^X31$YCL!JX*x&0 znzeObC{xKr7^HAWpi^*vFL36xxutmE=xQ-L7V%2W3PgIcaBOgf{~fc?zBa2XmSM%s zx~k3Wd|*aX>n6Z5D0(*eHdnFfNV}R3CTztm*b~)TsuMOUFvDyAD^;tgt4`NQ8(SNV zt#s9ORJ~|b3*XNa^i0&q=Z$DaFJu%gn@(r75u4ZN=snDHWNSAl!prrCjMgC;A@8uX z0r*4P1Qjq~CTk4L*M(5f{^@%!3iTrNt-^gQd4tMZW22@AW(lpD2Qmp99ox|N!rGJinBNc`~GhVyj5Etn^=z=E{ zgy#$QLKYHaDo}lyRHPYH4S6KmoKb@IjY=EzJ_w|>Ia6JnU``8K1;7>BsAquQ3v<#_ zhEwB*&}UC8up847Gv}Bm3jhpyS7jVQh3~72ic4sRtnX(<3 zTAoi$MdF0)Y$fCIWNR13USujYzdRMOWmEK8iM&2R3*^9jv0Wfk9h}hff5r`lOS+Sc zMw5=-|5SQuR#Ns(CXOQo;BC8f#8MrI+BOhyVOEh=j2mh00g zHL4K2vtZ+FdiR`yNj%m#SnQ0&=*=tjZaRzKI>OENahAtj5EfWmIWzDPydi#$=Wkc} zZ~zRVT&SKw14hmb`^Nar4{zINX*(wNzmR1N)8A8VEgG#q{1MDvJ$}Q@SkuXgm+(#H z#8v=7`JcvZJ12H%_Nje8fOwxDz{st~YzaH_ru}#LBM%cQhu-`~1$r-?XYor;(9wcy zyH-(%Tp;=guAe3(Ap^&Y7Q;y1_ApP2<4=^=0lYTB6CWT`bl2mVfnBTL&BW`2pe9Jg zK~DcEdXZlq20i}~tx%6=Ml%gJ;0-cS9;V4S zf+vJ6jF|&C5(GpCHieIDt#)}A!_HwtTj(GKI7tSG97ydd0hUPkv^jb*JrD=2<9n%z zR{#B~8q*5|o9Jc}6D_8xX_YREgczCf^vtpMn2zVz@ek#9=0BL?Gll;LNg0kDl_PB2F$miA8D zi9;-lz%f5R6WVPjhbVe<^5!s%5XIrL(Ck^pE#q^lESQVMA@m%8jjspOj0V02Ci>j73?x;4JrC=ipOC#8L3U3qy|HnekTtp!30GlaFqnP;|))SDx`oq7OQSp!0 zMc~3v9vg}Po>%E#Vua0Xy|`ado=XgnnVzdCt7c@Rmv$p&c6jou zMqr@Vi%%3r;Gw(2AMY`7?4jY8PmN$T!~FRv)`mR##=3xU5;`tt(a;eL=%^tIc4*$^ zK&rSz2Gn{Z11mx6I&WwfhOhjgZs&~rt%{{273J2VVLBHs+vD7-C`rS-HE-l>eZ?`2 zet%FZ!XaAq*40b4Y2EJSyB=ewHBENf75E_}4obtH4Ch{sk*^A-;LtG)#)wk2!HC() zUa8#(N=;>qhgp!JOtBd~@VdLaS|noq=G3jGoIqOtE3Zg>EA@*01yw@{*}OG{J`2yE z&bBO$e=X#nfqijV6l7HBnair#WB*Kb+3ax>&*~_eG0zca>K2P_0J;C?srI4?87j%` z7LEeHIF->#%|?mdgfh#*bm#G09YRGQ4RUx-j2)x2*onzp1=cPnYX zQOTm~lX-f}2lZX%G95yY>tZ9FXHTGTxP7p-;m)(g<=md2>yZfguSXft7mUzrpSS>Ofr( z)_I|Rm(Gj3g#82b?Y1pJ&P-{LgA-;PGk^eyg=!DtfrgP$;5Grg7Wx%#R4he#;_Z|a z=HZ6UmC#65YCw)WeXD*u%yn(FzH7uRqWub}XxSW*d3t(Gf2P%zh+j2PZMPAR8@p@BtojiPOX@EW3FjQYT8{gtaA4ebpAq0we!N`u zom~Ij?oH!=xH5i|O{BfD8p&hr4m49ee3;6OcW5{tp}QsGm{>cTI#qjISLJ$LR`thg zr&4D%DliCFRl74Y-73uC(04^T{zT~r3@w#NY<{HjrbLHbr5F^^g@`M5#8@WM|BjQ1 zN*&RSpm+D*kVjk5s&Dt-?IdkG>7d(fzq=-E#8J3ac(L%)8&KzX`r!b;ybbmt79)lk z=6N{#@fhV0d4iB)6BaSRqT0cxDeV1g<$A+;+bdeCELrJo~M54 z&+#%FHZT70;%_k-4m>bIhz1JLD+Dtgir^WMshHe^(&kfqFwmlb%z2-l(%L>s+Hur(dJ}=KVr~NxorRO^bJT5>(q&D)6Ge8JCM+#u4SqMR{BryQPv{ zK388JtK2+>UQ&KR?Qa$3Z)-0oOC^#y)jiki-jOCHCKFt|_-Piu%5%HA!0$M)jLZ*E zM+ULMI0&B$OK@c>H>lUUPy-$gDCn&QhqYt+Hz?^mIkr+AtG23@<_;7hsIn(ZPx5~D zRCpFkjh9hEQmL$En6x2EgtX^1HxNal_`zV;)&nXGBvRgT?eXU7V6#2dzb1^sfFi#^|mOWBl6BWBlotD+-E5QUTy{g}$OyDhU|0 zCB+#YbY18$4+=yb5w8T%K=8s@!AfdLdb4lg|1aHnE zQ*AF>DrI{Yh2@yN?EY$}w!93vQWw8Z_4v=BFVO4ET|Q>9NSGqDY7kIbh`ADYA{M&6 zrbG|+zgV}s_up>iyl7!PJ^AZn&G@M&x80uZZtErEf-oAR<_fjYURS9OWBOPhqK%>r z`vz20gPj3)WsJB!6dnTTJtD_S80jQxi?W~RrF&qXtjeSN-UmJnr&C+2b*PxK0!A1I z%_QB@95L*?pP!~H*iuv_+ypZ{1mUb%?kaQ{Za2Mn@q6gIbbhs2l;r}I>Ee(>N85H4 z4C-x$Oh3=E11e(!hqN-ElRTS8z_*$otQ?nYJl&G1bR>P|xFq5B%i36yj>or1d{j(` zSeB67n#Q(tys|c(=wV4NEO+SqC++KD3s7z>+%pTT8^=XSR;12yL6&eYF+Gq!xg20n zy{0T|VczM%wX%V!T^S?8izRG`3a_scUUlpe_xdMulTrjP5c)iS-5GZ#>4lFS9HSS$ zm*|Kr;D|Jt`(-w_fB1>J?t0>`4>2?6TFKpuMR{_O0FT~YDrP#4Y~h#cWO0%TgnQl6 z57_M7|GT@`w}!Fy3e0ultHZH)f=Ykat&hcWxORQKk+%y1WPC{2-ry>y4TcQZRWC&n zqt)NFPyvMJ(`>a{ikNL?;A@)^aRw(6okRln`@>Z0mzi-BfQj`b9pH?UZlZ&_74}{B z*Z+YTy8}#pcf`z3`I6&E{;!NqwdauSnUCrAV^HTYAjM3J4#$fAESq~nJhUPDBuu|7 zgMyo{nY_;$8qB~$Eqkb)m+4LyB1`FHd^4S2m-LwANfG7F7>cE-5+LH(T~s8mp04S~ z!y0uxqtEJkz5m_)SMOiFdjHj*pnGrDwBvg1bd^f+cg3(s^@lV)!<|Zmo-L*w4{OwQ z`pt}9-%7vP|5N%^o=5hBi=Pa!G`B!cZ?g%K$_`8<=a|%tl1_TIw%6ajAB$w`W4E{k zDuO+b5m`ioh{-b>U(eo;9Xapb{Mc3^Di5UDU8GzQ?fUU{*L99!i%ICoOR$XFfH~I) zKd1|^)3XAuT?r_Z zO3WTcS8ez;FlrUOGP7B2_}%Vmw_v$lfPCl0ivmF67B*bU8cQ8^|Cv{X;x#~GKsUHQ z;y;F%VF@})&jU)2FdPp;7QhM*%~&Y5nD2o}U*HF7vt%g<(HYdC^Z(e!#9=C?p_j2y zZo<|w@qvk}|9!AW+Esg>85sK%YbPeT8?}_H)j@6jla%LPi_lJ+zPqDw(en@|knP{7 zk$8p$<1ibgZSOMzbD#W4O{L#UK1#wRKTgC-($BGvq`EPkM zF|3^3e>liDYi7wlbijxcbaNofB30RpM805V{YDBW6B^EH^zODMqUKv(O9@Z_kS2bnfXNvG@oo5@^5^tD8@M9$Js*R>txPEi${a;H4_e z=iRAw*SeFfn}bTW$_%TvVW>p6OiO9fFM86+832UcuWGvMrmwA}cyrx;R~iZay)q8Yrkw+TQCn7ws5 z7L#>)qf|L(C`fc&-=uCxV=9RX@#cWW^zjW)Em0#Zs^DiWmFVNXLsj>6WVy3X-MpqS z#Nrg0&lebWHzJ@%SYi_cJ?EXc!o=2qw%-sDnOU^ylK^2>^z+PbQlfGY$3rGTr5*NS z_vGS2l6bOx+OaiPC0f*tMEY+lIx>m5GKo~^q-a`)N|RAn%VI5&#Hrm$?_NVzb;o$; zj#%V5BK~iR7&h_W*qy7oxw8>GM&}kdfvUXLENT!c8BuIZtUyjSYf%s5*ft|&sOEyF zIw#b$Zf)5Tcalnmj(xf=3}UrK^g9g8@iyTu;eO!};dRWn6+v-74t`xW)dE3b$ih{p z-C5+?ag)lZp)qI93tB^R2%re9FRYt-KxrKh#lP4k!Ki~ZGca

    cK8_k&3jhLvm5o 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 UjU5}<(#t{U{{g^FwM_s30F^vzIsgCw diff --git a/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.woff2 b/src/Presentation/SmartStore.Web/Content/vendors/fa5/webfonts/fa-solid-900.woff2 index 67f67dc1650e11103167db56dfb5f28a2eb3edc7..e30fb671128fdf2f4fc6d7b1c96c0736bc547e58 100644 GIT binary patch literal 75440 zcmV(@K-Rx^Pew8T0RR910Vc2j4FCWD0_{`)0VY)eN&Dvj00000000000000000000 z0000#Mn+Uk92y=5U;vhK5eN#3oD7JCV*xe-Bm9B?sL!TSZcmLbUU* z6tiJ&8$(d1QS|dW6{v2F+_`PQL)KE4%)upi(=i3k0|?xxJ)8ai|NsAMlEoPF|HK2} z1vRQF&8oGwO$aC?Bq0e&NJ0`)s7W6HBV->^wjq~{sv6+fr>T@uN}eI{PUoC+R1HuO zP!UiOQ1<0uX4xR6s_A%AK2+U;oY6&m=PRI#Ni~!&LrZOGGW2&fv-P5G{Yy@+fOw(n z4c{M6dhI)Sq8E5Ly?+UnUjklY5U;l&c0Q?`<*3a9NZ}!E)oD{VMXBwn*4h<7qhaykyKl7Ywl{~ql%ZT1)!Sov^$R51l z6m+aRm$`fHeyz~=@CW;Gys4DBvq!&pBKnhmbaTGO*ce*9&>>xWPfPx2IXpkN-tzzT z-r^x%aLNw>ca$cSov&hu=1=xhn3GB=B$2HtwFwvh;pV& z%&`#oOsv&r2#Jy@l}svR(u=Vwc7iDnpSQQ|ZaVS}FwO=6&XPFIG_WqFkANFv$27!_ z-|Mpff|lV@6rvE4EU>^f#@^e#zt`_?+n!A{Q7|W;bj}Q|xsXr%#eG9VqIL%6WUZ0O z`1C$=gT|1Z&RNDi)qxMYaQ_Dg0E9vYhmaJh1PSNF+OL)2Q$SaaiX z5&;AI_DR!#;)W^bZ{QV1NgUPS08hP6+bG?x?CO9@pb8ki^b;1`jLM^;d2a32&Jj=r z4E~qRQg4<0-=jS<#}^ty;_2z#9n)-=cA_gC1c_eyUuqzVT#h+N1V*Ub`)@OoJcs&r zwhIz|Scmt`LU~j)Rx7mwOOQCka6i@5=&PMum%S)3By14aJm4gPAQ%dg_(GY{auyC3 z^;LbXS5K`r1k^&qfD;1^gJ22&|G!l2`>OMHRWtck6@zWP?jglw*&Q6^_+kbKtGSVk z*N>C6@L~gOftei&V2~xxm;oRZ?6zeqP^9hd?2rJW!=!G%)1LUhU%ytqo;^UFxXgwv zLLZQeOU3QEC@P<-{zv3ig=PYT{g+tCAWYny`WDU^CC?R?4%o3U6RHp@eQ4AI03z>0 zpa}pZy4#rHf5k7GD_Z~+6WJvU>OGazG^OuZ#?rSPkzf-sbvRSUFPrV{zpuK%@K4g+ zGymmVYr7D(VmuhxPZCLU{O|W``L1-=vnHYG^xY7*RMEE@#W9Zz&7_u{&4@)3i6K;v zgifopPKiGPpSDi{iUJT1fUB43VOfK7i}w;gog%M_3JchWpn$SYU#j+9K~c0Rjp+#? z$v>sDt;v5w45vNzdmVu8#sk>hXpjxCDFP5^f)r&0f+7gfLN`DeY?2zV1xgeo&&vAA z)+9;xRyqADG(b=QDart8%A{n?7bWY55M_`3C**Y65KnVB?%}wn`{vv3RjF2AaNIfP z9-mqBeV{6A!?n|=p5H;y$F!f ziIn^qYaXBVrM>9P|)4?@$*n|8XsRlY`(MVEp}zweQ>s-F~;%e z`wNZGJcKArbDvw5pD~sG$m&SP-T!78jj_%J3i4Rm4smL4b$2)g-d~0l0xF*?ki!SSDcP z;9Pc3)a-&9(*d)GNg`DoR@~)Ha(}|$NF=i~avN+t762Fs z!1Ss~x;m0b%joDGmYi1B(h(FI8Jn1rm0MNU|ID(A>gL}1`lVGg21lXRTO8g{FBp-= z^%sIClBrCUMsN3vCJ@PV79YN5awH`uV30E~^8HGk2PKa?x`xly&o?Bd6+1%c_YbZT4J2$_u zth%nDwX081$AIQE>d+->L{1Up=7YwO=|ZvE>I6U#1QLV86UkL3o0BU56Ep@(q_fyv zmi9c&`gcDk2ag`V6cXy8v8x_Kj#7{PI z@@u+g4P9MTtKWPHsqe2#g%GK6fjITeQ^L{io~X6 z;^G5oNlQjP<7?s&GX{QwVh~GDCOthf`S|>!GyXHR@yw)_sAkfs zWGoU61^#~j?#C;=j|(5X^LG7n&p!QR_H;iVww-eH`(eNL z{!4IVdAK?mJ-WMk=)QYyxMZ_LB;@nB95#bSCF3z@6dVQt1HE|mM~kooJ@jaB4*w_zkyA*%I~B%6UPEfh4wS|zEzL0+kgwtpN;^o$ z2(}!pWwtS4;o1yr9Z^-YL+%}WAZ$M4GQmR|Sr`&)*l`lQ*2OstNzPlNJur=tqUDIy zjC}-g7HQOctZ|yTHeqyPXbi_qRREa*at5iVd)dB%5L=hYc#)#<^$w|WI4>0JOT6<}rXD5u+~ zgJuUttk>*`*VvJLO7E>9c79>O4EOR$SRvQTHAS}ro7wO5D}!61>dlYdILn>ORQ3zH zQQ}YsBita7oyiTiY|4fOZA9sYF{+KK=m=pBLF`T@L%ry+*1l#>pGNawfj4&9oIJUh zOT-Bck0jXUR_Kb<%Oeas83(WtN zE#O;Vv_asMWeK}Gc#mVcaBI~IKnbfin=aB0FebY* zC~Y24(?^VH$J^Dlh*|~!h|=kr$YcWH^}{RW8Z2g~$5u8XXTvKtnXUzR>vfPKN;U>M zGJ`qp5HZmy6~^l}W0p~(cW%mPCyd-e1yTY*x4as<4FK(N5;2|0van4?CoD4a^7s@$ z2y(z2ki~tR$WK1to6S=9&u|2sb=~XOG9W@=40MeSF7$i=O36w2x1PTC@cbcrD^nn4 zGQ+()^NaQZCGi5#;TQfuVlzf?DY!z%?&l5-vAmK<4xIh-_nG(*v>o$=9%xz&H^l&3 zhdO5v+eGyW0G8dw?vcvs78$OEC{18urpz%js|=Z$sT}f*y;>U4I?GJkyp3&8vjdWG zx-lONWA|@l6ZY)jeljo=A?HXT!X;s6jq|F~$Owd+=b3|T#%haxO$cYXxSm0bXR1v6 z0|XL6*WHiz^^3SuD!yC#4pGMe4PL-4KE;4@i_7hR6E3l@HJhxSGQ!5^U<`tPssLzJ z75?2zE>E{66XP%9#p##?oj6s!^6YB+cvecC+cPj*s9wj;GOt!z0?)|hiakUi2EdWo z{)R$xDY|1|n?f2H%m&RQk6i;n-IaIxH00v0IGsbAB1Jn6-oXhh_rZV&!x9C7x?YMP zzA`~)0F8Z{7aIt~5DL8icd5BBA1Dr8ztTQNzrF#(2y)FxK@_ZY_5}})5jE@bomg*+ zLx)l-;dE`g4Y(Nu++TDn(=&lx&L#rZ6<`S}3arFsl1vD69x(v$LRcV-qG%!6?jWN; zZpZq)KVzEW1+OV5f z0K}OcULI(HO}%+}yIO5#Pk{XW>NNzaeTZc@gUNGsgD2w%FJes)+8PIiSgf)>NmJ6JD@Yos#QG@m;x?* zkeet$yxbBQJTQpxgR6sYWrGvzXqry=jD^u6WREycIVa-5FdsAHv#gAiEmc3q2#51nS1cl%6O^KTaq$$)A`sV;Bp>+wdnvK{JM%O3{%^V6X zXmryC%tdq$^av>m^fhKv>rx<(sd|yE(qvm5^EgXF5|JsI{BSs{^rp6$TL2oy>FQ^L zfhIcViZwCA+2V-MT$NVSNG>$UaxzIV5ym8>9n}OQa~Y0^H7vl$dj%Hv5-b~M)v|N0 zSJV~;scn~!%$hE=C`u@`c)-Jx1}Ka2p0eCt=YQZshq=0jTGbwTnlc!lpsF{U6V=to z@%Vz(W(}nvuT3TFs$;q&38c!Z8d|o1ZE=peHFv~cIt(dkMam3kEg zO$0PzBfvB$x4bwL5Ek8HzA2K78>SiMiQ@0?Ft6^Ct4ijlEHiOvGJeJ)b0D@y&r5k; zFuk#&l`41>^o2gF9#&WGz4Mt;*&$JN)|PVrn5GM&=ae!EKS(cxJ+$Y0zdu}K zmQK_pqYP47XHaMqg+3foE8T(aYOT|11hh(1#cD+*)S;VWYq>qRVL9L>{t~c0N4Xa! zYx6>2?rvNNGb@C_-G0Mgcl#+UQ!n zrSd?13_eli4FQzJ}h2dBhWaCxKdFoW($Nve6);k|X+@;Co*+ z?L_sEFHBpeimm0=x3P9(RjZ9^9qMY8?NO~ttKSsbhlVEoD4-K)WfiF57*izCW?VYg zkAneEm8J3K16v3kQQ~0zh)9bg|8P@H)Ww(!QF0WR9$% zQSWwiVL}Bs*PW+1Wpc$S>Uf&iUTp!pwnj9zMw-dwWS=$oM%kbOVhH(z2@uDgflthH zc4y!qXUag#xYP%xC3W@i#neu-??6e$1+Q}tz5f}v6UTkkC+Gv-}GCGTnQPI@(VWj!wg!FI+RWbnL zUo-;L*4E9w4yTGCDy)#~c$(;%m^fI&4{gNT(3>CGNp~x`fEv;GhItw%P);;&cOtHo z^ZjbdA#F53!P5U)oi+kHG^0zp#$v{T?zCP!q2a!eI^wcR6hj_{q_8y%WPr%qN&K)0 z2Gf(60N>(1HZ(+;uS+)G7Rr*Sj}AR*@-~{}Y{yvj~zzQPNL#-9rV_H3>aXFn@R4BCBRu z#OkM~K^crO_B_K=e$EuflFTt)HJ5G8p@mL}WpfwXdp%(ubfP2OV~Su%%v)NFB6z(vDPR;c67sBCk90pqts@WkYJ>owE9$tHX$PC$WxS~jikl6cxV)) z%w*$mO|;I3mg$9qcnW8tJBM8)2JUM!nbx5@JmC;UZy1jICR&=U87ORF3iZQ3L#Q(V|84& zYhSQE( zh9?egSo=`dAp6v3gwFNAq4!GI5wXuw2tx+in2^(zF;X zQ;_VJWWi3O!2)li$xQmmoFpJ5@eT_Uiq7o za5?%daJKb4!BJ%)ty|2KDGp{9=a>qSZYv|7DihnF+__V@81)TZ zQJ{ugrV>SIs0YO`XqGk@6n zLVMltnZWX0Hqhk^pXB$r;Z`{T83kgOC=9GuS6#Fo(dWk)Thgz|TQQ$gZO?4%Qawea zTIs{PBsvX5z_aVoSv~jhLm+!xC+7M$!> z_|n}E6;&nw_Zkz%ccx;zc>h(DOiV_zWbb&w#hj4%sE%WN*dV&1|FC%Gtdb<_*%{YP zw-TdcxJ=BpyJ)VwV!owEUD;)d+kQ@(8@4tU9k}hvsvo44qJ+3X^819FJ%=P=!o~C? z#d0)Hc3T*qm};vq{?Hk6>UQ^3a_xmTvPYK$S|kZ};y5~S6OW9`vu7tu zM@A}2fFQ1?`rFQ08?~kmBu;W7lPdd~etox-DQj^QGeLPDmcA{Z+bKcL)z=TkydN5) zk6)?+5|{$*i!LBROp95P2DRBuX!j69j_53yx6H~D5s7CfBBZCr6h0TxyS9Md3PVuH z?b7T%7c(6nm_IQI)qt0lyT_A)?0Ez8Bm8m%eTo0EC8?Y2Z)Q04afu1^69M|cRAzM( zz#BZ#y9R<7VcsF4K7axbiT#v?BVI^o0p(EE5VY~Ys{0f#a4mwG=MT+gk$NtoU06Wo zzouYij{*3AQJXm_MJxgM=~p?$1L_U$_DZI3b4fYxrLw2hbflCcIIww4yBO7SD9_h3 zxx&R<_Cg`+9>#o6wP0AD*g9&P^quT*3wRH+)=74>pM4#rKPp)+Y6OpU*d56 z_UxiMb%>ehwM!*%NX&ktaI>Ca=1BZoK-60_ic!+lz3sIY1AQxP^`?Z%bU417ktU=T z?7w~NPxrt3!3kp8o&yS|#dfJ<=8iI7<$pTZJ;4bRFTZ@iBbquUv^%_WARh*FoJHEel*(zIrvO{Hs?tZV6P-b6xntgwwK* zS7uX*m89k&eorDJas`QO@_RQirL)q_!!UNgjph>>62KIKov*P$?KmJ5fmXqcZOn)i z{nCV*2jdXQUft|L$^dSq1)o-s1DifbJ%C`BzD=EyBNUmb!YQc z$clM@rT3f5<`i92>CE<9#6Oqxd^AhHOnqf*OOaQK;;dwi%!*u22C7L6Brwj)$lrH5 z@8M~{mFU+y8J48XmQW@@*)&nQ^J4Owyv*FS7|KGG(`SRo9V{mtf_uroM!uZ zd11_qa?$|4(v?!#u9(8=nrr+5s4pkrXGh#as~)ekx&^Xx*WrsOsu#PvwZVD}<|gaJ1`gMF1>tfRa@fAqQ!=lIkp(P{hU= ztWAYw)h+@2r`}F}b}|2OK!Bh73za?ESL8M5vxiHOD2%f6e{PlKk$tA#D@z~rSFTnh zGJ_SS7+@zR*XQ zXgD(^@Ret(xMxD@{-jQ!4pXP$?A9FZN*ij}}nqODSA}xW?VI zNF84J;8nY7am)R;+#@mEw5~sT?kQIob9fjhiEkm=QG_9hos4exyW{dA5BCe>-YL6O zdsN&^`2SW43ymn0k{T6rIcN&7j15bH;w@@>3&i>TeHK#USI&MWWs*c>OPiYGMf;D@ z1iNf$IF|M$cc>=FL4VrZjDu+dm}eJkPmqJd$$hdO5JBX5PfKW)@ZsK zAc{+|dx@_s27BTr%Is$x=$3d|e~vL;GoIvX>^exKcm4U!+Q(E0#?2{r43;caPw6`V zgDbr0(cJp2xw89%rn{w`T~FD3F!%p zZrgKz@bGnKfpk|>*_>J+A((n3E6{b$T_p-!-;(~Liavm=r#CRL78KMKL^`u%EH+u5 zRSGezru7_%smGS+7{D0L+Am+nZdz0{(*U0)(qZeq7GHeE-ZGg{gBThlOa0wugX?hv z5-Sa$+yDesoSBz`A3IiaY#xR=O+m{(5`AqVe{%Zmis#iq;IKu)8Mv` zlJ>6BhPB*#7s7bToDHM492zvt_y}UC&ZA<19K9i#sbENPKqa8Ap_pmuHzfK64P}=z z;fwjbJR8($Wi*jc-s~X~{o(N?OmMrd%*R`U*Ggh8U?fzWNM}1}V4{{AYt|vX8H2l4x4&5e$-L4JSnW?;WI@Lf;%O>MbyHdry)T3;t zw_Gr_zEW7M)Eeel1DC)Gwzf7>AvAjwi`)b$ddveCi)yQr`=U;Px27%iw?knR*0E}* zBjvN?$PbDuX@tORVbFSlzJdnmQ?7}=aQk(Dm@)_J84@cQdv+z@MB+<0vgJ62Z=O>% zM^>?SPFei@_A|YAi7;cwh-+J0zA0kRO4u(HL(J6%-cOld!gWhDf6x!gnZvA5AzRIi zfxZYsX_nAiN7VB3DC0Um@MVgwv@VM?tjiR#yM)LY!RHRCUV?!zmF!;LZH{W?m$bB$ z=HXymEFB1c*+H|0mPFza34iG_^Ji{$ZuWXE=D5XHf(Qb{)_X7edXHJ(t7E={xl6T; z7^XLG-d?;2T1t)Tz7toVtm_Z};BW6PVo-?8uNJTI#S6Z4PXi}X2q|(4cych#EjscV z5+Llx-2Fk8(p$N$Wo$Xpod$5DW^B&n-lf`0QA^asUAQI0TI41)MA}>~MtjCgRYsz?W|Y{c{>V|~A;OqQ z6xKdVeM%&0C2)KxqEjLzi=trJ*FR5um&gYuQ%a;;30kJ%z}bD9I^r0#k*nUj#z%_1 zeu}u$Q$#n1D@n+V4e3`-@h>o>oj|qaBO{|clK51H5;zY;7y%6ey|}TEeWRhTf`%_x zlSU*DtxqQ@b>VK+_Nco!_rv!Mbf%Fl^D{^Sw$qF2LC$eR zM!V`d{w+o;=ja_lzQvT*BHH36Awvu1B??%Zymy^fV>}f&u6TjOgEneQXjjCV)6?U$1i>a%0d5TJvx#og?2h$l&gm?mCt-Il--OqfbI{C0fWX!>uGWxE0Av};Oc6pB02 zSx`KC_yiW4APBp^qC&>DP@2{cTpldN(6oO$L1wY|31Wp+^7UvpCd zcjRe z@=h&Kytx;0LlVRg%31Y{|J3egst1elnW5ygI4urK>5zK*8c=%=Q8b;U6zi&#Qa5kD zr>k#@>*H2U8gc3sRkwTj8^ZtMt6t!KuJv~2)n%^N*E8=*I^LvVPu=V?Ck2;Nj_yFq zh#|4`I%28QX({9!8#GFoqv-vF8>gr(*#?9tHt1|bVG2pee_@Op6)e_p@KdC@uK0ii z!+Vc}ssvW+&@xbgc6a7M!ghp+Uz;sGFcie`bS+K?$N;DBdO&It4Bz5Y+XJY5sG4{Ehxh2>hH>H>k`kbs(f#`$5fD_@G3q+{^DB9SPL9%#A3TU-Ca^YJu~(LB zA7yKOv#ebyZO`k|ZN{)%uMP*vwS|(Rz*>B!<)Vu_pr0UVqaGg1^QRImuHwQ4gWDSR zXfa?=Q$iRv@gHa68Pg)40tB#6;hZzpt-Mn(3k$_OmmE!hdU3C{6XvN?&UlOqrKo4T zq`9cM2G$eM8`t+K z-|y6J6^9~d=hz+Ph4=A7G7?FnHW)VcJfZLlzQrj>HHVB#^>GG+IM`?U+GXGc<8$CN z2_1fcsWl!wTOJV(`33g63Q8uS!DD<+BDZ1B6ek8B!$w@&8A?Ln1m>57W~QRRe>uTKT)alsWk+G^lMO@9l%s?WYC6(_3| zRxV9f%Dh^cDiu>!pH)A=Y+4XjGP1zQebMv-$LX3<0grhAkC+(!82fS;X7f5Qnqgxq zhZE=i4FKHmOk5@iMk@G8A!bp`~QTmnTV_z;X~ z0^c;K1Xl#XvN@_x5EBZaHH0LoP@Rmj&+H*>gP54~OZ~FK!dRvTB6_n*ETY55!1jNn z>U>?Cx5iA8i6>cUGv5E+@z9if`?EzIOmuxye3wr|(%(A8dFb245h+i6&V=M_rs;sg zsK*I$6?{#Dov{#(h&pogoTBw}m4tm|(qcjMhU_wLh17w&{6<|@H#Syu=lWXQ?rbGA zD&W@P*=x1;$Irmkvz9)kj8HrxCu*%78;?*6^TAn>h%XtN%s^NJLt z&Gq4+XU4Di8s9NRcL#R>ec$@G>h4ecO|2M3^HAJ?Z6(!h_HVRFi5935(`oyh@{8`u zSVSWneCSL9vD>?$l8tqJpL2%w4qGJac>1KRw)tKpptm^8c7x=CTCkl#K7+H(_zr!eQ=H6r2mT%O%xpEbj%#D36UNmjgpIj|MLEL)f#8Zf?@T}yJu z`G>hc%j`u<#5PVIGpv_ie2@15#b||WQrJ?}xFs8V9zVT+O)I?mJgF))h)?A(y^%Kz z$Ggu5ih5?p+DZ#CLrjwEK>?YA&psh^*WOkw)B-({=iy1W8f(q)=^ryiijYz=2x=}F zZ^e+`i@-BmLhZ3|2&oAm#-nT4!olGKc{A3mXgG-y<)YX`!MHm-f-i#1MMpmILE`3! zZc|1X(Wv5zklw&5{__^ZKKLuvP-IfmoG1J|D&?3VJlDw-v33m1N0lFq5c(E5_6YR1sQj(>uAKS~CT;gyL&JauMP5gj$PW{uh<{Hzj)%xvFWq({*v z={Aj@q*pP1jzm9zt-PnFy976}+Mf7KE^ZXdRsjXT?*>Ve#P%Q>344z1`qIO$_bKt~ z>~O2x8f1Ri(xt~CIJwrlQW|(o3g)tK%oCOQsqu-sMEF_W9T?Rf^^^EpOzo8d57Q&w zGEJAQy;4VfH(iwFS;62PE^qZqOBkCZj*$v|8f{}B?J%2M!0Gk{X0}GOuRgOizq*u$ z3b%dtt7N8_@5+$}AWxm4k!9vU63xglt2kfr_SIMJO?N;%Occj@T^%u60wWjSJB>1J z{iI~%6L2WSW@tZZ7a&elsdU$A^fqHDAEe*RL7X*586Sg~c{eEpk8D#Qn3+`9lL9Fh z-ddXz4F*Zzt@;Ka-=?#E0w}t$JtCMD;Kx0r zepIRl9)6;@>Z7ZehXbL;#~+P^l;9d@aD;G_aho&b-`nZV$(=DR9I(4w&6erwktB+_ z@*eF>h@(B&;*on7^O{$QGDE$NA?nf7j;%skl&i@44xxo#oO)f_Lg$Re)0{mVkuLlD zVN=eGJ-(P$xe!AB78wN)L_*oceKHzop(psGCo5lN%c|*qgA{beHCnfsTE2vNP!|^zDNWNwhsS|3=ks5%c?JX z<}204Yi>cj6oPHJ_n=RIkV699G}NH2fAn_BrLE4JG~G!)Rx<7j7za^xw@cOC{-Ge2 zN=d|~6}97}MFQNY6dVk(!xTU!{Y9SWLDW@C_L7nM@Y)3*lPd;P;EqRMDp1)oj5+=^a1(!^^ysV}4O zozc|;<|8FU%h2wkBM9Z4a>z0&e+y`fRx?(IBRBIS^(?!O^{FC3B7$JQ~Xu6;3vVL3XJT$eo# zn)`p^i~_6-I2t6^mc!d@GSOom#|sP?r#=e>b|sCPhj9@Y&_BY-8^^G|?F=(K_Y@QO z$@shRmmoUX(steFPe5BlMQ-KxW|~ia!n!RbG}RtGmF{`kp!O7(xiD%ve=yVx1`drg z)XmDNw~!{7y-Wxlm9>qAz1uS+*2>-7YC|*=U<7vv%Ws(eWKTu?3QaJaox(h5XUGL1 z!gGhy2vP>lUJ{XnczjMQfv|$;$rH)=0OjnZVMJ)JGSu@Ib@N0)awQPPkc%xIwiQHe zltDW@X`7^`hK)I{o7#v^9quv{dt{hvY}M{V5Rt=iYy$^4$`i81CN3_KE9}c9FRIxA zcC1PFR{0^ZS6mS7#TpC9Y=*ajL9-U&D5p--14<4ZCVDzCeNl`%ETcdyo^shHjZRKQ zG9qi;A@6saz^GR;NbroD7q>R#QLx9SS9yI$j!}V>poG2l8)^Jhy4sY%C$tIvfdb2K zy%7e7wPLUm8Pxh}RGaX0mu)SP!j}q@mw(1EU7*2k6J7~wN<8f?*_XZPXm^v6(i4_qILt(JJPpAP6khE)|IIomHhmumlx^hp&-|th>dyi99E}_}3R7nP)5K*NlU6O#DXzgHKwKxH6%`DOJT-)GPC4kGLe5*V2yV z!cAdyh-*0$4TvS*Zy<)&c-ad8&FE^9mg&M$ANrqi%?%t9VI7iZ?_q+mu&=!lGr1DrQI2#!4={bu#~W z_ncNdf2EkR*(6DKH;Q78ep0{1wJC0Zd^Uwsm#SUdzdeSo$v1Eqec^5(#o+<{CnI}H z@AV54_vF;A(&+5_1JSvA}~s4jbila?~~BKK!$O zjg`UoTIL>+fJCmWNjzvG)#3cYJAQLbm#hwJU6K%fP4=Q1eI=nsmT@YAIK^{2*>`IM zuNOp~#bMsh%o=-)CDbGrES2>y%MfeZw3z9j{h!!l;rPS5d;X|p`Tv6JI612~&$X5; zU1!El%9Y7L;hK4YMX<|4@%^Y~l(mt+-EvLO-j=G9Nti_mdwD6>v?uDg{Unv~ByKeb zattHIx7tcUZEhY@&1{wMRB;WK2-I`SSxqwQq*-kQ*TA$9kpNK9#1Ao(1>C>94g|%W zPYLtcE#DNMcS2n32M6 z3yB|<>`7AcX{><$GE*f>MNkg;tc7=8q+qJ{Txt_X2RO+jztBOGEj}QtHR4#2s~{(q zp31bb)wcI_S9Fal0HM675?N;a;e&RtDWE;kcfs!qk)5|a@5Lu2?GYG1Gz>PbZBBsUFK9 z26uBL+^xP(X;ny;x&|lht^rs%FnmEWgC!<>8XPi9sS*wjo9^-y2~UJUsNl|GW=?*e zM`i92Y8Diu$5W$Cw#314baCFlDqf0-ZV0Va~_;orMx9 zi7o(@40WdBN1SS4D?~41A`wX$FGLwyROO`nPnjAB*@VjPIRM5C8X3N6G~%Ttxn z7Smw^t7gVI+m9yw7FLpijP#xcZ1wUKbq3;~*MtG0UM`otC5I6|lTe646W)yxS7c~}%X zXUZ(VJu^Yr6xw+9xy&iBIgu)W)6jHN8U~1w$Rfb$8J9A}B;;sT`Gr~disOFVJ4aHX zge+8WD-9NA82d4q%la7XenS`~nE9!qxVk68`Ov>Mkev#))Q@>1FV+z|Ww)~zZ88*( zXmX|}R}5q0umYy`5rzi++V z)Vy@CXQh(xZ&BsYd{cDSnXK`?hMcJt#m_v^l=YRf{0G*oB;>EW#^QP@HC8Q%pJi<} z&VCb3-kisO_=y%H6OD8%JgEuIjT^*T{Mm49P^yqDR9-P(;pJeKEQ$0%*CG*9ovOeG zgt!@=zIv|ZBwetQf^Gq47iqxGw^aDv?++0_B#M`&npc3r8qfkJoZhK=T_f4XVNuoz zW!5YjXqQBNBmulw-T@M08;X~kL^iUf#dV3((cx&Fia-s10 z+bbg2sb3T^RD6$iDDGk#W2}NUajjhpZgovcb2hxF4THv{B!WDvE6$i380s@DzWk3# z7&~{of#rUp4;gf+=(}Nov@rAPvs}mS)%m_q-y$T;Too<*WRwQlZ*(lGhBI2}NiR`Yasa>H|VF zywr|NBajEQMjK(fU)R!u<@N(TePwl+Gk2NHEK{#*c6?dX;e|$rQ=Y8aGho_GV`{xW zf?G~h9SWqKrKMFUMWq|O1D6Z8belQoFpz?U@9Eb7;2I2pYhnz&4^T4S$3OVBCcYVE z#q{rbU_^|qo8ErVZqkffsImvH*?^j@T zzIFWh!J1v>j+MGBA)xP#zLnZe3sNa>N1Q%6ZKmN={$ z1!?J#ULYCag@KX4kXTgTp`iL@S`m|-3ZGKlVy0oVE14krEG~ISTTO_%c+n-_0!D?6 z`6tvZGin=4wfRnf^Z&48V$k1^R)gwn_=En2S*=aCxE3W#B)%;)j|NI9s;BKMl`7S@ zX73VjDn*Xaq`#CtFpjF~$$a#NDAsDsl0IT83qlKM3Y(pyg^3pgh=MdG#@QTyi~i`N zu~5E`w^V9&?RM77L(}-|$LYI8MDe_=dM^q}PLi`)`^j0;WXDS4GA#gcP!Xd|8L&2N zWR8aH(zQFLynTXdUacI&SHM;6!ZmMIz`(hmy^2}ZT2n^xLR-d7r3?MC^e(?E?xG}0 zlZpeZ^7E>TQM@q9ygVm%R!%>DJ%crCY8e_Vesb!01OGLTSBa~q2;UlDidER;1KxP( zQ8A%k7F{T&3!_2N7$7DJ6VAGLP?H)mpyLj%GSG1KoKIqWis7=!dW0#9NTuZRD@yda zY;nHSx3Qwl%n?@2N|JCKl2l2|opmq}RTacf50q^A$?>n_ZW(s&Si@P;ZvX7k+f73x z3n>lGOikdGu^U;NHwa29ao|GkZl>D5#B+fC3Fiu!0N~n_N18z|2^5tg*i6v}7_+Y| z*-x==b`cI_cE+nwekj;%M1PQD)7zHxXboNHY0OH?H?pnrkx8(sFu#LyObcDWLrY~xc?$$(2LT7^eq zTqWL%hzOm_3r{AQac!)rp%ZePzu9=L*c*}fwPBo0-Q0U6lm3%L|*hJFPo!7L1zLBpqJ{lp3B5r__tT9kf; zU>?<*uZbh$PvAx_V>52IOnmONp9Y(nhuF5d2#!CMFu7EU4m4@sGOp=gUM=oaSa%Z0 zps(k`MHqD{s4zu$nV0gFv8Ao zB4seIS=qVG4PPKW5B;_kOE$PRzLsA~YedY3koy!3gx#=`>v~h`fwCt8SXL&aI3yRt z(&@GQZP*A5l4QL+4TK+qcNVAb=(grG5k!|4rVV>vv8}|5^Us`A`KaAGoNBC^^M6g3 z)u$w#Nwn)9vJu)7vQTbdzKJ&THfyk+KECMAAd;uiiWN<49#m(4a7s-DiMB2>?mzYF z`%!d4npG_ITt{aS+a#nK}&8>0`Mw}&mb1*sILz3G2 z2~pJeTGN;2+AS2mOhhA$!>@oQG{BIAgQWN{s3LVq4LY|P%z-KR#9$zzCt8Gj(iN$T zl*h*d1QF6hAVy5NYv9kNzzJ`rkS>VkqB5cOPc2bHnx8UAA|R)UNt3JJf>49}GSKH@ z=L#YBcO|7$WGtgj5KAg0S6mg79PV*XfvNd}LZ*{)Y^V9F$OwVmP*k$gEfn)R`%m~U z_I`a&t(+?6z4TwjJ3taz^B!r=af?>htFA9&lTjAKK4ttH9S2nN#(fEOWgFD(iF8d< zLNRB#*y&3A47osZrlyM}IA3cbVO zbJ`#7#*4gABVbaB{vD{bcz2NruBH;PmuKDa{dXN`&_sh0C^XY*lwjB< zf1;MxH9vS<5~xmME2Zwe+u4flIP6nB4+pSsC9JRjWr8|1Oe+nUNFkBaA0YWnA?=)U z>kT-bUawz3b*bBx{SAHd~#fS)1zt$X;N*H=iR|T0rs-p6*t>lF_2C)T@P? zu-#J>kc{74C*OyxoCfH2E;UQ%9au|XiX7x-k}e%oZ!*7PKGk6VG2t>Q5riy7aI`bb z=R2*~g674>cTKrM6^|8Mnz1%70s0?24Mqd`vBsWowx|@Mv7igqHN&5vC{VTEZvb-! ztf5&!8VG=R2+H}*&S^|R>zqh9vBOb|DcxMI)j>Bl$ql3-!K(Q9m{$db!r!D z2E$O`g}7h1lJ+&daX=PF5!Y6STRFxwq-JkrTS>PlhQ9$z$2lE3CED%2`))BPnw+(6 zJdVsg*cR@O$ZW-HiP@fKx^4$US4UvL)FeH8vdiIkx-^+RfIWZFR5SBNm!ou;mp1fO z|J@qR-N&OW!jr@ih(jLlqt zYMAZaRxm}pbRKdw^<@}2!Y>jw8L9kj8PnE)xb5|3nt`)bl-KQ=nX}Z>e>nz8uP&E% zKi#6q$N+7;A#loQR+kx`GbNR{tZ@zckgoYkJVcvte`LNH>0A8JclhS%tnqu&*IM8P* zCe4?G#n`(;MyTKbc!0IX77=O{k8WU<;^z7gw?$p=Gh0@}aPg)VKGAq5E;5>&X7qSu zUiJ;(nH2n?_{*e#<8wy|)V@u5QV@6#3hr|$zHNQLD^_t_1tPk4)Qi2?%kX?TCJQd% zo)=Xq)Okhl@bnNnN%V;X2nXAnbq|SX2`)6#Ssh?FGx0Hlz}Ye`1>Mte(mcMnV(`7` zUrAzqSkTe}1yCurMfD^4it4Dyah>xCA59b7irb%_dPCv}w8a(b#*-^fIPlI5G+emeHICZk88y%p; zAh7SfiBSUzz)vYq)$E#7OkhvkNHx8J{~HP3d@4sa%Te?=B={TCPr{E2c!QDHYpR6m zZ%HjJcNA|fct>+1vb90+2sz@XJk6+1J8N4zDu2JZfrVNhpDA@cXrw{wB0b`~BvIh# zOO!9A622hR5YxPcapsg1ANdCX5@FB`;+%TGB zCnQfsl)deb@&Ih2lPFUZmM)YV$kFL{OX8lg_=6uZrp#!^AI2!|PdD4b5`vurj;1CP zQsT-?i$QSiQmy_htXb)>@xLNvKBb}vUZkG5I}kjd!MkBhN|}|!Y3H{6&(}>y0ud>5+Jj&MMub;$m_<#y zm}xVYOT(VB>C2Sw%V#P^g*trr>1pUgm$7W~`)`ijF!Z)p*keWV2kPIe3+^p~4cCr; z4eo7u?B&xOh-E5f42X&9E^kgi^_vBT#(>I_=t;EK+J8XXjfiEK8t#!CLgc3!x2L^s zr+sBu#dVKFZ@@q82i;3+(WD}AX!RRzTF~@wxbZ)UJ+cJ~>mRM}0VxBj0x2QY4RiOD zFp$G4naR4?LOf=0233bl!?Fk7RhGpPQmsjrJQ8#UBNGI069^@epa2^H2qqCrgh_zG zB;v6NneHT#@rg%E=rnY3loTyzl_se@g41;Lx!vJ zj4?kfWEyEzvYKl)I=q+0D47fv3e;AaI@hhh2zV{%9>@Mqk_S>fZ0}%WaOSuI6P*!k z21%1)Ht5ofV@S#t()$0D&CqJwSOQI@&SxD^k{;_(ZWzkz)BRx^IHT1aF_`Jqp zKt-QINkdqz1H>g1ohE9$lst>yg4%t;ow{f)XLhR4yqq@Ol_S}G<|}pgRl1~Qmq53k z-{V|6%$9XSaB^I zm+ER!9;`H~bl5!&B>0?(DR**06jV%W;*P7g9tS-LupdUvl_X>8O2YF?1!*3Kj|e@o zyjU4?CvG=C`Z;2lws0=S2R4u#TE|Q>F1!kdN=dtBVv;lWXo1)o;^1m^`(WGpY_DO0 zjb3jLOPw%fe$9}KVqnNwH`No(x;fUBXEj3zT!VgVu21}6z&9j_T|GdL=)TR>>VQI+yeh|)B4K|xwc{XD zz7K5sm?-StD=`vob?QGCtUFxWSa;Pcx z${yq3K}jh}PkJwQOIfaqua>)qgynt6oRZA3I!2}V{t;nWriEKX`-Bl>Js_oRo%*-9 zq5LUbHT{77{=9dKsEJVHsKRA#)=s<%pTwCz7oN;m8p^^@1<%b4nqzEPQ2ba&axN`e zKpIsm$J}~W-MW7d|2mUWe>UyZYmCw66r=B1{yp*_mh7xdxy4Pgm)6jstnu5ABExgH z;AGB94fE}~`=V;+$Xq`XlXYM!;l#+n&SFfW+vVOZyo`)pQ!mBKJ4 z(r^mg|AI2Mu@38*g8{n2`V$>U_>+u55rcsGI{&b^jH2TGc;InY!9VZmt;GE`d zauxSD#2!yGtj{2RSKow-W4uTjj?vZ&LpNt%Ek}Ban|I%swXN%lO&d4FGJliTmVc~GodqyH!+wlD3Wrj+a&NxHPP|$pFoMtx19X_$xG{ zv@UB)UaMFh^%Eo&4lU3#ElUpb|7?>8cuTojEkY<) z-m`9J5V1~2oJJ-aC`V-aa38v7hsjHz52VM%ue~D*2oCS9u{8#k@_DbcU!7gIGN~1Y zJ~pG)gP4areNspnEDS9Hu9j%wD&A+o6c6=9=F-&m=%i!=q!2iaKtLV(CO4`Jz8jF9 zv93-Yt;k76=n3epgBQG7)Z#=u$6Whk&}b|=G5Lg>P#bxb=B zTUz{mtJ!@^X|RPmwVctG5*p&O%}4&F?x)gHbh&oAqr}8i!!OXSmg{c!Xl&`FI*a)o zwArVK^R_U7_8$4OEMjkxR`56qTs0-J-k$;2KKKH!aIqn&})(r;}EwYovhl4^acP&d4WaI@|px0!3W*2=S~ zY*1yXbhP-5v%0517lL<=4pYDWbN%Rsbq7|Xq-rqFzJCr4hlP);`gVoKPe#$@@0|T@ zp*<@sD(0J#SE|}$bykmp#Gg4|8xIDnnio?F#?y1fPR$E`t}DZX(SZqF z;d16;+=_T7P7=}$3$St(8wLR)4cO|Lhhx-SDz55D4zI5n{_}$v>J>6rVWC@x7UW7= zFPp#qld7Q}ChOG=uO5>cG@_n6jO|6lmkckIR%ef~O7(ym)Lc zu()`mVdP7fO-Mv$p86&eGT#8U1nODfG~D6mv-A_9mkR9)^mdRpfn6*?p2udAnafVU z(Sj(h#Ei{Iean%$fNb<6Z1(E&TP1EvwONDRqVXPu-sifK z>0j1!xv<^zV8c5q6|-+ttz%pGz+2PWVLhIa>sCf^MJbBA30dbd@bC+x#$+7{xfb)H z^#OU%7n%nG;O8#wz9?$_>PT8_^XQQpzsTkg+#BhYtqs56`M3BaJu?{w6=~d9M_V> zZLpsMnDjY}WE(P|bZ$8f;_jg+<;znP>7R5wTD6UrX zuQ$n-5R}S6OLkPqmbbEav|9TjyUZ(FAb9L@_zMCEcCri;R@ zd}k>#F{95FE*en}zOg67py4GA)Psh&?>m*yUcQ8glpH0tFq(IJS z20`_mu2N4zcF#KGsV%OC8i{h{FKWzTz7Gd*Pq|tD*M3-i|G||MYr04=xNJbSDXD&f zNncalXt_fb=-N1|efDXuM$r(fEVvQ9dT#qa9S5e$rCA#{$kKU6y_KdAU31h^SPOg9 ze;p7@SMGQk>Dd>^6*uYY{5n!LKTrBbfUHYKt;-!7K)*KzVzK6QFA>VHtl zvCU_#V{Z9M1lXOS7a`dfjM) zI5`|Hs?@^A4W8+)F51`q z08@_D<0oHM8^fPJ;{z*uU+xEcwkNTtzo6s6HGaEotNUyK&8Pd&3Ie4G@fq+}@5 zI>f@OZH#(LR%#!8f)=f^8jIJVIa3V%t)4T%#w#=B{Y(35*-uDJYYXxuzI|9-o?5AF z94{Vyoi85WI;3)noUgNwe^x9YJ|5 zejPfE5>6}V_vMER$FrcG$v8u9_$uM`MuQ`S0ri(OE(I59z&*cjAM>QMi2DTxIkREwJs ziu%g61t}KzvR>INl`5kmjn+_!R%xV5Vm)e=Jr9gt5iD9VzlIX1yBlSG=V-3!X%zEr z&()^1`{(=sD8j1XQ<@%o!pBWaY<|uMh3LMqM^%~P@)yon>MnQat@?`%ZnR3LZc)uT z@dCr`PdAdl63FgF=anes8Rwf+Q2=BKUG{pB8&M`T(i(Sr)|gLHYeNJ-#R<-?Ij=aK zaKpr)MHO9u3()NAAYoWNX<6~x#O0&f>rXhY5CLangiLZzBpxLj0SDMW>W&Y4{<`8i3MxFpbeMo#Mv^s?-kmC4UA@0;vKcICR}GP;`@s({J(t$1i|LCNtl z?i>7o4_Gu6c+aC#OH^;K!Gf63qz~Asnbl#%|Eis8nUtv%QdF!0S$+B88zt6#mnhGS zjVL3>Yk*5=U+_oi*mfu8odcyrvxm_hl~V5zjB@;1zKi*wspPvv?VWS=x6U1zRdT)SPF9vX{z4g_qD) z<%$AYow}hw-drx<1Fa*AYdy@GjdeugxJS9zL*k4g#0D2oWawB!Zv4(SCh26+5hVZW$VdbcbWINg_tr8}GcL*ElYJ$R&UgAan|hS;fx zjSF1xv_ooWxVYHNpvw>v99HOzJrVqFvBbq2W8-H}Ul_S|K6dkTGJbY}el{e?#tOQ- zHDhIIqA5|vEs5X3pMivZ#Pz+r3@KL(y`xR>?x6Nqc*e3(YZN8)zYPYwHE=d1#Up%D zi(T$JW$lTdv6@?xSe?hH!BDBDu`P=#2AV8FXGfNrD>|XjADk;+c+oO>=4QE-7SUW8 z5Jd;!=T7nN85IagQ~asllyKkK0EQ;0at!Q+JiW|l6AQYyTYjKyo) zJ8J-r%ggy3!<~rK>9f&T4=eXC07a7?3`e$Yi? zBNRuh^7jl0ms9vALPBIG2(SJ^FtTu-vAY>+`hQqU#+G~!IcA@r8@3GvK6uj`Ix*kdsG~HQTD0o zFK&GIO_aa4f88IR$ZV15_4w{c#YIyuNMox}XKz3oYg;( zf$Vx$NDopO1ec?#8zL3aT>;j03(AW126vOVHE7}U4a=~y==Yo3AXFlD!s(~;@aoHL zz?|mx`>xxBN#dGRccoCRMegW(URV3JrGwNKQOnA<I7RoiVX=6LDI(sffmwb)r-&Md3hrPZx+I6^n3-jo%nhJQQO%7spktL^Ox?8~lX zUO(%Kt?_QsJQo{jt#zn2-W?b$j2tg4hk>GGGgNKieNS`XDR>j4N588*; z<-m3`T3D%3IWA$bZbqFl1B`hk!p2BS8QR!$rN!&Y=M0_tN*M2tX4sclC?p%NMGwDn{_8U~uky8V&uPX z3|Kxp7Y$SCvpB|h;}vj6hP%*ap9NH6jK)P~kB%`Py-RGiCJ-1lGcUHjqY^g9LlJ)E zDqXcQWhW83v)T%JFKdZVgLWN_X$uCY?D{4_!7c8Hwrbj(aV;dPnll&`qEl zwmyK27;FiPzAq13=Wq#}F668_8*|eF>SI^X}4!TKGI+ zx#nx$!)8qQE^{tIUZut;Qp-b*A5zB1!8(6n3JN2Q3j-*I;zN()OnWo~4u6suZIj{V zgrg{1bh?PB8W`}%UVv!7gK)n;(|RfxH7z9bswE!ZDY6}Nzksb}#b2hx@L-4y?z1qp zyUhPXp1!Ji>MB0=QD{YI2S%W&)}4-e?ehrxQUCm$cUL|fh@QtqlNGr;!FPyp*H}8S zRwdd^bDhc~CZWlsN}rca{mLriaO@t+lOVQKrHv5Hl`B)5<%W8Mm?x5k^&8wZ$HL|9 z32*$aSUHRyBUn=FdG8kOiK2bMzZcPO4aEPhjZ-KY&+ywBeYdUc2ZwaJ+{kn6mEL;N zs&=`}blerXw!-hP?T@BO&rvxKa8-#-amTWoQnsL0XjMUG=no)!=DeoQ5o zrn3w(WxgRKD~ewNH;3H4Gdg@rcK392_4RggImuLq1lO!-%HcP-_eV(gaSSAI)7C9K z!W6z0V<5}~8`ILU5N;`crg9^6khlcyHG6hyQ_t0+M*u@>m+15(RGUE>`~8}iUpfyC z&eBdE43G-q;8t7wOwW$4P9ZCp_=5bs((;^6&QPzdPn3|&0fY1!bqVS#>V|bir z@oD-O>qcp`YNO(Fc2XNP<4DA1=6FUSYkBNMp4@oib=VU@)VH2Q&P4=iH%6J|%28p0 zW5ordCI1)to!_1v3X=_zs#*36^>lsK)EqJAztxMsQvxd|C{Etrp2Z_%yz5G4kli05 zcqF*D)xN@VRt7XGQf{@yMdiK1%*ekC&vEATxhhGXZ{3|t8^_2=lg?`u5lQ+S51N@^ zd_Tkxl%~5$`5OikV z+6PT*!px^Q<|mp0|@tG?!|-V?V4`1<8XF}G9!=}t+3%Kk!nn4*;3@GUsb9}OuoI+Qz=+;Tz`$K zXXG3bVLoeRejQTD7R*9!oOkVXaWA|KCp_BR?wT28XY9>vK9a0!*rH78?z5j}S8Xj03Uhs$;_4=jt2_)cUxtlhG36#I{x z4J}^;8N8-hX(7MZ#ZrOvmqMI`-BLwNGM!+?2%))N7Q?ktk~vGjsm9S+;spzIjX!q% z?P)3cdceaM%NKLc8l@K5_Jv*!9CcjG+h0=sgpm8jytSrm+)8f9XW#2;bTj_uR+J2A zP8v+@YMSZ$nLdAU!)1yAl7sJEzuD_-t(96vP0=!HvOf69LJ9meyL#ubryTS`*IE2+)R$x5OsJ5yK|(Bot|t#mtXgsB7(U|mREVboz<=B+*onRNffpk zvRp2YE(YSN*o&&ZI%`Kx63-kt%)&=Pa_x0%_WyS|B&gm-JaeEAKf5%1pQEUJ?wCk2 z9B#kXDwtF^aANKCW^|Osr)ew+u`=*i4p8D4jj~~Zo(cPla! zusiACmvt}AYCp@>&(UI(tZ3hkfx|W5jSQq94+ea(s8BBDzA0%_6vbX*ZBnI_D?a{7 zv5>?34l?d~Vyeg2IB+yOn3j~Mla>CmTIwcGCTkY|vf4`H`2TD$Qu7GAUZ<(gp|UdZ zegtwupj0^;yY5T7T9St5WlG(}htZPR>%os|Q*Dkm_e=>du2X4?zCEg#p%_&#@+kTs zB)=O2OKQ$h+)0CiZcYFq0RCqPK4q{;oe14xW)f`E{3om?vKU8KqkP~n$&}-238J*e z65c8%GiV1XG+He4T8bK$PDg(ovPzNUxHOJ$uY)21N~zbusi5u-twFnh6BlH0k!TH! z7SkAFimarW7PRh^@jAIwzM>eYiBbm zEc`+E-h*MUG31wd)o~g~J1z(!5Qh&&Sgw3VvXL>Tt1{|h_3ehJo!-7MlK;o1IR$-E zz5>ycn^K$or-Dh(@-SS`@Y-q|q)2H&@A*EV`q3SNEj}Q@nJpbKV2#Hn{<|d{Iwe~D_V}&a(axwcpeG)FzjSq zqmPcu7D?h-!?FOiuAEqlJe5;EOa=wJ**K_r97ExXYLc236lJw(=-(W=P4Fm5amIxd zdvUIb#t8do#<$QKM|mzNShUZ2kst%uT5KplW>fjM=M16=0csD4$TGRtW5Q***?$@rl`^CnTAEv z%z@?!eg2XP&h5MZ_25X6wff$~K_`z^YdICzuW?G{{akxaAyL|UOC4h|q1mCpMzFRD z+5yZ9pOYt@XxNnE*5HhX zf_S*;qD5IkzEe6Wi2?M}oQD#P#6|I6qW_7{2t7-_alObg4t^-5TF#ujT8UDd^v|}OE0LIB zEN-VqZtIGhxU<+TE|jK|t*Jdvg3rG>;6b*>-qr@2`t#v2_|(O24(w<|_sDH8 z&)bU4B$Nl9nN$R>MG72XX=xzfpp=G9HbBsfWAr(VDTKB~PWQaoym~$gPZp!77@Rsn z5!hYJYz2CUp=AGEH=)mhja`*B7h|U_>|??hWnLzQ8K`n4s9@V94l$_3B``=GCqgD2 zY2ND-&n0^;#bPBS{En=qzFhMVyv@-@?}ZdrkUS&7A=go|;pK(A7@CFto8sU9p`7L7 z60Ptad0$kPv%>UyIEjjzrKt>vm*+;M&oGbmqjHgol1+0-sQR3`zKnfUlDQdPsudDk zdtw29YY=#1AOia_K}P+@u|F05b*ehImkevp8Vx0s#}s=s<#!?+COgsy*WOPo0zjCz z(caj-ZyL~uip5JO@|~^WDrl2$tlD02ZT~PMXT&wG!Bn$(Ea!t{qIwFwem@k|jds>; zZ*1)L3*Q$Y%&9pVqo5!=jvB)g#1?_rKw%>c_T>LmI1V1a04mpIUJ0bXV&>K|WVK^$J!fyv}xIPPL@MWxSC(ua< zP8PFT4(-1MZqpTfLMEf{sk%w<&QlR7ylrnPXu1}tTz;6!`ahZCQ9)Iy&T-Zar(yGf z%0E}6V<(CG%h?4mmj28@D%+xG#QrxkJQ8g-=~z9@(k*dEj*OLiQc?j@H74xb$AJye z&>~O^p}Z&qZUu!pUA7vL)JA!q??1Y9V`D?ymgN|cnljPfqRMZS|4Egrz~w8oI(Qrh zuEo`@;v5b}c?K~`xJgR-o9#dH9&V(jZ44P5WMh#d8%P)*!A?xV$`hIP<0%&-I6`{q zb>UG+@JZR`A5vs=pj#b^ZVUPwvCf%IBzpmg$`p`vN3If_T$$UYLnJ271MiYhg(3-v zS|9r)dvw#T`$cj-^kUmXK^FtpDRX!Qo;F5t;5_q%a)Q#TsCit08!4VOvxv*snBOkX!Rl zAjB4yl$_dCu7TNnd|q(&D)aoViJxbiQ`MIz!RWf4uqs+EYAgEB5uNQE49D+sFj@ zFTnO6T>C%Yqa;Pa4Q~UoUYg)}u&wY=m1QEq-uo`jvsa_roti9)T3EGh)55yZ(;42N zDUN>lIfdNR9EwQQBXQif;N9Oz&PT6}9r)Gu_U;n?lb+Cr&1pmm?!<7k^#SR?W+G_= zdsifX)=Bd?<2{(VnZ8b~*lc!~u+U+4apzqEs&8skpF;-VnGs2fQ=Iq1@;i4%qnS1) z48M231jJ7ydi2hnNfQ4Ip9DnSDrz(~MmEYBxKopRWHyd%7>kva z*~rNJMV-quMg0<3*@Dgpbl0HfAOPFDsI2N{+3mjQBMzX4?%*?0&&M?P{OhCwp z8JZpn43s=UHo{PtL#4{8R1PY}0?XVErQE~$SgIFsj0;vO^(vJL=|^F*HLFU-06%_| zJVEY5QfMTGr;_>55E4B2+l{)&{t11}B}%>W-Y+rSZiq6N3oJ0~mfrdU-#^%beN9J4E)%8i3)w_FrBK!cwwv$W zW8>Mhc5ZV`&AWHaT)Q^B0AHD%2R^Z~GMBK;+%0sKmHj-a+uWuqc{2i)D4|lLqp4Ik z%d7H+3`i7b-}PF9VMSEJ?jP*J{iS|(bkl!}s+wZ&?6hm^5;S!>f48)WkIQw*|3rnA z|Fasik*hB$P1Ki`B>8zKeku=(`X^aee6KzMqW2;c+~y${Gzv%ooWWuvYYY-DbOahC z5ST$_gVW|D4bLFC0N~~1rT+N*+=l&oMPcN{GmF-e!$f<#m*(c<<;%JyK9cUNE0%3~ z^vuQa{!6>FvL=EwZ`lHYA}9m+A53l8a3DnpNt0cBwC3hx5eg@V=$&`h&_iyqzc~+VOEj zNDf5~;v1s~7Gf(g1O{0MQH^+Tn>DjM`}1ktu1%ZFh}n5u-L(Au&sfYE<~*ZSE@sT1v0e4`2Z&0k&I=64am=5rot$6M z;4>rG2v?ylG%tXacuP*OUy9APPUkDdUF#MWjwdLYQUWpjaqH*tV(K#%(RSyK42>{1)k(DQ$VPWmfjDjc@Q+EIEdfWS4@4 z{Ot`JsuXZ%!(DfDYOsJjK_0RO2tqMfLv8JLTx-B$LM62Zqf_1QHgv*@DsXF5|0BeR zJnGNSx24ma^oOv4TO(6GkZ-ZlTnblOV}w()EG;B$nZ_AWFeqWwaqYr(eStYXM>VKi zM)=h&#V;<}4yHs7s{GDbgR)%9eUg&Hmj_<>CFGY2fy=`?RdZa{h-#Z3ALnBn4wQGO z{W`T%txlE`t0hjWL}EoptrFBJ0X>N!066WPBnCO{LuirDiV_52g;P6=u_U0B7=pm* zX3j7tVOqqVr8E%RQavrfTE<6e024(z zQ7zG$&xq|%nwABr0qhnl>DLS z>wNMeM(y;We9my|opQZ?<&$kmR#F)>qAn9T>ESqzZU-lshreWo+?}K#xyz4}zUn9r zae{7FcYmeSn)H$1^}3=&;u~FwNz2anzG=1QaSm2NjzsW2xT7GRyyuQsSdD@3D0 zB`yOM->bu^UlOg5Pf;Izrd$y%ff{+l21-Md!Jwk6d`wLZ6vZ<|ln0H*8jOcRT51Kq z%rB^IK>%t57vc>DEnRED9#xTElsy^>tO=o+;ERYT^aztNy{+mk*6W>wgoB=1c1V$$ zU?a#8y%sv4HI@r-LVm5$uSxB6>}0ZC*tL$B1T-2u9YtNWnry6Bd^%VVp+Z-!CL8Mw zfXW<;r5-Q?c%4QmQQDw=ZTM01Wla0~?RL237-H>a_qJ-iIZ;E;J_=7VA^RKQ07s9X zXQgfjE$1dFeAALb0LxeXqq856Ll9~Hs85y(Y% zL0)gYL{%XP31D9Tf&!cE;lm=5aZe$ERCEru?Pm-~2EuK&)Y9PtlHsKpgz#qlOL+Sg z3}SIlxHzZToA4uwg3p^CO$rZPIQnY>$H__f^}> z?--x7ICS^2qVxBUXSicV&JG%gJRRX;SK{Ev(}1V0nCKD%Wy`s9Hjd3~!`U`3flHgi zx81pOO&s99BVF+TcvoAOL{q8LrctR>spW2Hhh;cd&N}M$C7{vV(oDKlFbT~{yCpFN zeD~F^uyo#u6Q@t-p6=hUL9g%kZhG2oA5bpZVoDv%U*W%^^59qujd`9<`IY2GnZm}e zzc_}p_T2_yKvJCelW#v$?urkVN?p)Fdm*4Qtei?ksZ<}h(C*2ng3m&&Z09*EJR>9g zu4m}m>B;5gWPKx9KT%JXMjShO>g^W)gx`P5+f#nBnR~8K%9J}a;{lGv(n^j1AbX&Q z`T&$voDj;PD^8KzTrYku`Ee9C*V}O5=s5MCt6Z7;oy>NHt-kr6r@q;y04tvS336@c z?>lVbH4Sb$b%v1-5-bHX&~M^0_Q^wYf`U8}1Ze^TtS~apoC4P4UPSTV$>-#_xx`)6 zq;A(QL+xMGxxsGHh!#IKfx15g^R|r4{~>d^0dM@DX<(UUXQ!8-ft-Wtz{A1IG|67c zsyQpOu{+2U6ko~&xnmnQMA<+wtAe;c2j9gl1atT^tSyxGuVaQV^VP9mIP4zlV9z$)7L=r&o=Cab@p zP`L-yl}4ZH--}~%V1iGy-kZYHFaPv&lnT)q+**w%Ddis(f4>Mhc-wMJrjJxRi$Tr<%uMc242lm4A>9oVL7}C z63+|{TJ>|U^at#U0W74?!fQxLl_!8)K8keWnd*BVnbKDWd(_d8I>?~r409Bt3Qm10 zXi+%*81SRO#<3X;uQ~?uID%52nvyJ$KlKP(ZQUBGiGM4}qhFMS8Ybt5iBmfbhGO_L zTJzk4T3J=J6b(*w75}mi^Z3X_V&m&sv)Yn$YHYxN zIM(BpM52!}_CYUCP1$WU?wke{;^+2Kg=QfHL@vcAZNVM>75$t7C&qqm^*llaQQ*K*LMi$TDvRhDWu@&wsciN!eBWVQo? zt#o~b`21s{%n9(2qP;=k2>^a{P&_*N@o#s3&?hTI8A9siUx_Nr5Gj(w9z@)```hE_ zXth`=FY`f0KFt|q-|vnh{1G04y6?9K`2#=vrtDR&Lm@7h4-^@=dvn*@vJceT2bn9| z7YM6`J-+&c1if$1j>|i)yxyPk4dP^}sVZo%b;^txw{S!stptmu#%-BC9lYJ>%^qbi zM%m$fyT-33^y67de__#qLl3Q?HFZ7@zMnaHC6gT z58)(wkELWRhK>dT9c%lzC?T++`2`CL^3}+L$MlHj0Z)(3o^~K_LWj=ah><)wmFhZ} z9v9U?aoOZh-(>0}r$7}sRsv{;2z`V(A}8YZY^V)VKrSL7yQwLgKy<-*;^(=420DnpSt%v*p zp{&T!CaBErY9w&&Ad8*Gsa+O}h@~G59A*81tBS0Gt)ZLA3xwC zd)zbc{5y{+%3I(4AAG#+`t`Qs!T*1EOF6~k-T8Svj}?E{x8L^c3%b}q{LVbUDjy?z zu047$YBEHKp<}!gy;%T1K)}DXXGjOdXMWWM)t_+}p5BzUdIRe~FLSh^lENuE)l_N@ z_S&#IZPRI?`73G(gW!*cv){{I|&N{$U=2muLD4cG$40vi8 zbMtl#>U-{%won!+A7FTn7h%SF;s)2g4bu5td&&2r)*uP@G} z%Nzj8`|@GyDqe%H1@}_Y0J}(VE?eqAP}~y^8wP055Lp|V9jlOo7tqktp;$Jdx0+t$ zWynh97KYJ^sq7X+1i!PEvXciM z8<^8>-AWU?M){ORj&;TA*v5Lx0|P_O_MbdS zWNbZQh}uN`_5zOt1^{anqn+$Ab{~qJqkq6~9d{!xBgo)Lk&$14N}LivoH8?Q9GgoF zoI#Wo6-wmV>DU#+W0M;jR`!6=g38Rq9+}69^|x90j8IDB8}mL^DqJ@$Az>9QEm3GR z3Xca2#v^1vVk9!|QlHM%XtZfbDI-(}l19l1qW;mzKGGj2?+FeaS;QHX=tv#L*si_gQcg)KRjY!!}z-gvW*94^mY8@W( zW;qM&3Ci+I4hRnzy;+TCHo?sfjf)k-n~qf;49&~XcWB(^lvyR0mE zvyny1AtL}rvrsF`>UtSu`deL<`rgmZ>IQAGw>5Z$T9+*68uI+iN;vJ8#r~FL8<}Xe z63I5OW*eArWc)6(7=y8ZeTQ=2=j!R^_I0QGD+c;I*125G_T#7C1-yMCfBW5?&1pW# zZ3BbD0~P%Pb-QDWz|PJS9O}&{lFFIru8Y*M!Mzl`QmVwiq<$1Ky-xO_CW`9_xghx` zG$o=*axdQIz75N3pdrDzCOhWK*62><#S8wM3 zry?FfF%$|OKr?;c){4|OCG7~l0aJgd$Y;7%Y)VW(6l(a7HbiHy8-kHl3(74_0ItR5DP ze<4@MwG_uuaC^$6WR;G46J4j#E$caP0UC9Zjsf%rv!PRx^m+ZgncJ&RA_GmCUN+J1 ztNG-qqv!9XV>p8jYoE2Z*Ks;}{mnoilgp4^%kI?F-6-mgdNY=MY!kX>&U6X8b8={j z*mJpNsW}&D$vPNCqZi~(-ivUCIVhG=1aT(H$|g9~w`%HNEE0Jo97m{SWkI!o(06qd zbukR+pDF;ZioSiPd1ZXXTkJ_m{S=-*6ngS&4}5DadiU^5^ZF$m$&6;19*_^ zXn4SCP=g*I=im0NT}@3kj?JF_v-HZTIiae^0i1gWd7-RTSFSsR-S#p1x zo=oC=6rKD>Iw$A5a=7aLZp_^Ls1;PUR&h3U1z|xUX7~Lna9x--kUw$E=8`jgtpSlX zpsNSX^__N0qPp9~Y;F~4sI-B=6klg)z%mMg4gC0Fpj z*(QvD*=TImZ^4F#ZC@~7q;pk|uC`XUlz<=V>CHMAI+ITQE-?69GjyVeD1HZ#4DO`f z4DeqJD4};Hs-=<)3Pmi##`p%6JCGAda`YQ7E>_W*$EcTNh@xe*Ur2yALZ_Oxq?fLY zr22vw_567Q4_mu0#V5>J_s09Py2g+s=Ug>P^X|>0UdR+5_Sa%2{u4X zeEWRKNu+JesmwKQNfvQZS!G&kI-f*yDD@qHt1-ZserRwlnjVGV?UlSi;-`NPWAycQ zQ%XieFuR9sQ{#if)Ty6L_-b}P{P(oOG)~r`ou^{I#wbAOo;Z&n`gcFn64g+hR3!QQ z+0)&-4pI|qKc1rnc*GqA$26>QDogfTo!(ZOl4L8!XseR*W44eE*8Q^fZ$YTr;Nq9_ z<*jnRxqkCrt{rq!6XqVV{#tjCv?V4vZ>Dg<-yip{^1mh%%3;E$bQ_N6bNUs7i}RhJ*6fLnZwo6k-dKE_ZsB zbyr6oDPTA{8iobkE$>P+Ke9>`>3fhuVtxAj7{rP^aYT!_5OK#bm@!=`7^@GEVBzpA z90z04rLjxSrE(jn$ZmzkAnn(~hywR1;1f=P!1{iv#-P}ZP#d;d0BnIefmf~`UmSbH$;ze2b@bW`*E4frOD@2)1RlOddrY~EPGgg&bR=mY>Q(WEMKUS@ zS_HWuL}(TQl}6UnzoV#VQ|Ji&T#XTAWY*WB_69Wo|KQyD6neFB?hVf_FI}TYPL+8N zVI#P#W#IPx*vGdJ^>Pv~WDGs_K1l|ubp=rL>ouBw`30e}$XO>eC5W0x3ChlGCaAZF zIlK!K53{5XB|A4NDY?tms{CjBtJW^dr6@104jt5X+0Hg3y{GF^t`%$hj56e9M?D<} z5ear3OL3<|l7T?lb-mhm)81*rn6sE=IoBsqIg``pACu_o?)9n;H=|zVJsHHC0{>q2h<{lUa)r zgVNiQtg>WTzV6U1U7=5sq&#u_NMb!vx8n!vG|Aee#6LD9?E;X-3v-RXXLHZy6?BSC zXCEmf0Y!i_K6f~-^-kbnd0^avhL+Zj72Vw#+}iSmtF_P&2e-OJAr|WwzHU$p>47z7 zduMR&OZ1^Zp*iw>8F8Y5Xj3*R=LLJCvx(R2PBzSgR8Mc(M*&t1O$UvLO9V#_55FD$ zs<-yPJ2O~ALvFjbRsjP!A{=cErK^b6t!uEp-aRaLKcidy1Hkt$!Pi* z*$1csT3utEbbic5wBB$`7vB@F8#@rjqh|Ne=fyUT?c_<#W;1317no*N0V?TC)vl)y z8-5_Kl*~K#b6~)iISk&g8+$DLS)O!G-yCV))Ixn@Y)edw`rU!rv6BN2!-~3E+ii=r z8*mZ(4hDZ@&=|%P8e&f*KOq;ZSD`V;kI9;;z=-&jAdnC%qKDvFlhI^_A$N9Ic&A#u zGHL>OS-P}vqM;rKo(OBVObUER_!Z{p`M7<}n$8?!P|lgKSSI8XlapFwZ||@Dc*Xn$ z21C78158)3cAjC1&I>s>CR2b74+a!XNI8hv(T zrxSu9(NYx7t<=e_@d3(&4BYbU^ys!s{Ai0)tE0D^OuxLG|8QHdyjdccb%%AF$NfzTti(-JD!!5O;i)5m^l#e7f)o`Zass?vyR@Af zjLn2bLbGw7Xe}Za{jkIDOXM?5^po((YuPIi-ji6D#ho#>Bu(zetB>|b`>G$bb$6c^ zi>!4rv%cYvZPxH)ZQ1ck+UMPfE%?|LsLbsac1zoYZ56QW{6rr`X-Y4(a$312S^05o z>vk4ZCDJwj40G!WJI6lR%x)^L2&swFv^s>nb%l-LB-J1a6szAnV@0bs2!YB&Gb`E# z3e0M%K?YhAxLBvvHaF)`T`}x^*QEIH)peVXa4JkJch%O~{lsCX2r7=Zqp807U{c)m zju0eaB(KTs7go+maUHgkh#BshO$x$2t}E+E_kd?NGZhpwmR##^i4~2wM;W9%Ebyoi zh!OruE)Zwtex-kedOKANbkv&FT^HeP1bkLwV-}uZ!+TRGM{;uFCbQDxnG1#vExf}D z+}gFc3JT?Ry~AcM$||B3WervxUq~OPFFd}F5fE>Xo({p-+_MsPpQjC*hX?RV9K$I6 zK^Af>xV1GO=Ua+f-rA~E+O;-#qH0}DrOKvN+H4%4w(V%`zlJ0S|MW32?nGStidO-d z{sCt%>A5LzXfkrGzatxPBjb7Dc2NTLh-o9SAn6m#B_%XI(JKi`6a}}N@8c9{BK`tr zn}dz2xxJ(#VRvdmN0IWFk)*c}RMtCxesgnzZ1H-0go}aPPfx`wO}%AxFDtzSF`lc0 zJMW1zYRoLXXXXoar&75%F3&W1uF%Ue+mP(GTcPD)hXZzKneuzTuOwCyrn!;3SiBYg z<}DJC>+2mar*U}|hd?BuGQ@#bw~x~uEZSWYm6iZQlF4&jf6p?WE4pdKp(HtL7 zj$^*^Ah!=%Zk-9r{&7wv=3^c;^IX7|RQ*cuwJan{>B+-`*_(8MsTzhp78WbeL| zb~H}$L?or@hh-U=i{Wg7ba!_+A>t4{IpUhsUO&&eSby_|Ef_+IE8(G;GQ);gmUdsh zN>pv2>fRJ-bBk2@V%b>32H8v~0rrio6((VieqV9EFnCX=Np{4=?8wP!aquH80ZeeQ zw%ovCccI2ir_s3O;l>P~7H?^@H;5F~HHm>rnf;Fo$T1{A!0{;4AwQl*?nK8_sTu{- zh_56DkOhc&7TYW!1(5|`nrG9-AaV$?63;R!LIhej9P{0S*uGd4KM$wFWLY8<1c<1j z0Oz7(e#Zj*C;&QnwAYwwfS@K%kX^~x9f+5IvtI3;OLRJkWLrsz&CjiFfa?KVPfuT` z<;a;-OLV@G@F=gbtg)DH8%~xvB8z??ULVb*tlaQy&%xkcW8J6$=}Gai6gT;u28W65 zjim%oVwL5RNx(oc{~5M8^g07?{9(FnumJQ#TL_{7ie!^2-B8-W>`Bv#5;{2 zTc$DV7U>s0NZ|nwk5OJjckeT}WX5$)JmNx)5~CGsLm;lAh0&rA$>VEn%~4Nxu0#1J zo2vAu(gA^izINc+V+j(qy$@YVi;jDvSbua6eG?Z=lLoP9lKTmH7SfoiH8qMF-I>%n z!tCsgogc~Kvrx&g?xHEnS5w78@iRQj;~C=ghLOjMe?ymKmIcf;EQ86B(epH>BgaG= zGjn4in2-iX#pknP6WhNReh?`jZ#W^fXv~nck*! zy4$C$@bFw+u-?Ry^klq^05Xg(RWGCTo->wz+ngZXwXQjmigmjZq|M(hpW&%j)i6$+V8Ad6w@>C<{1QWJ{E_@)BMpdMW296t-}rmA>PhU^k*t@#W}hS#cm&#a)Ac zGnBpSc4|W}^fK;&al_)s!nQH@jiInSrg%DqqamtXi`1HKO7Zjp)oRYQsrqhkS4c0? zOeyviPM5l+3D~T3ftz%?(D%tN3&D&(;&X03tVHL=pW5dB%OxfnIp>GB9XZZ7o;mS< zY&{h}7p;7_MlvUoiC+38(y1n+P2l}O0^vr+9fiL`j-Fe0sNy3g~ zM3vZHQLkY|ZvtpNQ|UIF7gHAY>62aAu!)@mVtBLNDy`nt?kJO8yqNhb-Kvq49B+M7 zJElS&ST~X}lhbm14LO@De1(1d&3ao&aNwYu`|_4>V=uyng=+P&z$i1^*tX1P=PZHg zIB|Y*yHC4&!NgnlbB6nwsx$rxEz8~g1+#d2O|t|$eU{BVxaG%)dDleNAxe(Zr)6U+ z8|fXGv5~W32KdZDp(XOe@VQI>Y1lJ+C~)5Cb+M#B)i& z^eHy>5XW3M-)=drqj}mB72%1qZ6606}yq$h?QKQeFCzKBFp-=a^>Ftk3uOCnzS;Q994w8P7OTgN!EmT09|DG208NTZzcnoK(dr`=>Q5XJcp1>e-jKY9Mofj?r*c`Y zHleOgqqTQ-fL?i(%Z;3!!Bi%T)0)%Y% zdmo>saL<2d1m5wu48Hqb?_6uo*G4wsoBPd@az482*`y>$Z4H#QkPBK%iLx=1bY*sL zeO~w+G~887K17urbJ%%+5mdrFa%hQj)ae|4hJ4klsTsSb_8qjfkO- z7#(}e&>P_LaqV$I281$bg;Crp)a#{|R=ITjH_?sag^LW&CkYy3V8<`K|Fv=+ooDy| zJpS;&7KNFGRrpvTFE2Pzt>jpo0$f67WRQXvgUyJ|%5(}<@MHaFxj@0g7G^6L1)Fma zFcP+aTDTvK0t#;(VO|e+(OrF&+hmhtq4I(; z-dehj+222_EI?QdVCv}FT;mVXA^y+puu0?=-PW!H2VU-fY4G9E<)*#Hu9Ezn$O>e` zVc(G!q@cCjJ~_uc--f-ExDlHg4&UEdgO0I-_~#{=W94b4TVt?bV(sl+zw?fSJUMIH z`$EW5(#E8X4*^${82MY4R5R)s)l0C4Iay8}6?=;Pk$tLK{ew{bwKpEmTI@aK4HD1a zGgG{4Bwq8RKAV&~yt7z1f;Uh$>=i_G(WaVAQ~bRXG%|llGXseGtJcgfSEppBGu~G` z2^`(P35pKW7|k&OTnaUqIxgb31Q~|b{U%PGVa}{Di$;z$vU0ans+M0#wI8-BV<8&ApQYJ2oSr_GyJ?po?$}}c%#Ed|4}*;}@=}1Q zBwDYIMb&v)=E{Dr&9rG zmsE$fV2heo7f`JG;c{F#oQLZW3v^QrElpZ1#1VIL$^<4`(CRE$z+p`?pmZoT8U-1S zmDqjp&q+q2A0mvnju`BfR;oDwlp53V_|z0sk(#QCUjE9wvWliUpo<8KJ~&d9ma5`M zJq@GHc&qk8c{yFKf2AZWh;!(yf!FF7L;{0>--#&7)7TK0|SOF`oViCPpHI}Hi6BcRA(O?pi3cL9DGK8 zsbT>Gww6Pu0XUolBBSOr2hh{8=_}_Pc>42Yne@+l*%36B)Mdh=%8<~PS@!V8Rc0dj~{-?~3ZmHfW+Arkl^WH`-u`-Y;+`LKRl-0PaZO!9A

    lhH)u6B?^Q#WL_jGbX`mI&@n+1aIpVRBl)Z@3U?yVy^@sE-B z+w-s9hOa-<^kx1WSpqr1+vWp0^IVWOBj3-gPsVqvqPD@Yo?id5IeO~&j>??%XYbxU zyFRCK$GD!#VgKvp83%9kd-apJxmnyc;y)s8PC10jq8w9&-@#>f#N%AeM0WcZ$pn3^uX+}^e?()Tu?lTbSEjcI4R)|bZCt#D3m`2%=&ywh8@ER4Zf3;by z`5I!R&omdM<62#qDOVyD zGoSYZ?QoQm8SF0K5OrJ4a`!7gN@;1}<3kQp_;V!(F@%qN`kFV~xq9kT zDzCiR_Te+O*|`95%BdM-l@AFT?MeBSjM7$k;D5X*j@Jk)Y&}0P+v7ISC zKxQz4#1iK)BSBIWtosvRgR4EU}Cp?na)aY1>ST(ktMp*TJsNU~&!a zB)y2Tktdq$ICjPL$Q3{OeIpIXnpCznpJ{bTr2qrT7$Us`igQ4OS8MZFbBl6PmUEFi z^ZI2Yc@!?<$F7tw?NWA-FsXeod3N}@fMj`)ee}mbu#u&JOL6AC+_XV_iz7yYjSwb2 zUiQ37iG6~>CRdE7)A4{5yz{`Gi=qc2zpslApPf9o_r@<%$i&+^)h#EH`UPgpUiE;$ zqX6B_8GzkGSL?8=WrBIi?+5XIz6lAwegQJ(o932lEv^YnO16Ey*>ho0Ej^E0gd8$= zC`TZGi_Oi8>&(+(ft%ZAVTj!L3?65|P|e_=F0HmIAt900nr?LK4YYe^1}i~~k+}GrT&uZXJU2rUmRhQX3PN@H4q3@c7hg=X0EX zNO$xPd3>GP_iSqWs*9Iv)Qv~T@9Bh_tzrei$OIHkq3^9pJWlU=fWW9H%K}IFWyyQV zKO!4`eP@yvuH(N9!$;1?86ry4N5m4Fks1{>+)oDs+1WwD&&bzg<$ z;PG-;zzblxbPrA4=&*QDp0qrELCw7}rMO7I^585m-9S~JO^)>tIrQDmrufC^G z54h-y^Q(P7jyAf7?s|8*7DX3}uXw(`#dOy|=(FvSpc0U7n%0xBD$3b5wf+G-66zdL zI}dziT4E;_y7GXbPHBlcq;tXa?8{J&)v81%$*+$0b#h6dS3}%T2CdIaRN+t`8o>w9 z5>ZC15<~?W9q=S>SlfoOAA+TLY)G+uu-kFr`BZ8(Yp>U7gG;eIRqN(;Sz_iHs()42 zyckQ@yhi~oc>+3>t}G{Y59UnNkSy1Dx&Uy%!i{X;InoF%_+}E>NH=$73@Y(7Qz^qt zBKxl-x+zWH1@<6arw;KPWtsw33gfuNqUrF=?iOEgDQDj$p+A^E`^F5al>T5<&FTcX zx`VjyDF-8Wq@jCXejn}z{`$Vvdg^}in9_|igZ7prA?Y~RC3}OaOlcQFVKi$KZ~E;^ zG7kk=;UT+pdpd7Z7L0~o0Asr#SOR;&_4>qxH!$a1@6S)|N!venWtw*$F3zV%JiXcH z^VoAL!t51J3>J^af|vahj>gS*ok)*Zzxt2N^sypOP%QD8l~f6}60B`mBV5CEbKB>} za|yyi>7^Ho5iS4>B>xe;k5BS}{l3(UC3tIa9whlf)j~PR1E1r2Jlk{LWzU%Ei{7s; zD<(t>N;^yj^#}LA>pAhMk&MHNjj>b=W{$WZmN^H5p~i}hSRA?WlZF6w_H{@*eEPIz zb5tY}88tlGzGCx8k+YrKt#55kZ%l7))pzIa%-=b;+uUT2(ZtxB%-w+A>yV3nBkv-< z-qCb(vo343`%B465;uKoR+0S2}WVXDv&F+9c3B} zOrVrZT1~01{!FKTuHHK!oDORwWw&L4`HNn6%2P-M`sgOpIJZf0p4Yg;gG@|6X)Q_r zdiVPBl$1mtbUlxuVvsvOk$7FRnLr!qcoqK7T^vstv20IQxEBd06QlA2=f|}-8QNRSQp zWyFP4ghF{wJ@9g4)XnvP--guS~r%?$S4h;-ZIy3 z1{_H8Zv472Jnx_KX!o;pCX<)d*3|$0{DMQZesLAAUilYNCCv>eSfAT^nx{k-8VXwi zw`Q|kEb7iU>he52NEd)zl;*OXSB0;gv+48}9ZhRU#(d4(yv6GqOi4j2?Y!Cw`kct0 zpFW_LgVM+LhK`H0i?qpq<*KEPDtF^LFBt(=2B!+tgK_AFhJ&@m329!mtVPf&p7=0Mi_@G+P z(N{k(GFu=|P>}Bc8@1Fx)wvz=3qa$!jGmyeLvkbagL=ybnifA1Wj`MWQ@W zfs-g6LNto$Oa+UWe8^h$thtVpAWm9BP(*AA?U*!ZvX+02&bA>@PtxHEeg2GqrzYHl8G zZYeHqT}Cv&pL)KXHAiKBOaI)|+)7#wKgb!x$8W^OFLl`uW=H8CPMwmQb8fN82xHKH z^ii`PWb4M{{`(gv=r}?=_Vkh^(>3~;^SrWgvACqbj1UhFWzgiFVzVU&`)5RX;jq!T zY_FBNnVRVr-S0<|c_Ww(mb$viTtH9AGwndsb?R+i-TWMmE(r!8RvSvCzMxW7|B|v5 zqiJDb>&l=Ki7a&!0~7&7b648z&gT@tO7z^b1k1*9!2VuYK|X(1-^CSh3r#~r%gjpiPgw5O$?-%}o|1^k z@V{rY)obk&bF5&KtGT)9FLk1|1SEpw%2FMO1HYH{pG8&#j$MH~>Q^S}fH*#$xaCd; zdvHC_v$7B^*{JuE#^(Yn=y$n?s`1rI zJ}(Q?1{!s2DSdM@${SNDQZfYFBK5dSTaNU15@#6$_KhXocsoH(u;aU*1K`7sefxIj ztgge*R+V#EFAjTbWaC5~pi*<>&GJ!^y^u%pxEv1Gatio3++ujzFDE-I>*7UbUF3^U!I_bD z%uSmr2r=Rgn%)2m?MNn&hRniGZqm^WgH^$=;R&P z%mGF_ownYeA@&^LPSTO;{TU)C`KR)&TiTce7w6R1H#g@U=M=+9jZ`X19iquCUFUzr zOFba%kb(jskcyxfnwiR8T)4rR65{WFjEUy|_&tS8&Li#zTOS}p%xARx9PY}bjSQn` zC)viB=F0P~^$k9M-qrfH#Z}hHlox;tbKgkCT)6!dmE?(6YZ(93yoWtqTJ*|FTLUGb z7De*oU7J8@u+5m!-@luKy1+FO= zJVukS=dXD9KSl%EtL-(-oMy*vK7*i04#B%QHJOWOy)YCx1KOv!LA<~9;-vUo4kEIf zgS$X)Hs-X!xYo!d)y|5)gt-yV648nNo$Pm%xxJtfhd{U3d&g1VDKiB|V2W7+#wwp? z!`+b|{g*bl?goT!f3v6%ibNqeymVm?=V2KBQ#M40;e5u^3ATb>O&X&TrU^=!H6?Rw z-JVtaj{$}$Ex8+}HZ8E-rFB=uY&n&FiQB99s+D;GKhf!}vGcvzedUgB$2bo3G^}Q` zB$O~J3~-u2;E@pYJha_Zk$&@W4wC=;MJ~A7@AfB#+M_-=D_-L|&F6QfYt+TQi<5`} zDfShn5kmu~fq5#`r*sEq=3vUqCCrU$R-bH2F0+Y$yMKRkrmv=*b%xbmp3G)(C4V4I zN}m}>%U5Ao7!dg9-VkP+1|@O^JQbc4RS~vMAdf$>*vF08KD(XiQJS`BI}`Hv6HLJq zq3#$^gpQ&e4f2kl(w3PP#gh!d6wr}JmGX>+VuX+jU=RxvMFdrcLOasDGzk%Kxtd)r zz-knAM+nen`_hwU>Bn-w|B=_h;b`rbiaGuMTiJg}`m4^T%C5gZJs?usj{$Zr=@I@D zSHsbK=vXb|0Vjd01=sgt(l=&gq*Z=B5v>PhS-2mjd+i?_W~5_Cy10!K+qO-`WtCty z1WrWhF+OeJ;OofBo~&5qn_8l!z-VF&76)lYuL3L%azQZ?LDtp~EICPxcP|d>RX{Fa z(MZDo&i@k-Tkr9ImXdkn#;)a&m(I+au?=gN9iYb%iNasnO+%3Yi1Bgs1Iw_cMIna2 z&)H0OHSLUk_0cuX62Od)NNiiXbDWZ^j40zfi>WhbG9l)$`p}h?4+Ls!gGPgD{iZ?l zc(#fRB{!nhh(B6lCaq?Z9+g@3CJbUj-R$bHw$T8#kx;lvBm*_4+Tmm;cd)7Vg(rqv zCpt#_6GH2OdQv)HBQ6kK1boV!fd31K#}ity2?{ytD-AhID>90M>ibA-WSi^Jz!PV; z-cVa(97P$lGm*zu@BT~+FI*q6X6nnMCL(0o1%s*Qr`*$gptmsnOHtrh?pUDc%js?! zLlJ^;-q1WF0g>uHeR@7cXHDI`-pE?l2JVN-VLZFyra~)Y<4ENZ5%=~ z!H?n=dQ5UG)Q#dNsggAft00gI^R}Jhcd1CY@ zpA)^|IEpFNgpB-Js1#ftPEfgdCADLO!dToiQjY>9@_y%jK}As#Jehm}zjdoI_};bM z{4~r<$m~s>Hu}B$WQB_CYr|&!X}$iM?MzNi+9!B8cTATvkOOQtnXP(*e{S7a#jx27 zYBSI?7%vh4Mo6YrKNj8I5;6VpHPy7Jd_&;KV!D(*S@W*3$T>+NYnt@EGcL^G)4kQ{ zO7QIlKQbDY;YE&Bgg$Y`0dw^VpCP62)uF3ffQZ58MSQn-vXsIsI z!*Ad6oxi!vERO@rt|{|vxlFUp%&f5GOUGbi!jxUzF@7b2m(645njhZMmmrCjI;}Xt zJ9DDAw4H8D?9j|E5gi_iNPg`9q3VtAk+TVN$+Z}4LCpYyc z)4R3&$+WxfB_tx8%j+k*6b*8xJeg={VnFSdWJRqEr=DE1qvB|>8U?XQud>r3&BW`@ znx!}!@YfWW8b{Yq_)q*FN=DxiLB!(B#YpK>@FA%oh5|#QAu8mKX0-nKr!`b9K}K@7 zy=rU3ume|@h(^VXSB&5a%vSsf*yH$>1Bis^XSJaPQ~OqIbf| zv=e*W8Y;zRacaDdoBaFtch1bZ5?3j#TED@gwCGt;J#EAKNY5)Q4iTKueRnmS8W`&R zM669n9ve$+ou?;0#LbX|?!kA9cH?`{CD3LfbJLUVbTxd;-El4K{m!oF0?6Muz@QNV zqcd%gSpGAC@`UrmUOTa4LM6=vN|q-dkATpY+~I$XplIFysr@+->xM~~b|G#%q6?`uJYhpu%Xs?#|+>Fg9y zFdOb{IdnZY!G4zoCfglF!?5()4sXfe>#|h)1-N}-fMD8+?N5~I*<^NfT~Q&ph7$Xt z*n~B=jgNlqoU^-fU+rL!V?QUiu_JU89i0r`cqW>)n&tsQzH06|1qi#dv0gTl*+Z&i z)7zk$4dWP2Ovq-_;cX)dEM&JgZ1{55Jb!J7!uFh3UBSTI$IDA>&KUElGo+xxr)H>(0S*E;Osvc;xM&71=WfU>2N5}hJxyf zkX$v|hdSwY5XXlb1Sj@x3o|apFCO3Bw3UB92hPrd=6L3wkIc%3=Y%BMZhn_r@f;u# zMXjy)1+>L8S}k+&#z=gQj0Dl5N}*_no?2bVT75Arg;vK-i>)EB zqrys~Inl>$e%3LsNFt_9-kcP0qgtH_6FbgmzuypF_Grwp!^HY5j3m(;t6(}Ry59ei57yhY~8hS<>IcwiaSZdHA6iQfo-^=Qjpy*Qxn#I(hyf-eM4!9s! zqphvSjt=B}Owi=$hIM*PLQO>f=4O40N3dPzJURca*JXp|G!Ks@r{tKKW<98_1-UtV zWApHW26A+uLTo8aZ^N2#3Y;F-7E;Q@6sE^}mUj)MuVl}v>}wBwgsj)!3>NrHS@2-1 zBy0G;f6MdpZJY^?tvnUiSvgK-nwcCtFe9&tfph|RXrk9KGi3Mc!-t8$&>sc~ritI) z_v`h{oE+$lUYD8K)df=0j_f!i2;NskbMF-aMYA{kIi@^IZt$HDY%MdgMs(STiSeBK zD<4VnOvd=nG%0-%T}t~*1@a`17_|j%H((TVzibvdIa#<>*>6^la%ACzWJPa4i#RgD6ms6Hsq`#LY(${nnGhu?Nvq zd_xrB10B)>jdDdKclWEwFandSnT4Sz?*inK!AJ#Ps%35@-HDpi+DXLp2AT{sY7?~z z7o3#RKGhCy3&_c+oU$>R8{?r{ke7jv_j>DQNx7DY8hMI#a$}1Jui|_l6fQl@m1_oAEuGq?anBuRvzF=kqT{qS}FKeE^ zrEAR=d4Y$_t(7Y(0|Tkc60VrQwbAKwyDa{?CA-IT^oW9)>uJCsCJ!8pJ}njznuTq) zxIG)I3@Zy~>@fr@e7;A0=M81;jt=yZN4WEW;z0hr7rBV_8vhr|ZhCeg%85M?$+d}# zb&}THCpj|~0W8bo!ockT}wsmS}=J|wX`D@c;v z$F6LNdujQ8mVMuPlZt46oWo(LVi9SYCM~~)WvF?4?Mv0=9e-H?HcPeswd1nSmyaIT z2#>5`33X}n+V-abm5@02!_K*z?gFC!I4Bf11z(;N%H6nf58^6%7Uz^P#PyXN(KAZm z-n`^kC-mF7APFmN&h^S@D6;oBe+~wRiSy1W2COy#*~1oR<`q^v6=_AwWv3xKcezd^ zy78Iy?O{<>GAl5-XajfV%MC@x9F&?wZf0(51f~!Jc)GQZ*O&R@Rc5VXckm4f7a<5W z%%5*n6{{zs1ZV3(;`WO`jS1(0DnMF5O5b8dqp2mbfVpV~b7fHBl} z*4FY#5Q!g2tbT?*1BD>BrbyuuhZx=FS1>$6jv#ZAyx>>n?)|=JW+Nk6jpXj0cm7C+GcnpBuex>^f6j} zh0=HbMyxx8jwz<~>xfu{)WT?skBF;>+8QNkvqBm1e{zO7hd;H=N*w^$zy=OU86Rc| zzh*An;5IiRiTd%f@;Pzp+(gD9LPQz<8L<^Qw^mgSO|kIl`b@>6oQH5Tg&JQi&Zf~w>*KoS+1as1ebCIqp8(( zy2UkCX>V--y9I!A@Qnm2nd}>xfVHISj^fGh7(sq%enk!(fk`>X4M^HgWl)yBT|?+? zQ6{w0B0Y&l;;e#aByD?wva*+()vi*t8<;AuvE9@@q@|aj*{*5}z3mzO4bB}sIfzW) zonUzT{f~*Q#b9LE_@3hpI9%iL?)c+h4KvBh8Z<}!AmY|!q&JhRNwI8dmMNWWuEa!F z+vVDRNbn5*vnMG@tEX-pc*puGvf)sn@u7Ks7pT*RB8d6@V&;A6fwu?PL6-@p)bvR5 zg)U2uOiecx7k_8CDZF_$SgFkDTW&Wkyhk2wgWu;Kj}jOW$7$4kZ*T-9E&!j*d9#m7 zJ05omM-{K^W461UdM~&-Ud-_Q=ou$SjQ5CaoYoQCIrV~%gM?C=5pD~OlH=VBqqR-q zDpg{dN(+kSE3X*2tUP#78Fr;+-njtw5kv=RR432cEQeqK1~l8A8 zS-kq7^AgFw&|@=VEV75lQ5{RYF0%UYQu1v*EC$5@lb==Cy1G!=BClExWB<^EX{0YC zSAAZ3P82Ur7mUbqiMorXxkRqQLZ-+-W6=#FR*{alw~AJ^huADL>`tEd4x#s!BzG*S zv*p7*-}CpW!_;5!>t-gTW<(sjC1M+p5c-w4^^^6J|D}VnzJ6TPH-w~ouRa)gLePZi z?4sQEVgP8ILS_zEp2Hv&=g8!O$-ws*ttK?o8%sbis_Y>DGypw&4@3Ek`7khi76llG z#oRz%Y4)1X(vz6&vZ4}40E7)UJt6ivzKRFC&9|_0X<*-fe&UV}MS-GOS5M9&L$dY| zu~$e7N6w6{MVbIAiK`efa09}1Fsk%l-_pR+Lf>uNW2QO2_KjG)_M{mDI1PxRhIm~fM>b%>i3t3PhT)%9CtU5_@xJB0830FOmF5oR@7 zva!{-%@C4Sr{f*l#oXhUiR+_gFn~F+gA;$vk2Ah>n8*M}K)An-MDQO!9!AfiVrZ+N zOkd58NMmUZ&Eu%=oa4o#1&+2KECkfaUbCdqBo^Qy=@s&+2R;kn(49W zs7x_uqd3{oO>>&;nG+3in6z=}IE~4v8L);nfW%)l`0AB;VNsh-u0HwdP&xQBmdg&Q z0)$%8mgI_lPam=cwHoq)MGB+w?8#bB$KnYsp}xt@ z;QT>uh7Wz5h4%?$&8j}+^K7{cT2kng4Vx?{l8|~jE5yqiMHYrJA-(*Zye4*6-jUeA zW(*dK@srslMkOurKaMgPCmVdYzIT&fN6PpewB${&glp;?WET!i8g)uUaXHFDL#f z;7>Z@nl=0nN~<%!xd7#>@e^tD@S9DngSz$gyjgwN+fMT4O&gP4H|dyWI-lUGx_UA< z#@2f*shTu9FN4#h9j93Mg4cEA3~;VmaX3@$8tz$+gmad=rrI&H@jZ1qt!ORh49D>5 zs~?skPcc%3&Z2y`ZuzgAWFOGE0Izdj*D018On@+pjV=k$T9O(F7LxoKX`4sH(-HAv2 zPsy)-_AmaAoe&Ue&^aZAFh>|Bnx;xiip%r)W7^T!qgfiiLme_gxq^>#q@t&ipRqgB zJls>le66G+iRmMIU>~KA1lq`8NBCFVsb(czIZX3g_P{L{=-j}E6GJr`g>1m74qqSN zz^W-krqF0Y6JdVP(G41(_&-fW+{`4R>@Dt(pB276tNi0;q|S)*Uv&i(pMT`uN|tKR zqGizH))Ht^TJP|Jg|ofGhe4ukHqASc%9lv1=m)n*V(Ii{>PR%{Gh>8F zRO92Pq3_;>azJN0;huD=S@g7wEZpO%ToS-9K2nchvE--}*AO*5O+l`VD`|)d8^;Rf zM9vnTdQzFM@)v0%{^?nq&C-Wzf{o-5U3^pO)tiq@SZamHX^FF;b@-7!4b+er z{M%zo$OJpV9m>v9p0+hU1SRbUhP1JCGT({!y{;FkH`W`euV}ygF(K4 zs-dUMstySZC&ln;{>pVhW{5I%Y{SBc*iU3wpJ1kmK77cB>TmZ5 zdzj3%%}mIE((^~rl3FY&^SB*_y2d9o*t&gm4^$nQBOpH`3+7ClrXg$AN#yqE z8V~mU*-W}=0ml(P@i)YsLdlYG8kwWowj$9MwFH&Wn+FBq_O(k!^eLRL6p4dp6pVEN z;4S05+nxO`ZQ*sM0X4Mwr1?c4lKxS|1CqS5*-$O(#k&B^4WL@#JS z`KWb@9tOdK$NCJKK#6wsT|~BXjF9h8KVZ(O24<~safvz12fbB|oW}6K+h&H;AT%ir zc`jo_0b`RE$JDH>s>!{sFm>d(d20Vub7Nz_XTOei1BOzzK8f?GkX@EU6gZMn5fkd8c_+gB{g;Dkm`2EOihclM5Xc~_6V{gzCZ^3V+z$x=80 z%Ttx&GB4SDnb1lioFFBSgcYc!FF#WN6kp2tw+0X$3b`Pj#nJ@1A|k6>VpF$}ojJfBw>VyEgB@5kW{42FLWmA`n67NkPuSp*2$+lPIbH3R5@9 z3SL^FpwaRC@vjAr1{19>Wd)m1dpm1AtDT6DoYp0mt_E!9HUFh0Rws#uD|eRv0o1q; z1vh!AAa?cNzx6WND4RK$<5qKHpqT3%U}mM{C14oHtl*{ z(9w(;wI>{RdM%5{x^_)pHRpZI1i4jpEMQIMdc9R%Kj+RlbEY26F?`+3<@)*@5jMAl z`X+IS+Z2AN+k$VcE?Tw|YCTb4vyp#`N@EW6_(mno<$_TsI&uSXR-q)ZH7^)Jvf^dY zb+U_^RSmC6|6la*|4FYKR%IPkohd%+yyeAD=|8;y&&u6@?t_PpxlXhmtD5OT5#70d zH8(%#@`malX3EroxP;2OUp5~}omJQ}zolsUq=zE8l(6{bIOIL|(CV>n<=pw-rMU+1 z;+JN2gJ#Tq!~u@?xoa}ebS*)E*0<7Kkmg3TttfU0t+}CDB$kW80PDc%5v-blU$Tdb zBXG2e2i^Pj<*_Y!FH1kL_}qvrYpHi~V#y9uArEJ+Ran6eIshhG;Na}H(7S7{@z|bd z9GyOt4m(D~3QD<=c7Nxkv$6K#89|Mo;LJs{hiYv-K7{rY^Nhf+HfZC;T0cRWoc5DV zt%i>q80!TpQ4a~BzM&-g+x$`b=7~aKzYO&AJ6MHEXkPA2Iw;M_@nn&d4nM3}A4b~d z7hH4dg2cF3CCT^OMherLv3^PiiRGCC?4lN95efFfsT6F_;p58%%a0%Kkt)N(krK&b zi8(hX`5nm3CFkUV_o-%c?($}2GssOM>&?J8MVD)yid!h{0eLxOv#c>Sr$)(INvTAu z+jrGy&$P>hs}2bL0H#-h2J-<8Lg~g0ZNfH3NQEB%O-%F=Buq>!l#*OP%lEcB_orlf zQ7%1vFgml_DF5mw89B5&9Opxc&nrvLNlyLkX6%m691N%D7SWTwe<{xdj-DbFJmwJ zDuqNkhRSU!2rEgO7u!@q=ch`rkjf@UkC8|zUs;HKe{v|myfXlcJ=K+C!5Y^rISEK% zgrp{KK_n|u)sZnt)qCMEq%67H4zS&v6@q}B0p_8r;D_ACvHAIRdID>@nWkq?F3pl# z9|O_anwsI$V>+77wrQh^rW-pweB*|S4*a;O(&bsWfB(Q)=4|HKfkR$6as#nhkK9Ko z=iD*ng{Lm5eoj#V)X7AiwJ>Ki$L%IEyG=B*a)&@}Fra>19|-XG_zYifU5an%dYyOa z#&imH_Zi!@LMA26jUs;Rty_foq{VM|LOL_gWbztTHyvJgw}XGIKql1{xDuST5tot@ z5s_K?*1jYe`cO#jgA{KEC`Hin*KY@eG`}IaX2v9Z@G}@@GG8S%S{d);hH->Sb>k$L z$!Kv&85PdEY05PlA=7^5jFyx)r&D!J5@kdGm{WQ%k>_r1UF~Ch(WHZKRt21|j_777v*g?oW#^5{Ic+iSu$LaJC*lBXK^Z1nubdBPUkh4%5y#Ca6k`Jf_U|{x>}D zzrEvR@k0ZpF=df&7hL`-JN~C5mv6fZ$t5qvJA!|&aqOA5R*$U_o?oNKuAR4h>+iuk zBKD^?%gg&LdpBGzIL7$1Y;}kitom}iSdIOK$s8Zl~_;8rr0 zwczJ1bG0%aUoSggI2r$awt!1t#g1RFn)ct{!_kDt{8<@Nox7gG;Av%ZxBR>yABYTI z5HxFs%5?w3Iz>fiD)jvi5*N7R9evm%OcR!?jVcVz6*hHJGJ|zMN2eW{ zEEXMIchF=b5zV~s^o8N!u~0Q9pbSZ%MA?P&=Xygf)blQ~%bB2U0vwOxCX08+TP5-? zrxQ+##ZBG`e@Fna(%ftX8(T7_c3Cnf)gmx0ibVEkZ#QT_f@d_CkFcalQ*uvpT*2OBC9>YRcyJs;Tqg& za92?nPj$-A`E3&FSd?Y-2^5?u=BZ`Bp9`~Ce%`r5tKG3vFZgWd+C~$xUmLf{qfXQk zASPNY0i~t;qYp9s_R=MCO-u|MhZ`H$zT#rDIibdiGnq6OUC3kX+}Ypn5-~-texvEJ zjt4}lp5~nlzCn@6PsByr{#yBZfipqI)OpTIU@>+JJSs6&WS*t(Q2^*>m5PhL=UhDE zMot7N3bEDgDHn9JO%ss42i<6TkZL}V?Di`w?>vn*fJ-)Y-ZsMY+B{cG8tC5_q?thx zInYF3=MA?!m}ty&vi?|1()KNGWX>(Zx4Uxk6Ovz|Ti;s6+VVVKbDr|=@Z_OKTuTc# z4;-!onJ&bdx#a<9`7N0Xs*;mZQ)U7rO#2HY5`|U%v0hmJvGOXW*2ER$C9H^b6U>Sr zx7dxj2?bByuB%S4-*DcL2umyE1TyIU9j#IZayo|u5#InstrCn9(EltQHXpCnkKwv~w^ z5~A2|fkejaVd6R7{Vqzkh7#5G6nHxjsM9Q=GVb_55z|)?D!HGh0G)^?yqe zadYUHDMYQbxa^82B{bzymMS=c9wAKH=ehp1n2I4{*#sO6XOfrh2_s2mKZ&y&8?zab zsgO=8tz}n7lZlWEB0)Nx*_>aq5NWVN0BMI=I2s;L#9^mkad<3d8izo|A+=0NjfqIc zc@3)|G8Su=;3&;wIwAwoxpZ&w9UtX#m?ot)Gcqh*e}h6)Pvr{vr@3xT6fX+x#%{|x zcuQ8c7>~Tq?!X&seuT{*+~M2qx2CQFg6(ztD8@?wpXYOv*@?Shan=E$_THz3z}Mdc zI_%SV%=ePh=RDElj-35|B+8r}kA4*J?E`;#YBq2m%ZJ(gjVze8kj{ zjDEygT*8m9{qA@2RJNX9=fqjK1!d8*455ur>=5KlGS`Lw&V(TQlSV_RmR=s?*ydfT zA>`o6Ns|)+*Zn8Jm;edw|M&e8Ot8Q=$rIW8T3Yt86Xlf#q`hQS#R@-OA)&3LfVY<2 zsnU|droGF)ZoC3~WEr}8Up}%h1=g}eBx+_=)$s;qV`lt6p8dEeW}tFucNVT9;n}mW zIk>EDsT}or$0oDi=_!ZV;(I|o&BuCULd8CyiXE~eOU_kek&HK^N#r^##ncS!z>gtX zmqI=R=17X^B;KEPoFh$Jy~v`T8KWzoc5X-5aB9gl)H^Si>2cqlIs7P&XE)?8OcE~T zglx`Me`vEehj5lA3G){k?3;4~_ZQ*V9t?)5C<{YHIU-sWSZt#fV0NblKs-7R;`KiV z-l;~DTs?D#8F$bi0Iog$_ULby$)LMg$UVs~&pM<(VrZf!?{5uFPfvon`bd&CdOOT% zqWLvMy7s@eUQ9ke;^Oup6m*&1c7x{AQF=Vjq$ku7&g4HaFT56=jK*hhZxLGuArc5$Qw<8rb6o zx31G^D#9NYH@57R>14+zoruk7j*aPJ?#5yrp$eij;?^&LM}l6XkqQ_~4j%M>pL{s-G^lJ@MHMcfP_bPr+FSt`uHg@N$xw3DuT)<2L- zot@=4Q7HnL$y*?iQ>VuMlcA!ed-nI)JMH%+eM%=XZ>FE8V*z=G87O*yJ!2M13piV)0kG{eL%o@NqgU`^!A1t$_76 zwqbH{d3G>qXIfrRMv>+)v zqsCKZM<9==tkHQXd;3WjIP|#H>u|_oDtq}+0$)N(fMXVSt(=z?XcHg899GNg{(Rd{ z=4E4EsFK4{A(Wl4E*n!y>0RUrc9Uo0;B7(s-W%gfsaFmoZ_hZ_z29%YtKwb=a}2Z| zZxQ?|gRoIzNYuYk#-s}Wc87FmGqJ*$6!m%#BZ7E7i9fQOO|3(Au;utW4XrZWo3^JB z=Ts8Xmj%h%^NVf06czM3TH{W-!nz?M?;aW_sX*j)-OGz?IR)CN(EUs;W@!m&5A9@k zr5|h-k`S~7jW|N;^vX{vtP1dkRi>n^*xw)tNZTJOin6Bba+VTLX1#u$b&|OB$71#|NMEnwd~F5C4~ZZ7sGY)7Z%_c+}R)KL8tQb(yeh)_}}L}mW)IJY8(cWEr(>w|gThNMf0hy;lO!`>cb*7%@A zI714MAJoqq|DxSWG0jlJ#of3iY5L{ezh*;ktut6OV4w(fLlS&sIey&9Ztl`}cn4Ol zN=lDkzM`AP{x75C!>ncZHfEof2^U-~A6lO!9rL%RCZ*Hd zU!xD7eQf#XZYT)apYdE;9X_C`7AK8ps`{uIAK8dkNSunjN&U8|yY(AK%oJ7%!O3>RAqM|4t)l zm`}bEWq2jI-OXF_QBTkJ{{Q6H{OojBX%YdWf6|slcm7-TGZ4Do+J0}T5%rWRZck$?Z|A8nwhL9 z2*iVfho*MBM6O%6F$64}n%X96+Z5!Kw;Fsj{OE;WubI(T$ZHP^Nm;P zT$X)nxn9JSZ+5QTNQYR^{rJO+`_XKXs3h3ks8!?GUjF>VNe+=M{arb75#juz3Wm ze>@V&#fV&n+;rEZ*zBN!b2;S5N}rNWNL?1@T;eP}NJ&1}70M!L?j`(M$KrpMmZ`JP`>eTgz6*Ss!DoRXF{K9mm8G$X zSX*+z!Jj2*mf}EK*EoNzuuyty%hbh~B=~-Pg^zF=lrqJAMqTsmze&Dw3_S!y3<)`2 z>!#HrmN4B(XIe)qFcarX0DocSRY9NNYGtx_AdM1lK}JY&eTFd}KDLT~&dmo78&;{S zu9s*ytVl3sLfcXL%0XC1ShHz!NLJF1woSK&QPx$~Ei6nhTRD`%Yis2?N|+h-#PTdF zo=Kj8k}kF-#fz%uQ4-Y$5)l6@k}Lj5!U6TZ*m+fpikH|LHpi@46SMing;L!nx)c<48}!NBP9QG8< zY{D2h)5_LEEJ9sYqA~^_hiRHA&^!p{X8T*Y78y&-q>iw-LYs!O5HcXO4a?8-l=s>2 zN9anKUOJ!9_m=XMDjsTu;vo3$eE2ElZQp#N&P%g45C0L)*2;mt7lPOp&mK>HVTF~z zRe*^3``kjBYFTdkDtVAjFpz*8x8NMO?_7Y;9k- zW>S#LDRp-Bz?`RN4XhyTUM@Y|tuupY4Ai0l%WdweDpNXrEs2;xIIIdl^KIu0fA{W7 zl>YrillIltZxz>+np-^84b`g)mxI=P(ku$9KL1M3ArNnII0@+4h1ZsL^8ZdW5C2$J z{{nzN$4GGZGj3n>FAx5wq;yGH$+-=4c>?w6CCK5DwN|SR7u>=Tn2Em2a^^`)5UDEf z?}6Z%nI~GO;J9<7N6_<#X)kdKK=Blg)+sS90#Em(wY(kr(77c9_FdZbxz(*pvmY}y z-?C=NEW7rmTMCY3P}JK}yBKOjC?))F$<6CsY5CCLx@fN!_jgl$isb_=^r2?gf;YBuL& zNV^D;WicH_7?x;z)EY_Xk^)NbR0qU2#WE51_}^~+Mo58XFo3@3BFQ4hW5n>QMdKC> z_~?(Zj4ygMSc31l!PTS|>x$KiSn%)Q=F_J)_n)q-YgQ_=bKrCiPq6lDz9tAg&}gLc zP=b!RAA3C`ftp}^9=?0`|IA|^M@cM8AN4qPpfCBT;OLIzm>xacilb+Th75RG;zo6o zM~IZ6QfuT6Z$~pH`WZoD+M}zU8MKYv!6`(W7~#b%U^r6b;8{4B;f}l z?JJs-bjH!}B2&I6RbR0~JBoXIeS1A$M<}>GI6KJalh1{$*34}uZP|8lSr?QYLD{Vt zp`v#ST$WOXTgm`2v;%0Alhrlo2aZ&MUC$tnlJBTJ>N+D6-3vCaE0{YJ1@qK(vURjL zNqT^6{e%<3phS1AMCc$ohZK&hi6=UUCh0c&NOCeT=h|X1{7~Uc?hpwMv0gCJSv-;2 zn*5asu3Vh=H=8lBcUn-CKCJM3uNCK=@13GGiw~=KZno$-J`r6X-!HwLgTZ0S^A!L> zXMkJTe>;9ZjNl=`@o#0@J&*rcveo*<-QTatN9U|dG{e9VX2*c&dgs8GpPZMiH!l&vy4c??Q?{R#lgk6q?gLT zk0GuVt=)W6w>3C8H6kG;vsxbv5+YJ{gF$OO1^3wl=qJPzu);QvI-zq0=uZyKxB1sd z)T1$E>JZ|GQIAADT{YQED7l9)=W&a~DOvHGqUSgfl}BooJF3!QZ2K6z=WnC$KmfHUTuELr|&;AGjj?jVOQocSbo zO1F(odyv%&IW+q2T=^s2lR6y$c@X`73yMGQ#w8~ zro-4pN&17z1sV+r?1Vvs1aQ&%I#uTQ#yfYM<<6DI{jG<9Y|)=WPdS7v@c8#Zkk*t; zP&sUjR0(>>cN_F@YQ(%{pPOjZZNQ~yLQGDkQs6%-pvm=}$)+{!cgX)X#QnqBdi?9R zMD8;#@oh^RzND-N*TVRuBk)0o#d5q8uuCT}{_2JhW1qw+vHr!T+-Ee#UL%bfq$MX( z8@fY*rZ0DoA{<>y5>szztNk>H1{H`}qK@|mn-~09>j-`&yV))zB700K?c~!*=-lm9Q1SX4LXsj!tRl;ELOr3TI22Ip8TBfYn?t|Ip zBw@GTHkc5W6VIz~g)%V0l*qXD*f|Mw0HGmA&%)!Fjmt+fN0&D;ad;MeZoLc`46u#U zdl9|#`UCIYZ)bVdzvpq@^q+mWg$R2lyI1jK|MDiD+31*_s?{ zkr~>{{%jlN-t8RT`+85-_V@1&=pA!@?-s%j4Ct534}%RhTUHDsk1qKo^S0!6VD+tA zOw&u;#$CTftmUmWz;|5qrNaxs=O_$ZBaz8Trj8&=3bVM$I&j`77BQwl1R|PBp7v$L zXU|peHBz_Ja|>c0UoiOZnHz;BbqjPMj*-2twi&IVa+#ix9>F}@Nz1Z_+dtr3b z?%fYAero$oPx1HLYvs8|IB5}FnO+{+>P;Z3TsaMrUA31k6`gl@NzbRe**ySCkB` z!E#9utOm1omXsGcoRg&EQ}+tF!p)j3W5tiwaIHmR9gU1j3C%!y!!ql_b7#<7tLJyrl3-IV1Sw=HvyC&A= zMd<=|&z-w_VrRQn9A9%pLc*0qlerDYPiX$y!%arzR3+1*9coFV2|vz~I3@0re}T$L zW+^N++idIwk-|hrR=`!WJkB-y9DS6rSBdR6<@mGXUyUvR0F|8=DY1j&w*mwaLe(Bl00t8Z&Y zkx|X<)${p^WwJjlAs?3oO*JOJ*iGfWDE8&cIpiptqDyiUYHa*bykNmL6-&ZLde1Jn z4O=!sdcT@~8-}c1P7IcLya*o89`xB4yU%BkEt$j3XEDavWrg6|3(oc;)`{Jek=4xNu!40so-1Pw)v}to~D0#2bR(WrEeSV^;zOr6!>Yln!7w(r46k6%D zf&LlweI)b^QIl!JG*<#v2fZ7gF+vRZw}I|TOC1=<{kZ52(4Ed2!!)o+4j=4BaS!FN z5Ye)eT!3*7{9uNfAB<@EL5UWdTlhtsf63WqY4QY zUxBBlRVV|kX=E>*j4E>(u#lRs+iuvY=M9SH0c=j0$ZeK@DXlM(Y!*D{FvA zjrj_+WGQE9Qy4mE4lO%wj?l7D^B~$3rZS)eRX;^X(Me-W{=h8R8Z46$P)3j9&p)O@ z1*m$8IAnh?7Wpk^ozO%8yKWLRM9Y*|os158`f>Y)C3bx}=39M6%d)-p{9j?=RJR=oJ?KjzRqEZDe6Joeqnnbd?z@&n25_6qPs2bAxG5)vzrKSvAW&mFun`ekQqh}yVL~ODZ9a*QBX}bv%6>WmCPmGvd5&V__iu=J7_8*l zzFJ}P-BSwj&8-aV*wFG7jg7RmqUPMdfY(pE!K}1Uw{cj&)vP@ILYieS(J`M>i=-T`yLaG-^?0zn>SAy|k))z+lS1WPl! zJvS;+N7qG0aX+>Z|Mi!+fsHfg5GQaaM|AjmdbptAAxKtf;97JKP`a@T zg5EBBJJz#wY@q)%1cAuPH~+I$I#t;JZxVq49cyokqy>)V8eTUf^A?B!r+`k%@Dhzw zi#rND{Nm^+Q8&uaG%u}}^OQn7T~N?Or(`fTQIHtgTLe>6p56$ZIUVHhgW#gQ+PCzz zHpe11Yfeh3%yh6&5-w+n(4-r%CMntBszi7Dz8c+~5UxNJh)elGNQTsj`nY07Kp%-ttY^xSZ#3tK_eOHPk>s84sq$x@mv)$KtS5 zcC{NFU8Cy7j0X0_CdX;P>v7>id#)?7W-``|1oKsh126n*ZjxTBgjE7}$le^nJ@;riAdM~9qEZH+xnDk~$tj^moed@ zSq7e^E-*!u`A0FlawWWOQOLh95*TBfM1muoY!v=0G7=^wiAT0ew+quMwwou-fbNG} zP^CP&P>uSy{YA?aN>q6kWq~}IK%;Y4vRn{B7&JRkr`my9(NUU!UVwFK{rE*;k+a-! zuJopMtT&({qKzjpimJiYo`0s#n3xlS{pBSyMR(`DVsbD-=~zdcQ)Mn=aYjZ{?4ycE zFpoZ5XPR0Xw;}7c%EXmUH8A^XLcC}Pll||v84uFDk_uLAU(vl4c%j0Gzy5i6`-a9b zNyc8>T6YKMiS+y?y3yqWdjD*uXGMj8kZ|}!kSI4NEd9*}pWGMcPc7WE?$3aIv(io{ zayCb;2W^;qm;)v?=1e*Tcgk*G_NWzpFdm%?c!(>QHo(RC_Q|s1WshVRG^Y!K(_HxO zh|gN1LsE@_>(;$5kVa&uwx~5iT5u0_`x0IRZ+Gk37_r%xgmGe4r{+@xYXBCx?D2&N zc()APX%L6n68T9{TtW(A)xkAauiRf9niLvuO(JF9uDmHJO&&CPbyl^U?tY;Zjn&U2 zCB<7qLz7nDzjAerGIJXy?1qWSlR`jE^f__U-^9XV-2^<=R#Q8>g6nJ zREEkf9Y2$~t$u)?gqh7yQEO(qW#9>r@1E|Re_rGQ%G_B8=qdgO-D>ByRq);5t$y;h z_^f~s5e+_QjH&^`P|!(uZr@!~mOeoyB&$Q{6X`?C;Ei^;8)rsbk2x!5(xfyc%_UtW zic_12q%jhdIZJ0|<-V<8nRRzxKnf;EW8I6pkF9u{`{-Gjq_sEY@h@GRVa{?A|8Z2* z5}Q2aRs=(r*EV;QC+}?JxbTYc*>cNFD{$Ohpw0T>AGxT=U{45J7BSW!V6iy&f8B8r zjHbK4mrOVfp#f7qk8*}5wPi?KY5ta42Ugtz#t%ZTw_b_<7U++8tn>5q(JDdlwz1f; zgSCIM`&7j8ci;)J+=mAZrfQV6D~n>#K<_jYZ!;{R##HdhKh?o_>~-3q_GlM4lR8!8 z;mhDx#84%K#%NqJ5h-jgToaQRJQ=CYzC7#A%L7RPcm1})QgYNicTYw%?)e)08u3^` zvFT~Q(=&#*ZIk*)x?qi+<%cuqp=s&;0~G@UxE*un78Iltw7I*)VG&f&jaYg%CX+?(*VkbLI^BvLy3q~de!&uo&MQ|SlT(% zEn)i$PvP_ok3(nfEmS9w@L}}^G04srVkK_C;~dGDP%oW0=>wO_&0#XRXXIzN2x|{V zd<**JX*A9fH!4KCZvZ9-64|&^f%az*Z9oEiz8p`+^$Z(J zJO%_BccEFx`fH2!pELU(B9A+^`s$9WYrGez@}&{sT4|;=VrEu1P0U{WOWj~O1Ui#|D_zebVs~fZxXj5&oYpHQ#!HKfbTHnwM*Z4p z?X2!{^cjV1fISmRX_Lb{4O*c4Q(xs3A1)uCh5a5ya!GRi&P@2Sk6DeIy5l=Mx!_(l zG&JSq(t;a~EcQZ63|^5*o_g)2brUkE59td~awGhnEq(H8*g@CMy1Jb%gsDwfn^ty*hcy<6 z|KHKfN6czWB*f(O9drVw8cMGUVqS7LD3(2;Gp(*h67~Y5*9%F}4}lz3h`jgLkos_X z((D-5mj9FP8PrNf`?jKKU&WY|=|XzqRL{+hC*^J|il~P=V=H(Mlv-$JMBXMDM64w6 ztZ{g)49{qGBkROrOmzP2=U?Q=TRj(EVg)xOKW8mZhb#|eG-DMSuT}iT^IqnF+%qwO z)v7GQn$#?psajzsSMKa(S>y`prsWm#nN~Dz{$gf9E@g2;?jPIAfpw|3OKeLmuFJ^1 zlQ`*7KLJjPlDJlT?;oUzm!MdK>1XRti)#YCc#2(Du`u@PE(Om^nTpE}Td*K38<)C^ zt;ru*9LRRyH!Uss!6^xBa4Q=}jZ0=oX{85A8E7@}Gm>zk+CphLRgrNf8V1q*l$dhx z;1s#mpE+OHQsr3V4aEj9l3_sZbzt{?3b)=C_Ia<#xXy)|w_fs3qe(&h=qI_CCF8b$ zApuxF*;@zqP2kR2HXi?(+Z8}gKzV(~u)i_|c<7`PC8oKK5{;?|YO~u?Qk(70Ma@lZ z&CSKrU3Wzgj*Tru2|lTeuq&di`oLFBLH&-|UxFBwWydLky{JrdOWKJILicfoM8w01 za6EMr&U(KGcOuP+NYb`oa&XAXEfXM(+bOlnnrn5bPpwZ(4K#%8q*8AaG%5Ml1um){oq*6+}i`dS`+$oH*CVdv)MZYZ$tstawcyX*ybb$RUE z6yJ*c50AMOxD!Rl2Q2s}gP5mhc0oMkZ4mtxl)d&n4@)lHrwG1W2rhz-w7 zUkna=$qUZ`h^}bT32!5LA7CO2OhmF>sfFAi7sMk+t>X}IGq9{0OEmtxi$Wl_K{C9J zKq6G&B?RwoDS53yiV{e}uGaTTi1X!?PNgL6_GW;CpO?B9#AX>)V%U)S^5NQObcPtl`TTi29`oJT*FgLrF#42lE29f@1oVv_f?W^&N zxzh&z4lR3f&qY%rTc1u7c)UA_TPz(``TSbJ#K=vKVAiiRDb1v2l=$Q%#QyemYM0xc zf3*6cvbj-cAC3Mk&AmmS6B1?y4-~UJUdw_nvgbc=*n0to%E@I;^+!e-z5uUW#Hd=R zOJ#i9>$GYgCv?}iO)VaD^g1<bdpO)=?hiY@Ctu8g8S7X_a**E^ye z^=8ce01LU$`5i-3j#6EwY%robd@O7gT0gh*?jTbzms!aEN=Y3afL@09E)qNJ%5+=}`H2 z>jc=+3Fp%K6ob_k6vT>Z399J?V|zDq%XiVCOYGJ$`LN_{Kw!deLaVKO#%!Ra#h=Kx zPZSloj>Fv+`dyKw_;n#FHDzG{7<py9e!HksY3+l)_PKjEy`z&e&aHNhit$t+IA)H?-Uf8Jf%DC~FTQi#oXQN4`v zKDtEU8$J8QbTcpg_=OZfgj}+oAY1%(VcWdcqOKRMhS^#BV&`r}DBVG4IEdgyjtDUx zh);0?|NOXVSu1sYQ*$Ozv}~-2ZD;buwr$&*;EQeBwyjArv2EMN#I}<=b?-fRIOhlK z>aOmGRl91fZc-+9-qg}zT1_&xpWg#?CVG7ntd5VhnNU@wVxbhmt*7-xrAA1dapS=} z5tky2Ah8xb>L+Z?TO^Px>scVdBv|cvBekcb8oWn8`PvL+1<7EX<8DymEKkiB*)uPZ~(Oy3qNgerrK_`4ts<9@eLAO%PjB;sZsb$G^x}r*<($f1)haD)ShwugptC6IGjP~+ z534mj3k}A>Jo#=^pX_$JfzaB)^zf6W@DORNkOQ-V;-@b88>ETR@c}~rHk5vo5e5?t zZM2eKT1dkiUxXP3lM#uE@8DbZ)N?gOCr)WFG`x=@RYFO^WyL9k&HSFDe4}|!s zU5;Sc^F!1pD|Z?=$AmqT#y(uxd5>Nv&`FEc7zFp0&@E{&c~NA$?2uA zBuvTTUVY9x9>hp)A_tPv>GAV~bofmpO~(dM`&x0a*3U>z!J$U!-%n(5n(p4JI3&M6 zm^g0;g^6$6Gm>52<&u(35fW#;c^#x>8eMSG} zBdXy*v>zSKe>j1wPF5Wg3zm|zQXF=vXQ;Tm56j9JJ}Dv0z@|jxg-x*+EszKNNG)H1 zzOfsHkB|^OAvC|=TNa_eRmEu38qE*|tf=c?<5c^So%e&@lMk(4>9gm?s3Ikk$|82T z#Sj`YKZIG5-n^k-;@?sGj9y&54?X(j0A=lEUXtqBgmTd^keUM=C91v6&QJdz5L$viHnJ$Nj{WLRvW4^rqd@SZ%O zo0%?6%%pEcHTLNI0N@0oQG9xk&cP5js~DcITkUI(iXs2InT@$cvQ@yAyorIabl z+be5j=YMrvGD#z3z8@8j++We|U!7@rl?2OP5-@U)11{-4-I%q%@Rp8qNp` zlzDczur150nLy*^Uc?B!2LqvBI6)4Z2mS{5cTf1{jch0L=r%d1jA*K64$?t{9n)TY z<;D(0gy`>Spx*`7&dd~sACcKIEN}N2{@G}O;Z5`-k6(`-;#CRQaE$Q9@IU_W&JW7T+3uVFOL+_QfOYW_3KZJKxoh?EJ^!LL9{MLnllBt zU<4PK&!zXNJKrRLy}E_^?TLO-f9qK2cniORzKh6w45tVQlVvvKf6@A!OZ6S=Y7eqI zQI-CZE`9tQF~yBsXWIbL9q&PC4HjkP?-6%+Ak-0+O+y!rQv3%7Ugvr1^>p{xXSjEM zBI`b2{_|==5hhtG$tq{N;c8FWW-if+^{fIjC3iz_`z}L{YmTRI$pl0MM{!w?1ozUz zJTtv+ylUxISJEQLq#10X+`UVWo!$LsHCa+%a7BZL&2%SqRn~%#_P^{B8lK)fbW;;) zvZ-HOtl8(8hbfcp=-FGCW^p@+&Rz)bo=bw4Yn#tyTrx0R%u*&L=4YM(?4$;fW1@hJ z%toi68pMo-koQ%b_=;~~Qb}zotI~_|10fQ{{G)%Rv?Hkq)NKhdS|cc4qLnh(P5-ug z<@n$f&TPFmw)i%VWXXikw>!3Q&SB^j8Ql88a5Ll_DjS?2W#C+GgxrDc7%m#uvDg zGcrka)~=Wsw_}@fOmB}n0kN{Kq!Qz^$^D}#hi14X9GOw;AgJ@r++lE@c+n&#(LN=V z0wUd|CsCNoF&ZP8q;vQPHbV+oO~(s9%M0g~vj>+6w z*!vbn(*ct`v*clx^HXjdI~>F<|9YKRjhwcowc|o;opWcc)|AqMFqu~TpIz`FP;fza znW}vHK>}g@p+@1xF=hgdIz zo3&Y`nPV6$m+$K&^KXrDDa(X4i7oiaCs!1wlKbwb7{TaJ^*VNM*T2 z#LX(hGIb_ZVhlW5e{Y`hJfWTs7anl&dy*Grh;(U{zNE8$!V$m_SmUfCZ` zqc&tmVS^A{EMSr*9&YW)L3Itfe0~g zR`_h4#G%;?La=ajHRYl$1t4Y|9>fH5`9 zZK;|}UgjRAY}2lhY@(4CJzt2u54Kcp9-F16;R+BLEd)K~x^fG4HcWYFxME-=m2l<#bNHE74(>DmNHW?ngrtx5Z}nEwTca|qV@(myj?J) z*71(poviX_Dj8P&p-wud6%CIG!D>9}J2^g0bz`I~^@MnsrF^M=FjS1Iv;pEr;TTL! zFD+Ymyz)nWJa+Pe{&zbv`ly>@>81ga#jN|mM9-wOqm{f>kgr<4NG&U8n$o8WhNozU zI79Yn>JIp&|8-DmWsEz_7ll)S{0UQU%%e@IG%b(AgLkfC^|QK2#|?j2h(|!dxNU_7 zdpz6=zfc(}CN+Op$=Eq(oT&LEaI4E?SS+9{0ne%!YTqjMICig=HI_}JQHLY)9S2ZP z@Ug5XX9e{_nc^YiGA1|Tcm&!Z`-0f%7>+yU7T7&>bLr?J#N$GmN!kcQ4^4SvjsjLE z?h|NU+lel92nf`;O`THoBP-2hLgAt!L_4lc_MZaT`ST!}C3+ljZrr$-{0~?A4@Q6 z@8kQiD?z278nQnwm#^K<6a^f14tZJwUaW#myd`A4ZqBGir!lvVT3;e@fhz|}qpT)g zue5cv5eb8Fp{@k08^j~Jjr;C@<~V!|FO5F*$(E^W`)W!(fBo?!YF()*PZa3T_PHQ# zMT&SPnE(7SB=yI^3HV&xnsUYBZT$Uri+%5l3T&eTu^}|94Hm3b1eQN`)9C8+P7ubp zTR_6lpC%oSmJw7Z035~}g0NNilNa=*mp{B0M?MffkfJFcB;+qQ@-A^n0IY0rpCPD5 zMNVr!_+Zu(TRa$m3=~9_b{+>=)L&N8pJJB;Qmib*GBIn|_fEe-wSfACGY&F@-8q0w|exth-)N z`|pYDNNX<}{p^xsB{$#|GRf!-P%Ka{D7kCjkGXR>eGWsSqY>Xv?F_@pu)r8_edZ&v(&>2^CY-(;Lt}jR%MLJ4 z-*bref(l-vM|^3$nkVkxVqF%+u7DoTx~(U&Z@0yM-Aj_&O@^L*{Y7S&Y1MW`nF<6& zKE0U1$ER0~>s8<=e2PH#TQHQ7Bh;73pRnlwQO)}6x+g}uDHzhiTprOv2gZbk@5qw$ zSYG68wY>Obm#NG{BpXhn^GNpW-_mf}Ivn>;m*_l6+Ane-2IKbLXt${K?=MJ^1_wPn zVgXQng5(KQs<=6QzepyJK*AXdqJLDdZZXnrIPeL;6md#5bOL_213P@N%RIDNJ~EIbFl5=lA{@oilV!jUMhrm)2u1rh3TQ`u6q3_amg1F~^3)td8=+GIQ?X3dIBZss z4pf-xOfK5 z{c6^M8*blaeBUaxO)odLy<(s4I0{m6-CVuE}6rT#mpKwyoD4_&?HS6!;ntl zE==M7FZ3{ThCU(?hyW5rZ2SPx0wzuT-2YU#j!T!&fEYc3;=f=GSu^O=v$ppBUKD=+ z@B~FR62`$&R$}{K4ZwD~bebYly1<|zkC-2>&#Bp=AZi&&vt#gwK^t$4mtH_vs3%yt z4`Pf=Vx5Spue=ue+R^+EF^?fZ2q$zHALjvGzAE$EZ{(x`v1PxRVewN-If@k7xWS|gjt;08d#XvfQFJFRjhHrq1tVr0q54w;pk^7PUdDkfXBM?&=EmFO4Iv04t_V*l8EK{&izO$1yeUhq>VVe7YJK0__MQ^iMo*%0Egn>^|^UjAwfBYdM9yG+<1PT_jAzrsq z5a+41&_#2(i`3k1D@0yIz^(^=hme|dN0^xKk4js;Pu z{plhkN3KtAPtB%T;<~jzGHpZ!oeLXL>UJsMkwtMrSMswNaxcZawBSRZ7&Q-A%KqZ7 z0y6@Jis18+xv0F?vJH&Y@c3h#OkIiha}F;^g8G6|;r!PD(efAI3I`%A$(4dXQrMp$pvD4)vy~g}jfKDH))(edD>cc8EIq2nb4)@6IGmz( z7GC`LTugdV*&7dOQq1Liy}4JPWr(ZPJMz-3Ta2>RK1_XA(-v2}>@l`GV8exH5NWkK7(fQHY-DW7YKE_UEz8T5~CM7RhQ)}iJ zo8I}G`;)&tgWm9v7cSV+?$X9VfgyGbqJNGyhcge_3Oot{^J~hLV}S3SeLGpE#H=WH zABwbWt+v4>elDPCXM{SLrQIJFfo905F4yDoNeZl6LGzc6k^%MO$uGhbTzdAF{gtTl zned7+MkHr+>gbCKmr%a7MHSMQAgNsut90@%6y%J%zx3TdM@h?Pn*2lvBZVcRg$=NA z4k&R>4OJi{qAmUwC*&x*(KP9mo1cUQRlEG5T6j4()uz`Co)S^F=_ss$`j}XWaPs(+Z$qP+$n`dpCyPv~P((8{(cJ&Qi>hw=gnr6# zvqS-LX%=yi;YAU8lnY8_-BkljY5? zOKw4ccOMf?)T)IXOxXvB@CDk1psm`knxTA;2B_Os395tRTK^;i5P z&EFpoq)cS%_IGR&1j==w+zAhc>KVOznqtuQr)KAZ}g~a-^z9mvHKSz9WpH zOQK(p(N8O{-5klKVP&lim)-dQ>|M7kWVV1AiDm1_?tno3>Zld(RUJDnyXv? z))=ZbNED;;&)25T=9Gt7r%DRsk@QUAeRTK{t{E{b7k-hwga_z_GY3MKJ? zLmvE{KvU2r!r$Z&?kayqqqt2ja_X=!=nkH*-OVKO{4I>ua`G6oGRa8RmhU$GZT~_Y4D*IR zMT_v|D&os$;oo-gWF^sL<&Y ziwDC_S{V;zze`k-v^|ro&ymY)53V#2KLrX`p{7xO){25wt5ym_*|jL`TfyRT(EII5 zs_YSRNpWlfjk;j2`&ll9Br#S^-Bck_hlwlR2|qUjP)J<}zxICQVN^?SjY`(K?Ft~l z!6QlxXtLY{Sp*0CAuzlrl8yopC59U5U?CDN5o+L%L*w_HO8Sj{a_v)I>q#|{vcj+w zeWafGEAju)ecrebtD*uoquT5k2KGn*1cBgDgDv85Jnth+nkBxoAM7pF@9d@FV|&vm zbScprtsyczc2)CCqx`0M_-!KIdEZ(`qgS(Fnz{2oNR#1Ein)K{7@z_nekGZJbEtu` zFbi-YP1YTH#}c7;dA{r_4}OF9nSacn@JrypnuJnpe@DEgg~7oe0BmeIdPpR~UQ!EW z8T)oeD04-Z28m2;gGPLA<+$L;Ddo)-$e|o=>)lXy9ET`@btxun}a9 z?c6kF88g85tI0@}5TzohK`h#LIUFH(7*ck`1RU*O0ZjeYoW@3g>U0*(;UEW#tG0~K zG58W5b4sDgdmuusGmVSmBo0M1&n*VaXb1Ki$sHHLi~XwII~$6CcKb!wQ(aB+{k)!| zE&Raiqo+dB+O@M#<4%}C8FC^;nb5$3?qrM~1b~^+2me@BgBqqo(wOuzgFFkv_QC*K zrP!eUfdMm{#A6bn#h#(u(`+7k8?~LFt%Jx{%0|)XZ(%V9!O0?*!2}TFK~#q-+>&)8 zpbY$`Xq&?FkjXp*U7&$5_OO-6Y78x8;ER$rE`~Kk!V;V-sZDYE4NYuDfY>n0^sNl* zW*<{&NQE=RS%`c(;l$kl@ zs8COicr9d4l2h%XEHQH1uwpb8qr08Tx%O&_LJ?tc{4q^@prD-VZe?wZaEaK8QmEu+ykia3VK6P}Xp1ZpC4A2(ao z+)$ho&z0J=#9}qz;}RM9S%V4J>8=EK>}H7)RHnbS9Jk+dQ*!mW$c0d>rl-z(o@frb zt7m>F%XgDAk;wzppfHZ-=?`LDwLgX)aS{$JebRF|6Cih$ah|Nw|KeTQ2%WdRxJ-4b zWTn5Sgk{W!2${&r7*63B)J)0`4(}*`ya0Ql4X3#}nb!#I4MM6u6;=sG9Wirp?{pGQ zSn9~XPyQufAy*Jcmx@f7^hrZi;(H_3Mw8Z=y3;&O7vX}%Rj?g-C3|Ec+Lrtk_O^Ry zVX7*jk<7^WQ8R5|W%eaSPE6OtY8@+|TIIaS4PAr6c#x?IF0xpar@`>lVKnZ>^e&1D z8y(_gs=%5f(_8Oti!rVLsxI~he}B2BRBJ2$cs%pC*q^qPerD$#v+O~;4C*hIOmipd zE;vGC75OA+H4q7fK^Z*@w5B2#`u;lqm+i^xM zUJByFB21Xq4@T^oC|O>@clF+s*`FMYz9QE%yRVH)-HHg204tEVChHrLIX4C;-qUya z0|Z_orUuHCUXJL(l!u{xv+IQSL>&S^wNs6H{TO;nm5BaY212C<JvMC%vC=~HYqb0|;aatLY5xOotSsgs3 znByqSDx|(}mFg()@9G*TXmQO~A_M6?h|eY|{*7R%GyAZfQtqy9^EE`N_rNM53)cOH zKb2V_%c{|yQrZ$}VOOCQNY(IxXQQf=G}$k}mT(* zY_oYT+08Lh{5<-_-u^HzX=%#tG7$6=ssPlHFc3^_YTnA=k4trKt3Bxc*T|4EHHcZ{ zLP1?&v4U*1d&KjfJF8ve_7EI<$~qA0^KBw=?nH*CVl|S@F_ebTAtiwlgnP4kY1H0b ziD40fLuJ?JW^9QDVx!mQpHWYt!`)oVnZUi}K__!PXtu%tgx-6=x8ARiYSly z;B!lo>-RgDhILN>eyzcW+o#|fw8VIC&hzw`n7!53+c)LsBjK|@Znq+;-dJHA+4^%G|D_&V0gj=qsxV3Ie-^_V|xm{f=}Ca97! zaK$)U$|6DDn4CVY(c$i?Di8uCHl6N+Qj77~G zGC@>*z4WKDjSC}76Zot{`9RqUIUT<{Z_>>7jgiC#8m1t;AJm674DR4eQr8U4c}Tqj zc9Cgj7JoKIRn+{(BR5eddwpFHnVnU=Zi;&gYSZPiwp(jyN?^>u^URp8YSjyrbatTa zNpLQc2?yHHmCTRcx@j5D6Y&s(w8YAXGCN(V`2W5bOwyfR;ZSD>9r11H4KK*jxyx9b z8qt+LXC}MqBulrE3}$txJ`{IxC&mrqzhVLr=b|inFJ&lqJ~za?d7O2)JiQ4H&Dd0N zT%nH&89`07OGw^#9VlQCe>EhiISGn?7QA9uSkmRM8BNgM@2aFptBSFI_+29g_?M2p z=h2vy8UBHWWd!o;Zm}LYyeB6j38{FM{jj<5Y6$4t(KNz|9s8IpN&5Kg5)uzPs3`MC zJ{96$VV5-ikvOrK`(_(>M@v8Vs5@D1k5~b`CnC+cv)vyGk7N#^ z7JLhVsNWD1>a?}OaYs9tT6@oI-4TFwKLhI!iRwH^4fhKcBjxEca-LD-ZEzJR5Rm@^ DKZR3$ literal 74256 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 From 7103e426dabf14d82043cdd10fd8078843f332ad Mon Sep 17 00:00:00 2001 From: Murat Cakir Date: Fri, 28 Jun 2019 01:16:50 +0200 Subject: [PATCH 049/115] Resolves #1651: Update jQuery to latest version (3.4.1) --- .../Administration/Scripts/_references.js | Bin 840 -> 840 bytes .../Views/Shared/Layouts/_AdminRoot.cshtml | 2 +- .../Content/vendors/jquery/jquery-3.2.1.js | 10253 --------------- .../vendors/jquery/jquery-3.2.1.min.js | 4 - .../Content/vendors/jquery/jquery-3.4.1.js | 10599 ++++++++++++++++ .../vendors/jquery/jquery-3.4.1.min.js | 2 + .../SmartStore.Web/Scripts/_references.js | Bin 2526 -> 2526 bytes .../SmartStore.Web/SmartStore.Web.csproj | 4 +- .../SmartStore.Web/Views/Install/Index.cshtml | 2 +- .../Views/Shared/Partials/_Assets.cshtml | 2 +- 10 files changed, 10606 insertions(+), 10262 deletions(-) delete mode 100644 src/Presentation/SmartStore.Web/Content/vendors/jquery/jquery-3.2.1.js delete mode 100644 src/Presentation/SmartStore.Web/Content/vendors/jquery/jquery-3.2.1.min.js create mode 100644 src/Presentation/SmartStore.Web/Content/vendors/jquery/jquery-3.4.1.js create mode 100644 src/Presentation/SmartStore.Web/Content/vendors/jquery/jquery-3.4.1.min.js diff --git a/src/Presentation/SmartStore.Web/Administration/Scripts/_references.js b/src/Presentation/SmartStore.Web/Administration/Scripts/_references.js index a941beba516794543dffcdb4ef2901e4b03f056d..6d51960f98e356a5361f456ceef63d76ef8bfe78 100644 GIT binary patch delta 12 TcmX@Xc7kn!9iz!cdroEm9EJm& delta 12 TcmX@Xc7kn!9i!1kdroEm9DD= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting

    or other required elements. - thead: [ 1, "
    @T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", option.Term):@T("Plugins.Payments.PayPalInstalments.XMonthlyInstalmentsAmount", option.Term) @(option.MonthlyPayment.ToString())
    @T("Plugins.Payments.PayPalInstalments.LastInstalment")@(option.LastInstalment.ToString())
    @T("Plugins.Payments.PayPalInstalments.FixedNominalRate"): @(Math.Round(option.NominalRate, 2).ToString("0.00")) %
    + @Html.SmartLabelFor(model => Model.Locales[item].NamePlural) + + @Html.EditorFor(model => Model.Locales[item].NamePlural) + @Html.ValidationMessageFor(model => Model.Locales[item].NamePlural) +
    @Html.SmartLabelFor(model => Model.Locales[item].Description) @@ -39,6 +44,15 @@ @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name)
    + @Html.SmartLabelFor(model => model.NamePlural) + + @Html.EditorFor(model => model.NamePlural) + @Html.ValidationMessageFor(model => model.NamePlural) +
    diff --git a/src/Presentation/SmartStore.Web/Infrastructure/Installation/DeDESeedData.cs b/src/Presentation/SmartStore.Web/Infrastructure/Installation/DeDESeedData.cs index a513aefb9c..37d63f5ff9 100644 --- a/src/Presentation/SmartStore.Web/Infrastructure/Installation/DeDESeedData.cs +++ b/src/Presentation/SmartStore.Web/Infrastructure/Installation/DeDESeedData.cs @@ -3890,22 +3890,116 @@ protected override void Alter(IList entities) .Alter(0, x => { x.Name = "Stück"; + x.NamePlural = "Stücke"; x.Description = "Stück"; }) .Alter(1, x => { x.Name = "Schachtel"; + x.NamePlural = "Schachteln"; x.Description = "Schachtel"; }) .Alter(2, x => { x.Name = "Paket"; + x.NamePlural = "Pakete"; x.Description = "Paket"; }) .Alter(3, x => { x.Name = "Palette"; + x.NamePlural = "Paletten"; x.Description = "Palette"; + }) + .Alter(4, x => + { + x.Name = "Einheit"; + x.NamePlural = "Einheiten"; + x.Description = "Einheit"; + }) + .Alter(5, x => + { + x.Name = "Sack"; + x.NamePlural = "Säcke"; + x.Description = "Sack"; + }) + .Alter(6, x => + { + x.Name = "Tüte"; + x.NamePlural = "Tüten"; + x.Description = "Tüte"; + }) + .Alter(7, x => + { + x.Name = "Dose"; + x.NamePlural = "Dosen"; + x.Description = "Dose"; + }) + .Alter(8, x => + { + x.Name = "Packung"; + x.NamePlural = "Packungen"; + x.Description = "Packung"; + }) + .Alter(9, x => + { + x.Name = "Stange"; + x.NamePlural = "Stangen"; + x.Description = "Stange"; + }) + .Alter(10, x => + { + x.Name = "Flasche"; + x.NamePlural = "Flaschen"; + x.Description = "Flasche"; + }) + .Alter(11, x => + { + x.Name = "Glas"; + x.NamePlural = "Gläser"; + x.Description = "Glas"; + }) + .Alter(12, x => + { + x.Name = "Bund"; + x.NamePlural = "Bünde"; + x.Description = "Bund"; + }) + .Alter(13, x => + { + x.Name = "Rolle"; + x.NamePlural = "Rollen"; + x.Description = "Rolle"; + }) + .Alter(14, x => + { + x.Name = "Becher"; + x.NamePlural = "Becher"; + x.Description = "Becher"; + }) + .Alter(15, x => + { + x.Name = "Bündel"; + x.NamePlural = "Bündel"; + x.Description = "Bündel"; + }) + .Alter(16, x => + { + x.Name = "Fass"; + x.NamePlural = "Fässer"; + x.Description = "Fass"; + }) + .Alter(17, x => + { + x.Name = "Set"; + x.NamePlural = "Sets"; + x.Description = "Set"; + }) + .Alter(18, x => + { + x.Name = "Eimer"; + x.NamePlural = "Eimer"; + x.Description = "Eimer"; }); } diff --git a/src/Presentation/SmartStore.Web/Infrastructure/Installation/InstallDataSeeder.cs b/src/Presentation/SmartStore.Web/Infrastructure/Installation/InstallDataSeeder.cs index 7cfeef0ef3..e60e9c0b3c 100644 --- a/src/Presentation/SmartStore.Web/Infrastructure/Installation/InstallDataSeeder.cs +++ b/src/Presentation/SmartStore.Web/Infrastructure/Installation/InstallDataSeeder.cs @@ -553,7 +553,8 @@ public virtual void Seed(SmartObjectContext context) Populate("PopulateCountriesAndStates", PopulateCountriesAndStates); Populate("PopulateShippingMethods", PopulateShippingMethods); Populate("PopulateDeliveryTimes", _data.DeliveryTimes()); - Populate("PopulateCustomersAndUsers", () => PopulateCustomersAndUsers(_config.DefaultUserName, _config.DefaultUserPassword)); + Populate("PopulateQuantityUnits", _data.QuantityUnits()); + Populate("PopulateCustomersAndUsers", () => PopulateCustomersAndUsers(_config.DefaultUserName, _config.DefaultUserPassword)); Populate("PopulateEmailAccounts", _data.EmailAccounts()); Populate("PopulateMessageTemplates", PopulateMessageTemplates); Populate("PopulateTopics", PopulateTopics); From e4fda8acf538914839e38f89edac99b1aefb5033 Mon Sep 17 00:00:00 2001 From: Marcus Gesing Date: Wed, 26 Jun 2019 14:20:12 +0200 Subject: [PATCH 044/115] Resolves #1664 RTL: CMS menu issues --- changelog.md | 1 + .../SmartStore.Web/Administration/Views/Menu/ItemList.cshtml | 3 ++- .../Administration/Views/Menu/_CreateOrUpdate.cshtml | 2 +- .../SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index a6d45bf3fb..bc6c3582e3 100644 --- a/changelog.md +++ b/changelog.md @@ -21,6 +21,7 @@ * Fixed wrong XML sitemap index numbering. * #1646 Setting ManufacturerItemsToDisplayOnHomepage to 1 will not show any manufacturer. * #1647 All manufacturers page: link of last character missing in alphabetical letter list. +* #1664 RTL: CMS menu issues in backend. * Various other minor fixes diff --git a/src/Presentation/SmartStore.Web/Administration/Views/Menu/ItemList.cshtml b/src/Presentation/SmartStore.Web/Administration/Views/Menu/ItemList.cshtml index 2a57bb7744..3145879640 100644 --- a/src/Presentation/SmartStore.Web/Administration/Views/Menu/ItemList.cshtml +++ b/src/Presentation/SmartStore.Web/Administration/Views/Menu/ItemList.cshtml @@ -24,13 +24,14 @@ else var item = node.Value; var parentId = node.Parent != null ? node.Parent.Value.EntityId : 0; var indentStyle = " style=\"padding-left: {0}px;\"".FormatInvariant(padding); + var rtl = WorkContext.WorkingLanguage.Rtl;
    ", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( ">tbody", elem )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Fall back to offsetWidth/Height when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; - } - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - +