From aadb5c0acc02359c0dfe5ab93a423d1b6b287ac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 18 Jul 2022 08:24:42 +0000 Subject: [PATCH] Sprint2 --- .gitlab-ci.yml | 28 +- .vscode/settings.json | 23 + app/Console/Kernel.php | 4 + app/Enums/Products/ProductLabelEnum.php | 47 ++ app/Enums/Ranges/RangeCategoryEnum.php | 41 ++ app/Http/Controllers/Bo/ProductController.php | 153 +++++++ app/Http/Controllers/Bo/RangeController.php | 197 +++++++++ app/Http/Controllers/Bo/SliderController.php | 44 +- .../Bo/Products/StoreProductRequest.php | 141 ++++++ .../Bo/Products/UpdateProductRequest.php | 10 + .../Bo/Ranges/RangeModelTitleRequest.php | 43 ++ .../Bo/Ranges/RangeSearchUriRequest.php | 31 ++ .../Requests/Bo/Ranges/StoreRangeRequest.php | 128 ++++++ .../Requests/Bo/Ranges/UpdateRangeRequest.php | 10 + app/Http/Resources/BreederUriResource.php | 27 ++ app/Http/Resources/RecipeUriResource.php | 27 ++ app/Http/Resources/UriResource.php | 37 ++ app/Jobs/ProductStatusUpdate.php | 41 ++ app/Jobs/RangesStatusUpdate.php | 41 ++ app/Lib/ToolboxHelper.php | 44 ++ app/Models/Breeder.php | 11 + app/Models/IncoNutritionalValue.php | 72 +++ app/Models/News.php | 18 +- app/Models/Product.php | 204 +++++++++ app/Models/Range.php | 180 ++++++++ app/Models/Recipe.php | 45 ++ app/Providers/RouteServiceProvider.php | 4 + app/Traits/Controllers/UpdateModelStatus.php | 2 +- app/Traits/Models/ChangesModelOrder.php | 39 ++ app/Traits/Requests/HasPicture.php | 91 ++-- composer.json | 3 +- composer.lock | 49 ++- database/factories/BreederFactory.php | 29 ++ .../factories/IncoNutritionalValueFactory.php | 50 +++ database/factories/ProductFactory.php | 53 +++ database/factories/RangeFactory.php | 43 ++ database/factories/RecipeFactory.php | 31 ++ ...022_07_12_113538_create_breeders_table.php | 35 ++ ...2022_07_12_113555_create_recipes_table.php | 35 ++ .../2022_07_12_164017_create_ranges_table.php | 64 +++ ...022_07_12_164018_create_products_table.php | 75 ++++ ...4_create_inco_nutritional_values_table.php | 47 ++ database/seeders/BreederSeeder.php | 21 + database/seeders/DatabaseSeeder.php | 6 +- .../seeders/IncoNutritionalValueSeeder.php | 21 + database/seeders/ProductSeeder.php | 38 ++ database/seeders/RangeSeeder.php | 22 + database/seeders/RecipeSeeder.php | 20 + package-lock.json | 96 +++- package.json | 4 +- .../images/products/product_fake_700_700.jpg | Bin 0 -> 95921 bytes .../products/product_fake_thumb_300_300.jpg | Bin 0 -> 36832 bytes .../images/ranges/range_fake_700_700.jpg | Bin 0 -> 95921 bytes .../ranges/range_fake_thumb_300_300.jpg | Bin 0 -> 36832 bytes resources/lang/en/models.php | 4 + resources/lang/fr/models.php | 4 + .../bo/EnumTagDropdownComponent.vue | 165 +++++++ .../ts/components/bo/ModelLinkComponent.vue | 273 ++++++++++++ resources/ts/confirm.ts | 58 ++- resources/ts/index.d.ts | 5 +- resources/ts/modules/confirm.ts | 2 +- .../views/back/layouts/nav-menu.blade.php | 10 + .../back/modules/scriptConstants.blade.php | 6 +- .../views/back/products/create.blade.php | 30 ++ resources/views/back/products/edit.blade.php | 54 +++ resources/views/back/products/form.blade.php | 415 ++++++++++++++++++ resources/views/back/products/index.blade.php | 103 +++++ resources/views/back/ranges/create.blade.php | 30 ++ resources/views/back/ranges/edit.blade.php | 54 +++ resources/views/back/ranges/form.blade.php | 327 ++++++++++++++ resources/views/back/ranges/index.blade.php | 106 +++++ resources/views/back/sliders/index.blade.php | 2 +- routes/web-bo.php | 27 +- tests/Feature/ExampleTest.php | 11 - tests/Unit/ExampleTest.php | 9 - 75 files changed, 4043 insertions(+), 177 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 app/Enums/Products/ProductLabelEnum.php create mode 100644 app/Enums/Ranges/RangeCategoryEnum.php create mode 100644 app/Http/Controllers/Bo/ProductController.php create mode 100644 app/Http/Controllers/Bo/RangeController.php create mode 100644 app/Http/Requests/Bo/Products/StoreProductRequest.php create mode 100644 app/Http/Requests/Bo/Products/UpdateProductRequest.php create mode 100644 app/Http/Requests/Bo/Ranges/RangeModelTitleRequest.php create mode 100644 app/Http/Requests/Bo/Ranges/RangeSearchUriRequest.php create mode 100644 app/Http/Requests/Bo/Ranges/StoreRangeRequest.php create mode 100644 app/Http/Requests/Bo/Ranges/UpdateRangeRequest.php create mode 100644 app/Http/Resources/BreederUriResource.php create mode 100644 app/Http/Resources/RecipeUriResource.php create mode 100644 app/Http/Resources/UriResource.php create mode 100644 app/Jobs/ProductStatusUpdate.php create mode 100644 app/Jobs/RangesStatusUpdate.php create mode 100644 app/Models/Breeder.php create mode 100644 app/Models/IncoNutritionalValue.php create mode 100644 app/Models/Product.php create mode 100644 app/Models/Range.php create mode 100644 app/Models/Recipe.php create mode 100644 app/Traits/Models/ChangesModelOrder.php create mode 100644 database/factories/BreederFactory.php create mode 100644 database/factories/IncoNutritionalValueFactory.php create mode 100644 database/factories/ProductFactory.php create mode 100644 database/factories/RangeFactory.php create mode 100644 database/factories/RecipeFactory.php create mode 100644 database/migrations/2022_07_12_113538_create_breeders_table.php create mode 100644 database/migrations/2022_07_12_113555_create_recipes_table.php create mode 100644 database/migrations/2022_07_12_164017_create_ranges_table.php create mode 100644 database/migrations/2022_07_12_164018_create_products_table.php create mode 100644 database/migrations/2022_12_07_135414_create_inco_nutritional_values_table.php create mode 100644 database/seeders/BreederSeeder.php create mode 100644 database/seeders/IncoNutritionalValueSeeder.php create mode 100644 database/seeders/ProductSeeder.php create mode 100644 database/seeders/RangeSeeder.php create mode 100644 database/seeders/RecipeSeeder.php create mode 100644 resources/assets/images/products/product_fake_700_700.jpg create mode 100644 resources/assets/images/products/product_fake_thumb_300_300.jpg create mode 100644 resources/assets/images/ranges/range_fake_700_700.jpg create mode 100644 resources/assets/images/ranges/range_fake_thumb_300_300.jpg create mode 100644 resources/ts/components/bo/EnumTagDropdownComponent.vue create mode 100644 resources/ts/components/bo/ModelLinkComponent.vue create mode 100644 resources/views/back/products/create.blade.php create mode 100644 resources/views/back/products/edit.blade.php create mode 100644 resources/views/back/products/form.blade.php create mode 100644 resources/views/back/products/index.blade.php create mode 100644 resources/views/back/ranges/create.blade.php create mode 100644 resources/views/back/ranges/edit.blade.php create mode 100644 resources/views/back/ranges/form.blade.php create mode 100644 resources/views/back/ranges/index.blade.php diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2d6f9b9..1bd5031 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,24 +1,40 @@ -image: jakzal/phpqa:php7.3 +image: $CI_REGISTRY/service-web-lab/ldc-web-images-docker/ldcweb-qa:php7.3-1.0 stages: - Security - CodingStandards -security: +composer-security: stage: Security script: - - local-php-security-checker --format=json --path=./composer.lock > security-checker-report.json + - local-php-security-checker --format=json --path=./composer.lock > composer-security-checker-report.json artifacts: when: on_failure - expose_as: 'security-checker' + expose_as: 'composer-security-checker' paths: - - security-checker-report.json + - composer-security-checker-report.json + allow_failure: true + +npm-security: + stage: Security + script: + - audit-ci -p npm -o json > npm-security-checker-report.json + artifacts: + when: on_failure + expose_as: 'npm-security-checker' + paths: + - npm-security-checker-report.json allow_failure: true phpcs: stage: CodingStandards + before_script: + - composer install + cache: + paths: + - vendor/ script: - - phpcs --report=junit --report-file=phpcs-report.xml + - vendor/bin/phpcs --report=junit --report-file=phpcs-report.xml artifacts: when: on_failure expose_as: 'phpcs' diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..11298b4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,23 @@ +{ + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#595926", + "activityBar.activeBorder": "#439c9c", + "activityBar.background": "#595926", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#439c9c", + "activityBarBadge.foreground": "#15202b", + "sash.hoverBorder": "#595926", + "statusBar.background": "#353517", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#595926", + "statusBarItem.remoteBackground": "#353517", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#353517", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#35351799", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.remoteColor": "#353517", + "vue3snippets.enable-compile-vue-file-on-did-save-code": true +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index f8ff2fe..b0c689c 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,8 @@ namespace App\Console; +use App\Jobs\RangesStatusUpdate; +use App\Jobs\ProductStatusUpdate; use App\Jobs\SlidersStatusUpdate; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -17,6 +19,8 @@ class Kernel extends ConsoleKernel protected function schedule(Schedule $schedule) { $schedule->job(SlidersStatusUpdate::class)->everyMinute(); + $schedule->job(RangesStatusUpdate::class)->everyMinute(); + $schedule->job(ProductStatusUpdate::class)->everyMinute(); } /** diff --git a/app/Enums/Products/ProductLabelEnum.php b/app/Enums/Products/ProductLabelEnum.php new file mode 100644 index 0000000..a685d81 --- /dev/null +++ b/app/Enums/Products/ProductLabelEnum.php @@ -0,0 +1,47 @@ + 0, + 'lr' => 1, + 'bea' => 2, + 'nutriscore' => 3, + 'planetscore' => 4 + ]; + } + + /** + * Enum labels + * + * @return array + */ + protected static function labels(): array + { + return [ + 'bio' => trans('Bio'), + 'lr' => trans('Label Rouge'), + 'bea' => trans('Bea'), + 'nutriscore' => trans('Nutriscore'), + 'planetscore' => trans('PlanetScore'), + ]; + } +} diff --git a/app/Enums/Ranges/RangeCategoryEnum.php b/app/Enums/Ranges/RangeCategoryEnum.php new file mode 100644 index 0000000..9a0ab95 --- /dev/null +++ b/app/Enums/Ranges/RangeCategoryEnum.php @@ -0,0 +1,41 @@ + 0, + 'egg' => 1, + 'partners' => 2 + ]; + } + + /** + * Enum labels + * + * @return array + */ + protected static function labels(): array + { + return [ + 'poultry' => trans('🐔 Vollaille'), + 'egg' => trans('🥚 Oeuf'), + 'partners' => trans('🤝 Produits partenaires'), + ]; + } +} diff --git a/app/Http/Controllers/Bo/ProductController.php b/app/Http/Controllers/Bo/ProductController.php new file mode 100644 index 0000000..426c892 --- /dev/null +++ b/app/Http/Controllers/Bo/ProductController.php @@ -0,0 +1,153 @@ +search) { + $this->searchQuery( + $products, + $request->search, + // * Search in tags + function ($q) use ($request) { + $q->orWhereHas('tags', function ($q) use ($request) { + $q->whereRaw( + 'UPPER(CONCAT(`tags`.`name`)) LIKE UPPER(?)', + ['%' . filter_var($request->search, FILTER_SANITIZE_STRING) . '%'] + ); + }); + }, + 'title', + 'description' + ); + } + + $this->sortQuery($products); + $searchFields = trans('Titre, Description'); + + $products->orderBy('updated_at', 'DESC'); + $products = $products->paginate(); + + return view('back.products.index', compact('products', 'searchFields')); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $ranges = Range::all(); + return view('back.products.create', compact('ranges')); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\Products\StoreProductRequest $request + * @return \Illuminate\Http\Response + */ + public function store(StoreProductRequest $request) + { + return DB::transaction(function () use ($request) { + $product = new Product(); + $product->fill($request->validated()); + + if ($product->saveOrFail()) { + return redirect() + ->route('bo.products.edit', $product) + ->with('success', trans( + ':model a été créé', + ['model' => Str::singular(trans('models.classes.products'))] + )); + } + return back(); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\Product $product + * @return \Illuminate\Http\Response + */ + public function edit(Product $product) + { + $ranges = Range::all(); + return view('back.products.edit', [ + 'productModel' => $product, + 'ranges' => $ranges, + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\Products\UpdateProductRequest $request + * @param \App\Models\Product $product + * @return \Illuminate\Http\Response + */ + public function update(UpdateProductRequest $request, Product $product) + { + return DB::transaction(function () use ($request, $product) { + $product->fill($request->validated()); + /** @var \App\Models\IncoNutritionalValue */ + $nut = $product->incoNutritionalValues()->firstOrNew(); + $nut->fill($request->validated()); + $nut->saveOrFail(); + + if ($product->saveOrFail()) { + return redirect() + ->route('bo.products.edit', $product) + ->with('success', trans( + ':model a été mis à jour', + ['model' => Str::singular(trans('models.classes.products'))] + )); + } + return back(); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Product $product + * @return \Illuminate\Http\Response + */ + public function destroy(Product $product) + { + if ($product->deleteOrFail()) { + return redirect() + ->route('bo.products.index') + ->with('warning', trans( + ':model a bien été supprimé', + ['model' => Str::singular(trans('models.classes.products'))] + )); + } + return back(); + } +} diff --git a/app/Http/Controllers/Bo/RangeController.php b/app/Http/Controllers/Bo/RangeController.php new file mode 100644 index 0000000..039f905 --- /dev/null +++ b/app/Http/Controllers/Bo/RangeController.php @@ -0,0 +1,197 @@ +search) { + $this->searchQuery( + $ranges, + $request->search, + // * Search in tags + function ($q) use ($request) { + $q->orWhereHas('tags', function ($q) use ($request) { + $q->whereRaw( + 'UPPER(CONCAT(`tags`.`name`)) LIKE UPPER(?)', + ['%' . filter_var($request->search, FILTER_SANITIZE_STRING) . '%'] + ); + }); + }, + 'title', + 'description' + ); + } + + $this->sortQuery($ranges); + $searchFields = trans('Titre, Description'); + + $ranges->orderBy('updated_at', 'DESC'); + $ranges = $ranges->paginate(); + + return view('back.ranges.index', compact('ranges', 'searchFields')); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + return view('back.ranges.create'); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\Ranges\StoreRangeRequest $request + * @return \Illuminate\Http\Response + */ + public function store(StoreRangeRequest $request) + { + return DB::transaction(function () use ($request) { + $range = new Range(); + $range->fill($request->validated()); + + if ($range->saveOrFail()) { + return redirect() + ->route('bo.ranges.edit', $range) + ->with('success', trans( + ':model a été créé', + ['model' => Str::singular(trans('models.classes.ranges'))] + )); + } + return back(); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\Range $range + * @return \Illuminate\Http\Response + */ + public function edit(Range $range) + { + return view('back.ranges.edit', [ + 'rangeModel' => $range + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\Ranges\UpdateRangeRequest $request + * @param \App\Models\Range $range + * @return \Illuminate\Http\Response + */ + public function update(UpdateRangeRequest $request, Range $range) + { + return DB::transaction(function () use ($request, $range) { + $range->fill($request->validated()); + + if ($range->saveOrFail()) { + return redirect() + ->route('bo.ranges.edit', $range) + ->with('success', trans( + ':model a été mis à jour', + ['model' => Str::singular(trans('models.classes.ranges'))] + )); + } + return back(); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Range $range + * @return \Illuminate\Http\Response + */ + public function destroy(Range $range) + { + if ($range->deleteOrFail()) { + return redirect() + ->route('bo.ranges.index') + ->with('warning', trans( + ':model a bien été supprimé', + ['model' => Str::singular(trans('models.classes.ranges'))] + )); + } + return back(); + } + + /** + * Search uris for ranges input links + * + * @param \App\Http\Requests\Bo\Ranges\RangeSearchUriRequest $request + * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + */ + public function searchUri(RangeSearchUriRequest $request) + { + + /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Breeder> */ + $breeders = Breeder::where('firstname', 'LIKE', "%$request->search%") + ->orWhere('lastname', 'LIKE', "%$request->search%") + ->orderBy('updated_at')->paginate(); + + /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Recipe> */ + $recipes = Recipe::where('title', 'LIKE', "%$request->search%") + ->orWhere('slug', 'LIKE', "%$request->search%") + ->orderBy('updated_at')->paginate(); + + return new UriResource( + collect($breeders->all()) + ->merge($recipes->all()) + ); + } + + /** + * Get Model title input text uri (from DB value) + * + * @param \App\Http\Requests\Bo\Ranges\RangeModelTitleRequest $request + * @return \Illuminate\Http\Response + */ + public function modelTitle(RangeModelTitleRequest $request) + { + $title = ''; + switch ($request->model) { + case Breeder::class: + /** @var \App\Models\Breeder */ + $breeder = Breeder::whereId($request->id)->first(); + $title = \trim(optional($breeder)->lastname . ' ' . optional($breeder)->firstname); + break; + case Recipe::class: + $title = Recipe::whereId($request->id)->first()->title ?? ''; + break; + } + return \response()->json($title); + } +} diff --git a/app/Http/Controllers/Bo/SliderController.php b/app/Http/Controllers/Bo/SliderController.php index 79ca0a5..b470aeb 100644 --- a/app/Http/Controllers/Bo/SliderController.php +++ b/app/Http/Controllers/Bo/SliderController.php @@ -4,20 +4,19 @@ namespace App\Http\Controllers\Bo; use App\Enums\Sliders\SliderType; use App\Http\Controllers\Controller; -use App\Http\Requests\Bo\ChangeOrderRequest; use App\Http\Requests\Bo\Sliders\StoreSliderRequest; use App\Http\Requests\Bo\Sliders\UpdateSliderRequest; use App\Models\Slider; use App\Traits\Controllers\UpdateModelStatus; -use Illuminate\Database\Eloquent\ModelNotFoundException; +use App\Traits\Models\ChangesModelOrder; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Session; use Illuminate\Support\Str; use Kwaadpepper\Enum\Exceptions\EnumNotRoutableException; class SliderController extends Controller { + use ChangesModelOrder; use UpdateModelStatus; /** @@ -145,43 +144,4 @@ class SliderController extends Controller } return back(); } - - /** - * Change Item Order - * - * @param \App\Http\Requests\Bo\ChangeOrderRequest $request - * @param \App\Models\Slider $slider - * @return \Illuminate\Http\RedirectResponse - */ - public function changeOrder(ChangeOrderRequest $request, Slider $slider) - { - try { - DB::transaction(function () use ($request, $slider) { - $tmp = Slider::query(); - if ($request->action === 'up') { - // * Push Item upward - $tmp->where('order', '<', $slider->order) - ->orderBy('order', 'DESC'); - } else { - // * Push Item downward - $tmp->where('order', '>', $slider->order) - ->orderBy('order', 'ASC'); - } - $tmp->whereType('type', $slider->type); - $tmp = $tmp->firstOrFail(); - $newOrder = $tmp->order; - $tmp->order = $slider->order; - $slider->order = $newOrder; - if (!$slider->saveOrFail() or !$tmp->saveOrFail()) { - throw new \ErrorException("Error Processing Request", 1); - } - }); - } catch (\ErrorException | ModelNotFoundException $e) { - Session::flash('error', trans('Erreur lors de la modification de l\'ordre :message', [ - 'message' => $e->getMessage() - ])); - } //end try - - return redirect()->back(); - } } diff --git a/app/Http/Requests/Bo/Products/StoreProductRequest.php b/app/Http/Requests/Bo/Products/StoreProductRequest.php new file mode 100644 index 0000000..ecb85fc --- /dev/null +++ b/app/Http/Requests/Bo/Products/StoreProductRequest.php @@ -0,0 +1,141 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation() + { + $this->merge([ + 'slug' => Str::slug($this->title), + 'status' => $this->status ? true : false, + 'show_ingredients' => $this->show_ingredients ? true : false, + 'show_preparation_advices' => $this->show_preparation_advices ? true : false, + 'show_sales_pitch' => $this->show_sales_pitch ? true : false, + 'show_allergen_list' => $this->show_allergen_list ? true : false, + 'show_nutrionnal_values' => $this->show_nutrionnal_values ? true : false, + 'show_portions' => $this->show_portions ? true : false, + 'labels' => $this->labels ?? [] + ]); + $this->mergePicture(); + $this->mergePicture('picture_thumb'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return \array_merge( + [ + 'title' => 'required|min:6|max:255', + 'slug' => 'required|max:255', + 'seo_title' => 'required|min:45|max:70', + 'seo_description' => 'required|min:50|max:160', + 'description' => 'required|string|min:15', + 'picture_alt' => 'required_with:picture|nullable|string|min:6|max:255', + 'picture_title' => 'required_with:picture|nullable|string|min:6|max:255', + 'picture_thumb_alt' => 'required_with:picture_thumb|nullable|string|min:6|max:255', + 'picture_thumb_title' => 'required_with:picture_thumb|nullable|string|min:6|max:255', + 'publish_at' => 'nullable|date_format:Y-m-d\TH:i', + 'unpublish_at' => 'nullable|date_format:Y-m-d\TH:i', + 'status' => 'required|boolean', + 'range_id' => 'required|exists:ranges,id', + + 'ingredients' => 'required|string|min:15', + 'preparation_advices' => 'required|string|min:15', + 'sales_pitch' => 'required|string|min:15', + 'allergen_list' => 'required|string|min:15', + 'number_portion' => 'required|numeric|min:0', + + 'show_ingredients' => 'required|boolean', + 'show_preparation_advices' => 'required|boolean', + 'show_sales_pitch' => 'required|boolean', + 'show_allergen_list' => 'required|boolean', + 'show_nutrionnal_values' => 'required|boolean', + 'show_portions' => 'required|boolean', + + 'labels' => 'sometimes|array', + 'labels.*' => 'sometimes|array', + 'labels.*.value' => ['required', new EnumIsValidRule(ProductLabelEnum::class)], + + 'weight' => 'required|numeric', + 'energy' => 'required|numeric', + 'energy_kj' => 'required|numeric', + 'protein' => 'required|numeric', + 'carbohydrates' => 'required|numeric', + 'sugar' => 'required|numeric', + 'fat' => 'required|numeric', + 'saturated_fatty_acids' => 'required|numeric', + 'dietary_fiber' => 'required|numeric', + 'salt' => 'required|numeric', + ], + $this->pictureRules('picture', 700, 700, 700, 700), + $this->pictureRules('picture_thumb', 300, 300, 300, 300) + ); + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'title' => trans('title'), + 'slug' => trans('title'), + 'seo_title' => trans('title') . ' seo', + 'seo_description' => trans('description') . ' seo', + 'description' => trans('description'), + 'picture' => trans('illustration'), + 'picture_alt' => trans('Texte alternatif de l\'illustration'), + 'picture_title' => trans('Titre de l\'illustration'), + 'picture_thumb' => trans('vignette'), + 'picture_thumb_alt' => trans('Texte alternatif de la vignette'), + 'picture_thumb_title' => trans('Titre de la vignette'), + 'status' => trans('publié ?'), + 'publish_at' => trans('date de publication'), + 'unpublish_at' => trans('date de dépublication'), + + 'nutritional' => trans('valeurs nutritionelles'), + 'nutritional.energy' => trans('énergie'), + 'nutritional.energy_kj' => trans('énergie kj'), + 'nutritional.protein' => trans('protéines'), + 'nutritional.carbohydrates' => trans('glucides'), + 'nutritional.sugar' => trans('sucres'), + 'nutritional.fat' => trans('matière grasse'), + 'nutritional.saturated_fatty_acids' => trans('acides gras saturés'), + 'nutritional.dietary_fiber' => trans('fibres alimentaires'), + 'nutritional.salt' => trans('sel'), + ]; + } +} diff --git a/app/Http/Requests/Bo/Products/UpdateProductRequest.php b/app/Http/Requests/Bo/Products/UpdateProductRequest.php new file mode 100644 index 0000000..1d4ce71 --- /dev/null +++ b/app/Http/Requests/Bo/Products/UpdateProductRequest.php @@ -0,0 +1,10 @@ +check() and $this->json(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'id' => 'required|numeric', + 'model' => [ + \sprintf('in:%s,%s', Breeder::class, Recipe::class), + // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed,Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed + function ($attribute, $value, $fail) { + $table = (new $value())->getTable(); + Validator::validate(['model' => $this->id], [ + 'model' => "required|exists:{$table},id", + ]); + } + ] + ]; + } +} diff --git a/app/Http/Requests/Bo/Ranges/RangeSearchUriRequest.php b/app/Http/Requests/Bo/Ranges/RangeSearchUriRequest.php new file mode 100644 index 0000000..ac723e3 --- /dev/null +++ b/app/Http/Requests/Bo/Ranges/RangeSearchUriRequest.php @@ -0,0 +1,31 @@ +check() and $this->json(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'search' => 'required|string', + 'page' => 'sometimes|numeric', + ]; + } +} diff --git a/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php b/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php new file mode 100644 index 0000000..58a4da0 --- /dev/null +++ b/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php @@ -0,0 +1,128 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation() + { + $this->merge([ + 'slug' => Str::slug($this->title), + 'status' => $this->status ? true : false + ]); + $this->mergePicture(); + $this->mergePicture('picture_thumb'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return \array_merge( + [ + 'title' => 'required|min:6|max:255', + 'slug' => 'required|max:255', + 'category' => ['required', new EnumIsValidRule(RangeCategoryEnum::class)], + 'seo_title' => 'required|min:45|max:70', + 'seo_description' => 'required|min:50|max:160', + 'description' => 'required|string|min:15', + 'picture_alt' => 'required_with:picture|nullable|string|min:6|max:255', + 'picture_title' => 'required_with:picture|nullable|string|min:6|max:255', + 'picture_thumb_alt' => 'required_with:picture_thumb|nullable|string|min:6|max:255', + 'picture_thumb_title' => 'required_with:picture_thumb|nullable|string|min:6|max:255', + 'publish_at' => 'nullable|date_format:Y-m-d\TH:i', + 'unpublish_at' => 'nullable|date_format:Y-m-d\TH:i', + 'status' => 'required|boolean', + 'link1' => self::getUrlValidationRules(), + 'link2' => self::getUrlValidationRules(), + ], + $this->pictureRules('picture', 700, 700, 700, 700), + $this->pictureRules('picture_thumb', 300, 300, 300, 300) + ); + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'title' => trans('title'), + 'slug' => trans('title'), + 'seo_title' => trans('title') . ' seo', + 'seo_description' => trans('description') . ' seo', + 'description' => trans('description'), + 'picture' => trans('illustration'), + 'picture_alt' => trans('Texte alternatif de l\'illustration'), + 'picture_title' => trans('Titre de l\'illustration'), + 'picture_thumb' => trans('vignette'), + 'picture_thumb_alt' => trans('Texte alternatif de la vignette'), + 'picture_thumb_title' => trans('Titre de la vignette'), + 'status' => trans('publié ?'), + 'publish_at' => trans('date de publication'), + 'unpublish_at' => trans('date de dépublication'), + 'link1' => trans('lien 1'), + 'link2' => trans('lien 2'), + ]; + } + + /** + * Url validation rules + * Validates an internal url format + * + * @return array + */ + public static function getUrlValidationRules(): array + { + // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed + return ['nullable', function ($attribute, $value, $fail) { + $params = collect(\explode('#', \ltrim(\rtrim($value, '#'), '#'))); + if ( + !\in_array( + $params->get(0), + [Breeder::class, Recipe::class] + ) + ) { + $fail(trans('Invalid internal url')); + return; + } + // Check if model id exists. Param 0 is class, 1 is id. + if (!\forward_static_call([$params->get(0), 'find'], $params->get(1))) { + $fail(trans("$attribute n\'est plus un lien valide.")); + } + }]; + } +} diff --git a/app/Http/Requests/Bo/Ranges/UpdateRangeRequest.php b/app/Http/Requests/Bo/Ranges/UpdateRangeRequest.php new file mode 100644 index 0000000..a093c0c --- /dev/null +++ b/app/Http/Requests/Bo/Ranges/UpdateRangeRequest.php @@ -0,0 +1,10 @@ +resource; + return [ + 'class' => Breeder::class, + 'label' => \trim("{$model->lastname} {$model->firstname}"), + 'value' => $model->id + ]; + } +} diff --git a/app/Http/Resources/RecipeUriResource.php b/app/Http/Resources/RecipeUriResource.php new file mode 100644 index 0000000..a381987 --- /dev/null +++ b/app/Http/Resources/RecipeUriResource.php @@ -0,0 +1,27 @@ +resource; + return [ + 'class' => Recipe::class, + 'label' => \trim("{$model->title}"), + 'value' => $model->id + ]; + } +} diff --git a/app/Http/Resources/UriResource.php b/app/Http/Resources/UriResource.php new file mode 100644 index 0000000..0daaec6 --- /dev/null +++ b/app/Http/Resources/UriResource.php @@ -0,0 +1,37 @@ +resource; + return $collection->map(function (Model $model) { + switch (\get_class($model)) { + case Breeder::class: + return new BreederUriResource($model); + case Recipe::class: + return new RecipeUriResource($model); + default: + throw new \RuntimeException(sprintf( + 'Unhandled model %s', + \get_class($model) + )); + } + }); + } +} diff --git a/app/Jobs/ProductStatusUpdate.php b/app/Jobs/ProductStatusUpdate.php new file mode 100644 index 0000000..2dc74ab --- /dev/null +++ b/app/Jobs/ProductStatusUpdate.php @@ -0,0 +1,41 @@ +toDateTime()) + ->whereNotNull('publish_at') + ->whereStatus(false)->get(); + Log::debug(__CLASS__ . " products to publish " . $productsToPublish->count()); + foreach ($productsToPublish as $product) { + $product->publish_at = null; + $product->status = true; + $product->saveOrFail(); + } + $productsToUnPublish = Product::where('unpublish_at', '<=', Carbon::now()->toDateTime()) + ->whereNotNull('unpublish_at') + ->whereStatus(true)->get(); + Log::debug(__CLASS__ . " products to unpublish " . $productsToPublish->count()); + foreach ($productsToUnPublish as $product) { + $product->unpublish_at = null; + $product->status = false; + $product->saveOrFail(); + } + } +} diff --git a/app/Jobs/RangesStatusUpdate.php b/app/Jobs/RangesStatusUpdate.php new file mode 100644 index 0000000..de93de0 --- /dev/null +++ b/app/Jobs/RangesStatusUpdate.php @@ -0,0 +1,41 @@ +toDateTime()) + ->whereNotNull('publish_at') + ->whereStatus(false)->get(); + Log::debug(__CLASS__ . " ranges to publish " . $rangesToPublish->count()); + foreach ($rangesToPublish as $range) { + $range->publish_at = null; + $range->status = true; + $range->saveOrFail(); + } + $rangesToUnPublish = Range::where('unpublish_at', '<=', Carbon::now()->toDateTime()) + ->whereNotNull('unpublish_at') + ->whereStatus(true)->get(); + Log::debug(__CLASS__ . " ranges to unpublish " . $rangesToPublish->count()); + foreach ($rangesToUnPublish as $range) { + $range->unpublish_at = null; + $range->status = false; + $range->saveOrFail(); + } + } +} diff --git a/app/Lib/ToolboxHelper.php b/app/Lib/ToolboxHelper.php index dcc71da..f2e4e2c 100644 --- a/app/Lib/ToolboxHelper.php +++ b/app/Lib/ToolboxHelper.php @@ -192,6 +192,50 @@ class ToolboxHelper } } + /** + * Remove pictures in ckeditor + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $attribute + * @return void + */ + public static function removeImagesOnCkEditor(Model $model, string $attribute) + { + // * Remove inline uploaded images + collect(ToolboxHelper::getCkEditorLocalUploadedFiles($model->getOriginal($attribute))) + ->map(function (string $originalPicturePath) { + // * If a picture is not used anymore + if (File::exists(\public_path($originalPicturePath))) { + File::delete(\public_path($originalPicturePath)); + } + }); + } + /** + * Remove unused pictures in ckeditor + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $attribute + * @return void + */ + public static function removeUnusedImagesOnCkEditor(Model $model, string $attribute) + { + // * Remove unused inline uploaded images + if ($model->{$attribute} != $model->getOriginal($attribute)) { + $updatedPicturesPath = collect( + ToolboxHelper::getCkEditorLocalUploadedFiles($model->{$attribute}) + ); + collect(ToolboxHelper::getCkEditorLocalUploadedFiles($model->getOriginal($attribute))) + ->map(function (string $originalPicturePath) use ($updatedPicturesPath) { + // * If a picture is not used anymore + if (!$updatedPicturesPath->contains($originalPicturePath)) { + if (File::exists(\public_path($originalPicturePath))) { + File::delete(\public_path($originalPicturePath)); + } + } + }); + } + } + /** * Store an image of different types * diff --git a/app/Models/Breeder.php b/app/Models/Breeder.php new file mode 100644 index 0000000..d771816 --- /dev/null +++ b/app/Models/Breeder.php @@ -0,0 +1,11 @@ + 'weight', + 'val_energ_kcal_r' => 'energy', + 'val_energ_kj_r' => 'energy_kj', + 'proteine_r' => 'protein', + 'sucre_r' => 'sugar', + 'mat_grass_r' => 'fat', + 'fib_alim_r' => 'dietary_fiber', + 'glucides_r' => 'carbohydrates', + 'ags_r' => 'saturated_fatty_acids', + 'sel_r' => 'salt' + ]; + $o = []; + + foreach ($cvt as $k => $t) { + $o[$t] = $xmlInco[$k] ?? null; + } + + return $o; + } + + // * RELATIONSHIPS + + /** + * BelongsTo product relation + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function product() + { + return $this->belongsTo(Product::class); + } +} diff --git a/app/Models/News.php b/app/Models/News.php index 7c3356f..8b5ebf1 100644 --- a/app/Models/News.php +++ b/app/Models/News.php @@ -6,7 +6,6 @@ use App\Enums\PublishedStatus; use App\Lib\ToolboxHelper; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\File; use Illuminate\Support\Str; use Kwaadpepper\Enum\Traits\CastsEnums; @@ -85,27 +84,14 @@ class News extends Model } }); static::updated(function (self $model) { - // * Remove unused inline uploaded images - if ($model->content != $model->getOriginal('content')) { - $updatedPicturesPath = collect( - ToolboxHelper::getCkEditorLocalUploadedFiles($model->content) - ); - collect(ToolboxHelper::getCkEditorLocalUploadedFiles($model->getOriginal('content'))) - ->map(function (string $originalPicturePath) use ($updatedPicturesPath) { - // * If a picture is not used anymore - if (!$updatedPicturesPath->contains($originalPicturePath)) { - if (File::exists(\public_path($originalPicturePath))) { - File::delete(\public_path($originalPicturePath)); - } - } - }); - } + ToolboxHelper::removeUnusedImagesOnCkEditor($model, 'content'); if ($model->picture != $model->getOriginal('picture')) { $model->picture = ToolboxHelper::removeOldImage($model, 'picture'); } }); static::deleting(function (self $model) { ToolboxHelper::removeImage($model, 'picture'); + ToolboxHelper::removeImagesOnCkEditor($model, 'content'); }); } diff --git a/app/Models/Product.php b/app/Models/Product.php new file mode 100644 index 0000000..74d3031 --- /dev/null +++ b/app/Models/Product.php @@ -0,0 +1,204 @@ + 'array', + 'status' => 'bool', + 'show_ingredients' => 'bool', + 'show_preparation_advices' => 'bool', + 'show_sales_pitch' => 'bool', + 'show_allergen_list' => 'bool', + 'show_nutrionnal_values' => 'bool', + 'publish_at' => 'datetime', + 'unpublish_at' => 'datetime' + ]; + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted() + { + static::creating(function (self $model) { + static::assertTitleIsUnique($model->title); + self::validateLabels($model->labels); + $model->slug = Str::slug($model->title); + ToolboxHelper::assertNoInternalBoUrls('description', $model->description); + ToolboxHelper::assertNoInternalBoUrls('ingredients', $model->ingredients); + ToolboxHelper::assertNoInternalBoUrls('preparation_advices', $model->preparation_advices); + ToolboxHelper::assertNoInternalBoUrls('sales_pitch', $model->sales_pitch); + ToolboxHelper::assertNoInternalBoUrls('allergen_list', $model->allergen_list); + $model->slug = Str::slug($model->title); + $model->description = clean($model->description); + $model->ingredients = clean($model->ingredients); + $model->preparation_advices = clean($model->preparation_advices); + $model->sales_pitch = clean($model->sales_pitch); + $model->allergen_list = clean($model->allergen_list); + $model->picture = ToolboxHelper::storeImage($model, $model->picture); + $model->picture_thumb = ToolboxHelper::storeImage($model, $model->picture_thumb); + if (!$model->status) { + $model->publish_at = null; + } else { + $model->unpublish_at = null; + } + }); + static::updating(function (self $model) { + static::assertTitleIsUnique($model->title, $model->id); + self::validateLabels($model->labels); + $model->slug = Str::slug($model->title); + ToolboxHelper::assertNoInternalBoUrls('description', $model->description); + ToolboxHelper::assertNoInternalBoUrls('ingredients', $model->ingredients); + ToolboxHelper::assertNoInternalBoUrls('preparation_advices', $model->preparation_advices); + ToolboxHelper::assertNoInternalBoUrls('sales_pitch', $model->sales_pitch); + ToolboxHelper::assertNoInternalBoUrls('allergen_list', $model->allergen_list); + $model->slug = Str::slug($model->title); + $model->description = clean($model->description); + $model->ingredients = clean($model->ingredients); + $model->preparation_advices = clean($model->preparation_advices); + $model->sales_pitch = clean($model->sales_pitch); + $model->allergen_list = clean($model->allergen_list); + // * Store new picture if changed + if ($model->picture != $model->getOriginal('picture')) { + $model->picture = ToolboxHelper::storeImage($model, $model->picture); + } + // * Store new picture_thumb if changed + if ($model->picture_thumb != $model->getOriginal('picture_thumb')) { + $model->picture_thumb = ToolboxHelper::storeImage($model, $model->picture_thumb); + } + }); + static::updated(function (self $model) { + ToolboxHelper::removeUnusedImagesOnCkEditor($model, 'description'); + ToolboxHelper::removeUnusedImagesOnCkEditor($model, 'ingredients'); + ToolboxHelper::removeUnusedImagesOnCkEditor($model, 'preparation_advices'); + ToolboxHelper::removeUnusedImagesOnCkEditor($model, 'sales_pitch'); + ToolboxHelper::removeUnusedImagesOnCkEditor($model, 'allergen_list'); + if ($model->picture != $model->getOriginal('picture')) { + $model->picture = ToolboxHelper::removeOldImage($model, 'picture'); + } + }); + static::deleting(function (self $model) { + ToolboxHelper::removeImage($model, 'picture'); + ToolboxHelper::removeImage($model, 'picture_thumb'); + ToolboxHelper::removeImagesOnCkEditor($model, 'description'); + ToolboxHelper::removeImagesOnCkEditor($model, 'ingredients'); + ToolboxHelper::removeImagesOnCkEditor($model, 'preparation_advices'); + ToolboxHelper::removeImagesOnCkEditor($model, 'sales_pitch'); + ToolboxHelper::removeImagesOnCkEditor($model, 'allergen_list'); + }); + } + + // * RELATIONSHIPS + + /** + * HasOne incoNutritionalValue relation + * + * @return \Illuminate\Database\Eloquent\Relations\HasOne + */ + public function incoNutritionalValues() + { + return $this->hasOne(IncoNutritionalValue::class); + } + + /** + * BelongsTo range relation + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function range() + { + return $this->belongsTo(Range::class); + } + + // * METHODS + + /** + * Asserts using validation that the title is unique + * + * @param mixed $title + * @param integer|null $id + * @return void + * @throws \Illuminate\Validation\ValidationException If an actu title already exists. + */ + private static function assertTitleIsUnique($title, ?int $id = null) + { + $table = (new self())->getTable(); + ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id); + ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id); + } + + /** + * + * @param array $labels + * @return void + * @throws \Illuminate\Validation\ValidationException If a label is invalid. + */ + private static function validateLabels(array $labels) + { + collect($labels)->map(function ($label) { + if (!\is_object($label) or !($label instanceof ProductLabelEnum)) { + if ( + !\is_array($label) or + !\array_key_exists('value', $label) or + !\in_array($label['value'], ProductLabelEnum::toValues()) + ) { + throw ValidationException::withMessages([ + 'labels' => 'Invalid label given' + ]); + } + } + }); + } +} diff --git a/app/Models/Range.php b/app/Models/Range.php new file mode 100644 index 0000000..42826d2 --- /dev/null +++ b/app/Models/Range.php @@ -0,0 +1,180 @@ + RangeCategoryEnum::class + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'status' => 'bool', + 'publish_at' => 'datetime', + 'unpublish_at' => 'datetime' + ]; + + /** + * Perform any actions required after the model boots. + * + * @return void + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh + */ + protected static function booted() + { + // phpcs:enable + static::creating(function (self $model) { + static::assertTitleIsUnique($model->title); + ToolboxHelper::assertNoInternalBoUrls('description', $model->description); + $model->slug = Str::slug($model->title); + $model->description = clean($model->description); + $model->picture = ToolboxHelper::storeImage($model, $model->picture); + $model->picture_thumb = ToolboxHelper::storeImage($model, $model->picture_thumb); + if (!$model->status) { + $model->publish_at = null; + } else { + $model->unpublish_at = null; + } + if ($model->link1) { + self::validateLinkAttribute('link1', $model->link1); + } + if ($model->link2) { + self::validateLinkAttribute('link2', $model->link2); + } + }); + static::updating(function (self $model) { + static::assertTitleIsUnique($model->title, $model->id); + ToolboxHelper::assertNoInternalBoUrls('description', $model->description); + if ($model->picture != $model->getOriginal('picture')) { + $model->picture = ToolboxHelper::storeImage($model, $model->picture); + } + if ($model->picture_thumb != $model->getOriginal('picture_thumb')) { + $model->picture_thumb = ToolboxHelper::storeImage($model, $model->picture_thumb); + } + // * If status changed + if (\boolval($model->getOriginal('status')) !== $model->status) { + if ($model->status) { + $model->publish_at = null; + Session::flash('info', trans('La gamme est à présent publié')); + } else { + $model->unpublish_at = null; + Session::flash('warning', trans('La gamme est à présent dépublié')); + } + } + if ($model->link1) { + self::validateLinkAttribute('link1', $model->link1); + } + if ($model->link2) { + self::validateLinkAttribute('link2', $model->link2); + } + }); + static::updated(function (self $model) { + if ($model->picture != $model->getOriginal('picture')) { + $model->picture = ToolboxHelper::removeOldImage($model, 'picture'); + } + if ($model->picture_v != $model->getOriginal('picture_v')) { + $model->picture_v = ToolboxHelper::removeOldImage($model, 'picture_v'); + } + }); + static::deleting(function (self $model) { + ToolboxHelper::removeImage($model, 'picture'); + ToolboxHelper::removeImage($model, 'picture_v'); + }); + } + + // * METHODS + + /** + * Asserts using validation that the title is unique + * + * @param mixed $title + * @param integer|null $id + * @return void + * @throws \Illuminate\Validation\ValidationException If an actu title already exists. + */ + private static function assertTitleIsUnique($title, ?int $id = null) + { + $table = (new self())->getTable(); + ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id); + ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id); + } + + /** + * Validates an internal link + * + * @param string $attribute + * @param string $value + * @return void + * @throws \Illuminate\Validation\ValidationException If the $attribute link is invalid. + */ + public static function validateLinkAttribute(string $attribute, string $value): void + { + // Validate case internal url. + $params = collect(\explode('#', \ltrim(\rtrim($value, '#'), '#'))); + if ( + !\in_array( + $params->get(0), + [Breeder::class, Recipe::class] + ) + ) { + throw ValidationException::withMessages([ + $attribute => trans('Le lien contient un modèle invalide \':model\'', [ + 'model' => $params->get(0) + ]) + ]); + } + // Check if model id exists. Param 0 is class, 1 is id. + if (!\forward_static_call([$params->get(0), 'find'], $params->get(1))) { + throw ValidationException::withMessages([ + $attribute => trans('Le lien n\'est plus valide.') + ]); + } + } +} diff --git a/app/Models/Recipe.php b/app/Models/Recipe.php new file mode 100644 index 0000000..a4699ec --- /dev/null +++ b/app/Models/Recipe.php @@ -0,0 +1,45 @@ +title); + }); + static::updating(function (self $model) { + static::assertTitleIsUnique($model->title, $model->id); + }); + } + + // * METHODS + + /** + * Asserts using validation that the title is unique + * + * @param mixed $title + * @param integer|null $id + * @return void + * @throws \Illuminate\Validation\ValidationException If an actu title already exists. + */ + private static function assertTitleIsUnique($title, ?int $id = null) + { + $table = (new self())->getTable(); + ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id); + ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id); + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 297985d..0da5b87 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -4,6 +4,8 @@ namespace App\Providers; use App\Lib\ToolboxHelper; use App\Models\News; +use App\Models\Product; +use App\Models\Range; use App\Models\Slider; use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; @@ -43,6 +45,8 @@ class RouteServiceProvider extends ServiceProvider ->group(base_path('routes/web-fo.php')); }); + Route::model('product', Product::class); + Route::model('range', Range::class); Route::model('slider', Slider::class); Route::model('news', News::class, function ($value) { return News::where(function ($q) use ($value) { diff --git a/app/Traits/Controllers/UpdateModelStatus.php b/app/Traits/Controllers/UpdateModelStatus.php index a3a9842..657e8b4 100644 --- a/app/Traits/Controllers/UpdateModelStatus.php +++ b/app/Traits/Controllers/UpdateModelStatus.php @@ -14,7 +14,7 @@ trait UpdateModelStatus /** * Change model published * - * @param Model $model + * @param \Illuminate\Database\Eloquent\Model $model * @return \Illuminate\Http\RedirectResponse */ public function changePublished(Model $model) diff --git a/app/Traits/Models/ChangesModelOrder.php b/app/Traits/Models/ChangesModelOrder.php new file mode 100644 index 0000000..249c43b --- /dev/null +++ b/app/Traits/Models/ChangesModelOrder.php @@ -0,0 +1,39 @@ +direction ? '<' : '>', $model->order) + ->orderBy('order', $request->direction ? 'DESC' : 'ASC')->first(); + if (!$tmp) { + return back()->with('error', trans('L\'ordre n\'a pas pu être modifié')); + } + $newOrder = $tmp->order; + $tmp->order = $model->order; + $model->order = $newOrder; + $tmp->saveOrFail(); + $model->saveOrFail(); + Session::flash('success', trans('L\'ordre à été modifié')); + return back(); + }); + } +} diff --git a/app/Traits/Requests/HasPicture.php b/app/Traits/Requests/HasPicture.php index e83b03d..1a7a9a6 100644 --- a/app/Traits/Requests/HasPicture.php +++ b/app/Traits/Requests/HasPicture.php @@ -37,6 +37,7 @@ trait HasPicture /** * Image rules * + * @param string $name * @param integer|null $minWith * @param integer|null $minHeight * @param integer|null $maxWith @@ -44,20 +45,23 @@ trait HasPicture * @return array */ public function pictureRules( + string $name = 'picture', ?int $minWith = null, ?int $minHeight = null, ?int $maxWith = null, ?int $maxHeight = null ): array { - $this->minWith = $minWith ?? $this->minWith; - $this->minHeight = $minHeight ?? $this->minHeight; - $this->maxWith = $maxWith ?? $this->maxWith; - $this->maxHeight = $maxHeight ?? $this->maxHeight; + $sizes = (object)[ + 'minWith' => $minWith ?? $this->minWith, + 'minHeight' => $minHeight ?? $this->minHeight, + 'maxWith' => $maxWith ?? $this->maxWith, + 'maxHeight' => $maxHeight ?? $this->maxHeight + ]; return [ - 'picture' => [ + $name => [ 'required', - function (string $attribute, $value, callable $fail) { - return $this->validatePicture($attribute, $value, $fail); + function (string $attribute, $value, callable $fail) use ($sizes) { + return $this->validatePicture($attribute, $value, $fail, $sizes); } ] ]; @@ -66,6 +70,7 @@ trait HasPicture /** * Images rules * + * @param string $name * @param integer|null $minWith * @param integer|null $minHeight * @param integer|null $maxWith @@ -73,22 +78,25 @@ trait HasPicture * @return array */ public function picturesRules( + string $name = 'pictures', ?int $minWith = null, ?int $minHeight = null, ?int $maxWith = null, ?int $maxHeight = null ): array { - $this->minWith = $minWith ?? $this->minWith; - $this->minHeight = $minHeight ?? $this->minHeight; - $this->maxWith = $maxWith ?? $this->maxWith; - $this->maxHeight = $maxHeight ?? $this->maxHeight; + $sizes = (object)[ + 'minWith' => $minWith ?? $this->minWith, + 'minHeight' => $minHeight ?? $this->minHeight, + 'maxWith' => $maxWith ?? $this->maxWith, + 'maxHeight' => $maxHeight ?? $this->maxHeight + ]; return [ - 'pictures' => 'sometimes|array', - 'pictureValidate' => 'required_with:pictures|array', - 'pictureValidate.*' => [ + $name => 'sometimes|array', + "{$name}Validate" => "required_with:{$name}|array", + "{$name}Validate.*" => [ 'required', - function (string $attribute, $value, callable $fail) { - return $this->validatePicture($attribute, $value, $fail); + function (string $attribute, $value, callable $fail) use ($sizes) { + return $this->validatePicture($attribute, $value, $fail, $sizes); } ] ]; @@ -100,10 +108,11 @@ trait HasPicture * @param string $attribute * @param mixed $value * @param callback $fail + * @param object $sizes * @return void * @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed */ - private function validatePicture(string $attribute, $value, callable $fail) + private function validatePicture(string $attribute, $value, callable $fail, object $sizes) { if (!File::exists($value)) { $fail(trans(":attribute n'existe pas dans le système de fichier")); @@ -119,22 +128,22 @@ trait HasPicture $height = intval($dimensions[1]); $xMessage = trans( - ":attribute la largeur doit être comprise entre {$this->minWith}px et {$this->maxWith}px" + ":attribute la largeur doit être comprise entre {$sizes->minWith}px et {$sizes->maxWith}px" ); - if ($this->minWith === $this->maxWith) { - $xMessage = trans(":attribute la largeur doit être de {$this->minWith}px"); + if ($sizes->minWith === $sizes->maxWith) { + $xMessage = trans(":attribute la largeur doit être de {$sizes->minWith}px"); } $yMessage = trans( - ":attribute la hauteur doit être comprise entre {$this->minWith}px et {$this->maxWith}px" + ":attribute la hauteur doit être comprise entre {$sizes->minWith}px et {$sizes->maxWith}px" ); - if ($this->minHeight === $this->maxHeight) { - $yMessage = trans(":attribute la hauteur doit être de {$this->minWith}px"); + if ($sizes->minHeight === $sizes->maxHeight) { + $yMessage = trans(":attribute la hauteur doit être de {$sizes->minWith}px"); } - if (($width < $this->minWith) or ($width > $this->maxWith)) { + if (($width < $sizes->minWith) or ($width > $sizes->maxWith)) { $fail($xMessage); } - if (($height < $this->minHeight) or ($height > $this->maxHeight)) { + if (($height < $sizes->minHeight) or ($height > $sizes->maxHeight)) { $fail($yMessage); } } //end if @@ -143,29 +152,30 @@ trait HasPicture /** * Merges products pictures fields with request data * + * @param string $name * @return void */ - protected function mergePicture(): void + protected function mergePicture(string $name = 'picture'): void { - $picturePath = $this->picture; + $picturePath = $this->{$name}; if (is_string($picturePath)) { - $this->merge(['pictureValidate' => []]); + $this->merge(["{$name}Validate" => []]); // ! Empty picture. if ($picturePath === 'false') { // * Empty picture and exit - $this->merge(['pictures' => []]); + $this->merge([$name => []]); return; } $decodedPath = \urldecode($picturePath); $this->merge([ - 'pictureValidate' => array_merge( - $this->pictureValidate, + "{$name}Validate" => array_merge( + $this->{"{$name}Validate"}, [\public_path(ltrim($decodedPath, '/'))] ) ]); $changedPicture = ltrim($decodedPath, '/'); $this->merge([ - 'picture' => $changedPicture + $name => $changedPicture ]); } //end if } @@ -173,31 +183,32 @@ trait HasPicture /** * Merges products pictures fields with request data * + * @param string $name * @return void */ - protected function mergePictures(): void + protected function mergePictures(string $name = 'pictures'): void { - $pictures = $this->pictures; + $pictures = $this->{$name}; if (is_array($pictures)) { - $this->merge(['pictureValidate' => []]); + $this->merge(["{$name}Validate" => []]); foreach ($pictures as $key => $picturePath) { // ! Empty picture. if ($picturePath === 'false') { // * Empty picture and exit - $this->merge(['pictures' => []]); + $this->merge([$name => []]); return; } $decodedPath = \urldecode($picturePath); $this->merge([ - 'pictureValidate' => array_merge( - $this->pictureValidate, + "{$name}Validate" => array_merge( + $this->{"{$name}Validate"}, [\public_path(ltrim($decodedPath, '/'))] ) ]); - $changedPicture = $this->pictures; + $changedPicture = $this->{$name}; $changedPicture[$key] = ltrim($decodedPath, '/'); $this->merge([ - 'pictures' => $changedPicture + $name => $changedPicture ]); } } //end if diff --git a/composer.json b/composer.json index 9b94e5e..9f856f9 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,8 @@ "@php artisan package:discover --ansi" ], "post-update-cmd": [ - "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + "@php artisan vendor:publish --tag=laravel-assets --ansi --force", + "local-php-security-checker" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" diff --git a/composer.lock b/composer.lock index 75cd379..dc9dda0 100644 --- a/composer.lock +++ b/composer.lock @@ -2569,16 +2569,16 @@ }, { "name": "nesbot/carbon", - "version": "2.58.0", + "version": "2.59.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055" + "reference": "a9000603ea337c8df16cc41f8b6be95a65f4d0f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/97a34af22bde8d0ac20ab34b29d7bfe360902055", - "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a9000603ea337c8df16cc41f8b6be95a65f4d0f5", + "reference": "a9000603ea337c8df16cc41f8b6be95a65f4d0f5", "shasum": "" }, "require": { @@ -2593,11 +2593,12 @@ "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54 || ^1.0", - "phpunit/php-file-iterator": "^2.0.5", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, "bin": [ @@ -2654,15 +2655,19 @@ }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2022-04-25T19:31:17+00:00" + "time": "2022-06-29T21:43:55+00:00" }, { "name": "nikic/php-parser", @@ -3266,16 +3271,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.5", + "version": "v0.11.7", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "c23686f9c48ca202710dbb967df8385a952a2daf" + "reference": "77fc7270031fbc28f9a7bea31385da5c4855cb7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/c23686f9c48ca202710dbb967df8385a952a2daf", - "reference": "c23686f9c48ca202710dbb967df8385a952a2daf", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/77fc7270031fbc28f9a7bea31385da5c4855cb7a", + "reference": "77fc7270031fbc28f9a7bea31385da5c4855cb7a", "shasum": "" }, "require": { @@ -3336,9 +3341,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.5" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.7" }, - "time": "2022-05-27T18:03:49+00:00" + "time": "2022-07-07T13:49:11+00:00" }, { "name": "ralouphie/getallheaders", @@ -6382,16 +6387,16 @@ }, { "name": "facade/ignition", - "version": "2.17.5", + "version": "2.17.6", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "1d71996f83c9a5a7807331b8986ac890352b7a0c" + "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/1d71996f83c9a5a7807331b8986ac890352b7a0c", - "reference": "1d71996f83c9a5a7807331b8986ac890352b7a0c", + "url": "https://api.github.com/repos/facade/ignition/zipball/6acd82e986a2ecee89e2e68adfc30a1936d1ab7c", + "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c", "shasum": "" }, "require": { @@ -6456,7 +6461,7 @@ "issues": "https://github.com/facade/ignition/issues", "source": "https://github.com/facade/ignition" }, - "time": "2022-02-23T18:31:24+00:00" + "time": "2022-06-30T18:26:59+00:00" }, { "name": "fakerphp/faker", diff --git a/database/factories/BreederFactory.php b/database/factories/BreederFactory.php new file mode 100644 index 0000000..50f2bb7 --- /dev/null +++ b/database/factories/BreederFactory.php @@ -0,0 +1,29 @@ + $this->faker->firstName(), + 'lastname' => $this->faker->lastName(), + ]; + } +} diff --git a/database/factories/IncoNutritionalValueFactory.php b/database/factories/IncoNutritionalValueFactory.php new file mode 100644 index 0000000..522878b --- /dev/null +++ b/database/factories/IncoNutritionalValueFactory.php @@ -0,0 +1,50 @@ + $this->faker->boolean(10) ? + null : $this->faker->numberBetween(231 - 150, 231 + 150), + "energy" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(231 - 150, 231 + 150), + "energy_kj" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(964 - 150, 964 + 150), + "protein" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(9.2 - 3, 9.2 + 15), + "carbohydrates" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(20 - 10, 20 + 25), + "sugar" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(1.5 - 1, 1.5 + 6), + "fat" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(12 - 6, 12 + 6), + "saturated_fatty_acids" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(3.4 - 2, 3.4 + 6), + "dietary_fiber" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(2.9 - 2, 2.9 + 6), + "salt" => $this->faker->boolean(10) ? + null : $this->faker->numberBetween(1.1 - 1, 1.1 + 1.1) + ]; + } +} diff --git a/database/factories/ProductFactory.php b/database/factories/ProductFactory.php new file mode 100644 index 0000000..a1033cb --- /dev/null +++ b/database/factories/ProductFactory.php @@ -0,0 +1,53 @@ +faker->unique()->words(\mt_rand(3, 4), true); + return [ + 'title' => $title, + 'slug' => \Illuminate\Support\Str::slug($title), + 'seo_title' => $this->faker->words(8, true), + 'seo_description' => $this->faker->words(25, true), + 'description' => $this->faker->words(25, true), + 'picture' => '/assets/images/products/product_fake_700_700.jpg', + 'picture_title' => $this->faker->words(8, true), + 'picture_alt' => $this->faker->words(8, true), + 'picture_thumb' => '/assets/images/products/product_fake_thumb_300_300.jpg', + 'picture_thumb_title' => $this->faker->words(8, true), + 'picture_thumb_alt' => $this->faker->words(8, true), + 'labels' => collect(ProductLabelEnum::toArray())->random(rand(0, 4))->all(), + 'ingredients' => $this->faker->words(8, true), + 'preparation_advices' => $this->faker->text(\mt_rand(15, 150)), + 'sales_pitch' => $this->faker->text(\mt_rand(15, 150)), + 'allergen_list' => $this->faker->words(8, true), + 'number_portion' => $this->faker->numberBetween(0, 8), + 'status' => $this->faker->boolean(75), + 'show_ingredients' => $this->faker->boolean(75), + 'show_preparation_advices' => $this->faker->boolean(75), + 'show_sales_pitch' => $this->faker->boolean(75), + 'show_allergen_list' => $this->faker->boolean(75), + 'show_nutrionnal_values' => $this->faker->boolean(75), + 'show_portions' => $this->faker->boolean(75), + ]; + } +} diff --git a/database/factories/RangeFactory.php b/database/factories/RangeFactory.php new file mode 100644 index 0000000..5337ddd --- /dev/null +++ b/database/factories/RangeFactory.php @@ -0,0 +1,43 @@ +faker->unique()->words(rand(6, 12), true); + return [ + 'title' => $title, + 'slug' => Str::slug($title), + 'seo_title' => $this->faker->words(8, true), + 'seo_description' => $this->faker->words(25, true), + 'description' => $this->faker->words(25, true), + 'category' => collect(RangeCategoryEnum::toArray())->random(1)->get(0), + 'picture' => '/assets/images/ranges/range_fake_700_700.jpg', + 'picture_title' => $this->faker->words(8, true), + 'picture_alt' => $this->faker->words(8, true), + 'picture_thumb' => '/assets/images/ranges/range_fake_thumb_300_300.jpg', + 'picture_thumb_title' => $this->faker->words(8, true), + 'picture_thumb_alt' => $this->faker->words(8, true), + 'status' => $this->faker->boolean(75), + ]; + } +} diff --git a/database/factories/RecipeFactory.php b/database/factories/RecipeFactory.php new file mode 100644 index 0000000..064a189 --- /dev/null +++ b/database/factories/RecipeFactory.php @@ -0,0 +1,31 @@ +faker->unique()->words(rand(2, 4), true); + return [ + 'title' => $title, + 'slug' => Str::slug($title) + ]; + } +} diff --git a/database/migrations/2022_07_12_113538_create_breeders_table.php b/database/migrations/2022_07_12_113538_create_breeders_table.php new file mode 100644 index 0000000..1a56018 --- /dev/null +++ b/database/migrations/2022_07_12_113538_create_breeders_table.php @@ -0,0 +1,35 @@ +id(); + + $table->string('firstname')->comment('The breeder firstname'); + $table->string('lastname')->comment('The breeder lastname'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('breeders'); + } +} diff --git a/database/migrations/2022_07_12_113555_create_recipes_table.php b/database/migrations/2022_07_12_113555_create_recipes_table.php new file mode 100644 index 0000000..5a2c9d6 --- /dev/null +++ b/database/migrations/2022_07_12_113555_create_recipes_table.php @@ -0,0 +1,35 @@ +id(); + + $table->string('title')->comment('Nom de la recette'); + $table->string('slug')->comment('slug de la recette'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('recipes'); + } +} diff --git a/database/migrations/2022_07_12_164017_create_ranges_table.php b/database/migrations/2022_07_12_164017_create_ranges_table.php new file mode 100644 index 0000000..ad8c5b5 --- /dev/null +++ b/database/migrations/2022_07_12_164017_create_ranges_table.php @@ -0,0 +1,64 @@ +id(); + + $table->string('title')->comment('Nom de la gamme'); + $table->string('slug')->comment('slug de la gamme'); + + $table->string('seo_title') + ->comment('Utilisé pour la balise title de la gamme. De 53 à 60 chars recommandés.'); + $table->string('seo_description') + ->comment('Utilisé pour la balise méta description de la gamme. De 50 à 160 chars recommandés.'); + + $table->text('description')->comment('Description de la gamme'); + + $table->unsignedTinyInteger('category')->comment('Enum Ranges\\RangeCategoryEnum'); + + $table->string('picture')->nullable()->comment('L\'illustration de la gamme 700x700 px.'); + $table->string('picture_title')->nullable()->comment('Attribut title de l\'image.'); + $table->string('picture_alt')->nullable()->comment('Attribut alt de l\'image.'); + + $table->string('picture_thumb')->nullable()->comment('La vignette de la gamme 300x300 px.'); + $table->string('picture_thumb_title')->nullable()->comment('Attribut title de l\'image.'); + $table->string('picture_thumb_alt')->nullable()->comment('Attribut alt de l\'image.'); + + $table->boolean('status')->comment('La gamme est visible ou non'); + + $table->timestamp('publish_at')->nullable() + ->comment('The date where the category status state should be set on.'); + $table->timestamp('unpublish_at')->nullable() + ->comment('The date where the category status state should be set off.'); + + $table->string('link1')->nullable() + ->comment('Category Link 1 #App\Models\Model#ID#, Sould be validated on store and update'); + $table->string('link2')->nullable() + ->comment('Category Link 2 #App\Models\Model#ID#, Sould be validated on store and update'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('ranges'); + } +} diff --git a/database/migrations/2022_07_12_164018_create_products_table.php b/database/migrations/2022_07_12_164018_create_products_table.php new file mode 100644 index 0000000..2ab24e3 --- /dev/null +++ b/database/migrations/2022_07_12_164018_create_products_table.php @@ -0,0 +1,75 @@ +id(); + + $table->string('title')->comment('Nom du produit'); + $table->string('slug')->comment('slug du produit'); + + $table->string('seo_title') + ->comment('Utilisé pour la balise title de la page. De 53 à 60 chars recommandés.'); + $table->string('seo_description') + ->comment('Utilisé pour la balise méta description de la page. De 50 à 160 chars recommandés.'); + + $table->text('description')->comment('Description du produit'); + + $table->string('picture')->nullable()->comment('L\'illustration du produit 700x700 px.'); + $table->string('picture_title')->nullable()->comment('Attribut title de l\'image.'); + $table->string('picture_alt')->nullable()->comment('Attribut alt de l\'image.'); + + $table->string('picture_thumb')->nullable()->comment('La vignette du produit 300x300 px.'); + $table->string('picture_thumb_title')->nullable()->comment('Attribut title de l\'image.'); + $table->string('picture_thumb_alt')->nullable()->comment('Attribut alt de l\'image.'); + + $table->json('labels')->comment('List of Products\\ProductLabelEnum'); + + $table->text('ingredients')->comment('Ingredients'); + $table->text('preparation_advices')->comment('Preparation advices'); + $table->text('sales_pitch')->comment('Arguments de vente'); + $table->text('allergen_list')->comment('Liste allergene issues de inco'); + $table->unsignedTinyInteger('number_portion')->comment('Portion number'); + + $table->boolean('show_ingredients')->comment('Afficher en front ou non.'); + $table->boolean('show_preparation_advices')->comment('Afficher en front ou non.'); + $table->boolean('show_sales_pitch')->comment('Afficher en front ou non.'); + $table->boolean('show_allergen_list')->comment('Afficher en front ou non.'); + $table->boolean('show_nutrionnal_values')->comment('Afficher en front ou non.'); + $table->boolean('show_portions')->comment('Afficher en front ou non.'); + + $table->boolean('status')->comment('Le produit est visible ou non'); + + $table->timestamp('publish_at')->nullable() + ->comment('The date where the product status state should be set on.'); + $table->timestamp('unpublish_at')->nullable() + ->comment('The date where the product status state should be set off.'); + + $table->foreignIdFor(Range::class)->constrained(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('products'); + } +} diff --git a/database/migrations/2022_12_07_135414_create_inco_nutritional_values_table.php b/database/migrations/2022_12_07_135414_create_inco_nutritional_values_table.php new file mode 100644 index 0000000..fad6627 --- /dev/null +++ b/database/migrations/2022_12_07_135414_create_inco_nutritional_values_table.php @@ -0,0 +1,47 @@ +id(); + + $table->double('weight')->nullable(); + $table->double('energy')->nullable(); + $table->double('energy_kj')->nullable(); + $table->double('protein')->nullable(); + $table->double('carbohydrates')->nullable(); + $table->double('sugar')->nullable(); + $table->double('fat')->nullable(); + $table->double('saturated_fatty_acids')->nullable(); + $table->double('dietary_fiber')->nullable(); + $table->double('salt')->nullable(); + + $table->foreignId('product_id'); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('inco_nutritional_values'); + } +} diff --git a/database/seeders/BreederSeeder.php b/database/seeders/BreederSeeder.php new file mode 100644 index 0000000..8d27ca5 --- /dev/null +++ b/database/seeders/BreederSeeder.php @@ -0,0 +1,21 @@ +truncate(); + Breeder::factory(150)->create(); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 0d7afa5..8877448 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -15,7 +15,11 @@ class DatabaseSeeder extends Seeder { $this->call([ NewsSeeder::class, - SliderSeeder::class + SliderSeeder::class, + BreederSeeder::class, + RangeSeeder::class, + RecipeSeeder::class, + ProductSeeder::class, ]); } } diff --git a/database/seeders/IncoNutritionalValueSeeder.php b/database/seeders/IncoNutritionalValueSeeder.php new file mode 100644 index 0000000..41df5fc --- /dev/null +++ b/database/seeders/IncoNutritionalValueSeeder.php @@ -0,0 +1,21 @@ +truncate(); + IncoNutritionalValue::factory(150)->create(); + } +} diff --git a/database/seeders/ProductSeeder.php b/database/seeders/ProductSeeder.php new file mode 100644 index 0000000..16cb45b --- /dev/null +++ b/database/seeders/ProductSeeder.php @@ -0,0 +1,38 @@ +truncate(); + Product::all()->map(function (Product $product) { + $product->deleteOrFail(); + }); + $ranges = Range::all(); + Product::factory(150)->make()->each(function (Product $product) use ($ranges) { + \mt_srand(); + if (\mt_rand(0, 2)) { + $product->range()->associate($ranges->random(1)->first()); + $product->saveOrFail(); + $product->fresh(); + /** @var \App\Models\IncoNutritionalValue $incValue */ + $incValue = IncoNutritionalValue::factory(1)->make()->get(0); + $incValue->product()->associate($product); + $incValue->saveOrFail(); + } + }); + } +} diff --git a/database/seeders/RangeSeeder.php b/database/seeders/RangeSeeder.php new file mode 100644 index 0000000..9f6317a --- /dev/null +++ b/database/seeders/RangeSeeder.php @@ -0,0 +1,22 @@ +map(function (Range $range) { + $range->deleteOrFail(); + }); + Range::factory(8)->create(); + } +} diff --git a/database/seeders/RecipeSeeder.php b/database/seeders/RecipeSeeder.php new file mode 100644 index 0000000..1b59357 --- /dev/null +++ b/database/seeders/RecipeSeeder.php @@ -0,0 +1,20 @@ +create(); + } +} diff --git a/package-lock.json b/package-lock.json index 2cd6566..8ec7028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "srcs", + "name": "loue", "lockfileVersion": 2, "requires": true, "packages": { @@ -12,6 +12,7 @@ "@types/bootstrap": "^5.1.12", "@types/cropperjs": "^1.3.0", "@types/toastify-js": "^1.11.1", + "@types/vue-select": "^3.16.0", "@types/webpack-env": "^1.17.0", "axios": "^0.21", "bootstrap": "^5.1.3", @@ -30,7 +31,8 @@ "ts-loader": "^9.3.0", "typescript": "^4.7.3", "vue": "^3.2.36", - "vue-loader": "^16.8.3" + "vue-loader": "^16.8.3", + "vue-select": "^4.0.0-beta.3" } }, "node_modules/@ampproject/remapping": { @@ -2253,6 +2255,42 @@ "integrity": "sha512-Ef03kGFWseAQYIQwN83WbhRxD+DOd+X6p22j9olA/TnvE0crDMc3fyoctKSpXgEDVWq5l3p98otIdpNX1pOYMA==", "dev": true }, + "node_modules/@types/vue-select": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@types/vue-select/-/vue-select-3.16.0.tgz", + "integrity": "sha512-eUNzHK8tY7fT6fWR3mcN3kq9BznRrFPFvmpBZ66DAz4k9aD27AwT54gvR58O9P+ql7/iC0yVvl5lUTjKZ7K1tA==", + "dev": true, + "dependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/@types/vue-select/node_modules/@vue/compiler-sfc": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.4.tgz", + "integrity": "sha512-WCaF33mlKLSvHDKvOD6FzTa5CI2FlMTeJf3MxJsNP0KDgRoI6RdXhHo9dtvCqV4Sywf9Owm17wTLT1Ymu/WsOQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/@types/vue-select/node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "node_modules/@types/vue-select/node_modules/vue": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.4.tgz", + "integrity": "sha512-8KGyyzFSj/FrKj1y7jyEpv8J4osgZx6Lk1lVzh1aP4BqsXZhATH1r0gdJNz00MMyBhK0/m2cNoPuOZ1NzeiUEw==", + "dev": true, + "dependencies": { + "@vue/compiler-sfc": "2.7.4", + "csstype": "^3.1.0" + } + }, "node_modules/@types/webpack-env": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.17.0.tgz", @@ -9059,6 +9097,15 @@ "webpack": "^4.1.0 || ^5.0.0-0" } }, + "node_modules/vue-select": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-4.0.0-beta.3.tgz", + "integrity": "sha512-sXufbTDluz26a39UUZE9jeh9Hojnn8zr9qDDUlVEBc7E0F+h3+Nzy8YzyFHuVNrrYLmK0zrPkb7hWFulAEW41Q==", + "dev": true, + "peerDependencies": { + "vue": "3.x" + } + }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -11316,6 +11363,44 @@ "integrity": "sha512-Ef03kGFWseAQYIQwN83WbhRxD+DOd+X6p22j9olA/TnvE0crDMc3fyoctKSpXgEDVWq5l3p98otIdpNX1pOYMA==", "dev": true }, + "@types/vue-select": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@types/vue-select/-/vue-select-3.16.0.tgz", + "integrity": "sha512-eUNzHK8tY7fT6fWR3mcN3kq9BznRrFPFvmpBZ66DAz4k9aD27AwT54gvR58O9P+ql7/iC0yVvl5lUTjKZ7K1tA==", + "dev": true, + "requires": { + "vue": "^2.0.0" + }, + "dependencies": { + "@vue/compiler-sfc": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.4.tgz", + "integrity": "sha512-WCaF33mlKLSvHDKvOD6FzTa5CI2FlMTeJf3MxJsNP0KDgRoI6RdXhHo9dtvCqV4Sywf9Owm17wTLT1Ymu/WsOQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "vue": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.4.tgz", + "integrity": "sha512-8KGyyzFSj/FrKj1y7jyEpv8J4osgZx6Lk1lVzh1aP4BqsXZhATH1r0gdJNz00MMyBhK0/m2cNoPuOZ1NzeiUEw==", + "dev": true, + "requires": { + "@vue/compiler-sfc": "2.7.4", + "csstype": "^3.1.0" + } + } + } + }, "@types/webpack-env": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.17.0.tgz", @@ -16483,6 +16568,13 @@ "loader-utils": "^2.0.0" } }, + "vue-select": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-4.0.0-beta.3.tgz", + "integrity": "sha512-sXufbTDluz26a39UUZE9jeh9Hojnn8zr9qDDUlVEBc7E0F+h3+Nzy8YzyFHuVNrrYLmK0zrPkb7hWFulAEW41Q==", + "dev": true, + "requires": {} + }, "vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", diff --git a/package.json b/package.json index e48c64b..79c78f1 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@types/bootstrap": "^5.1.12", "@types/cropperjs": "^1.3.0", "@types/toastify-js": "^1.11.1", + "@types/vue-select": "^3.16.0", "@types/webpack-env": "^1.17.0", "axios": "^0.21", "bootstrap": "^5.1.3", @@ -35,6 +36,7 @@ "ts-loader": "^9.3.0", "typescript": "^4.7.3", "vue": "^3.2.36", - "vue-loader": "^16.8.3" + "vue-loader": "^16.8.3", + "vue-select": "^4.0.0-beta.3" } } diff --git a/resources/assets/images/products/product_fake_700_700.jpg b/resources/assets/images/products/product_fake_700_700.jpg new file mode 100644 index 0000000000000000000000000000000000000000..027ab3f2bea9ec631627194717b825d901ecdd9d GIT binary patch literal 95921 zcmeFZWk6g_()e_xeVHFX#Tc?I}+g#?k5{DOiIeo=^kAftdVL{JO@ z7DQsBJpY$0NOAxN_zC>Q^;S9nURv;7h@6WG)x81E8NX%a=fINVWiHU`YfsKWQg@c2Qi${u&cjpcs z6)_0`DIGNfJsmYIEh8&02P5-67Ft?PQLcOZ0>Z+=3>@N8VuF&qLc)T#Oi*xeaPaQn zQR3rM3Nq0$3I1=VUvB^+>|2@8P?!N!A`~5WKZ9A_Me1;iiVDXiG_`W zdk2ZoLI@x&g@%fbhJk^Oj>HZ|)&uB77{p8ha+oB#)>zD*q=HYAi?CVlH@+p)oBF~k zWaAZzgG)|9Nkz@Z&cVsWEesYB6%&WZD<~={tEj5!8yFfHo0ytGZDDry4vtRVKE8hb z0fF$a@QBD~QPD9escGpMnOWI6#U-U>(o|&DS zUszmP-q_sQ-r3#TKR7)3dU|$#@$K^J`c|)7J^xOBDfU0;MTFD~6&)Q79qU#v6jXm? zMk7MUU=qM2mea+u_9S5ze2PtaKe?#!Ee?y2-WM_(uPIz|R^bh{lUvn(YxaLnvC#iV zn*F2Lzw}xL@X%0@orgvQ$N*m}tshlAx$^|_)Xbl$Kmb?C5L5ak!eEBDUu~NLtxa4; zt%h5IUzg;w+gHLGEARaEXEoG*N1rl}9-GZi+ly=jy~0iwm;4f3b6<*mWPL)_ z-JLnbPLHLnZF}!}LFy64deTw*y2;#vAEhsSd6h)yH(#mP-uBH^h49wL;h}+bRVMCu z;**%261_QZVovTf5=o;-zy1NgpyNJqJ658(S5jZ!{`~qI~mf(Jt#HtZqd6@jv z1xj^MC*PNYSg)ix_B*siqj$n{dwZy8`6X4@hKkVDRzmLQgAL7ts#5CRcNY;mDD-KE z_4fR)S`rjl(y1=MVhDBe7|!RYzcW|e0dR(?r$Iua23!pZKu9c&lZ&TE5T`ETdmYraR-Pcr@GMiPIWf zr@Ub}_S~o1)iX6EuspCV0pM6Ph8HJ~o#?m3M(Sz0?Vm(EE&HS;WU)NRL?x#C*=Rv8 zgA$!n2@BrA))?1MlwHXm=T;Sj)@DsQAo~ ztXFmB?FlcjaXhd7%)~-j;%kn(F&b|=UR1)I zh8T!ie{v2;RZ95<7@3AY)gMJG*E9-~i{uw=dUgH5SQ)-j5~^*`ug7Oec@1%ESJA2hs#wI=_BM{o0| zm>|X8W4Y-D;_*6;w?S^KsRvf{t`G8+2~^kGs+G=4M)FEcBV8L56E{a0CdsVz9K{E) zs;ZbG#R$3Yh5-dF0#4T&U>TT_@C|E#FKk?tnYGPuXT`Gy*HDQR;6^>Wmp6YQ^oq49 zs1N=aQo~wsPNSMXe&~dm^5hkdOc#X4_@!Hj!FhH6Wm)7W6-LKQee4eH3NfZ+>Hx-Hf5T7-ZX*C=RH3@&)p1C5cg?=yl=rKNZ zpQ?XxMza4i!otqi+Ge|-bH0L{Cv!0GFl1PIHWc=BU67DZW3$yveh)6Dc=>ZW6m^6Y z$M4(Q&0M#)q_1k#KV+V6bms0Z&k%RCpIXAa*Y6ts9N;aX*@0d!$j8hx;DR5;#t0~q z-KV-&g|5jOM`m0Fj_|AnPZ*KBkg?jWcK+t->(_eNrx1QpP%&Q>Y6v`-@AelQgN+^N z`B|DSsimmrDE4v=;^*BMu4rehc1zn!$X$@7cDJy&DB>o5O1+*J$0w6~Ahe$=-h}gV z`o*CspC(_w;>(=-&c~kuz`*>RV|QyleWbCh%&H4!<+laU0BiejS52uMP7vcjq76#T{ar&+!v6SBR zHrK|g1CZPMqv9QJGyU}JbdxoUy-*Upds35XO?1t1o^9?ob8s5Ur+8Q1pQqc+8$*?R zj6O5<>1IlI)hNAJyeDrlocyEzgHf6jskIVTi&hJ-Mh%|NprnyV6`Tb-qOrXdCXN#9 zR5l(?k(`z}Qh`YaESk7G&nPkC<`M=nuWNN2nU} zM(QxARag=&>iWwWey+Fy$IaN&kR}`P2t7bQAbvU%H*1s{FRtpNlw_QuOkX#xHeoJ# z4rYX{z6$Z~H%N>c@E%uTKzG$Ro$uyV`*@ba8W(MxU~GcZuBcM|-AOn#Nsvb;`rSF_29K$SqG4R-*`NI!I zi;gdSf-5NxbtVT$lM}zxLA8XIt<+%xpzYx&;|p{(ROM|D>tWU_s->}&qUz?&D_O3V zP7$HdcidfP433RCL~}`7M@F0#oK@`Ej!Ubjnem&^qLqLxDx~1ij65+v!Is(ek6g3W z{O5ssbRV{gKJie-84oU$AIy3L6R7cJTO_p_*99EuEsvoHyt+~uaBAR|*3}R<8Y;VA zQl_gVQ37eukBvQaa$|gWPCD&9UlgOu{R?Qul0Lh>F*Avp3(fPhe+tne-m%$RPl=m$ zBh#|cp;N=AgB!5xbZIJlZ3>?1$7#hkX|}y{-y&TcvnqZszBgy0(9qe)wm`7dcTnwR zKjF5ofCW!N=Ujw!Ld%|hz{K>r<}0tY&;&>0L6SDYr49mPvGVPVtr&OcG|HsBzLH5E zUI=^VAs?|*CgVfaz%wfFtBoJ<-Src_EAoK64~lt&_4GsJx=~wl46Tb2rd$KHmL!>NS z-;cI#x1HFOjTA3VO_eyCToe2xx#0rgAxQ35huCaCe1zuxP|NG^UHwF~#5`5G@y&~Z#qxBq-Bvzf^$tD1ik$px znVu#yD(^(lYwoM1=_<{y<0i*ig2ozkI7+LXMEZjsiAh>C)7hZTr-CEM_3CV(77ZOw z6IyIKPG#Gtt_c@SGH^)QfDN2rqD1_YWB<#cZTj>(-8_dgp~jL%Wewk-K=i2B_8@`oe5<8w;pn_6gW zV+?lZJd=TUs)bNmZihq>2AQqt%vmj<@&++#DQ>kZ_RcnihkHg>6pwgG6z|9BbjM=? zlR%vxarR{VAm#u+Z`e&OZCY(-Vm z0@D+rjnUOn-nQbwY@G4_m!BSYwrqV7;`#Vcj+W5*sH1u4-s{A!z`bZmf-HSrD(Dow+x#>gd9mNr zn%mpzK_>4WI{Gp%e_RHr=xXK=W%T#2G3v43)!|XcB!8DD``E5InGdDc)(umzJY(++ zo@0rd~egBIKVoQ~d`+ng4=P2(`&dSwT1PX<@xLv?2L8Ne`!M#}kJinhX z=bd`2sF3GNCNW?}Xmy#wk6KMZm-$@AY}`_9Pv@1cL?NG~QWu6#iUK}&7SBgk^=er>={WhKwF2Gx2eD1O)g74!n`dr z2%4k%3@d?$CJRB8^p5ElVDWVDv03lznWo^ui!b(cD0MNqPn>d}z+*IXdn`@IT2pPK z&~+Gj_KRDEZL{8dQTQP3g;Oy?NFQ1@MMiwbQ^pr^RqfuH%`;ZhQ-51kjD{(SG0&I zd7ba*DzH%i5X?TlJ~FCVUWpCZikC$pA%l|6_dbds)zy&ueR6?3y)en?pSVeD!P?P% z)!kL&a#qKDaZoYKmaIK8J~-Wo;8E&T+itr@Y9p;$`|4x(FCb`pu22+jmMTk>Hh%V%3@wg+RBx_$ZdxNEw_{qtj=)+vJgOSIRs(<>{rp4BMRh0STr z-H~1ult-=_O(?5kU^ojkuSML<-hK1YDAXT6YMA%5yX;3T$mnBQh`A+bq+Jv|WGl%} zUA9Jp1Pic_O?j-jgAZ6AS5?jPfjr}aIbR+_=UnV>G~IV1T6kcezmQ)l?xt%&i9#i1D6 zdoHggLws+3l|g@H!Pep@2XeD&gbRBr)s7qb4lBhuF8H)X`-Y|B{QKdY4{2IbAE=M~tnRp(kf;r8xgVG<2eGf)S|5d($t^`pbtsayyc6IoD~SR2*xFS|!p7w= z7BUt&Vl*YRMWPY}(Ro&Fc0kQJ=$s>9g(@a2xzS{z zi$$v{y0qv^!ozn~gVR>A!V>fgm}Ip08H!NTE|QG)@qJ8*k|PZxvFikPXU#2DarO!5H#^LF7LH%fSrAwv5|K|9P0a;bR(FG` zwG8Kh#i#Vv`JadPj{O*TA6;*DSW_koTpKgh?|;2FF062UvfSi+pNTb_ZboW+*}PIh zdtExToyQN&hO_4hKo(ZKGE7#LvXNcpon*3y*5ab{3+TqJR;LH(Tk_Ar&hp;lCN?Na zmM?XW^p|AO7=*GJYHU(9XL5ho4*EQ6gCPuCaJ|h~*K7NSL4;EdMK77l%nd$qM;6tY zIwtOn?1iko=gyER6V;xl&`0@z0hOYPlu<(@Q#Yw1bbO99R8F|-yBriz9PaRK4iqWe zVFK$K+r)OT^^@wF)1fHR?LWuk!}~t(E&iEZMs2m$9j|RsAxJg(0gZ!f?Sr)7u z)ThX|3u&`ql)&G!lDew8?Co>NG`R~QUm3WoOlGXhI1sE& zR#MgD+Jb}0pLm)$(0GnHf)|4NDzLWJZtFAAmFE?WvaFzXmueXVu_eTi1z@$;$W^$Kg0e)< zvk&$y4v14`>$?O9Rr&)HRSx7KSOwAOD6}9f#h(F})B^Q=EQ!`2dx5#bw{l})q9tu( zkKz~}`G>_Z_yBDGPMcELdyaDiWLx;heP;y&JqoOKt2oB5tJ>#|wnFy9+8mPu@nPv+$uR z2S$zAz$dCSF6Op9OBG#*j`GzXRYQ53hWik-v${xBQs3<}wA3pj!L06G%R^|81MwDa5i5A`6b^|)=P0TtiaI9?9{Ms0` z{UPkgynyKiAJ+0FL#I~v=Bqo8F1HI5l1LqfuwH_{Qm)>sGD>ewe95f$G4GN0>1 zknMye^TxybpkKE8&deKm{P8{+QE~CXHZZtroPwo}g< zy%LTOHPZ7#W4L%02%GhA&43MBLVxI|MyvzbE4Wuzyv89~E0$S!9luba(9 zAq14&`N;Uy^DXN|jCWA_14D|IXM&T5hmx0y zB#Hrxi{@zP7{7-=oMD6=uG)v>fk&sN6U>eJI>yPOyt_$Wy>Tc7>G)l}u0~#Cqw#A$ ztyT@b1#s;Kt()HTeZ7lCc7I_fFH~0l7a*CaaZwk=^Tys7DnS{ZD~naW9@)y+i4o#G z6SG@ut4rhMRY4o)!M&|Vz9**rKyEo5&rn17>iL+xrpm!nbX&c7*Zd_J9)`>-qbSC> zuq5XrkF1wA*5h>7c|u{a4b8fWzA3jelDtm=tU3C}4s&O>x}EB$XvxUQ1FKrNF;T54 zHkc-q6c~L;{Z+`Jg-jPtXAPC~GPW$b^$mf6~Ws!U6CQ=EfW?8EBvNd9e z?J3%8(qrxwm+9v^_f zE>Ghf8+voD@e&@>;yKl*sBso|KN;fUa(I4M;9Vr12bOih&+;N%Y^K(e)MO(|Q6?ju zQlH_0sb9cRDQAa2xfm8;9~SfdN{YZ}$B#yPOke`2jJ{gfq1-pG*f4@wH0rP( zSTc+bc*x`%m@tLme#})KpE3yvsD2bk^y1|*oX0+I7cum{!xYE0&lb<~C)l9eLfD}c z>LwpT)$fjy!F($DJRA3oZ8VnTT(Otu#I#V7=j7#_N$XV+nXUN5#{{v@IcYA-WhNL( z0|F`d_MkWQUWctIXe_`hTzw9)y__0Ux&y%hK+;`zSo-Xy2YLMT#+pX($7X=chGtai zUG?J8yr(ZeJRRJ!Brj z-$Wi6M9hO%Uo^abDYEsZ&eW;Tfpy8Ndg)MEO3~SL4JGO{`N)K;3q@ghB@q2&0D{}l z6tO|zx)$)QrgxL$S=A&e2L>Co0*i$?X1uZ62nAmMt;x)EQtjp*FE?dO(9~5PNmy(X za*^Jyirafa3oK{98P<`zHrny}$vL+?moYdzq9N^wb6}A*M{!?Gsab!|h||HdruT`m zk=WLBp|d-y==4UUNLU;_zhe%`u^s`3vp=nel+%x#XuchkHxKRs1UA}Q0pDx3?A{AW zupWDYX}mH|q|wMdXT5)d!RKxHW!qslouSxL)e}WjAMmyX^K7rr`?ZvA#C2O=vUT|U zG|YoF=4M1kyTq~;ju4DfrzRukqtfY<3k8b;QO>RP@|jF>T{kShHxLqC(~7iHB`xga z2FRA=^kW>pYUTzBcbHaO6Uoq^u6c@=JX(^n*>LD8MPPWNu**uUf>870c!%Ye88fKv z!WH_f##QM?J}2alr0}YbDi4t(^kv`e&)~n7kp4CJ(GEU79uPi0H*a2RTX!26FVx+Y zFTmP^Pk@)750I1z@UVtD!+aQRVD^q~Qp}$_UNbW~+Db7SgEjdzJ>+2yjw*03m_A&~ z019`8irX^FNHaUt~fZ)|TLML#6*e`hgogFp`$pB~KH-Pa2WQ}lzm`LO&=ZVUZ~*2CA!<+lR1P(GLo z%oT~|jkLJHKTX|wAN_-UtFXPJtH*B&q-FoXLc;$b{g=YuHjUH}qTmkoy=_EQL5lg7 z6U5dX>Szo34f5NFBb}QBL_v1e0(Kx_eo+ySn2ohKNLbVcW-D$DgV_m-{LM$z&D+P? z4GO#EgXGNXh-4xvCJGf21>1mNb}%G8Skw+A#xDW`3D{Uet%bpY$gAMr^x9sI$YEsd z^6&E8^0B?;VMFoUJM38d+W@H5O@u4AFe}#Jc9R2P*6-RGm zvw?q}34NI7AIQa#@%M;?SVM2ew-mFtwI9ru`A;F#!P?CphI~?yqvbC&$N!@9z&21@ zaj38`$XW;r1_|5p-$K^5ASl#YTwGL0z#0k_`kUU{-Ok6~+6yLUj~q!z3n0hQZwEO> z&Oi3$`Ww^V0d{LVq!mE?A|QT20|8M8SO_94#LV~qq3rx%TOm6eJ1EEoDuk3>z?vU~ z6c+{(6oi4rz}7Z)B4Yn9WfuhrAZ7o{-w*s-cD~z5gtWo4*;%iK3;mt_ZgAC>x@{t$S4Rrwm8QZ%goPk=rMv=RG45OBU+k<%5JDB4H7KACFr&3kj1V7n-(6 zxE2ZD^Fj)UgconiZT^Bk-op03;oEQwfYi%CPadfoDH3M1|2Np?-(aYNmn#xS7>UDb z>*|K&k81K4Y#*fIHv{SpTL6Zu0f26g#bVh z4gjrv|0=V|1c0_@$bgY04{I;$-|gJSg`nEm0l?P^0Khi|0FrkAfNTDj-H>&+^+3r2 z02m-`r7;cw**O5fZja<`@xRdfHoE2?yZyH~f9&@=zyu8y_4bQQ=*TYy_HC#J1}+vB zCN>@}9^M_?J9qH!5)F)p&G$ai=1`Y-W z4k`W}eA55z^s5IMV1n9-+KGmOjIH=Pz=Rgr8@B-_x0d*m{tm=IhH20sD}Kjm{9T8{ z{ww_C*PmDiLNr2T*$IKfT!nB7NB!=n=XuiI?DL<=LUMCo*S7q?Je@i&KpbJ%JyHl| zltr@P{KE>D6ToKt0|R#iXa@{y^t_fR_=Q=qX4M8!|D0^-_r$NG?Ni z`aW4txl5fk7cUp-*(jU^`Yy&^%v8W?%4c{|BFODFt4?Bw!~HM*0Ez;N0`eBSkr6{S97WNTy@fA9D|_y~0)(aPePUM|MfAn< zci~ZRR`&3Qw3I64R6{NMfrQt@6Q3!BJxh3R#a1C81`!cxorzL%2ONT4- zT=ljlTNcu&|DJFGW>qp`pB{xf+=Rp$g3kHn!tUv&QO`&Wr=17aA0+lXN?zjPW>pCP zQb3$C$HWEFBTiv}e9xSzO3;5%E$k{CrV?rOpv=>^S3<*YE7(Hxocu?~!eR6HP>wo3 z}-0KCYFC!yF-r9XXF}l3G7Plx!5;-xqXhMuzoj)~UhDLkM7(p~IZ}#}Y z;n+J5lS!EM`tA|mH)8|cAHH`_*X8PH`)50`L(GZGXttRud~LovSv;`pc(+}jLMtSu z-NpM19{lZdJM(qZupK%o?%x8S4s)|2XMjc?8x2u6+nG#lE9sQgk%(*uMbE$=TK>|@ z?MTOUvnf&yPr|-t8yd31*4?wH-nU(7Y!8!7M|C<37tJH0Oc`*v-_;mJGY4ujtOngL zvNmh8ox6zDM{g8b=&gD`?EH+bjeLTRt_9v@?Ci6w*Ed)E{BHpOAaoh$*%aNqc9pc8 zCO4mj1gXI3#Yy3#;#Qp{&Kcs|Q{TfX0rcn9*a9HL2W~B!R-TX&jbOpRAePo?4Hp)* zMtF@*gZSOBl#TvMXS*OqE&t@B)>hUtg%s`+5-L)0vBQ&qgAYF2z1>pwqVDw%v~FN4 zQy75k-vStY_3ipH)ph-TVz}Fjxq{(=^ygR&mYL*s+l(4RpZRm=B^*vBHPEDSiAaaS z1dXPTqG`09LSNo~^|-xOxtWjO=v2$*mT0t#Dd(l64ml7WnQyO51uNo_CfNExP&Q#k zj>sOTFryZ($2&i<@u0a(o5ZMRfR3*$iCpkTW~Awmq5csCJ;~stkYx3f#!cd!w0v3K z$?oMznM1~UylyJ%?EMmRQGKCYr)^`Gm(!fhoH2HsStO)12D~hk5K28U|tm$Buf;#IHuu{dQb4 zH6z#3{Xd`2yj+hF)cZYSAO%A0%e1}hqAlDDiJyFNa?yRX*TR=?8aXD?<4noK7@gIj zF7D*YtZsN8l`{)l#hRA5EfPN>sx`v3$e`gYqz(eHS60zQr$!^3<(|&4nRl2i9SddY z=_Dvyosq6yJks)VaAoIS?y^sg4?1vBP4Kp8`i?+!`$CIt!hJEM;~9%fg#o%?T- z!R)EeZU|qu)&!`2I>b6hx2*Q$5JD<%vTmfr`H1PCk#az1k<3Be&;{71p%liWI`TqufYmsKupTi#FuZ zhyI!|vl-svv#%vdldtU|K5a8?M?U%rw`+pir1vawW+KFMUp`&rwe^+KBYOBcrC{Z- zy7NldhfU$0tf=&ucTu(_#avkfdMELrcovA1n)K$;2gQolU00&My?OJ`D_vH2p^!tN zI|8ocJR(PK&qO|X9o8DY4d_0Pik&YzcD&bX$CO~h*L4hop*NoUl zEP6;Yywet6ia44cNLMi$Su&U|)tDkLr_C(7o_TY$6j9J&RA1ui_RQdg!Jl3N34b3K zdp+6}spa`da^(TyyX^vEKbKzxdGajK)xVpz z$QtW7JwMPl=>(@xrof*vgYQ5n085^c`PtLlMmO#p&-iP! z%BFYM2g2dEX3-%u2oHQfvv=(oqTKKmVZXGo^uvB9VJw%-q{v21Ohh3mgX&8lM)KQq zVIOss>1cy}d+GQvqZcoRvrk?5aCJqPLRv$u-|e^cR(I3;F66RP@}uArI$1$T>TQx6 z$tSPeOS@dwoL=(q@VBXGAOZ_P@A(R>%O+>uFUKRkcpV)VFE1pjAC*oMG9q6yI?<}E zLO}_g58@9K-!5hM`j_t=z7{N0-+?%&q~KBMuqFj+m1#aw@D;?)#8*d;6=56L_1@2l z<&mHKT*hN+&FntKMXQ<5wg2ek%Z+_zAmGbK}}pJr>}gLdjnxK99pc%T0nNPIHoOz5Y6(dGRuqUDUP z5KZ^RZYj|cSy@U!U<3y*rh@zNzHU^W>4uo83m+DseMc7mgeX+&4^b^DjZDd`ZCNB~=jUl%il z%vn(3jjXUqwm!9U*>kjwHl<_q35^MhvDs;rY<1Rf)#-)1M_LcWjwV_*-g%r2i3`Y` zxaMeeJIj})p8hW(t_Dg(Y}6s$E%jEbCM@S;zD0Ws%ZlJw(uHS&otV}rh| z7%7>*uM0vvb`MpTf7qalVyD0u#(ZCR9#P2OS4652nmmG1Ivfm=_HR^IHCIs)3pjcU z_BiW{M^r68NPT)ZfzRah+T3B!S)n1|WNWY|@#$w}Q?rWcq`pnqoL;+Gx7#>q*ReBqP+g@1)ar9gxwsNVabnck2vq9T#D2DqFPt;M-3FV^Y zit)mf*&{&rvXlh)SSe-Gvm4bX^LMMxr9oVr8^b>77}W<6(LRIjQ=<l>njnsg;x4V8AY8|w5n?K2D80Fc+#`}3o7;LNd+sONxo-xcK&m%mVCz4{Y}m;oubt_ ziw83YlN~bytx-Ff75bou01DISrBrwD$xlRF_4V9|^6Y_xm}yCI$1lKr-4Pb* zG-_eR95xNYhxe)14Q(2)M&=K51slnO%EAUy?nay6F|=dN(ox|&6X&bK*AzOgAD^(q z-`EKaP}5Mw!47(0*X`%xkoipG-n?o!Ga@^o#nCC2Rneh^KBOSCDPcaV_*Ld%(TES{4OW-lI?L}g{AWf0%bj5wapUF@QS z+)XK}9>{81dbN&CSXuBW^R;)7h{%@DjD)81!E}=jfFe$BubuH-w5dqVc!D4EBR+)GxCQywWGy!USsVQ zJtk7zD1__^?F3I9kH9;ttzzwFwo)V{_jS)~0}8fW1;^ygNt8z($s_U%TOh9HAgEx3tE7F{7(G~Fx?#W zX4YeCFo_&SWqnF~k5M+$=rbZ$&cU^MrLPT9?9=JVc!a`wsY-k{B+c&7RKpv4uQqi- znWtlB@8gT27YeF4j3-We-?ic9^N=yp=8UpfBTJrK%d0xKvG#L|v_>O5#Q{>!_lSd2 zgeLa^!m`zXlT{Xl0CHJqcb8q6ykATHLnD4x!kk^BcS)-JS$)p45;Ej*SG0=?5gUy7 z4o0Yn2CG`}o!v}q1F1(5Mcc*YCgRK%Ez3uK?HcOD`%T4UtUX1x52U&}k2_#ygTp+UeG06eORSByIk$uYJ2bs^?=+?Z#f}!0}I0`W@Q8@}v z9tFyzACBxTOP=}YrsCLM&5K7hKkIW0eir$;;;Ye_Y+3ko*=S~kr>LR(?nI6X&D_Ll z#pMFlk_Zt0PCmACnPkh%q+7ShRBk)l2K&4MF)Nd+VViXQgWL|ud_RP~WO zN!|hhZ+C^ZO!59M!je^i>a0s+XD3r2(LFnG{k8qV-g(B>>o#GU!_4-mG_`6#VUXhV z!DLrlw^T;Bp-xNWVpPIx!a?h#{ux2GyBllIydLTs9Abr5?C@~Em=)X6sc$vO*#QXQ zv}pKw78jVJOuaWhl{Z$*RobY@vdi4@^R+d%M<{Zhty16ft{K^H*=UFyOQo%k{Tx9RnYt~>X-j;A|Vn#saVL-kG zMehw>nC)=nII)crOHS*+@Xt*4`t|Qee98v+ExCF{4NiKxX0_AN<*+7$mkO#PTW6C* zl+~wH4p}}<-scW`WwVZ;vb6W*iP2q|-=V)brcXP|_#iG-SL`Kx}83_2~v(P?7b<)-J;%&Yqb~-vYK#Ibujdfzx zjTJUK(rcTlG@SA5Z3#O~8QVpGu=HTR@NlxPI&*Dy%($pdT>2S20w}McAHh7ayKY#Wy5@HgPpbe&SWW)$(@ur zAmMIor&L2*0eShdZ@i(Ot0g*F*Nw#b*7gS!SpbkLP9T&|+}qx2dN2K1YP5tN4D(6R z>z|Jgf)=+@8;^WS9@n;iu`;p0+qTK$WR<_3q`*we`2}?K7Is`U1>q=(XpZ!=#kMj1+CskVm7a@{ z>%L8P*mvclbEi^Qo7x{JD@Hd=6EODl^(lBzg{44V!ecvdJv|Ld%nGf`4g3r*I{j<& zgbF+flE@%qCwr9j*&S5ltl07ZAEKo6%53l8jBBN420i-1`Dz+gV<&EUG&MbcR+|ch zHxZ9XBDXs!u27o6k2})NGb5)WFeY{bc*~xctI|5j(iZalhAClBOQqhQ_ks`O2y;m^ zC_vL|umz^HZME*#v3;F$d6v_oA(Ha3zS2-Ib4tIq8IEP)xG($LJOJs#it+T#lbc?f zdBOF0OF@OVaAog9le+m}>1^urW$&e0xMk;o&~(bW%;3IpeCxM*)4B8?JSA|G9M;}G zULBbWYYr zrDLhiL~f%)XEV9&1KC{Bnm$Bfcu@u2b=52thY9aX{}K$Jmh-K$eg9XbmebgIGe>v& z(N_-NKc>R6;i5bbvX(l~~6$JpoSV%s&SzK;1yAoHA z8D5AvTvNHhzdxd{;1Jk?(`G&(o2IKkFPOEm0#tr_6cQ08a9i&HOzR9M+UVC;w$^Bs!}yQ=M%84 zCLhap|BP>oXbW+cqPrU}_9v_TeD7g^NXh?GMs^%l$ zhGGIi-}iFG)f~gfiEMJeiLAV9`P!}-D17}Y?gws5TlT5DQgg!mxmCCQ^m5Le&XYd| zM2!Nt^3%Sqw$xaBSddKUOFs>o7mYPhB4N;9 zu9o?4;$MIa&n{2)@JK=w=*9Ba>Fg6NXXyg34rk+{*%rsTy1Zc5%Ua((r_?d~r3$BE zm+yO-4^;LM+2wWV9<0d8{7;h4JE8Ycb#UDbcg!$Ykz9{EJ|37 z2LI^X-B}SXk+e??`5ds%R}gVnC9CrE@0N=-PA!ZFwkAH!mADF4`TKg89nr%F&8c9+ zdhW}-Rt?Dsu@5FLj_j6e*wXZ=rgNHB&LvLmZcg)`ye8|z4C3JNU*FH&?G)Nu)+pMgfBZmhs!+a86k(YC*H41C9E#Z#M<$uZr@FfR>@r*xvk60=JozKI@w1$O zeEcrhblJwWqPhH0$$l3V6t*&{6-=Rw7sbwG&Omp<6_oXC**;<@w@IBmg3;V=Qti0z z;)?;}Zx%wA{4)#UE>2&J&h;@27ZBtL_>>0W*d-JP*K~Y}g3gva3JAv9&8^_ICY5a7 z+tV}jznVrX+fpS&s;2?dJm8mYBtIR;o`7L=&6E#l~doh<0ydc(>j&z{R z2c&8yM`2d$Xb|m_j-(+(C;i!iowF+o;bga87=mD=Ou`~v9svNS7cv@T({ zyR2wF=g3f=9Xqnmh-(EhZ=5f@x!%7%)eN9MK`MYraM##XlTIi@Utw<2N&T%Of&^c; zr`?G?j~f#>iH!d4m)dGXeRJ=Kuhu(Ou|ky>`ymBeI>093I$# z#?NlyvKwA2MDQ!t=@&e7e5snPOkknKF3_^jmI|L?=|Th-Y^jhtp0{EalCSlS5k(Q@ zIRHHTvb*iD-pXe>bq~4oGHS^&9!H%kyWe!bl1ob2!k13mYiZK3lzWH~_<(Hn_SKL4 z^MBCw)?sZo!M|uIw1onNVnvD+io3fME$+dg#oaYn3#CYapuwR)aRNmG1Z{D5*W&I3 zhu-u(zjM#|BY6AWv+w3vbe`S6 zeUnuL*)L7;X?K{BU^iz#o`(^VC)i>`KhM5%VV(V_jFM)_31ZBV1#g}j%?!h~D|2L8Xr1w|pKKQtMN zo0XWR+TZD$8Ag9dp&s)SrL|u7CK2U^W5v)Tuu6{Oyn$-px77+YBO6mQdplKzDmI3w z@>7QoKRw0kYwVWOA3=~ykdh8J>-Gs4;C>uK#a zTRBWfoS+pAv*}9TI3gLob{3}*vKP(3%K$_eDAvEv&clS^(=5Z^k`Wc!{fgBLOsNr{ zo?yINaH#${-9&Ex1Yc9?KgOuy{Zq83>h#-o!>5`{!h*(os(#2DzlGfG8S|^MI^!#j zrczIzepPb85&605^mX^+vBR&8l%SG#T8fHXT|`cfkss+|DNPI^|~>ze7=Pr z>fmF1U}tcsVcz!)H}#8?_&ycFld!~r>FraLeE*9u07SO<*5@Mx`%}?PR>Wn=!okiuQGW((ZBkr3G7$VsoPus&7#jzD)mdL=|Ys zBS92{#=BcVbJb&m6G7Benf_XvySv6&ETKyJ5i#NnY0fUgce;w_X$hTrDxNi(`GtnO zN>yByjA|2RUMM&|R{)jSs^^tyD>JjQJVG z%oX#=zqkMBNx)TilfWjtRcpD{L9EV1EQTGCBHwM;rX)j@?l83vJ(@F_A!8uqCh3S= z13AQmE9hl4F_70}7tYCMUN<#1W{*h$0JeVsVr3mW7m{Y!x9wkvELGo(k`!2P&+DN5 z*QT!j!|dN%qF7Hxkk1>(3)IA6Ds(?z$R6-dT2^A+{Gm5cJ|jM~>#yRX=J7obwmWir z@9vaC-8E;_hrDgH88c%y`ovycSuwm&Wr+eB`vvfO9XYl~H7s!WPlcmM9|NUN|7WiL z_YX|%_It(*BTD1y-EGRy0-j*{y#|l%Esuzuq0Zh>`ckYvI$EassvH~r$~Sac@Hoe-VxiWR>9t@pS@_p~P^c$T zh;J(cA=pb%zBL%1F$qv^J5m59)aB3r;go*UeBLu|g2)Isw=h%6BES(+e_qd+B6Q0GvENjB*J02HLneYE1^fR3;2V3FZVTfa+dS)DJq`gWiy6wV z-q1vbOO&<7c7FK$@9P-ke#aU0c_3k0#TSvNrUE?4`voY*{~k|^f$F6v|NB|6?1pYA zP2aAA{3+jvPJkPEVW1gR#dM+xQ*(-Lul)Rr`yVP#i`6w=(=TmECL1wcfjFad7BccVpmi>nG0@w>$-BSr;@BmPjAG|0l z)l4v>NEn85*|oj1-Q1d^eKW{sll(YEar=f4;};5x28ZbEc;vw^!0BMlqlv=M#%HWY zeX-l5Owd}TAR}wMdgpbC&XTToT-~cDfDduR05lpJ)Ytx_$XLd&*PMEs9V>#c5s>k$ zLj|c7; z4)_`r|0lwK#S{7>!qcD>{_`dBH#7R|`;a9S(}U_J*2KjiVB5$tDb8;;+V$%n4CdRlzkqCiqipXY;S;#6u=&(z*GeJ%!TbQL zfLjEofR3dyj3YJ0zK`GcuCv8&4$12SWcA8Xs}nZ{j^@(*gFq1)Q>@FDKY}y*NWT`Y zC|6oEAS&?9kiJ#_K>#+UXXjtIJnLdJKyU6W(zCtnoGxLTLLaZE_u%yDc1)k)-+a;l zh?$+6xj2LaZ3I{qc@@)~n7@a})*)-6SQ$%UhdkH>$n>B0@8C}DEr)ut=gLMhTaBj2 z3@I~beG^(z|H*(V7*eP*pKmP>DUkrH%?jA8NKU^tc6-L22D7vo_GQ`B$rbjv0Dag=PId=r5RKS8>Cm)wM-0|IAokx^JUndX9k5G>tUPae*CvQ|FaOErw7R$ z&t!<$OM~cCQ85m>7(lXy?3RkOH1iZBHJQpv0|tpqP6hzWkpM|KuQi_WB%eB(TCFx9K-|fL5QxsSk@lOxjGu;{m)NvVABC}4`pNYa3;pa=s6 zP`|XRKo=RNlB60%Ipvv&@-7(jPO2Gk5@RlEHGEv*NSSvRtp@+UlNXDyH=r$d^HIU0 zOmUyfcIDjKZrC)Cvx^q2%s(IN3x&b<=N*SV_X}R^FSwoVBM|*QNJGD}TPmlkKlo3j z|5+|*TRCxo7=q34a*`hx3G^v7YxJclDvboXhJE&leBxvS3HA&jHaw$MM2$9*b+aus zMID54^}-(GJ>oAj%e^=AuNFOgHl*VIr-kBvoi+u8ZU&Os7mXRF&-jeYP&BbSv(65I zmrT@*?9S8_+*{Tw&(?#(MR}nnjZOA9-Xh%F2=SMpl~KXP-FVfQ1W)i$2HaEpbID%u ztInDE35yRE^b$Tpd&XTklL-X{1u&l-e+$F8e2OTB*q<6Mx*pa1KehsytYWK?ITcJBM+Pusl=_bJ@X zew{fV*2#HR$CB!Re6w!^69Vo#z;O&-#m?hz>;lfV@_+>#=dr-0W&H6vA#`H`>J} zQ=NpEEM0c?(7ei`R!IK~m^(ARed*N@fkH(s058OvZp?n)PPi|?&Tq65W2Opc1Po_4 zWddtloT98i_lsT+9F>p^b<-f5qDpOuXtb*ch;Du1$4scv*arB*7E;~$>%WHl6HIzb ztojmOu3HNmG%si$wR_h|UO4RF%;J>njge$~PKUT4u$;-h*xM|(a36C>vyNe-B{spv zk4?<~s#rkzoaDB8{sDU!ez>89^-neoUAT(CIrYec*JgG-IDS^0d*^V*^?Z397BpaS zSh4K8ryxjCpFeSSZd55D=p%j8xM!5eI5sW8?ljKV^3sH}c|COb=YO){iQN0|I9fd& z8-iJ7x#QA9YXv1i(QEw9o< zJ6baBLXJ&+Bs_iEMTUK)ZWVFt5s&d1C8DZh%PSTCu^ND(wZI6Zi zwE9-L`lSkQ_~zEF$n8rO(|QRP%gOWGI>vO04u&fc;T6TPTW7-@2hZkzyCneH>Pi|? zdpETrg<1JMK|&0-eR@>m+)k9v?aLptxl`Xv>ux4N>@FDI>O|Wu%!=?~zsdp^^U+Q9 zOx^hb;%^fLF=ooN6eL0MYDOGOXo3*|h{ zjY>`M1eKfs?K%2?DGX3jKLMa)ydro?_!j>e5e+RDw-gB-5Ai$R_ZocC^s*?Ia!i!J zIoi`F{Ov*ZdTEDIGyLI{?v$~MGj9!E^d7Ku4vBG{$qmG~K(0P+;9vg*6b=&^I6sKk zWJ2HuBLke10d%A9F{m<^*7Ue$zBavsx}n`D`BoK*gxNc31B5O=ZnIC2FKdBALj}A3 z0(Ql}(APO8?vA&O*hIOjA0Ih8tM0cF)&PsrIuaL9R+kKi6nh&@&@4gULGdBLcX zSSfN&QA-8;ah%VGW^z@hEtB0pX-bcwO+$3gX~yl(xetye6=-7q0;rGqf_VNYb1d3? zZU1<&v$BEOOO5zFoO}!&eGdph+j;)|GYE&clsp5tqH42ZU?D!oNd4Ww?e|W@EO@Fh zOaJ=Fh{cL(k;Gol$BXNn*hXcLGE*!Tr&Z}MpmU~Bg3eHzjKEEQl5XH<|7~LNWsk24 z1L2Oi2=l{Y<^2uyHvW5zSAiI>!&F6!ifhTIL)-FU0P@IUxt78hu;JWJehjc!4aF4ksoeD7w+Sod;b@(>g;U3er3#w zCb*v-fmSElKALJsh_hMj7&f@0aOEzxZuu9GiQ-Da{&LJUn}a-}Ht#pz$1?ZKPb5DR zHC?9^ntmL-v&ZiU(+q!6+|c`7mrQn#lsQe_Oy$a-7i4a|Zf+?+B?o0{DzG~896*I6 z4o*4aKRwILwZ+jyL}#)fIWYS6-dI61-g4D45DH?2!KsEiLkD;A^?q(b5{j0~y5I#S zEbD{?OyF>(Utes}78X~9e(!1>e9t*7r@77+7aCGk1qD8cw5gD>PO^v#a#omQREOTB z0x!)9jj1M48^su}mYV3rHLb+YS@~sEp{xNvY8O#N01;q3W#CVTTArklIa#vrbQ7Yy z$|2uGGd)Q(HF?pM-ERs`HJx6_u0FAMnDOxNaI>OykV+--9I<0Nve*RYrM|u3YG1UP zE7PDf%oE9G7rwC4Vl7r-@lU$QPz74(v*);UNjlVE^*NW#2fWN*7BGf`LGcFG%JY7z z!`dDmu4G|bDC5i@$u<~cA;v(6E&VBcbN~k*LNw9;^beEsYm0i83i6t@f5HOKAr#lQ zI1=h12Dmn##8q7CfC_dZ-;^EL4{Sk&YJ`%yS0NurJnPrFy32QFPMZS@?;l@lw$-Qx zZw&49FjsM_zLwS-7>$T=UejQ@nUioxFWH<7@jTu4YbbGDJUFaUNZ2(MR6^ zh9y5!ww1!It*zCJY?W0>J6h|>pO#>8K^FCNNUQJ->jhU2Z;54$_4L8z%zTO_!un}J zb^>H#A~ftU9d=0W`10-DBkr7ZTD-+Zrm?A-*~mY}MW_O-Ek=Y!ENlIYP;eK~@Ba0O zG!QR0BIB#QR)z!#^TqB+<9W(R#lw?COl-EH!ZaI0{4GmUyKauzr0?1l*q7j#!qOam zT)7MG=xXa?2X=MIiJ=;byl4CuO2|W(nldnV*>`xLjz3^5F4DS3ayxh|nyw^>1 zwU%Lq$|41qGAnf)G~n1Wz$9?2tHzZwDw_AJfkEh4z5-9bXmsjF;vY&EKl%1a^Lf$9 zD5&ag3b9qhpKAXMMh6*H9?cuNI3C=#EU=Dx zKkfF9UgWcPfs`?y4Hn%nr9%+o!{w3)-6iQ#+$_`X7;m`~b7ve~eSCGQjLh$LVCU?j zMMm(mMQX1o^X5&`BWif|+o+$MMNDclmD;l-s~yz1u_u_cm21K19K%Gjg@C> zd1ZT^;9?;VZEB{mi@M~5SQ#ja5OClxf8S6>OgqEl`b|!7Vj+0VH&u*$a3$utr>5ST z*F!D$8#s9Zea0hcQ&@FqSkrOM^-P#atjDb^3GuP@^WO8Q(KL6IqTkWSI95B!>Sa4W zG~6%I@guww@T}itdVGG2Y&|a%JQ#jAXiT*Z%yU^?sn|STmHfh$sIfL{=TT2lPAtajOm;{y6AD^A|vD*Fg0w zBZewl14tzBxqmO<F#7yt4e6#5BP<;qO6>+6(b3hev7ym|?+Oxdo@|2|;>O^fJR^ z1kbtT*o7p%9mMa)s%3Oz_(Ia2?$zmE02r|`hGSrTDY3+JEX=yx9gLrbXp6?GBu0El z`-(%rrlxJ09_pd_5iN8AF$0p+v<%27cQu|lc=Sqv*jB)+g*ioi1yy(OSRN%c9x4ad zsXAgkM zz{+?;eLRD$n~6`_WI;ymlN^Hrs)=He4JtjRn`yXp)GiPY5BHU(>vuyP&vUQePyXuL zH1qJt9Qg}iEd9NEDK2stTchrtxLc_z#ZW}niRt|0MS1i3#R_W_KxvJmXj$+(;UQUJ z(L8#C#F9dR_GD@Qr3Gu@%Cu{_(eZ9eRI$K}dJX^4NKp#3VZhqRRPVr)Vt!P;NZpKL z<2x&Kod#>=+Ux8BRNrUHrFV^2b56OrGF0zsL7BR$j&0jpRcgx1u zCL}xL^E|0y)O`JRKeSM;&e99yIsOH$at@@4P{fll2CfV`cF@@vOc|RS?^vZOreVoU{9+ z&9Q~w34dj#ZThNORuXHle0kncDW?zb5tEt4;cUR+VtY^W3!QJDKfJRQipH@G9u2>o zzoieU)a<=Vkpus6ekRs;q0T;VXZa|4t^P~BpsgGFP;-JOkHp8sKp$0of8sJzw9+*v zFQ=zH_wy(IGvCyB2hG==_yHnFf(1VI+Eg@aY(&RMYSC{ygA8au56qL$i(O{@FvipTwtm#wOHKntVvDek@Us4M?QaU+8(-1t((}=gJDc(a)i3!2+CY&5tNZ~lZjy1TIC|enO?iTSbTz~d4YDZLKvFZZ>7b< zIzvDcg7^NUHkhaL#=T?A-b!vj`=x7zrG+(;PN4?tgL9gRn=KYwQ2&%Jg3N@Yjqt&^ zRU%xsratN=v}8a#^Ie+SBo;z*;`H zjMhxaJgV+PG4Mfn?|10BDCoT%yHShCNVsGX=^JOryj9N{nV3;5j=hCuE|9ybD(9Ez zg-cD~qePuID{R=2MKPd^ZN81q>6jsv?Cgn|% zuqIJQH)4lxSfm@jNBN{bhvjqzen!qfWZpP?2ee4M5|VWT$~o_CTP1kvOx9-B{6W6;DfoHCHmAwZ1H0{?&2H>?qe*+G_s_p07atWy z9VUXl*}vMi9C|}dvMfbvwIWl>$cBo}O8>iP**C-`k}D0N98kV=56bCAt@*r3iz}lm zZ%>{@O{5e)Qr_Z0Ko=(YpRCTHI-I6YG4ZjApO;ZS&B(YgllWp0R|NyS$x`=w_9iUr z*F^D5BgkuU3N;I)k=sC}6OZ^s6A_v1XTMLE}d`_aBLyk99=;GrW#`{-mnBvhk8_;-hJUjs8TIW;3V@ zFHH)ngC>=Qqh42eSvwnC@FS+G8Z0*~Xve$VFP4kgM{0T9*yg#9aXXMrnHGK-nS~GN za@Eg2qwKDr^b6ez7PcpNssWP6uQ@fod|dCw`vN3Y&#isuIFfwk)DWBO)N}F3O+8wb zY?j9|7@O?Hee0}NL(N!Z77FDsInuCR&oK!wF{41Jew>df5JCP0*i0Ek77h^z)lXSZ zZldpz;EJgZwVxO~J+U0VKgL>lRkQzL$-W>}%kNG4uCPg!>(yUsq9lUlbNKYw$*5_;jNwq~ty zJ$;&fLFnP19zLdmw^I2Kh&zO0S+||mbPEBc=Gl%kaCZ*-?vO*r^m@B=wYB9~z)rcK{$Z}$T85b`VBC&v@6KM4^6 zHiS>^Nr3ESv^fH?ytLDr-g1SyvB!isN~a-R6}o0o`ynNBsr_1m3fqt!i3DL8HRm-h zyW)|p8Heo07$>JMYh}K(wHx1SmiG-$11mf0g}kDrYAp-)2a=ZaNvEAWjGCs>Tc3nY zT3lQ(YIPj6k(E@c4x2r{Q^r;OsZghdX&rL41{ZjJkX3OYd~UMAdEJFVSeowH;qYi=>*K?SZ%^ohTY+&9La<%mVeVYVX8gxg_~)?#9~>y7rl zvu|k0xLPpWWqk3@o7YBnFZ(YbnDadecWN0z`qF%<#s#QUl8;FCQ7Nm}JlnsN3@%BI zMzAJFTvr6)24F;(a*W3R>w~m@{&-kc@ARI4Yz@sI$gt0%6w+LcFzg@K)Qg&w%gC%- z;(Z+wsC^QYe^6)YU~SaT_+7$0uwAxUt8&s<>FlPEN|1jS{ukf{)_;+I#ZcGLxwtY; zut$I#+^u{+(;3iSW13XY@_?7i>zX=5K6}{_;27bu=-|oq7l5ehiCr!tMfUHVo45sO znkC$L&4|L{KtYU*x_>0ge@B3^fvw;iE`Jyi<5o3UMoBzUbP7YHiV+qu9=_o74q7g z=Bc%@rO&r4oSFG8x5VWdzc4hBPv}Z1l#2&4QrGKI4yo}h>9A5niJ3r?)B~$`V-y%l zga&bfh9tudXKE@#p(@+NYt42YuI0MvsY!mnpX##B|Isb)k|6TyJLRqXX{Op-D4;uN zFYvj-9FOq$VuhrP&a-s;0-iHL60EE^3G(?=*uqlth1YGK*Vhoi31BFwFJMg$xv{(x z51^EohYVMj-LHlTElgrH4AzD=gZ;tMTV8!;q8Zraz+4-Z{3e@)lXI@pJ<>Z=B6zw^b=10@~-an}}(pXZKATFx=#MWxFUp}5* zbLt~_e;QHte&eg8i+1_hW0R(9VEoJc`VF*TSdYgJe$1OPtBFi1SzHzkU)` zYLwwC%k6Iz*B!Ct)_n#T{R}#CHq0#2RAaREc`@P_XyP%liBWkRx~0JDGy>a z>1f=NV~xum^(TVzUO2GYm+=4W-bxeNDm=W7Tnlc6F1m9aQ1sL!oZa{yAWfqY{83Fx z*N#xnilSo@e(5x@$DgI^ug|gyKHHO(1X22F^A=3V;a%Oy?BPgQ2TAgS`gw6xjBR>Z z$M;{|I&odxc9Kf#qE_UeSx<@G9#=vuwK+^W&SW-hF4C*5^%Q3FDWZov*eIx#kjZwB zCkrvNQ2S4a9nwzfeQv3VNw>l`D?Kc+87G$L?IjEgAQCYJhD%C%H0R zK6FdkEg4^oI?BMmwu!b;JQL(mRDs{gteUp2ebQkmZ9AiujPbbK_t|)#5qdJ{kkzrDo}8RN0fbY%{En z3czgV^tARD8qsl4HlJVwU&u){2N@o-26M|-?+@1KNucu$=<2sNJjG}Z5Q9zX*3B}55Ht|#H;&G$Z{hWAU(Xi zzTTm7s5W`nUBPoC7}=ttcRn$4*``BgBqt##aSG*W{|Ny`TcllOQ5=dOZV1~6g&aHX zb!>xJeP2tmhA)ztE3?7h4p-4HS?b~G_*)TYg1Jj%vA0K+D-QKyzjbSOzMU(U*O1W@ z4f5BRp`_1Yv&syZTJuyH-V8QS%M;8?T?wLyu7bY8apBI#w2`A?)HJ_IPoLSeHdyGH z=|fjDg5>iM*x+T?rV8D^l9jeDM6xfN6gQ(qp7pD36_E~LLcVhbDm!Zg`I~DJlzj?Iwq#Yo zXMZ6CsghrmczU&CKK9$UotCW>9lNJq>)^L>eTg%9wYycIWHb>b%Pady*;LqE%`uW( zOkvE3w)MNOp|fN@h_C9C!T3a!<-%;wuGb#y`0RWF5pCX`qQ~w~mSWQgJ`)X{`yr-t z{&iUMtjpphwD#65B3?e<5YSZ2GK{S6+Wj_XN}wgAws@$9|4t`;v`4gZH<5a9xxfis zYK(fUS^CrBovO14SxJb{81&&j$&~JF)`_zc?w%?OhjWyqn@B-9$;QJko1ck0)6I1Q z#rK(sfS-SF(MqMKEX?Df@_$t%m62rQ>j|NH8ugNjV_RRRz7CXZwzJerHu%GbD?DtJ z5te&SVeaygQ=oOkqx)A6v*1mO5yc2GVT4_mY?ZJ|lx%OgT0~=B_r~z}fcFwL#g}ao zAT5?v2wcjY4JIACyp2iX8iH8JLd<6}z<1S8Z_Rfcqwg}JZo!s#=+dKn?84F~Y0}Z2 zB}P0W!@b1@+La_<(4y&)zQg3sVDJ3EGsn@w8Yg5xs5`=JE=RiE-L$bCLqgk-Moq$Z zmz4FSf4@{a8p59q2d$*b?n<`oNvNQ|b%hJe#6)**jDi(f#2Rlac`2kc(8<-T~o@(A^`y%(hhDD-OiG41D~oU z4=2Yg^k{(|%>1%o`3o{+E2?=A> zBl59Ab=685v+)|YD6f~Drj-*mNQpGb@>MoU(|z+lR@Q@#FHYN5A7)rur=>pMn(6bh zzV@Jdtx&XfX}?+g)}ryocy=}~wd~0-uQn)4UF_5N@))0KTVk>^>5&p&u0eD~d>ID! z$J=OY%xS@2x~7uq-L@iXZ;aVMf8@-rmkb+z{BEEd0GjA?sv6I4B-ewM7|k>30+5Kbts=U&L1nYK7Lhs^#3WTmJ#Yu{t?x)qGZ)YzAP zj^&%;IFgTAh$L}`E)$r~ET&J6aqp7QnRAFI=XGVa;7!Z)_XnWDze`F~3`Y| zdl%>Bd{m!Kd2kdCxm4Q=G+X7`pLLtX!5Whn8c1KoE4AA8sAQ_eN3@7i;s~SJv>fSo z&&ZyLlRgBz9bkM6L!QG@LPP(gIl5IJ?NiYHs#~&%wp!IcE7{UpGx2dQZM81jOjg^l z`J83~3Z1;UePH*q`U_~gLB&ch8E0*-T>%H#`SiA`u)YbHVibvbMf~ZfPFYid7b;<7 zTEBZT8&yX1NnjA_x~c5(%ZbP^h&{?ejHipk*Ish2dyD_l0nHO}tJQCop`lS*2~8f54eGk8gp_U80-h_R1LZ z>J%~wfZCKmGI)3~vxF?S<{%0OGnbeOs6Ke}ehawq-e1XG#rO-!X{)&p@Xc4kWsTpi zbgeawI4k!Ag1n6y;!^%AnDBhGk+4fs-vo#r$QUYYV*=7{Le<#0as zWaW>B9Y1~BXUk)xnD~?P8TR|kubVf4R+8SaMs>Mt#T^P>)Iap%@T4|ecIqdm*H&cZ zy|9wIEw&>~rE8zN3Ck+jHk8{m)Ed9u;GP0d)8aA?6S*jKu1xpTZ(E2(K+!R#S6!1^ z59K^ebPd_CJISY-GQ%0p4nIM2Eu0qL2dAWA4@BesqW{rZ?{sXKb}dgRNuqTIqY^ z*ic%KGkYKWrv~&c&{0R^PWALNGkWLU6XBxdiZbCmA%@0TgQc5V)fng4o7uy==zhm4 zD10$Na+5~}@wqB)=$g*>Zn#hUlNMHXRxykW$I zIy>w2S$Q9ZQx^64xSpRm+Q#$`TQm>@=O?cQ?gu_@X*_rEcKS$maQJ*P;D`&6<6X)6 zy~)MM7ShRE`suQN?ib08&u#$@bjQ-|ovB8tqOpPgTnZ1zRRO>I`8MVn@Kwn&=SX1OZ z-m){ld@ox}HwP4nFQoP zpj2CnfPJqE`1MGlbyil)kWA?51t{ebTs*8cO6*(+arCOFOz01C#CS8E{MyR=yF*nu z>$oRtembK1H?Oq+xUncO9hqLVY;QJK+5X_5(+AqJx@FP@!xLi@prSAGul+K@+GEt z?(YVR>(o-*?h`vXP-MyeOoeA(iu?t*O|k^8x|PvTO{;l*D0=Hi0u){w&HrY_#wf@B z{H9vn(eQceWu1_RY5t;-_C3){?)tXUW%aE1VzbYTpLSl|e{)9v3&@CSzn5}JtGG!4 zqb$%kX8SdF!*7a)Rq&oTR$!DXk=*0PQdIBO@*(2&lr8hxn2*b=CcECt-8rQxcHNpy zl4PaFsU=kAO$QPk_~n9l_Q%O^+NkM)^QtAYqLv`!?>mHI7mx7M&ehq@wZ4pkEUs9) z*2DW+g*QEK6b_Sy>+jOb*HzgJ9I1jTag`|&IPZPZCmC zDv*u9M%Z#^*|N}d9lh2sBjZ?*~WjYu04U5Svn;RDFWgpR5>-&?QhwH$mbVGQSU;h-)eGrXzaFPwtM|IQZM7I)*UQ!rheXZM8h4S2)r@)$gY0f zXGBQa;mXj;?f`UZsHbSRA$bRf#MsUv%ptjBG7%`@?ex_t2c)b!2Cde#U>ylMZW1w+c%elK#+N`kV zx#PEE168az{L7{5+@j3y`BqUQL2G>?3G4|FXzY$+2E=4`Nz9v7;pp2hmCx7NJ5iI` zYCMIhzPB-lFJ<#9H=M+C`<_!&Za6Qu#o-2xS~?;ZX6sFQQOPl-_UrQm_2FUS)_eQn z_Un@6#-&;IC$Je#{x+kQ4wYUpL+DVfB+>o?3gUp$d{&+u zN=%WIhL6kL-Gj#=kGM@Ny`6RZR(9sH2Ie5WOQ?W=fwj#^aTEcoAyYM5btnHrhDCf+ zzF@ls5r~q`jY@%Fs6C#IG;jS8nlq<6I@A#lGDRqyI4D_hGt$kY^x_&=X2WXi zwI%&y1S%n>+E#qxB(1^5&>3C2CO0VK;p@csj)&mu32VKR(pYS1`EJMH-NP8BSX&5# zilnVsS5EyGdB=A5oYGhA)o`+moC<4 z#~-Sc#>DK-2KpymXV-uV%2dAGg*4?xHD-7_FRn9O;eU(E@cS> zVrc}e7&mmoko7LI^eD!3)f2I5>n#~k5-V9$#Ivu}eNbVFZ?{_2-1)J|WjpEDYV_U& z!s;Px2{i}Zfsl22^Y*&AjEQA|zS4C$)Du2uaAs>Qpde!UVPJ(cQ)#BQxaOI@B^av- zeAS=MnSfKXzy2wv+CDyKn#GO!Ow7&-IU3)-Up>I7TP7p3Z$2HhYcXXTSDX85PVNN} z-TqoPMH;a}DH2yc*7Cp^%vl=6q^!(VJ;2r)Rywnj6MxBS(siLf+mkoV7}7n|X~sC( z%JIg3u2V?va06)|I2hom5pOsLGO)UYmMJl%Q`KrQRSyIfjn+mNyH{V>%9_A9SKqq# zcE^onL_206%uFuk0zXtl?HC$Zn>e<1T};F58;kR)A>bI}@S>8x0A#fsae-an)SL+c zP?GMrs#W$PuU3x8NnmHted?a=)g2jdM0ZcuQO4x;31@*Jy^I1n#=unqIB;D~U zQ=JU;t(+6t9?zZIpWZ8_?w*tVCdn@eVi}-0Le`?+SaXS#-D6m8vR1v{IIa>%=SYF| zdN$=ljYb+PohA+?ehiU#4Yf%bf+V-a`A#7|yC6L|;=HkpZ!*L63tt6!@HOQix!H}tM-!rVdS(d@@kov(a6%N5%($i_ zP)2Y5>|>8?qk&C%in!NgZN(H3{p7866jgD>0&TfwMJf6CPOPTrMv7JH>ZQW3Tm2E; zJ0Cqaj#_alm;t}cMqbnC7a6L|q<#xIye~Wig@S?Ub)UXLa(6~_+TtGhiC5B(3QZ$l z>3rkQlXWw|!9IZUDY~;crM>-7I?fq8=x3?RQS<|%Qz~+n-|md5O80cb`CxZzs-(o&?4B_2p-`z^m+O&>y-9`-bQ+>c+ zkbGvW`=d782BR!QlcvP>_QCYUqvmuJYwg|Z$$azf*{a~Y?x+txw3zbZKg@>{InjR` zOie$X%@ex9rkb6T)U5fHF*KAAJ86;f?#$_Jvhp`&+VBuUtuu>0_({-M^@rYCh?P=W zOi3wAt(BM1u^QV@*m^t_DkooKF^qz|D0PY~d)4(?K=|#tO%;oH zi2=Q-viur-@H_KIE<%Q`g+{I+K8a~#3IzS@*L~(xu-x7jsw7Q0`=LT6EL1}ipA^M> z$i_SI{lQ#(!_&w8zW(>2t9eHsDb=Ks^ulH2t*_;Yq=L*v?F;E35;?W-alGx3xmj@SJaHzRkiB-72Nm}`;86lJ&!Yog4cAefJC z^)xr>l=df!^-qzrMOwr|Mf3Vt#-n!fqW1Fe3Gj1duBWpj!MVE)wSHoRCxU$-`sJ^S zI0lK*+sZp2jWtlYzv-$6jEE@-7y~r`na8ebQGp9M!B$byRtd?zB=RnT&|Y_4I-hqd z=;wK7a{6mS zbr_FaNp4Pte9X2vbxvlC-LWm+Qa?LMQ(9Vn!YkO0nV&8-i;I zuGtLFBNN^y268YBb@(v}k38>~2`5Q3K=Mcd*&bc4>i!*O5q>%=M)2Ws>GlTFXS}_DxAY zM*A#i6U>Hc;_S2|uWjed92`#b^9!o3EOGaq{~?T1yWdxP8t%m7nVUPm;n^;mY0tqX zSPBtx$!5R`=0#-4Y>f1Z9?C0B=dsUoLb0`%VKWT8Rp4Mv`Gh;WK!JBCV_w4=`$W9F zrrw!v(T5=y#iqx}lSYZ<0{5|IOfsw8i4FZkfk9!bbM0hX_dml@A_8D#Ij391-n*U= zY=@e}-e41)yfOjJY(tKY-5(Yn;YWLKIf)%fQ!|MZ7{y+`d|8ku8!EI?%-v$_q8?Z$ z;CetSDACkYhRJyQBseR{iSt?#~()~9CU zvJpu<+dk)v2Aebgw#+Sso{aWV`K0sM6u%KnH`P|ZC0ZY`ZxcoWLnGLV8BRoSJ2{#A zFycsBjtwHmecxi=IThk6TJ+ckfwtW$?nR(Gn|w;23M7=AEuWtS?lic$A_XdGeDo+= z3&jE>hA_t*r%*3SgzR=qnCz2}qluUF`jhb~f$LqO3!Ui7N2t38+H1k}`ZLcg>uq=N zG`{Fj@CH4^feS4d!jluq$72F5QPl9oHynfaOqvm%9gHrAR$~UP94>&;K->zwRfz>U zhU{x}F8OZ>c@q@3c9W-ryb_Eo^b?Co2@?=W@E~bv&EVpCUD@MDcENkf1$vB}+=j(T zO`f>eWD@`7@eqHli<**21MA#zwRjS6tS{1BQvv-{=a=X&fst9SrUm7f{9^*94L!JI zVGYS-&G{rWCwEj zh7eOiim$UFEXiFbpk16H%V58NqP#RMfhJ6j?2l1tkrK#X?_bnvm|Gth)$b&JySQTo z_;d>cWe{R0!lf}}1Z%j3`9GL<)g1NdBwob`C*T0RV)wv7D%KMdL+Bz2S#hlyrNH3tn>;w$Gtc_!b z!TAmnXa%q@2=lSwD3CrXg21=I&)0fn_~ztje4|7Id9!g_#q#%Yaf}b^0XP&wR_jW3 zwM9>i@khnHC@-kKk5{rlaITGWw;`)DgTOE#iqr|E9mDvVGDWW>vmEM*h6s|RujPFk zLMY6;g~zSYrZq3=%-bjf1c#a&0_u3CsR91E40P79UWJwzMPx+ZsY_k?TpqdiX&5l1{sdN6jHioFm*}6hzNGy z=QI6u6d7c}9C-v+My~?y7#9(Ll%;8oINs&MH=T;>_qIiEy=L2x^*GNE`rb3WD6x_) z)8dz%#>BcE0$^hq!hHP@$s8hCD_XP-wM=$|BA87Elrxi^Sn2Za2J-!}y;$}YKew9q z{mF8BuL2csr4(l zEiKj*G!*l!45HuL9NNeh1Haaubr-D2Y8f0FI^Jikt~`;b%~B{9eF`bw&%`mdW@*Mv zkjw%6{;ks5YKwzk4_%3=-8M1uts)nBYP;>nVbVg@H7|wf(nh%aQjkNS?%X z^b3Jyd%y_b96coB2;V+~U=M-G#Lx&%HfT<$sIFJjLAeM9r<28Du`jEs-&~vM*&yYm zWsd=dfDR?Pq36jXBJHOS9gxaPNmY@@2NnCUfoAA-5L)E<)~X)B;;T`L(JUkgLoa}D zfLQ;&VfvMHNsj;Ci9T8PdCl?S8hrw+gLHF!2OfE7(14Y>W)9v}}yZHtN+ zmyM3R`xAN<-0-u}T(YN}K;TAi6&w!!SCb9FzG=q_wvz(>~Ka zRrD%(c|J_~vK26Zo%ncj-JVrSy+Ahu9nQ>?zU&UZ?bV7*l9`?lT-Nja@Exf)-73^R zYWi#lV<*(HMdWVLRa=iThR16{KR1kQJCto1opa*r?vp4&6zn-(U@Nd2Mn~1xMlUFU zODI`IQ^&B`XGA0+DF8B6ROvLNp4@xsTS!)Zw@hr)&lGTL)i`@^^Xm+hwc$Cq?)2=? zJ<8zYP~MptNZ4b2^fIq7Tkgf?Da+H=b+g%azYAre>=mw57^BSPlWy5h4*g6~4GjIA0KWt1ltXXF`A zfx*x)=eb16@!8ghm;7F>zhp&lqS#y6TRna7W)vSDDv&@elx!Z0l9*xC7(6+v*ApwS z8EXAHv`N**WhqGBMK?Zb95bR6A=%~Fyf1x=h+|tjeeJbM zFxd-*>5*b0E+mJa9|Pt!|0KC0KP zgSqmPR$hU!QKAlCtF9p$GBbcJmp@_Mo!d~BEmzVx6B7wN{W^0U3^;uzG50lU^$eMS;5%WoBau--&_#AWcBxa!sh~-MlGdQWGwf6 z99kO5SH5`Vk*FEmC~SkkN=8I_!4m%d8J0Moroi08pIvnX0tY|(c`)DFfFkY0UxC0; zlX4|0blSHMJ$BUNJgjE*0YbX=N}aUf_F;o`JGN$s$t zr=~AkAO&h!R=ntYXcQ#QHLpR%gbg-Q+c1N zYkbw`BL-OQ*F%i)5l^e3N!Zdf?Ol@Wc%s@T5S^Fb^Vdc;ThwG zccXb&wrxe60H1UxO0^I4hTW&UV9rZE=nhA@$%xveX7!W71{TqCem&-O#AYh1`0Tq=AwNhhGoO=$C4 zGz&!rNo5GLKAXG>vZA0K{lgM=VLecWJt^1ykaA_hoR8k5eXZwyO1G0`@x^JtG~xYM z0{ASQuwNg8nmOUS<%mC3-SY46?@rjF>}!;g1>MuIGKEPBr}Wb(iG7z51EbVmJ7H2X zB*)H*e>%MQUI4$|W%Th~;47kif)nC`JwMj`oMPJZJ`7Hgj`qLQ*i*k^tMoj!)eAS4 z|C#!UA`>kM88|ed`&N}BYTjJ{p}~{QwXClcJ*E(b4~90^i~tzKF5+KF%7#(}%Yh9d zO?!2O@;GIn;!F)&Jr+9^q0ENk4yg^@hRNi|iTKR^S>aD=5G4Hxbek^*&D3AccTJt) zQ>azzTdfYLia!5}`}cH7{8nx(>WoY0r^#WCjc?0;8vvV&iQrBJzwc{{xIWDw3%O;o z;ESp`7sX{_1OWSTf=UBvf7d88r)zab~e!lp|;G}yv z6i2>!+#aJX$ZS3KHgUzWmie!RgqtIZIQx50q-EkyMQQ<;3`DKW@?J36HhP{17Qgm! zczJB)Ebv4qE$~O_%WPqR{_z);hX@0kXISmkfpKfx+#78H7^iGr9{bMl5fKx3>WPa- zO^$F$dLO~&zH$bO_?j+gyIH@w4Az8k2~D{a2I=?VK}8|{pova3zDc(DHJHOhCq42g zh{t0(_2P`;q(6U8oKYVV$@R33rXnR-imjC1xZ$49{>1B4S{lk5>ANHxiPqNK9Fg#% z!u2@C7I%Jtky}@=lv;tVc5W#+9L2Br>{4YVo}wK|--(cUH6b$PHgEA|Sf^egXI91kVCMtRg9cW9M=tfZxZ9DXP3OZa{nBR3qyS*`PLN0mtl#8yOP z5WV~3z6+3DqI1gP3t452v8X3{br&3bFy0 zc_Lvrh*yLGz~eA^n=Uw3`kQ0C23x7B!1t*8$CUZTss=t+4Yh2uNzRfP9FxJRmb$q# zg(<@1<31Ll^(A|>mCh7F=66Jh#Y&Qd4{Xtc!{5*UY{sV+x*W;&=zU@=QoE#PD;qhL zMNbUWVqjm_y8BC!tjYRZlD@t%N5Fy9?t;m|bsXLA8~+L8I<-Mhj;~&(G!*?J0mlYb z2Jv{L&{n`2jxPD^Q~ku10kQbU7HYDGPvRSiG8)D)j`0I$G9;}dICu~CZalZiXW~lI zmsq?fGeS;M^Sxlrf^!>UwhMqlboT|CJ&;Y%WEk$K_v^B-Q*W4T?os6L8*(CkR>joP zm{&`&gqm0s=NWT_*;4RXdbdcKY+-a>-tQZ0q_DupqZt*M5lKndom$BrC`+|$ca&8X z;!?)ImGN@4YE@I=8w4^UOK8Ni+8qxSq-`)uQy&rAc)tSvI~V&Ompn4LNdC#$WTd$V z0c4;UMMfCS^#ns$lSv(zYGyr(HfOQ}^Zlod%PFoVGVbg%Bx)j&va;&8-2r;qO4-#4 z*nC}aAS|v^06x6Vl1OQe6YhRf{dkri{lefmhi1RB63%`nSu!HK>e#WmwIc%MzANc# z%AEQkuhm$esX^AK?e~q|=zl(Py0JGSSkBc88>-D6Q9>-W+myMJ@yuQltuLG~H4ZR^ zCKaT9%hTQ!D7m0!-dIXo@&K}(a!)k7>1=D+@(-ua<$X05v_#uU;`z5?yUkt6rtX6v zoP#?1If4N!v1Pq~_1cnRC_|&h>l+TG8i!$FRM9cj=DL0uHXJ)CNDrLTi4w4#TZj64 zWDt4U7ukdu&ag=8RL_+((L-FQta?SU%N4f(rMJYkY3*0(!Tdh_+M~H!-%D=A+PLy3 zjmF<2AeD<1gQI3Bs(+7%{njagR}vWwwP4A z#1UB0h=kFU2nzkwYVC+lAFhHp{Sl_9d-y2FI7ikfc7%alMUEFF`D1HGExXjS+cVnr z_*$zX>5j1VK;ph0G|O*2nStq#(rtH-y`%a9#&vYSAqVSvaC#nM=O~#|Kzcyg=C)%R zO~&$%EhkMDU#ImawHW{b%BqfS zQSMgi(ko*NZjJdDm7N!h%e{GSarK2C57ly22iNUsf8R(8ewybh*)%AD8(4L(<4Xa~&HN=M+mU(gvEAeKA_c0x1EnH5`!${4qd^XGY!>PcDZCQi zB`!Ox=E6M)$~Z~(a6H-YFn*0muCN-)ksaYmqih0_5{uvFwZ8TSr4w_1+O&d5qAXf~uff4l zbhtp|(=vLVx98R={+LqAEv(b@g6Z=Wj2Kv_!5!s+iY7C^3;|>pmmkneCctSrUtMtd z=qvFfAnyL^y@=wEN#7n7ydg3xH!4}t+%=n4r)>T$Wo;%!HUTWNASKhQ^&@<{`qzmD z!>eTBNexFxD+rT^mb@Nv&*axY5oV0+*$>?k6txJ*wV=4wJU*b%nizmDxsu^P-Ceq# z*SK*MJ*D1%-T&jT(^4T@PAYmj*-hwzKf5=5SLlw+gRAu2Hy4;ORJ2=`6IB8GFWB3L zp2pA-^|r`lrmGATs%5kb;yj<%zLebu6mzpH2~N1JqlY2=9SRhnTC@1+5w)sCs-yc5 z3`N?sr>*H^kKn@}lr5;Bg}=#pi+6BkfHKzRlk0{%9_;>v<+vW?bR-XOfi~LK39HuM zdO3(90RsoV(t-GJ3!XMel{l$CDJs488FvqOcv-q!(5dM<*me)r{}QmrX4!z$ES3JS zTgq#EW;i;s8e!5tWTam3OwC=AT4r8Z{$#Egij;X$65=lQXpwI$-%7w1I5$}IOsJ3B zW}a@I_wF7`FVa53WPp0Bs1iC}kBhA8vVoS;EuIMqa zmXXGGXF61K7gA(&kgDIImV7k+j3MpF?^}lB%=-eatn`c+KwF2>($z>zl&K?0Yfti! z68UIVW1M3ms9KOrL@BTRY}u-0c4sE%(e?3mV?wR%)$x#87*qZ*LvvYEGwrC&R zx2RTD@=ILfAZDzq5QrG%pReOaEu1>TQ1dPub9nxG z1Y|F@siw>U=YVZQ0N?8GFbI~iPt*+t629JQTQ+t}37rfMiiG7c{=UJa zsE{E)x_|gY-i5%OIF{hyyufy$Bw9z?@v5O4Et#HKbYG14N(Jye0tLTf94H;ixPQ;a zZK$Or59PxPAx(aa0u{Dv#+kz0frDm>KV8x9T5APN17duhf0?u&NE_TUBzbkiSdR3X z?1KT>k1SX#nc!&Ac&G%^FGec~ex0rJ*|@{McZ&1q57h1MEO_Xg0e`CUry7}$mzSfo z`iQq48~)Tv!CmlOasIvmM$e5$g9ok&Oy2Dt&2sXe#_yEOpd^Qe1?uuv0=jaGeozeI88*IwiTHI{_CRAOHG38GA2 z!L!fgf>L+9NiBpv?p9UJmXHl?UYv?R4^#itOUdny2E)*JvGDP#(*InzR1n1cM6QUp zTMwsM8Y|`_1k4j#ze_XNBaK1rDGfP$x5cak3#_YBt6hR!uFLdfOGqoBp~XEQ`EWR& zkHq6b)ozFTTrOfwiEcK^?ohMk0!vWHqC*^ev-`Z}fZ*>NWK~}{S1q$&Ml#j~7_aI_ zEv=q5v05S?xZp-y! z$E!^q6W9I?U+D6Tp@FF>t+c%1?x>)m$KcL#@;GyN~z^# zy;{BQk!K$qPT=*`QbW4D{??o)kjVt6#4et}BrD@xPtuJ!TS9B%KP5aH$f?jB$^}SB zM4Y6D1lAT;on#ONN3pjDH|*0kTN(8)Xo*_`8xg#GpIWQZOS_zw$JN$g7W6U|4Tg&2 zc^%8+D@_Hdfbxumrz$MLz;4OyLr}4xhdk80@?}8D;IKnV^5-Gh#{qWM3-i5ql7 zszkIj@@Pyyr-Jh7FwzjGyA!xYu0OH!Qne3)LaQzqGXP2vv{r)8#Qe|Y#`HOhktSsc z%6jri#J?8;OGIaH3nuA8XKJwEHvi3Wwd|(9|%fvBKZ_O#3rQHY&x>3VB5?JZZeyy%}}M z!NK-jXfyBhunMPEk=fjn-0aTMifL7*Yub|CyWJ00*SJDup26 zW&UPDX4&*CBQL~P;}|2y7O!dohRIq2-X+@NvTI}_)n8vP02^)LDFr>db7of=5&NQ7 zSa8s(?1=9>0B(16%@C92F?>l^&-of4v9O@}^wv`jPNGhM51;T|o^p84$e&kbN*{&g z3*9`L(}$R7uTxg-l7+4yt&NPSNaf0MZN;_Tm|r#%Y6)Y(LWHD4~#XryAf2 zQ$UV}gXCfi`(uA8v<@zRgUAj5)tf)lKXD0oySX}knT{#|USl>Svl8y2V?+10^PILG zFYfXBO_U_Qi^$9yO<+`Dh6SdQJ>sA04wOjM+MXQ}gS>c!rqoRvX^1%6gVn}<%9H$5gGsA<-6qJTjo%3PJYU)&5fL6tQb$&6 z%ScsWC{eSCe2s#?e%~s+5(A>GeP=oDGZD0jn{>(`UPP@+>JPvOJIyxb} z?UY$Jcnxg+z7POf4(TdB5=3C{?Io&mwF1?lq$HKdG!_De_!VOcP<8vfDY&&QH>{$p z>f7xbW$|NA?0W?J21m3jm))!M!+|M`fI8!|Inz?uQy9aZ_QRAA7Q#GDEr;N#NTxS; zj?vmlH`N9*6~OJlnA+~Hv_78Sn9^9L&pWp-F;JPFk)>FqySfSq3>{x}vkQ@3PXP=C zdXds(x-w814Pq1762ktOK`H+53{~zO6J7LGL>m&SohKeDh(OIDo~E+@zH#B^_4|ee zI5}893F#Urr%Anl#%mh*ER04sa^o)2;D$IZ9X|}_Vi@^wUH3Jc#>mDZ=aQ@aqKIs> zZfbaKFqc*DQlX2i$dYb(Z*B^QCJXy!F)vhfv@|1JCus8Jj&MlD1*G!6-{T~(!+gA# zafU8*4Czi%n_0XkIVBB=tQTv5X4iOr>MsPv*FLkJql^H`v259P)ZPDWgdfXAprAT;&6= z$AcrhLT=@(-}!T=wEFkP1rnjp)Rh#6OkQ0k_u-@Fv2Xf!bE1i>Yi*hTCh6%27QWa7 zm#fB8_8yA%7EQQt*$S+0(SOtbH5i5)=$_Y1;4YLZ>?K}!>>sqWxt(+SU17EY%ReU< z4ZK?9pVVe-nwL)CF7<2Vdz5^Yv43gx8I614FwdL7drgiM1i6KA>%sQ%XSIu<7s*dE zw*p&?-%uh#=obxKv`D{T9VZi3PAh-0C9IY&{kL_G%P5&eO7g1l8pQS;{f2nqvQKtu ziN4GCJ-6Mn_rgv!{3_{Rb27@;NUT^ypY{Z?b@cIUKfPxukHe zgh@;v3+#FScC%8D7kAk8b%1=8x@p5| z=ijoGN@tEN&gL$co~05n$qM3%!xv3dTapUp=(F?mfUg6L6b9Z{bl>h&PPWT=L5bA* zv$9nGk#El*gb*973I*EAZpvWmcRnmS%?sS~*%*b+QkNq^*@WHv-yfF^M6 zGN!b0+TjuzslPLd&%Q6b!DyD{1vGA*4J2#>Lu9PC8{*Vou{JPp>vWbY3|qxH*ZdYAyRi`iAEc#TiW1lF%o5^ywE zD*1W`7ZJuj%sQ&;y<0JBL=irA*GpSK$R)+gXBzq;oIA>0+55E_L9l}#j@WYw*HxUuLWJbnd6*=YH&?A0r zeYr1aF_Gl(200Oh$=4_tR&sTHhwd+f%KA9q1?| zJWn+gOQj1C{0COpH)~5iMAwP7a$bU9RicZK>xNoJR!lKb2o$WueB;^zI^Sx@n7+eS>j)g-U?PTIr6w7&Q!MhYRk@q+tOA`?Rj*(Yq& zBDW(?Cmo%AKk^unzYml%sk0px3)ak1P5l%1Yc29}@%ZrByQRS7v&JJ(8Z+#t6zP5) z*)C{#=$tW%&G_cU!PHODs!gbJllV-FxBur885wN+IoGeqannI$={cVq%OXyqA6uXF z9YQjaGadt|u3EX8T1ed0diCm3A)6?js2j+v7vj}S3nC{FDY4&ti$S{^l@lZV#ssH3 z+|@;n8tP+^JS`c{m-mblPlRU_w^uxqcWTVGS-?ib%4qQ`LSM!aNC16TM3;VB0V*^w z-B}Uf0tmKH*q7hS%l7K8e`Lf>2;s#uUz~BCQ9t&EA1L6&p5KYyk>ybXWNj!3lDKo* zs-B>fv1nv-8{2GBUXa2>;POV8PI=yJ08pV4ih6TpxNVgL`!HNLpC73YCO*OX1*`9Z zb!7vA8EG#;7op-<1qB5e!6#gmjZaO!aso0X_wmb3t(SLNX`$WML)q&a|f>T-+ z=;S$VAFO_}t>ZD1;89OieU)mcuW0GFFYu|vZgsAtljGqPLFETObDq!~G6W^D=lb`s zw>YPMTi&ICsQZhW;Euv4jH*i?>}@%6UV^|?yMyMVEt?Udp?qr=?jF^=ks5l&4BDHU z;#q~xG6@CfU<$Oeu1h%5&~wk$+~AkoClfCv9$vdKV5M#Igntg((zDvWGv)Se;0$~G zy~tu+;q8KJ0QesOFMlH`}|_fW*A`R46qpJ~-uBq{^AywZSn{<0%| z4%nxNcW|p{xJmWQnbLuEU>*0~_6G|#Ka?ZYNWL&40E~%?+C1S@@gnRw3U#vBci#uy z54ZL8m&F}Rxa=aRz0CrOI=51CH8&8!_IO(x=0jvJ!6s91g>|3L@jhd?z{yad?AM92 zLRzU`S9)fGvqs;B^M{gm!p_udqQCXRkc1W|1Z$a>)%x?!D3|#rxj8SaG=YUr0?DK(cB>z*Tl6Q?0k$NUh#zQxL>^eOtG}6 z;Qj`;&GbaulA(YPB81gn%CSFlVvYOhp2x2Y?$j_*IbN@7`M0z zw(6_20!XvI8t#hV095YwL)6JF&eDerF7>1D=K8VETE+`xm~u9Ec$fN9H!@(NJ}wzyYvFD+6k7IP%&?cN}{^PAiSGz0PY|g~s9TVsbK0@n`l`gSc!{z`<@)GE-UX6Qt7;~4 zlz=-5ROX|@r$AyHv@%lvjD{q`cz{s1OqO#|U`F&Nj1e^b<$83EM7yqIwyR{;3~dWE zsC|cS&OWc~aGh=YV&^lEJU^KFd59%W7H*t)s(a1QlOTFUa(zNObcKol^-b+XD+0=0 z!C%2XZ9;4HC*cx}l7=#?b)|0;xZ6ZU#Jh4Nst;uyIrZ*C_c4?a<123~7Rg~ucvE-` zZGk^!J3p{9Qxw5dY;BnSscY7;==0q00H}C&rbK-;4isC(&3dz_YnIxS5ve>!v*hIu zO)erIokX#oj7&t)4On!^URr`K-FY>+J|jkalO2ut0wcTMl(mNh6j?Wei|g%DPwk3i z;`2XaxY<=pH} zm2ikM(~VBvQn$|fwH>wgyy`&bF3W{e)+MyXyU>ZDIL_`(U;Tyxg}Kp>gXXh4bPtu< z2-2}`g>k1!zQd;F;z{kbD+g z&OuyKP1pEa+LCeZPCM{|b~c1wL;c6OuK<2|uiU5R2qw{NL$aa;p|sJ=%%PL05~0yY4Dap)t}}-|3B5msu#B_p@N3w>I2K6Y z*vxGQZQLa64O+&=G>qZDc>G5{kBN@#IF0BOYcNpkcMKY=fU8;NfiACnRh%^roL8-F z>T*k|IHK`|3Rcd98G6C0;qi?%h+BMV8EMS)P?~J1bf_73B*D0G7mh;_n5$4h@Go<+`p{IHjf$Li&8Z7Z_$0w&N^^hdRi2CElI>W1bN8-=s-XLm+p_^LK zz&>va&ahux84X;M#WqjaW{!9r3^#+1xwHb{LplW?E60jhHv*%*QTXZ4F7?>9xmwTR zr-CIuPFgJkZx)Jbht0$Ha5YHjO^;{bj6POR&?5yHR)svx{ZyF66>(i&9 z5{-B*dDi{iQAZm{Ba2eAr09BmMX}-S>+~vdT)x07x{V-AeoqY0mT%C(0wDhk4lR0W zCXt%JIk9<|S#By1u;?@^5?4iG$}4tNi%Oid0#(!d;Y{#qiM+~SF+Hv+zQfiBBdT@l z;i&Xcm?Bd}b&)ZDPB-UtjkKeDC3g$UFiTE_kCs5rf$DGtGC7D>@Qa&6cGkOa)`{7N z#S%bj#Wfar*BtSpZ2==y-m+{aOF1RD3(>t>@57!TPJFl+E-xiM`=(J`82YIci2#pp znKqjXE@!2#X0aV?R`k>tF=Ac`KC;!X7HB$Tl_;_ZR-73=cE{->o-!~J__UO?fWbnM z`oOKxnY+0y@lT&9&>SNjlD8S22^5P{eXx{~TA40xoptWT9aQAYtUI8`N9PkJ>cZ)t zg=|#3^LKx_lib-?8b5uQKWBySP-71N(Z<=(fM;Vp%sx~J(%x5d%ft$XIU1%)<`C5ZXyqJP@(O8w$n+=|Dt}B`(QZ}+`?nkB3h6PFR2v`d# z=}eX>vYiXE;`9--9=}R#?UQ)8@QUN9rDg5M%M4p8gu%7FIKE5ZNSo^!UU!B)fc}ws zxlrUil^WbI!BO)&QC-_o$bBcCI1!mj>xUoCk&v=+SF=d+Tz7Nn(_2L`nJ$qLVDmQE zw9^G*zFk#~_9J}EJKzu{y%GJUs?pqJq_VwAF-gp);q@b+#swGttKdeFhpyDE4JhZ1 z^AO$?@phNOl<0&hO?q=^YCQer8CiN`&6Fd@Qu~`qzS;N%gFnS)ymhShZhjw*r^2LK zigAM>5_aDNZ2nmSEI*BYTDg`)u^(fK_0Ox1aROt#q z)LYXS!Cg*)0SJ}BVMC*DE-57$+#XLZt90MT}n>YN`g(sWtOZdHy$m=OPdZ?ZPf z!eBUOt0V0fkB#k|F}h1IPIReSL<+{CMOhZ1Ldib?b_|~@s$C|XB(oKSI$T5H3}@1~ zQFtLyydjlpqNcceBtTdNtR&q!LNBv!?PF$JFw2=%dWJSFHVEPkXHKrs(}nXlzuDS$ zv1pew8B1)|bTK#RLW41H4%?||W!mzk;}0xUtp}Tx_WZN_H&}6JFFyn_qc#`2sXon?NSC#gQre)zWN@S1)rNKb|1}z5vY+z4$jznEu~9&Hq!LtCP&# z`RgHn=L<#~XD}(@_l@Ea8j#0@tQ?HCZW`g55Z^BjE>;VXXdj`|IBOH^1AnkV>9CJ zWbR*oS1F~?vkdV8n~3suNZF_-m+~4O06y1nm)|$;5x-TKX1OFKk?sktwY`f2@}?KS zWy`)6(e6*H&C_r{`eaok^*7g%^2F=hs-!%+t62JZVM+0DSZtVtk$9s-S)@j&_;2|^z@S9uqb_A8~ zpx%%_O4{0?_`OAXXcBkr~iLa!{zO- zA~6<2^|&80U^TwOKVt{e?!4fRO2AR;l4O0>IZNp2oEHb8lf=H(*uaD72C+3e=bumje zH$7<^ayq&PAM(q{H$M>C4`8mnq;? zII5#Nas1H+TEOU;z0XbKl-kkfzLLc&8bgH z`J*i)w&Q^cx>=ukVs(hfr~{PH(){?my2qCwDx}VjWY1=&QfAzLpzUZ2XqK$vannov za}9bZc}1(|65mq#=jE-@7GvR@a8(5R%wVRHdBknb@0{wFpng*4LZX{+Vs?>;9+Nyh z&0ojW>WTw`BZM0|b+P5QZq*itM$zAlx{k3;#n8Jlywq;_J5x3h!r3Ze5-uS)+e=mE zz$m=^AW;W~bv9{F@r3-@t`fr1S3r_j_fCyfjHqsYU4pBo4hS;&<^vUyKk)Aiy!+_L zEp(Y3uX6Ahj@O_83)2%6EZPz1a zfxq7T`Vg+ErOZgiJsPjO!!K-Kz*lJ=u;shVA*lDzD_6YX9=6XFGk8odGthU-A8?Bj zGq0G9Un7O*DI_ra4mSO`=e^~v41C24@o=|Fr0fUd_wn(}!tQkjcWh#qLgKV1JV7^U z)*3>Xc$t94HxJYcn3rU=7apFn0!Af0-A9}Fg^=`gK&A%FH(&^ zS8ezkHn9FdE(?)QgCN7?5%k2Ne&nC!|2)Eox~P#L+f~vxp^GAeNyB$0S65%o{qyM& z>w_+nxciXUaA?)(tp|jnn-KoxWA;U9IkA%`q?nv!w!as_{MFim`G!oZCfhke&u?G< z$Nij}Hf_Yc;P#^CW4R;|d^S$?TO8c8zlAMIv>HeHurI4UFd%wQh#`^|D`=MTfP4U_ zQx9UiHTgH@IojhnlXan4FOBcm{)@)H1ONC#M`?9w6v7x|SKgr45bvDFbT8$PjpZeZ zVGOfQljHa2TIy3&>LaA64_`MfLiK+X>d-rX<0egO?S63+0eJ%gMWy1cu4;BeB zac3zaK<)*;8zZ?*E+n9IvFx4r%G>?Dv5xfbr%pa5#lJx^vFkAi^s8S|VoOcSCVGO| zheM}WN2|S^*oz(v3e_Zf+(=ztdA`WZZ*-@?+q=1WH$rew$>=VK_kJX*|M#*C%}`bT?pSFBAxs&+$jC zk4TWHg(|cv4KCA$10I-Tq;H>?T{;G43y zobj>4ii*}rR1cFeV~KrBxqyy0nK~Y~sX$cDMf)lm3_>naU3?Q(eKIK_5B^FqG|e?3 z`qn@)`BLpu6&2`p2MuBb;`BoT1RQu}(}QdjD&DRVEaJ+jqT&iolPrGy`g8I%|6iU` zTCA-ebBM9j^==xFSggEIE!itAWli!;A8qQXFFDXRl(oEpXqED)R1)9wa#T85 z@;|2s1NLmA2OrUVf3?wg59-c>G5MXmU!b&b{^!^~65cv2zCg7if>pfig+d(B22SRB ze5)!LFIIEt?el-8fI?R{3m?YvtNUTpIn0J4xgFD-8Eid|%*7!Th|JCIm$aT~>S^(P zLzou~+q{a1?|IaK9YE%7{XK&Nf>}-8D$>$siU|G;dl2jKzLSwJ2F3V^(9p+H$!>gh zZ^d6R@v(dhiwKU*{q{q}4vD!Kvl9&@Ff0~$`VmtkqAc2h2W&D>4fBj@73HD7cgP#5=+F2>C(Lh8Qh|HIUIfHkp2 z?HcK!hF(Gogx)(MMG^>v4ubR=O6WyYqzVKGy>|pc7g0KbBGQ|v2_S@`6j9?56cCYq zZuI>By_aVmo-n-gtu@2U-own^-@?qe+BR&rr6Cf$bP~&Yt*qym8{I8rY4|!;(~M^> zsC#*^3GN6`y)Av7q@FHinTX;K0UAy%la&N`(Lbdy`brOFN<;l+haa3eZ>b*$=6k{8=s@b`}k>J#nD3b1&|Ixebe>ceuXl0RKns3 zS6au@BIbgI33K0_`DK)sl)^73NghslpD;$Hq?z^?Bp1qZ>hmj=>lceFM$FV~kRZMO*1=%?b zbx~b9l-A6JWJzeVy|}HXM26W9o9H~IOll4_PhZ252Yi-U%|O?PmX5uj#aV5IlBWu z9UCJpf~`b0AEkQ;wZED*f@VVZW8BzgBpD{ux5!pzRTM@Uz+(_d;7}}ZDK{Lsw)mZ~ zu;VsTL2QrPhwjo=TJn;%3x?uFDGlUpgU9iC_2aNJ(9PTv@|zB#%Srkbe0n;-&#?qA+b1fZk&z=Sn7!dZA;rjP*5H;%VV_J2ca%KGMpg<2 zyFm|ti4W6#H4XXg+2vIa_?53=)Knu$x{j_yTAGj>3NF4Oz|;7uAdfSyWH{`3#wFM) z>R*46L#dp5F4JpuENQG|ncE#M8ZHlbD**R2$f1>|HnI_GoUz(4I4A-O=H6-cxdje8 zgjDO*PYfYMSdvR2>sV@5yyZh)eJ`<&8=QUHw<+)uPsYw!shgJeI#(5qZQ<(1%=r&2 z#XDY7^!LJ%&Ibr&9AjZ%V4Z9potTQE*`&$_Y*;dB|Lq&{&O+B(wT#h&(sK1ZEg#&{ z^@HU&Al*0CXONV2r)Y;b@*Pcye_d$SPg-bnaa96i4!0ui|AjNob#A z=}Cr`$P6hhAqNU|6;n;xcWhz?~x zoZ&&mqJ3@}+jhZ564^$B&-p2+tv9**c>AV;Fws&citg6UFQ<0w9q$3ZkUb4o@N`g7 zf}AdibxY!_Ozp)CG%7P#u5DEUN7=h|=2hXU^TMt=$?^-Bffjw^$t1}cBUcW^dsC3a z>Gu3>2gmERxtsJF>ca=DLIZwm4A0MNuQ~Bka-sDYdA=*kvZ@<226B*{c}r#5+r<%@ zkb4NlEhVj76%P71tIQ-j%UcE<-t`T!lEe8*5WxGA7`S}xBNn15sZzBri!K&V>-D@gsU8(&X11lCh^QIywF&OaI~Vxf{cnv=Dn($ zw;8WnJ??0*q7B1t-_%EXxU@=n$M7WEbqmU2rh85VI^+qTkE&q}O2yRg(xH#w2ErDw zm7g##IB&rnX?IZGGEzvUCY7w73DX$j7x*%#+c|L)L%5E zE9e+tv#I;+8gDI*3cZUHKs&vPV=U$2M*6xFr5?uu+=wrL#3QfPtoO`RplRdW z+E-T(oX!)2tb}$X0rjf!tW|7k>7ofJ3!{?GyORqIl5yyBsFG3^s-Mf&=^pFY!(Q3A zsZTF+*Qt}FcYHyLy!5_C+PC-kvZ?@PPscaVNpYzOMcc%UsdM=!%mds*m7$se>#2El zdYSD;cYLyB?I7{)#*A4d!yRvv)6O%wcUkPcLd3#F@Ou5X>Fz1<>Vxm5TpQ}>MBd}7 zCCyw;3?&DdUVFyl;lWhdMI}u`L)+r0Fx$`)vzK$|?qpcRke&>18`$kTM`tKTvU6E|@ zouE=ps__#M%AtPF_cjszf{}8fOE%4$ku@z5)kN(A zC;@YZP{8t^&2xAt2++XY-MMf}_JRI6AGQQx2N(v+92-&Mm{BRe;R)Mn86)buL-A@W0>#=vG2bB zKt)|~0-ye{ZbxQiBBI5C|B?YB^XzmzHD7!zTHzrdF`8*gjCnPsVTc&eRXo3qcnqR9 zp@8~tVv(kK(Mks~!fUS;3S>}|&?h&^Nd3m_&Xl{XDamut9}q)pK76I4`?SIN0}F^ud4#MWVos)a4`{eXbm2>3`qjl-TEnC7=$pEIY2guB5#ffMPQLPc^f|PqD+0Emi}n-p zQL>!7MbS#3&y#Ks%|0}Z9P_p$2JjF+9jIBbHFiqBqNw{7Dzg8I5xQJ?rPt9ICWWsS zUSIru z;2mlEv}9nSasZX?vJu6 z;5eYta5#4RA&vZs-0-(WaO(G8QNm&SoxVF3y@@di{6g?_h7S{I(JEva>GT}TLxklk zN76%k1(b|_Y&O|O>G^>BIJrJvaP7DYkmH^kbmA8A>D(Ev$~uSVO8H}knoIg`;!w*M zJS7x#$M~@_!sldx9tl$qbIrj140YYOe<`Jr1H>PbyugJ(Sic)Ma%o(qwe*H z*2dLt_{B%IX67HdiJu+qljl{vJ%gT1CL`g`H^u)TvpBVIhT@;nFH-7YwK?Fj zDQt4;#5HwvD3AH+taxiFqrMLG19ie7eVr9k{FRHssRyhG;-s~d830)(sl_xlaSy>wD9nhm#`yAVPspK77Jk?31#KD92R8U@SK7eEo zZ(cF=U(X!gSaZ&7G-#entIU=6@b?=#5e;A#`*==Y$uOlqkkv7=ua7T9#-(uOr_p$N zm6Z)9OK7VW@YbWIIpmj3s9W=yjFpPxLGX$G2lfxP8t~LW^FWK9JZ}bQDfHfzez7W} z$SNOJE$G~o^PcE!meA()4#DnWBuzFtKxD)xH1X|+MJZPS7L5tu#dn* zna%CzK5F0bZ>)*NQh|Q9`77AFTcRfP4Dvqyd4uB_-+s78n#FKv@$vxN^0uBB9^0Jg z?~^Qh^^^KVO1UM4ITaS;xsY?anaP=>qRg2}VF5=HI}e8=WI=@YTb}?3`k~M_G`ge; z7|G8`W_}vhTTI6EK%%=X0XHEdjy2r;U5}xb@*)Tuq0}t>brrk$;s^GrIZ$QdtjfX5 zpeK9rc~6g<@4sRnNIN$e;myoGf=7#XiW&~n>kMC8{Di^MvyuJ7-4-*Qv}vd%h^xlF zrI^&$g2<&1>ONc+9W`JBMfptG8#2A@7ws1f&<;IWy{++|_xBcx)@hqvaHFl3v(=d& zIxOaema*1anOWyBm+JgWk4AUvwQXp~F$0)~ZnXI>mBx{e%L|afK>($89W&f6;Z4%0 zVe`zM6zb}ytVC^IPlv<2*y5VTss04Tch)@qud^(KsW2s3{*g-Q=lr&UbopU>^3#$B zU?%NxFISU!Lmew;z%Jn=x!dcTu=*xl5nn0s$#c%akK~kwkTrCjZhT(D`iY~+8QuHIoMmy{lKAcmqldJCv201A z=FD%{M9LJ0CEt0%AJh=CpQISdLP^Et@~YTTpA^`GtPH%8yUaDXX)DtlB{#vTy}Aoy zbK>iGtq~xaHKUrLafT|RRLFQ@Ku+IK?=iDq_;@fKZPb!xx?u6xdxpiQb$WI?(F-x` z4f0;Mn0`~MKCo7irQZ(h-bi*qW;gDki&^b?IjXwKQzX*}Ephcyemh=VUVfGQ@pW=S zHP&yfzAAFRbCcfLR8;QHkZilUbBBA}qkfc{etR_hKz4fH@tB2;iBY&@O#A~{e4)`9 zJ3I0mc$DNwwTP$JzA2rMr8!!F(*6Vp?DASP9rJ?gQN@^aTUZJFE)7w}WEd9Jo|@*QKzCA98jmHU?`%$`E^!-c-Q@Sg%x?O+kb3EoNu z$9pVMwUcD+(}jCtry?t~R&6|Pigz=)iSp$7yg5DzRPxVB-V*OQw`T*d3gER1?t~(C z(z^rkfyZXyx*PC^lzHEBrmFRU2TOUZ?KtG5%!t#ftqQWhp?&Py-bQxiHp+*3^$q6Y zNQ{U{OzgEt>|KI$ni&{L`wsQq`nH+n#cihZ{IHRJlbJWSWR=M#osHk z^+NE4IK_viNCV9nMyg%rlJ{aRKLO=8uC+p#t;}$N=|B~H@H41pWM(?JX zJ$il2N&ZC3r{cKwk|MKh=(k|*;x`(z^W-iZ+Vt{UyHO?nK*}3Lv%bm9(&n5Gt;9u< ziGPvDy-hJ&7cFvXB9G|$-Q~ja691CO7)7?sUAJvH=NU`i%8;nhJ9p`+o&dSuRxIOm zN9I-CmgC;D!B}CgsSwLH0Q}=1A#d4!sz`tZUqhL&9}D*)ttIcf4AP|qa^IEhc(9K%pGqkTl)WO* zgfD))D{_n(5PqYZxt#ahJy=Hcw*&pMeDcNBL8`+tkr2o$pA43cJT|y)x!Ef3kuYsl z3~gKzsG|@jp<)7J{e%@w**GSrvS5PWbPk~5F(vO&fdu`oX=;&@j-PL^45F`zND&Yd zi||(hy+{Lfi2Tr#4P#Kll@xlwnPBiP0M}btIeI!hk-qN=?d4*b!wR=auaZxZ9c&Bn zmW0#}+pI#a@aEs{JDaIOD;w^WQF(Q&Jt%s}wFGpF%vAE|58_%DrKpp2(Gb%AE`S z3Ut4l+M{{)xiOOEf}^{C9Vgw-JAM!r}}!xJ`gL3 zo=jHNiqsE%faGO*BQW@W?}OI+YIvV%^3;RNvZ>don5ZwJIUeAG<1vPzMd}Abigfh(_B+j)ge4{3$UHxBZd5WQ(WR5|6m*$oIRz_ zGjrUqsT~_lSCCkYv_A`C8z;K0h?&0T-bv1N|7=KlZv{5mzux}25?(HT zHHqaCRwyXrYro)3Z9+37n42e6CW$_ zlT(WGfpP8B9aK3#uD?93t1z18lEmHr`W&_^N<^=HLm?;5fcB?JdoMi#%c-yA28`$p zlYO5Lzg_Svl}6wM`N?_f=PE~vd9tbm3v7c z;CM~3@Gw*%04fMdW3Rdf-KD^7#R5-lb*XPY?Z6nHDi>Y}d(Y=XCA73zr(rwH_*D4! z^;!**$5^Oz!#m***Y#~fxH2BDooBZH+En1jPRGF#?G>(X$3otByH~7d{p5^8N(`G%S)WQT7l`wmf8tk-rEce^_G^3# zwH9yh8~HILoN*^v_GV~+iqlJ6L&VjGFjqtdx(SJ_&AuWc1bny860Uj^QCB$S#E}op>Di~M`kzXePF>o{ljbQuC+b4_XHHgpn9WOI|kE`$LBei9pHEs zJ~Cc}DSmoR!1ycmEr+Wj_tF~St*&3N-C`PNYBn3)Qjw-GWyHXZvKN&?`)qqhN>Upp z+<`K-O*rWM8QM)C%Q>&G-94e!D@{#>;l~P8lrF}~!d0p|Q&5tgBX**1$;U9RN!;=2 z&5ZdE7;!tFamT59vzHqDDM_sWSkj7)k{UcyxNAMkM{hjYiC z^F5Wha;ZQft~`UEdM4cWtv2w=J(jz5T0c5mX#;x%8J{Da)cCV%I_#!w)oW5Z?*;Lp z*%84^PdS|G;&*Z`^tOu+vO`UJJ1M3W{HXstWXOx-^;JG;ihtyyNcB^@ z!@c_{H`&HZ)emUZ2K2^z8Ip13Ex$n`Sv$zaH%xZ2R2q`S*)g>vyxvVY(qDOVwgadl z`#K|r_O9tq^D&Q~?KllicG_?SRi*9>ZgI0p+z+9K=>?4NcWTJjC_k5I*ypQpX z9nVM3faH6o{RVAT`2&Krbu#9ilHlw~#o}owVhQXbNEqKJeAQ9wA498NZ>}V?X;*s? z!;lK^DCZ?(OBqWaN%zgaV~J2$iD7P;**3W)B2V*s>X}zS3qDKs$vU-6-6ma#xF6;p z)Yim@5&W(f_=U((L-L&JB(m%2F}-E=#*|C1<~`ZHafSD%Adx4~VGXrhD~|iJeS(D_ z3-Sklh6E%ucAl^$jW-)Ryt%Sa`b1dOA0Fn#H~a;gaYsy+zR2=NqY5%CZ-MjCdI#@4 zR=E%Bbt1}Gl7So)!or;HQvm<^ym?jbe?X2sWC zDeRAA@6=QIiF$BGR9I|yBaq@~Yi^VsQsuUr{=dXvdMzcDl$_Agn& z&&H*x%-@A4Y@=I(QatYZ5$LrJlMD@7?|wd2gPCn(1GNI)l$#yl2ZrKtM?Q=8hh2xY zUZ%YdjdrhTa6X}6u89~Mdt#q^*uq}3@&nIoa6MsMDg7bs)i;Kk)HN-|b4pD@?{qgT z>K%WfAL)ocnt`EMwTLD9^&`QT)`6aRWw_&YuuaKxrF^8L=j*uKnMwnLkR_~S{RYOE!+kVGDavf< zzAxF}rz!86XyNPAB+p4L6l~A)cJ$c_u&6FLu)AG|Hv<)_^NXEYYbBchoV@VSW5aiE zk2xR7|u_`I<_fsPz;^mE)PdEAni1x zhC9?fXaQ~(JNeG`F8DW12e3l$B@M=#33xT*Y2Ef+!`E3HVxuA8K>N59+utcN+@+3Q*mD2^pRyAzT>-s)YlW9+wsH?T%&27H+`T%ZpI~M%U?sQIXB=Q z?WTYr4`w{seT6c3n2fN-8ZEJfHTqBO`IstGm{lweex@hkWyKHxJE5k5BcgRAcw zKzS4btzz|B7K>`ut&0E(SS{UQXH@&=cI!^H6~2NkQkL%ia)bQw&g{#bBl8xL!IioTleJuLqv#ma|K<>15d@nJR+Shr^sl-f9?bM~7Q})9bIjH7{*V5%kMNZB z6EUC#J?lFOy@dXNf6}Lxw60Q>BmM(CuT0a_C81_w_k5Q(HHzQ=OIDWt;a+k=FMa8X?S$Rdt#ukwL)FFTG%AHbC z{oXeUrn0Xy{z@!jV)@DT@PVvX&Z>XyGwzglCq?Vq+LsG7SpIhyx_5-p9a{(^9QdIkX*pXeIV2g!7zrEZ;WJ84X^#=j0KyudyZ zDD_ngTc!g*%6rU(I9H_*n>y2y4! zt^=g)$dfjrlxp?DqD;ZiryKzxdD1&n7C#-tkuJ7a9gYx3kFtw&ySP%x`*F9N_fO}_ z5u*J7z^li*FB{F^Gp64W!yw=KUCG^CvyYcW?|e)V}cV z#czLsY@S^U%QDsz_d1~4cdF+R$>s6g?Os2rU>{AhY@ligeCI@W_h#IRsCYAU{q2D?AC4sbw-%z;hY`Ii25tTW7{4su z3}GVyseYdx$b3+D|KSpBQWc^njzQGd2=R(!DBia`x_cP)EFt%DU2P5_mhYv{Uy5^5 zvYlpBd%x3~e=RNq``rp)o?Yz@0{>}0<^w}Qg>p=>d}(QFE3bQ(UAN7mOuBFE4!n9K zboFloW9ECuPBPA>lv}5B6?H7fKfozHVGK`|Vc@ zTb6uWK5^$4V2gCRlYnwFYnP}e6#XhI9%8G0YEW`6vwHzao8Q-WrtJOz-4$j;s6b!9 z$60}%Kfr1bY@{Mp{a-Q<7C=(hUm_o&>wb~@iIUnTjhv)NTH;>@*_~~04=KU_{ zmrC`pldQa1%(@yxlIU*mQ#4-9TTEWFd;Evb4|2~uFz__elb56ZPocukOffHhV8_l1 z`3G1H3Q$h5PAO`*YTdj1S93MEPi1Sye{k)U)_=g(*BZ)i2WzXXiLd?(3dKZff4lo| za=uONuYy<<>-)DU_nHnOVH{@I|m!jBZD-q}HN7j4;-ct77v zrGm6cRZ)YDj!`R)?tYn*U*l?!$Zy#PJ8WYY z5FY)(?ks*jhy+0X070|Ci7+WTC#I)0e-AgBjq{mzJtN!y1vp=3zB_zCDluW@!+G?l zzXF$|t(iyr3jUW^$(N$-`AmM2_U`u7ftku`&|ChI7eNjg|4ERtTfY?g-pw>D zzF;JOr;zE-$^;I*yAiX8<$feJ2`kAC&8nvp*L zjbdS8dn>Uk1;ght$@d2^uW7-i2$6Q@e*vR7>e90}$=|fD3X@vVIYi8g@s}alKfvE4 zA^8?R4<8wi4bMnxzZd=koc{T<2j>5Oz$cL>&R3Plm?m=*|769v8k9c`>0JFUfxqAR z^7LbyX!T78{-%A01RzB7|382ppYY7*XZBhcFZmyZ@YTRh6G;B5pVz<`8N=dM7_U&(aScYT&2bp zn=ksTe?s_@^hp5Sb;?|_zko@${+oi(PUi^i0n%Q~A>e}bxqx=Ex$9*A6T;-p@`J3X z$8;{CeI$i)#L!`VnI#!nJ_#TR{#gpx%3q)<`){oHlMYlqB4*qu5W2dVfB(PVl7haI zh`pxO)X44@_cwk;l;Hvv`s4Q=?JyCpaN(#8~>Y~ zE#WWMV*UffoK1^gcE8QF1Ew)T^8EsCptfAJKM3L(ZMQW3YJz|KxK4BLGTk2C$q1=H zKr{_B8dQ=mdtCmxQDprmOLoEzFIiV5&VG@VvA)9Z-0mRPhKb6-*tqP-xfVg0j}Y!N z38}Jv02NH`{KI>qx}V-56$CXm?_)ABF(R!I54L0FvA;l$EX}W9 z`LD>!uH{PKNd5@PHzLdFKTFv90398H|2c>3!O$n-{+QX)JC0Y9j6lCG9{JyKB|(y*=%9r$|>a z3AoRJ_@OW^-l(>1M3#>*t)RbAM$wV6Ymu2K$VwcyVVwlQWnxK@4xMkog zV(KOM(ba~vO#jfyFU;1k2!R9%qHgwy2mPkF1qZEDv7#d5H>@qgB96${uFBjc zervEo_XxZc(dVECDRrhtvump7#8b!*6=0`NjH6+PiUYbY%EgYvHqs^)eCj8A81UIT z9h(=PhyFl6m zmhf|$!Rw6dgCZ>X+IT2^S6}+`(l6!`J-FDa1`BE3S1FcIzbw7h?@bhNbIsNr9%V_QV(hGZgIWEZo*fQNwfZ4c^>!z z&vc18kGrpMdwZG(`i-UiC5buHIsnUy)XiO{j&H=H)-W0|6jtMB8NH&-E3E_W{?8l6 zo6}tr)`WMO9U;WV>Y>&Bx&($L0PY<)(Le;crdtECqC+*o+dBo$E%A(N(QKuYi6b}k zB1;r;mG+@x|I7l_9o#1TXz=w@Y>@T?;yk3aK>l+Yll{ZcK{To$7|@Q%wEQqLGo~v# z$II@}Mqd_zal+LTvaaJ^GVIqYQY$_x6H5uHgu(TD`x*&Gj?#6T?kg-!@P}FsCgtP97+cCf$f6LQR!j*MU9UEM zbX{-9I;HW=qmlzyz7A15uRA!(=g=~U{UzmI8Ptv{T~9+c1Hi?a#=RhrZe2KtAU+=@ z|IJ&~d4TgjQn&PZ%s>Tt24_494b{?32dH8EXg5N30to~?U-%_NSK`(%pm0&BYpB0z zsI2k8kKUMZl%(IRnd-Rg92p*hdP*Zzo8(L-A0n5%ec7TYpe znWC?uea`49OFlexu5m5?_|6H>`bdYA&>#zcq@#X|Qf5^MXY1JYE*IKWyx^Lpm>fez zVl-{z@(WHI-2|4jklCh?f63@H@;zc?pg;9%HMut9R0s=;fA z_d9ZlI)x~i0W4)sYYBH zDd$pvsGLd@&Dq(Oy~LqD!Uo;?<}{CHK4K-%XkuF6BQ`<%1pwoy|_ofwv2!Af=<~ z9hs(Iney_E_2}FeJ8GV0u_%E@val~ea(?jfO@mHMpgPLk;uhO<$3FlM8f-Ui^_e_j zN?A``f3%NZoa!4?STBy;Mg@ktS4waTEzHmaHjcVSDYl!kd&B+6 z*1*2hK?1uv$-H4OUW~0!T*?qsvwunI0B*_yllR@IG8hN!;KA+rENOr(`XjE%ub_1J zgpL?k%CDs4nqCo&*|UH&!WnBo(oRkD2emqld#)1UgCl#WecI*YYNMtv0)ij=phbL8!|oEIa5D!W8CM5rS{CL z8Z`G%^7#CI0&~q2Ppx`*t$?ZdO<90Z_7rjqJyw+xv}dJP@iubej$Dj{>8Ut(_Sd|e z$@;}KiH1;R2uELT8m5>H5qOAZEbZx#5*DgWMnetie3We#12QIR0;`qgFqnS|pf5y1 zSu`A|XM1k2=bPHL8(Ra2%&Q9~c9g}rZTf02cq313^l<$ppNyIOopp-0Xo02eP$|e9 z?`Pb60`5H%b$~vD5t=182}<~ZwS%j&q4-q3R>qB}N;O1r&h#AL*i?G?$t z*aa^z;jE;KO89}=#HZrV*kO&E$JBM`zGew|tEm-xp}abS%o_bE(TzowhC0`D4OJei zxQx7y&e#@^6KF82F+))h#^%e-FxjF|AW`dn=%&)b_&SRzw}MUBSw)PO#SR*E&gC9+xb9dCuD`>upmChtNGbiP_>?J=7RLoKl`D(w* zKecS5;@LWB)WJK|tzvGC-oB#9L2$s|3MK`qBAc|syj=QEaw4^x?<(<*sdTad-W^Wsi}=#0A9?>C5skc= zn5xC9Q_iqTU0VWYzu;kvjii_}4xv(E!_BLp9!+LO7!xZJR9Hp;MX^eu9gOTe0(VDi z%(rk6%9#gF7-60shn+)NA+EM2x(^@p@~Cw(`~|brAfrK{(L-HBG=oaC@$fy1NTQ^X z0UT0*G1z=Ql8Y?J#N8sK<1IXljCCJ5QP?t`fwZ^}U*j_fB`I%Or6&@DI&zqarKWY@ zdESoDIemQ^Pz-;{G)TNR0_uC^8B~Q>92igwsq>j~duW_elBi968{AK-x$P52PCyHa zbqJn{^;wX!PGDy(upimYS}i59fC)2A#v|b@%go|#)Z1y`gq8jy9z9l@YwkTpvqG0y z(iBaZSuFDG`ifP3{)c_VvjxyzdV5Etm~{>kYH#||U_#8m%UOFggp#r*QH(J;Qx&=V zn=z~RTz?g`IOPxE0a#s2PCYd7jL;5+5m1TbX4&>*A^3(-v&e@Vi$aGt#XBzO&)9$s z*24?;o8c)q=7RDQ>_kf(1|V|LEWF*i(-T_>M2R-(&+a}UjJQZ&zf}Vf#^uj#mlnML9|ow zZGrt?Tb5rcO3v)G&Dl5149v4! zW^9`K)D_m0W_hCNvUL(9<*)F0c;8!3MQ=WR=W1v0h4xZ*=a1jPI;1`~rQl@Mk>rpn%jU)y@g)7uv!fZ)($l zk*g``ijz}^Dy;Rx6H_RYlJqg`6^VokM|_Qu!o0UKw6t3hvF9EY&D&U^_Ff9KFqlOJ z3=M1#SBpe7BXjba>-1b1g<%o}@r;K$bR zC%Gf*jCmg?r(JTap2cvd?*+)Byx9cZu>&fMR-muqUB1{@|M^-`TvdvqY#O#(M9LAa zs&PlF3cUh8qjo`h(@k7{G1`0ZSTNLlQ=;(3w!dhv5F|#J)gnpn(WYeJ^~W7Y>D^+n zq?b|@G~88-j1w}Nm0$xDS|vv1s~(8+);Mc3>W1WFCQVsC#xvxNljfkbe4ULQ#Sgik z<{oenUn-p<5fMwP=e$l=uMPKC8^~oBr!+ERH<{xY*VI?kL@ZU<^?U4}C>KL;58Ol! zx^-~X%dRM@C=2)p6c|Q#=rP=GN8NJS33YGktPJ^yT#I(ln$Nc!Vq7iK< z!1TESxhE^sY!t4u(b1Fzu5jW!R7s_~hRBteZ2$6V=z~GAJV)xU4>PDx7ORM|cluoO z>N%z!t`ldh`mqETS!~(Y@jSVSwu%Jx?Lk1vucW+@DTdO7 z_Ug9JKLfrt(-;k)8+KD1sg^p3F zI(C?7u$Fk{_dgo`otuXHb%LG4DE0XNL8c=sNC*_7my(hdgKRN|E3z6H%*>pIrn z(r*zGVS~XSta^yaDl5DN%)8mZw?;uW=tDd+%v5zAyp@pM!M3RrRNp&(szIoF{z+?n zr2R6@7f&Y(80_Xe8qmsBSewXkSPx1IsI}-{1`>)z@`_HGn1_D7eb})I1&!@hkN$`R zF2SreKi$J#u#U`Mkwh(xlBN;RYiIA@l%h+H;I~aX^!bM+C#5SM=JzQFK2eoY63GZO zyF1+P!yFioB7_ZbK%K-Fa@Pz}1#~t-zakV1oCIo~Z}bEhnaL7u%V;H7ceC8ChxTKt zqy<~w32l@ERAxSO+RItHRQs|1;-i%4PD!Juleyb`S+s`-7T(ncX2569V7A?$V42qC zZuKxm_p|WWJPI)<(4ARh&0hI-v-jYp0HSDGy|cbJF>FB;w;+W=j0|X;s+5Cp$<{1D zTwS4~#Byjtn`b0i(bZA+TpiG>%gsZ~K!&r-0h(?#$ zq=80++lX@QEVjD98b3=zJ(ma~V8tv`r=#jr+(K`Mar|o<2N8Wubv4+ZW?BSZf2E z%~8=#0RgUyY?Q6L{$Z?%`d6*O3#JFs-z{@}e$l8*P@ck@k4DCMKec(a`bkvOQ$DF6 z=hydiB9|wKXMr^{c2gUANxp=dmPKp=X+LkHm&0(USMM0M?$p__cPnP-3j+e@lN7N% z>_+%Z{^p@C_=d=9bp{!sHlgC&Raq|Vn?8xRutt@J&)a{t33kdinE&Ldh`?iFyvI&7 zA*=)&_n4yyz74k>77N z)q*VlvD?OJhi280*Lxem>5P;uo6H~0J=T7qwIp}^bept#qB6&vW|^e(lL8;|kRHHp37dqGKAIW8v7*){-qx271XI>X@u9HoCV$woSj(gBU zeO}AsT&$!dZR4$u0|*t?-VuteRf0w&U5?-;Cu* z4PeaZINdxlLNu^SZ+hX{5_*;Oa$Goa&qn-dYl=Fg zwCU1ixs&q1|A(uu0E(*#x?LQCySux)y9WsF?(XjHzCa+j210NacXvy03lLb`oxJ`2 z`d_`Ox3_j`r*BX9%&l9qQ`6JugeVw{a&z`?VwcZQa*EP-1W^#|nWg1JW^X>3BxSA7 zX_PhacV>5pUW&&KK?=&C^x%9?G^XKfX<_buYMaSc7+H1&;3m>p*)QVx28Oo?vDG|v zlhej71@{(TqU)&Jt&!J{qWF-1fU14dzT@7>_kRGj;l9wNYxbSHH|587{8fnfV-X^T z5GO-K$dB*h(Elm*LzJ!{l2G&i8t?w6H3*T*=ipzy(18B;=6~wA0+7nN?&XW(f3CtI z+NG}$F)2i6A-Ll8BlY}$UGca>?v=Ge+B5v;O6d-w(Dk3^|2njwocQ=oX!M^i9Mis& z2Z#k>r2lFgWmjd_|Nlj)6t`0Pe|!1gQ0}H6L&=4hIfj@afLLC-p7An$d?nU~xD$o+ zaN(!&2ZU=u=)ckuZ5=Y4KT%>o1`b;KLKnj;AOY*fk`{Rk2*Vd;QhL$ThF8zJ$sSAdzTtF7s^{oTsgcKd3l8o-r&`NCFgOcH!!yHIOr0yQM&=3}`8_P@V_#KwSQ)d7f3PzMczpJ#fF54XwN z(hS;!nkU`?O|wM)t|H3hab0+FnPot(Ku5wbx2tK13CTX~zUfMD@qA}zTBNU1cUikI zuGi!VVuDcRicmoq@B=Z5`V3dQAAIaNDSvA?$ZI`L_puLuV(u06`dTdRY(T*W6IvG_ z3|stNE}`g}qxL(Y7tm_*54Ai-ghjo125WVn!HcwoKs1I<$WEruy1iP6*APy=U%k z3oBk?ZX)|jcUB<3jy1Hm# zZu#ykWNE-tWC%raz>FfZkY<+LTeR}TZH80Q+JT(Lt9tu zqoczP=D3iHR9#`LroYX|&uqbQz|u}>ZpF?^Hrn_Pxh~FmGB-OJG4H_C3b?cd#6Gs4 zBSZ`5zq*XMVZE_h^Eapw8MdhooHeb1MLqx|sXAE#T?F!!JW%a6s0|Ha!6@zpr;ZS! zfGhkl1YH+CL%O+XZ*NOq^V$C>pRF@D34@x+-Qw9^GA*lDnzz=79z(-gkF#q?727kw z!SY33yyL2ho34&#-b}syG7E@3Z>uwzEZb#x?%hpOCj4Mzyph;>cv1bKz_v|b+NrDU zMquXt5{ZzN@IACKMWFkW)kF(Vq-xe0Pf7=T@U-Pc+w4Q*H~gM(pI#@E831@Vwbr>O z$MwtoeId8`(vVwi z!kOTx)|YIDF(1p5+c}d!};a2@3*!M+vIVl$m9055c7g>{=-9UTzufqCYeEbR(&dwVoJp)jwxwp@G7vmSs8^R&K?Cpm8r=*&etoPDkMLLJX zdRQSJ+7?LgzHO)EZ$W^<6b*RmMd(%3t}T<~C5M&O+A@3=X{Y3z?dr-OfyM8QKl*_F zoZmzZW~EAv(5EqF4?~V{t?BFQiQ; zK|7de;*yPRVHvMt@6n^fu|x*fI~_;jPknn$$Dye$7Oq82%D^Ja4xjE|ga!jH-=X!8 zw&%Q?-w;N{3+T-T1+$j$gqbM!-jKm>8>kjgsD2HWqydMgp(FnQ#NjZQ}^i9;ppScTH*Hi9$T0q8+w^X zAO0@s3GP~aciHvvr#@oKS;*;$HlvsDTLVD>4+L7ymA0El;?99(%;iVh`A6$-XCE}v z6Rv$GR~O0V-qDd!8(z4R7A@E1rrHpHI!p11_W@opRBV-x zHoqAv+6X#e2OM$IT?!xGrkuN+?;iFvbSY-EH8fN;Y&)@mL^?BrGR1y01%GRJ5TgC* z5_kFSkKxK?+JtmUT9RCH!Bbvf5lhoJSWWZ96+N}i>0_?(e$QtDp+V?xag%cw%hzZ7 z4iV>WTjZzK*7jR_S45}P7?%&pB6T1ueHY6gXV$&;22+}zCgFDCj?tO&N3^HQ(H!6E zn}JNAG>z+g?Cd-{8*)&vU1%52Gt%N*%<&n}KmgA^=bKtXkQ^L$=4W0Pty-PRg4HAr zzLC5K;wm<{%9WpG1(w}Z9F;$c1UK2XJoW|T61w44NDcbdj|<(1UD%pPUB%6oh(c_> zwrTo_=0J@_ZrD!L<#-8qww5OIX zJZ0{ioC%Zd;4VB~3fM*;8qXR(T7=hYL34=*u{dc%U_W(>n*X}>eSJ%ihijsZO(mTx zQth@O851}#ZnpLhQNHchzaxnCGh*>?drVJ*q$2TDWUC~y>%m#!XQ}s><6ckssV&yk~1!lYD)s>h%!ocm|$*GQ+b!Ti+Cmkd@|Ruu7A%|`OJio2Z2o$;9{+Ezb<5u=2=YfhWkp;gAUr0 zyL!=E+v7HdHd~400@^mrQ$$;@VN*l}hb5mn-LBc#Db!%t^@m?&2BcPx%DR4djiHX(qTi)yp1?@?kTve$dgo#fc1%0s&1BvQ%K*1 zF2lFi)u#nb|!Dq z$Uz2?ELeeT_hBcE&l%6(o}p)h(=de>XMVkD{JjF2W*&Kbu2-Xet76zAv#%-ZTsha%pXE4X&+%gdhBU0t6RCLhONCF3?H!8P6iIYO}wO{=6= z<(zVZ#4yeUr7>&F%f{P19h{yfhl1=y^mYlxpTO)TZ~;b|?uvIFdAVW~GvHlX9d#ZMh4^ zhj{|chC0aywYkeuJVHP|$W>Up5ZOlbugm-e8Ss+&I~&}h>vd{=MJ(5L{aH`naE(xo zIxIPXw{@DWurkG-6`wEmC{o+|nTnf(u1f>&s$8 z$0npm;MXMtF^^7E+_v#%_3uOq0ta3=GS#|G#M0r1L|%4~9`q4xR2xFmM7qM+8qo|| znN~LTQTY?O!^oYG1Udh-aPCt4LSU}iW-|yzo<$cB*SWyHy&>-ReUSSTKl2}&!q#=R)Dd!1Mlq&Ja*+X-l) zTwoi+T|JGO932&M47QCPa`G2(T@nIxtrbl_O$n$s0BuO!-`udsQ(%h;=BVQ8r>GCp zhG(It#PX*u;j2jGif^{j;WtRH+V#e6Gixv#`A{B03v8&z?tCeG1$_ctZNs}K^hL3!B^dz>wc*`XLoyg7ki`}; z^ET0Fm3!uuy9OFhH{^s@q7xA<10B2_+(t_R%?sVU_f<|W0@w*JX-!y~TqUMTmwG&4@_b>N(gMR6_RdaogAJXs9uY)4;Ch;BjLUMV0 zL`#Ia^DN0;egihHp*D(P#+ojW-ZI6-8i}YafID0DrpkF5I>{v@5`)SKePBDsy(f5c z4i2TuE?(K$PmaP_t1Mmd>oFw}YVp<{31+Pp3jXfVjT;Ma)*~dcd?1;A+j|#1bJ@r> zhpW46&ZAzZJWytRO(_s+J#Htup?IVOz3D%-z9B8R>U|WwR}A#x$Ny-*n5*TkQENA! zlIfos-TJfe7&)b^xX-sva3dc1iT@>1XVxXgxb2<>K_h0Xkgd#Y7G4dgE={(6+pv0i z>5H!^UQHUGDc4wQl-O~S!ECE%-m4TPokW92hi?`b*sg3nWcJkZFxM>{dym#5ZvmWl z21*}oLDmKof2?8$g<~w?ec2rkmm}mP!o#~Z|IGDW2=Ps8`SX6IdZ9ETL@pGcN_N`=NjoP8n9aluVvxd_`LlyIo$b`*!2!K?JTY; z9a}=P!_)^OXzOn|+Yl1aZ7i*ic^)h-jHY_&B*xzwUw)P6@HsUv*(1Nme+)^_EOP+CzC_q^k^scCYLut zBsSKOUZH1QBi8dQat#ShD%ThSqG=)}O>j9*Et)NT_KM<`5prM2u4x%rN?DI6?9x1- z6x;)bAzTV0-yg`Nfr{eO*nmr+4la_viRD`tX%i=~kYF4n+uz2+DBuiqn5yxS%NuAf zXK?+@5%{seKha{{L3V}`;u16HJo$L>K&LcLHuH6rj@UL>LXe@D*bh%?{rZ;-iE#3= z=IXZBKY*`Z(W7t`OC;vkrn7H72cf8LYXf=T)y>KCI0{Aiun!_Enoq2^99=TE>IvJS zw_a;Z7KD)X@B~s;RUe;$_usvyb~PMW1)NpnzK(5eD!KyM8#4jbD8agbLD+9CP#bupEd9rM0CUC+*Sw4xhPPwZ0Vvb74{7e71S;9+k zJKff=%GDdPh$wOzIzqsYB!SBGOuEM)=Z-hb*+aln=b=xXO;xE5^_Y%IAiWAf z0GH+WX)eC>;y;drn>1r}3V{`(MZ>A65j9Q<(;HXHJ?~o&ir_51A-?n2X_Snz_COYi z8^DuZB6)0P2QPyDLT*{SKu~Injh|@0g@%}R_2aTvtGmyy}^N+-#B(PuUJC*pmnP)`OV&rJm+RlOUkxvK~SIAYH*K z|7K+UwN3EWkE9-UXe=(3xk1c7dtZ-x_OQm~HR^9p$PRx2@0Z|ee0W!i7~%7ayh%CS3Q9(+X60eUi_{hB=*(^vB`Ol`OPKGsmK!AlLQEdn0@Lr?nw$o`k4U`fUJJbdwwV7bhT8nM|nfbA4y-% zv?dqIT-sau#Wf>_8E$>L>$1S_o#Zff889tM_feJq};^pQ#*b-P4n zF_y@`DR6jRgZXYQ)ahe$Y-)MnGG-Hxs6zE(fPuz`YbBM9pK9##!~fdL+t#SpDlTv^puXsGQ_JrZY!wo-8gGn)7TZx|J~f?3yzLADli|<){-vVSH9*j;r8c z*(!erZgzR7vVIPj*Kz(eiE34$aPp!yg#8P23ImCBj-UHtNANE>l=kd&2gh-|57JQ_ zYXN$4(u-1NJ}`=Fr0v>m4G$U-{ah!VYFodF(<9gJgrfrE+zE`uXVpm4(S35foYvC$ ziYY*rFlveZfqPvz>0JHx*H-ZTJ{uvwGoPKIHgo?0_*1QsEX1!=c5bTnZ|-?GE?`$- zZbPl6z?izXJf?$JCZjWHP7R%iAttjpzouVf`o|fU`xDfj<0C;~n^vMtqmnyE;%GLn z0MZ1)^A@>*&sB{!8+?15rPc5 zTtWNs7d(IZF$RWDg)}hx2LQcGBSEaO!iD|@|ANqPnAX0AeeBeDwSV;KXqvvfE5?f- zyz6!L9lRSNK>R%HoQ0GD{{b3bQXy;HcjHiqHwYEu{JXsFM=W^hzh4HSFXYvb?7xzi zc&dMZ%zJ=E(Jk6}KA+QCv&}T=H=Ak#Qj8M{ zd18-{*1G=y#qat)kS8Nw^nkuhK>_hQ^FQuG|A!99D0YQ>ZAXz6+fdAnG zGRJTahY$j#LtWnHBHpK|RK(!y= zHsx8u_ch*cBZpb*k>ewt;h(}0pnu@}UPGIt2rMa~E3*2%OZ?*VCidl^ieQQ<0cb)S z_y?ii$hPCgs5D*1{Q`!Cf7vg$%x61=Lc7-liZP0c3hQGvu4R17LHkVzb6 zLT_mRm7OAK$#FJ=H{uH<;EuhOQKg59sYGl@78eF%>-p2Tk6>rs!TCu7mNTrEw#?V5 zWx5Yz@-gEdfOcu_{r)V8)9?;hSQsCK8@FCziRl~llXA)N7GSrAbb!{qTvu)AtD)4w zv)N(T2uo34?7sHf)0bM*QJ#J)`%tT~k-12jB+~t1#BqevO|KR|cQ=e{25;L^H&r?` zJ*55dbC2p|B#0uubCjCHoP|T8yyFQ=m{k16h8z7oJFlHvQHM5i$#Q;H#iS_0J`2HP z5H+aG(?U}zHO_c&Bh>zaJ84Aj9S9q-yLpSMRB9;~ul5Q%f@{pX45#mfq4$v2WI@25 z*qEI?T)Cg5rFIwZ4xP%8b^<5IQfBXH1BRRYDX(t$*3hPbO;(QrQ;pkkCZA3kRq|XO zEyyL5?GYcz%M>BOQ##79+#MK`i|Q8%FrV)B^h6K+klKU&I?^XsPVxJAVYtnTlXDJd zj-`~aOD{Ys?bE#(3#eEzWz7$OQiA#-6E}1lr>ckyD|2ia zvD|rkT%GwXsgalDCk9PW-la%diF)t+$~>b)1Tby2r@y-OxNG?5)W+gZtnl1OXOoHq z|KbukT&4kZJ3HBZVsAqQGayM?t=$-k);&d^G*H zeAJcqRNP}nI@vie94{h{eRS8@Bp^n4VAv$xglnC`+J3>@z?`Kv)<&?)%y1WIeA*Oi^nzMW_|6T5muQHYaiQ;-n+5M5z(#0# zWMhGoCm`CcHv8cRxHvDeCAQx`5|4$=>Si)QjTg1}Df!?5wA^?eMew_Y$AHY7ZZA<~ zG++B6ffaB&C`Cg0MMp9S>4O`C2|$E3UZSUH`Ul{N7bkaXLMftj6(?tmEc=&i!6(X# zbolwYW3G|ijf%vGMYSUnr{^Ca?Te(*FbMZa+fFqi0r*4eeS3H$be359gsMhEqANVg zNX~G&#z$+JV~WYeKofa7xH!;!)Zb8p`FAD`kvf>qlQ6)qLRv)f7LCzD5WkRm6IDhI z1<9Yzu*mK*tJptzEtL`DBO04X&|Dh#MyWr)B`aKdK_f<^XEvRJ2Yq>>B=2hl^KfPL znwVZa7&6H_OD7N55ffGOPLT4uMFaVn{}3W*TxxuRFd}5pkb-vNwZiNASAI`RN?lnU z^j1v9Bs$=6>weJYJD8X6e>zP;$8g!$a65>6GPG>X72KzkSCOn!O3x`h+)HRJT$~mk zMx1|$LF%kKVy^CD!JWe3XlzDNoIaQeQ`mFzcMMWScH9;nz2bZxPweilo3rRuD2v5r z+qLCRnhpd4U*$&j_so`ZZ=KyyimTDsU+Bs?KJWe6&@qz?(qKnWi(6TFO&hOWttP%^ z)hfkY*R1ptH>p0P#O{kQ&h^xS|ylcWlw#YIRcmc zkok)oU2c-Q&$7tU+S}%3tB!(7daG{e6xk$%0B1tI7X$6Fgy$Ej?t0}k(Jc`$N<-8Z zdP_~CHfmP$iBLFClj?}EcL6~H6KN>Y#@|Iid$ebu8O;V?Fy2=yih)IxMzTsjdf!># zSdNStyF(CV))i|};*k-$ohVNdt*+!S&dE+VMi0%#VR8sC;)13LoN=`{IwOp1hbZqfYqr){>rH*m04-=RT7eBlWa&V4p0m?mmI9; zka%$DBY*2>)MZp5WpNNlc($anH;i#|zWvlLI(C8U^gcymqbsAgXqC9nqZc%q*oz|V z^nRE;m!~%dAFpEC24j!(W2(NLt4U47W<3Esfv4$;^{Zt!RsduCXBG+>mKKnEmQpyt z!Sg-OM&CBhgV1v|3_{00>mrTh86el}(bhdZ?uLfpu#jVy-HB8#x43V(53ND|j(3MjHkF17= zTitOC^VGLPBDIaxgyQ+p-Z0%02uhBp8+~AJU>{$UZy6H>K&>FeR?0&XC=dZMtCcYIbx7$JEvku9p>UiP$hulR2BVF41RLgaT9_)2GA*GY__Ul6vor2zwIq6f>cjUZ1!Nc zkk5JS<><#}q2nc*`FOPUr0oV>OZ`RZ&W1QfYzU0eJ@&Y!c>qDON}9`^?r4e@rc4P` zLqyS9S-&iFsX+)xcAgfgLmg>h#GqAYWZV=mqbi7s8vc9?jHm8Dfj*$Uz!TkTmR=iw zPMdecpoJ*(8-EQ8e%=X$@wINq<~tU?TgM!UP`8RzXBpm@Hc4YxZCF!3&89^|TpGpD z@RgUTm|3+9U`uJQg%q^`@yv86_rf?V=4(vv6#}RA7kgM-U-++E1Yz2%)sk*djPM;< z6V!23m=`dvQG}ILEd!`^a4Uu^oJmtnrx?JcN{zO^K>mCfVpq;#uVB!3X{tZ+ID8SF~pZ4|>7RKDD@*Ira)8!4_QwB=rKh}wf zeEHXf;%A={Sgo23RzE8!SR?Cdy4riA_ya{t>e`(K%3JBNv^twPOlE?^K-qUNFz!ZQ z$jjX=tw1>HU<8TJDpugrl?Lceo;9=*If3XkBh*_c=>2a~xjE5JdCH@CDFfjVR}$e_ z@IjRsm@|P&ZjRG!CJE+RI0NAx)JJ+P!`@4XfGf!YJ|$hO%tC6Wcr`F!qsHD^b#mpv zhPN1w5l(L}LWMYwA0Y;6nqGq{X~I9wH{KS?W4~B1Mk9nos->E|{7|dCiN6I?Ju-q= z5-=O2oc*)ODp%azK1z=T%4Bb>+jYMG^Pzy^fk{OGQ@MvStvElQB4p4080gGP6M(oR;RA$U3*yTji`G1`V`3~IJm zS!2_2ae+W~S0g|@_~~-9Af(B3a?T2zqnsZOOr=0H7Yr9l>Kra$aVMK4E|)?LBuZ35 zp^h@DtT57pfsJ8>*2v~8wwQ5%*1w~!a9TaLi-46eVr&^A;37-|zL@JBoAq#CC_VkJ9fwOU@1-`3Qi zbEI3cxyfN(s%X-4K)N1P9fu1uln_}?;^Gj;lzvQ=aCUwP)c0ukMpkOWA>?w^CLAeh z*mk%TJ{4H9C8{GcIzJnl);wADii|-cL{DlB%41jU6L0RR4Cwk|Sf6ycYEIPUA4l{r z@n2%AK}>(G0$G3bm&T14p`|B}>hb#k0a}d?=`HApZ%E{i(=EERfgjV(@t>k+3w=!H z)3SG1O3$En<8CC3C3X{Iw~+=@NR=R1Ps;#>$Vja68f6l?B`9=T#ZS(yJMPr3NFY)U zuCbOQbr&8HK(z#D#K=X>%WbEsaN;6c(rEOKB|)_5k6+lMV>Ur?zhq}IJ0{!4cYN6J$O>3rBs#r!%pxbQ*g%u5uAa_1Qj(M!4Jnk9Y^rCqij#e-O4y7_V0lN*V%1vY^g4P8sr1Gr5MHi#Ets65D z*Wn`xtJ)xH`TJ}@A~iyu5*~|Wz9UAi`Pwxm`nTygw10qR$hUFOct4OVUv|2FiD#dY z=~5d?(b`n%!gUedYEsKOYXd9qn_tu%jEQv~BHzzuu5EEY4XM2X(|E@Sx2$incVf@-BafS6S zdOBTM(;NZ>6H`nML}>e5E-2qnF6|9CQ}Y!4C*`}iXruU+%k^B3^=%y&;fi>cL+pT? zk1tLQ>9fKSG1ky~IH-ewJN~2=LfIa)Imx6kYGv-BzsO;PyPD=0$1qEsxoJ5#k<6ut-P&Hwu&3&1;8< zLZhp&dFE0uv(@NGlfJ#t(&^JI$7WL%VT}2)Qv#5_!$YvxVoQ(^o9QxKQN0Vinb~VJwL@!XLCAGS(H*xN~!{tRJAh# zg}hqBW0N3W-#n@ZlVW+BC_g~^rB2NH&EsZDpTU8ep^Y;E^3D++6Q%W#?hc&%va(Oy z94E;*XpzoS|75b4R&pfzOEZ;g7{*y5msraNp33ApD3rpYVX7k_+%7L)=t+CC-PU5U4cP-*t`YPUQ5GSE(A~S#L?d|(7$DZhPY-(HAHpTg|1wj! zYG2XqY|$Sxosq$ zU@#RDS4Brrhe-q32hsC$SiZ+j`>k2~2UYmBhFe7Tugc^)ko}cXqTbhT3U6VI!*wiit z5KK79%b_J;36r7K0G9wNy=|=y%iXW?s?41d`&L=iq8|}Qv9@1&4Qu!hkP)e=Sbd}P zgG3n$>VmV8Xg5qoAa!hA+{kF^czwAXtcR_>d3fs4l~`|HSo)ySzxl%(5NzgH;VYDJ z@dY|%KbJ9HUb(&k5ukIP?fnaE86qmYG3AjG=CA%8h?dcMGuZz+NvEhU{+hQRyZO_j zddhry2p`@av;c{6*|*55`r=-bWNQ+HX_X9WLo!@8?oV6#*h^Mkn* zpw%A%XS9Q->tuj_{B>4jv`2!3X|Cx4p=!hEn8P?63Kxe)gvNM#VH?5dBYJx`OkMr& zk}FaY(Y_j(l0b%RPsuh-oswJ@(1IQBvUfZynkC1t$l;k^5&I@2%I2GayzYXgzcp3N znP*8zM~R>+>6B%b#hu(5P#18uO}K{Gdb1fk-4l{Rqr*BejpGlHoCbhsmio4wdS$ur z_*|QW5~GWi7)ljM+R@p)6q=f}a(K{x%2%bZHlX@Ui2 z%Wbyb>~McK0gSBZ_&0Gq+Ovi`Vt%5S5k`LLQNzK5t;ba=3symH#sJip=~Pk4jZ^6j z!sSnM=gzXw3{Iq>S$tttkNFjigV0o}$L$_YRJV^*dwR;Z@*@L6W_B^%Evod{9MA4n z2yXc&7CIxc@=qK&$}FgwQo+=jBwus`?Lcw}|N1DL23L6tt5|Bs9dR{q1B446kkd`G zfo7$}<4ANvlFXf4vzw)~yM~)YJz_cXFL7#JVgfcGg=@me&`kDlFN;}nRD0uy8B`nG z34~DR#(2G#}<G=-n*)Wlis}SwO;~QN58Q^9B;vQV?O0)rxBS{rW#s{Ds9xcn*L-|9%h^a;^cAS z=hF92TKO@;Mx2~BBst$_7yD&foMC(`E9r-$B9q1Uc6>(t%ddBxKxNvDcV=VK^g*jQ z15&9IOeR8&)FZ@P+nu$@vs3^elpo&6{Dl z$p{%)q@Q;RSa}YjO@_JTIx$RCY5csZ!P202?qH7UGBInTZR8y8K0_fG?c;A9*IoSS zJ6nV!WrGCYC#L**+B8klfw<%VTT!%CX=>sq3aBwg zVmmU1t(+uGthu&dqJqzf^N(H22C~_M;&5Fyuyhner&dREpyUgU9xbTq0jcCkuG5o- z=cGnq5IRMfhbN;jCyCO5ZH?JgBHbUBNX1@rUeKbCoWsv(MYz}|{nTdflS!dqDI56T z7?Impk%9#(UBmV}CAruPD=`abOd1D6daf*zZoc?7)rY{`th%2X7xM&Wj|)}vINz0G z(J0Uk1;W)g5uMhEN#H3ADvHDTSp+v1O{*s_NH^(lnJD`iVV0rYl)p$SOhWz^^>M=l zX!weE6g@M(3`rWw?voGLaB|}yBN^$-`&a=UGtMU4kD+>nXE}s zG1jP+=N@o$;e#BO9qoJ!LjI`#@X#iNeJ}^T^Kgu$Xu=M0hzdodxXX}y*7c;{R=V&k zG%pu3Bd$6^sj13!hI%Y;-HiB|gk96$Oh3VjMjpIr7$)jTK*|4^KL6{VYInPnd(_Mw z{6(d)C9fnt5EOMj0pC1pJ07YzChX1BywkkC{j=9_T^}Et`Ef+21@fN!m#gz-F-1Y@ z($YT>UCp)q;j$CxOo1%~`@l^`zT~TK30j+$1 zHzg9xh3;Yd%I3H{opNFJbG3V)P7aQC+G#FX0o*e?4(3BZYQ0`qGp4I8^0I&PlDSwO!t zMpN`4yE9TH@dLh)OzE@%323W=A6XFJWDJyUS#V}Mqxtw`b>ledt$%9hCkRYW=C?P< z79Jer$+K`kEilCBpcsFq`}PSqiyDu2Etq|>mbKh4MN~hqOi3h47*E$4m`oyogf4>3 zvbjf7id)?QgDFKIDUTvAKuI%!%!~Ec7z(QSxbsEoPo*XXW3-mW=OE7QylZYI?4-Qf zm6mdxT~?UpX`1DuBxJpaCXl^K%G(TD;hr;M71_K?T!Bh;2XYR-EnX4=qFllS4qsOq zc`NHQapZ>*ArTc@Onvf52~Q`miYyPGeQdGfi!0ee{K-lst3)TKCX@UVS9gDXMgBCv z^BU2C;HXJDs-Q%TSY`!wLh)8f5}rt4Y8~3&o8i* zTU zHadiu=2W{4Ol2VRupGyTJ`FWz;Rsa9quu$I&U2w$XLn42zTBBcDD9mkJId*P&8STq zcLsA%vs8Uti4>Y%4jwE2mv)Ud-F@QW3Q24rJq-b~mM?n+_$uOuq_UDJ1N#7)67bL% zt(S;JOOsQ;A(T@3nkL~5-KaXrTAi=l#37{%omT-saF(crgJq-10H&myp$!VEZY?8f zdKJ)}@7ubi$A@YgAx&IKLcKVX&k&F(?U$ou4<`FMB6a3+Hi0|a^cB*P{^39&m3PFLQO(dr=C3$ zendw!5MvH!C{&e@&{WS4_d14V095rtj&yqv4#8@%7)M{0bgfMA#%DHxJ_FII3h186 zvbZI7?(+=)US&Lq7D#CXVYDU`Yj;Qu;de#j!uDcJp8qD%?QS3A7Pa9eGCMNUb`vf& z_p^+b!&zh4w&hkm`CHBBzb^!bppdQHwIYilHIK=tm8#)Ncg_A7B(Z`P$9CLzORIp* zGnHP2GZipUFi8Dp)PjNJYH~R!m!|N6QYdX?sy6JCbG$xjvgy|Hodn;cA$=K)y97uu zr%JNJRs&noDrRV56gzKosgXDSHL<>ey*7Ro&lLU( zntC%^!(BE6Tu3_XAK({Jrk*!S0Dh>R>uGIRcYfBdR+3)NQaLzU^^?x@gbEo5$q7vnsdDlO5h%#sPN1YLkyL8Ajcy^UvZ0%g^rFsgU)Z#dKlOGIc_#M zngi-1!#{o|(w61EsT*(78pJm3jrd|FcjmSNtI(@ACNjCO5OmBO7Lccu4!aPB|_j3y4)f;aQ>e_u9z) z=xFi-1Ayr)UvwySa=NQwcAcIhivkGRSjtrBIoMp2br=HV&TxRQOs*){Q2x6EFXp^BM+%cmR zFEz1m)y=-ZNCG;U6}_iV2mV^4on>>A30c8773(@Pf#Or}ylCkcY9ys9hPXQYFYpj9t@0B5SpGhoUAnk5VpDptIsY>Awro*qsCL{O8Rz5NkX|>c5-=Z(XmLX)50mgy z@+Hf`RPV~-GF(Q^2dnLkPAO{LTX_D9aV-x=*_Q-9DNbTjD(b=;>-1FD6ygz95DsT@*@ zeHwJ=VSxFdRUPQt(RUQ=d{O5RN_+m2twdEfzCLB zz^hSRsd4Q{RD1}WN(=9qmowPFn6u&!;*ncopoCzRN4w+$Q zhM@;x2T%l<+ollF5x5{UGajLFEASSh4Y?!fSAp4!T3L0J9>EwU;D}9+%olH(;)DTI zmXye)>Htb0C1%J@h+lP>Kscjt>>p@NgP>Hdt%$)vk;J?|n}$J789?}yK-l#02|0m~ ziGdif95BUbLY<<3jj(I(&>Db?b3N2oMar|pH+KQG5^kzGR}&4j1$aJSgs^9LWeVaX zw@%Y%v?AT_iG9A%D?8X!)HVSDR0{Jk3_~I#DU`sdmnoI^lGvThs{a5Y02mz9NZ&RF zW~~vrFvAa zwLz;jaW>ZjW%UH#E7YZ9%3Uup(k$hOJuJh9TG@#9{P{x%EO0?0+kQy!loML-+7ZGK z>|+}y40bj(S}t~vc!_W34C(DOviO!c{7P1ktf3OrBNZctHG>2VT`aQ7j6+A!v~?@% z8mCYIU`FrL2~-zM*!m$hRIt98Lo1;_e3?;o2Cj(?p$TSu=hL*U<0m zi~O-oav$Of4h+OF_DeBcAXKo^0~+TfNFqYTUP+n(!vu6ihT@cBx`!My?ml!&BfYVC zRAhgMP;-P}46qCaD>_1KPG}sIhy-c)BdHI8n}6n&TKYEhb@jVbaF=M{dN+C~aePIF zkWdMGXVz&>Ddq6cjQNE+r0 zMamFesQ0v)p=YIGF@<(QEkW)@yoGrCg=!qd7l%;1z1_c#Y{xD zf*AvH8AxU4JV!YAWF}ZEVWw3x&6z@2JW40!g)3QLvJgdzmN`h}#OhVV8ZCK_W+HI%4v}ik2QB2hkf_QwBJY7=RTgk8e| z?k5BhNH~vG8Qo?fm_>Lc)eg#uz;rX*b1vpYg0CzYnaM6bZ6`viR9DSVU73x9i+40q zQV24U++kOYe&tw1sHux_2yR;~mdjM6XgpyX!Shm62%-@L0E7YyStCaUA8 z)lA~YfWt<^)8 zyMo7{E9~4-%hEZP8>wi}FB1s5iA?;%zMQ0 zMxq|+k5vF(Z>RzqX9wGJv{cDEOpLKCu)|?~^BLDO8F@>E%SUnu$f9z!4Fx*51#hHw zBzx~-KMdB#%n}vW^e{nC+6#WBNa42<1$1tqTcWkiW;yoIv zpR0-)VF){qs$d3RkSH;5V2%fD1`0*nG_Bbz#5=c$Dw@9Gd&#nK90_Z5%PwA$p$a7} zEtF#jB*-xu0Nw5+u-ClCk%lrPk7ur=w{hr&hXgVOfdJ#~EW)m_a{PhCZX*D51!)eL zv06T25EKo>HOSmn0=&daXT*9E-XL>#wN#=TEW9pm_R=OtpYZH4sIA@YKYu@2xo4}n zr{UXvAyB*;jt_$jRD>6`hlpFtDrR7cL)u~se3Hlx0CoZ zUA)Z495SOuR-vg<#w&8$eNMirM`%D#Nt-$}dSxo{Z-Q=JP~py4+aAr!N*mxoKUl(w zomC*}v&fp1G{ye__)E&!0EW|O7<5Fcltu-0D*6esHd~292mC=jAs)e_5sl`d>MNz8 z>>@OxXhDrieF)LssJ(S~dSGlvNui4->fh=Q)`ke6Te_)VGaSYtdzrUK#)6ko`kj4F z7ODQgy}$T>`NLK(nD!|(_?8wbd`gCAslbMxK%7QZ8GFQwB~NoP%Fw`bW4LNo3WY%k zx(Mc3RPipL8MI1ROm0=ov8F&q`ZU0!75E{weTj^rM^c<$-gCc3%aA{?<2DvA41OWG zUy|CjULRAW1FaCFf8UBibk4?2;smI{xEu(x58Yij9+jPG+|+6tCbi-6GrA`zj5EC z6TxKzHI@E;Noj+Bi^J^7KGDvK7oS7E+dD0%IM@b0~vVrEcO}-?T758-YYh z6ike@h8BcMsKZ7xEV{VGgP{cnsY9A-WxKK#&0DCLyVN>fDlk>b1zf}qU~GB&uKfx@ zbl>t-8(r*)LGSQ_;8XO22jhh$4{6kEu+m(?6@hN%Cz26Wxza>Hrb0P^K^c@>@x-jb zx_F1BK;McKTj_Fj01%3q%hbDc!?=K$?iO0j4a;*~S;RIdt|Qz^>cMxR1xuU^3I|_x zb0}pEn8W;yfbEzR{s>$O{JYIca%_g{Js#CKBCvH1h^p6ep-s%Ghh*65B3BXXCXtn= z+EJM*USfHkF+`VF=oBEKM{>j~{6Vlhj6&1l79&%fn6grUnPFIn5t>x7A4Gh^Mxe+M zuPIm_{@^s(6HxQX6y9GHS0HcbBI_cskEup|e+OIHSI9K;8 zGrurwR6A*(F@d=_i}sc2pR@$I!pdLtOaKUmC3H(_M=-PZlHqi3%n=qW2kt!LLu5%> z2)@|JFk-}3(Ac<}t$nJCOVF_go>{0ID048X8=S6kKis5PcLJ}9Sen{rws$CU2h6>h z+%>bBl~w~h4@oaM;!!2*F6B0whW`LBlokt8fTD}hE0j(wyhQ32cBU@ZY*<2!8#|bY z#&+B_!5sJ)2GzYy5mn5nOrkb=05KV0Al}u9Z-D8S=(S$%ab^G#SypZSkVq&=S|Ad) zmJu7LyUp9CDU+P7bD6jlv^aE@j}#zya`s(J7*Mkc3{qV&iM@kF#aN zc6B1ilO4`@Vlwp9rG;wc4yVMbS5WY#VBi6L~i&%zfboo9%@a0}Y#+jH!c?UckDz zyv6Q~aDpAE%B3kl7t1Pu^LjX0YwkPrI_XR$)>b&;A>}R--w!F(zzz;>J3$8G5~(o2 z>aB~+8tgV8SD+e%J~mttG$0gwi4>4$Qk)QP4(71ni{%^*MWmeBG9h$z5yJWw;cF4* zB~=e>YSWj3FA9e99)Q#)|3?5Y5z{NsZyh?3E%2mdkENg=${7MZK^}3fY)}=$CSLl@0u*mTcv1c;F46V~0 zi%XvprY`(MG$=xmcZ?64Xn*umLDidSl)pd zay4DE4_>L%vp3HYSIF6AU6$VAiDrD5sYn1}{&i|qkkSHHI)D=+IfqAXrNkaB$qJ(~ zpyKXPh_=YrM51%=Br;gzuQ_Dc%5YSAwD3nuqLIQTp5x z;lHWM9KhyQ8mz)4NSC9+!@A=KHcdd`2GeyP0ThI3@fwS;fYc617+b0k1Oa*O0Y|y0 zGCs;vI0|xt0IX<51xcEi;<+~#8$%VS-P5^W(#ZCJ*D|k0TZaW~wh4WMf}ONi5%ZNU z4U=s|snIMxKMOt7N>bU>8zRASgf6EfXv^jZ~)Qd#RUg!+RX`_gv8#eJM{;R8nYnB{b%EBx>#Y8m+1i-j*ad87* z6x1K(tQ#hD@WvLbc^yK}F&?5&FG6FOOn}9az#Q%gvYJZC8+(@nBT#!n1$X#maLWf+ z;^G3KmR-w~J-osgeWy}|w(lVfzT%8Q1~>>D8c96a?W#TYHZUTd^bKZIBqfEMz|m#_ zUIfwwwHi1O-B@Bq0g8A+-ObJHMrU5S<__s`8L4tD(5B+j1z7?u7sPPXaKyF+dTBTH z1hyqY0T+!&Jj@tq=n8?9uFMC5M^e(%8NMJjRA$^klTH@u8{wRgRuyS>nPx7nftcEH z2NP=l0Eh#K!*GcT_{xLbc90+sw#FPX_ zSxq#tzh$k*<_HR`QK$-a4aLw8@8p? zS5)BEpfd@AL1(Wo(gJ3Cjv#L%lv-Fwx)B_*&4R6YmRx`l?i$b0q&M{&n@d_nDmaEl zrSRaW!`akPkmVPOYwsFHJ;Njnrx9?lBL*!6Nt}4i_Jrxt#qnkjQu8$kNNgdj zM1hYhz;=55M!(nctJ0iKb`jqA33^#rdVPIxg zU6h!L-B^!N`t5-375orvvRYmJDFK5Kw)dmBn1zMb;u&Kngd-vgM&_rwPDq;n0GO6<=uiw( z1czAyAQu49D!|rdP$MMVQj9MA;OqoeyL-&A#iXZHRf* z^v9P|9Kc}$zGK8}>fla+={S{lD?5T7OE7ry%d2&>a9{;Vg2{wEp@kyL9L2nrP>Kqm zUe6FqVZH`ZhzlAeG(oRzt5749-L)fH*SjF|m1--Ritt zuj_=lNK|ABbjp_a;*2no{&u?>S!!B26_Pj`7Ac!kzs^u@KQl+@ru1VO|AY7KB(VwjDVa}~Dl zm~0*G+YcH|iC3mh?&NsUSmb5k&OXyFI#HaM?!X;>N762Ir2(z#) zA*2H7!~-Erc0tdM!+8psWpanRFO98dq!Cn)`yHP>1dH6=8FO#BJMc$1-m|TXgQBg%K12l9dSoCm1QI-<5 zWO)dS4FnopVMaDYhYLJJ!o`5h-S!fMRy@S547zs*`|N#@;AWan9-ws*?~~ZVboFpcj)I3b7xn5%gFzla*d0+);a{QsFfrldET$>%R zNnt~Ayvz-0D3GQjaAMe_h{mZLY8xHRmgQpv`5+Nxuo)Wrpoqb^Em`D( zroO}OS>Jc0W`#?69@{aj*5b_#=8_T!b3u3bD z;t^R!lrpIw0T4KY4d$h5(CC|%B1M#YlAjBJVl{${`^Ku*3CsusQ$Y?Na(2pbm}1#< zA+1eBWGbu74z&g$8}AUU;3>fo1#xo3q>R>5uK;Rg@}(;%h-fy{QAV={p##KgjeX1M zDv-oAc52=bScGtO54bQ&3bJF79HQ4FIES0u#KkcfP-3%L(&impm7jFSNUUB^1zN|m z-12Xo!&Jo+x6GjmDwn9i<8AZ6=c*~}*<&C3h6jv`HW2kjKz12v%705j#ON_;5> zr602kUlOTI88?{x1)*D)DA0n~vq2nc<@o>y%xhi@wW(4|VydOP(*?3(a8@Q{Fc*Sb zI%^{k85EmTvl6QZQvU#Jj7DL@_ZYg9NrDEZ&Dc%2>&t>h-Ez{n3kz1=7UfGq_spWe zL82Bnyvo&&VJMRwj5m~$z_K(7@?J&a^EI!87c;#F-xy2%abpl z4MErq5?7EYh`UmRyG5|#i3Qr5kj*H7P7WRL4jO9nmj1sMFMncxCFcIko+pd2pd*0 z7CAPfURPNoEnzMl8K`ejH4!c(*x0sS6*X`ug9-p$nYY3BA1++Ea^=gHE?mF= E*|Q~jk?(QrsE+N6)T>{Gji^JjsA|xRYB)Es*?rwnuhv04rL4reY zPtK6%dF6M`cfNbi`Q88S+q=!wbXQeZRrmCC_g3+H=JygnprW9x0HC0t07~Eo`2C&H zNZuD=3joT>oB$R80GI#~3L1a{LbsU`1>?`v8ic9-h8;kd{cjvp5Eei|1@3`Y4=_VO zm;}5&12ZB7{SR#%2RR*=UIBhyK?q364}pmDi--$A=mmttA!6bJ zLLfHEhkwZek^^^vU%+2nZ>0lJ{(^7WqWl|-3QC6tR+EF}Xn#w32fV-YZ!qcK@GTw+ z>R)_lL44G|VF3oP0!&zcKEMCncDHJPn7`+NM*!BHJD7JcurM((@7~42#wEFji-Utp zK}3vCLPJSMOG8ObP0!5BM$gF2L`}^u!okfiAS5J2$0jBv3X$X$6oT9`LAiVPE-nr( z`MrDO5C&=n$p3Nr-3}09-O7Z9!U&)eqM#9?{O$zkKshnMp1$quzY_{78al=uOsu=u zI3PkT0RUPG4HX>?0|Ol$#0~`O0dztPA_f83JH*;nn2hcukmu2vSWFKqKauK;{$v)k z_IPm@o9sS01tkkB8#@Q55L8%1R80JloV6zKN@5?KzYd_XEHn$EAkB(1H&(1F{Z}qy>^B?Ii#r`L~2tmD2(b3V+F>m!kLG=MM z8X-CcgTNgkS#3-!cVb4!b1agF(V3N>?lKAL{3NyZ7{w-I7W&R|aI4xM&Hmph_Tv9a zvwte~FTLgfTr?E0^Uw$Z8Q?G}JD~7I(UK2Esp>PehvX}q+0-ksChnV#)=5sTJ?mOZ zIqx#5o82J7Q9~_f60P_KLOZnrv5scn-I8|y&Ei09$#iRBWj}R=~nMk6T z{DId@39OA*ISpgU%CF@VDJ~NC@lA@qJ+RozuRQlLRehtC@EfoRo`z1mM(IF%=L=n? zrI{j=sQJ1ocaHuWcz?1(X+F1T5-w~Ua5>p^Y};4Jl@h1b@?6z`zKcZr0mi@OJN8*& z0DEq(p55ajNKZvxthF;w_oxX+j*=lCz3#>xht{sRy6Xyzr!5=}%3R6aHOxE7CSi(R zvM~;?y1t9yv}ej!tqFyexl9Sv;+akr&j`e7g-EV-*(o#F7B}fe?NYgCtdKeg+Y+ab z3q7%9g_6gPiLbv*hL)}vFqz2y2GqK&ddx@8wb#i;e&ow)$<=xb4FkmLZ=S$XYRP}R zDb0~-e@fYm5f|x8afv%ohtBccoR%MTwlnZRdvNK7OtaNG&P2`>V&nD2~kjT&UiVqE;smsIIrjBG{N^$B07jEKFD%&=0D69>Z zM81(*bGoF(kIU=i$xKl_T8C*SJ@XeIr~YEO=em3Ka@Ao1>k`aHDhZGOS86GwGpkXYr$b zolkpGXgw-V0%-rqOpu}kYk+1DKzSamD{8xGXs8jl691#o824;CR>&hM4wvh+w7`q& zjnfnw?++TwR(Nn~IY(c)5BxI8I&ZTk>x6sZ!RcVAz_3ag94%KbAZ9ngTC)&Jm)>wN z=)=kW!?)0+t3!Z|v^Kl@qiMhY@twv=WvVo1+7ovu2hZ+xT(^{?hF%?iT&~nmq-nu- z9rI_X75gW7@oH`n1^(}URI@h4=q5gy6l0~W;SW>Q9@o(H&pSk_$2gr9?K3dtswx!0 zY|>&L{_@JsQRu$B8^9H*ZYNL3R}d2v_DkW@3!Q@)wHq?jxj9rota<&i-G`GouPWAeO<faXm-u%SbpWGEP@#V7z?L)4$8gu@b(^+y8sLp zjOM2*d1jLI=UYuxU$odPw{&H0Dx0P3{>*Fi88z6`fp?G37%FpxYK0^9e5l|&Oj+!| zSVapRb{sZ}@4psGsPUzpr1GVY;To{1awfYp<$m15i{G@j^vkGRQJQBQ<5S3P^nFZn zgJEcwZ;DOBfiioLalt>(#JSlpIB=s&-y%mst41UXZH2V9n|g(<$1RD zP5N^Q>m<28Y9`+x4jXh7CK015j3{swfYjBl6DOx+v zm-l1lB^T()cTgh?xWYroOg6}v47F6fA5xDgqbfKn8&_z0aY-}qobhHY?>u2n?D&B5 z`A3;Gqa%qe6VW6TqVNoBM{TCNbksiz2uPpNU|1O3O!dFhc)I;yFMR5uPg`l^~f{*pF2T#uFfD3N8j zn0kytP`jFPs@sQm-VBRbrvaecE-f=q8hhX&Fz5zjo~lbNkSZg+&|K4IU&t}4u4jbe zD(jO|6o&gU>qj(@Q|s*LoA0@C^;B-X+r@6&aA?^ionWO{F;pODc#W`W#9L*f*M0C+ zQMB;Kj!qQvi`Ve$!x;)!q1On#26r-PoAvrqWYf!fM9JOUS9RS?e9!BTq5Bnnrb=Qw z7Ef1hNQ64HUNh>k6YZW#>N?N3tEO~*#Cd1NvpUdh70cCJ>J>laD?oh3un17)NE#}J zP0`&gzE5Hu#`#iMnTUO$5j(pO8iFjL2sM({`*l{Te}J)~DL$7?NcsNh9P|NA=qu8r ziv$?+BB#dU?6gXZYKr_gU*LT8*V4Hs6%-PcbJFqgA8Q$%WU-?jI;Jw_6v4!DM}?6q zKUP!*3LOK5+GreTdW2qHO)r@J4B0=+!Sit7Y1dUt8*A8MBI9(QNh#|*%csDyGdmlU z+wbCv?3f|oWSm&KAVs4~4U;z-8{4;-I-oInrhz}!Wcs#E8uOtCIicAT6%VZ9ZK3>N zhLY7$74A2vMhAxUOOMA%9Ucg%rmW4>+lke-L|O!kLLDvY=RNANq?KQLNI43{bmY3s z!F0z=W`6@yJ^epw^0@>#E1MdJ(OGkh0#d3H4#~Q|z^2MNtY~H5C7$k@^UQo=5*9Tc zVhV2#iqCeN>nuBUHihQ$h_+hnm347Xeq)UOCDicv1!UrGsrEM+u z1l*pbF8h4oO0&BEY(-IG&7MM_YuhCWGWmWA7 z!DAr85sjNB{-!xf&ab5(J(n}p_@b-raKP1(FQ2y`hCWXv@c3hLp~LRjn&75hah3!& z?*=DTgsBn9~lj(kn8naz3}g1 z!%+Ii{11sO?=#OgOR>KF@S~QnqB8KF_5Pe_@xgG@Bo&?8q2okv?m$?*=dc7F)i`gm zfObthnz9w=qK{*H78q4k}^{%1I0zFgDD52QV#P9 zDTGywDWyzQQopxiCFQ+!oMJcU7elFCJb!Fl~hsyjcHi;Y8~0YuwXf$UL;A*}q)hRok>{ z;j_w@bjp%~qES9l7wD#1OnLGVnT(2kD!04-TC%qPGYs3hoWn1briC3e%?It*j{U7s z+6q682C0>s6tTH@%{_*{%u*NZZjkFIj4Z$FS+D+Lbf|ox_+9lkfVEcb7sg|4=6RtA zRaf32@JuL8-Yt@kRFI)8r(Sa4V73$JQyK;Bxbcwp} z0|MKTli}m0>HMoPPr`RuoJS^QHTkY8q!95n!jKmuoH#Q zdyKYdm8}7&55%?yg#@}$N+W^>OUsnCBn$DD0`c9Aa;!hf5UP(CEM3y3Swb2atPRUo zbmoRo1R9sZO0ekI^Qen$bTYNa3i4@2)0H^7x=x@X1pNMC2&a<*>o}FxpvPioq%47@ z+;R?|G$aJu)7kENR4Sk4x+dx@M0I;9?OEDe9iPzb<29i`l*=g?W?m~)tG$x zNrsk#XyYS?yvby?@Iu;j&J`lF$SkgBE2TyTQE85lG5AE-w@irX$z8Cxzk zixZ6&T3k&lWd{p36z*uC;-o30$T50E5_TuZ(!8OmOo`5`5r*jxD zr^MxrFrD_y_S)oiCB@5YD#Ir_TviM)%+WAlaT_qmbE z;}#;hlnVVlWN9L(@_Y%7V7m6V?adn*_o zN>WFL%abd0feGifuFGATl2hH05oD#Xji=|D+${AFC*RLE%jfMS17zwNekUZDHe)Z6 z$tC3dYIAD`C*P$w#kDiYu0Xdg)eByKo2ZpCHjA*e>Id{!^`c5kB_HGd3Du zTBeZltZq!M{U1F%i*%n<8%XHt7^;=sRan5oD!%Jh{z=qTB~ppbMJ4)N--}lFHCnFs zlDkJX^#0H4R6<#G%R=e?7eO@?wp%W0+wo&6jxE~yPu)h8T0ds*~Vq3%7ckL8P`)-ONapP1an zVumqS;U@`C%1ouL^-;ZK8rlih&8hJas^%Ng)RZ+WEe&46AT6583??3?j@6wt?IH3D zf1o|2?lz?3va|P+iPT0jf72oxwQjd&4Y3mOfLq;mZtJ1#;cntn(FK3(T}i3O`u7%E zD!(IDIQrrpsopee8;+o8W`%8%Kh}N@uFBK5jPhgdEK(6_j}e9;YAYdOG1ZdQ%dQ=b zyv(sCquF0VQr}?eJZ<6XWw2Am7G-$;3A3QQtZbaqIN*e~cHM&ICvRfWkW2QPN1j2a zU(pPF#=1SHnrQi*mCd53@@nh#lLT>Ba=p)_iBoXwUS{%Uc&-$b1#R_}GJhf`jdiAp z4ig{7chFvFn%kX!1`)IQw6>F5HL@wN7#Sqgf9MFjpHxKlUGZLI_Q*6{ zuKG=Kfe_@*m9TfcBopz3zgE@?L%#2ZzY0L|_=QxFO14##)JP>do?`v@T)Cn0J004Z z8ZA`o6syok6DZrJW>&27-hKLnvAbFJbI`dC%&_GXDaz%31qPh1jQBX)<|cl8leNyJ z&1sX3(Ngg;%#=s2-uqReG;vp+g|0&854r9)dCn1dLN_u={n_bc)#G9Iy>T2G-Vc(p(28i~Jt!`irbw;dU~ zD=(KzBd>9g@Y3fa(@Wk-j1V{)#pRUcY3@*_cusj8_f6NPIf;pS2_ZURahjJ^jD!5> zGCCcP>?!GbBX7uuvZ=iF5bn-lT=s^qj$_La)}h)8sNvX0rKn4rBGx*o(^N`QA+~n&~+ky0}GOrW9cQ3H4<%;XSX}RkW%y?3Gc#yIx3IHQ}D%)KYEuYi~W4M#d4C| ze3vU5!$y|_DHnl1^#)m0CT)A_a&jow|o6pe3fI^1aFG7f}w8r z4*uuLQZ6}!SgsioXubon;z9%!! zKTn$sP+Ij34f+smayH%YOqRT(4e*gZPMG>E8t>3rlAC+XsJBAnT$uD&qKUHgenJt> z`*@bm1Wy`XTV5DQ4MrSEt9{4JDz#(GuB>8y6BQTs(tIb)&-Jy1EKMZ!`r?$9t_y!z_8m0ixaz&JM;VD;8$7 zf~>HL+g%*{++byeqa1&@LFM-ksRJEf@rtCq zcdVU!_c2-2;)C5Gw3`GsXC-B={D4_!)GXgeXp{r455F#c@9g~}AQ)Ewv} zmv&7kn6#<;x`Gx~ zGtFT~ZovG$-NW8tF4p^$-WjUkThe^x`Gz{$MD46TW2+}7zuD`$h&cOB;J9G_*An0B z0-ENuExBQKn<12Ki`Wl~I1$1^lFH6Sl;NgSBM6*6Qvqr{*JmT#8{OTA9JZ$IFBydZW{^2co`P)UN01Oe>8l zNSKX<{UrR9xg_pQ)Y*w_^+6gq zTRZ1!k;Z7`Ulsp?l9qs!^4%5Zn&bSkNwDWh2$;|=BgbZGB78T z&bOR#xHNvc>KQS7*7_2|gR`h2_!|9NLmJDv4m-cu4>|aqCK1)lPE6D%J(Ao(% zAb*TMp@TIVw8egj?L}(+=M?4kB*o<4jCpHNPMlthu99f~NaWj9|FPOp~SZGec(rKtZtog!h+IA7&T0aE4`-4 zJ{DPzR!hduT-6dIhj$^ebQv6Np5z;#ZqY-_a7goFQ+RBxlYRBXTCBu>4N{mAyBV zZHPn!wZ`BgTaDqkRXECpKxQh$EgI<+&6G}eik z7|Y61eUpYtjnstDZ!HBu7xKx4%)85)L=T|$yGot*D%BY#h1@TUj-rQEhNp!H1DGT8?={3o-8c&0 z-7jGzuu$l6#i6Grv|twC%yzjv6}Quvstj6YQJP21uy^6vt$0Z~q_RZf&56WS(sIN@g`V{% zZkV~qsV?@ezIg2W-yXT#ZMnF+gGp+gT~|xc8HOnjxR2#XQV#HRs}khoj?8uoj4{ZQ z7#7gyu#wb^v7>8@Jyt>+atC;(Q-F{F6ltKjM9dg@fv|{d#QuiIK zZC#fOti@XQck&LE@tbYlY9ShYnH5ldYT>)5g|G=2Y#42Va*eeSdyNVW6IjouaZoi~ zsL<(sw9b>u#BwCb;Tj%U$+NUp!H=~T+?uMB_TCM#3w>ieR%&&4I1t|c6~#})PB zQj9G|3`OCgSkIl0iZrj{Ifv$5{7KdZi4`>OA?hFO*J&a99tCH7{$PnQ^Q`pVm!H=Q zFOcl>IrOcer{0#5MC?v&X?DfkC2USfNw{+QzMn-v?#nT~J)`+GhU=sbB%#%)VCq zhG2%nIr?6d9>wQfsTeCu+wO z6W4^lVtVHHBR-P!-N%mi8lpo1dN$~92(BZ8B`G5nxFA&_bK;R7QV{0BygBm~3$a6( zCTYR~X)*YKK32xrLIw8%tw6Z`vo9p^0C>7z5GQY4_kmVvfcHmiAsRWF6lZPAYJu&- zmxkW$!yC@7Z(mX`1bzd=w6drLrcYvbzw4d8IUXi$AzczIu1HG?-bIrVJ}XV)BPk#9 zHx#g9+_8#{7o{LCu2eCyJC_=kRe8;sNBLw#ARWq-ht7|#Gv%E7?PqMyVJU$u1!mag z0xK_h5>hcJA9rbahlfPl+~yVddlcaUTQXYySzOrRMQMseaoYPw_+zbF)1;-wSY8~K zE@%<6T|1h?$bQJADzMZWP-$@SL@ap()yJW`3N~oIUTNfZ~BeeRZHQ z&ht={^A#OeVYgU0QLfxY^n`5QfbSU*M{-NMj7rVvS@hSUL3h@%mGBk%iCvcphiBoh ztYt|9be5_7Wa)q29X6x*mqwc}vtoFh^`f7@B_17C=9d@3gJ6nW zqQ$HgQ3K`_#BGRY@M?!r`QsPN`;KQ7;OaR+$C2)ans=&&W>I3`_`d<3C<{mZZtCf_ z=wajb?xM5Tqw=K3tg;IBS>&X~SmM#fo)=nT#PGerVMC25P;OLOQ^F+AoSOSCjfyRODOoa`mVVG-UHgx1kctKs#k;wL; z%*^_2CJU2_$hv``C;Q~c^P6S&o?Pj#i_5L=itja}d9DYmjbu2|uHQR%Hz9kb{FIj* zW$k(JOvd5(jcgdM@P1>R&K2V2K+kGqJ zbi4H&Jrit6`t~qWHo_QTtoU-rrf@Ha90;_^kEcw+3|EY-VP-i7# zzgPInToe7<;zlpu4?p5;+7b_AFE10gT{y}7o&`Ni?uFWWdb)}8@wp&*t!!Ma;k+}yF9miY(PFD)*?36P$-PYMigSjBV=uB%VRAn0O8>m;TPq%7J>8IioqG_ZD8UG zt{%=-U_T(7t?b}@4sLKeM*3TOiOXs!OEE%t!PfrVYB^bX+Jd;?U`4ptxcVUfF4sdi z!*xBaZfz$Z3>6WEh>AhMBnA-y_54F=0QW$GBj%RbAJ3;h;)_4>fLnRGdg!^jI!Q6! z;{9=q`m0VI9Mv{fo>p>Jo^X)tpMFw$|L~LI;s-sa{<4F(x~mPs*6;rb_4YaX(|Jk= zB-pIq-_L|D-2HFJ2|@p7M2cI%ZpXJ2BhtznZo~L@A=0`q9x-be zjK|8#mLDc6$Zu_JE%FbE{_kWL;Sm63|I5=2`bT!Y+ezfFF5vs0d*@HxzfCxxs(*^W zS?m`4=cFi2|DW_93;f3d|FOV-Ebt!-{Ko?S|FgiqwpDN!aE0arZkm2CqgE(CdSt1k zqp6^*CJ(yGgKq90oM6sKbbbJEcJcJkQG7@bdTrBV{s8^|alsE2AZP_cx~c0b=>5ZY z{C~ZkPTjh}1Hd@XEwBHz{=Y4`X9I4ZK%aAZ5bFWV&BGIfAA_*4kEh!$oCLxo;6l>| zgiAn}+XEC3glBHct^a~|ZehDW@NFOhK;ogN^9a<91cd4B{tdSNHyCE`;SAykfjG=I z&MqK-RHMIOn_KwFE$r;%1{(Y7C`}a*280N450PQaSqIdlO0HP;g`MZCWF=qe({!0L; z>-<-lbs_-Nhk&6Hvu;)%R)5;LjfgUv>lQZtH>UX#mgz zZKXB{0Ldu;z-kBbHv8Y`eH&NuPrLoMIDgykPiO@iD(dYQOz7Yj1M4HV)1`JR*X7c!YR3I0R$_gv2DIq@=j`_sPjf$cacuN&bXZpn){#7y|Uo{A`fXBMmK|%zV80G z@W~F3Q+tzo*Hi6fuiyGWpb(ZA7mxcvz}$P-xBPPF(twm_AR%ffkqNPdoyhXkcKdE& z!uoM_sUw?cG`F0;aEk?O!_LQKULUSEV=`)|AkuXvM3$+`@p<}bD)0RI_+C1jEjq{| zL2L(fjW539BbG=sGjE*#C;~0*9P((^HB{mVH8t!s8v7dUVjCc~AP&5aqHsId$JuD5 zvM?l08rCFAU4ag*XB01p3pI|Bg1qADT$ityZ-&2!ZMj$TZ?aZJ`}SE8^tyBF45;%U z0@JJFXS=_o#(Oqs43p*|U;Vt9AFSM?NE3Fd8s|$#eA`N$H!T5&95!FnUhenLPq#AI zIEf7W?lDqlXEvl#@5^v$n>fr_tOb}(P1gs@lnC%Ii-k^F1=6ZnM(nBO^wmC|`e}>! zzBaKrgUHYHoX|s&6=*o_`{lK%eiik;`f{Iwl`17B6stquoh(+>UlW>|e55XvY^waa zxjuw#Job_O8pP4r!l3-3JTujSy{dnplkwz8y3nFcX)CJ;Ri_9)e!uv(#Wrj*mL)USdcP?f3tnfojH$lk-<_@R{3mtoR+qDYn8vZ`kN=E7+E zXotnqi({%OFV?xln!;ta;eZ7LFbFrRRM6v(oSLL%#vhQ;Y7%HB*^} zi;K2^C1zDOCkI^K1yz0zo3~#El#SJLTDGx7LkT4S65{o?x0HNQNKct(&Xxds@>qW8!kk7hlM#wDmiVi zSRDS<&d>-eTAgfOcL_sn?s7os#A$p%-lWkf zA&>2Zr<>vN2@rl3G5hkoO}@mgpj=#M__!@rN?OC(@3|=R2jm89b!K)m!o+?$|4Z{)ny7ys2sa>@~O*=j%cFgMUL{A--6in~8cVZR?l zB-}N5!|cdwBRW54&!4AcgB=LnnwdRzd(ymiNxrpjnW6V({Sk$|S3uyoowG~bMA8NU zo5;~kLwUprd1iB`vwOgHiy!R{Q7{lHC8ky@{(#|rhKeOsX_G~8@4Q5ZUC{n|mTStX z$LG!UZcCO3=r6juPKz=!z54PKL)`}O?GeNKUw+=?EyeH#z%&kr7%A;FL|N)@zm*@JL1yMBBD|h(Yn#s2RsAc|2_AL zkYN$lw9%SoId(j(Jv8aH*0b4jfmCH+19%#S&QSN+!Nzbe9-sN!2XTQ6WrR*+;GneKf2Sw_>B5C3%fkdGPP|-esL;zK2`$ePI=qo&$ zC-S=o>4}z9R7Z%`a^CvX!YHn>nmX#^OE8ub?t46OYKtoO3@8e_r2=duH*+JO3d?pg>p)m%jV$R}eqe>6AM1seVXeo)m(R^;B{cdDg;l{Eh+8#uvN}*$^XHK8>hS zV6Krc>HpM~FS0e)lLB4vHNBCc$(TJjseJ&T5U*Jh?$}%$?-k?0YNd?7T|8;EVC^>e zrrRIbib9ZuvThl9gC59IOfeGYy zJQKQVmLQs1Dzy}0)PiIbl6w<--CrV^KqqfxMPOz+kOJFB3*_PU3X1MJXGuu!rha8? zXZW)|D;Q5o^ZHrY;?+L5G^mP66O@eYZK7|6Y;im1u_AnHXjTwHDK6ufZ0~0# zBl!p>IS~14M3(bpV zt+r;hE-ALjM=jmidQXy=CeqsSqx8UGrNUU3kSj@w8cr}I@-FM6P-h%>7s==w;k6p> zEAdQj@R_~j`bzpdcs{O0w|}_ZyXa#`U|q&Q405!2R{%k`;=s17Zl6%M(`#;+nkj97 zhe*bNK}q@1r8U^2^4Qq)UJH4IbBd)#?ARC^@i(k=UqQ&EpjOiI6Q)`+V{>yJX0a)d z3o%~v#VafZwbbFTOeUj{+);stsl9DvokM&^TK9DZ8+OkW2=q4szGWsA=SZkAcV*mOxLbCu}L9gMtv0vS$(gu zhu-Dcg}f2VENhiu zy+dly(SD6Fo7y|9(k+{$ATBu#R_bTy3AG8cj9SM8bu+&F1*4$rtHK*)cE9$Qm{iJ@k*LqIRJciV_%U^ICxWjd_E?7AztiCUX9iR_U zPMKU+E_ScNYnFyKQ)i*RI|55tUN=}|s+1=*SG-Q@%;8)i0@dbuFI!|D))(an*QCY|wp{#NfC`4)!K0_1r>wtf*bWU-|7jc2pL+d!3w?tl3&$ zc_UxGP}3SfpRip+Z)c&Iqb^yoJ0Vp(y-8*!52knaT@TNex0>xXh<@<~w`^YBIL_@r zAF1;YTB>L-wS1F@r@TC#8b$H=t%qFa%*K1A8#V*7GJw3>y)_NcoFTr7Jp)FsF!Dziz{as#;)uaLiiq*SND%qx-A zO+C;PP355Q@SroRnr97N9ZQ{0&B`U^IGbLI_fUUajnXLDpDg+G>)5%Z&aSI77ZY64 zkwm<<%qQq8?8Xj5Xy=}9XUQl0hXQd%R#8RjRE_cncXyw0u)goOhq<6HbiU$E=Tu%7 z=E6eV8|4%@Dm*E?!TG&YdU3=5#JJh4=rB~zzO*lsyiMPR&Xw9}aGcA5+gGktcsg6% zH0+rdTWzUC^}tsN6N|#wp``cn7QB`L4EPU+X&)uNY9C;u&V1M==a}ftR&}8GDag1c zDVf;&Wst>!9)kcGYa>(VFk!7T`&Mc}k^9ru_>e+Cdh#+@RG81;>}!tvnC2YJd~dc31-YHVM?X6k9*%Ttbux=l+aP-^D$pF& z_u54^+d|``ULM}>{ISt8?N=a;hJJmghJi6GDCs29=3XA#*;1 z`I#Hoi!zJcOzpi#k-VwYC0G(s^^O!inYc*Yh-)?rrZB_~41!P9`ud@o&ar<{uGoVu zn4id|BQ$jsM=PoPU3JCP^IwEYJDGJ4TLY@4>d5@XviNU#qbZl?kPHL6iT!#NP z$t(2hcxCTz*1jgbWz=yymm6Iem2jH(Bc`xNzD$;r49gT0&Z$R{9anvIZCr;*3$qd9 zuCd#1lxv0}CSGU{;HB+t8y8S#_jbn-@(&wHT_Sv)G8*KM2kg_F!C(1!?8J)fmd5N`_Ze@id#b?Ui%>*i6c z!mB;?_EmUrASJw)A#lEBj{IBD;dR^EysC-XXSK`k^$ZcGj3z`gGAM7 zKy0h$4A-5`g_PrVG$ZBqP49n%$bVk=>BX_!bqPqitYU8Jp2a#*q))rwC%sbsmD+|t ziZ?A@D9AP5k{%AV)+gHQbQtfm`>1v%pUyl#M=2C z=@c~I=&P`S=NKJcTVI})5GC}9soS3l9=T*kUv?mJE9A|1h+BMC8F84E_WIggC>ZOU zTAk7zrdQ$H>i**vHPfZgq$(ZQ)-3BIr#W2b@$b+WWaL3pp?#9Gsc?*1%}9FcVHdd# zb4*()^q&;qvX2)$xV-&8FKFnf;Bo5hvJX6tBt#=1VnC-CAm*24ggnqDd5B>p_(;b+ z`p>ElJiL@aIa&%Ci)gFjiWVsEaS7oPY|f~}^~(MYJhEg=zVG-mSG1?MDcpI?e}GX0 zk+^p%r9_*98H0#njx6Zw31DAMN#wU-zyoZFyW8Exg_z zt~5_9lb<*7lf;QBu-y;7|NQj$ysmTyCex?7p*o)_S87vw4`E*0FkefiYm>zxTJ60y z8zzzCtDh~?=W9Mt$$R~#Yywui>K5Lp=0I?$C=^5x$GoRt*${lbvuT(hMe$2M@c!51 zvUxs*5{G7Oc(q${V=|MYTSH(vTS&2ZTEKxo*&Lxf0)D0<@@@DN-g^(3$m!TonY^!G zQ}o4|hDx^FE|HEZ!l~-HWX6GU+}{3*d4qBAj>BfFw>~j`H)77A*C9KRHYCYDZMJ+ZDkpb_z+{f%DT>0P;r4mWgW5>d5oLF8k20n}_V&F_qhf9|B z7+o-k;G>?fHj>cQF9ma}^Dul~?YrL`Ont^h#jTr;Nz|QF z&Am#gWSS=l{g;OIKUr)tHi{4Z1!5PoxaO@1BEBs2T(PW4Q8%1!N04BW^-VCD$RqqM zD_OF0kY$wfBPAICV=7R!1V_%YEo1oMYVZ zakU`pWldGr)fwYvtccdf?Dn3l0z3nAJb3h;?<d`*5{rVmCZveKgGACy2 zpG7kkt60o5DWy!6dX291vM~BGC%O=xXn7ye+wIogj(xwZ(36GjQ?n0;B-%saW!L!?bBJglIYmAPta zX7c80eAFA#Y_i%H_6<#c$Jz%aN|i?jeT~tO+x~OuM`g}^i^+}d@TC2j&D@^?j`*w^ z+)od(aTY7OC3IXr zVQA+)wSGeQ6undkZbS1an`WPll=nBF{XScyI^gzOIhZ;IMgH8F$pG6un) znVAHfnjdOg-C=Sk6@30@W=6f8nKN&`Oo&u2g|}%$%SrNC>w;Snx&BIV>l^I1LHHV~ z`O$J^(dYZs?&^JL71%Ab@*&Fw8|cqrd)d^6d3ID2J$#7jrj z#}wUWC~Vv)MyY#FMt+Sgq;&~tX6`-TOMD;t24)>yd8pV^Db|gn7by{G*6sei;wc+i zdq;40CTi0+|9)fb4Otr{cwGSVb;SN!L9QsQpR5e`v_+y;5Ir*vs@yE)U*K53e zjBh4An<<4LDHND(K|x&iam$>3NZRhrBu`AjJK8k z{GjO7Z@@q%c!1&;H1cTZ>2%#J{B4#eEU`zC;p0HouoN-pXsDqbRqDv+Rd}P+APe1! zw8wAYXB)iols6jw&5^QdjgHw%wS8%1mnS?3V|EB$^BC$h_B!gI4>2tI8!$hEj}}+G zB3Aw%UA<#;CE?aJx?{Uz+qP}nw(X>2+dH()w9-`bFR6>JR~1q(0|sI;y+*hMtdtIEj3Hj&HeKXl705~Yr^NE za?cvliBTk1vn;Ofc=N3g^zmd4qp*FDIeyn(+EaUBXqx22w$v$Ix6DbYTGGXZd(?%h z^|IZVFaI%ajTQ(mBDOql5X<~$T@U0^ zMzQFx#bSy$=F$v$D}|LuPTkrHX2SWjq_Ab7-$$9-lx87@tWU1*jn-YjuC!qRw?#@r zb7|@WrWS)YW4KZ&GHzt){Af%9tnUq#9DR5^p?l;`x~;u3l8w zNpwAQzgmPTjde@te-Dfq;Khi4$Mxmw9GVhnJoGxU-2aOayPZc=wXa%OP~T4@WhDJ) z_=2~X{`+x2#^O;@s)kKvBewmfqx9IX)ll4}u2^6qmHkbO`EL$1SHDFD5zeqH6IsW z>&aOB)z7WWh%)HeI6DOi-9rq*PW)Sa7H6grTx3LBdJQ=uzf$ zj5HM|KhZ8wI-cz42%y#ya-eor%irdk!y= zclANwyY}bE*hwB&9Lt@;T8~4NKz`s@mf%FMEs=lL6FIiPkES7mzfmu&cT9LeAOk5{ zpA`Ge6SVmurT73V10z^>2Io5opE~xB(VF++LbX|a>i)Fo`{kMVu1T%66k0iFjW%oQ zksW`-m&)qI`R;qK4$4M5^1??kM<4PbOXK!DZjQ;2kD2)}0iS65q+c^2ud=2gyK#vM zS`NQ>4TWJPQ@lkKg2>kPDNf?xeW=%g_?H&O|BhE%q44EN*}Q!a9LQ8CVB1_Ix7Zps@P zq}CZ&^@&miakld+DM~+k6Vp|taq$PHKywYFx>hu4LokI(Q|AFPA+^FU){#5ttRX8j5|2(Meeh)riYJJkN>)mVro6q3cOf4E5y{?MN^62%3IM1b2`T^ zDMb{lg3JC0wpkY0pFdkoooKkw456PVIy+*N8>2t!CYARyY&;A|sd!C58AER*HZGs9 zsf?R*ic0;Rk6Q5$pzZ1ZMr$*`GrkyZ!E13;(8 z4}GHROr|7T=NSH}!XxT}7MD0#RjUuAnHKCU;qm0*-ujuRiE?Ae;K;gjCO>{0+Raud z*=On!@wFeEn0#t>MgF?dUaN&#(u@M|44idLML_Qz`7}?*;?RagD`YII!>-qS7@cjg zWWX!q!giEPwQ|$pYkUP+Or3!8g&Ouh0#CCR#;HS2hZBbrM7tfVXO43!-Dz|QycYB) zIqSgHl%+Am+S{eL2+;XZ;+zy(5+g$h=l%mc zH?G!e{pzh5uPb+?wwQC$xK(rBP1)JHJBHzeuX{jzF^?E%*h3y)nu*GY@&TXfE|qLD9|PvHs(WqPh^$*EJuzO zzMx40)eq~XDlvoR@=e})=e#CJpy6@ik1N7bnJ3FxWi)$^C&{|k8-vc^8v`ajl1S@C z93~R?u4QP}nQ$N$Uxjw8wCPdr{wF1H&5fT-56L)+mnW!M6dN`X26L}ksh*NI>r*6AMXyD3eY9EbHE0kZ3K&AeY zkfz5$q-q~Ym2sd3AWR|sMGt_?&r(OQcFA#<;6spEmW1O7$yQ=6#LANIOqjck%QK+@ z4kCO0gz&d7)stbjsI=7{7 z_;DTUdb-%!o^2*PTYE;Gq5USdRPF`|l^GNXRD$e$EGn>XoDmtOgVv+g=(}fhNlrk` z30V;u<8v>S>nen^&stiyHH2n7e%9-v$oc6giT{R8y!T%2DcV?`9eM@a^$w(m#u$OG970Pt1g-a7y3sa7lSz#4r>sCr$oZCE)&Y z5Wz{?GpE316gk8EP3|Z50+;muIYzvNQWtfUc+ocjy-uH;eshsKy!b_o%&6 zCJCfnbIb%PJB=uhCnU*%o=4MbmPX9FpWg3mZC3{)c;xruR`sK% zGK=ck1a%6lA*paG9{d68`2ew$B{@S8$D z`z&8um5o!~#<0D71p3&l!m=|I7&u`I@mqlv^>SGh@1nPSyz&f^hWCvj25VfI1G<%6 ziDmwa?}cY5>2pb4nK^ZgHI*#Elnt|3F?F(0!ncRz8PTQlC0LY20xE%n+dD#;Mh=YE zQq|=&+10?p>gZ17iEwwAMCMJ9t&sA3J+fvvktp?ABLe;P_D~I+;j5_Yx||lvXZgsws){^)G2R{Zhwt7Kh|-!te6^}~x>1EN*P z7G`vV1PKWF8z!ZSaxxv7fZe}68FfMkeq@x@80As_%Fc=JU#g-t8X9^^XII#MIzVP+ zHB*s~7l)L)gvIkOe^taJ{;};{Baa3A{9G(Fgs6!CyC}3(AwLnm&L?4Ojs6{K)Y&x%)h9^6NwX#lIeEM!8m(rH&*A z#)G%E`3a=wq5IMsI$kJ^Kb4vr$$)7_6OvjndA^9ryRv}g zOB>UN3>)UE5IK$h{9WXWg@LRwDdBIaHkaVXEW1BtWhIE65{Y9X7aVvJG?YFYTM}26 z@e7IzhcdY`eFr7(F~l2bJEcAc)_2%&?R>s{GuYCsjs2RwMCx4&^KCa8Sl*x z6wj6m-oVNrBqiZFWB4MnttAq5|Qn z%~n7H!xfe3I&NdJYXLsCPY7vNVk?+e8cL;8=yOdpCCM58$2A9ON{-yAmcBjY@|3iW zPNH|ro?YJ>FZ`^$HxzG(YDT|s7s(0zG?<8e>va3M@p7D-qz##3=I z1~qW*@NIBayfMS_U)FY{{7rk|j!}o+wj;%b%rzZU%kL7GS8|qXct&%{6zT@UiV?$u z0EVTdJv7Eqmq6aQ8{A>+VX4dLQoXZ@!MhXc?{HHHc{sZ!CORxR5m{8@m&v?1%xI>S z1c9pN)M-Q>rq#)Ps)T6%eyC@lH`ImA5@@gw=cN{&Q-{atp5Hbdi#-A&vDwvIBA7~+ zcdWXUV0zFeU81S}&uR3}#AoD!MWxQxvwxAR>8nt8a2(AJbNS=Erm$Iz0sBoR^8_Uz zJtw1tz|=l6t}-=Q!|a`l33Hp$r8Ggt{nKt)0925K_+)|=%RG)19r&23k;~GoVU|SR z5!n1%bj5JRa}R#(#rF3M+h|COx!XZ)WAxH`G`E#hbwvUaQyn0tePUH}6?=S@a?0_q zRdr<4yd!h*hrXuVZTWKaKFlVzKi+Pf?^A4o`G=ZLK<%z^0b#io*MRsdj$U75RD}?@ zX;gFM@(>I54s;U)CNfKNjC@E*^cW@h|L540ruWL!%k&4$|s$6W#$mBvShpwa3fh|L4}+KtTi_! zkALTotA0yf$hGzT1K4y5H;YhEHa5&kdQ=-S(^#jD`B3LzIf#JwEoL=q)$A7D+t<1< z7NR+n^p*BA0}kJYQ+$2NeWiA70Eix%9z1u=7LLASvycN`$#yqqMQpVO3o0&CbX#MF z`~h-S?)vuIuPgax5`U`OZ^xxQ5qNL#o<*j!u?>xz4J46CV`V5eN$95bIx9pB=?AE&P;&Ok5$0*ixXTmE=-g(R2TFuze~-p z0`Rz<*Yimf)VQJ0xks8oVkgsi{s`ckzlXMj5+fAY{ zmfxxfB?Dc<_IL+(Qfs;Je_gJGCEN(#p&3KYw=U^4uQ%a-Phm^&a0uayC!jS3WkZ{? zsNPEeg1ZZ;4Ba~};@OT5-})p3^OK@W?d}Tov~k)~>L~|VbYpXnn+?0l5C+?Dk!#%KFtV&1|=% zUH(H)X~K_u;Dd-G3%s=4IP0|rzvyG4CXC`?$pxVlXxa*` zHgKlcNlvJ3B6D0FCX7&wDdrB5GO-b)LDNm0rA}13;&-K6Nl>+mJ2Fs_?GN+XSYR&f3s=yE8GDVFD=wDc9|~g;`yI z-&M|wZauK>E$mZ)o$9QFN3XqFGudUAZKHZns7Q;3kzlYR@bHFa^+ND{h;ZOgdP*)h zYcX6BtP@GXKEsBmfo5*YuHv1UbjV=&i8T4aJB1bCgg*Ft>Sq#DPrE0(~$x7$lh(Y^qA2Xj&bYnd1jvN!tjAj*Sc` zC^<>C$Yr1wdcl#f>xDwq*7%0bK>;NVX%~jdiTTi;IOx;*CFvvx_{<3VF#X zU>mi%cZqlUFv85ObE3jBR((2j5Q=}PIuQjzm_Q>!j9-IUSQ)xFU{;4 z*#7}S8eosQUgTEWgf?Uj(XcdSZFQuz`ys)xHf<5oF)Q?)QwVx~H95BCeD{?#$Xsyd zG)gwEb*xC1L}nyx-Bdi{j91xo!xNDNB(m+w37n(I88$Z;|@7lq&l`2!?~M2rbKy3Jyn+ zOinNF4Vh-1Yz<2SE=%2Wl1VDcQHa%UYy+7p>$$~fz98GIgikRQLy;Hjd&^k+S0vT$jR<=$)%xWcYxXL%_qJ_$ezx}?;H$!=LHkc%<(E?F>-ZWt_8+m* ze=1y5Q4&=aQ`Z!ckmAPq{p*|m7P$Y>DWR^$Q)_cQn1GSGJz;#ZBHiGzo$V%BCP!X# zsqpEvBU15xLL1gIu(tV94w@1u?dW@*ybDuwi+dS}_1@6-Q&zGeJo}0jawKMK@GW~dAG;$jgG@!0>VV_5Kct>^}*!vJ~$?I-Xsoag=VbW~x zL_hHKK7pBVKb-e!$BO^6J+!0{C*-vY)Z&j@fI|oEz%6fAkSP5Y^hw0t+P+1^7js3p3-w^?2&1YP0maE<^H6GwLEyLJa3vkn>9MGVWm&+xzIC4x5z!&z(a zcKXGz#}DclOv-sD>0MBM9pihE32EKCL!G74b#-ig*4=VP{wZ%oo;0hCy_QEFjaxZ{ zIWQ>v6RfZ2=z)JXZaG?{SZzi7PI}B| zjAxA}Y^)Ggmf(O1-i`DL+IP(cHnOL5KH0BPoCIU<#IFDaCV4BsIum!eK=p(t34cU+ zHQsnR>|iwx{62g*jo`6AJBXdftZDk0JFO>xlsdklA=(^zl-^}5MogjBftPIbfOV72 zkR>Zu$b=`}+UnyO7v(fvc2?zJ;(NVhvd^Rh4Cqzw`at9RCob=Tg6p%DjzwIE+j@!` zJNS&kQCeY0(;o^%ic~y{p2nj_a;=i;NS!QN$7=*+^&w&Jvz9+>)>F}kha~H0bxg=G zR~o0Se7FJtWmBHf{xQFlz{gav-Fr`76*tL#h+)X{YJ(`oz0fnFrAjRrV<>(SqI1aO zhNF|QFG1VWRud^l0(AU8fQUiM{;g4QyyChMAy!+5{(dUPnVhct;b6?4aGetrEm)-4 zELEW8Vkk`DWf(Y{ayucu`G#~Kl@CF)-vQ@kRP|HrPX)jiWDY^4q!pJvA+3Tg5AX{YYn>};pcr|GV z>V&&p@+gbK^*|DXCnQ=RiIp(mmL&_t-SnG0j(ACKH5cxLPVG{^XNWMW-E^WFaC60A zPD0uiQ7p1STG{=1_}pFG(yIWU8z$Qr+Q<=C7-GBshJ8MhXZ+Efv`$*dc&XB@)!7!~ z8G~xZatlbnSY+yYrn5205NOm37{N!(ArO@}h(?)9bPN%!-@oF44$?~8qORUI?%djh zI5V~YD`-1OVl6}SnPl@I9UsjNf_0on^@o5P+RBXCJ6IniTU?@Sxl=`(WRoKOQh($K zlQ_r@m+YlL8lL$a(KpjbyGQHd9UlM6-eqTLb>-z^b`DC%<|jnwm;3SH$`P73%7l)n zWM#NDZ}3|1p0<=7Lv3nt`PzkOEGT{C*apprjtVAVYh8V5a>--Ru8*ZpoC(cBxcQp@ zD+b2Pz5e%UiZtaxyXONK>(Z@uAuiwFe(2W&#i>yHqZfhWEN-pus-un^28+zu;4Gp) zdb&3vV5PIC=Hqd!$L_vLZv^EB*l3nuR2kCH`Q{XAC&}|`l%eZ)_UrG*C?(UIS2l+c`4rYhuf|VKquG~rJc#VBp+#CVw7x4r5_y*^}Pkq?3RC=wtQw~WEk$8 zlu3B5Jd^e*0-q7A&mMcqu5vTqt=(%UItnLqrq!|I*rLhzcXiR z!zOt$INFY`6y9OY4vF24kS3)Cb*~@1dhcc*9_S;3ls_)~c7mcl&ERpL!Kj6Bq(gd$ zhodjIek=AMJjUz@3)L}nCQPlL^>0B~mp{2Bj(mcDFBvfU6p!ITOoAIl>pAvP{KbI% zmysEj(Az{8ZFKPF$e?v_&@U|xp2RJ15cVyDxyl4)$~_4odFJ){X8J97O>i6Nx>b{F zuTR}&h|cg`2F_yvf(zq|l3Kgd-M8%8T>J;smbn6_Df-OZ++T zI=eW)+x#8plzF+?hBJxph%`l1X1k*U=h7PkgRO1bGk9i{;r8-kApZyS0bW@G)8IdZTePTA)rlPozQ1un`ZnSzi5zC?X7odXHJ1cdhJygAR|p2M z(h@8u2wBZ))!5^2F;e)G?OIIwOn0>NF|Io}4gI6PMkP?)CR*w)en@D<2Cqa5@Ud8$ zLG`o7xc(7UJ%pZV!D;?uj=-AUj~f8nMc!+YK*J8{cy!%=DA2twh9;)RIANxtbTc%m znrE;~6(yqUp<52(ESRK6_%14d1QB)!z zQqjWXM7d7O5Fs@tHm#uTHa+yy^8P_{%6eFQO-u&`#*7@19iGp~Y&eUNRLbmki8y^Q zicmUeJx7}*E_#qIuHAf)9)3c_^$*rE`V;w%9=ds*;g9D?k$$*9Ctw?svB-D~PjFQh zQ4e|XJ*08-Acm{h7D*Fmgi8ERM=MvrW5O7{${UohAVa1H=x-@(XviGleQXehAXHM5)7A0n3rQKzz^!LJAOayro)BgRq?yI7RD(9^j~3`cdzEmJRb7v-(m)lQA;PgNDL)P(^?hF2c= z=;>!&-Pes{84J2%RJF{fqg_M*+1K19ezwPGlqGDJHQXUlBMM=>Pc(*)=*dNw!?-}y z$|MXmqAjFHew&c9TxVhs#U^_fiMHd51DR^#@nCS=+bfdZR1%{fi)vBfHw8^`WbzfD zspe9sLw)OGD3carG3AW`o;x%7P+WN28<-I zM3DIicFBudjQ3siandQ252QHQe*0-1J#c&`w#S)@!%vyfXZIT*#|@1}Q^nSF^192e zqD**5FJr(&C--wa?XbDESd+Da@{>hEjxp;X)H}^Z0~XcBA8anMPMeb^@|gS!e#IAi zxnIP8A90MOzJ<}81!uT8G&&LsaUl6hZmi26ERH7D6_VRnWYbVAIXl5$E^Vkttd{Ii!+m;- z8JH>UlHpn+7+1Q(ktt;*Naa*oWfqcTY13*9ig%lUw6IXJbHT7r=$Dm}xe_L-RFsQR zQ1H-;U2;kZk@VO8Bey3YwU?!J4+!4w8?mG>0%tMSTk5QUbh4dePXg6mvQ4%7bYvyN z8|_cs$JAl0=6Wbs4Z%kc-3KP{?Ov!z6M{0 zHAX-#)gx{r%EcaTZ-IWWv)MD$bEj)e4k)lm<_*Isl{ZCx=$G@aqh4r)o^Yw(!G1>d zitt#50}^Q>b+BnZXDm)wJ7lwLy54lFrvJQb(N;Y0BaM6p6?);z$u z6#WvI7nTUw$tp-L8{|TZD5))M!AgPR&UO2*25_FZ*1pa7(8b8(Q|rcuoVdZLp|AZ?A6SQ{d^cF{hk9z zHJm-<0{!jEE=aG#^IL0V7N#X7ea8v8TW#R)!#y&Ir#><8K@7X|caSgo5yU7>l%`t{ z;tG!2{{X@gj5D8B2^A2K1O0Rt!c#}-UfaK~bV{N|f^Lz~1+nlSj}G6hx;Rw3$BKz}QOe zpL6pZckl@o)CigX096XDJ)Y1^1c%z_6ZX-u)HhI7->pQMXNsg+&b)8Mqqsx~S%OxF z8ktsr@hDRwl@A~NvfHQ#^e#nSreFuS$np=i+U_L8n?3&k=#%=8;Jy(AP3}{um|eS{ z6Hw$ax>zqUFY#mdhqyB4*}^U{>tY|G(v+^dSLVi=Fx0W?xec%BW(%WcBdv8bACrSa zVr12s@YBw~pXcqiX~Ii9@}9eB03+TZU%}5k2_worJ&>T@pve$hFAYw5dU`lilBPil zqSMzeQ^!BazZb)37F|F4nxyWNXUSl&2wN>HEBl|i^}o#Q7o+u+DEv=z_5U!ls-|CQ z0xC&yBg_ArD13EQ3!~Cxq)Xmb?b@Xl>97x@7lF^q`E_P=2!~uq(lxR}OpxkW$xW*H zi?}sZ*Vf4~+N7Um+|VBY_R>A%_$Ud{6Jw+$N=v}>sQ5^jzb;hgX-@xlB?&DjV@Nl( zgD0Ft$9h_7?^+H9SCKI@J%KmO_>X?b6lQn>NjIgY z7JvKxm$-r!#D&=-8A*IDL#l%xW!E=|@}DA28m@bat92IGeyq@W6eaZ1u3AdYsw~`F z=$oD_-oods$i!$pGCz#jb(h*?#+ZwORfR}#qVaRyd&rvHP~VrQ+9M+@9;&8vWi*OW zFa%EM+~4e148i^m=MfF7!$h}k{z^((g6p=j%0dbPE7ZYa1m+o|;d7qDy^;l6Lxj<{ zM8+nr7#-x`2tS%M@Udc(0~G;;lSkU(TP8?tS2&n16Yp{)Ptt#383Q!g8D9p_VF}86 zfoo$f{m&uMu5oOAwG(vE{{Xm=eb()AD~*}}cGrAgG?V#%fc02o#sCzx@937W!RkWF8H%3SeTqXOr9IPB&9@m=H{m}t|t|B|;b(K4eu31ClSpuf$n3H(sp_TD$n>rKI?k8mD`{)RNPOy}W;;Hz$MTijYF9d%76x(0q!hnR2EU=<*yeG|(TIn!dh z4Co(PWN3cGSp6KCNN=6y5iF&9ss8Q_`7&wx5@SD4g-+tGq9=gRgbV)zDrWTahTxz) zaoxv(Fby@+Ymma6%O>iK!Jq&t=Xp5RXh8#YzEP68`Xy05vR(tK63urkTyhB%0rX*5E=$IR>JE_=?E&I^v$0i`AW2q6=uPdk1r}4)4jfF zja$^IV3?kbr8Hcqc82j>vx3nXko6nhAxL_IeXI1PW???9+42I{vmu?QS=?M8so*v- z{@zWRHh;gx5TK8oNWPqbANNz0u~s+0!^M{hgMuh?QFTS{A<^Yp^MN@Mp76}CkEI1F zneWsRA@0Yp)D{t;L|HYfR?`TZxMEip7S=RR5A0AUNy~FSqm#Ot8q{1QEN}L2o+N%w z0J2Kodq3vV1Rjz(?z@!PdH#`cMj^X$$;u6*^rS)dnN=bLCmnR34439L0#H*9hpfC| z+${;QX|p*6r>V8oCKSTZ!ne;fIP-z5{Ri6h@*Qx~^%L z-<~=7K(${4*dx;_X9Uia7?xo#=n^`L3^nGGZih}$IgG{l+7bHl3$SucrD(7S4M*nq zItRsApB(5#lq{7Wx$+H%y^tW=$|u=cmD{^jjCsA_pVv=S?nN+M8L``QUPJ^l8BbX- z5#b)fHHUKpygd3@sv6}__9F}c?3|z*uo~$lM{Xg?nh4GH#~}mu&=z6qE}~>AjCm2X zwx;@9kz)n6xE|F=Hk(%kqMkZT=|A&~;wh9J-dQJ5Kj&AP2e1DDRQyR2wi>eP*!?p_ zi=*mXqY+>4Ff#g~5mV`q10)dWSCEpw(V$0i0(>(zqr=oL2$CySzRJx3Mgte)IWQCW z-A{vJkgMu*sli_;@KP1E_$3G2G$=r)E~Rr9+uw|b*WNUtlz)H*ZkS}vAs+Q@T6XV3 zns_%k-njtgA?rGjFOP{ud!B(yrx4ln`A{z}sn*`a7K;`y<#=m*b&JJ`1>GLnYMK8E zzZso@7?Yis`IH(Q%@;Tkt*XuV<5LR9V76Kr&ac@-oJzZEB8F()Qf}Srnat_W+-fPZ zo<6I~6b^o=GU$^`vvYVz((N-6_t#0D@I?zk*r4+IM}L**6rgtFAf+`|>BJf!vFn^P zHtNQoUUA0|2W7b=F>mw|OY6Ch!u3-!5(8&cc$zmWkTbg@zwb7o{#`L}46dwJa7kM}ld*FPgkiZoYt{WFner1focVEx zEW*^xy#xlx7)v>C+AR_)9}7Alpn80g^-SiM4Wrj2(Y`f(OJ3czHTnn#zn!69QQiGW z;Nj0At<~SXF=a(_cF`*l-%iQ_ajCkcf2y3A8Izv1-J<@U7&Fb1o)T$1!WEPm((PXu+k5DSWri8#wgLis4Y8RbB8?cc0 zG;thhlzpeeR=eC?&Pn&Yju*s9r=L{@_SBP%5GO8>qCiioZz!bRG+?Ow$doB|@DOmLrUuKkR^f%q;Y(U`07NGb;u^ z43VjBCA20FtojmaFL6WygOB6UWX60W?N9=`nY!X95LC^9d6u%Z$4M(O(+7}!h)a+mXQ~sybA;D# zlk;Nnnty~|C)L>cl2ou#&dxBv_r58Wl6VK)&h?~krVBiN%14F`_j8+ldFJT~$kd;nDw0)~-DSQ4Us-Hf3O0E~w0^ z(sk|eri3VFWTkCXg~U4Le4MnwtdnGh(~)FvJmu{}z92+?N#IIN#s5~*K!k%EpE^;H za(h%2A|73|$iUa8eH7xIK`qj|R?Qw^6QUU=?V|c19|FvHKC1O1)5#O!Ru>%}CZ{I1}mbfR)h@(3xk6nyV&%ziZ|-7qpM`jBP=kCYDw ziF|eu?h*gUc?g9bu^%-7`T?X@{`dMQG;r4pzd9??W8Zal!xcIqAR zu~diPWY)3?@-I22TdXMPmaBTZHB3=!-pIL+T_Z312autu6;KcXIGSIEofw<(_XOQI z^ve*@&rt^N)aYC@dJ&}1*}5XfH2QJP8TH zM86z7DX{`9(oF<^H7^6f!$iSh*_sVpeX&)K!x<;Xik#6T2A%%_);ONOyA*Vht+9TXeOYlp|3hG*O!_=ZfT~!n+4sU8^@tjB@$H$08_@Y+LpAhy#x} zuy}0!4ma)p8OwG8=91`p!)VL>?Z@JCdJzC=o?))iIvN%N_l^OoZ+Evya@DtfzfR61 z2(7<7^7LRKi!G(yI;3_SP7h6T(Nf~p-bTMeMxOJJ{w$CLycQ6A#=(BnJz*fFg&vK% z7(GtM?YucWOEGy$X3>_dd{}Y^J!O50eUI=8-kXAlcRT1SF~&G<=d8TIz+y)ctaZ#$ zzVxF+2Xs3{$FG1=+dFl&kBfYTCt?BiKDh+Y7^4BXM50yuXcxVqAGG|r=h%W4o4hfv z=#N$vEOinP*<%?~@uy@SY6=yU=S;OQ5tJ7z0r=XLqY(`<`~audn9xV)o5gsJm}kgb z(K~DF1$GGd6(v`K#ly$}tF$ysXXE?zN+G>Q;~?b0a*^mwzab%uzQpMyh8FOlL@P)I zgK1co;6p2N2U!k5v31E$kcD)ZZhC$Vh?^YLNlaMoFR|;kyy@0V zJ@s;DmTN9wuh2SOvZ&7mY8H#=`=s)z`V4%lMzBTg-zVz^}>6?E(v*Op`O`}jx|XQcY~ zN=u;N=Jh2W{ zo(V=I!WDbGR~BMyMS1GpaAfjElEl$h zx^ljZz_VhqjCR8}S3)pZma@mV?Ieo&&Jr?H?gt{Dj9@*iN##sBx(C#aNzckD`3QEj z`2L)Zrf+P0;K8V9&Wb%F0O(7DWqAdYT4ZV@eY@un4lx&}`!@-)5?bct2gDD?OnF~X zktcGMdeeg1b}4Z7Wu;;njPx6=@(}E10Aa(oAq1~Z@2dsKl=s45nL7;NyeU)R9=(wd&WX1Nl%X!#k=LK31 zC7~OlCJ1pt!)1oy)73f>k~hkTho~L3{73}M%4NnQw^&X+K~799YfVE#BTG4WIrb#` zDjjs4&T$jnOGIZVbN{hL+#v;IA=3J$7zs$SGa97TcQLjM`B={^2K0k!C9%@xSeWW_ zhQ9t$lQmJ~Ls zj_XkgQq9)p6q0@1ytJbqieNGdd#pt928N;8ywOrHFrNrPI+|rubRpjemcd@FwCMA3 znP)eU!rcK5TtV(s><~!%oG%J&bb#I8c?D@yq6JLV_6xqF6%9Qo5BLn=E|zP(n8*oR z=$fQU-}t_tHN?(UcoZ(70c9lPArFO2)g4>H1^lJ-G3hp!Nv+sgoNs61@kgKM@FPb3|#N=M+CvyC7s^~ z!-*DE1Ru;$lK*6%g!+!F!jhH8u5w+inV*o1nwEA678DL+PXKHR)BVeU0c%9p2KNH1 z)P|`$Fx~WeN318Y>}AY(9xXGWFz%!HQCzXq=a~=PjpNK-GUn>bd!Pj++J+rEa=XcS zeSj2}Wl>Dy%=oeXi33i?+OS6p?a^$;7mnMJ+G%>BtY{RH-%Y>rmmuS!RE2)V;;49Z;E^-U6*V^#F)5B3a~d@sKip&NXxQYjXzt^imBT5chZ&6Vn33B*i}cqM6aL)H+6Lx??-e4OE8N&!?ht?D^X|mNdn2vSl2Dl OP&UOP;JC$wl2$JO literal 0 HcmV?d00001 diff --git a/resources/assets/images/ranges/range_fake_700_700.jpg b/resources/assets/images/ranges/range_fake_700_700.jpg new file mode 100644 index 0000000000000000000000000000000000000000..027ab3f2bea9ec631627194717b825d901ecdd9d GIT binary patch literal 95921 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 OP&UOP;JC$wl2$JO literal 0 HcmV?d00001 diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index 380fc98..27c7387 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -5,5 +5,9 @@ return [ 'news' => 'News', 'tags' => 'Tags', 'sliders' => 'Sliders', + 'ranges' => 'Ranges', + 'products' => 'Products', + 'recipes' => 'Recipes', + 'breeders' => 'Breeders', ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index f183eb0..d174154 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -5,5 +5,9 @@ return [ 'news' => 'Actualités', 'tags' => 'Tags', 'sliders' => 'Sliders', + 'ranges' => 'Gammes', + 'products' => 'Produits', + 'recipes' => 'Recettes', + 'breeders' => 'Éleveurs', ] ]; diff --git a/resources/ts/components/bo/EnumTagDropdownComponent.vue b/resources/ts/components/bo/EnumTagDropdownComponent.vue new file mode 100644 index 0000000..290d8dc --- /dev/null +++ b/resources/ts/components/bo/EnumTagDropdownComponent.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/resources/ts/components/bo/ModelLinkComponent.vue b/resources/ts/components/bo/ModelLinkComponent.vue new file mode 100644 index 0000000..9e718d2 --- /dev/null +++ b/resources/ts/components/bo/ModelLinkComponent.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/resources/ts/confirm.ts b/resources/ts/confirm.ts index 3b70474..24e84c2 100644 --- a/resources/ts/confirm.ts +++ b/resources/ts/confirm.ts @@ -53,7 +53,7 @@ window.addEventListener("DOMContentLoaded", () => { const el = e.target; if (!el || !(el instanceof HTMLFormElement)) { throw new Error( - "confirmDoneJS can only be executed on an exising form" + "confirmSubmitJS can only be executed on an exising form" ); } confirm.methods.confirm( @@ -70,24 +70,42 @@ window.addEventListener("DOMContentLoaded", () => { } elements = document.getElementsByClassName("confirmJS"); for (let element of elements) { - element.addEventListener("submit", function (e) { - e.preventDefault(); - const el = e.target; - if (!el || !(el instanceof HTMLFormElement)) { - throw new Error( - "confirmDoneJS can only be executed on an exising form" - ); - } - confirm.methods.confirm( - "Confirmez", - "Êtes vous sure ?", - el, - function (response: SweetAlertResult) { - (el as HTMLFormElement).submit(); - }, - { icon: "warning" } - ); - return false; - }); + element.addEventListener( + "click", + function (e) { + if (!element.getAttribute("confirmJS")) { + e.preventDefault(); + const el = e.target; + if (!el || !(el instanceof HTMLElement)) { + throw new Error( + "confirmJS can only be executed on a html element" + ); + } + (async () => { + const promise = new Promise( + (resolve: (value: boolean) => void, reject) => { + console.log(el); + confirm.methods.confirm( + "Confirmez", + "Êtes vous sure ?", + el, + function (response: SweetAlertResult) { + resolve(response.isConfirmed); + }, + { icon: "warning" } + ); + return false; + } + ); + if (await promise) { + element.setAttribute("confirmJS", "true"); + el.click(); + element.removeAttribute("confirmJS"); + } + })(); + } + }, + false + ); } }); diff --git a/resources/ts/index.d.ts b/resources/ts/index.d.ts index 640ff80..abd2a6c 100644 --- a/resources/ts/index.d.ts +++ b/resources/ts/index.d.ts @@ -1,7 +1,8 @@ export {}; import { AxiosStatic } from "axios"; -import type VueTagsInput from "vue3-tags-input"; +import type VueTagsInput from "@sipec/vue3-tags-input"; +import type { VueSelectProps } from "vue-select"; // * Recursive List type StringList = Record; @@ -34,6 +35,8 @@ declare global { type LaravelModel = Model; type LaravelModelList = ModelList; + type VSelectProps = VueSelectProps; + interface Window { $displayMenu: (show: boolean) => void; $toggleBasketMenu: () => void; diff --git a/resources/ts/modules/confirm.ts b/resources/ts/modules/confirm.ts index f963f33..5c6c6ab 100644 --- a/resources/ts/modules/confirm.ts +++ b/resources/ts/modules/confirm.ts @@ -9,7 +9,7 @@ export default { confirm( title: string, text: string = "", - self: HTMLElement, + self: Object, after: (response: SweetAlertResult) => void = ( response: SweetAlertResult ) => {}, diff --git a/resources/views/back/layouts/nav-menu.blade.php b/resources/views/back/layouts/nav-menu.blade.php index 1cba057..93f64f0 100644 --- a/resources/views/back/layouts/nav-menu.blade.php +++ b/resources/views/back/layouts/nav-menu.blade.php @@ -15,5 +15,15 @@ 'model' => Str::singular(__('models.classes.sliders')) ]) }}" data-bs-toggle="tooltip">{{ __('models.classes.sliders') }} + + @endauth diff --git a/resources/views/back/modules/scriptConstants.blade.php b/resources/views/back/modules/scriptConstants.blade.php index 38df5fe..d8ddb33 100644 --- a/resources/views/back/modules/scriptConstants.blade.php +++ b/resources/views/back/modules/scriptConstants.blade.php @@ -15,6 +15,10 @@ tags: { store: '{{ route('bo.tags.store') }}', jsonStore: '{{ route('bo.tags.jsonStore') }}' - } + }, + ranges: { + 'model-title': '{{ route('bo.ranges.model-title') }}', + 'search-uri': '{{ route('bo.ranges.search-uri') }}', + }, }; diff --git a/resources/views/back/products/create.blade.php b/resources/views/back/products/create.blade.php new file mode 100644 index 0000000..d181e2d --- /dev/null +++ b/resources/views/back/products/create.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.back') + +@section('title', sprintf('%s - %s', __('models.classes.products'), Str::ucfirst(__('création')))) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+
+
+ @include('back.breadcrumb.breadcrumb-body') +
+
+
+

+ +  {{ __('models.classes.products') }} {{ __('création') }} +

+
+
+
+
+ @csrf + @include('back.products.form') + +
+
+
+@endsection diff --git a/resources/views/back/products/edit.blade.php b/resources/views/back/products/edit.blade.php new file mode 100644 index 0000000..c980c6d --- /dev/null +++ b/resources/views/back/products/edit.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.back') + +@section('title', sprintf('%s - %s %s', __('models.classes.products'), Str::ucfirst(__('édition')), $productModel->title)) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+
+
+ @include('back.breadcrumb.breadcrumb-body', [ + 'brParam' => $productModel + ]) +
+
+
+
+

+ +  {{ __('models.classes.products') }} {{ __('édition') }} +

+
+
+
+ @method('DELETE') + @csrf +
+ {{-- Public View Page --}} + @if($productModel->status) + + @endif + +
+
+
+
+
+
+
+ @csrf + @method('PUT') + @include('back.products.form', compact('productModel')) + +
+
+
+@endsection diff --git a/resources/views/back/products/form.blade.php b/resources/views/back/products/form.blade.php new file mode 100644 index 0000000..88672ac --- /dev/null +++ b/resources/views/back/products/form.blade.php @@ -0,0 +1,415 @@ +
+
+
+ {{ __('Informations générales') }} +
+
+ +
'productModelTitle'])'>
+ + @include('back.modules.input-error', [ + 'inputName' => 'title', 'helperId' => 'productModelTitleHelp' , 'helper' => __('Doit décrire précisément le produit') + ]) + @include('back.modules.input-error', [ + 'inputName' => 'slug' + ]) +
+
+ + + @include('back.modules.input-error', [ + 'inputName' => 'range_id', 'helperId' => 'productModelTypeHelp' , 'helper' => __('La gamme du produit') + ]) +
+
+
+
+
+ +
+
+
+ {{ __('Seo') }} +
+
+ +
'productModelSeoTitle'])'>
+ + @include('back.modules.input-error', [ + 'inputName' => 'seo_title', 'helperId' => 'productModelSeoTitleHelp' , 'helper' => __('Doit décrire précisément le produit, recommandation pour un positionnement optimal dans les moteurs de recherche : entre 53 et 60 caractères, balise ') + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="productModelSeoDescription" class="col-form-label"><b>{{ __('Description seo') }}</b></label> + @php + $data = [ + 'id' => 'productModelSeoDescription', + 'class' => 'form-control', + 'name' => 'seo_description', + 'placeholder' => __('Une description du produit pour les moteurs de recherche'), + 'ariaDescribedby' => 'productModelSeoDescriptionHelp', + 'required' => true, + 'value' => old('seo_description', $productModel->seo_description ?? '') + ]; + @endphp + <div id="input-text-auto" data-json='@json($data)'></div> + @include('back.modules.input-error', [ + 'inputName' => 'seo_description', 'helperId' => 'productModelSeoDescriptionHelp' , 'helper' => __(' Doit décrire précisément le produit, requiert entre 50 et 160 caractères, balise <meta> description') + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Labels') }}</legend> + <div class="row mb-3"> + <div class="col-12 form-group"> + @php + $data = [ + 'name' => 'labels', + 'value' => old('labels', $productModel->labels ?? []), + 'tags' => App\Enums\Products\ProductLabelEnum::toArray(), + ]; + @endphp + <div id="enum-tag-dropdown" data-json='@json($data)'></div> + @include('back.modules.input-error', [ + 'inputName' => 'labels', 'helperId' => 'newsModelTagsHelp' , 'helper' => __('Les labels associés au produit') + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Publication') }}</legend> + <div class="row mb-3"> + <div class="col"> + <div class="form-group"> + <label for="productPublishedAt"><b>{{ __('Date de publication (Europe/Paris)') }}</b></label> + <input id="productPublishedAt" name="publish_at" class="form-control publishTime" type="datetime-local" data-form-type="date" aria-describedby="productPublishAtHelp" value="{{ old('publish_at', ((isset($productModel) and $productModel->publish_at) ? $productModel->publish_at->format('Y-m-d\TH:i') : '')) }}"> + @include('back.modules.input-error', [ + 'inputName' => 'publish_at', 'helperId' => 'productPublishAtHelp' , 'helper' => (isset($productModel) and $productModel->publish_at) ? __('Laisser vide pour un affichage immédiat du produit.') : __('Vider pour un affichage immédiat du produit') + ]) + </div> + </div> + <div class="col"> + <div class="form-group"> + <label for="productUnPublishedAt"><b>{{ __('Date de fin de publication (Europe/Paris)') }}</b></label> + <input id="productUnPublishedAt" name="unpublish_at" class="form-control publishTime" type="datetime-local" data-form-type="date" aria-describedby="productUnPublishAtHelp" value="{{ old('unpublish_at', ((isset($productModel) and $productModel->unpublish_at) ? $productModel->unpublish_at->format('Y-m-d\TH:i') : '')) }}"> + @include('back.modules.input-error', [ + 'inputName' => 'unpublish_at', 'helperId' => 'productUnPublishAtHelp' , 'helper' => (isset($productModel) and $productModel->unpublish_at) ? __('Laisser vide pour un affichage permanent du produit.') : __('Vider pour un affichage permanent du produit') + ]) + </div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Illustration') }}</legend> + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="productPictureAlt" class="col-form-label"><b>{{ __('Texte alternatif de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'productPictureAlt'])'></div> + <input name="picture_alt" type="text" value="{{ old('picture_alt', $productModel->picture_alt ?? '') }}" class="form-control" + id="productPictureAlt" aria-describedby="productPictureAltHelp" placeholder="{{ __('Une image de petits chatons') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_alt', 'helperId' => 'productPictureAltHelp' , 'helper' => __('Doit décrire votre image pour les moteurs de recherches et les non voyants (5 à 6 mots)') + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="productPictureTitle" class="col-form-label"><b>{{ __('Titre de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'productPictureTitle'])'></div> + <input name="picture_title" type="text" value="{{ old('picture_title', $productModel->picture_title ?? '') }}" class="form-control" + id="productPictureTitle" aria-describedby="productPictureTitleHelp" placeholder="{{ __('Une description du produit pour les moteurs de recherche') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_title', 'helperId' => 'productPictureTitleHelp' , 'helper' => __('Utile pour les utilisateurs, s\'affiche en passant la souris sur l\'image.') + ]) + </div> + </div> + <div class="row"> + <div class="col-12"> + @php + $data = [ + 'id' => 'productModelPicture', + 'name' => 'picture', + 'helper' => __('L\'image qui va servir de vignette à le produit, doit être de 700px (hauteur) par 700px (largeur)'), + 'width' => 700, + 'height' => 700, + 'value' => $productModel->picture ?? '', + ]; + @endphp + @include('back.modules.input-error', [ 'inputName' => 'picture']) + <div class="image-input" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Vignette') }}</legend> + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="productPictureThumbAlt" class="col-form-label"><b>{{ __('Texte alternatif de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'productPictureThumbAlt'])'></div> + <input name="picture_thumb_alt" type="text" value="{{ old('picture_thumb_alt', $productModel->picture_thumb_alt ?? '') }}" class="form-control" + id="productPictureThumbAlt" aria-describedby="productPictureThumbAltHelp" placeholder="{{ __('Une image de petits chatons') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_thumb_alt', 'helperId' => 'productPictureThumbAltHelp' , 'helper' => __('Doit décrire votre image pour les moteurs de recherches et les non voyants (5 à 6 mots)') + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="productPictureThumbTitle" class="col-form-label"><b>{{ __('Titre de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'productPictureThumbTitle'])'></div> + <input name="picture_thumb_title" type="text" value="{{ old('picture_thumb_title', $productModel->picture_thumb_title ?? '') }}" class="form-control" + id="productPictureThumbTitle" aria-describedby="productPictureThumbTitleHelp" placeholder="{{ __('Une description du produit pour les moteurs de recherche') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_thumb_title', 'helperId' => 'productPictureThumbTitleHelp' , 'helper' => __('Utile pour les utilisateurs, s\'affiche en passant la souris sur l\'image.') + ]) + </div> + </div> + <div class="row"> + <div class="col-12"> + @php + $data = [ + 'id' => 'productModelThumbPicture', + 'name' => 'picture_thumb', + 'helper' => __('L\'image qui va servir de vignette à le produit, doit être de 300px (hauteur) par 300px (largeur)'), + 'width' => 300, + 'height' => 300, + 'value' => $productModel->picture_thumb ?? '', + ]; + @endphp + @include('back.modules.input-error', [ 'inputName' => 'picture_thumb']) + <div class="image-input" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Description du produit') }}</legend> + <div class="row mb-3"> + <div class="col-12 form-group"> + @include('back.modules.input-error', [ + 'inputName' => 'description', 'helperId' => 'productModelDescriptionHelp' , 'helper' => __('Relisez bien votre description avant de la publier.') + ]) + @php + $data = [ + 'name' => 'description', + 'text' => old('description', $productModel->description ?? ''), + ]; + @endphp + <div class="ck-editor-bo" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Informations Inco') }}</legend> + @php $attributes = [ + 'ingredients' => __('Ingrédients'), + 'preparation_advices' => __('Conseils de préparation'), + 'sales_pitch' => __('Arguments de vente'), + 'allergen_list' => __('Liste d\'allergènes') + ]; @endphp + @foreach($attributes as $attribute => $helperText) + <div class="row mb-3"> + <div class="col-12 form-group"> + <span class="h6 fw-bold d-inline-block mb-2">{{ $helperText }}</span> + <div class="form-check form-switch d-inline-block ms-5"> + <input class="form-check-input" name="{{ "show_{$attribute}" }}" type="checkbox" role="switch" id="{{ "{$attribute}Switch" }}" value="1" @if(old("show_{$attribute}", $productModel->{"show_{$attribute}"} ?? null)) checked @endif> + <label class="form-check-label" for="{{ "{$attribute}Switch" }}"><span class="fw-bold fst-italic">{{ __('Afficher ? ') }}</span></label> + </div> + @include('back.modules.input-error', [ + 'inputName' => $attribute + ]) + @php + $data = [ + 'name' => $attribute, + 'text' => old($attribute, $productModel->{$attribute} ?? ''), + ]; + @endphp + <div class="ck-editor-bo" data-json='@json($data)'></div> + </div> + </div> + @endforeach + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="productModelPortions" class="col-form-label d-inline-block"><b>{{ __('Nombre de portions') }}</b></label> + <div class="form-check form-switch d-inline-block ms-5"> + <input class="form-check-input" name="show_portions" type="checkbox" role="switch" id="portionsSwitch" value="1" @if(old('show_portions', $productModel->show_portions ?? null)) checked @endif> + <label class="form-check-label" for="portionsSwitch"><span class="fw-bold fst-italic">{{ __('Afficher ? ') }}</span></label> + </div> + <input name="number_portion" type="number" value="{{ old('number_portion', $productModel->number_portion ?? 0) }}" class="form-control" + id="productModelPortions" aria-describedby="productModelPortionsHelp" min="0" step="1" required> + @include('back.modules.input-error', [ + 'inputName' => 'number_portion', 'helperId' => 'productModelPortionsHelp' , 'helper' => __('Nombre de portions du produit') + ]) + </div> + </div> + <div class="form-group"> + <div class="row"> + <label class="h6 fw-bold d-inline-block">{{ __('Valeurs nutritionelles') }}</label> + <div class="form-check form-switch d-inline-block ms-5"> + <input class="form-check-input" name="show_nutrionnal_values" type="checkbox" role="switch" id="nutrionnaSwitch" value="1" @if(old('show_nutrionnal_values', $productModel->show_nutrionnal_values ?? null)) checked @endif> + <label class="form-check-label" for="nutrionnaSwitch"><span class="fw-bold fst-italic">{{ __('Afficher ? ') }}</span></label> + </div> + @php + $incoNut = (isset($productModel) and $productModel->xmlInco) ? json_decode($productModel->xmlInco->nutritional_values) : null; + @endphp + <div class="table-responsive"> + <table class="table table-light text-center table-sm table-bordered table-striped"> + <thead class="table-group-divider"> + <tr> + <th scope="col">Nutriment</th> + <th scope="col">Valeur</th> + @if(isset($incoNut)) + <th scope="col">Val. Source Inco</th> + @endif + </tr> + </thead> + <tbody class="table-group-divider"> + @php $incoValues = [ + 'Poids de référence (en g)' => ['product' => 'weight', 'inco' => ''], + 'Énergie (en kCal)' => ['product' => 'energy', 'inco' => 'val_energ_kcal_r'], + 'Énergie (en kJ)' => ['product' => 'energy_kj', 'inco' => 'val_energ_kj_r'], + 'Protéines (en g)' => ['product' => 'protein', 'inco' => 'proteine_r'], + 'Glucides (en g)' => ['product' => 'carbohydrates', 'inco' => 'glucides_r'], + 'Sucres (en g)' => ['product' => 'sugar', 'inco' => 'sucre_r'], + 'Matière grasse (en g)' => ['product' => 'fat', 'inco' => 'mat_grass_r'], + 'Acides Gras Saturés (en g)' => ['product' => 'saturated_fatty_acids', 'inco' => 'ags_r'], + 'Fibres alimentaires (en g)' => ['product' => 'dietary_fiber', 'inco' => 'fib_alim_r'], + 'Sel (en g)' => ['product' => 'salt', 'inco' => 'sel_r'] + ]; @endphp + @foreach($incoValues as $title => $incoValue) + <tr> + <td class="w-50">{{ $title }}</td> + <td class="w-25"><input class="form-control form-control-sm w-100 h-100" type="number" step="1" name="{{ $incoValue['product'] }}" value="{{ old($incoValue['product'], isset($productModel->incoNutritionalValues->{$incoValue['product']}) ? str_replace(',', '.', (string)$productModel->incoNutritionalValues->{$incoValue['product']}) : 0) }}"></td> + @if(isset($incoNut)) + <td class="w-25"><span class="text-danger">{{ isset($incoNut->{$incoValue['inco']}) ? str_replace(',', '.', $incoNut->{$incoValue['inco']}) : 0 }}</span></td> + @endif + </tr> + @endforeach + </tbody> + </table> + </div> + </div> + @if(isset($productModel) and isset($productModel->xmlInco)) + <div class="row justify-content-center"> + <div class="col-12 col-md-5 text-center"> + <a href="#" class="btn btn-danger confirmJS">{{ __('Copier les Valeurs nutritionelles') }}</a> + </div> + </div> + @endif + </div> + </fieldset> + </div> +</div> + +<div class="row mb-3"> + <div class="col-12 col-md-6"> + <div class="form-check"> + <input name="status" class="form-check-input mt-2" type="checkbox" id="productStatus" aria-describedby="productStatusHelp" value="1" @if(old('status', $productModel->status ?? ''))checked @endif> + <label class="form-check-label user-select-none pt-1" for="productStatus"><b>{{ __('Publié') }}</b></label><br> + @include('back.modules.input-error', [ + 'inputName' => 'status', 'helperId' => 'productStatusHelp' , 'helper' => __('Le produit est visible ou non') + ]) + </div> + </div> +</div> + + +@push('scripts') +<script nonce="{{ $nonce }}"> +document.addEventListener("DOMContentLoaded", () => { + + // Publish times + let publishTimes = document.getElementsByClassName('publishTime'); + for (let input of publishTimes) { + let parent = input.parentNode, + dates = { + start: 0, + end: 0 + }; + input.originalValue = (new Date(input.value)).valueOf(); + if(input.originalValue === NaN) { + input.originalValue = 0 + } + if(input.id === 'productPublishedAt') { + dates.start = input.originalValue; + } else { + dates.end = input.originalValue; + } + let getEuropeParisTime = () => { + return new Date((new Date()).getTime() + (60000*((new Date()).getTimezoneOffset()+60))); + }; + let setDateHelpers = (input, parent) => { + let small = parent.children.productPublishAtHelp ? parent.children.productPublishAtHelp : parent.children.productUnPublishAtHelp; + let isPlanned = false; + if(input.id === 'productPublishedAt') { + isPlanned = dates.start > dates.end && dates.end != 0; + } else { + isPlanned = dates.start < dates.end && dates.start != 0; + } + if (isPlanned || getEuropeParisTime().valueOf() < (new Date(input.value)).valueOf()) { + let date = new Date(input.value); + // small.textContent = "{{ __('Planifié pour le ') }}" + date.toLocaleString(); + small.textContent = input.id === 'productPublishedAt' ? + "{{ __('Vider pour un affichage immédiat du produit.') }}" : + "{{ __('Vider pour un affichage permanent du produit.') }}"; + } else { + // small.textContent = input.id === 'productPublishedAt' ? + // "{{ __('Uniquement pour planifier la publication') }}" : + // "{{ __('Uniquement pour planifier la fin de la publication') }}"; + small.textContent = input.id === 'productPublishedAt' ? + "{{ __('Laisser vide pour un affichage immédiat du produit.') }}" : + "{{ __('Laisser vide pour un affichage permanent du produit.') }}"; + } + }; + setDateHelpers(input, parent); + input.addEventListener('change', (event) => { + let parent = event.target.parentNode, + input = event.target, value; + value = (new Date(input.value)).valueOf(); + if(input.originalValue === NaN) { + value = 0 + } + if(input.id === 'productPublishedAt') { + dates.start = value; + } else { + dates.end = value; + } + setDateHelpers(input, parent); + }); + } +}); +</script> +@endpush diff --git a/resources/views/back/products/index.blade.php b/resources/views/back/products/index.blade.php new file mode 100644 index 0000000..9ae214b --- /dev/null +++ b/resources/views/back/products/index.blade.php @@ -0,0 +1,103 @@ +@extends('layouts.back') + +@section('title', sprintf('%s - %s', __('models.classes.products'), Str::ucfirst(__('liste')))) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') + <div class="card"> + <div class="card-header"> + <div class="row"> + <div class="col-12"> + @include('back.breadcrumb.breadcrumb-body') + </div> + </div> + <div class="row"> + <div class="col"> + <h1 class="h2">{{ __('models.classes.products') }} {{ Str::ucfirst(__('liste')) }}</h1> + </div> + <div class="col-md-3"> + <div class="input-group justify-content-end"> + <a href="{{ route('bo.products.create') }}" class="btn btn-primary" title="{{ __('Ajouter un :model', [ + 'model' => Str::singular(__('models.classes.products')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-plus"></i></a> + </div> + </div> + </div> + </div> + <div class="card-body"> + @include('back.modules.searchBar') + <div class="row justify-content-center"> + <div class="col-12 col-md-6 p-0 p-md-3"> + {{ $products->withQueryString()->onEachSide(1)->links() }} + </div> + </div> + <div class="row"> + <div class="col"> + <div class="table-responsive"> + <table class="table fixAction"> + <thead> + @php + $cols = ['title' => __('Titre'), 'description' => __('Description'), 'status' => __('Publication'), 'updated_at' => __('Mis à jour le')]; + @endphp + @include('back.modules.tableColSorter', [ 'cols' => $cols, 'mobileHide' => ['status']]) + </thead> + <tbody> + @if($products->count()) + @foreach ($products as $productModel) + <tr> + <td> + <span>{{ $productModel->title }}</span> + </td> + <td> + <span>{{ Str::limit(strip_tags($productModel->description)) }}</span> + </td> + <td class="d-none d-md-table-cell"> + <form action="{{ route('bo.products.change-published', $productModel->id) }}" method="POST"> + @csrf + <button type="submit" class="btn btn-sm" title="{{ __(':action :model', [ + 'action' => $productModel->status ? __('Dépublier') : __('Publier'), + 'model' => Str::singular(__('models.classes.products')) + ]) }}" data-bs-toggle="tooltip"> + <i class="fas @if($productModel->status)fa-check check-green @else fa-times cross-red @endif"></i> + </button> + </form> + </td> + <td> + <span>{{ $productModel->updated_at->formatLocalized('%d/%m/%Y à %I:%M') }}</span> + </td> + <td> + <div class="btn-group"> + {{-- Public View Page --}} + @if($productModel->status) + <a class="btn btn-sm btn-warning" href="" target="_blank" title="{{ __('Visualiser :model', [ + 'model' => Str::singular(__('models.classes.products')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-eye"></i></a> + @endif + <a class="btn btn-sm btn-primary" href="{{ route('bo.products.edit', $productModel->id) }}" title="{{ __('Modifier :model', [ + 'model' => Str::singular(__('models.classes.products')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-pencil"></i></a> + </div> + </td> + </tr> + @endforeach + @else + <tr> + <td colspan="5" class="text-center"><span class="h3">{{ + __('Aucun résultat pour les :models', ['models' => __('models.classes.products')]) + }}</span></td> + </tr> + @endif + </tbody> + </table> + </div> + </div> + </div> + <div class="row justify-content-center"> + <div class="col-12 col-md-6 p-0 p-md-3"> + {{ $products->withQueryString()->onEachSide(1)->links() }} + </div> + </div> + </div> + </div> +@endsection diff --git a/resources/views/back/ranges/create.blade.php b/resources/views/back/ranges/create.blade.php new file mode 100644 index 0000000..8fe20a8 --- /dev/null +++ b/resources/views/back/ranges/create.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.back') + +@section('title', sprintf('%s - %s', __('models.classes.ranges'), Str::ucfirst(__('création')))) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') + <div class="card"> + <div class="card-header"> + <div class="row"> + <div class="col"> + @include('back.breadcrumb.breadcrumb-body') + </div> + </div> + <div class="row"> + <h1 class="col h4"> + <a href="{{ route('bo.ranges.index') }}" class="text-decoration-none btn btn-sm btn-primary" role="button" aria-roledescription="{{ _('Revenir en arrière') }}"><i class="fa-solid fa-arrow-left-long"></i></a> + <span> {{ __('models.classes.ranges') }} {{ __('création') }}</span> + </h1> + </div> + </div> + <div class="card-body"> + <form action="{{ route('bo.ranges.store') }}" method="POST" enctype="multipart/form-data"> + @csrf + @include('back.ranges.form') + <button type="submit" class="btn btn-primary">{{ __('Enregister') }}</button> + </form> + </div> + </div> +@endsection diff --git a/resources/views/back/ranges/edit.blade.php b/resources/views/back/ranges/edit.blade.php new file mode 100644 index 0000000..a9935ad --- /dev/null +++ b/resources/views/back/ranges/edit.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.back') + +@section('title', sprintf('%s - %s %s', __('models.classes.ranges'), Str::ucfirst(__('édition')), $rangeModel->title)) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') + <div class="card"> + <div class="card-header"> + <div class="row"> + <div class="col-12"> + @include('back.breadcrumb.breadcrumb-body', [ + 'brParam' => $rangeModel + ]) + </div> + </div> + <div class="row"> + <div class="col"> + <h1 class="col h4"> + <a href="{{ route('bo.ranges.index') }}" class="text-decoration-none btn btn-sm btn-primary" role="button" aria-roledescription="{{ _('Revenir en arrière') }}"><i class="fa-solid fa-arrow-left-long"></i></a> + <span> {{ __('models.classes.ranges') }} {{ __('édition') }}</span> + </h1> + </div> + <div class="col text-end"> + <form action="{{ route('bo.ranges.destroy', $rangeModel->id) }}" method="POST" class="d-inline confirmDeleteJS"> + @method('DELETE') + @csrf + <div class="btn-group" role="group"> + {{-- Public View Page --}} + @if($rangeModel->status) + <a class="btn btn-warning" href="" target="_blank" title="{{ __('Visualiser :model', [ + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-eye"></i></a> + @endif + <button class="btn btn-danger" title="{{ __('Supprimer :model', [ + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-trash"></i></button> + </div> + </form> + </div> + </div> + </div> + <div class="card-body"> + <form action="{{ route('bo.ranges.update', $rangeModel->id) }}" method="POST" enctype="multipart/form-data"> + @csrf + @method('PUT') + @include('back.ranges.form', compact('rangeModel')) + <button type="submit" class="btn btn-primary" title="{{ __('Enregister :model en base', [ + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip">{{ __('Enregister') }}</button> + </form> + </div> + </div> +@endsection diff --git a/resources/views/back/ranges/form.blade.php b/resources/views/back/ranges/form.blade.php new file mode 100644 index 0000000..dd9d1d6 --- /dev/null +++ b/resources/views/back/ranges/form.blade.php @@ -0,0 +1,327 @@ +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Informations générales') }}</legend> + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="rangeModelTitle" class="col-form-label"><b>{{ __('Titre') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'rangeModelTitle'])'></div> + <input name="title" type="text" value="{{ old('title', $rangeModel->title ?? '') }}" class="form-control" + id="rangeModelTitle" aria-describedby="rangeModelTitleHelp" placeholder="{{ __('Un titre beau et explicite') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'title', 'helperId' => 'rangeModelTitleHelp' , 'helper' => __('Doit décrire précisément la gamme') + ]) + @include('back.modules.input-error', [ + 'inputName' => 'slug' + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="rangeCategory" class="col-form-label"><b>{{ __('Catégorie de la gamme') }}</b></label> + <select id="rangeCategory" class="form-select" name="category" aria-describedby="rangeCategoryHelp" required> + <option value="" @if(is_null(old('category', $rangeModel->category ?? null))) selected @endif disabled>{{ __('Séléctionnez une catégorie') }}</option> + @foreach(App\Enums\Ranges\RangeCategoryEnum::toArray() as $category) + <option value="{{ $category->value }}" @if(old('type', optional($rangeModel->category ?? null)->value) == $category->value) selected @endif>{{ $category->label }}</option> + @endforeach + </select> + @include('back.modules.input-error', [ + 'inputName' => 'category', 'helperId' => 'rangeCategoryHelp' , 'helper' => __('Le type de gamme') + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Seo') }}</legend> + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="rangeModelSeoTitle" class="col-form-label"><b>{{ __('Titre seo') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'rangeModelSeoTitle'])'></div> + <input name="seo_title" type="text" value="{{ old('seo_title', $rangeModel->seo_title ?? '') }}" class="form-control" + id="rangeModelSeoTitle" aria-describedby="rangeModelSeoTitleHelp" placeholder="{{ __('Un titre en 70 caractères maximum') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'seo_title', 'helperId' => 'rangeModelSeoTitleHelp' , 'helper' => __('Doit décrire précisément la gamme, recommandation pour un positionnement optimal dans les moteurs de recherche : entre 53 et 60 caractères, balise <title> ') + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="rangeModelSeoDescription" class="col-form-label"><b>{{ __('Description seo') }}</b></label> + @php + $data = [ + 'id' => 'rangeModelSeoDescription', + 'class' => 'form-control', + 'name' => 'seo_description', + 'placeholder' => __('Une description de la gamme pour les moteurs de recherche'), + 'ariaDescribedby' => 'rangeModelSeoDescriptionHelp', + 'required' => true, + 'value' => old('seo_description', $rangeModel->seo_description ?? '') + ]; + @endphp + <div id="input-text-auto" data-json='@json($data)'></div> + @include('back.modules.input-error', [ + 'inputName' => 'seo_description', 'helperId' => 'rangeModelSeoDescriptionHelp' , 'helper' => __(' Doit décrire précisément la gamme, requiert entre 50 et 160 caractères, balise <meta> description') + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Publication') }}</legend> + <div class="row mb-3"> + <div class="col"> + <div class="form-group"> + <label for="rangePublishedAt"><b>{{ __('Date de publication (Europe/Paris)') }}</b></label> + <input id="rangePublishedAt" name="publish_at" class="form-control publishTime" type="datetime-local" data-form-type="date" aria-describedby="rangePublishAtHelp" value="{{ old('publish_at', ((isset($rangeModel) and $rangeModel->publish_at) ? $rangeModel->publish_at->format('Y-m-d\TH:i') : '')) }}"> + @include('back.modules.input-error', [ + 'inputName' => 'publish_at', 'helperId' => 'rangePublishAtHelp' , 'helper' => (isset($rangeModel) and $rangeModel->publish_at) ? __('Laisser vide pour un affichage immédiat de la gamme.') : __('Vider pour un affichage immédiat de la gamme') + ]) + </div> + </div> + <div class="col"> + <div class="form-group"> + <label for="rangeUnPublishedAt"><b>{{ __('Date de fin de publication (Europe/Paris)') }}</b></label> + <input id="rangeUnPublishedAt" name="unpublish_at" class="form-control publishTime" type="datetime-local" data-form-type="date" aria-describedby="rangeUnPublishAtHelp" value="{{ old('unpublish_at', ((isset($rangeModel) and $rangeModel->unpublish_at) ? $rangeModel->unpublish_at->format('Y-m-d\TH:i') : '')) }}"> + @include('back.modules.input-error', [ + 'inputName' => 'unpublish_at', 'helperId' => 'rangeUnPublishAtHelp' , 'helper' => (isset($rangeModel) and $rangeModel->unpublish_at) ? __('Laisser vide pour un affichage permanent de la gamme.') : __('Vider pour un affichage permanent de la gamme') + ]) + </div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Illustration') }}</legend> + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="rangePictureAlt" class="col-form-label"><b>{{ __('Texte alternatif de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'rangePictureAlt'])'></div> + <input name="picture_alt" type="text" value="{{ old('picture_alt', $rangeModel->picture_alt ?? '') }}" class="form-control" + id="rangePictureAlt" aria-describedby="rangePictureAltHelp" placeholder="{{ __('Une image de petits chatons') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_alt', 'helperId' => 'rangePictureAltHelp' , 'helper' => __('Doit décrire votre image pour les moteurs de recherches et les non voyants (5 à 6 mots)') + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="rangePictureTitle" class="col-form-label"><b>{{ __('Titre de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'rangePictureTitle'])'></div> + <input name="picture_title" type="text" value="{{ old('picture_title', $rangeModel->picture_title ?? '') }}" class="form-control" + id="rangePictureTitle" aria-describedby="rangePictureTitleHelp" placeholder="{{ __('Une description de la gamme pour les moteurs de recherche') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_title', 'helperId' => 'rangePictureTitleHelp' , 'helper' => __('Utile pour les utilisateurs, s\'affiche en passant la souris sur l\'image.') + ]) + </div> + </div> + <div class="row"> + <div class="col-12"> + @php + $data = [ + 'id' => 'rangeModelPicture', + 'name' => 'picture', + 'helper' => __('L\'image qui va servir de vignette à la gamme, doit être de 700px (hauteur) par 700px (largeur)'), + 'width' => 700, + 'height' => 700, + 'value' => $rangeModel->picture ?? '', + ]; + @endphp + @include('back.modules.input-error', [ 'inputName' => 'picture']) + <div class="image-input" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Vignette') }}</legend> + <div class="row mb-3"> + <div class="col-12 col-md-6 form-group"> + <label for="rangePictureThumbAlt" class="col-form-label"><b>{{ __('Texte alternatif de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'rangePictureThumbAlt'])'></div> + <input name="picture_thumb_alt" type="text" value="{{ old('picture_thumb_alt', $rangeModel->picture_thumb_alt ?? '') }}" class="form-control" + id="rangePictureThumbAlt" aria-describedby="rangePictureThumbAltHelp" placeholder="{{ __('Une image de petits chatons') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_thumb_alt', 'helperId' => 'rangePictureThumbAltHelp' , 'helper' => __('Doit décrire votre image pour les moteurs de recherches et les non voyants (5 à 6 mots)') + ]) + </div> + <div class="col-12 col-md-6 form-group"> + <label for="rangePictureThumbTitle" class="col-form-label"><b>{{ __('Titre de l\'image') }}</b></label> + <div class="word-counter" data-json='@json(['id' => 'rangePictureThumbTitle'])'></div> + <input name="picture_thumb_title" type="text" value="{{ old('picture_thumb_title', $rangeModel->picture_thumb_title ?? '') }}" class="form-control" + id="rangePictureThumbTitle" aria-describedby="rangePictureThumbTitleHelp" placeholder="{{ __('Une description de la gamme pour les moteurs de recherche') }}" required> + @include('back.modules.input-error', [ + 'inputName' => 'picture_thumb_title', 'helperId' => 'rangePictureThumbTitleHelp' , 'helper' => __('Utile pour les utilisateurs, s\'affiche en passant la souris sur l\'image.') + ]) + </div> + </div> + <div class="row"> + <div class="col-12"> + @php + $data = [ + 'id' => 'rangeModelThumbPicture', + 'name' => 'picture_thumb', + 'helper' => __('L\'image qui va servir de vignette à la gamme, doit être de 300px (hauteur) par 300px (largeur)'), + 'width' => 300, + 'height' => 300, + 'value' => $rangeModel->picture_thumb ?? '', + ]; + @endphp + @include('back.modules.input-error', [ 'inputName' => 'picture_thumb']) + <div class="image-input" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Description de la gamme') }}</legend> + <div class="row mb-3"> + <div class="col-12 form-group"> + @include('back.modules.input-error', [ + 'inputName' => 'description', 'helperId' => 'rangeModelDescriptionHelp' , 'helper' => __('Relisez bien votre description avant de la publier.') + ]) + @php + $data = [ + 'name' => 'description', + 'csrf' => csrf_token(), + 'text' => old('description', $rangeModel->description ?? ''), + ]; + @endphp + <div id="ck-editor-bo" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col"> + <fieldset class="border p-3 mb-3"> + <legend>{{ __('Liens') }}</legend> + <div class="row mb-3"> + <div class="col-12 form-group"> + @include('back.modules.input-error', [ + 'inputName' => 'link1', 'helperId' => 'rangeModelLink1Help' , 'helper' => __('Lien à afficher sur la gamme') + ]) + @php + $data = [ + 'name' => 'link1', + 'placeholder' => __('lien numéro 1'), + 'value' => old('link1', $rangeModel->link1 ?? null), + ]; + @endphp + <div class="model-link" data-json='@json($data)'></div> + </div> + </div> + <div class="row mb-3"> + <div class="col-12 form-group"> + @include('back.modules.input-error', [ + 'inputName' => 'link2', 'helperId' => 'rangeModelLink1Help' , 'helper' => __('Lien à afficher sur la gamme') + ]) + @php + $data = [ + 'name' => 'link2', + 'placeholder' => __('lien numéro 2'), + 'value' => old('link2', $rangeModel->link2 ?? null), + ]; + @endphp + <div class="model-link" data-json='@json($data)'></div> + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row mb-3"> + <div class="col-12 col-md-6"> + <div class="form-check"> + <input name="status" class="form-check-input mt-2" type="checkbox" id="rangeStatus" aria-describedby="rangeStatusHelp" value="1" @if(old('status', $rangeModel->status ?? ''))checked @endif> + <label class="form-check-label user-select-none pt-1" for="rangeStatus"><b>{{ __('Publié') }}</b></label><br> + @include('back.modules.input-error', [ + 'inputName' => 'status', 'helperId' => 'rangeStatusHelp' , 'helper' => __('La gamme est visible ou non') + ]) + </div> + </div> +</div> + + +@push('scripts') +<script nonce="{{ $nonce }}"> +document.addEventListener("DOMContentLoaded", () => { + + // Publish times + let publishTimes = document.getElementsByClassName('publishTime'); + for (let input of publishTimes) { + let parent = input.parentNode, + dates = { + start: 0, + end: 0 + }; + input.originalValue = (new Date(input.value)).valueOf(); + if(input.originalValue === NaN) { + input.originalValue = 0 + } + if(input.id === 'rangePublishedAt') { + dates.start = input.originalValue; + } else { + dates.end = input.originalValue; + } + let getEuropeParisTime = () => { + return new Date((new Date()).getTime() + (60000*((new Date()).getTimezoneOffset()+60))); + }; + let setDateHelpers = (input, parent) => { + let small = parent.children.rangePublishAtHelp ? parent.children.rangePublishAtHelp : parent.children.rangeUnPublishAtHelp; + let isPlanned = false; + if(input.id === 'rangePublishedAt') { + isPlanned = dates.start > dates.end && dates.end != 0; + } else { + isPlanned = dates.start < dates.end && dates.start != 0; + } + if (isPlanned || getEuropeParisTime().valueOf() < (new Date(input.value)).valueOf()) { + let date = new Date(input.value); + // small.textContent = "{{ __('Planifié pour le ') }}" + date.toLocaleString(); + small.textContent = input.id === 'rangePublishedAt' ? + "{{ __('Vider pour un affichage immédiat de la gamme.') }}" : + "{{ __('Vider pour un affichage permanent de la gamme.') }}"; + } else { + // small.textContent = input.id === 'rangePublishedAt' ? + // "{{ __('Uniquement pour planifier la publication') }}" : + // "{{ __('Uniquement pour planifier la fin de la publication') }}"; + small.textContent = input.id === 'rangePublishedAt' ? + "{{ __('Laisser vide pour un affichage immédiat de la gamme.') }}" : + "{{ __('Laisser vide pour un affichage permanent de la gamme.') }}"; + } + }; + setDateHelpers(input, parent); + input.addEventListener('change', (event) => { + let parent = event.target.parentNode, + input = event.target, value; + value = (new Date(input.value)).valueOf(); + if(input.originalValue === NaN) { + value = 0 + } + if(input.id === 'rangePublishedAt') { + dates.start = value; + } else { + dates.end = value; + } + setDateHelpers(input, parent); + }); + } +}); +</script> +@endpush diff --git a/resources/views/back/ranges/index.blade.php b/resources/views/back/ranges/index.blade.php new file mode 100644 index 0000000..fcbc37b --- /dev/null +++ b/resources/views/back/ranges/index.blade.php @@ -0,0 +1,106 @@ +@extends('layouts.back') + +@section('title', sprintf('%s - %s', __('models.classes.ranges'), Str::ucfirst(__('liste')))) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') + <div class="card"> + <div class="card-header"> + <div class="row"> + <div class="col-12"> + @include('back.breadcrumb.breadcrumb-body') + </div> + </div> + <div class="row"> + <div class="col"> + <h1 class="h2">{{ __('models.classes.ranges') }} {{ Str::ucfirst(__('liste')) }}</h1> + </div> + <div class="col-md-3"> + <div class="input-group justify-content-end"> + <a href="{{ route('bo.ranges.create') }}" class="btn btn-primary" title="{{ __('Ajouter une :model', [ + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-plus"></i></a> + </div> + </div> + </div> + </div> + <div class="card-body"> + @include('back.modules.searchBar') + <div class="row justify-content-center"> + <div class="col-12 col-md-6 p-0 p-md-3"> + {{ $ranges->withQueryString()->onEachSide(1)->links() }} + </div> + </div> + <div class="row"> + <div class="col"> + <div class="table-responsive"> + <table class="table fixAction"> + <thead> + @php + $cols = ['title' => __('Titre'), 'category' => __('Categorie'), 'description' => __('Description'), 'status' => __('Publication'), 'updated_at' => __('Mis à jour le')]; + @endphp + @include('back.modules.tableColSorter', [ 'cols' => $cols, 'mobileHide' => ['status']]) + </thead> + <tbody> + @if($ranges->count()) + @foreach ($ranges as $rangeModel) + <tr> + <td> + <span>{{ $rangeModel->title }}</span> + </td> + <td> + <span>{{ $rangeModel->category->label }}</span> + </td> + <td> + <span>{{ Str::limit(strip_tags($rangeModel->description)) }}</span> + </td> + <td class="d-none d-md-table-cell"> + <form action="{{ route('bo.ranges.change-published', $rangeModel->id) }}" method="POST"> + @csrf + <button type="submit" class="btn btn-sm" title="{{ __(':action :model', [ + 'action' => $rangeModel->status ? __('Dépublier') : __('Publier'), + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip"> + <i class="fas @if($rangeModel->status)fa-check check-green @else fa-times cross-red @endif"></i> + </button> + </form> + </td> + <td> + <span>{{ $rangeModel->updated_at->formatLocalized('%d/%m/%Y à %I:%M') }}</span> + </td> + <td> + <div class="btn-group"> + {{-- Public View Page --}} + @if($rangeModel->status) + <a class="btn btn-sm btn-warning" href="" target="_blank" title="{{ __('Visualiser :model', [ + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-eye"></i></a> + @endif + <a class="btn btn-sm btn-primary" href="{{ route('bo.ranges.edit', $rangeModel->id) }}" title="{{ __('Modifier :model', [ + 'model' => Str::singular(__('models.classes.ranges')) + ]) }}" data-bs-toggle="tooltip"><i class="fa-solid fa-pencil"></i></a> + </div> + </td> + </tr> + @endforeach + @else + <tr> + <td colspan="5" class="text-center"><span class="h3">{{ + __('Aucun résultat pour les :models', ['models' => __('models.classes.ranges')]) + }}</span></td> + </tr> + @endif + </tbody> + </table> + </div> + </div> + </div> + <div class="row justify-content-center"> + <div class="col-12 col-md-6 p-0 p-md-3"> + {{ $ranges->withQueryString()->onEachSide(1)->links() }} + </div> + </div> + </div> + </div> +@endsection diff --git a/resources/views/back/sliders/index.blade.php b/resources/views/back/sliders/index.blade.php index f0bbbf5..81101de 100644 --- a/resources/views/back/sliders/index.blade.php +++ b/resources/views/back/sliders/index.blade.php @@ -90,7 +90,7 @@ <form action="{{ route('bo.sliders.change-published', $slider->id) }}" method="POST"> @csrf <button type="submit" class="btn btn-sm" title="{{ __(':action :model', [ - 'action' => $slider->status ? __('Déplublier') : __('Publier'), + 'action' => $slider->status ? __('Dépublier') : __('Publier'), 'model' => Str::singular(__('models.classes.sliders')) ]) }}" data-bs-toggle="tooltip"> <i class="fas @if($slider->status)fa-check check-green @else fa-times cross-red @endif"></i> diff --git a/routes/web-bo.php b/routes/web-bo.php index 20210b2..d83dd0c 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -2,6 +2,8 @@ use App\Http\Controllers\Bo\HomeController; use App\Http\Controllers\Bo\NewsController; +use App\Http\Controllers\Bo\ProductController; +use App\Http\Controllers\Bo\RangeController; use App\Http\Controllers\Bo\SliderController; use App\Http\Controllers\Bo\TagController; use Illuminate\Support\Facades\Auth; @@ -19,14 +21,37 @@ Route::prefix('bo')->name('bo.')->group(function () { Route::middleware('auth:backend')->group(function () { Route::get('/', [HomeController::class, 'dashboard'])->name('dashboard'); + // * SLIDERS + Route::resource('sliders', SliderController::class)->except(['show']); Route::post('/sliders/{slider}/change-order', [SliderController::class, 'changeOrder']) ->name('sliders.change-order'); Route::post('/sliders/{slider}/change-published', [SliderController::class, 'changePublished']) ->name('sliders.change-published'); - Route::resource('sliders', SliderController::class)->except(['show']); + // * RANGES + Route::resource('ranges', RangeController::class)->except(['show']) + ->withoutMiddleware('htmlsanitize') + ->middleware('htmlsanitize:description'); + Route::post('/ranges/{range}/change-published', [RangeController::class, 'changePublished']) + ->name('ranges.change-published'); + // * Ranges PAGE SEARCH + Route::get('/ranges/search-uri', [RangeController::class, 'searchUri']) + ->name('ranges.search-uri'); + Route::get('/ranges/model-title', [RangeController::class, 'modelTitle']) + ->name('ranges.model-title'); + + // * PRODUCTS + Route::resource('products', ProductController::class)->except(['show']) + ->withoutMiddleware('htmlsanitize') + ->middleware('htmlsanitize:description,ingredients,preparation_advices,sales_pitch,allergen_list'); + Route::post('/products/{product}/change-published', [ProductController::class, 'changePublished']) + ->name('products.change-published'); + + // * TAGS Route::resource('tags', TagController::class)->except(['show']); Route::post('/tags/store', [TagController::class, 'jsonStore'])->name('tags.jsonStore'); + + // * NEWS Route::resource('news', NewsController::class) ->except(['show']) ->withoutMiddleware('htmlsanitize') diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php index 0894c60..6ab614c 100644 --- a/tests/Feature/ExampleTest.php +++ b/tests/Feature/ExampleTest.php @@ -6,15 +6,4 @@ use Tests\TestCase; class ExampleTest extends TestCase { - /** - * A basic test example. - * - * @return void - */ - public function test_example() - { - $response = $this->get('/'); - - $response->assertStatus(200); - } } diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php index 62e8c3c..46cdcaa 100644 --- a/tests/Unit/ExampleTest.php +++ b/tests/Unit/ExampleTest.php @@ -6,13 +6,4 @@ use PHPUnit\Framework\TestCase; class ExampleTest extends TestCase { - /** - * A basic test example. - * - * @return void - */ - public function test_example() - { - $this->assertTrue(true); - } }