From afa735f0b85365f100f5596a17253ee0481af3c6 Mon Sep 17 00:00:00 2001 From: Alexis Gousseau Date: Wed, 16 Aug 2023 10:36:05 +0200 Subject: [PATCH 001/145] split admin users and random users to customers - issue #10 --- README.md | 3 + app/Console/Commands/CreateAdmin.php | 57 - .../Commands/DeleteNotConfirmedUser.php | 10 +- app/Console/Commands/UserCreate.php | 228 +++ app/Enums/Users/RoleEnum.php | 34 + .../Controllers/Bo/Auth/LoginController.php | 54 + app/Http/Controllers/LoginController.php | 134 +- app/Http/Controllers/RegisterController.php | 6 +- .../Controllers/WinningProofController.php | 4 +- app/Http/Middleware/Authenticate.php | 22 +- app/Mail/VerifyEmail.php | 5 +- app/Models/Customer.php | 91 ++ app/Models/Participation.php | 2 +- app/Models/User.php | 69 +- app/Providers/RouteServiceProvider.php | 13 +- composer.json | 1 + composer.lock | 1314 ++++++++--------- config/auth.php | 23 +- .../2014_10_12_000000_create_users_table.php | 29 +- ...23_08_16_092101_create_customers_table.php | 46 + resources/views/bo/auth/login.blade.php | 67 + resources/views/bo/banned-ip/index.blade.php | 2 +- resources/views/bo/codes-ean/index.blade.php | 2 +- resources/views/bo/codes/index.blade.php | 2 +- resources/views/bo/codes/search.blade.php | 2 +- resources/views/bo/content/manage.blade.php | 2 +- resources/views/bo/dashboard/index.blade.php | 2 +- .../views/bo/faq-questions/index.blade.php | 2 +- resources/views/bo/faq-themes/index.blade.php | 2 +- resources/views/bo/gain-views/index.blade.php | 2 +- .../views/bo/instant-win/index.blade.php | 2 +- resources/views/bo/layout.blade.php | 59 + resources/views/bo/layouts/head.blade.php | 21 + resources/views/bo/layouts/nav-menu.blade.php | 39 + resources/views/bo/mails/job-failed.blade.php | 6 +- resources/views/bo/prizes/index.blade.php | 2 +- resources/views/bo/products/create.blade.php | 2 +- resources/views/bo/products/edit.blade.php | 2 +- resources/views/bo/products/index.blade.php | 2 +- resources/views/bo/ranges/create.blade.php | 2 +- resources/views/bo/ranges/edit.blade.php | 2 +- resources/views/bo/ranges/index.blade.php | 2 +- resources/views/bo/settings/manage.blade.php | 2 +- .../views/bo/winners-list/arcadia.blade.php | 2 +- .../views/bo/winners-list/index.blade.php | 2 +- resources/views/layouts/app.blade.php | 80 - resources/views/layouts/bo.blade.php | 125 -- ...age.blade.php => flash-messages.blade.php} | 0 routes/web-bo.php | 134 +- routes/web.php | 33 +- 50 files changed, 1566 insertions(+), 1183 deletions(-) delete mode 100644 app/Console/Commands/CreateAdmin.php create mode 100644 app/Console/Commands/UserCreate.php create mode 100644 app/Enums/Users/RoleEnum.php create mode 100644 app/Http/Controllers/Bo/Auth/LoginController.php create mode 100644 app/Models/Customer.php create mode 100644 database/migrations/2023_08_16_092101_create_customers_table.php create mode 100644 resources/views/bo/auth/login.blade.php create mode 100644 resources/views/bo/layout.blade.php create mode 100644 resources/views/bo/layouts/head.blade.php create mode 100644 resources/views/bo/layouts/nav-menu.blade.php delete mode 100644 resources/views/layouts/app.blade.php delete mode 100644 resources/views/layouts/bo.blade.php rename resources/views/modules/{flashMessage.blade.php => flash-messages.blade.php} (100%) diff --git a/README.md b/README.md index 68d37bd..569171c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ php artisan create:admin php artisan users:deletenc à mettre 1 fois par jour ``` +## THEME +Choisir un thème dans le dépôt des thèmes `gen-game-web`, puis copier les fichiers et les coller/remplacer directement dans le projet. + ## TODO ``` - SH - Soucis de connexion / déconnexion quand le jeu est terminé et que l'adresse du jeu redirige vers une autre adresse : si on se déconnecte et qu'on revient sur le bo, on est toujours connecté diff --git a/app/Console/Commands/CreateAdmin.php b/app/Console/Commands/CreateAdmin.php deleted file mode 100644 index 89584dc..0000000 --- a/app/Console/Commands/CreateAdmin.php +++ /dev/null @@ -1,57 +0,0 @@ -ask('What is the firstname?', 'Equipe'); - $lastname = $this->ask('What is the lastname?', 'Web'); - $email = $this->ask('What is the email?', 'equipe.web@ldc.fr'); - $pwd = $this->secret('What is the password?'); - $role = $this->ask('Role ?', '1'); - - $user = new User(); - $user->firstname = $firstname; - $user->lastname = $lastname; - $user->birth_date = now(); - $user->email = $email; - $user->password = Hash::make($pwd); - $user->address = "-"; - $user->town = "Le Mans"; - $user->postal_code = "72000"; - $user->country = "France"; - $user->email_verify_token = "-"; - $user->email_verified = 1; - $user->role = $role; - $user->save(); - - $this->info('User created.'); - - return 0; - } -} diff --git a/app/Console/Commands/DeleteNotConfirmedUser.php b/app/Console/Commands/DeleteNotConfirmedUser.php index b009a3a..3d98790 100644 --- a/app/Console/Commands/DeleteNotConfirmedUser.php +++ b/app/Console/Commands/DeleteNotConfirmedUser.php @@ -2,7 +2,7 @@ namespace App\Console\Commands; -use App\Models\User; +use App\Models\Customer; use Carbon\Carbon; use Illuminate\Console\Command; @@ -25,15 +25,13 @@ class DeleteNotConfirmedUser extends Command /** * Execute the console command. * - * @return integer + * @return void */ - public function handle() + public function handle(): void { - $users = User::where([['email_verified', 0], ['created_at', '<', Carbon::now()->subDay()]])->get(); + $users = Customer::where([['email_verified', 0], ['created_at', '<', Carbon::now()->subDay()]])->get(); foreach ($users as $user) { $user->delete(); } - - return 0; } } diff --git a/app/Console/Commands/UserCreate.php b/app/Console/Commands/UserCreate.php new file mode 100644 index 0000000..ce74442 --- /dev/null +++ b/app/Console/Commands/UserCreate.php @@ -0,0 +1,228 @@ +firstname = null; + $this->addFirstname(); + + $this->lastname = null; + $this->addLastname(); + + $this->email = null; + $this->addEmail(); + + $this->password = null; + $this->addPassword(); + + $this->role = null; + $this->addRole(); + + $user = new User([ + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + 'email' => $this->email, + 'password' => $this->password, + 'role' => $this->role, + 'published' => true, + 'published_at' => Carbon::now(), + ]); + $user->saveOrFail(); + + $this->info('User created 👌'); + + return 0; + } + + /** + * Add a firstname to the user. + * + * @return void + */ + private function addFirstname(): void + { + while (is_null($this->firstname)) { + try { + $tmp = $this->ask('Type the wanted user firstname', 'Admin'); + $validator = Validator::make(['firstname' => $tmp], [ + 'firstname' => 'required|min:3|max:255' + ]); + $validator->validate(); + $this->firstname = $tmp; + } catch (ValidationException $e) { + $this->error(sprintf( + 'Please provide a valid firstname %s', + \implode(',', collect($e->errors())->flatten()->all()) + )); + continue; + } //end try + }; //end while + } + + /** + * Add a lastname to the user. + * + * @return void + */ + private function addLastname(): void + { + while (is_null($this->lastname)) { + try { + $tmp = $this->ask('Type the wanted user lastname', 'Saïtama'); + $validator = Validator::make(['lastname' => $tmp], [ + 'lastname' => 'required|min:3|max:255' + ]); + $validator->validate(); + $this->lastname = $tmp; + } catch (ValidationException $e) { + $this->error(sprintf( + 'Please provide a valid lastname %s', + \implode(',', collect($e->errors())->flatten()->all()) + )); + continue; + } //end try + }; //end while + } + + /** + * Add an email to the user. + * + * @return void + */ + private function addEmail(): void + { + while (is_null($this->email)) { + try { + $tmp = $this->ask('Type the wanted user email', 'equipe.web@ldc.fr'); + $validator = Validator::make(['email' => $tmp], [ + 'email' => 'required|unique:users,email|email:rfc,dns' + ]); + $validator->validate(); + $this->email = $tmp; + } catch (ValidationException $e) { + $this->error(sprintf( + 'Please provide a valid email %s', + \implode(',', collect($e->errors())->flatten()->all()) + )); + continue; + } //end try + }; //end while + } + + /** + * Add a password to the user. + * + * @return void + */ + private function addPassword(): void + { + while ( + ($this->password = $this->secret( + (!\is_null($this->password) ? 'Failed to confirm, ' : '') . 'Type the wanted user password' + )) !== $this->secret('Confirm the password') + ) { + continue; + }; //end while + } + + /** + * Add a role to the user. + * + * @return void + */ + private function addRole(): void + { + while (is_null($this->role)) { + try { + $tmp = $this->choice( + 'Select his role', + [RoleEnum::conceptor()->label, RoleEnum::admin()->label], + RoleEnum::admin()->label, + $maxAttempts = null, + $allowMultipleSelections = false + ); + if ($tmp === RoleEnum::conceptor()->label) { + $tmp = RoleEnum::conceptor(); + } + if ($tmp === RoleEnum::admin()->label) { + $tmp = RoleEnum::admin(); + } + $validator = Validator::make(['role' => $tmp], [ + 'role' => 'required' + ]); + $validator->validate(); + $this->role = $tmp; + } catch (ValidationException $e) { + $this->error(sprintf( + 'Please choose from the selection', + \implode(',', collect($e->errors())->flatten()->all()) + )); + continue; + } //end try + }; //end while + } +} diff --git a/app/Enums/Users/RoleEnum.php b/app/Enums/Users/RoleEnum.php new file mode 100644 index 0000000..64525de --- /dev/null +++ b/app/Enums/Users/RoleEnum.php @@ -0,0 +1,34 @@ + 1, + 'admin' => 2, + ]; + } + + /** + * @return array + */ + protected static function labels(): array + { + return [ + 'conceptor' => trans('Concepteur'), + 'admin' => trans('Administrator'), + ]; + } +} diff --git a/app/Http/Controllers/Bo/Auth/LoginController.php b/app/Http/Controllers/Bo/Auth/LoginController.php new file mode 100644 index 0000000..59b4a71 --- /dev/null +++ b/app/Http/Controllers/Bo/Auth/LoginController.php @@ -0,0 +1,54 @@ +middleware('guest:backend')->except('logout'); + } + + /** + * Get the guard to be used during authentication. + * + * @return \Illuminate\Contracts\Auth\StatefulGuard + */ + protected function guard(): StatefulGuard + { + return Auth::guard('backend'); + } + + /** + * Show the application's login form. + * + * @return \Illuminate\Contracts\View\View + */ + public function showLoginForm(): View + { + return view('bo.auth.login'); + } + + /** + * Where to redirect users after login. + * + * @return string + */ + protected function redirectTo(): string + { + return response()->redirectToIntended()->getTargetUrl(); + } +} diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php index b10ee2b..a697b9c 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/LoginController.php @@ -4,18 +4,24 @@ namespace App\Http\Controllers; use App\Mail\PasswordReset; use App\Mail\VerifyEmail; +use App\Models\Customer; use App\Models\Settings; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; -use App\Models\User; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Mail; class LoginController extends Controller { + /** @var \LDCCRM\ApiV1 $apiCrm */ private $apiCrm; + /** + * Create a new controller instance. + * + * @return void + */ public function __construct() { $this->middleware('guest')->except('logout'); @@ -23,7 +29,8 @@ class LoginController extends Controller } /** - * index + * Get the view of the index. + * * @return \Illuminate\View\View */ public function index() @@ -31,6 +38,12 @@ class LoginController extends Controller return view('front.basic.login'); } + /** + * Authenticate the user. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ public function authenticate(Request $request) { $request->validate([ @@ -40,44 +53,45 @@ class LoginController extends Controller $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); $password = $request->password; - $remember = $request->remember !== null ? true : false; - - $userLocal = User::where('email', $email)->first(); + /** @var \App\Models\Customer $userLocal */ + $userLocal = Customer::where('email', $email)->first(); if ($userLocal) { if ($userLocal->email_verified === 1) { - if ($userLocal->role > 2) { - $connect = $this->apiCrm->loginCustomer($email, $password); + $connect = $this->apiCrm->loginCustomer($email, $password); - if ($connect->status === 'KO') { - if ($connect->code === 500) { - return back()->withInput($request->except("password")) - ->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard."); - } else { - return back()->withInput($request->except("password")) - ->withErrors("Email ou mot de passe incorrect."); - } + if ($connect->status === 'KO') { + if ($connect->code === 500) { + return redirect()->back() + ->withInput($request->except("password")) + ->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard."); + } else { + return redirect()->back() + ->withInput($request->except("password")) + ->withErrors("Email ou mot de passe incorrect."); } } } else { $userLocal->email_verify_token = Str::uuid(); $userLocal->save(); Mail::to($email)->send(new VerifyEmail($userLocal)); - return back()->withInput($request->except("password")) - ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails."); + return redirect()->back() + ->withInput($request->except("password")) + ->withErrors("Votre compte existe mais votre email n'est pas confirmé, + merci de vérifier vos emails."); }//end if } else { $connect = $this->apiCrm->loginCustomer($email, $password); if ($connect->status === 'OK') { - $userLocal = User::create([ + /** @var \App\Models\Customer $userLocal */ + $userLocal = Customer::create([ 'crm_id' => $connect->user->crm_id, 'firstname' => $connect->user->firstname, 'lastname' => $connect->user->lastname, 'birth_date' => $connect->user->birth_date, 'email' => $email, - // TODO : MOTDEPASSE ???. - 'password' => Hash::make("MOTDEPASSE"), + 'password' => Hash::make($password), 'address' => $connect->user->address, 'address2' => $connect->user->address2, 'town' => $connect->user->city, @@ -88,14 +102,14 @@ class LoginController extends Controller } else { // Compte existant mais non activé. if ($connect->code === 116) { - $userLocal = User::create([ + /** @var \App\Models\Customer $userLocal */ + $userLocal = Customer::create([ 'crm_id' => $connect->user->crm_id, 'firstname' => $connect->user->firstname, 'lastname' => $connect->user->lastname, 'birth_date' => $connect->user->birth_date, 'email' => $email, - // TODO : MOTDEPASSE ???. - 'password' => Hash::make("MOTDEPASSE"), + 'password' => Hash::make($password), 'address' => $connect->user->address, 'address2' => $connect->user->address2, 'town' => $connect->user->city, @@ -106,37 +120,29 @@ class LoginController extends Controller $userLocal->email_verify_token = Str::uuid(); $userLocal->save(); Mail::to($email)->send(new VerifyEmail($userLocal)); - return back()->withInput($request->except("password")) - ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails."); + return redirect()->back() + ->withInput($request->except("password")) + ->withErrors("Votre compte existe mais votre email n'est pas confirmé, + merci de vérifier vos emails."); } elseif ($connect->code === 500) { - return back()->withInput($request->except("password")) + return redirect()->back() + ->withInput($request->except("password")) ->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard."); } else { - return back()->withInput($request->except("password")) - ->withErrors("Email ou mot de passe incorrect."); + return redirect()->back() + ->withInput($request->except("password")) + ->withErrors("Email ou mot de passe incorrect."); } //end if } //end if - }//end if + } //end if - // phpcs:ignore - // TODO : Modifier avec separation guard. - $tmpPwd = "MOTDEPASSE"; - if ($userLocal->role <= 2) { - $tmpPwd = $password; - } - - if (Auth::attempt(["email" => $email, "password" => $tmpPwd], $remember)) { - if ($userLocal->role <= 2) { - return redirect()->route('bo.dashboard'); - } - return redirect()->route('saisir-code'); - } else { - return back()->withInput($request->except('password'))->withErrors('Les identifiants entrés sont incorrects.'); - } + Auth::login($userLocal); + return redirect()->route('saisir-code'); } /** - * logout + * Logout. + * * @return Illuminate\Http\RedirectResponse */ public function logout() @@ -144,15 +150,17 @@ class LoginController extends Controller Auth::logout(); return redirect()->route('home'); } + /** - * confirm email + * Confirm email. + * * @param string $verifyToken * @return \Illuminate\View\View|Illuminate\Http\RedirectResponse */ public function confirmEmail(string $verifyToken) { $result = false; - $user = User::where('email_verify_token', $verifyToken)->first(); + $user = Customer::where('email_verify_token', $verifyToken)->first(); if (!$user) { return view('front.basic.confirm-email', compact('result')); } @@ -194,7 +202,7 @@ class LoginController extends Controller ->withErrors("Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer."); } $tokenValid = false; - $user = User::where('password_token', $token)->first(); + $user = Customer::where('password_token', $token)->first(); if (!$user) { return redirect()->route('forgot-password', compact('tokenValid')) ->withErrors('Le lien de changement du mot de passe est incorrect.'); @@ -206,12 +214,12 @@ class LoginController extends Controller public function mailPassword(Request $request) { $email = filter_var($request->email, FILTER_SANITIZE_STRING); - $user = User::where('email', $email)->first(); + $user = Customer::where('email', $email)->first(); if (!$user) { $userCrm = $this->apiCrm->getCustomerByEmail($email); if ($userCrm->status === 'OK') { - $user = User::create([ + $user = Customer::create([ 'crm_id' => $userCrm->user->crm_id, 'firstname' => $userCrm->user->firstname, 'lastname' => $userCrm->user->lastname, @@ -233,14 +241,17 @@ class LoginController extends Controller $user->save(); Mail::to($email)->send(new VerifyEmail($user)); return back()->withInput($request->except("password")) - ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails."); + ->withErrors("Votre compte existe mais votre email n'est pas confirmé, + merci de vérifier vos emails."); } } else { if ($userCrm->code === 101) { - return back()->withInput($request->only('email')) + return redirect()->back() + ->withInput($request->only('email')) ->withErrors("Le mail que vous avez entré n'est pas enregistré dans nos services."); } else { - return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); + return redirect()->back() + ->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); } } //end if }//end if @@ -251,7 +262,7 @@ class LoginController extends Controller $settings = app(Settings::class); Mail::to($email)->send(new PasswordReset($user, $settings)); return redirect()->route('login') - ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); + ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); } public function changePassword(Request $request) @@ -260,9 +271,10 @@ class LoginController extends Controller 'password' => 'required|min:8|confirmed', ]); - $user = User::where('password_token', filter_var($request->token, FILTER_SANITIZE_STRING))->first(); + $user = Customer::where('password_token', filter_var($request->token, FILTER_SANITIZE_STRING))->first(); if (!$user) { - return back()->withErrors('Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.'); + return redirect()->back() + ->withErrors('Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.'); } // TODO : Ajouter controle du contenu du mot de passe. @@ -274,13 +286,15 @@ class LoginController extends Controller $user->password_token = null; $user->save(); return redirect()->route('login') - ->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); + ->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); } else { if ($update->code === 123) { - return back() - ->withErrors("Il semblerait que vous ayez déjà utilisé ce mot de passe pour votre compte. Veuillez réessayer en changeant de mot de passe."); + return redirect()->back() + ->withErrors("Il semblerait que vous ayez déjà utilisé ce mot de passe pour votre compte. + Veuillez réessayer en changeant de mot de passe."); } else { - return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); + return redirect()->back() + ->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); } } } diff --git a/app/Http/Controllers/RegisterController.php b/app/Http/Controllers/RegisterController.php index b28a8fc..1e9f0c3 100644 --- a/app/Http/Controllers/RegisterController.php +++ b/app/Http/Controllers/RegisterController.php @@ -3,8 +3,8 @@ namespace App\Http\Controllers; use App\Mail\VerifyEmail; +use App\Models\Customer; use App\Providers\RouteServiceProvider; -use App\Models\User; use Carbon\Carbon; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Http\Request; @@ -89,14 +89,14 @@ class RegisterController extends Controller $crmUser = $this->apiCrm->createCustomer($email, $password, $firstname, $lastname, $optin, $birthdate, null, $address, $address2, $town, $postcode, ucfirst($country)); if ($crmUser->status === 'OK') { - $user = User::create([ + $user = Customer::create([ 'crm_id' => $crmUser->user->crm_id, 'firstname' => $firstname, 'lastname' => $lastname, 'birth_date' => $birthdate, 'email' => $email, 'password' => Hash::make("MOTDEPASSE"), -// TODO : ??? + // TODO : ??? 'address' => $address, 'address2' => $address2, 'town' => $town, diff --git a/app/Http/Controllers/WinningProofController.php b/app/Http/Controllers/WinningProofController.php index 3adf997..ec300df 100644 --- a/app/Http/Controllers/WinningProofController.php +++ b/app/Http/Controllers/WinningProofController.php @@ -4,9 +4,9 @@ namespace App\Http\Controllers; use App\Mail\NotifAdmin; use App\Mail\WinningProof; +use App\Models\Customer; use App\Models\Participation; use App\Models\Settings; -use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; @@ -61,7 +61,7 @@ class WinningProofController extends Controller $barcode = $request->barcode; // Mise à jour de l'utilisateur en local. - $user = User::find(Auth::user()->id); + $user = Customer::find(Auth::user()->id); $user->lastname = $lastname; $user->firstname = $firstname; $user->address = $address; diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index aeb9d80..c458585 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; +use Illuminate\Support\Facades\Session; class Authenticate extends Middleware { @@ -12,10 +13,27 @@ class Authenticate extends Middleware * @param \Illuminate\Http\Request $request * @return string|null */ - protected function redirectTo($request) + protected function redirectTo($request): ?string { - if (! $request->expectsJson()) { + $logins = [ + 'backend' => route('bo.login') + ]; + if (!$request->expectsJson()) { + // * Notify must login + Session::flash('warning', trans('Veuillez vous connecter pour continuer')); + + foreach ($request->route()->gatherMiddleware() as $middleware) { + if (\is_string($middleware) and strpos($middleware, 'auth:') !== false) { + $route = $logins[str_replace('auth:', '', $middleware)] ?? null; + if ($route) { + return $route; + } + } + } return route('login'); } + abort(401); + + return null; } } diff --git a/app/Mail/VerifyEmail.php b/app/Mail/VerifyEmail.php index 5448704..3c62360 100644 --- a/app/Mail/VerifyEmail.php +++ b/app/Mail/VerifyEmail.php @@ -2,6 +2,7 @@ namespace App\Mail; +use App\Models\Customer; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; @@ -12,14 +13,16 @@ class VerifyEmail extends Mailable implements ShouldQueue use Queueable; use SerializesModels; + /** @var \App\Models\Customer $user */ protected $user; /** * Create a new message instance. * + * @param \App\Models\Customer $user * @return void */ - public function __construct($user) + public function __construct(Customer $user) { $this->user = $user; } diff --git a/app/Models/Customer.php b/app/Models/Customer.php new file mode 100644 index 0000000..d338ca5 --- /dev/null +++ b/app/Models/Customer.php @@ -0,0 +1,91 @@ + 'datetime', + ]; + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted() + { + // * EVENT CLOSURES. + static::creating(function (self $model) { + static::updatePassword($model); + }); + static::updating(function (self $model) { + static::updatePassword($model); + }); + } + + /** + * Update password. + * + * @param self $model + * @return void + */ + private static function updatePassword(self $model): void + { + if (Hash::needsRehash($model->password)) { + $model->password = Hash::make($model->password); + } + } + + /** + * Has Many Participation relation + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function participations() + { + return $this->hasMany(Participation::class, 'user_id'); + } +} diff --git a/app/Models/Participation.php b/app/Models/Participation.php index 6919406..074a1b2 100644 --- a/app/Models/Participation.php +++ b/app/Models/Participation.php @@ -13,7 +13,7 @@ class Participation extends Model */ public function user() { - return $this->belongsTo(User::class); + return $this->belongsTo(Customer::class); } /** diff --git a/app/Models/User.php b/app/Models/User.php index cc656bb..a4c8761 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,11 +2,15 @@ namespace App\Models; +use App\Enums\Users\RoleEnum; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Facades\Hash; class User extends Authenticatable { + use HasFactory; use Notifiable; /** @@ -15,47 +19,76 @@ class User extends Authenticatable * @var array */ protected $fillable = [ - 'crm_id', - 'civility', 'firstname', 'lastname', - 'birth_date', 'email', 'password', - 'address', - 'address2', - 'town', - 'postal_code', - 'country', - 'email_verify_token', - 'email_verified' + 'role', + 'published', + 'published_at', + 'order', ]; /** - * The attributes that should be hidden for arrays. + * The attributes that should be hidden for serialization. * * @var array */ protected $hidden = [ - 'password', 'remember_token', + 'password', + 'remember_token', ]; /** - * The attributes that should be cast to native types. + * Cast the property to an enum. * * @var array */ - protected $casts = [ + protected $enumCasts = [ + 'role' => RoleEnum::class, 'email_verified_at' => 'datetime', ]; /** - * Has Many Participation relation + * Perform any actions required after the model boots. * - * @return \Illuminate\Database\Eloquent\Relations\HasMany + * @return void */ - public function participations() + protected static function booted() { - return $this->hasMany(Participation::class, 'user_id'); + // * EVENT CLOSURES. + static::creating(function (self $model) { + static::updatePassword($model); + static::setOrder($model); + }); + static::updating(function (self $model) { + static::updatePassword($model); + }); + } + + // * METHODS + + /** + * Set order after the last element of the list. + * + * @param self $model + * @return void + */ + private static function setOrder(self $model): void + { + $model->order = \intval(self::query()->max('order')) + 1; + } + + /** + * Update password. + * + * @param self $model + * @return void + */ + private static function updatePassword(self $model): void + { + if (Hash::needsRehash($model->password)) { + $model->password = Hash::make($model->password); + } } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 2f541bd..27381dc 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -31,17 +31,16 @@ class RouteServiceProvider extends ServiceProvider public function boot() { $this->routes(function () { + Route::middleware('web') + ->namespace($this->namespace) + ->group(base_path('routes/web.php')); Route::middleware('web') - ->namespace($this->namespace) - ->group(base_path('routes/web.php')); + ->namespace($this->namespace) + ->group(base_path('routes/web-bo.php')); Route::middleware('web') - ->namespace($this->namespace) - ->group(base_path('routes/web-bo.php')); - - Route::middleware('web') - ->namespace($this->namespace) + ->namespace($this->namespace) ->group(base_path('routes/web-re7.php')); }); } diff --git a/composer.json b/composer.json index a1e13a2..f601b82 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "fideloper/proxy": "^4.2", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", + "kwaadpepper/enum": "^2.1", "kwaadpepper/exception-handler": "^0.0.6", "kwaadpepper/serial-int-caster": "^1.0", "laravel/framework": "^8.0", diff --git a/composer.lock b/composer.lock index c4a6ed6..8a1e145 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bd553522eb8eb68c6c6662ee2c92d282", + "content-hash": "7b08999e5a20a4f175350f32648b750e", "packages": [ { "name": "asm89/stack-cors", @@ -124,28 +124,28 @@ }, { "name": "doctrine/inflector", - "version": "2.0.4", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", "autoload": { @@ -195,7 +195,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" + "source": "https://github.com/doctrine/inflector/tree/2.0.8" }, "funding": [ { @@ -211,7 +211,7 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:16:43+00:00" + "time": "2023-06-16T13:40:37+00:00" }, { "name": "doctrine/lexer", @@ -291,16 +291,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.1", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa" + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/be85b3f05b46c39bbc0d95f6c071ddff669510fa", - "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", "shasum": "" }, "require": { @@ -340,7 +340,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" }, "funding": [ { @@ -348,7 +348,7 @@ "type": "github" } ], - "time": "2022-01-18T15:43:28+00:00" + "time": "2023-08-10T19:36:49+00:00" }, { "name": "egulias/email-validator", @@ -553,28 +553,29 @@ "type": "github" } ], + "abandoned": true, "time": "2022-02-23T14:25:13+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", - "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9" + "phpoption/phpoption": "^1.9.1" }, "require-dev": { - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" }, "type": "library", "autoload": { @@ -603,7 +604,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" }, "funding": [ { @@ -615,26 +616,26 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:56:11+00:00" + "time": "2023-02-25T20:23:15+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.4.5", + "version": "7.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", - "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9 || ^2.4", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -643,10 +644,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -656,8 +658,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "7.4-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -723,7 +726,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.5" + "source": "https://github.com/guzzle/guzzle/tree/7.7.0" }, "funding": [ { @@ -739,38 +742,37 @@ "type": "tidelift" } ], - "time": "2022-06-20T22:16:13+00:00" + "time": "2023-05-21T14:04:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -807,7 +809,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -823,26 +825,26 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.4.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "13388f00956b1503577598873fffb5ae994b5737" + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", - "reference": "13388f00956b1503577598873fffb5ae994b5737", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -850,17 +852,18 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.4-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -922,7 +925,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.0" }, "funding": [ { @@ -938,7 +941,67 @@ "type": "tidelift" } ], - "time": "2022-06-20T21:43:11+00:00" + "time": "2023-08-03T15:06:02+00:00" + }, + { + "name": "kwaadpepper/enum", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/Kwaadpepper/enum.git", + "reference": "cc695e6a07ee57a1220942581c303842e186b22f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Kwaadpepper/enum/zipball/cc695e6a07ee57a1220942581c303842e186b22f", + "reference": "cc695e6a07ee57a1220942581c303842e186b22f", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "orchestra/testbench": "^6", + "phpunit/php-code-coverage": "^9", + "phpunit/phpunit": "~9", + "slevomat/coding-standard": "^7", + "squizlabs/php_codesniffer": "^3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Kwaadpepper\\Enum\\EnumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Kwaadpepper\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Munsch", + "email": "github@jeremydev.ovh", + "homepage": "https://jeremydev.ovh" + } + ], + "description": "Enums to use for any project", + "homepage": "https://github.com/kwaadpepper/enum", + "keywords": [ + "enum", + "laravel" + ], + "support": { + "issues": "https://github.com/Kwaadpepper/enum/issues", + "source": "https://github.com/Kwaadpepper/enum/tree/2.1.3" + }, + "time": "2022-07-28T15:18:54+00:00" }, { "name": "kwaadpepper/exception-handler", @@ -1049,16 +1112,16 @@ }, { "name": "laravel/framework", - "version": "v8.83.23", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "bdc707f8b9bcad289b24cd182d98ec7480ac4491" + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/bdc707f8b9bcad289b24cd182d98ec7480ac4491", - "reference": "bdc707f8b9bcad289b24cd182d98ec7480ac4491", + "url": "https://api.github.com/repos/laravel/framework/zipball/e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", "shasum": "" }, "require": { @@ -1218,29 +1281,30 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-07-26T13:30:00+00:00" + "time": "2022-12-08T15:28:55+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.2.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "09f0e9fb61829f628205b7c94906c28740ff9540" + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540", - "reference": "09f0e9fb61829f628205b7c94906c28740ff9540", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "pestphp/pest": "^1.18", - "phpstan/phpstan": "^0.12.98", - "symfony/var-dumper": "^5.3" + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" }, "type": "library", "extra": { @@ -1277,26 +1341,26 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2022-05-16T17:09:47+00:00" + "time": "2023-07-14T13:56:28+00:00" }, { "name": "laravel/tinker", - "version": "v2.7.2", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "dff39b661e827dae6e092412f976658df82dbac5" + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5", - "reference": "dff39b661e827dae6e092412f976658df82dbac5", + "url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.10.4|^0.11.1", "symfony/var-dumper": "^4.3.4|^5.0|^6.0" @@ -1306,7 +1370,7 @@ "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." }, "type": "library", "extra": { @@ -1343,9 +1407,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.2" + "source": "https://github.com/laravel/tinker/tree/v2.8.1" }, - "time": "2022-03-23T12:38:24+00:00" + "time": "2023-02-15T16:40:09+00:00" }, { "name": "laravel/ui", @@ -1503,16 +1567,16 @@ }, { "name": "league/flysystem", - "version": "1.1.9", + "version": "1.1.10", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99" + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", "shasum": "" }, "require": { @@ -1585,7 +1649,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" }, "funding": [ { @@ -1593,20 +1657,20 @@ "type": "other" } ], - "time": "2021-12-09T09:40:50+00:00" + "time": "2022-10-04T09:16:37+00:00" }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "c7f2872fb273bf493811473dafc88d60ae829f48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/c7f2872fb273bf493811473dafc88d60ae829f48", + "reference": "c7f2872fb273bf493811473dafc88d60ae829f48", "shasum": "" }, "require": { @@ -1637,7 +1701,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.12.0" }, "funding": [ { @@ -1649,20 +1713,20 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2023-08-03T07:14:11+00:00" }, { "name": "monolog/monolog", - "version": "2.8.0", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", "shasum": "" }, "require": { @@ -1677,7 +1741,7 @@ "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", "guzzlehttp/guzzle": "^7.4", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", @@ -1739,7 +1803,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + "source": "https://github.com/Seldaek/monolog/tree/2.9.1" }, "funding": [ { @@ -1751,31 +1815,35 @@ "type": "tidelift" } ], - "time": "2022-07-24T11:55:47+00:00" + "time": "2023-02-06T13:44:46+00:00" }, { "name": "nesbot/carbon", - "version": "2.61.0", + "version": "2.69.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bdf4f4fe3a3eac4de84dbec0738082a862c68ba6" + "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bdf4f4fe3a3eac4de84dbec0738082a862c68ba6", - "reference": "bdf4f4fe3a3eac4de84dbec0738082a862c68ba6", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4308217830e4ca445583a37d1bf4aff4153fa81c", + "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -1853,20 +1921,20 @@ "type": "tidelift" } ], - "time": "2022-08-06T12:41:24+00:00" + "time": "2023-08-03T09:00:52+00:00" }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -1907,9 +1975,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2022-05-31T20:59:12+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "opis/closure", @@ -1978,24 +2046,24 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" }, "type": "library", "extra": { @@ -2037,7 +2105,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" }, "funding": [ { @@ -2049,7 +2117,55 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:51:26+00:00" + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" }, { "name": "psr/container", @@ -2151,21 +2267,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2185,7 +2301,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -2197,27 +2313,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client/tree/1.0.2" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-04-10T20:12:12+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2237,7 +2353,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -2252,31 +2368,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2291,7 +2407,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -2305,9 +2421,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", @@ -2412,16 +2528,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.8", + "version": "v0.11.20", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "f455acf3645262ae389b10e9beba0c358aa6994e" + "reference": "0fa27040553d1d280a67a4393194df5228afea5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/f455acf3645262ae389b10e9beba0c358aa6994e", - "reference": "f455acf3645262ae389b10e9beba0c358aa6994e", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0fa27040553d1d280a67a4393194df5228afea5b", + "reference": "0fa27040553d1d280a67a4393194df5228afea5b", "shasum": "" }, "require": { @@ -2482,9 +2598,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.8" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.20" }, - "time": "2022-07-28T14:25:11+00:00" + "time": "2023-07-31T14:32:22+00:00" }, { "name": "ralouphie/getallheaders", @@ -2828,16 +2944,16 @@ }, { "name": "symfony/console", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "535846c7ee6bc4dd027ca0d93220601456734b10" + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10", - "reference": "535846c7ee6bc4dd027ca0d93220601456734b10", + "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273", "shasum": "" }, "require": { @@ -2902,12 +3018,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.11" + "source": "https://github.com/symfony/console/tree/v5.4.26" }, "funding": [ { @@ -2923,20 +3039,20 @@ "type": "tidelift" } ], - "time": "2022-07-22T10:42:43+00:00" + "time": "2023-07-19T20:11:33+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "c1681789f059ab756001052164726ae88512ae3d" + "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", - "reference": "c1681789f059ab756001052164726ae88512ae3d", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", + "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", "shasum": "" }, "require": { @@ -2973,7 +3089,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.11" + "source": "https://github.com/symfony/css-selector/tree/v5.4.26" }, "funding": [ { @@ -2989,7 +3105,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2023-07-07T06:10:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3060,16 +3176,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "f75d17cb4769eb38cd5fccbda95cd80a054d35c8" + "reference": "b26719213a39c9ba57520cbc5e52bfcc5e8d92f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/f75d17cb4769eb38cd5fccbda95cd80a054d35c8", - "reference": "f75d17cb4769eb38cd5fccbda95cd80a054d35c8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/b26719213a39c9ba57520cbc5e52bfcc5e8d92f9", + "reference": "b26719213a39c9ba57520cbc5e52bfcc5e8d92f9", "shasum": "" }, "require": { @@ -3111,7 +3227,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.11" + "source": "https://github.com/symfony/error-handler/tree/v5.4.26" }, "funding": [ { @@ -3127,20 +3243,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2023-07-16T16:48:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", "shasum": "" }, "require": { @@ -3196,7 +3312,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" }, "funding": [ { @@ -3212,7 +3328,7 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:45:39+00:00" + "time": "2023-07-06T06:34:20+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3295,16 +3411,16 @@ }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", "shasum": "" }, "require": { @@ -3338,7 +3454,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.4.27" }, "funding": [ { @@ -3354,20 +3470,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2023-07-31T08:02:31+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "0a5868e0999e9d47859ba3d918548ff6943e6389" + "reference": "e7793151e99dc2ac1352ff3735d100fb3b3bfc08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0a5868e0999e9d47859ba3d918548ff6943e6389", - "reference": "0a5868e0999e9d47859ba3d918548ff6943e6389", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793151e99dc2ac1352ff3735d100fb3b3bfc08", + "reference": "e7793151e99dc2ac1352ff3735d100fb3b3bfc08", "shasum": "" }, "require": { @@ -3379,8 +3495,11 @@ "require-dev": { "predis/predis": "~1.0", "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0" + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -3411,7 +3530,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.11" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.26" }, "funding": [ { @@ -3427,20 +3546,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2023-07-21T11:30:15+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.11", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "4fd590a2ef3f62560dbbf6cea511995dd77321ee" + "reference": "9f5624816c0b8d92f85666ac7ed2825a18fcd899" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4fd590a2ef3f62560dbbf6cea511995dd77321ee", - "reference": "4fd590a2ef3f62560dbbf6cea511995dd77321ee", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f5624816c0b8d92f85666ac7ed2825a18fcd899", + "reference": "9f5624816c0b8d92f85666ac7ed2825a18fcd899", "shasum": "" }, "require": { @@ -3449,7 +3568,7 @@ "symfony/deprecation-contracts": "^2.1|^3", "symfony/error-handler": "^4.4|^5.0|^6.0", "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.3.7|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16" @@ -3523,7 +3642,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.11" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.27" }, "funding": [ { @@ -3539,20 +3658,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T12:30:22+00:00" + "time": "2023-07-31T10:18:38+00:00" }, { "name": "symfony/mime", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "3cd175cdcdb6db2e589e837dd46aff41027d9830" + "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/3cd175cdcdb6db2e589e837dd46aff41027d9830", - "reference": "3cd175cdcdb6db2e589e837dd46aff41027d9830", + "url": "https://api.github.com/repos/symfony/mime/zipball/2ea06dfeee20000a319d8407cea1d47533d5a9d2", + "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2", "shasum": "" }, "require": { @@ -3566,15 +3685,16 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.26|>=6,<6.2.13|>=6.3,<6.3.2" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^5.4.26|~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -3606,7 +3726,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.11" + "source": "https://github.com/symfony/mime/tree/v5.4.26" }, "funding": [ { @@ -3622,20 +3742,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T11:34:24+00:00" + "time": "2023-07-27T06:29:31+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -3650,7 +3770,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3688,7 +3808,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -3704,20 +3824,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "143f1881e655bebca1312722af8068de235ae5dc" + "reference": "927013f3aac555983a5059aada98e1907d842695" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc", - "reference": "143f1881e655bebca1312722af8068de235ae5dc", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", "shasum": "" }, "require": { @@ -3732,7 +3852,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3771,7 +3891,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" }, "funding": [ { @@ -3787,20 +3907,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -3812,7 +3932,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3852,7 +3972,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -3868,20 +3988,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -3895,7 +4015,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3939,7 +4059,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { @@ -3955,20 +4075,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -3980,7 +4100,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4023,7 +4143,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -4039,20 +4159,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -4067,7 +4187,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4106,7 +4226,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -4122,20 +4242,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -4144,7 +4264,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4182,7 +4302,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -4198,20 +4318,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -4220,7 +4340,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4261,7 +4381,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" }, "funding": [ { @@ -4277,20 +4397,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -4299,7 +4419,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4344,7 +4464,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -4360,20 +4480,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -4382,7 +4502,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4423,7 +4543,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -4439,20 +4559,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/1a44dc377ec86a50fab40d066cd061e28a6b482f", + "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f", "shasum": "" }, "require": { @@ -4485,7 +4605,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v5.4.26" }, "funding": [ { @@ -4501,20 +4621,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2023-07-12T15:44:31+00:00" }, { "name": "symfony/routing", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226" + "reference": "853fc7df96befc468692de0a48831b38f04d2cb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3e01ccd9b2a3a4167ba2b3c53612762300300226", - "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226", + "url": "https://api.github.com/repos/symfony/routing/zipball/853fc7df96befc468692de0a48831b38f04d2cb2", + "reference": "853fc7df96befc468692de0a48831b38f04d2cb2", "shasum": "" }, "require": { @@ -4529,7 +4649,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.12", + "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", "symfony/config": "^5.3|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", @@ -4575,7 +4695,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.11" + "source": "https://github.com/symfony/routing/tree/v5.4.26" }, "funding": [ { @@ -4591,7 +4711,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2023-07-24T13:28:37+00:00" }, { "name": "symfony/service-contracts", @@ -4678,16 +4798,16 @@ }, { "name": "symfony/string", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322" + "reference": "1181fe9270e373537475e826873b5867b863883c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5eb661e49ad389e4ae2b6e4df8d783a8a6548322", - "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322", + "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", + "reference": "1181fe9270e373537475e826873b5867b863883c", "shasum": "" }, "require": { @@ -4744,7 +4864,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.11" + "source": "https://github.com/symfony/string/tree/v5.4.26" }, "funding": [ { @@ -4760,20 +4880,20 @@ "type": "tidelift" } ], - "time": "2022-07-24T16:15:25+00:00" + "time": "2023-06-28T12:46:07+00:00" }, { "name": "symfony/translation", - "version": "v5.4.11", + "version": "v5.4.24", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "7a1a8f6bbff269f434a83343a0a5d36a4f8cfa21" + "reference": "de237e59c5833422342be67402d487fbf50334ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/7a1a8f6bbff269f434a83343a0a5d36a4f8cfa21", - "reference": "7a1a8f6bbff269f434a83343a0a5d36a4f8cfa21", + "url": "https://api.github.com/repos/symfony/translation/zipball/de237e59c5833422342be67402d487fbf50334ff", + "reference": "de237e59c5833422342be67402d487fbf50334ff", "shasum": "" }, "require": { @@ -4841,7 +4961,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.11" + "source": "https://github.com/symfony/translation/tree/v5.4.24" }, "funding": [ { @@ -4857,7 +4977,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2023-05-19T12:34:17+00:00" }, { "name": "symfony/translation-contracts", @@ -4939,16 +5059,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.4.11", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b8f306d7b8ef34fb3db3305be97ba8e088fb4861" + "reference": "e706c99b4a6f4d9383b52b80dd8c74880501e314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8f306d7b8ef34fb3db3305be97ba8e088fb4861", - "reference": "b8f306d7b8ef34fb3db3305be97ba8e088fb4861", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e706c99b4a6f4d9383b52b80dd8c74880501e314", + "reference": "e706c99b4a6f4d9383b52b80dd8c74880501e314", "shasum": "" }, "require": { @@ -4957,12 +5077,12 @@ "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" @@ -5008,7 +5128,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.11" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.26" }, "funding": [ { @@ -5024,20 +5144,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2023-07-13T07:32:46+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.4", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c" + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", "shasum": "" }, "require": { @@ -5075,22 +5195,22 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" }, - "time": "2021-12-08T09:12:39+00:00" + "time": "2023-01-03T09:29:04+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.4.1", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", "shasum": "" }, "require": { @@ -5105,15 +5225,19 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" }, "suggest": { "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -5145,7 +5269,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" }, "funding": [ { @@ -5157,7 +5281,7 @@ "type": "tidelift" } ], - "time": "2021-12-12T23:22:04+00:00" + "time": "2022-10-16T01:01:54+00:00" }, { "name": "voku/portable-ascii", @@ -5572,25 +5696,29 @@ }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -5609,40 +5737,41 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/event-manager", - "version": "1.1.2", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683" + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/eb2ecf80e3093e8f3c2769ac838e27d8ede8e683", - "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "~1.4.10 || ^1.5.4", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.24" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5686,7 +5815,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.2" + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" }, "funding": [ { @@ -5702,34 +5831,34 @@ "type": "tidelift" } ], - "time": "2022-07-27T22:18:11+00:00" + "time": "2022-10-12T20:51:15+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -5756,7 +5885,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -5772,7 +5901,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "facade/flare-client-php", @@ -5841,16 +5970,16 @@ }, { "name": "facade/ignition", - "version": "2.17.6", + "version": "2.17.7", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c" + "reference": "b4f5955825bb4b74cba0f94001761c46335c33e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/6acd82e986a2ecee89e2e68adfc30a1936d1ab7c", - "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c", + "url": "https://api.github.com/repos/facade/ignition/zipball/b4f5955825bb4b74cba0f94001761c46335c33e9", + "reference": "b4f5955825bb4b74cba0f94001761c46335c33e9", "shasum": "" }, "require": { @@ -5915,7 +6044,7 @@ "issues": "https://github.com/facade/ignition/issues", "source": "https://github.com/facade/ignition" }, - "time": "2022-06-30T18:26:59+00:00" + "time": "2023-01-26T12:34:59+00:00" }, { "name": "facade/ignition-contracts", @@ -5972,16 +6101,16 @@ }, { "name": "filp/whoops", - "version": "2.14.5", + "version": "2.15.3", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" + "reference": "c83e88a30524f9360b11f585f71e6b17313b7187" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187", + "reference": "c83e88a30524f9360b11f585f71e6b17313b7187", "shasum": "" }, "require": { @@ -6031,7 +6160,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.5" + "source": "https://github.com/filp/whoops/tree/2.15.3" }, "funding": [ { @@ -6039,7 +6168,7 @@ "type": "github" } ], - "time": "2022-01-07T12:00:00+00:00" + "time": "2023-07-13T12:00:00+00:00" }, { "name": "fzaninotto/faker", @@ -6149,38 +6278,40 @@ }, { "name": "mockery/mockery", - "version": "1.5.0", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac" + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" + "phpunit/phpunit": "^8.5 || ^9.6.10", + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^4.30" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { - "psr-0": { - "Mockery": "library/" + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", @@ -6191,12 +6322,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -6214,23 +6353,26 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.5.0" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2022-01-20T13:18:17+00:00" + "time": "2023-08-09T00:03:52+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -6268,7 +6410,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -6276,7 +6418,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nunomaduro/collision", @@ -6476,251 +6618,26 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, { "name": "phpstan/phpdoc-parser", - "version": "1.7.0", + "version": "1.23.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "367a8d9d5f7da2a0136422d27ce8840583926955" + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/367a8d9d5f7da2a0136422d27ce8840583926955", - "reference": "367a8d9d5f7da2a0136422d27ce8840583926955", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -6744,29 +6661,29 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.7.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" }, - "time": "2022-08-09T12:23:23+00:00" + "time": "2023-08-03T16:32:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.15", + "version": "9.2.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -6781,8 +6698,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -6815,7 +6732,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" }, "funding": [ { @@ -6823,7 +6741,7 @@ "type": "github" } ], - "time": "2022-03-07T09:28:20+00:00" + "time": "2023-07-26T13:44:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -7068,20 +6986,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.21", + "version": "9.6.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" + "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", - "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6d351645c3fe5a30f5e86be6577d946af65a328", + "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -7092,7 +7010,6 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", @@ -7100,22 +7017,19 @@ "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -7123,7 +7037,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -7154,7 +7068,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.10" }, "funding": [ { @@ -7164,9 +7079,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-06-19T12:14:25+00:00" + "time": "2023-07-10T04:04:23+00:00" }, { "name": "sebastian/cli-parser", @@ -7337,16 +7256,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -7399,7 +7318,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -7407,7 +7326,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -7468,16 +7387,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -7522,7 +7441,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -7530,20 +7449,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -7585,7 +7504,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -7593,20 +7512,20 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -7662,7 +7581,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -7670,20 +7589,20 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -7726,7 +7645,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -7734,7 +7653,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -7907,16 +7826,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -7955,10 +7874,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -7966,7 +7885,7 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", @@ -8025,16 +7944,16 @@ }, { "name": "sebastian/type", - "version": "3.0.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { @@ -8046,7 +7965,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -8069,7 +7988,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -8077,7 +7996,7 @@ "type": "github" } ], - "time": "2022-03-15T09:54:48+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -8195,16 +8114,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", "shasum": "" }, "require": { @@ -8240,14 +8159,15 @@ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ "phpcs", - "standards" + "standards", + "static analysis" ], "support": { "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2022-06-18T07:21:10+00:00" + "time": "2023-02-22T23:07:41+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/auth.php b/config/auth.php index c30fc9c..9a8be38 100644 --- a/config/auth.php +++ b/config/auth.php @@ -14,7 +14,7 @@ return [ */ 'defaults' => [ - 'guard' => 'web', + 'guard' => 'frontend', 'passwords' => 'users', ], @@ -36,15 +36,14 @@ return [ */ 'guards' => [ - 'web' => [ + 'backend' => [ 'driver' => 'session', 'provider' => 'users', ], - 'api' => [ - 'driver' => 'token', - 'provider' => 'users', - 'hash' => false, + 'frontend' => [ + 'driver' => 'session', + 'provider' => 'customers', ], ], @@ -70,6 +69,10 @@ return [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], + 'customers' => [ + 'driver' => 'eloquent', + 'model' => App\Models\Customer::class, + ], ], /* @@ -90,7 +93,13 @@ return [ 'passwords' => [ 'users' => [ 'provider' => 'users', - 'table' => 'password_resets', + 'table' => 'password', + 'expire' => 60, + 'throttle' => 60, + ], + 'customers' => [ + 'provider' => 'customers', + 'table' => 'password', 'expire' => 60, 'throttle' => 60, ], diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 9f73828..8222263 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateUsersTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -15,23 +15,16 @@ class CreateUsersTable extends Migration { Schema::create('users', function (Blueprint $table) { $table->id(); - $table->integer('crm_id')->nullable(); - $table->string('firstname'); - $table->string('lastname'); - $table->date('birth_date')->nullable(); - $table->string('email')->unique(); - $table->string('password'); - $table->string('address')->nullable(); - $table->string('address2')->nullable(); - $table->string('town')->nullable(); - $table->string('postal_code')->nullable(); - $table->string('country')->nullable(); - $table->string('phone')->nullable(); - $table->string('email_verify_token')->nullable(); - $table->boolean('email_verified')->default(0); - $table->string('password_token')->nullable(); - $table->integer('role')->default(3); + $table->string('firstname')->comment('Firstname of the user.'); + $table->string('lastname')->comment('Lastname of the user.'); + $table->string('email')->unique()->comment('Email of the user.'); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password')->comment('Password of the user account.'); $table->rememberToken(); + $table->boolean('role')->comment('Role of the user who defines the rights/access.'); + $table->boolean('published')->comment('The user is published or not.'); + $table->timestamp('published_at')->nullable()->comment('The date on which the user was published.'); + $table->integer('order')->comment('Order of this user.'); $table->timestamps(); }); } @@ -45,4 +38,4 @@ class CreateUsersTable extends Migration { Schema::dropIfExists('users'); } -} +}; diff --git a/database/migrations/2023_08_16_092101_create_customers_table.php b/database/migrations/2023_08_16_092101_create_customers_table.php new file mode 100644 index 0000000..41607e5 --- /dev/null +++ b/database/migrations/2023_08_16_092101_create_customers_table.php @@ -0,0 +1,46 @@ +id(); + $table->integer('crm_id')->nullable(); + $table->string('firstname'); + $table->string('lastname'); + $table->date('birth_date')->nullable(); + $table->string('email')->unique(); + $table->string('password'); + $table->string('address')->nullable(); + $table->string('address2')->nullable(); + $table->string('town')->nullable(); + $table->string('postal_code')->nullable(); + $table->string('country')->nullable(); + $table->string('phone')->nullable(); + $table->string('email_verify_token')->nullable(); + $table->boolean('email_verified')->default(0); + $table->string('password_token')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('customers'); + } +} diff --git a/resources/views/bo/auth/login.blade.php b/resources/views/bo/auth/login.blade.php new file mode 100644 index 0000000..1731442 --- /dev/null +++ b/resources/views/bo/auth/login.blade.php @@ -0,0 +1,67 @@ +@extends('bo.layout') +@section('title', __('Authentification')) +@section('description', __('Formulaire d\'authentification au back-office.')) + +@section('content') +
+
+
+
+
{{ __('Connexion') }}
+
+
+ @csrf +
+ +
+ + @error('email') + + {{ $message }} + + @enderror +
+
+
+ +
+ + @error('password') + + {{ $message }} + + @enderror +
+
+
+
+
+ + +
+
+
+
+
+ + @if (Route::has('bo.password.request')) + + {{ __('Mot de passe oublié ?') }} + + @endif +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/bo/banned-ip/index.blade.php b/resources/views/bo/banned-ip/index.blade.php index a9342c9..51792bd 100644 --- a/resources/views/bo/banned-ip/index.blade.php +++ b/resources/views/bo/banned-ip/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/codes-ean/index.blade.php b/resources/views/bo/codes-ean/index.blade.php index b168ef4..260d573 100644 --- a/resources/views/bo/codes-ean/index.blade.php +++ b/resources/views/bo/codes-ean/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/codes/index.blade.php b/resources/views/bo/codes/index.blade.php index 2ee6f7c..08484ca 100644 --- a/resources/views/bo/codes/index.blade.php +++ b/resources/views/bo/codes/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/codes/search.blade.php b/resources/views/bo/codes/search.blade.php index 57f7e37..72c3836 100644 --- a/resources/views/bo/codes/search.blade.php +++ b/resources/views/bo/codes/search.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/content/manage.blade.php b/resources/views/bo/content/manage.blade.php index 6ae6915..f8f253c 100644 --- a/resources/views/bo/content/manage.blade.php +++ b/resources/views/bo/content/manage.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/dashboard/index.blade.php b/resources/views/bo/dashboard/index.blade.php index ac9c580..a42254a 100644 --- a/resources/views/bo/dashboard/index.blade.php +++ b/resources/views/bo/dashboard/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')

Tableau de bord

diff --git a/resources/views/bo/faq-questions/index.blade.php b/resources/views/bo/faq-questions/index.blade.php index f744e55..d42216c 100644 --- a/resources/views/bo/faq-questions/index.blade.php +++ b/resources/views/bo/faq-questions/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/faq-themes/index.blade.php b/resources/views/bo/faq-themes/index.blade.php index 5a8783f..91bbb4a 100644 --- a/resources/views/bo/faq-themes/index.blade.php +++ b/resources/views/bo/faq-themes/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/gain-views/index.blade.php b/resources/views/bo/gain-views/index.blade.php index 1044d41..14a446a 100644 --- a/resources/views/bo/gain-views/index.blade.php +++ b/resources/views/bo/gain-views/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/instant-win/index.blade.php b/resources/views/bo/instant-win/index.blade.php index 5a53325..c1b19cd 100644 --- a/resources/views/bo/instant-win/index.blade.php +++ b/resources/views/bo/instant-win/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/layout.blade.php b/resources/views/bo/layout.blade.php new file mode 100644 index 0000000..059e162 --- /dev/null +++ b/resources/views/bo/layout.blade.php @@ -0,0 +1,59 @@ + + + + @include('bo.layouts.head') + + +
+ + +
+
+
+ @auth +
+ @include('bo.layouts.nav-menu') +
+ @endguest +
+ @include('modules.flash-messages') + @yield('content') +
+
+
+
+
+ + @stack('scripts') + + diff --git a/resources/views/bo/layouts/head.blade.php b/resources/views/bo/layouts/head.blade.php new file mode 100644 index 0000000..eb681f6 --- /dev/null +++ b/resources/views/bo/layouts/head.blade.php @@ -0,0 +1,21 @@ + + + + + + +{{ config('app.name', 'Laravel') }} + + +{{-- TODO : Ajouter jQuery dans app.js --}} + +{{-- TODO : Voir l'inclusion de Font Awesome, pour le moment c'est fait avec mon compte FA --}} + + + + + + + + +@yield('styles') diff --git a/resources/views/bo/layouts/nav-menu.blade.php b/resources/views/bo/layouts/nav-menu.blade.php new file mode 100644 index 0000000..6e40233 --- /dev/null +++ b/resources/views/bo/layouts/nav-menu.blade.php @@ -0,0 +1,39 @@ + diff --git a/resources/views/bo/mails/job-failed.blade.php b/resources/views/bo/mails/job-failed.blade.php index ba1b050..51b2e1f 100644 --- a/resources/views/bo/mails/job-failed.blade.php +++ b/resources/views/bo/mails/job-failed.blade.php @@ -7,11 +7,11 @@ -

+

Job : {{ $job }}

- Exception : {{ $exception['message'] }}

+ Exception : {{ $exception['message'] }}

Trace :
{{ $exception['trace'] }} -

+

diff --git a/resources/views/bo/prizes/index.blade.php b/resources/views/bo/prizes/index.blade.php index d7b560a..1cc7f8b 100644 --- a/resources/views/bo/prizes/index.blade.php +++ b/resources/views/bo/prizes/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content') diff --git a/resources/views/bo/products/create.blade.php b/resources/views/bo/products/create.blade.php index f28cad0..f2eb397 100644 --- a/resources/views/bo/products/create.blade.php +++ b/resources/views/bo/products/create.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/products/edit.blade.php b/resources/views/bo/products/edit.blade.php index db5fa76..d4d9ce8 100644 --- a/resources/views/bo/products/edit.blade.php +++ b/resources/views/bo/products/edit.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/products/index.blade.php b/resources/views/bo/products/index.blade.php index bfb8cdb..426ea34 100644 --- a/resources/views/bo/products/index.blade.php +++ b/resources/views/bo/products/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/ranges/create.blade.php b/resources/views/bo/ranges/create.blade.php index 37dbb25..032f8b5 100644 --- a/resources/views/bo/ranges/create.blade.php +++ b/resources/views/bo/ranges/create.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/ranges/edit.blade.php b/resources/views/bo/ranges/edit.blade.php index 6a60b6b..ec3a032 100644 --- a/resources/views/bo/ranges/edit.blade.php +++ b/resources/views/bo/ranges/edit.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/ranges/index.blade.php b/resources/views/bo/ranges/index.blade.php index d48930f..f8a8103 100644 --- a/resources/views/bo/ranges/index.blade.php +++ b/resources/views/bo/ranges/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/settings/manage.blade.php b/resources/views/bo/settings/manage.blade.php index da1e4f6..2e10335 100644 --- a/resources/views/bo/settings/manage.blade.php +++ b/resources/views/bo/settings/manage.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/winners-list/arcadia.blade.php b/resources/views/bo/winners-list/arcadia.blade.php index f370aed..4e73077 100644 --- a/resources/views/bo/winners-list/arcadia.blade.php +++ b/resources/views/bo/winners-list/arcadia.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/bo/winners-list/index.blade.php b/resources/views/bo/winners-list/index.blade.php index f90156c..610daa8 100644 --- a/resources/views/bo/winners-list/index.blade.php +++ b/resources/views/bo/winners-list/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.bo') +@extends('bo.layout') @section('content')
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php deleted file mode 100644 index 9e795f4..0000000 --- a/resources/views/layouts/app.blade.php +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - {{ config('app.name', 'Laravel') }} - - - - - - - - - - - - -
- - -
- @yield('content') -
-
- - diff --git a/resources/views/layouts/bo.blade.php b/resources/views/layouts/bo.blade.php deleted file mode 100644 index c43b997..0000000 --- a/resources/views/layouts/bo.blade.php +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - {{ config('app.name', 'Laravel') }} - - - {{-- TODO : Ajouter jQuery dans app.js --}} - - {{-- TODO : Voir l'inclusion de Font Awesome, pour le moment c'est fait avec mon compte FA --}} - - - - - - - - - @yield('styles') - - -
- - -
-
-
- -
- @include('modules.flashMessage') - @yield('content') -
-
-
-
-
- - @stack('scripts') - - diff --git a/resources/views/modules/flashMessage.blade.php b/resources/views/modules/flash-messages.blade.php similarity index 100% rename from resources/views/modules/flashMessage.blade.php rename to resources/views/modules/flash-messages.blade.php diff --git a/routes/web-bo.php b/routes/web-bo.php index d77de7c..84420e9 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -14,66 +14,82 @@ use App\Http\Controllers\Bo\ProductsController; use App\Http\Controllers\Bo\RangeController; use App\Http\Controllers\Bo\SettingsController; use App\Http\Controllers\Bo\WinnersListController; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; // * BO Route::prefix('bo') -->name('bo.') -->middleware(['auth', 'is-admin', 'is-super-admin']) -->group(function () { - Route::get('/', [DashboardController::class, 'index']) - ->name('dashboard')->withoutMiddleware('is-super-admin'); - // Réglages. - Route::match(['get', 'put'], '/settings', [SettingsController::class, 'manage']) - ->name('settings'); - // Contenu. - Route::match(['get', 'put'], '/content/{id}', [ContentController::class, 'manage']) - ->name('content'); - // Pages liées au gains. - Route::get('/gain-views', [GainViewController::class, 'index']) - ->name('gain-views'); - Route::post('/ajax/delete-gain-views', [GainViewController::class, 'destroy']); - Route::post('/ajax/save-gain-views', [GainViewController::class, 'saveDatas']); - // Lots. - Route::get('/prizes', [PrizesController::class, 'index'])->name('prizes'); - Route::post('/ajax/delete-prize', [PrizesController::class, 'destroy']); - Route::post('/ajax/save-prizes', [PrizesController::class, 'saveDatas']); - // Instants gagnants. - Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); - Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); - // Codes EAN. - Route::get('/codes-ean', [CodesEANController::class, 'index']) - ->name('codes-ean')->withoutMiddleware('is-super-admin'); - Route::post('/ajax/delete-codes-ean', [CodesEANController::class, 'destroy']) - ->withoutMiddleware('is-super-admin'); - Route::post('/ajax/save-codes-ean', [CodesEANController::class, 'saveDatas']) - ->withoutMiddleware('is-super-admin'); - // IP Bannies. - Route::get('/banned-ip', [BannedIpController::class, 'index'])->name('banned-ip'); - Route::post('/ajax/delete-banned-ip', [BannedIpController::class, 'destroy']); - Route::post('/ajax/save-banned-ip', [BannedIpController::class, 'saveDatas']); - // FAQ - Thèmes. - Route::get('/faq-themes', [FaqThemesController::class, 'index'])->name('faq-themes'); - Route::post('/ajax/delete-faq-theme', [FaqThemesController::class, 'destroy']); - Route::post('/ajax/save-faq-theme', [FaqThemesController::class, 'saveDatas']); - // FAQ - Questions. - Route::get('/faq-questions', [FaqQuestionsController::class, 'index'])->name('faq-questions'); - Route::post('/ajax/delete-faq-question', [FaqQuestionsController::class, 'destroy']); - Route::post('/ajax/save-faq-question', [FaqQuestionsController::class, 'saveDatas']); - // Codes uniques. - Route::get('/codes', [CodesController::class, 'index'])->name('codes'); - Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); - Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); - Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); - // Liste des gagnants. - Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); - Route::get('/winners-list/arcadia/{id}', [WinnersListController::class, 'courrierArcadia']) - ->name('winners-arcadia'); - Route::post('/winners-list/arcadia/{id}/send', [WinnersListController::class, 'createCourrierArcadia']) - ->name('courrier-arcadia'); - // Produits porteurs. - Route::resource('products', ProductsController::class) - ->withoutMiddleware('is-super-admin'); - Route::resource('ranges', RangeController::class) - ->withoutMiddleware('is-super-admin'); -}); + ->name('bo.') + ->group(function () { + Route::namespace('\App\Http\Controllers\Bo') + ->group(function () { + Auth::routes( + [ + 'confirm' => false, + 'login' => true, + 'logout' => true, + 'register' => false, + 'reset' => false, + 'verify' => false, + ] + ); + }); + Route::middleware(['auth:backend', 'is-admin', 'is-super-admin']) + ->group(function () { + Route::get('/', [DashboardController::class, 'index']) + ->name('dashboard')->withoutMiddleware('is-super-admin'); + // Réglages. + Route::match(['get', 'put'], '/settings', [SettingsController::class, 'manage']) + ->name('settings'); + // Contenu. + Route::match(['get', 'put'], '/content/{id}', [ContentController::class, 'manage']) + ->name('content'); + // Pages liées au gains. + Route::get('/gain-views', [GainViewController::class, 'index']) + ->name('gain-views'); + Route::post('/ajax/delete-gain-views', [GainViewController::class, 'destroy']); + Route::post('/ajax/save-gain-views', [GainViewController::class, 'saveDatas']); + // Lots. + Route::get('/prizes', [PrizesController::class, 'index'])->name('prizes'); + Route::post('/ajax/delete-prize', [PrizesController::class, 'destroy']); + Route::post('/ajax/save-prizes', [PrizesController::class, 'saveDatas']); + // Instants gagnants. + Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); + Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); + // Codes EAN. + Route::get('/codes-ean', [CodesEANController::class, 'index']) + ->name('codes-ean')->withoutMiddleware('is-super-admin'); + Route::post('/ajax/delete-codes-ean', [CodesEANController::class, 'destroy']) + ->withoutMiddleware('is-super-admin'); + Route::post('/ajax/save-codes-ean', [CodesEANController::class, 'saveDatas']) + ->withoutMiddleware('is-super-admin'); + // IP Bannies. + Route::get('/banned-ip', [BannedIpController::class, 'index'])->name('banned-ip'); + Route::post('/ajax/delete-banned-ip', [BannedIpController::class, 'destroy']); + Route::post('/ajax/save-banned-ip', [BannedIpController::class, 'saveDatas']); + // FAQ - Thèmes. + Route::get('/faq-themes', [FaqThemesController::class, 'index'])->name('faq-themes'); + Route::post('/ajax/delete-faq-theme', [FaqThemesController::class, 'destroy']); + Route::post('/ajax/save-faq-theme', [FaqThemesController::class, 'saveDatas']); + // FAQ - Questions. + Route::get('/faq-questions', [FaqQuestionsController::class, 'index'])->name('faq-questions'); + Route::post('/ajax/delete-faq-question', [FaqQuestionsController::class, 'destroy']); + Route::post('/ajax/save-faq-question', [FaqQuestionsController::class, 'saveDatas']); + // Codes uniques. + Route::get('/codes', [CodesController::class, 'index'])->name('codes'); + Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); + Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); + Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); + // Liste des gagnants. + Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); + Route::get('/winners-list/arcadia/{id}', [WinnersListController::class, 'courrierArcadia']) + ->name('winners-arcadia'); + Route::post('/winners-list/arcadia/{id}/send', [WinnersListController::class, 'createCourrierArcadia']) + ->name('courrier-arcadia'); + // Produits porteurs. + Route::resource('products', ProductsController::class) + ->withoutMiddleware('is-super-admin'); + Route::resource('ranges', RangeController::class) + ->withoutMiddleware('is-super-admin'); + }); + }); diff --git a/routes/web.php b/routes/web.php index 3357169..b21e431 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,8 +14,18 @@ use App\Http\Controllers\ViewContentController; use App\Http\Controllers\WinningProofController; use Illuminate\Support\Facades\Route; -Route::group(['middleware' => ['game-date']], function () { - // Front. +Route::middleware('game-date')->group(function () { + // Routes nécessitant d'être connecté. + Route::middleware('auth:frontend')->group(function () { + Route::post('/logout', [LoginController::class, 'logout'])->name('logout'); + Route::get('/saisir-code', [EnterCodeController::class, 'index'])->name('saisir-code'); + Route::post('/saisir-code', [EnterCodeController::class, 'participate']) + ->name('participate'); + Route::put('/saisir-code', [EnterCodeController::class, 'formWinningProof']) + ->name('winning-proof'); + Route::put('/rejouer', [WinningProofController::class, 'sendWinningProof']) + ->name('send-winning-proof'); + }); Route::get('/', [HomeController::class, 'home'])->name('home'); Route::get('/reglement', [ViewContentController::class, 'reglement'])->name('reglement'); Route::get('/charte', [ViewContentController::class, 'charte'])->name('charte'); @@ -24,29 +34,18 @@ Route::group(['middleware' => ['game-date']], function () { Route::get('/comment-jouer', [HowToPlayController::class, 'index'])->name('comment-jouer'); Route::get('/les-gains', [GainsController::class, 'index'])->name('les-gains'); Route::get('/produits-porteurs', [ProduitsController::class, 'index'])->name('produits-porteurs'); + + // Authentification. + Route::get('/inscription', [RegisterController::class, 'index'])->name('inscription'); + Route::post('/inscription', [RegisterController::class, 'register'])->name('register'); Route::get('/confirmation-email/{verifyToken}', [LoginController::class, 'confirmEmail'])->name('confirm-email'); Route::get('/mot-de-passe-oublie', [LoginController::class, 'forgotPassword'])->name('forgot-password'); Route::get('/mot-de-passe-oublie/reset/{token}', [LoginController::class, 'forgotPasswordReset']) ->name('forgot-password-reset'); Route::put('/mail-mot-de-passe', [LoginController::class, 'mailPassword'])->name('mail-password'); Route::put('/change-mot-de-passe', [LoginController::class, 'changePassword'])->name('change-password'); - - // Front nécessitant d'être connecté. - Route::get('/saisir-code', [EnterCodeController::class, 'index'])->name('saisir-code')->middleware('auth'); - Route::post('/saisir-code', [EnterCodeController::class, 'participate']) - ->name('participate')->middleware('auth'); - Route::put('/saisir-code', [EnterCodeController::class, 'formWinningProof']) - ->name('winning-proof')->middleware('auth'); - Route::put('/rejouer', [WinningProofController::class, 'sendWinningProof']) - ->name('send-winning-proof')->middleware('auth'); - - // Authentification. - Route::post('/logout', [LoginController::class, 'logout'])->name('logout')->middleware('auth'); - Route::get('/inscription', [RegisterController::class, 'index'])->name('inscription'); - Route::post('/inscription', [RegisterController::class, 'register'])->name('register'); }); -// Login sans middleware pour la connexion admin, teaser et end pour ne pas redirigé en boucle. Route::get('/login', [LoginController::class, 'index'])->name('login'); Route::post('/login', [LoginController::class, 'authenticate'])->name('authenticate'); Route::get('/teaser', [TeaserController::class, 'index'])->name('teaser'); From a529367fba9405beca0e5a6930b8098a513a6aee Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Mon, 21 Aug 2023 10:22:07 +0200 Subject: [PATCH 002/145] Bump to laravel-10 --- .browserslistrc | 5 + .editorconfig | 10 +- .env.example | 41 +- .eslintrc.json | 55 + .gitattributes | 14 +- .gitignore | 15 +- .gitlab-ci.yml | 66 +- .styleci.yml | 13 - .stylelintrc.json | 48 + app/Console/Commands/TestMail.php | 36 + app/Enums/Users/RoleEnum.php | 35 +- app/Exceptions/Handler.php | 37 +- .../Bo/Auth/ResetPasswordController.php | 33 + app/Http/Controllers/Controller.php | 110 + app/Http/Kernel.php | 11 +- app/Http/Middleware/Authenticate.php | 3 +- .../Middleware/CheckForMaintenanceMode.php | 16 - app/Http/Middleware/EncryptCookies.php | 5 +- app/Http/Middleware/GameCheckDate.php | 7 +- app/Http/Middleware/HtmlSanitizer.php | 61 + .../PreventRequestsDuringMaintenance.php | 15 + .../Middleware/RedirectIfAuthenticated.php | 35 +- app/Http/Middleware/SecureHeaders.php | 103 + app/Http/Middleware/TrimStrings.php | 3 +- app/Http/Middleware/TrustHosts.php | 2 +- app/Http/Middleware/TrustProxies.php | 11 +- app/Http/Middleware/ValidateSignature.php | 15 + app/Http/Middleware/VerifyCsrfToken.php | 5 +- app/Http/Middleware/isAdmin.php | 3 +- app/Lib/Helpers/CollectionHelper.php | 64 + app/Lib/Helpers/ExceptionsHelper.php | 190 + app/Lib/Helpers/FileStorageHelper.php | 454 ++ app/Lib/Helpers/ToolboxHelper.php | 519 ++ app/Providers/AppServiceProvider.php | 50 +- app/Providers/AuthServiceProvider.php | 1 - app/Providers/EventServiceProvider.php | 19 + app/Providers/RouteServiceProvider.php | 74 +- app/Providers/TranslationServiceProvider.php | 78 + app/Providers/ViewServiceProvider.php | 57 + app/Traits/Controllers/.gitkeep | 0 app/Traits/Enums/BaseEnum.php | 259 + app/Traits/Models/IsCachedAsCollection.php | 103 + app/Traits/Models/MiniCrudModel.php | 180 + app/Traits/Requests/.gitkeep | 0 artisan | 2 +- composer.json | 90 +- composer.lock | 5698 ++++++++++++----- config/app.php | 48 +- config/breadcrumbs.php | 78 + config/broadcasting.php | 15 +- config/cache.php | 11 +- config/database.php | 8 +- config/exception-handler.php | 17 - config/filesystems.php | 12 + config/hashing.php | 6 +- config/logging.php | 76 +- config/mail.php | 16 +- config/purifier.php | 132 + config/queue.php | 22 +- config/sentry.php | 61 + config/services.php | 1 + config/session.php | 4 +- config/view.php | 2 + jsconfig.json | 3 + package.json | 97 +- phpcs.xml | 6 +- phpunit.xml | 26 +- resources/js/app.js | 46 - resources/js/bootstrap.js | 44 - resources/js/components/BannedIP.vue | 237 - resources/js/components/CodesEAN.vue | 240 - resources/js/components/FaqQuestions.vue | 159 - resources/js/components/FaqThemes.vue | 148 - resources/js/components/GainViews.vue | 115 - resources/js/components/InstantWin.vue | 85 - resources/js/components/Prizes.vue | 362 -- resources/js/components/WebCoupons.vue | 74 - resources/js/components/WinNotification.vue | 61 - resources/js/components/ckEditorComponent.vue | 252 - .../js/vendor/ckeditor/build/ckeditor.js | 6 +- .../js/vendor/ckeditor/build/ckeditor.js.map | 2 +- resources/js/vendor/ckeditor/build/styles.css | 49 + .../js/vendor/ckeditor/build/styles.css.map | 1 + .../vendor/ckeditor/build/translations/af.js | 2 +- .../vendor/ckeditor/build/translations/ar.js | 2 +- .../vendor/ckeditor/build/translations/ast.js | 2 +- .../vendor/ckeditor/build/translations/az.js | 2 +- .../vendor/ckeditor/build/translations/bg.js | 2 +- .../vendor/ckeditor/build/translations/bn.js | 2 +- .../vendor/ckeditor/build/translations/bs.js | 2 +- .../vendor/ckeditor/build/translations/ca.js | 2 +- .../vendor/ckeditor/build/translations/cs.js | 2 +- .../vendor/ckeditor/build/translations/da.js | 2 +- .../ckeditor/build/translations/de-ch.js | 2 +- .../vendor/ckeditor/build/translations/de.js | 2 +- .../vendor/ckeditor/build/translations/el.js | 2 +- .../ckeditor/build/translations/en-au.js | 2 +- .../ckeditor/build/translations/en-gb.js | 2 +- .../vendor/ckeditor/build/translations/en.js | 2 +- .../vendor/ckeditor/build/translations/eo.js | 2 +- .../ckeditor/build/translations/es-co.js | 1 + .../vendor/ckeditor/build/translations/es.js | 2 +- .../vendor/ckeditor/build/translations/et.js | 2 +- .../vendor/ckeditor/build/translations/eu.js | 2 +- .../vendor/ckeditor/build/translations/fa.js | 2 +- .../vendor/ckeditor/build/translations/fi.js | 2 +- .../vendor/ckeditor/build/translations/gl.js | 2 +- .../vendor/ckeditor/build/translations/gu.js | 2 +- .../vendor/ckeditor/build/translations/he.js | 2 +- .../vendor/ckeditor/build/translations/hi.js | 2 +- .../vendor/ckeditor/build/translations/hr.js | 2 +- .../vendor/ckeditor/build/translations/hu.js | 2 +- .../vendor/ckeditor/build/translations/id.js | 2 +- .../vendor/ckeditor/build/translations/it.js | 2 +- .../vendor/ckeditor/build/translations/ja.js | 2 +- .../vendor/ckeditor/build/translations/jv.js | 2 +- .../vendor/ckeditor/build/translations/km.js | 2 +- .../vendor/ckeditor/build/translations/kn.js | 2 +- .../vendor/ckeditor/build/translations/ko.js | 2 +- .../vendor/ckeditor/build/translations/ku.js | 2 +- .../vendor/ckeditor/build/translations/lt.js | 2 +- .../vendor/ckeditor/build/translations/lv.js | 2 +- .../vendor/ckeditor/build/translations/ms.js | 2 +- .../vendor/ckeditor/build/translations/nb.js | 2 +- .../vendor/ckeditor/build/translations/ne.js | 2 +- .../vendor/ckeditor/build/translations/nl.js | 2 +- .../vendor/ckeditor/build/translations/no.js | 2 +- .../vendor/ckeditor/build/translations/oc.js | 2 +- .../vendor/ckeditor/build/translations/pl.js | 2 +- .../ckeditor/build/translations/pt-br.js | 2 +- .../vendor/ckeditor/build/translations/pt.js | 2 +- .../vendor/ckeditor/build/translations/ro.js | 2 +- .../vendor/ckeditor/build/translations/ru.js | 2 +- .../vendor/ckeditor/build/translations/si.js | 2 +- .../vendor/ckeditor/build/translations/sk.js | 2 +- .../vendor/ckeditor/build/translations/sl.js | 2 +- .../vendor/ckeditor/build/translations/sq.js | 2 +- .../ckeditor/build/translations/sr-latn.js | 2 +- .../vendor/ckeditor/build/translations/sr.js | 2 +- .../vendor/ckeditor/build/translations/sv.js | 2 +- .../vendor/ckeditor/build/translations/th.js | 2 +- .../vendor/ckeditor/build/translations/tk.js | 2 +- .../vendor/ckeditor/build/translations/tr.js | 2 +- .../vendor/ckeditor/build/translations/tt.js | 2 +- .../vendor/ckeditor/build/translations/ug.js | 2 +- .../vendor/ckeditor/build/translations/uk.js | 2 +- .../vendor/ckeditor/build/translations/ur.js | 2 +- .../vendor/ckeditor/build/translations/uz.js | 2 +- .../vendor/ckeditor/build/translations/vi.js | 2 +- .../ckeditor/build/translations/zh-cn.js | 2 +- .../vendor/ckeditor/build/translations/zh.js | 2 +- .../ckeditor/github/ckeditor5-fullscreen | 1 - resources/js/vendor/ckeditor/package.json | 70 +- resources/js/vendor/ckeditor/src/ckeditor.js | 181 +- .../js/vendor/ckeditor/webpack.config.js | 154 +- resources/lang/fr/auth.php | 19 +- resources/lang/fr/crud.php | 94 + resources/lang/fr/enums.php | 3 + resources/lang/fr/models.php | 5 + resources/lang/fr/validation.php | 126 +- resources/lang/fr/vue.php | 30 + resources/sass/app.scss | 13 - resources/sass/app_custom.scss | 59 - resources/sass/{ => bo}/_variables.scss | 2 +- .../sass/bo/base/_bootstrap-overload.scss | 4 + resources/sass/bo/base/_common.scss | 115 + resources/sass/bo/base/_fonts.scss | 2 + resources/sass/bo/bo.scss | 15 + resources/sass/bo/pages/.gitkeep | 0 resources/sass/bo/partials/.gitkeep | 0 .../sass/bo/utilities/_bootstrap-custom.scss | 44 + .../bo/utilities/_bootstrap-variables.scss | 24 + resources/sass/bo/utilities/_mixins.scss | 54 + resources/sass/bo/utilities/_variables.scss | 17 + resources/sass/bo/vendor/_bootstrap.scss | 43 + resources/sass/bo/vendor/_fancybox.scss | 3 + resources/ts/bo.ts | 16 + resources/ts/bo/common.ts | 0 .../BelongsToManyDropdownComponent.vue | 252 + .../ts/bo/components/CkEditorComponent.vue | 352 + .../ts/bo/components/ImageInputComponent.vue | 962 +++ .../bo/components/InputTextAutoComponent.vue | 108 + .../ts/bo/components/InstantWinComponent.vue | 156 + .../ts/bo/components/WebCouponsComponent.vue | 147 + .../ts/bo/components/WinNotification.vue | 108 + .../ts/bo/components/WordCounterComponent.vue | 139 + resources/ts/bo/components/shims-vue.d.ts | 6 + resources/ts/bo/vue-bo.ts | 54 + resources/ts/index.d.ts | 87 + resources/ts/libs/.gitkeep | 0 resources/ts/modules/asset.ts | 7 + resources/ts/modules/bsTooltips.ts | 26 + .../ts/modules/parseLaravelErrorMessages.ts | 53 + resources/ts/modules/route.ts | 97 + resources/ts/modules/sweetalert.ts | 110 + resources/ts/modules/sweetalertConfirm.ts | 94 + resources/ts/modules/toast.ts | 35 + resources/ts/modules/trans.ts | 49 + .../types/@sipec/vue3-tags-input/index.d.ts | 49 + resources/ts/utilities/bootstrap.ts | 21 + resources/ts/utilities/fontawesome.ts | 75 + resources/views/bo/banned-ip/index.blade.php | 3 +- resources/views/bo/codes-ean/index.blade.php | 3 +- .../views/bo/faq-questions/index.blade.php | 8 +- resources/views/bo/faq-themes/index.blade.php | 3 +- resources/views/bo/gain-views/index.blade.php | 8 +- .../views/bo/instant-win/index.blade.php | 8 +- resources/views/bo/layout.blade.php | 116 +- resources/views/bo/layouts/head.blade.php | 44 +- resources/views/bo/layouts/nav-menu.blade.php | 176 +- .../views/bo/modules/pagination.blade.php | 140 + .../inputs/bigint-foreign-id.blade.php | 15 + .../views/bo/partials/inputs/date.blade.php | 15 + .../bo/partials/inputs/int-color.blade.php | 71 + .../bo/partials/inputs/int-number.blade.php | 44 + .../inputs/pivot-belongsToMany.blade.php | 21 + .../partials/inputs/publish-dates.blade.php | 16 + .../search-belongs-to-dropdown.blade.php | 28 + .../inputs/select-multiple-enum.blade.php | 16 + .../bo/partials/inputs/text-html.blade.php | 20 + .../partials/inputs/text-list-items.blade.php | 31 + .../inputs/timestamp-datetime.blade.php | 15 + .../partials/inputs/tinyint-boolean.blade.php | 14 + .../bo/partials/inputs/tinyint-enum.blade.php | 15 + .../inputs/varchar-multiline.blade.php | 27 + .../partials/inputs/varchar-picture.blade.php | 15 + .../bo/partials/inputs/varchar.blade.php | 26 + resources/views/home.blade.php | 23 - .../breadcrumb/breadcrumb-body.blade.php | 10 + .../breadcrumb/breadcrumb-head.blade.php | 10 + .../breadcrumb/breadcurmb-layout.blade.php | 15 + .../views/modules/flash-messages.blade.php | 43 +- resources/views/modules/input-error.blade.php | 8 + .../modules/minicrud-form-inputs.blade.php | 8 + resources/views/modules/pagination.blade.php | 60 + .../views/modules/script-constants.blade.php | 8 + .../views/modules/script-routes.blade.php | 6 + resources/views/modules/search-bar.blade.php | 46 + .../views/modules/table-col-sorter.blade.php | 63 + resources/views/vendor/errors/400.blade.php | 5 + resources/views/vendor/errors/401.blade.php | 5 + resources/views/vendor/errors/403.blade.php | 13 + resources/views/vendor/errors/404.blade.php | 13 + resources/views/vendor/errors/419.blade.php | 15 + resources/views/vendor/errors/429.blade.php | 5 + resources/views/vendor/errors/500.blade.php | 5 + resources/views/vendor/errors/503.blade.php | 11 + .../errors/illustrated-layout.blade.php | 48 + .../views/vendor/errors/minimal.blade.php | 29 + .../views/vendor/mail/html/header.blade.php | 13 + resources/views/welcome.blade.php | 100 - routes/api.php | 1 + routes/breadcrumbs-bo.php | 1 + routes/breadcrumbs-fo.php | 1 + routes/console.php | 18 - routes/web-fo.php | 57 + routes/web.php | 52 - server.php | 21 - tests/CreatesApplication.php | 21 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + tsconfig.json | 29 + webpack.mix.js | 40 + 264 files changed, 12505 insertions(+), 4630 deletions(-) create mode 100644 .browserslistrc create mode 100644 .eslintrc.json delete mode 100644 .styleci.yml create mode 100644 .stylelintrc.json create mode 100644 app/Console/Commands/TestMail.php create mode 100644 app/Http/Controllers/Bo/Auth/ResetPasswordController.php delete mode 100644 app/Http/Middleware/CheckForMaintenanceMode.php create mode 100644 app/Http/Middleware/HtmlSanitizer.php create mode 100644 app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Http/Middleware/SecureHeaders.php create mode 100644 app/Http/Middleware/ValidateSignature.php create mode 100644 app/Lib/Helpers/CollectionHelper.php create mode 100644 app/Lib/Helpers/ExceptionsHelper.php create mode 100644 app/Lib/Helpers/FileStorageHelper.php create mode 100644 app/Lib/Helpers/ToolboxHelper.php create mode 100644 app/Providers/TranslationServiceProvider.php create mode 100644 app/Providers/ViewServiceProvider.php create mode 100644 app/Traits/Controllers/.gitkeep create mode 100644 app/Traits/Enums/BaseEnum.php create mode 100644 app/Traits/Models/IsCachedAsCollection.php create mode 100644 app/Traits/Models/MiniCrudModel.php create mode 100644 app/Traits/Requests/.gitkeep create mode 100644 config/breadcrumbs.php delete mode 100644 config/exception-handler.php create mode 100644 config/purifier.php create mode 100644 config/sentry.php create mode 100644 jsconfig.json delete mode 100644 resources/js/app.js delete mode 100644 resources/js/bootstrap.js delete mode 100644 resources/js/components/BannedIP.vue delete mode 100644 resources/js/components/CodesEAN.vue delete mode 100644 resources/js/components/FaqQuestions.vue delete mode 100644 resources/js/components/FaqThemes.vue delete mode 100644 resources/js/components/GainViews.vue delete mode 100644 resources/js/components/InstantWin.vue delete mode 100644 resources/js/components/Prizes.vue delete mode 100644 resources/js/components/WebCoupons.vue delete mode 100644 resources/js/components/WinNotification.vue delete mode 100644 resources/js/components/ckEditorComponent.vue create mode 100644 resources/js/vendor/ckeditor/build/styles.css create mode 100644 resources/js/vendor/ckeditor/build/styles.css.map create mode 100644 resources/js/vendor/ckeditor/build/translations/es-co.js delete mode 160000 resources/js/vendor/ckeditor/github/ckeditor5-fullscreen create mode 100644 resources/lang/fr/crud.php create mode 100644 resources/lang/fr/enums.php create mode 100644 resources/lang/fr/models.php create mode 100644 resources/lang/fr/vue.php delete mode 100644 resources/sass/app.scss delete mode 100644 resources/sass/app_custom.scss rename resources/sass/{ => bo}/_variables.scss (85%) create mode 100644 resources/sass/bo/base/_bootstrap-overload.scss create mode 100644 resources/sass/bo/base/_common.scss create mode 100644 resources/sass/bo/base/_fonts.scss create mode 100644 resources/sass/bo/bo.scss create mode 100644 resources/sass/bo/pages/.gitkeep create mode 100644 resources/sass/bo/partials/.gitkeep create mode 100644 resources/sass/bo/utilities/_bootstrap-custom.scss create mode 100644 resources/sass/bo/utilities/_bootstrap-variables.scss create mode 100644 resources/sass/bo/utilities/_mixins.scss create mode 100644 resources/sass/bo/utilities/_variables.scss create mode 100644 resources/sass/bo/vendor/_bootstrap.scss create mode 100644 resources/sass/bo/vendor/_fancybox.scss create mode 100644 resources/ts/bo.ts create mode 100644 resources/ts/bo/common.ts create mode 100644 resources/ts/bo/components/BelongsToManyDropdownComponent.vue create mode 100644 resources/ts/bo/components/CkEditorComponent.vue create mode 100644 resources/ts/bo/components/ImageInputComponent.vue create mode 100644 resources/ts/bo/components/InputTextAutoComponent.vue create mode 100644 resources/ts/bo/components/InstantWinComponent.vue create mode 100644 resources/ts/bo/components/WebCouponsComponent.vue create mode 100644 resources/ts/bo/components/WinNotification.vue create mode 100644 resources/ts/bo/components/WordCounterComponent.vue create mode 100644 resources/ts/bo/components/shims-vue.d.ts create mode 100644 resources/ts/bo/vue-bo.ts create mode 100644 resources/ts/index.d.ts create mode 100644 resources/ts/libs/.gitkeep create mode 100644 resources/ts/modules/asset.ts create mode 100644 resources/ts/modules/bsTooltips.ts create mode 100644 resources/ts/modules/parseLaravelErrorMessages.ts create mode 100644 resources/ts/modules/route.ts create mode 100644 resources/ts/modules/sweetalert.ts create mode 100644 resources/ts/modules/sweetalertConfirm.ts create mode 100644 resources/ts/modules/toast.ts create mode 100644 resources/ts/modules/trans.ts create mode 100644 resources/ts/types/@sipec/vue3-tags-input/index.d.ts create mode 100644 resources/ts/utilities/bootstrap.ts create mode 100644 resources/ts/utilities/fontawesome.ts create mode 100644 resources/views/bo/modules/pagination.blade.php create mode 100644 resources/views/bo/partials/inputs/bigint-foreign-id.blade.php create mode 100644 resources/views/bo/partials/inputs/date.blade.php create mode 100644 resources/views/bo/partials/inputs/int-color.blade.php create mode 100644 resources/views/bo/partials/inputs/int-number.blade.php create mode 100644 resources/views/bo/partials/inputs/pivot-belongsToMany.blade.php create mode 100644 resources/views/bo/partials/inputs/publish-dates.blade.php create mode 100644 resources/views/bo/partials/inputs/search-belongs-to-dropdown.blade.php create mode 100644 resources/views/bo/partials/inputs/select-multiple-enum.blade.php create mode 100644 resources/views/bo/partials/inputs/text-html.blade.php create mode 100644 resources/views/bo/partials/inputs/text-list-items.blade.php create mode 100644 resources/views/bo/partials/inputs/timestamp-datetime.blade.php create mode 100644 resources/views/bo/partials/inputs/tinyint-boolean.blade.php create mode 100644 resources/views/bo/partials/inputs/tinyint-enum.blade.php create mode 100644 resources/views/bo/partials/inputs/varchar-multiline.blade.php create mode 100644 resources/views/bo/partials/inputs/varchar-picture.blade.php create mode 100644 resources/views/bo/partials/inputs/varchar.blade.php delete mode 100644 resources/views/home.blade.php create mode 100644 resources/views/modules/breadcrumb/breadcrumb-body.blade.php create mode 100644 resources/views/modules/breadcrumb/breadcrumb-head.blade.php create mode 100644 resources/views/modules/breadcrumb/breadcurmb-layout.blade.php create mode 100644 resources/views/modules/input-error.blade.php create mode 100644 resources/views/modules/minicrud-form-inputs.blade.php create mode 100644 resources/views/modules/pagination.blade.php create mode 100644 resources/views/modules/script-constants.blade.php create mode 100644 resources/views/modules/script-routes.blade.php create mode 100644 resources/views/modules/search-bar.blade.php create mode 100644 resources/views/modules/table-col-sorter.blade.php create mode 100644 resources/views/vendor/errors/400.blade.php create mode 100644 resources/views/vendor/errors/401.blade.php create mode 100644 resources/views/vendor/errors/403.blade.php create mode 100644 resources/views/vendor/errors/404.blade.php create mode 100644 resources/views/vendor/errors/419.blade.php create mode 100644 resources/views/vendor/errors/429.blade.php create mode 100644 resources/views/vendor/errors/500.blade.php create mode 100644 resources/views/vendor/errors/503.blade.php create mode 100644 resources/views/vendor/errors/illustrated-layout.blade.php create mode 100644 resources/views/vendor/errors/minimal.blade.php create mode 100644 resources/views/vendor/mail/html/header.blade.php delete mode 100644 resources/views/welcome.blade.php create mode 100644 routes/api.php create mode 100644 routes/breadcrumbs-bo.php create mode 100644 routes/breadcrumbs-fo.php create mode 100644 routes/web-fo.php delete mode 100644 routes/web.php delete mode 100644 server.php create mode 100644 tests/CreatesApplication.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 tsconfig.json create mode 100644 webpack.mix.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..f42fae3 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,5 @@ +# Browsers that we support + +last 3 version +> 0.3% +not dead # no browsers without security updates diff --git a/.editorconfig b/.editorconfig index 6537ca4..2e1b261 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,9 +3,9 @@ root = true [*] charset = utf-8 end_of_line = lf -insert_final_newline = true -indent_style = space indent_size = 4 +indent_style = space +insert_final_newline = true trim_trailing_whitespace = true [*.md] @@ -13,3 +13,9 @@ trim_trailing_whitespace = false [*.{yml,yaml}] indent_size = 2 + +[docker-compose.yml] +indent_size = 4 + +[*.vue] +indent_size = 2 diff --git a/.env.example b/.env.example index a2a3324..d47d429 100644 --- a/.env.example +++ b/.env.example @@ -5,20 +5,29 @@ APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug DB_CONNECTION=mysql -DB_HOST=dev-mariadb +DB_HOST=127.0.0.1 DB_PORT=3306 -DB_DATABASE= +DB_DATABASE=laravel DB_USERNAME=root -DB_PASSWORD=secret +DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file -QUEUE_CONNECTION=database +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + MAIL_MAILER=smtp MAIL_HOST=dev-mailhog MAIL_PORT=1025 @@ -29,9 +38,33 @@ MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" MAIL_ADMIN=equipe.web@ldc.fr +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +# Sentry +SENTRY_LARAVEL_DSN= + # CRM CRM_ENDPOINT= CRM_TOKEN= +CRM_PASSWORD= # MESBR MESBR_ENDPOINT= diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ecd6075 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,55 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:vue/vue3-strongly-recommended", + "@vue/eslint-config-typescript" + ], + "overrides": [ + { + "files": ["*.ts", "*.vue"], + "rules": { + "no-undef": "off" + } + }, + { + "files": ["*.vue"], + "rules": { + "indent": "off" + } + } + ], + "parser": "vue-eslint-parser", + "parserOptions": { + "parser": "@typescript-eslint/parser", + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["vue", "@typescript-eslint"], + "ignorePatterns": ["webpack.mix.js", "**/vendor/*.js", "**/vendor/**/*.js"], + "rules": { + "indent": ["error", 4, { "SwitchCase": 1 }], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + "vue/script-indent": ["error", 2, { "baseIndent": 0, "switchCase": 1 }], + "vue/one-component-per-file": "off" + }, + "settings": { + "import/resolver": { + "node": { + "extensions": [".js", ".vue", ".ts", ".d.ts"] + }, + "alias": { + "extensions": [".vue", ".js", ".ts", ".scss", ".d.ts"], + "map": [ + ["~", "./resources/assets"], + ["@", "./node_modules"] + ] + } + } + } +} diff --git a/.gitattributes b/.gitattributes index 967315d..fcb21d3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,11 @@ -* text=auto -*.css linguist-vendored -*.scss linguist-vendored -*.js linguist-vendored +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore index a1ceeb0..b3a1c35 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ mix-manifest.json /resources/views/front/basic .env .env.dev -.env.prod +.env.production .env.backup .phpunit.result.cache Homestead.json @@ -26,7 +26,16 @@ package-lock.json composer.lock resources/front resources/js/basic.js -.vscode +/.vscode storage README.txt -webpack.mix.js +vite.config.ts +.stylelintcache +/.fleet +/.idea +/.phpunit.cache +/public/build +/public/cache +/public/sitemap.xml +auth.json +docker-compose.override.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9452827..219a6c1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,46 +1,24 @@ -image: $CI_REGISTRY/service-web-lab/ldc-web-images-docker/ldcweb-qa:php7.3-1.0 +include: + - project: 'ldc-web/shared-ci' + ref: 'main' + file: 'lint/lint.yml' + - project: 'ldc-web/shared-ci' + ref: 'main' + file: 'security/security.yml' + - project: 'ldc-web/shared-ci' + ref: 'main' + file: 'build/build.yml' + - project: 'ldc-web/shared-ci' + ref: 'main' + file: 'test/test.yml' + - project: 'ldc-web/shared-ci' + ref: 'main' + file: 'deploy/deploy.yml' + stages: - - Security - - CodingStandards - -composer-security: - stage: Security - script: - - local-php-security-checker --format=json --path=./composer.lock > composer-security-checker-report.json - artifacts: - when: on_failure - expose_as: 'composer-security-checker' - paths: - - 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 config gitlab-token.gitlab.com $CI_DEPLOY_USER $CI_DEPLOY_PASSWORD - - composer install - cache: - paths: - - vendor/ - script: - - vendor/bin/phpcs --report=junit --report-file=phpcs-report.xml - artifacts: - when: on_failure - expose_as: 'phpcs' - paths: - - phpcs-report.xml - reports: - junit: phpcs-report.xml - allow_failure: false + - lint + - security + - build + - test + - deploy diff --git a/.styleci.yml b/.styleci.yml deleted file mode 100644 index 1db61d9..0000000 --- a/.styleci.yml +++ /dev/null @@ -1,13 +0,0 @@ -php: - preset: laravel - disabled: - - unused_use - finder: - not-name: - - index.php - - server.php -js: - finder: - not-name: - - webpack.mix.js -css: true diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000..99a7c07 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,48 @@ +{ + "extends": [ + "stylelint-config-standard-scss", + "stylelint-config-sass-guidelines", + "stylelint-config-idiomatic-order" + ], + "plugins": [ + "stylelint-scss" + ], + "files": [ + "**/*.css", + "**/*.scss" + ], + "ignoreFiles": [ + "**/vendor/*.css", + "**/vendor/**/*.css", + "**/vendor/*.scss", + "**/vendor/**/*.scss", + "**/vendor/*.sass", + "**/vendor/**/*.sass", + "**/vendor/*.less", + "**/vendor/**/*.less" + ], + "customSyntax": "postcss-scss", + "rules": { + "indentation": 4, + "string-quotes": "double", + "selector-max-id": null, + "color-no-invalid-hex": true, + "order/properties-alphabetical-order": null, + "max-nesting-depth": 5, + "selector-max-compound-selectors": 5, + "declaration-colon-space-after": "always-single-line", + "function-parentheses-space-inside": "never-single-line", + "declaration-colon-newline-after": null, + "value-list-comma-newline-after": null, + "scss/double-slash-comment-empty-line-before": [ + "always", + { + "ignore": [ + "between-comments", + "stylelint-commands", + "inside-block" + ] + } + ] + } +} diff --git a/app/Console/Commands/TestMail.php b/app/Console/Commands/TestMail.php new file mode 100644 index 0000000..ae0936b --- /dev/null +++ b/app/Console/Commands/TestMail.php @@ -0,0 +1,36 @@ +to('equipe.web@ldc.fr')->subject('Test Email'); + }); + return 0; + } +} diff --git a/app/Enums/Users/RoleEnum.php b/app/Enums/Users/RoleEnum.php index 64525de..d5af04a 100644 --- a/app/Enums/Users/RoleEnum.php +++ b/app/Enums/Users/RoleEnum.php @@ -2,33 +2,20 @@ namespace App\Enums\Users; -use Kwaadpepper\Enum\BaseEnumRoutable; +use App\Traits\Enums\BaseEnum; -/** - * @method static self conceptor() - * @method static self admin() - */ -class RoleEnum extends BaseEnumRoutable +enum RoleEnum: int { - /** - * @return array - */ - protected static function values(): array - { - return [ - 'conceptor' => 1, - 'admin' => 2, - ]; - } + use BaseEnum; + + case conceptor = 1; + case admin = 2; /** - * @return array + * Optionnal labels definition */ - protected static function labels(): array - { - return [ - 'conceptor' => trans('Concepteur'), - 'admin' => trans('Administrator'), - ]; - } + private const LABELS = [ + self::conceptor->name => 'Concepteur', + self::admin->name => 'Administrator', + ]; } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index bf6a0bd..220b3d7 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,26 +2,47 @@ namespace App\Exceptions; -use Kwaadpepper\ExceptionHandler\Exceptions\ExceptionHandler; +use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Throwable; class Handler extends ExceptionHandler { /** - * A list of the exception types that are not reported. + * A list of exception types with their corresponding custom log levels. * - * @var array + * @var array, \Psr\Log\LogLevel::*> */ - protected $dontReport = [ - RedirectTo::class - ]; + protected $levels = []; /** - * A list of the inputs that are never flashed for validation exceptions. + * A list of the exception types that are not reported. * - * @var array + * @var array> + */ + protected $dontReport = []; + + /** + * A list of the inputs that are never flashed to the session on validation exceptions. + * + * @var array */ protected $dontFlash = [ + 'current_password', 'password', 'password_confirmation', ]; + + /** + * Register the exception handling callbacks for the application. + * + * @return void + */ + public function register() + { + $this->reportable(function (Throwable $e) { + if (app()->bound('sentry')) { + app('sentry')->captureException($e); + } + }); + } } diff --git a/app/Http/Controllers/Bo/Auth/ResetPasswordController.php b/app/Http/Controllers/Bo/Auth/ResetPasswordController.php new file mode 100644 index 0000000..03340fc --- /dev/null +++ b/app/Http/Controllers/Bo/Auth/ResetPasswordController.php @@ -0,0 +1,33 @@ +where(function ($query) use ($searchQuery, $words, $search, $fields) { + foreach ($words as $word) { + if (!strlen($word)) { + continue; + } + $this->searchOnFields($query, $word, $fields); + } //end foreach + // Search whole using whole sentence. + $this->searchOnFields($query, $search, $fields); + if ($searchQuery) { + $searchQuery($query); + } + }); + } //end if + return $query; + } + + /** + * Build query search on all fields + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $search + * @param array $fields + * @return \Illuminate\Database\Eloquent\Builder + */ + private function searchOnFields(Builder $query, string $search, array $fields): Builder + { + $table = $query->getModel()->getTable(); + foreach ($fields as $f) { + $f = str_replace('?', '\?', $f); + if (is_array($f)) { + $query->orWhereRaw( + sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($f)->map(function ($q) use ($table) { + return "`$table`.`$q`"; + })->implode(', \' \', ')), + ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] + ); + } else { + $query->orWhereRaw( + "UPPER(`$table`.`$f`) LIKE UPPER(?)", + ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] + ); + } + } + return $query; + } + + /** + * Sort columns with a query + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $ignore + * @return \Illuminate\Database\Eloquent\Builder + */ + protected function sortQuery(Builder $query, array $ignore = []): Builder + { + $rName = request()->route()->getName(); + $table = $query->getModel()->getTable(); + if (request()->sort_col) { + Session::put("$rName.sort_col", request()->sort_col); + Session::put("$rName.sorted", true); + } + if (request()->sort_way) { + Session::put("$rName.sort_way", request()->sort_way); + Session::put("$rName.sorted", true); + } + if (request()->rst) { + Session::remove("$rName.sorted"); + Session::remove("$rName.sort_col"); + Session::remove("$rName.sort_way"); + } + if (request()->sort_col and request()->sort_way and Schema::hasColumn($table, request()->sort_col)) { + if ( + !isset($ignore) or + (isset($ignore) and !in_array(request()->sort_col, $ignore)) + ) { + $query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way); + } + } elseif (Schema::hasColumn($table, 'order')) { + $query = $query->orderBy('order', 'ASC'); + Session::put("$rName.sort_col", 'order'); + Session::put("$rName.sort_way", 'asc'); + } + return $query; + } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 9f9d0aa..9b3090c 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -14,9 +14,10 @@ class Kernel extends HttpKernel * @var array */ protected $middleware = [ + \App\Http\Middleware\TrustHosts::class, \App\Http\Middleware\TrustProxies::class, - \Fruitcake\Cors\HandleCors::class, - \App\Http\Middleware\CheckForMaintenanceMode::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, @@ -29,16 +30,18 @@ class Kernel extends HttpKernel */ protected $middlewareGroups = [ 'web' => [ + 'htmlsanitize', \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\SecureHeaders::class, ], 'api' => [ - 'throttle:60,1', + \Illuminate\Routing\Middleware\ThrottleRequests::class . ':api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; @@ -53,6 +56,7 @@ class Kernel extends HttpKernel protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, @@ -65,5 +69,6 @@ class Kernel extends HttpKernel 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'htmlsanitize' => \App\Http\Middleware\HtmlSanitizer::class, ]; } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index c458585..cc5ba2f 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; class Authenticate extends Middleware @@ -13,7 +14,7 @@ class Authenticate extends Middleware * @param \Illuminate\Http\Request $request * @return string|null */ - protected function redirectTo($request): ?string + protected function redirectTo(Request $request): ?string { $logins = [ 'backend' => route('bo.login') diff --git a/app/Http/Middleware/CheckForMaintenanceMode.php b/app/Http/Middleware/CheckForMaintenanceMode.php deleted file mode 100644 index 9037ddf..0000000 --- a/app/Http/Middleware/CheckForMaintenanceMode.php +++ /dev/null @@ -1,16 +0,0 @@ - */ - protected $except = [ - ]; + protected $except = []; } diff --git a/app/Http/Middleware/GameCheckDate.php b/app/Http/Middleware/GameCheckDate.php index 46520ae..38b4a99 100644 --- a/app/Http/Middleware/GameCheckDate.php +++ b/app/Http/Middleware/GameCheckDate.php @@ -4,6 +4,7 @@ namespace App\Http\Middleware; use App\Models\Settings; use Closure; +use Illuminate\Http\Request; class GameCheckDate { @@ -14,12 +15,12 @@ class GameCheckDate * @param \Closure $next * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { /** @var \App\Models\Settings $settings */ $settings = app(Settings::class); - // Check si le teaser est actif + // Check si le teaser est actif. if ($settings->start_date > now()) { if ($settings->activated_teaser === 1 && $settings->teaser_end_activity > now()) { return redirect()->route('teaser'); @@ -27,7 +28,7 @@ class GameCheckDate return redirect($settings->redirect_close); } - // Check si le jeu est terminé + // Check si le jeu est terminé. if ($settings->end_date < now()) { if ($settings->activated_close_page === 1 && $settings->close_page_active_date > now()) { return redirect()->route('end'); diff --git a/app/Http/Middleware/HtmlSanitizer.php b/app/Http/Middleware/HtmlSanitizer.php new file mode 100644 index 0000000..857ca84 --- /dev/null +++ b/app/Http/Middleware/HtmlSanitizer.php @@ -0,0 +1,61 @@ +all(); + /** @var callable|null */ + $cleanInput = null; + $cleanInput = function ( + null|string|array &$input, + string $name, + ?string $rootName = null + ) use ( + $params, + &$cleanInput + ): void { + // * Nested element array + if (is_array($input)) { + array_walk_recursive($input, $cleanInput, $name); + } + if (!is_string($input)) { + return; + } + if (in_array($name, $params) or in_array($rootName ?? $name, $params)) { + // ? Is a json input ? + if ($isJson = \json_decode($input, true) and is_array($isJson)) { + // ! Decode each json field recursive. + \array_walk_recursive($isJson, function (string|array &$item) { + if (\is_string($item)) { + $item = clean($item); + $item = ToolboxHelper::stripCkEditorSchemesOnMediaInputs($item); + } + }); + } else { + $input = clean($input); + $input = ToolboxHelper::stripCkEditorSchemesOnMediaInputs($input); + } + } else { + $input = strip_tags($input); + } + }; + \array_walk($inputs, $cleanInput); + $request->merge($inputs); + return $next($request); + } +} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000..842e4b9 --- /dev/null +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,15 @@ + + */ + protected $except = []; +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index c076008..51604d6 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,24 +2,41 @@ namespace App\Http\Middleware; -use App\Providers\RouteServiceProvider; -use Closure; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Symfony\Component\HttpFoundation\Response; class RedirectIfAuthenticated { /** * Handle an incoming request. * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @param string|null $guard - * @return mixed + * @param \Illuminate\Http\Request $request + * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next + * @param string|null ...$guards + * @return \Symfony\Component\HttpFoundation\Response + * @throws \RuntimeException If guard is unhandled. + * @phpcs:disable Squiz.Commenting.FunctionComment.IncorrectTypeHint */ - public function handle($request, Closure $next, $guard = null) + public function handle(Request $request, \Closure $next, ...$guards): Response { - if (Auth::guard($guard)->check()) { - return redirect(RouteServiceProvider::HOME); + // phpcs:enable phpcs:disable + $guards = empty($guards) ? [null] : $guards; + + foreach ($guards as $guard) { + if (Auth::guard($guard)->check()) { + switch ($guard) { + case 'frontend': + return \redirect()->route('home'); + case 'backend': + if (!$request->routeIs('bo.*')) { + continue; + } + return \redirect()->route('bo.dashboard'); + default: + throw new \RuntimeException("Unhandled guard `{$guard}` ."); + } + } } return $next($request); diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php new file mode 100644 index 0000000..8d77e62 --- /dev/null +++ b/app/Http/Middleware/SecureHeaders.php @@ -0,0 +1,103 @@ +removeUnwantedHeaders($this->unwantedHeaderList); + $response = $next($request); + $response->headers->set('Referrer-Policy', 'no-referrer-when-downgrade'); + $response->headers->set('X-Content-Type-Options', 'nosniff'); + $response->headers->set('X-XSS-Protection', '1; mode=block'); + $response->headers->set('X-Frame-Options', 'SAMEORIGIN'); + $response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains;'); + $cspPolicies = [ + "default-src 'none';", + "manifest-src 'self';", + // * CKEDITOR Specific https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/csp.html + "connect-src 'self' blob:;", + "img-src * data: blob:;", + 'frame-src ' . implode(' ', [ + 'https://www.google.com/recaptcha/', + 'https://recaptcha.google.com/recaptcha/', + 'https://www.google.com/maps/' + ]) . ';', + "font-src 'self' data: https://fonts.gstatic.com;", + // ! Using CKEditor will must have unsafe-inline style + // phpcs:ignore Generic.Files.LineLength.TooLong + "style-src 'self' 'unsafe-inline' " . \implode(' ', [ + 'https://cdnjs.cloudflare.com', + // * File Manager + 'https://fonts.googleapis.com', + 'https://cdn.jsdelivr.net', + 'https://use.fontawesome.com', + 'https://fonts.googleapis.com' + ]) . ';', + // ! If you dont use ckeditor use this + // "style-src 'self' 'nonce-$nonce';", + // phpcs:ignore Generic.Files.LineLength.TooLong + "script-src 'self' {$jsDev} " . \implode(' ', [ + 'https: blob:', + 'https://www.googletagmanager.com', + 'https://cdnjs.cloudflare.com', + "$scheme://www.google-analytics.com", + ]) . ';' + ]; + + $response->headers->set( + 'Content-Security-Policy', + implode(' ', $cspPolicies) . $reportUri + ); + $response->headers->set('Feature-Policy', 'fullscreen \'self\';'); + return $response; + } + + /** + * Remove unwanted headers + * + * @param array $headerList + * @return void + */ + private function removeUnwantedHeaders(array $headerList) + { + foreach ($headerList as $header) { + header_remove($header); + } + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php index 5a50e7b..88cadca 100644 --- a/app/Http/Middleware/TrimStrings.php +++ b/app/Http/Middleware/TrimStrings.php @@ -9,9 +9,10 @@ class TrimStrings extends Middleware /** * The names of the attributes that should not be trimmed. * - * @var array + * @var array */ protected $except = [ + 'current_password', 'password', 'password_confirmation', ]; diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php index b0550cf..7186414 100644 --- a/app/Http/Middleware/TrustHosts.php +++ b/app/Http/Middleware/TrustHosts.php @@ -9,7 +9,7 @@ class TrustHosts extends Middleware /** * Get the host patterns that should be trusted. * - * @return array + * @return array */ public function hosts() { diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 03b7890..d727add 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -2,7 +2,7 @@ namespace App\Http\Middleware; -use Fideloper\Proxy\TrustProxies as Middleware; +use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware @@ -10,7 +10,7 @@ class TrustProxies extends Middleware /** * The trusted proxies for this application. * - * @var array|string|null + * @var array|string|null */ protected $proxies; @@ -19,5 +19,10 @@ class TrustProxies extends Middleware * * @var integer */ - protected $headers = Request::HEADER_X_FORWARDED_ALL; + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; } diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 0000000..83aa732 --- /dev/null +++ b/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,15 @@ + + */ + protected $except = []; +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index ed591f2..61356d0 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -9,8 +9,9 @@ class VerifyCsrfToken extends Middleware /** * The URIs that should be excluded from CSRF verification. * - * @var array + * @var array */ protected $except = [ - ]; + '/csp-report' + ]; } diff --git a/app/Http/Middleware/isAdmin.php b/app/Http/Middleware/isAdmin.php index f038fd9..3786da6 100644 --- a/app/Http/Middleware/isAdmin.php +++ b/app/Http/Middleware/isAdmin.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class isAdmin @@ -14,7 +15,7 @@ class isAdmin * @param \Closure $next * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { $role = Auth::user()->role; if ($role === 1 || $role === 2) { diff --git a/app/Lib/Helpers/CollectionHelper.php b/app/Lib/Helpers/CollectionHelper.php new file mode 100644 index 0000000..a665a2f --- /dev/null +++ b/app/Lib/Helpers/CollectionHelper.php @@ -0,0 +1,64 @@ +count(); + + return self::paginator($results->forPage($page, $pageSize), $total, $pageSize, $page, [ + 'path' => Paginator::resolveCurrentPath(), + 'pageName' => 'page', + ]); + } + + /** + * Create a new length-aware paginator instance. + * + * @param \Illuminate\Support\Collection $items + * @param integer $total + * @param integer $perPage + * @param integer $currentPage + * @param array $options + * @return \Illuminate\Pagination\LengthAwarePaginator + */ + protected static function paginator(Collection $items, int $total, int $perPage, int $currentPage, array $options) + { + return Container::getInstance()->makeWith(LengthAwarePaginator::class, [ + 'items' => $items, + 'total' => $total, + 'perPage' => $perPage, + 'currentPage' => $currentPage, + 'options' => $options + ]); + } +} diff --git a/app/Lib/Helpers/ExceptionsHelper.php b/app/Lib/Helpers/ExceptionsHelper.php new file mode 100644 index 0000000..4813275 --- /dev/null +++ b/app/Lib/Helpers/ExceptionsHelper.php @@ -0,0 +1,190 @@ +setModules([]); + $event->setOsContext(null); + + /** @var \Sentry\ExceptionDataBag[] */ + $exceptionBag = []; + foreach ($event->getExceptions() as $exceptionDataBag) { + $exceptionBag[] = self::getAnonymizedSentryException($exceptionDataBag); + } + $event->setExceptions($exceptionBag); + return $event; + } + + /** + * Anonimize Sentry Exception bag + * + * @param \Sentry\ExceptionDataBag $exceptionDataBag + * @return \Sentry\ExceptionDataBag + */ + private static function getAnonymizedSentryException( + \Sentry\ExceptionDataBag $exceptionDataBag + ): \Sentry\ExceptionDataBag { + $exceptionDataBag->setValue(self::getAnonymizedMessage($exceptionDataBag->getValue())); + if ($stackTrace = $exceptionDataBag->getStacktrace()) { + $exceptionDataBag->setStacktrace(self::getAnonymizedSentryStackTrace($stackTrace)); + } + return $exceptionDataBag; + } + + /** + * Anonymise sentry stacktrace + * + * @param \Sentry\Stacktrace $stackTrace + * @return \Sentry\Stacktrace + */ + private static function getAnonymizedSentryStackTrace(\Sentry\Stacktrace $stackTrace): \Sentry\Stacktrace + { + /** @var \Sentry\Frame[] */ + $frames = \array_reverse($stackTrace->getFrames(), true); + $i = \count($frames) - 1; + // * Remove all but keep first (index.php). + while ($i-- > 0) { + $stackTrace->removeFrame(count($stackTrace->getFrames()) - 1); + } + foreach ($frames as $index => $frame) { + $frame->setPostContext([]); + $frame->setPreContext([]); + $frame->setContextLine(''); + $frame->setVars(self::getAnonymizedSentryParams($frame->getVars())); + $stackTrace->addFrame($frame); + if ($index === 0) { + $stackTrace->removeFrame(count($stackTrace->getFrames()) - 1); + } + } + return $stackTrace; + } + + /** + * Get anonymized sentry params + * + * @param mixed[] $params + * @return string[] + */ + private static function getAnonymizedSentryParams(array $params): array + { + foreach ($params as &$param) { + $type = \strtolower(\gettype($param)); + if (\is_string($param)) { + $type = \explode(' ', \trim(strtolower($param)))[0] ?? null; + } + switch (true) { + case $type === 'lambda': + case $type === 'object': + continue 2; + case $type === 'array' and \is_array($param): + $param = sprintf('Array(%d)', \count($param)); + continue 2; + default: + if (\is_numeric($param)) { + $param = \ucfirst($type); + continue 2; + } + if (\is_string($param)) { + $param = sprintf('String(%d)', \strlen($param)); + continue 2; + } + } //end switch + } //end foreach + return $params; + } + + + /** + * Anonymize at least Sql queries + * + * @param string $message + * @return string + */ + public static function getAnonymizedMessage(string $message): string + { + $message = \preg_replace('/^(.*)( \(SQL:.*\))$/', '$1', $message) ?? $message; + if ($sqlPos = \strpos($message, 'to use near')) { + $message = \mb_strcut($message, 0, $sqlPos); + } + return $message; + } + + /** + * Anonymize stack trace + * + * @param \Throwable $e + * @return string + */ + public static function getAnonymizedStackTrace(\Throwable $e): string + { + $projectPath = \realpath(\sprintf('%s/../', \app_path())); + $traceStack = $e->getTrace(); + $traceStr = ''; + $maxStackStage = 0; + foreach ($traceStack as $stackStage => $stack) { + $maxStackStage = $stackStage; + $traceStr .= \sprintf( + '#%s %s(%d): ', + $stackStage, + str_replace($projectPath, '', $stack['file'] ?? ''), + $stack['line'] ?? '' + ); + if (isset($stack['class'])) { + $traceStr .= "{$stack['class']}->{$stack['function']}("; + if (isset($stack['args'])) { + $traceStr .= self::handleArgs($stack); + } + $traceStr .= ")\n"; + } elseif (isset($stack['function'])) { + $traceStr .= "{$stack['function']}("; + if (isset($stack['args'])) { + $traceStr .= self::handleArgs($stack); + } + $traceStr .= ")\n"; + } + } //end foreach + $maxStackStage++; + $traceStr .= "#$maxStackStage {main}"; + return $traceStr; + } + + /** + * Handle Args + * + * @param array $stack + * @return string + */ + public static function handleArgs(array $stack): string + { + $traceArgs = ''; + $argsCount = count($stack['args']); + for ($i = 0; $i < $argsCount; $i++) { + $type = \gettype($stack['args'][$i]); + switch ($type) { + case 'object': + $traceArgs .= sprintf('Object(%s)', \get_class($stack['args'][$i])); + break; + case 'array': + $traceArgs .= sprintf('Array(%d)', \count($stack['args'][$i])); + break; + case 'string': + $traceArgs .= sprintf('String(%d)', \strlen($stack['args'][$i])); + break; + default: + $traceArgs .= \gettype($stack['args'][$i]); + } + $traceArgs .= ($i !== ($argsCount - 1) ? ',' : ''); + } + return $traceArgs; + } +} diff --git a/app/Lib/Helpers/FileStorageHelper.php b/app/Lib/Helpers/FileStorageHelper.php new file mode 100644 index 0000000..45ccec9 --- /dev/null +++ b/app/Lib/Helpers/FileStorageHelper.php @@ -0,0 +1,454 @@ + + */ +class FileStorageHelper +{ + /** + * Destroy the file associate with the attribute. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $attribute + * @return void + */ + public static function removeFile(Model $model, string $attribute): void + { + $path = \ltrim(\urldecode($model->{$attribute}), '/'); + if (\strpos($path, 'storage') !== 0) { + return; + } + $path = ToolboxHelper::mbReplace('storage/', '', $path); + if (Storage::disk('public')->exists($path)) { + Storage::disk('public')->delete($path); + } + } + + /** + * Destroy the file associate with the attribute old value (before updated to DB). + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $attribute + * @param boolean $onlyIfUpdated + * @return void + */ + public static function removeOldFile(Model $model, string $attribute, bool $onlyIfUpdated = true): void + { + // * Ignore If removal has to be done only if the field has changed and it actually hasnt. + if ($onlyIfUpdated and $model->{$attribute} === ToolboxHelper::getOriginal($model, $attribute)) { + return; + } + $originalPath = \ltrim(\urldecode(ToolboxHelper::getOriginal($model, $attribute)), '/'); + if (\strpos($originalPath, 'storage') !== 0) { + return; + } + $originalPath = ToolboxHelper::mbReplace('storage/', '', $originalPath); + if (Storage::disk('public')->exists($originalPath)) { + Storage::disk('public')->delete($originalPath); + } + } + + /** + * Store a file using optimized storage strategy + * + * You can use filename param to overload file name. + * + * @param \Illuminate\Database\Eloquent\Model $model The model that will hold the picture. + * @param \Illuminate\Http\UploadedFile|\SplFileInfo|string $file The file, will just return itself is string. + * @param boolean $slugify Force filename slugification. + * @param string|null $filename This string may be used to store the file. + * @param boolean $private To store the file in a private space. + * @return string + * @throws \RuntimeException If file copy fails. + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh + */ + public static function storeFile( + Model $model, + $file, + bool $slugify = false, + string $filename = null, + bool $private = false + ): string { + // phpcs:enable + $tableName = $model->getTable(); + if (\is_object($file) and $file instanceof \Illuminate\Http\UploadedFile) { + /** @var \Illuminate\Http\UploadedFile $file */ + $filename = $filename ?: $file->getClientOriginalName(); + $filename = $slugify ? self::slugifyFileName($filename) : $filename; + $newPath = self::prepareMoveFile($tableName, $filename, $private); + $newPath = str_replace(storage_path('app'), '', $newPath); + + if (!$private) { + // * Store public file. + $file->storePubliclyAs( + pathinfo($newPath, \PATHINFO_DIRNAME), + pathinfo($newPath, \PATHINFO_BASENAME) + ); + return 'storage' . str_replace('/public', '', $newPath); + } + + $file->storeAs( + pathinfo($newPath, \PATHINFO_DIRNAME), + pathinfo($newPath, \PATHINFO_BASENAME) + ); + + return str_replace('/private/', '', $newPath); + }//end if + if (\is_object($file) and $file instanceof \SplFileInfo) { + /** @var \SplFileInfo $file */ + $filename = $filename ?: $file->getBaseName(); + $filename = $slugify ? self::slugifyFileName($filename) : $filename; + $newPath = self::prepareMoveFile($tableName, $filename, $private); + if (!File::copy($file->getRealPath(), $newPath)) { + throw new \RuntimeException(sprintf( + 'Failed to copy file %s to %s', + $file->getRealPath(), + $newPath + )); + } + return $private ? + \ltrim(str_replace(\storage_path('app/private'), '/storage/app/private', $newPath), '/') : + \ltrim(str_replace(\storage_path('app/public'), '/storage', $newPath), '/'); + } + return strval($file); + } + + /** + * Store all files from string attribute html + * If oldHtmlString is passed, a diff is done with new and old files + * to keep only files that are present in the new html string. + * + * @param \Illuminate\Database\Eloquent\Model $model The model that will hold the picture. + * @param string $htmlString The html string to parse and modify files. + * @param string|null $oldHtmlString The old html string with alreadyParsed + * files using storeModelFilesFromHtml. + * @return string Html with files pathes replaced using storage strategy. + */ + public static function storeModelFilesFromHtml( + Model $model, + string $htmlString, + string $oldHtmlString = null + ): string { + \collect(self::onlyUploadedFilesWithFileManager(self::findFilesInHtml($htmlString))) + ->each(function (string $path) use ($model, &$htmlString) { + /** @var \Illuminate\Filesystem\FilesystemAdapter */ + $disk = Storage::disk('uploads'); + $fileInfo = new \SplFileInfo($disk->path( + ToolboxHelper::mbReplace('/uploads/', '', \urldecode($path)) + )); + $htmlString = ToolboxHelper::mbReplace( + $path, + '/' . self::storeFile($model, $fileInfo, true), + $htmlString + ); + }); + + if ($oldHtmlString) { + self::removeOldModelFilesFromHtml($htmlString, $oldHtmlString); + } + + return $htmlString; + } + + /** + * Remove all old files from string attribute html that are stored in public that + * are nove present anymore on new html string + * + * @param string $newHtmlString The html string with alreadyParsed files using storeModelFilesFromHtml. + * @param string $oldHtmlString The old html string with alreadyParsed files using storeModelFilesFromHtml. + * @return void + */ + public static function removeOldModelFilesFromHtml(string $newHtmlString, string $oldHtmlString): void + { + self::removeOldFiles(self::findFilesInHtml($oldHtmlString), self::findFilesInHtml($newHtmlString)); + } + + /** + * Remove all old files that are stored in public that + * are not present anymore on new array files + * + * @param string[] $oldFiles The old array files. + * @param string[] $newFiles The new array files. + * @return void + */ + public static function removeOldFiles(array $oldFiles, array $newFiles): void + { + $oldFiles = \collect(self::onlyUploadedFilesWithFileStorageHelper($oldFiles)); + $filesToKeep = \collect(self::onlyUploadedFilesWithFileStorageHelper($newFiles)); + $filesToRemove = $oldFiles->diff($filesToKeep); + $filesToRemove->each(function (string $publicStorageFilePath) { + $path = ToolboxHelper::mbReplace('storage/', '', \ltrim(\urldecode($publicStorageFilePath), '/')); + if (Storage::disk('public')->exists($path)) { + Storage::disk('public')->delete($path); + } + }); + } + + /** + * Remove all files from string attribute html that are stored in public + * + * @param string $htmlString The html string with alreadyParsed files using storeModelFilesFromHtml. + * @return void + */ + public static function removeModelFilesOfHtml(string $htmlString): void + { + $filesToRemove = \collect(self::onlyUploadedFilesWithFileStorageHelper(self::findFilesInHtml($htmlString))); + $filesToRemove->each(function (string $publicStorageFilePath) { + $path = ToolboxHelper::mbReplace('storage/', '', \ltrim(\urldecode($publicStorageFilePath), '/')); + if (Storage::disk('public')->exists($path)) { + Storage::disk('public')->delete($path); + } + }); + } + + /** + * Find all occurence of files in html + * + * @param string $html + * @return array + */ + public static function findFilesInHtml(string $html): array + { + preg_match_all('/href="(?P.*)"|src="(?P.*)"|url="(?P.*)"/Um', $html, $m, PREG_SET_ORDER, 0); + return collect($m)->pluck('href')->filter() + ->concat(collect($m)->pluck('url')->filter()) + ->concat(collect($m)->pluck('src')->filter()) + ->all(); + } + + /** + * Filter array to get only uploaded files that exists + * on disk 'public' (using helper storage strategy) + * + * @param array $urls + * @return array + */ + public static function onlyUploadedFilesWithFileStorageHelper(array $urls): array + { + return \collect($urls)->unique() + // * Filter to get only /uploads and using app url or empty + ->filter(function (string $url) { + $path = \parse_url($url, \PHP_URL_PATH); + return \strpos(\ltrim($path, '/'), 'storage/modelfiles') === 0; + })->filter(function (string $url) { + $path = \parse_url($url, \PHP_URL_PATH); + return Storage::disk('public') + ->exists(ToolboxHelper::mbReplace('storage/', '', \ltrim(\urldecode($path), '/'))); + })->all(); + } + + /** + * Filter array to get only uploaded files that exists + * on disk 'uploads' + * + * @param array $urls + * @return array + */ + private static function onlyUploadedFilesWithFileManager(array $urls): array + { + return \collect($urls)->unique() + // * Filter to get only /uploads and using app url or empty + ->filter(function (string $url) { + $host = \parse_url($url, \PHP_URL_HOST); + $path = \parse_url($url, \PHP_URL_PATH); + return ($host === \parse_url(config('app.url'), PHP_URL_HOST) or \is_null($host)) and + \strpos(\ltrim($path, '/'), 'uploads') === 0; + })->filter(function (string $url) { + $path = \parse_url($url, \PHP_URL_PATH); + return Storage::disk('uploads') + ->exists(ToolboxHelper::mbReplace('uploads/', '', \ltrim(\urldecode($path), '/'))); + })->all(); + } + + /** + * Prepare storage path and return + * the file full path + * + * @param string $tableName Model table name. + * @param string $filename The basename for the file. + * @param boolean $private May the file be stored in a private dir. + * @return string + */ + private static function prepareMoveFile(string $tableName, string $filename, bool $private = false): string + { + // * Security filter + $filename = \htmlspecialchars($filename); + // * Security filter + beautifier + $filename = self::sanitizeFileName($filename); + // * Slugify filename + $ext = \pathinfo($filename, \PATHINFO_EXTENSION); + $filename = Str::slug(\pathinfo($filename, \PATHINFO_FILENAME)) . + (\strlen($ext) ? ".{$ext}" : ''); + + $folderPath = self::getStoragePath( + $private ? 'app/private/modelfiles' : 'app/public/modelfiles', + $tableName, + $filename, + $private + ); + $filename = self::getFileUniqueName($folderPath, $filename); + return "{$folderPath}/{$filename}"; + } + + /** + * Create sub folders to store files using pattern + * storage/modelfiles/posts/10/04/19/5f + * year/month/day/md5 first 2 letters + * + * @param string $storage_dir + * @param string $table + * @param string $filename + * @return string + */ + private static function getStoragePath(string $storage_dir, string $table, string $filename): string + { + $filenameHash = \md5($filename); + $pathFolder = \storage_path(sprintf( + '%s/%s/%s/%s/%s/%s', + $storage_dir, + $table, + gmdate('y'), + gmdate('m'), + gmdate('d'), + substr($filenameHash, 0, 2) + )); + if (!File::exists($pathFolder)) { + File::makeDirectory($pathFolder, 0755, true); + } + return $pathFolder; + } + + /** + * Get unique filename if the path is already occupied + * + * @param string $folderPath + * @param string $filename + * @return string + * @throws \RuntimeException If a unique filename cannot be obtained. + */ + private static function getFileUniqueName(string $folderPath, string $filename): string + { + $attempts = 0; + $maxAttempts = 20; + while (File::exists("{$folderPath}/{$filename}")) { + if ($attempts++ >= $maxAttempts) { + throw new \RuntimeException("Failed to have a unique filename for {$folderPath}/{$filename}"); + } + $filename = pathinfo($filename, \PATHINFO_FILENAME) . + \uniqid('-') . '.' . + pathinfo($filename, \PATHINFO_EXTENSION); + } + return $filename; + } + + /** + * Slugify the filename + * + * @param string $filename + * @return string + */ + public static function slugifyFileName(string $filename): string + { + return Str::slug(pathinfo($filename, \PATHINFO_FILENAME)) . '.' . pathinfo($filename, \PATHINFO_EXTENSION); + } + + /** + * Sanitize File name for uploaded files + * + * @param string $filename The original uploaded client file name. + * @param boolean $beautify Beautify the filename. + * @return string The sanitized file name. + */ + public static function sanitizeFileName(string $filename, bool $beautify = true): string + { + // * Sanitize filename + // phpcs:disable Generic.Files.LineLength.TooLong + $filename = preg_replace( + '~ + [<>:"/\\\|?*]| # file system reserved https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words + [\x00-\x1F]| # control characters http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx + [\x7F\xA0\xAD]| # non-printing characters DEL, NO-BREAK SPACE, SOFT HYPHEN + [#\[\]@!$&\'()+,;=]| # URI reserved https://tools.ietf.org/html/rfc3986#section-2.2 + [{}^\~`] # URL unsafe characters https://www.ietf.org/rfc/rfc1738.txt + ~x', + '-', + $filename + ); + // phpcs:enable + // * Avoids '.' '..' or '.hiddenFiles' . + $filename = Str::of($filename)->ltrim('.-'); + // * Optional beautification + if ($beautify) { + $filename = static::beautifyFilename($filename); + } + // * Maximize filename length to 255 bytes http://serverfault.com/a/9548/44086 + /** @var string */ + $extension = pathinfo($filename, \PATHINFO_EXTENSION); + /** @var string */ + $filename = pathinfo($filename, \PATHINFO_FILENAME); + + $encoding = mb_detect_encoding($filename); + $encoding = $encoding ? $encoding : null; + return \mb_strcut( + $filename, + 0, + 255 - (!empty($extension) ? strlen($extension) + 1 : 0), + $encoding + ) . (!empty($extension) ? ".$extension" : ''); + } + + /** + * Beautify a filename + * + * @param string $filename + * @return string + */ + private static function beautifyFilename(string $filename): string + { + // Reduce consecutive characters. + $filename = preg_replace([ + // * "file name.zip" becomes 'file-name.zip' + '/ +/', + // * "file___name.zip" becomes 'file-name.zip' + '/_+/', + // * "file---name.zip" becomes 'file-name.zip' + '/-+/' + ], '-', $filename); + $filename = preg_replace([ + // * "file--.--.-.--name.zip" becomes "file.name.zip" + '/-*\.-*/', + // * "file...name..zip" becomes "file.name.zip" + '/\.{2,}/' + ], '.', $filename); + // Lowercase for windows/unix interoperability http://support.microsoft.com/kb/100625 . + $filename = mb_strtolower($filename, mb_detect_encoding($filename)); + // * ".file-name.-" becomes "file-name" + $filename = trim($filename, '.-'); + return $filename; + } +} diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php new file mode 100644 index 0000000..6a9b932 --- /dev/null +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -0,0 +1,519 @@ + $array1 + * @param array $array2 + * + * @return array + */ + public static function arrayMergeRecursiveDistinct(array &$array1, array &$array2): array + { + $merged = $array1; + foreach ($array2 as $key => &$value) { + if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { + $merged[$key] = self::arrayMergeRecursiveDistinct($merged[$key], $value); + } else { + $merged[$key] = $value; + } + } + + return $merged; + } + + /** + * Validate recaptcha + * + * @param \Illuminate\Http\Request $request + * @param boolean $isV3 + * @return void + */ + public static function validateRecaptcha(Request $request, bool $isV3 = true) + { + Validator::validate($request->all(), [ + 'g-recaptcha-response' => [ + 'required', 'string', + // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed, Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed + function ($attribute, $value, $fail) use ($isV3) { + try { + $response = Http::asForm()->post('https://www.google.com/recaptcha/api/siteverify', [ + 'secret' => config('services.google.recaptcha.private'), + 'response' => \strval($value), + 'remoteip' => app('clientIp') + ]); + if ($e = $response->toException()) { + throw $e; + } + if ($isV3) { + if ( + !$response->json('success') or + !$response->json('challenge_ts') or + Carbon::parse($response->json('challenge_ts'))->lessThan(\now('utc')->subMinutes(5)) or + $response->json('hostname') !== \parse_url(config('app.url'), \PHP_URL_HOST) or + !$response->json('score') + ) { + throw new \RuntimeException(); + } + if (\floatval($response->json('score')) < 0.8) { + $fail("Vous n'avez pas obtenu un score assez élevé lors de la validation du recaptcha"); + } + return; + } + if ( + !$response->json('success') or + !$response->json('challenge_ts') or + Carbon::parse($response->json('challenge_ts'))->lessThan(\now('utc')->subMinutes(5)) or + $response->json('hostname') !== \parse_url(config('app.url'), \PHP_URL_HOST) + ) { + throw new \RuntimeException(); + } + } catch (\Exception $e) { + $fail('Erreur lors de la validation du formulaire veuillez réssayer'); + } //end try + } + ] + ], [], ['g-recaptcha-response' => 'reCaptcha']); + } + + /** + * Strip scheme (https) on oembed urls + * Only embed allowed are for MP4 self hosted videos right now + * + * https is force by ckeditor MediaElements which natively supports + * only cloud hosted medias (youtube, spotify etc..) + * + * @param string $input + * @return string + */ + public static function stripCkEditorSchemesOnMediaInputs(string $input): string + { + $input = \preg_replace('/(?<=)/m', '', $input); + return $input; + } + + /** + * Assert That no Back Office url is present on txt + * + * @param string $field + * @param string $text + * @return string + * @throws \Illuminate\Validation\ValidationException If url is a bo url. + */ + public static function assertNoInternalBoUrls(string $field, string $text): string + { + $routes = Route::getRoutes(); + // * Url replace and email replace. + $text = preg_replace_callback( + // phpcs:ignore Generic.Files.LineLength.TooLong + '/(?P(?:http[s]?:\/\/.)?(?:www\.)?[-a-zA-Z0-9@%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*))/', + function ($matches) use ($routes, $field) { + $match = collect($matches)->first() ?? ''; + $url = $match; + try { + $request = Request::create($url); + // If a route is match then it do not throws exception. + if ( + \parse_url(config('app.url'), \PHP_URL_HOST) === \parse_url($url, \PHP_URL_HOST) && + trim($routes->match($request)->getPrefix() ?? '', '/') === 'bo' + ) { + // Removes the matched url. + throw ValidationException::withMessages([ + $field => trans( + 'crud.libs.toolbox.assertNoInternalBoUrls', + ['attribute' => $field] + ) + ]); + } + return $match; + } catch (NotFoundHttpException $e) { + return $match; + } + }, + $text + ); + return $text; + } + + /** + * Assert That only external url is present on txt + * + * @param string $field + * @param string $text + * @return string + * @throws \Illuminate\Validation\ValidationException If url is a bo url. + */ + public static function assertNoInternalUrls(string $field, string $text): string + { + self::assertNoInternalBoUrls($field, $text); + $routes = Route::getRoutes(); + // * Url replace and email replace. + $text = preg_replace_callback( + // phpcs:ignore Generic.Files.LineLength.TooLong + '/(?P(?:http[s]?:\/\/.)?(?:www\.)?[-a-zA-Z0-9@%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*))/', + function ($matches) use ($routes, $field) { + $match = collect($matches)->first() ?? ''; + $url = $match; + try { + $request = Request::create($url); + // If a route is match then it do not throws exception. + if ( + \parse_url(config('app.url'), \PHP_URL_HOST) === \parse_url($url, \PHP_URL_HOST) && + $routes->match($request) + ) { + // Removes the matched url. + throw ValidationException::withMessages([ + $field => trans( + 'crud.libs.toolbox.assertNoInternalUrls', + ['attribute' => $field, 'appname' => config('app.name')] + ) + ]); + } + return $match; + } catch (NotFoundHttpException $e) { + return $match; + } + }, + $text + ); + return $text; + } + + /** + * Mutltibyte string replace + * + * @param array|string $search + * @param array|string $replace + * @param array|string $subject + * @param integer $count + * @return array|string + */ + public static function mbReplace( + array|string $search, + array|string $replace, + array|string $subject, + int &$count = 0 + ): array|string { + if (!is_array($search) && is_array($replace)) { + return false; + } + if (is_array($subject)) { + // Call mb_replace for each single string in $subject . + foreach ($subject as &$string) { + $string = &self::mbReplace($search, $replace, $string, $count); + } + } elseif (is_array($search)) { + if (!is_array($replace)) { + foreach ($search as &$string) { + $subject = self::mbReplace($string, $replace, $subject, $count); + } + } else { + $n = max(count($search), count($replace)); + while ($n--) { + $subject = self::mbReplace(current($search), current($replace), $subject, $count); + next($search); + next($replace); + } + } + } else { + $parts = mb_split(preg_quote($search), $subject); + $count = count($parts) - 1; + $subject = implode($replace, $parts); + } //end if + return $subject; + } + + /** + * Asserts that the field is unique + * + * @param string $table + * @param string $field + * @param string|integer|float|boolean|null|array $value + * @param integer|null $id + * @param callable|null $query + * @return void + * @throws \Illuminate\Validation\ValidationException If the field is not unique. + */ + public static function assertFieldIsUnique( + string $table, + string $field, + string|int|float|bool|null|array $value, + ?int $id = null, + ?callable $query = null + ) { + if (!$query) { + Validator::make([$field => $value], [ + self::mbReplace('.', '\.', $field) => Rule::unique($table, $field)->ignore($id), + ], [ + self::mbReplace('.', '\.', "{$field}.unique") + => trans('crud.libs.toolbox.assertFieldIsUnique', ['attribute' => $field, 'value' => $value]) + ])->validate(); + return; + } + Validator::make([$field => $value], [ + $field => Rule::unique($table)->where($query)->ignore($id), + ], [ + $field . '.unique' => trans( + 'crud.libs.toolbox.assertFieldIsUnique', + ['attribute' => $field, 'value' => $value] + ) + ])->validate(); + } + + /** + * Get original polyfill with autotranslate behavior + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $attribute + * @return mixed + */ + public static function getOriginal(Model $model, string $attribute): mixed + { + if (\in_array('Spatie\Translatable\HasTranslations', \class_uses_recursive($model))) { + return $model->getTranslation( + $attribute, + $model->getLocale(), + $model->useFallbackLocale() + ); + } + return $model->getOriginal($attribute); + } + + /** + * Dynamic model query + * + * @param string $defaultLocale + * @param \Illuminate\Contracts\Database\Eloquent\Builder $q + * @param string $column + * @param string $value + * @return \Illuminate\Contracts\Database\Eloquent\Builder + */ + public static function queryColumnWithLocales( + string $defaultLocale, + Builder $q, + string $column, + string $value + ): Builder { + $currentLocale = app()->currentLocale(); + $locales = collect(config('app.locales')) + ->mapWithKeys(fn (string $locale) => [$locale => $locale]); + if (!$locales->has($defaultLocale)) { + // * Remove default locale. + $locales->pull($defaultLocale); + } + if (!$locales->has($currentLocale)) { + // * Remove current locale. + $locales->pull($currentLocale); + } + + return $q->where(function (Builder $q) use ($defaultLocale, $currentLocale, $locales, $column, $value) { + // * Query default locale + $q->whereRaw("JSON_EXTRACT({$column}, '$.{$defaultLocale}') = '{$value}'"); + if ($defaultLocale !== $currentLocale) { + // * Query current locale + $q->whereRaw("JSON_EXTRACT({$column}, '$.{$currentLocale}') = '{$value}'"); + } + // * Query any other locale + $locales->each(fn ($locale) => $q->orWhereRaw( + "JSON_EXTRACT({$column}, '$.{$locale}') = '{$value}'" + )); + }); + } + + /** + * Generates an array from a dot separated string + * + * @param string $path + * @param mixed $value + * @param string $separator + * @return array + */ + public static function dotStringToNestedArray(string $path, mixed $value, string $separator = '.'): array + { + $arr = $value; + $keys = array_reverse(explode($separator, $path)); + + foreach ($keys as $key) { + $arr = [$key => $arr]; + } + return $arr; + } + + /** + * Convert deeply an object to array + * + * @param array|object $input + * @return array + * @throws \RuntimeException If $input var is a scalar value. + */ + public static function objectToArray($input): array + { + // Only process if it's an object or array being passed to the function. + if (is_object($input) or is_array($input)) { + $ret = (array)$input; + foreach ($ret as &$item) { + // Recursively process EACH element only if not scalar. + $item = (is_object($item) or is_array($item)) ? + self::objectToArray($item) : $item; + } + return $ret; + } else { + throw new \RuntimeException('Cannot handle $input of type ' . \gettype($input)); + } + } + + /** + * Convert deeply an array to object + * + * @param array|object $input + * @return object + * @throws \RuntimeException If $input var is a scalar value. + */ + public static function arrayToObject($input): object + { + // Only process if it's an object or array being passed to the function. + if (is_object($input) or is_array($input)) { + $ret = (object)$input; + foreach ($ret as &$item) { + // Recursively process EACH element only if not scalar. + $item = (is_object($item) or is_array($item)) ? + self::arrayToObject($item) : $item; + } + return $ret; + } else { + throw new \RuntimeException('Cannot handle $input of type ' . \gettype($input)); + } + } + + /** + * Validate picture + * + * @param string $attribute + * @param string|null $value + * @param callback $fail + * @param object $sizes + * @return void + */ + public static function validatePicture(string $attribute, string|null $value, callable $fail, object $sizes) + { + if (!($useStorage = Storage::exists($value)) and !File::exists($value)) { + $fail(trans(':attribute n\'existe pas dans le système de fichier', [ + 'attribute' => $attribute + ])); + return; + } + /** @var string */ + $fileFullPath = self::getUploadedFileFullPath($value, $useStorage); + if ( + !\in_array(self::getUploadedFileMimeType($value, $useStorage), [ + 'image/jpeg', 'image/jpg', 'image/png', 'image/gif' + ]) + ) { + $fail(trans(':attribute doit être une image de type \'image/jpeg,image/jpg,image/png,image/gif\'', [ + 'attribute' => $attribute + ])); + } + if (!($dimensions = \getimagesize($fileFullPath)) or !isset($dimensions[0]) or !isset($dimensions[1])) { + $fail(trans(':attribute impossible de valider les dimensions', [ + 'attribute' => $attribute + ])); + } else { + $width = intval($dimensions[0]); + $height = intval($dimensions[1]); + + $xMessage = trans( + ":attribute la largeur doit être comprise entre {$sizes->minWith}px et {$sizes->maxWith}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 {$sizes->minWith}px et {$sizes->maxWith}px" + ); + if ($sizes->minHeight === $sizes->maxHeight) { + $yMessage = trans(":attribute la hauteur doit être de {$sizes->minWith}px"); + } + + if (($width < $sizes->minWith) or ($width > $sizes->maxWith)) { + $fail($xMessage); + } + if (($height < $sizes->minHeight) or ($height > $sizes->maxHeight)) { + $fail($yMessage); + } + } //end if + } + + /** + * Get the file full path + * + * @param string $value + * @param boolean $useStorage + * @return string + */ + private static function getUploadedFileFullPath(string $value, bool $useStorage): string + { + /** @var \Illuminate\Filesystem\FilesystemAdapter */ + $disk = Storage::disk(); + return !$useStorage ? (realpath($value) ?: $value) : $disk->path($value); + } + + /** + * Get the file mimetype + * + * @param string $value + * @param boolean $useStorage + * @return string|false + */ + private static function getUploadedFileMimeType(string $value, bool $useStorage) + { + return !$useStorage ? File::mimeType($value) : Storage::mimeType($value); + } + + /** + * Fetch class list from a specific namespace + * + * @param string $namespace + * @return array An array of classe namespaces + */ + public static function getClassesUsingNamespace(string $namespace): array + { + return collect(File::files(\app_path(Str::of($namespace)->replaceFirst('\App', '')))) + ->filter(fn (SplFileInfo $splFileInfo) => $splFileInfo->getExtension() === 'php') + ->map(fn (SplFileInfo $splFileInfo) => Str::of($splFileInfo->getBasename()) + ->replace('.' . $splFileInfo->getExtension(), '')->prepend("{$namespace}\\"))->all(); + } + + /** + * Get all classes from a specific namespace that implement a specific interface + * + * @param string $namespace + * @param string $interface + * @return array An array of classe namespaces + */ + public static function getClassesUsingInterface(string $namespace, string $interface): array + { + return Arr::where( + static::getClassesUsingNamespace($namespace), + fn (string $class_namespace) => \collect(class_implements($class_namespace, true))->filter() + ->contains(fn (string $class_interface) => $class_interface === $interface) + ); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 4e34f97..c78e017 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,19 +2,22 @@ namespace App\Providers; -use App\Models\Prize; use App\Models\Settings; -use Illuminate\Pagination\Paginator; -use Illuminate\Support\Carbon; use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\Cache; -use Illuminate\Support\Facades\View; -use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\URL; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { + /** + * Register any application services. + * + * @return void + */ + public function register() + { + } + /** * Bootstrap any application services. * @@ -26,26 +29,20 @@ class AppServiceProvider extends ServiceProvider // * HA PROXY FIX. App::singleton('clientIp', function () { - if ( - config('app.env') === 'local' - ) { + if (config('app.env') === 'local') { return request()->getClientIp(); } else { return request()->server('HTTP_X_FORWARDED_FOR') ?? request()->getClientIp(); } }); + // * LOCAL FORCE eg: for Carbon. setlocale(LC_ALL, \sprintf( '%s_%s.UTF-8', config('app.locale'), \strtoupper(config('app.locale')) )); - Carbon::setLocale(config('app.locale')); - // * FORCE BOOTSTRAP PAGINATOR. - if (!app()->runningInConsole()) { - Paginator::useBootstrap(); - } app()->singleton(Settings::class, function () { if (!($settings = Settings::find(1))) { @@ -53,30 +50,5 @@ class AppServiceProvider extends ServiceProvider } return $settings; }); - - if (!app()->runningInConsole()) { - // On ramène le nom du jeu et le nom de la société sur toute les pages. - $settingsGlobal = Cache::get('settingsGlobal'); - if (!$settingsGlobal) { - $settingsGlobal = app(Settings::class) - ->select('name', 'company', 'analytics', 'start_date', 'end_date') - ->first(); - Cache::put('settingsGlobal', $settingsGlobal); - } - View::share('settingsGlobal', $settingsGlobal); - - // On ramène aussi tout les prix car on en a besoin sur le header. - $prizesGlobal = Cache::get('prizesGlobal'); - if (!$prizesGlobal) { - $prizesGlobal = Prize::all(); - Cache::put('prizesGlobal', $prizesGlobal); - } - View::share('prizesGlobal', $prizesGlobal); - - - Blade::if('superadmin', function () { - return auth()->user() && auth()->user()->role == 1; - }); - }//end if } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 3ffc67d..b726da0 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -20,6 +20,5 @@ class AuthServiceProvider extends ServiceProvider */ public function boot() { - $this->registerPolicies(); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index fcdee6b..13750e8 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -18,4 +18,23 @@ class EventServiceProvider extends ServiceProvider SendEmailVerificationNotification::class, ], ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot(): void + { + } + + /** + * Determine if events and listeners should be automatically discovered. + * + * @return boolean + */ + public function shouldDiscoverEvents(): bool + { + return false; + } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 27381dc..5fee934 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,20 +2,14 @@ namespace App\Providers; +use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { - /** - * This namespace is applied to your controller routes. - * - * In addition, it is set as the URL generator's root namespace. - * - * @var string - */ - protected $namespace = null; - /** * The path to the "home" route for your application. * @@ -28,12 +22,16 @@ class RouteServiceProvider extends ServiceProvider * * @return void */ - public function boot() + public function boot(): void { + $this->configureRateLimiting(); + + $this->cspReportRoute(); + $this->routes(function () { Route::middleware('web') ->namespace($this->namespace) - ->group(base_path('routes/web.php')); + ->group(base_path('routes/web-fo.php')); Route::middleware('web') ->namespace($this->namespace) @@ -44,4 +42,58 @@ class RouteServiceProvider extends ServiceProvider ->group(base_path('routes/web-re7.php')); }); } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + protected function configureRateLimiting(): void + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(150)->by($request->user()?->id ?: app('clientIp')); + }); + RateLimiter::for('web', function (Request $request) { + return Limit::perMinute(150)->by($request->user()?->id ?: app('clientIp')); + }); + RateLimiter::for('credentials', function (Request $request) { + return Limit::perMinute(30)->by($request->user()?->id ?: app('clientIp')); + }); + } + + /** + * * Register CSP report URI + * + * Put this function inside RouteServiceProvider, + * and call it in RouteServiceProvider::boot + * + * @return void + */ + private function cspReportRoute() + { + // * CSP REPORT URI, Please add /csp-report to VerifyCsrfToken $except middleware + \Illuminate\Support\Facades\Route::post('/csp-report', function () { + $isCspRequest = request()->header('Content-Type') === 'application/csp-report'; + if (!$isCspRequest or !request()->json('csp-report') or !is_array(request()->json('csp-report'))) { + abort(401); + } + // * Flatten if needed + $cspReport = collect(request()->json('csp-report')) + ->flatMap(function ($v, $k) { + return [$k => is_array($v) ? collect($v)->flatten()->implode(', ') : $v]; + })->all(); + // * Filter array keys + $cspReport = collect(array_intersect_key($cspReport, [ + 'blocked-uri' => '', 'document-uri' => '', 'original-policy' => '', + 'referrer' => '', 'violated-directive' => '' + ])); + \Illuminate\Support\Facades\Log::warning(sprintf( + "CSP REPORT for %s : \n %s", + $cspReport->get('document-uri'), + $cspReport->implode("\n") + )); + })->middleware('throttle:5,2') + ->withoutMiddleware(\App\Http\Middleware\VerifyCsrfToken::class) + ->name('cspReportUri'); + } } diff --git a/app/Providers/TranslationServiceProvider.php b/app/Providers/TranslationServiceProvider.php new file mode 100644 index 0000000..a042a23 --- /dev/null +++ b/app/Providers/TranslationServiceProvider.php @@ -0,0 +1,78 @@ +collectLocalesStrings() as $locale) { + // * Supported locales + Cache::rememberForever(sprintf('translations.%s', $locale), function () use ($locale) { + $translations = [ + 'php' => $this->phpTranslations($locale), + 'json' => $this->jsonTranslations($locale), + ]; + return $translations; + }); + } + } + + /** + * Gather provided langs checking from files + * + * @return \Illuminate\Support\Collection + */ + private function collectLocalesStrings(): Collection + { + return collect(File::allFiles(resource_path('lang/')))->flatMap(function (SplFileInfo $file) { + if ($file->getRelativePath() and \strpos($file->getRelativePath(), 'vendor') !== 0) { + return [$file->getRelativePath() => '']; + } + })->keys(); + } + + /** + * Gather all php translations + * + * @param string $locale + * @return array + */ + private function phpTranslations(string $locale): array + { + $path = resource_path("lang/$locale"); + + return collect(File::allFiles($path))->flatMap(function ($file) use ($locale) { + $translation = $file->getBasename('.php'); + return [$translation => trans($translation, [], $locale)]; + })->all(); + } + + /** + * Gather json translations + * + * @param string $locale + * @return array + */ + private function jsonTranslations(string $locale): array + { + $path = resource_path("lang/$locale.json"); + + if (is_string($path) && is_readable($path)) { + return json_decode(file_get_contents($path), true) ?? []; + } + + return []; + } +} diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php new file mode 100644 index 0000000..08daede --- /dev/null +++ b/app/Providers/ViewServiceProvider.php @@ -0,0 +1,57 @@ +runningInConsole()) { + $appInfos = Cache::remember('composer', 3600, function () { + return json_decode(File::get(\app_path('../composer.json'))); + }); + View::share('name', $appInfos->name); + View::share('version', $appInfos->version); + View::share('license', $appInfos->license); + // * FORCE BOOTSTRAP PAGINATOR + Paginator::defaultView('bo.modules.pagination'); + + // On ramène le nom du jeu et le nom de la société sur toute les pages. + $settingsGlobal = Cache::get('settingsGlobal'); + if (!$settingsGlobal) { + $settingsGlobal = app(Settings::class) + ->select('name', 'company', 'analytics', 'start_date', 'end_date') + ->first(); + Cache::put('settingsGlobal', $settingsGlobal); + } + View::share('settingsGlobal', $settingsGlobal); + + // On ramène aussi tout les prix car on en a besoin sur le header. + $prizesGlobal = Cache::get('prizesGlobal'); + if (!$prizesGlobal) { + $prizesGlobal = Prize::all(); + Cache::put('prizesGlobal', $prizesGlobal); + } + View::share('prizesGlobal', $prizesGlobal); + + // * CUSTOM IF STATEMENTS + Blade::if('superadmin', function () { + return auth()->user() && auth()->user()->role == 1; + }); + } //end if + } +} diff --git a/app/Traits/Controllers/.gitkeep b/app/Traits/Controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/Traits/Enums/BaseEnum.php b/app/Traits/Enums/BaseEnum.php new file mode 100644 index 0000000..615c807 --- /dev/null +++ b/app/Traits/Enums/BaseEnum.php @@ -0,0 +1,259 @@ + + */ +trait BaseEnum +{ + // * GENERIC METHODS + /** + * Get enum value + * + * @return string|integer + */ + public function value(): string|int + { + return self::toValues()[$this->name]; + } + + /** + * Get enum label + * + * @return string + */ + public function label(): string + { + return self::toLabels()[$this->name]; + } + + /** + * Get enum name + * + * @return string + */ + public function name(): string + { + return $this->name; + } + + // * STATIC FETCH METHODS + + /** + * Get enum labels + * + * @return array + */ + public static function toLabels(): array + { + if (empty(self::getCache('labels'))) { + $labels = self::getLabelsConstant(); + self::setCache('labels', \collect(self::cases()) + ->mapWithKeys(function ($enum) use ($labels) { + if (!\is_null($labels) and !isset($labels[$enum->name])) { + throw new \Error('Missing definition label ' . self::class . " for {$enum->name}"); + } + return [$enum->name => \trans( + !\is_null($labels) ? $labels[$enum->name] : Str::ucfirst($enum->name) + )]; + })->all()); + } + return self::getCache('labels'); + } + + /** + * Get enum values + * + * @return array + */ + public static function toValues(): array + { + if (empty(self::getCache('values'))) { + self::setCache('values', \collect(self::cases()) + ->mapWithKeys(fn ($enum) => [$enum->name => $enum->value])->all()); + } + return self::getCache('values'); + } + + /** + * Get enums + * + * @return array + */ + public static function all(): array + { + return self::cases(); + } + + /** + * Get enums + * + * @return array + */ + public static function toArray(): array + { + if (empty(self::getCache('enums'))) { + $definitions = self::getCustomDefinitions(); + self::setCache('enums', \collect(self::cases()) + ->mapWithKeys(function ($enum) use ($definitions) { + $baseArray = [ + 'name' => $enum->name, + 'label' => $enum->label(), + 'value' => $enum->value, + ]; + foreach ($definitions as $index => $elements) { + $index = Str::lower(Str::singular($index)); + if (!isset($elements[$enum->name])) { + throw new \Error("Missing definition {$index} " . self::class . " for {$enum->name}"); + } + $baseArray[$index] = $elements[$enum->name]; + } + return [$enum->name => (object)$baseArray]; + })->all()); + } + return self::getCache('enums'); + } + + /** + * Fetch enum using value + * + * @param \App\Traits\Enums\BaseEnum|integer|string $value + * @return \App\Traits\Enums\BaseEnum|null + */ + public static function make(self|int|string $value): self|null + { + return !\is_object($value) ? + \collect(self::cases())->keyBy('value')->get($value) : $value; + } + + /** + * Test if 2 enum are equals + * + * @param object ...$others + * @return boolean + * @throws \Error If provided element are not enums taht extends BaseEnum. + */ + public function equals(object ...$others): bool + { + foreach ($others as $other) { + if (!\in_array(BaseEnum::class, \class_uses_recursive($other))) { + throw new \Error(__METHOD__ . + ' requires $enum to use ' . BaseEnum::class); + } + if ( + get_class($this) === get_class($other) + && $this->value === $other->value + ) { + return true; + } + } + return false; + } + + /** + * Serialize to json + * + * @return mixed + */ + public function jsonSerialize(): mixed + { + return $this->value; + } + + + // * CACHE + + /** + * Get cache array + * + * @param string $index + * @return array + */ + private static function getCache(string $index): array + { + self::initCache(); + if (!isset($GLOBALS[self::class]['props'][$index])) { + $GLOBALS[self::class]['props'][$index] = []; + } + return $GLOBALS[self::class]['props'][$index]; + } + + /** + * Set cache array + * + * @param string $index + * @param array $items + * @return void + */ + private static function setCache(string $index, array $items): void + { + self::initCache(); + if (!isset($GLOBALS[self::class]['props'][$index])) { + $GLOBALS[self::class]['props'][$index] = []; + } + $GLOBALS[self::class]['props'][$index] = $items; + } + + /** + * Init cache if needed + * + * @return void + */ + private static function initCache(): void + { + if (!isset($GLOBALS[self::class])) { + $GLOBALS[self::class] = [ + 'props' => [ + 'enums' => [], + 'values' => [], + 'labels' => [] + ], + 'customProps' => null + ]; + } + } + + // * PRIVATE + + /** + * Fetch the LABELS constant if exists + * + * @return array|null + */ + private static function getLabelsConstant(): array|null + { + $class_name = self::class; + try { + $constant_reflex = new \ReflectionClassConstant($class_name, 'LABELS'); + return $constant_reflex->getValue(); + } catch (\ReflectionException $e) { + return null; + } + } + + /** + * Get custom constants + * + * @return array + */ + private static function getCustomDefinitions(): array + { + // ? Has custom props in cache ? + if (!isset($GLOBALS[self::class]) or \is_null($GLOBALS[self::class]['customProps'])) { + $names = \collect(self::cases())->keyBy('name'); + + $GLOBALS[self::class]['customProps'] = \collect((new \ReflectionClass(self::class))->getConstants()) + ->filter(function (mixed $constant, string $key) use ($names) { + if ($key === 'LABELS' or !\is_array($constant)) { + return false; + } + return \collect($constant)->keys() + ->filter(fn (string $name) => $names->has($name))->count(); + })->all(); + } + return $GLOBALS[self::class]['customProps']; + } +} diff --git a/app/Traits/Models/IsCachedAsCollection.php b/app/Traits/Models/IsCachedAsCollection.php new file mode 100644 index 0000000..f8ede85 --- /dev/null +++ b/app/Traits/Models/IsCachedAsCollection.php @@ -0,0 +1,103 @@ +all(); + } + Cache::put(static::getCacheKeyName(), static::queryCached(static::query()) + ->where($conditions)->get() + ->pipe(fn (Collection $collection) => \call_user_func([self::class, 'filterQuery'], $collection))); + } + + /** + * Change query for cached elements + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + protected static function queryCached(Builder $query): Builder + { + return $query; + } + + /** + * Change query for cached elements + * + * @param \Illuminate\Support\Collection $results + * @return \Illuminate\Support\Collection + */ + protected static function filterQuery(Collection $results): Collection + { + return $results; + } + + /** + * Get the class basename + * + * @return string + */ + protected static function getCacheKeyName(): string + { + return static::getCallClassBaseName(); + } + + /** + * Get the class basename + * + * @return string + */ + protected static function getCallClassBaseName(): string + { + return str_replace(__NAMESPACE__ . '\\', '', get_called_class()); + } +} diff --git a/app/Traits/Models/MiniCrudModel.php b/app/Traits/Models/MiniCrudModel.php new file mode 100644 index 0000000..09109f1 --- /dev/null +++ b/app/Traits/Models/MiniCrudModel.php @@ -0,0 +1,180 @@ +setData($attributes['data']); + } + } + + /** + * Apply function on data typed text while on save event + * + * @return void + */ + public function minicrudCreating() + { + /** @var array */ + $data = $this->data; + foreach ($data as &$input) { + switch ($input['inputType']) { + case InputType::text->value: + $input['text'] = clean($input['text']); + $input['text'] = FileStorageHelper::storeModelFilesFromHtml($this, $input['text']); + break; + } //end switch + } //end foreach + $this->data = $data; + } + + /** + * Apply function on data typed text while on update event + * + * @return void + */ + public function minicrudUpdating() + { + $this->minicrudCreating(); + } + + /** + * Apply function on data typed text while on updated event + * + * @return void + */ + public function minicrudUpdated() + { + /** @var array */ + foreach ($this->data as $index => $input) { + switch ($input['inputType']) { + case InputType::text->value: + $original = ToolboxHelper::getOriginal($this, 'data'); + FileStorageHelper::removeOldModelFilesFromHtml( + $input['text'], + $original[$index]['text'] ?? '' + ); + break; + } //end switch + } //end foreach + } + + /** + * Apply function on data typed text while on deleted event + * + * @return void + */ + public function minicrudDeleted() + { + /** @var array */ + foreach ($this->data as $input) { + switch ($input['inputType']) { + case InputType::text->value: + FileStorageHelper::removeModelFilesOfHtml($input['text']); + break; + } //end switch + } //end foreach + } + + /** + * Set a specific prop + * + * @param array $data + * @return void + */ + private function setData(array $data): void + { + $attrs = $this->attributes; + if (isset($attrs['data'])) { + unset($attrs['data']); + } + $this->setAttribute('data', $data); + } + + /** + * Set a specific prop + * + * @param array $value + * @return void + */ + protected function setDataAttribute(array $value): void + { + $this->attributes['data'] = $this->castAttributeAsJson( + 'data', + $this->serializeData($value) + ); + } + + /** + * Set a specific prop + * + * @param string|null $data + * @return array + */ + protected function getDataAttribute(string|null $data): array + { + return $this->fromJson($data ?? $this->attributes['data'] ?? '[]'); + } + + /** + * Serialize properties + * + * @param array $data + * @return array + * @throws \ErrorException If input type is no handled. + * @throws \Illuminate\Validation\ValidationException If url is a bo url. + * @phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh + */ + private function serializeData(array $data): array + { + foreach ($data as $o => $input) { + switch ($input['inputType']) { + case InputType::image->value: + $data[$o]['value'] = \preg_replace( + '/^\/|^/', + '', + FileStorageHelper::storeFile($this, $input['value'], true) + ); + break; + case InputType::selectEnum->value: + case InputType::boolean->value: + case InputType::password->value: + case InputType::email->value: + case InputType::number->value: + case InputType::videoVimeo->value: + case InputType::videoYoutube->value: + case InputType::video->value: + break; + case InputType::string->value: + case InputType::text->value: + case InputType::url->value: + ToolboxHelper::assertNoInternalBoUrls('content', $input['value']); + break; + default: + throw new \ErrorException(sprintf( + 'Unknown input Type %s', + $input['inputType'] + )); + } //end switch + } //end foreach + return $data; + } +} diff --git a/app/Traits/Requests/.gitkeep b/app/Traits/Requests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/artisan b/artisan index 5c23e2e..67a3329 100644 --- a/artisan +++ b/artisan @@ -11,7 +11,7 @@ define('LARAVEL_START', microtime(true)); | Composer provides a convenient, automatically generated class loader | for our application. We just need to utilize it! We'll require it | into the script here so that we do not have to worry about the -| loading of any our classes "manually". Feels great to relax. +| loading of any of our classes manually. It's great to relax. | */ diff --git a/composer.json b/composer.json index f601b82..db9780e 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,6 @@ { "name": "laravel/laravel", + "version": "2.0.0", "type": "project", "description": "The Laravel Framework.", "keywords": [ @@ -8,69 +9,80 @@ ], "license": "MIT", "require": { - "php": "^7.3", - "ext-curl": "*", - "ext-json": "*", - "fideloper/proxy": "^4.2", - "fruitcake/laravel-cors": "^2.0", - "guzzlehttp/guzzle": "^7.0.1", + "php": "^8.1", + "diglactic/laravel-breadcrumbs": "^8.0", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^10.0", + "laravel/tinker": "^2.8", + "laravel/ui": "^4.2", + "mews/purifier": "^3.4", + "sentry/sentry-laravel": "*", "kwaadpepper/enum": "^2.1", - "kwaadpepper/exception-handler": "^0.0.6", - "kwaadpepper/serial-int-caster": "^1.0", - "laravel/framework": "^8.0", - "laravel/tinker": "^2.0", - "laravel/ui": "^3.0" + "kwaadpepper/serial-int-caster": "^1.0" }, "require-dev": { - "doctrine/dbal": "^2.0", - "facade/ignition": "^2.3.6", - "fzaninotto/faker": "^1.9.1", - "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^5.0", - "phpunit/phpunit": "^9.0", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.6" - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true, - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - }, - "extra": { - "laravel": { - "dont-discover": [] - } + "doctrine/dbal": "^3.6", + "fakerphp/faker": "^1.9.1", + "kitloong/laravel-migrations-generator": "^6.8", + "krlove/eloquent-model-generator": "dev-l10-compatibility", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.0", + "slevomat/coding-standard": "^8.10", + "spatie/laravel-ignition": "^2.0", + "squizlabs/php_codesniffer": "^3.6", + "thedoctor0/laravel-factory-generator": "^1.2" }, "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" - }, - "classmap": [ - "class" - ] + } }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/laravel-shift/eloquent-model-generator.git" + } + ], "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, - "minimum-stability": "dev", - "prefer-stable": true, "scripts": { "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ "@php artisan key:generate --ansi" ] - } + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true, + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true } diff --git a/composer.lock b/composer.lock index 8a1e145..bf50212 100644 --- a/composer.lock +++ b/composer.lock @@ -4,86 +4,29 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7b08999e5a20a4f175350f32648b750e", + "content-hash": "aba18a51281f2bde53e2123d600cfbbb", "packages": [ - { - "name": "asm89/stack-cors", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/asm89/stack-cors.git", - "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/asm89/stack-cors/zipball/73e5b88775c64ccc0b84fb60836b30dc9d92ac4a", - "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0", - "symfony/http-foundation": "^4|^5|^6", - "symfony/http-kernel": "^4|^5|^6" - }, - "require-dev": { - "phpunit/phpunit": "^7|^9", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Asm89\\Stack\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexander", - "email": "iam.asm89@gmail.com" - } - ], - "description": "Cross-origin resource sharing library and stack middleware", - "homepage": "https://github.com/asm89/stack-cors", - "keywords": [ - "cors", - "stack" - ], - "support": { - "issues": "https://github.com/asm89/stack-cors/issues", - "source": "https://github.com/asm89/stack-cors/tree/v2.1.1" - }, - "time": "2022-01-18T09:12:03+00:00" - }, { "name": "brick/math", - "version": "0.9.3", + "version": "0.11.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.1 || ^8.0" + "php": "^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.9.2" + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" }, "type": "library", "autoload": { @@ -108,19 +51,227 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.3" + "source": "https://github.com/brick/math/tree/0.11.0" }, "funding": [ { "url": "https://github.com/BenMorel", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" } ], - "time": "2021-08-15T20:50:18+00:00" + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-21T13:15:14+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "diglactic/laravel-breadcrumbs", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/diglactic/laravel-breadcrumbs.git", + "reference": "f72a78eb3e26aea507d7888a65f15e5790864e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/diglactic/laravel-breadcrumbs/zipball/f72a78eb3e26aea507d7888a65f15e5790864e21", + "reference": "f72a78eb3e26aea507d7888a65f15e5790864e21", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "laravel/framework": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "davejamesmiller/laravel-breadcrumbs": "*" + }, + "require-dev": { + "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5 || ^9.5", + "spatie/phpunit-snapshot-assertions": "^2.2 || ^4.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Diglactic\\Breadcrumbs\\ServiceProvider" + ], + "aliases": { + "Breadcrumbs": "Diglactic\\Breadcrumbs\\Breadcrumbs" + } + } + }, + "autoload": { + "psr-4": { + "Diglactic\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sheng Slogar", + "email": "sheng@diglactic.com", + "role": "Maintainer" + }, + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com", + "role": "Original Creator" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/diglactic/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "support": { + "issues": "https://github.com/diglactic/laravel-breadcrumbs/issues", + "source": "https://github.com/diglactic/laravel-breadcrumbs/tree/v8.1.1" + }, + "time": "2023-04-17T23:24:15+00:00" }, { "name": "doctrine/inflector", @@ -215,31 +366,32 @@ }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -271,7 +423,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -287,7 +439,7 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "dragonmantank/cron-expression", @@ -352,27 +504,26 @@ }, { "name": "egulias/email-validator", - "version": "2.1.25", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", "shasum": "" }, "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -380,7 +531,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -408,7 +559,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" }, "funding": [ { @@ -416,42 +567,95 @@ "type": "github" } ], - "time": "2020-12-29T14:50:06+00:00" + "time": "2023-01-14T14:17:03+00:00" }, { - "name": "fideloper/proxy", - "version": "4.4.2", + "name": "ezyang/htmlpurifier", + "version": "v4.16.0", "source": { "type": "git", - "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750" + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/a751f2bc86dd8e6cfef12dc0cbdada82f5a18750", - "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", "shasum": "" }, "require": { - "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0", - "php": ">=5.4.0" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" }, "require-dev": { - "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^8.5.8|^9.3.3" + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Fideloper\\Proxy\\TrustedProxyServiceProvider" - ] - } + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" + }, + "time": "2022-09-18T07:06:19+00:00" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", "autoload": { "psr-4": { - "Fideloper\\Proxy\\": "src/" + "Facade\\IgnitionContracts\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -460,57 +664,52 @@ ], "authors": [ { - "name": "Chris Fidao", - "email": "fideloper@gmail.com" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" } ], - "description": "Set trusted proxies for Laravel", + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", "keywords": [ - "load balancing", - "proxy", - "trusted proxy" + "contracts", + "flare", + "ignition" ], "support": { - "issues": "https://github.com/fideloper/TrustedProxy/issues", - "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.2" + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" }, - "time": "2022-02-09T13:33:34+00:00" + "time": "2020-10-16T08:27:54+00:00" }, { - "name": "fruitcake/laravel-cors", - "version": "v2.2.0", + "name": "fruitcake/php-cors", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/fruitcake/laravel-cors.git", - "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534" + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/783a74f5e3431d7b9805be8afb60fd0a8f743534", - "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", "shasum": "" }, "require": { - "asm89/stack-cors": "^2.0.1", - "illuminate/contracts": "^6|^7|^8|^9", - "illuminate/support": "^6|^7|^8|^9", - "php": ">=7.2" + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" }, "require-dev": { - "laravel/framework": "^6|^7.24|^8", - "orchestra/testbench-dusk": "^4|^5|^6|^7", - "phpunit/phpunit": "^6|^7|^8|^9", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" - }, - "laravel": { - "providers": [ - "Fruitcake\\Cors\\CorsServiceProvider" - ] + "dev-main": "1.1-dev" } }, "autoload": { @@ -528,20 +727,20 @@ "homepage": "https://fruitcake.nl" }, { - "name": "Barry vd. Heuvel", + "name": "Barryvdh", "email": "barryvdh@gmail.com" } ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", "keywords": [ - "api", "cors", - "crossdomain", - "laravel" + "laravel", + "symfony" ], "support": { - "issues": "https://github.com/fruitcake/laravel-cors/issues", - "source": "https://github.com/fruitcake/laravel-cors/tree/v2.2.0" + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" }, "funding": [ { @@ -553,8 +752,7 @@ "type": "github" } ], - "abandoned": true, - "time": "2022-02-23T14:25:13+00:00" + "time": "2022-02-20T15:07:15+00:00" }, { "name": "graham-campbell/result-type", @@ -943,6 +1141,207 @@ ], "time": "2023-08-03T15:06:02+00:00" }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2021-10-07T12:57:01+00:00" + }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7||^2.0", + "php": ">=7.3", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" + }, + "time": "2021-07-21T13:50:14+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + }, + "time": "2021-10-08T21:21:46+00:00" + }, { "name": "kwaadpepper/enum", "version": "2.1.3", @@ -1005,26 +1404,24 @@ }, { "name": "kwaadpepper/exception-handler", - "version": "0.0.6", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/Kwaadpepper/exception-handler.git", - "reference": "9e17a9c0a43755d91cb98717e3fc7ba17db0c1c7" + "reference": "7a70b7093155f3e709d218a79cba3aae7db71edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Kwaadpepper/exception-handler/zipball/9e17a9c0a43755d91cb98717e3fc7ba17db0c1c7", - "reference": "9e17a9c0a43755d91cb98717e3fc7ba17db0c1c7", + "url": "https://api.github.com/repos/Kwaadpepper/exception-handler/zipball/7a70b7093155f3e709d218a79cba3aae7db71edb", + "reference": "7a70b7093155f3e709d218a79cba3aae7db71edb", "shasum": "" }, "require": { - "illuminate/support": "~7|~8", - "laravel/framework": "~7|~8" + "illuminate/support": "~10", + "laravel/framework": "~10" }, "require-dev": { - "orchestra/testbench": "^6.13", - "phpunit/phpunit": "~9.0", - "squizlabs/php_codesniffer": "^3.5" + "slevomat/coding-standard": "^8.10" }, "type": "library", "extra": { @@ -1060,9 +1457,9 @@ ], "support": { "issues": "https://github.com/Kwaadpepper/exception-handler/issues", - "source": "https://github.com/Kwaadpepper/exception-handler/tree/0.0.6" + "source": "https://github.com/Kwaadpepper/exception-handler/tree/2.0.0" }, - "time": "2021-12-01T08:54:11+00:00" + "time": "2023-05-23T17:48:40+00:00" }, { "name": "kwaadpepper/serial-int-caster", @@ -1112,56 +1509,66 @@ }, { "name": "laravel/framework", - "version": "v8.83.27", + "version": "v10.19.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49" + "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", - "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", + "url": "https://api.github.com/repos/laravel/framework/zipball/b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", + "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", "shasum": "" }, "require": { - "doctrine/inflector": "^1.4|^2.0", - "dragonmantank/cron-expression": "^3.0.2", - "egulias/email-validator": "^2.1.10", - "ext-json": "*", + "brick/math": "^0.9.3|^0.10.2|^0.11", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", "ext-mbstring": "*", "ext-openssl": "*", - "laravel/serializable-closure": "^1.0", - "league/commonmark": "^1.3|^2.0.2", - "league/flysystem": "^1.1", - "monolog/monolog": "^2.0", - "nesbot/carbon": "^2.53.1", - "opis/closure": "^3.6", - "php": "^7.3|^8.0", - "psr/container": "^1.0", - "psr/log": "^1.0|^2.0", - "psr/simple-cache": "^1.0", - "ramsey/uuid": "^4.2.2", - "swiftmailer/swiftmailer": "^6.3", - "symfony/console": "^5.4", - "symfony/error-handler": "^5.4", - "symfony/finder": "^5.4", - "symfony/http-foundation": "^5.4", - "symfony/http-kernel": "^5.4", - "symfony/mime": "^5.4", - "symfony/process": "^5.4", - "symfony/routing": "^5.4", - "symfony/var-dumper": "^5.4", - "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.2", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.4.1", - "voku/portable-ascii": "^1.6.1" + "voku/portable-ascii": "^2.0" }, "conflict": { "tightenco/collect": "<5.5.33" }, "provide": { - "psr/container-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" }, "replace": { "illuminate/auth": "self.version", @@ -1169,6 +1576,7 @@ "illuminate/bus": "self.version", "illuminate/cache": "self.version", "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", "illuminate/config": "self.version", "illuminate/console": "self.version", "illuminate/container": "self.version", @@ -1186,6 +1594,7 @@ "illuminate/notifications": "self.version", "illuminate/pagination": "self.version", "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", "illuminate/routing": "self.version", @@ -1197,53 +1606,67 @@ "illuminate/view": "self.version" }, "require-dev": { - "aws/aws-sdk-php": "^3.198.1", - "doctrine/dbal": "^2.13.3|^3.1.4", - "filp/whoops": "^2.14.3", - "guzzlehttp/guzzle": "^6.5.5|^7.0.1", - "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "^1.4.4", - "orchestra/testbench-core": "^6.27", + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.4", "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^8.5.19|^9.5.8", - "predis/predis": "^1.1.9", - "symfony/cache": "^5.4" + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", "brianium/paratest": "Required to run tests in parallel (^6.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", - "ext-bcmath": "Required to use the multiple_of validation rule.", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", - "ext-pcntl": "Required to use all features of the queue worker.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", - "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "mockery/mockery": "Required to use mocking (^1.4.4).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", - "predis/predis": "Required to use the predis connector (^1.1.9).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", - "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "8.x-dev" + "dev-master": "10.x-dev" } }, "autoload": { @@ -1257,7 +1680,8 @@ "Illuminate\\": "src/Illuminate/", "Illuminate\\Support\\": [ "src/Illuminate/Macroable/", - "src/Illuminate/Collections/" + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" ] } }, @@ -1281,7 +1705,55 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-12-08T15:28:55+00:00" + "time": "2023-08-15T13:42:57+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/d880a909df144a4bf5760ebd09aba114f79d9adc", + "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.5" + }, + "time": "2023-08-15T14:29:44+00:00" }, { "name": "laravel/serializable-closure", @@ -1413,32 +1885,33 @@ }, { "name": "laravel/ui", - "version": "v3.4.6", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c" + "reference": "a58ec468db4a340b33f3426c778784717a2c144b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/65ec5c03f7fee2c8ecae785795b829a15be48c2c", - "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c", + "url": "https://api.github.com/repos/laravel/ui/zipball/a58ec468db4a340b33f3426c778784717a2c144b", + "reference": "a58ec468db4a340b33f3426c778784717a2c144b", "shasum": "" }, "require": { - "illuminate/console": "^8.42|^9.0", - "illuminate/filesystem": "^8.42|^9.0", - "illuminate/support": "^8.82|^9.0", - "illuminate/validation": "^8.42|^9.0", - "php": "^7.3|^8.0" + "illuminate/console": "^9.21|^10.0", + "illuminate/filesystem": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "illuminate/validation": "^9.21|^10.0", + "php": "^8.0" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0" + "orchestra/testbench": "^7.0|^8.0", + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "4.x-dev" }, "laravel": { "providers": [ @@ -1468,48 +1941,60 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v3.4.6" + "source": "https://github.com/laravel/ui/tree/v4.2.2" }, - "time": "2022-05-20T13:38:08+00:00" + "time": "2023-05-09T19:47:28+00:00" }, { "name": "league/commonmark", - "version": "1.6.7", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b" + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2b8185c13bc9578367a5bf901881d1c1b5bbd09b", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, - "bin": [ - "bin/commonmark" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, "autoload": { "psr-4": { "League\\CommonMark\\": "src" @@ -1527,7 +2012,7 @@ "role": "Lead Developer" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", @@ -1541,6 +2026,7 @@ ], "support": { "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", "issues": "https://github.com/thephpleague/commonmark/issues", "rss": "https://github.com/thephpleague/commonmark/releases.atom", "source": "https://github.com/thephpleague/commonmark" @@ -1563,58 +2049,136 @@ "type": "tidelift" } ], - "time": "2022-01-13T17:18:13+00:00" + "time": "2023-03-24T15:16:10+00:00" }, { - "name": "league/flysystem", - "version": "1.1.10", + "name": "league/config", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "1.2-dev" } }, "autoload": { "psr-4": { - "League\\Flysystem\\": "src/" + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.15.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a141d430414fcb8bf797a18716b09f759a385bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a141d430414fcb8bf797a18716b09f759a385bed", + "reference": "a141d430414fcb8bf797a18716b09f759a385bed", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.220.0", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1624,63 +2188,121 @@ "authors": [ { "name": "Frank de Jonge", - "email": "info@frenky.net" + "email": "info@frankdejonge.nl" } ], - "description": "Filesystem abstraction: Many filesystems, one API.", + "description": "File storage abstraction for PHP", "keywords": [ - "Cloud Files", "WebDAV", - "abstraction", "aws", "cloud", - "copy.com", - "dropbox", - "file systems", + "file", "files", "filesystem", "filesystems", "ftp", - "rackspace", - "remote", "s3", "sftp", "storage" ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + "source": "https://github.com/thephpleague/flysystem/tree/3.15.1" }, "funding": [ { - "url": "https://offset.earth/frankdejonge", - "type": "other" + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" } ], - "time": "2022-10-04T09:16:37+00:00" + "time": "2023-05-04T09:04:26+00:00" }, { - "name": "league/mime-type-detection", - "version": "1.12.0", + "name": "league/flysystem-local", + "version": "3.15.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "c7f2872fb273bf493811473dafc88d60ae829f48" + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/c7f2872fb273bf493811473dafc88d60ae829f48", - "reference": "c7f2872fb273bf493811473dafc88d60ae829f48", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-05-02T20:02:14+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -1701,7 +2323,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.12.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" }, "funding": [ { @@ -1713,46 +2335,123 @@ "type": "tidelift" } ], - "time": "2023-08-03T07:14:11+00:00" + "time": "2023-08-05T12:09:49+00:00" }, { - "name": "monolog/monolog", - "version": "2.9.1", + "name": "mews/purifier", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" + "url": "https://github.com/mewebstudio/Purifier.git", + "reference": "48e7bddc18140412d7cd815b6eea2fc7a141c432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "url": "https://api.github.com/repos/mewebstudio/Purifier/zipball/48e7bddc18140412d7cd815b6eea2fc7a141c432", + "reference": "48e7bddc18140412d7cd815b6eea2fc7a141c432", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "ezyang/htmlpurifier": "^4.16.0", + "illuminate/config": "^5.8|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/filesystem": "^5.8|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^5.8|^6.0|^7.0|^8.0|^9.0|^10.0", + "php": "^7.2|^8.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "graham-campbell/testbench": "^3.2|^5.5.1", + "mockery/mockery": "^1.3.3", + "phpunit/phpunit": "^8.0|^9.0|^10.0" + }, + "suggest": { + "laravel/framework": "To test the Laravel bindings", + "laravel/lumen-framework": "To test the Lumen bindings" + }, + "type": "package", + "extra": { + "laravel": { + "providers": [ + "Mews\\Purifier\\PurifierServiceProvider" + ], + "aliases": { + "Purifier": "Mews\\Purifier\\Facades\\Purifier" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Mews\\Purifier\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Muharrem ERİN", + "email": "me@mewebstudio.com", + "homepage": "https://github.com/mewebstudio", + "role": "Developer" + } + ], + "description": "Laravel 5/6/7/8/9/10 HtmlPurifier Package", + "homepage": "https://github.com/mewebstudio/purifier", + "keywords": [ + "Laravel Purifier", + "Laravel Security", + "Purifier", + "htmlpurifier", + "laravel HtmlPurifier", + "security", + "xss" + ], + "support": { + "issues": "https://github.com/mewebstudio/Purifier/issues", + "source": "https://github.com/mewebstudio/Purifier/tree/3.4.1" + }, + "time": "2023-03-14T08:28:28+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -1775,7 +2474,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -1803,7 +2502,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.1" + "source": "https://github.com/Seldaek/monolog/tree/3.4.0" }, "funding": [ { @@ -1815,7 +2514,7 @@ "type": "tidelift" } ], - "time": "2023-02-06T13:44:46+00:00" + "time": "2023-06-21T08:46:11+00:00" }, { "name": "nesbot/carbon", @@ -1923,6 +2622,155 @@ ], "time": "2023-08-03T09:00:52+00:00" }, + { + "name": "nette/schema", + "version": "v1.2.4", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": "7.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.4" + }, + "time": "2023-08-05T18:56:25+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.1", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/9124157137da01b1f5a5a22d6486cb975f26db7e", + "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.1" + }, + "time": "2023-07-30T15:42:21+00:00" + }, { "name": "nikic/php-parser", "version": "v4.17.1", @@ -1980,38 +2828,50 @@ "time": "2023-08-13T19:53:39+00:00" }, { - "name": "opis/closure", - "version": "3.6.3", + "name": "nunomaduro/termwind", + "version": "v1.15.1", "source": { "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0" + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" }, "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.6.x-dev" + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] } }, "autoload": { "files": [ - "functions.php" + "src/Functions.php" ], "psr-4": { - "Opis\\Closure\\": "src/" + "Termwind\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2020,29 +2880,501 @@ ], "authors": [ { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" - }, - { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", + "description": "Its like Tailwind CSS, but for the console.", "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" + "cli", + "console", + "css", + "package", + "php", + "style" ], "support": { - "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.3" + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" }, - "time": "2022-01-27T09:35:39+00:00" + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2023-05-02T11:26:24+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.0" + }, + "time": "2023-05-17T06:46:59+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.19.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e", + "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.1" + }, + "time": "2023-07-11T07:02:26+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" + }, + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.0" + }, + "time": "2023-05-17T06:43:38+00:00" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, + { + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" }, { "name": "phpoption/phpoption", @@ -2169,22 +3501,27 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -2211,9 +3548,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -2427,30 +3764,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2471,31 +3808,31 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "psr/simple-cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -2510,7 +3847,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for simple caching", @@ -2522,9 +3859,9 @@ "simple-cache" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2017-10-23T01:57:42+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { "name": "psy/psysh", @@ -2648,42 +3985,52 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": "^7.3 || ^8", - "symfony/polyfill-php81": "^1.23" + "php": "^8.1" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -2711,7 +4058,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { @@ -2723,29 +4070,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { "name": "ramsey/uuid", - "version": "4.2.3", + "version": "4.7.4", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + "reference": "60a4c63ab724854332900504274f6150ff26d286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", + "reference": "60a4c63ab724854332900504274f6150ff26d286", "shasum": "" }, "require": { - "brick/math": "^0.8 || ^0.9", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", "ext-json": "*", - "php": "^7.2 || ^8.0", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php80": "^1.14" + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -2757,24 +4102,23 @@ "doctrine/annotations": "^1.8", "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", "paragonie/random-lib": "^2", "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", "php-parallel-lint/php-parallel-lint": "^1.1", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", "phpunit/phpunit": "^8.5 || ^9", - "slevomat/coding-standard": "^7.0", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -2782,9 +4126,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "4.x-dev" - }, "captainhook": { "force-install": true } @@ -2809,7 +4150,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.2.3" + "source": "https://github.com/ramsey/uuid/tree/4.7.4" }, "funding": [ { @@ -2821,7 +4162,7 @@ "type": "tidelift" } ], - "time": "2021-09-25T23:10:38+00:00" + "time": "2023-04-15T23:01:58+00:00" }, { "name": "ruafozy/mersenne-twister", @@ -2867,43 +4208,124 @@ "time": "2015-02-21T10:26:45+00:00" }, { - "name": "swiftmailer/swiftmailer", - "version": "v6.3.0", + "name": "sentry/sdk", + "version": "3.5.0", "source": { "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "cd91b752f07c4bab9fb3b173f81af68a78a78d6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/cd91b752f07c4bab9fb3b173f81af68a78a78d6d", + "reference": "cd91b752f07c4bab9fb3b173f81af68a78a78d6d", "shasum": "" }, "require": { - "egulias/email-validator": "^2.0|^3.1", - "php": ">=7.0.0", - "symfony/polyfill-iconv": "^1.0", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.19", + "symfony/http-client": "^4.3|^5.0|^6.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php-sdk/issues", + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.5.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2023-06-12T17:50:36+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.21.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/624aafc22b84b089ffa43b71fb01e0096505ec4f", + "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.5.3|^2.0", + "jean85/pretty-package-versions": "^1.5|^2.0.4", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.15", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.1", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", + "symfony/polyfill-php80": "^1.17" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" }, "require-dev": { - "mockery/mockery": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.4" + "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.6|^2.0|^3.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5.14|^9.4", + "symfony/phpunit-bridge": "^5.2|^6.0", + "vimeo/psalm": "^4.17" }, "suggest": { - "ext-intl": "Needed to support internationalized email addresses" + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, "autoload": { "files": [ - "lib/swift_required.php" - ] + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2911,85 +4333,167 @@ ], "authors": [ { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sentry", + "email": "accounts@sentry.io" } ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", "keywords": [ - "email", - "mail", - "mailer" + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" ], "support": { - "issues": "https://github.com/swiftmailer/swiftmailer/issues", - "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.21.0" }, "funding": [ { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://sentry.io/", + "type": "custom" }, { - "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", - "type": "tidelift" + "url": "https://sentry.io/pricing/", + "type": "custom" } ], - "abandoned": "symfony/mailer", - "time": "2021-10-18T15:26:12+00:00" + "time": "2023-07-31T15:31:24+00:00" }, { - "name": "symfony/console", - "version": "v5.4.26", + "name": "sentry/sentry-laravel", + "version": "3.7.3", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273" + "url": "https://github.com/getsentry/sentry-laravel.git", + "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273", - "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", + "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" + "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", + "nyholm/psr7": "^1.0", + "php": "^7.2 | ^8.0", + "sentry/sdk": "^3.4", + "sentry/sentry": "^3.20.1", + "symfony/psr-http-message-bridge": "^1.0 | ^2.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "friendsofphp/php-cs-fixer": "^3.11", + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", + "mockery/mockery": "^1.3", + "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.4 | ^9.3" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev", + "dev-0.x": "0.x-dev" + }, + "laravel": { + "providers": [ + "Sentry\\Laravel\\ServiceProvider", + "Sentry\\Laravel\\Tracing\\ServiceProvider" + ], + "aliases": { + "Sentry": "Sentry\\Laravel\\Facade" + } + } + }, + "autoload": { + "psr-0": { + "Sentry\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "Laravel SDK for Sentry (https://sentry.io)", + "homepage": "https://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "laravel", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-laravel/issues", + "source": "https://github.com/getsentry/sentry-laravel/tree/3.7.3" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2023-08-03T10:10:23+00:00" + }, + { + "name": "symfony/console", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/aa5d64ad3f63f2e48964fc81ee45cb318a723898", + "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -3023,7 +4527,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.26" + "source": "https://github.com/symfony/console/tree/v6.3.2" }, "funding": [ { @@ -3039,25 +4543,24 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:11:33+00:00" + "time": "2023-07-19T20:17:28+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.26", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", - "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -3089,7 +4592,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.26" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -3105,29 +4608,29 @@ "type": "tidelift" } ], - "time": "2023-07-07T06:10:25+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3156,7 +4659,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -3172,31 +4675,34 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/error-handler", - "version": "v5.4.26", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "b26719213a39c9ba57520cbc5e52bfcc5e8d92f9" + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/b26719213a39c9ba57520cbc5e52bfcc5e8d92f9", - "reference": "b26719213a39c9ba57520cbc5e52bfcc5e8d92f9", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a", + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/var-dumper": "^5.4|^6.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -3227,7 +4733,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.26" + "source": "https://github.com/symfony/error-handler/tree/v6.3.2" }, "funding": [ { @@ -3243,48 +4749,43 @@ "type": "tidelift" } ], - "time": "2023-07-16T16:48:57+00:00" + "time": "2023-07-16T17:05:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.26", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -3312,7 +4813,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -3328,33 +4829,30 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:34:20+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3391,7 +4889,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -3407,26 +4905,27 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/finder", - "version": "v5.4.27", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" }, "type": "library", "autoload": { @@ -3454,7 +4953,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.27" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -3470,39 +4969,210 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:02:31+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { - "name": "symfony/http-foundation", - "version": "v5.4.26", + "name": "symfony/http-client", + "version": "v6.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e7793151e99dc2ac1352ff3735d100fb3b3bfc08" + "url": "https://github.com/symfony/http-client.git", + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793151e99dc2ac1352ff3735d100fb3b3bfc08", - "reference": "e7793151e99dc2ac1352ff3735d100fb3b3bfc08", + "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v6.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-05T08:41:27+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3b66325d0176b4ec826bffab57c9037d759c31fb", + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", + "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.2" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "type": "library", "autoload": { @@ -3530,7 +5200,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.26" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.2" }, "funding": [ { @@ -3546,76 +5216,77 @@ "type": "tidelift" } ], - "time": "2023-07-21T11:30:15+00:00" + "time": "2023-07-23T21:58:39+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.27", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9f5624816c0b8d92f85666ac7ed2825a18fcd899" + "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f5624816c0b8d92f85666ac7ed2825a18fcd899", - "reference": "9f5624816c0b8d92f85666ac7ed2825a18fcd899", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d3b567f0addf695e10b0c6d57564a9bea2e058ee", + "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.4.21|^6.2.7", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^6.2.7", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.3", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/clock": "^6.2", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.3", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4.5|^6.0.5", + "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^6.3", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^6.3", + "symfony/var-exporter": "^6.2", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -3642,7 +5313,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.27" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.3" }, "funding": [ { @@ -3658,43 +5329,123 @@ "type": "tidelift" } ], - "time": "2023-07-31T10:18:38+00:00" + "time": "2023-07-31T10:33:00+00:00" }, { - "name": "symfony/mime", - "version": "v5.4.26", + "name": "symfony/mailer", + "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2" + "url": "https://github.com/symfony/mailer.git", + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2ea06dfeee20000a319d8407cea1d47533d5a9d2", - "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-29T12:49:39+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.26|>=6,<6.2.13|>=6.3,<6.3.2" + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.26|~6.2.13|^6.3.2" + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -3726,7 +5477,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.26" + "source": "https://github.com/symfony/mime/tree/v6.3.3" }, "funding": [ { @@ -3742,7 +5493,74 @@ "type": "tidelift" } ], - "time": "2023-07-27T06:29:31+00:00" + "time": "2023-07-31T07:08:24+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-12T14:21:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3826,89 +5644,6 @@ ], "time": "2022-11-03T14:55:06+00:00" }, - { - "name": "symfony/polyfill-iconv", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "927013f3aac555983a5059aada98e1907d842695" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", - "reference": "927013f3aac555983a5059aada98e1907d842695", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-iconv": "*" - }, - "suggest": { - "ext-iconv": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Iconv extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "iconv", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.27.0", @@ -4320,85 +6055,6 @@ ], "time": "2022-11-03T14:55:06+00:00" }, - { - "name": "symfony/polyfill-php73", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, { "name": "symfony/polyfill-php80", "version": "v1.27.0", @@ -4483,21 +6139,22 @@ "time": "2022-11-03T14:55:06+00:00" }, { - "name": "symfony/polyfill-php81", + "name": "symfony/polyfill-php83", "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" }, "type": "library", "extra": { @@ -4514,11 +6171,8 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Symfony\\Polyfill\\Php83\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4534,7 +6188,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4543,7 +6197,89 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" }, "funding": [ { @@ -4563,21 +6299,20 @@ }, { "name": "symfony/process", - "version": "v5.4.26", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f" + "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/1a44dc377ec86a50fab40d066cd061e28a6b482f", - "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f", + "url": "https://api.github.com/repos/symfony/process/zipball/c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", + "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -4605,7 +6340,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.26" + "source": "https://github.com/symfony/process/tree/v6.3.2" }, "funding": [ { @@ -4621,47 +6356,129 @@ "type": "tidelift" } ], - "time": "2023-07-12T15:44:31+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { - "name": "symfony/routing", - "version": "v5.4.26", + "name": "symfony/psr-http-message-bridge", + "version": "v2.3.1", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "853fc7df96befc468692de0a48831b38f04d2cb2" + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/853fc7df96befc468692de0a48831b38f04d2cb2", - "reference": "853fc7df96befc468692de0a48831b38f04d2cb2", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/browser-kit": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/http-kernel": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-26T11:53:26+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a", + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "symfony/config": "^6.2", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -4695,7 +6512,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.26" + "source": "https://github.com/symfony/routing/tree/v6.3.3" }, "funding": [ { @@ -4711,37 +6528,33 @@ "type": "tidelift" } ], - "time": "2023-07-24T13:28:37+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4751,7 +6564,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4778,7 +6594,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -4794,38 +6610,38 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v5.4.26", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "1181fe9270e373537475e826873b5867b863883c" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", - "reference": "1181fe9270e373537475e826873b5867b863883c", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": ">=3.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -4864,7 +6680,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.26" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -4880,57 +6696,55 @@ "type": "tidelift" } ], - "time": "2023-06-28T12:46:07+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/translation", - "version": "v5.4.24", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "de237e59c5833422342be67402d487fbf50334ff" + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/de237e59c5833422342be67402d487fbf50334ff", - "reference": "de237e59c5833422342be67402d487fbf50334ff", + "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^2.3" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/config": "<4.4", - "symfony/console": "<5.3", - "symfony/dependency-injection": "<5.0", - "symfony/http-kernel": "<5.0", - "symfony/twig-bundle": "<5.0", - "symfony/yaml": "<4.4" + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" }, "provide": { - "symfony/translation-implementation": "2.3" + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { + "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", + "symfony/config": "^5.4|^6.0", "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.0|^6.0", - "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -4961,7 +6775,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.24" + "source": "https://github.com/symfony/translation/tree/v6.3.3" }, "funding": [ { @@ -4977,32 +6791,29 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:34:17+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", "shasum": "" }, "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5012,7 +6823,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5039,7 +6853,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" }, "funding": [ { @@ -5055,43 +6869,112 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2023-05-30T17:17:10+00:00" }, { - "name": "symfony/var-dumper", - "version": "v5.4.26", + "name": "symfony/uid", + "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "e706c99b4a6f4d9383b52b80dd8c74880501e314" + "url": "https://github.com/symfony/uid.git", + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e706c99b4a6f4d9383b52b80dd8c74880501e314", - "reference": "e706c99b4a6f4d9383b52b80dd8c74880501e314", + "url": "https://api.github.com/repos/symfony/uid/zipball/01b0f20b1351d997711c56f1638f7a8c3061e384", + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-08T07:25:02+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "77fb4f2927f6991a9843633925d111147449ee7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/77fb4f2927f6991a9843633925d111147449ee7a", + "reference": "77fb4f2927f6991a9843633925d111147449ee7a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -5128,7 +7011,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.26" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.3" }, "funding": [ { @@ -5144,7 +7027,7 @@ "type": "tidelift" } ], - "time": "2023-07-13T07:32:46+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5285,16 +7168,16 @@ }, { "name": "voku/portable-ascii", - "version": "1.6.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" + "reference": "b56450eed252f6801410d810c8e1727224ae0743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", "shasum": "" }, "require": { @@ -5331,7 +7214,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.6.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, "funding": [ { @@ -5355,7 +7238,7 @@ "type": "tidelift" } ], - "time": "2022-01-24T18:55:24+00:00" + "time": "2022-03-08T17:03:00+00:00" }, { "name": "webmozart/assert", @@ -5419,35 +7302,38 @@ "packages-dev": [ { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.2", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", "shasum": "" }, "require": { "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3", + "php": ">=5.4", "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" }, "require-dev": { "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0" + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", "extra": { - "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, "autoload": { "psr-4": { - "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5463,7 +7349,7 @@ }, { "name": "Contributors", - "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", @@ -5487,10 +7373,10 @@ "tests" ], "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2022-02-04T12:51:07+00:00" + "time": "2023-01-05T11:28:13+00:00" }, { "name": "doctrine/cache", @@ -5587,35 +7473,40 @@ }, { "name": "doctrine/dbal", - "version": "2.13.9", + "version": "3.6.6", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + "reference": "63646ffd71d1676d2f747f871be31b7e921c7864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/63646ffd71d1676d2f747f871be31b7e921c7864", + "reference": "63646ffd71d1676d2f747f871be31b7e921c7864", "shasum": "" }, "require": { - "doctrine/cache": "^1.0|^2.0", + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.4.6", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.22.0" + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.29", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.9", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4|^6.0", + "symfony/console": "^4.4|^5.4|^6.0", + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -5626,7 +7517,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5669,14 +7560,13 @@ "queryobject", "sasql", "sql", - "sqlanywhere", "sqlite", "sqlserver", "sqlsrv" ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.9" + "source": "https://github.com/doctrine/dbal/tree/3.6.6" }, "funding": [ { @@ -5692,7 +7582,7 @@ "type": "tidelift" } ], - "time": "2022-05-02T20:28:55+00:00" + "time": "2023-08-17T05:38:17+00:00" }, { "name": "doctrine/deprecations", @@ -5743,30 +7633,29 @@ }, { "name": "doctrine/event-manager", - "version": "1.2.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.24" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" }, "type": "library", "autoload": { @@ -5815,7 +7704,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" }, "funding": [ { @@ -5831,247 +7720,53 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:51:15+00:00" + "time": "2022-10-12T20:59:15+00:00" }, { - "name": "doctrine/instantiator", - "version": "1.5.0", + "name": "fakerphp/faker", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:15:36+00:00" - }, - { - "name": "facade/flare-client-php", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/facade/flare-client-php.git", - "reference": "213fa2c69e120bca4c51ba3e82ed1834ef3f41b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/213fa2c69e120bca4c51ba3e82ed1834ef3f41b8", - "reference": "213fa2c69e120bca4c51ba3e82ed1834ef3f41b8", - "shasum": "" - }, - "require": { - "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0", - "php": "^7.1|^8.0", - "symfony/http-foundation": "^3.3|^4.1|^5.0", - "symfony/mime": "^3.4|^4.0|^5.1", - "symfony/var-dumper": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "phpunit/phpunit": "^7.5", - "spatie/phpunit-snapshot-assertions": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Facade\\FlareClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/facade/flare-client-php", - "keywords": [ - "exception", - "facade", - "flare", - "reporting" - ], - "support": { - "issues": "https://github.com/facade/flare-client-php/issues", - "source": "https://github.com/facade/flare-client-php/tree/1.10.0" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2022-08-09T11:23:57+00:00" - }, - { - "name": "facade/ignition", - "version": "2.17.7", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition.git", - "reference": "b4f5955825bb4b74cba0f94001761c46335c33e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/b4f5955825bb4b74cba0f94001761c46335c33e9", - "reference": "b4f5955825bb4b74cba0f94001761c46335c33e9", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "facade/flare-client-php": "^1.9.1", - "facade/ignition-contracts": "^1.0.2", - "illuminate/support": "^7.0|^8.0", - "monolog/monolog": "^2.0", - "php": "^7.2.5|^8.0", - "symfony/console": "^5.0", - "symfony/var-dumper": "^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "livewire/livewire": "^2.4", - "mockery/mockery": "^1.3", - "orchestra/testbench": "^5.0|^6.0", - "psalm/plugin-laravel": "^1.2" + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, "suggest": { - "laravel/telescope": "^3.1" + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Facade\\Ignition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Facade\\Ignition\\Facades\\Flare" - } + "dev-main": "v1.21-dev" } }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Facade\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://github.com/facade/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/facade/ignition/issues", - "source": "https://github.com/facade/ignition" - }, - "time": "2023-01-26T12:34:59+00:00" - }, - { - "name": "facade/ignition-contracts", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^v2.15.8", - "phpunit/phpunit": "^9.3.11", - "vimeo/psalm": "^3.17.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" + "Faker\\": "src/Faker/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6080,24 +7775,20 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" + "name": "François Zaninotto" } ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", + "description": "Faker is a PHP library that generates fake data for you.", "keywords": [ - "contracts", - "flare", - "ignition" + "data", + "faker", + "fixtures" ], "support": { - "issues": "https://github.com/facade/ignition-contracts/issues", - "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0" }, - "time": "2020-10-16T08:27:54+00:00" + "time": "2023-06-12T08:44:38+00:00" }, { "name": "filp/whoops", @@ -6170,61 +7861,6 @@ ], "time": "2023-07-13T12:00:00+00:00" }, - { - "name": "fzaninotto/faker", - "version": "v1.9.2", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e", - "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/fzaninotto/Faker/issues", - "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" - }, - "abandoned": true, - "time": "2020-12-11T09:56:16+00:00" - }, { "name": "hamcrest/hamcrest-php", "version": "v2.0.1", @@ -6276,6 +7912,296 @@ }, "time": "2020-07-09T08:09:16+00:00" }, + { + "name": "kitloong/laravel-migrations-generator", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/kitloong/laravel-migrations-generator.git", + "reference": "116f50fab918b7f1363a40ebd954ce250f6aedcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kitloong/laravel-migrations-generator/zipball/116f50fab918b7f1363a40ebd954ce250f6aedcd", + "reference": "116f50fab918b7f1363a40ebd954ce250f6aedcd", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.4|^3.0", + "ext-pdo": "*", + "illuminate/support": "^5.6|^6.0|^7.0|^8.0|^9.0|^10.0", + "myclabs/php-enum": "^1.6|^1.7|^1.8", + "php": ">=7.1.3" + }, + "require-dev": { + "barryvdh/laravel-ide-helper": "^2.5", + "friendsofphp/php-cs-fixer": "^2.19.0|^3.1", + "mockery/mockery": "^1.0", + "nunomaduro/larastan": "^0.4|^0.5|^0.6|^0.7|^1.0|^2.0", + "orchestra/testbench": "^3.6|^4.0|^5.0|^6.0|^7.0|^8.0", + "phpmd/phpmd": "^2.10", + "slevomat/coding-standard": "^6.0|^7.0|^8.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "KitLoong\\MigrationsGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kit Loong", + "email": "kitloong1008@gmail.com" + } + ], + "description": "Generates Laravel Migrations from an existing database", + "keywords": [ + "artisan", + "generator", + "laravel", + "lumen", + "migration", + "migrations" + ], + "support": { + "issues": "https://github.com/kitloong/laravel-migrations-generator/issues", + "source": "https://github.com/kitloong/laravel-migrations-generator/tree/v6.10.0" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/kitloong", + "type": "custom" + } + ], + "time": "2023-03-26T07:37:00+00:00" + }, + { + "name": "krlove/code-generator", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/krlove/code-generator.git", + "reference": "1ac521f5ef79a376282e3315ba6a13a83c63fb9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/krlove/code-generator/zipball/1ac521f5ef79a376282e3315ba6a13a83c63fb9a", + "reference": "1ac521f5ef79a376282e3315ba6a13a83c63fb9a", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Krlove\\CodeGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Code Generator", + "support": { + "issues": "https://github.com/krlove/code-generator/issues", + "source": "https://github.com/krlove/code-generator/tree/1.0.1" + }, + "time": "2022-02-20T12:24:22+00:00" + }, + { + "name": "krlove/eloquent-model-generator", + "version": "dev-l10-compatibility", + "source": { + "type": "git", + "url": "https://github.com/laravel-shift/eloquent-model-generator.git", + "reference": "d8f0280de04d85cf2991e5a5dd317f5dea239d95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-shift/eloquent-model-generator/zipball/d8f0280de04d85cf2991e5a5dd317f5dea239d95", + "reference": "d8f0280de04d85cf2991e5a5dd317f5dea239d95", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^3.5", + "illuminate/config": "^10.0", + "illuminate/console": "^10.0", + "illuminate/database": "^10.0", + "illuminate/support": "^10.0", + "krlove/code-generator": "^1.0", + "php": "^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Krlove\\EloquentModelGenerator\\Provider\\GeneratorServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Krlove\\EloquentModelGenerator\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Krlove\\Tests\\Integration\\": "tests/integration" + } + }, + "license": [ + "MIT" + ], + "description": "Eloquent Model Generator", + "support": { + "source": "https://github.com/laravel-shift/eloquent-model-generator/tree/l10-compatibility" + }, + "time": "2023-01-30T20:15:06+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "88e835bf922b94017778bde89ef8f215e1ea40db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/88e835bf922b94017778bde89ef8f215e1ea40db", + "reference": "88e835bf922b94017778bde89ef8f215e1ea40db", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.21.1", + "illuminate/view": "^10.5.1", + "laravel-zero/framework": "^10.1.1", + "mockery/mockery": "^1.5.1", + "nunomaduro/larastan": "^2.5.1", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.4.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2023-08-15T15:30:00+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.23.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "cfa1ad579349110a87f9412eb65ecba94d682ac2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/cfa1ad579349110a87f9412eb65ecba94d682ac2", + "reference": "cfa1ad579349110a87f9412eb65ecba94d682ac2", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^8.0", + "symfony/yaml": "^6.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2023-08-17T12:49:32+00:00" + }, { "name": "mockery/mockery", "version": "1.6.6", @@ -6421,35 +8347,101 @@ "time": "2023-03-08T13:26:56+00:00" }, { - "name": "nunomaduro/collision", - "version": "v5.11.0", + "name": "myclabs/php-enum", + "version": "1.8.4", "source": { "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461" + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/8b610eef8582ccdc05d8f2ab23305e2d37049461", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", "shasum": "" }, "require": { - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.14.3", - "php": "^7.3 || ^8.0", - "symfony/console": "^5.0" + "ext-json": "*", + "php": "^7.3 || ^8.0" }, "require-dev": { - "brianium/paratest": "^6.1", - "fideloper/proxy": "^4.4.1", - "fruitcake/laravel-cors": "^2.0.3", - "laravel/framework": "8.x-dev", - "nunomaduro/larastan": "^0.6.2", - "nunomaduro/mock-final-classes": "^1.0", - "orchestra/testbench": "^6.0", - "phpstan/phpstan": "^0.12.64", - "phpunit/phpunit": "^9.5.0" + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2022-08-04T09:53:51+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.8.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "61553ad3260845d7e3e49121b7074619233d361b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/61553ad3260845d7e3e49121b7074619233d361b", + "reference": "61553ad3260845d7e3e49121b7074619233d361b", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.3", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.3.2" + }, + "require-dev": { + "brianium/paratest": "^7.2.4", + "laravel/framework": "^10.17.1", + "laravel/pint": "^1.10.5", + "laravel/sail": "^1.23.1", + "laravel/sanctum": "^3.2.5", + "laravel/tinker": "^2.8.1", + "nunomaduro/larastan": "^2.6.4", + "orchestra/testbench-core": "^8.5.9", + "pestphp/pest": "^2.12.1", + "phpunit/phpunit": "^10.3.1", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.2.0" }, "type": "library", "extra": { @@ -6460,6 +8452,9 @@ } }, "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], "psr-4": { "NunoMaduro\\Collision\\": "src/" } @@ -6505,7 +8500,7 @@ "type": "patreon" } ], - "time": "2022-01-10T16:22:52+00:00" + "time": "2023-08-07T08:03:21+00:00" }, { "name": "phar-io/manifest", @@ -6667,16 +8662,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.27", + "version": "10.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", + "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", "shasum": "" }, "require": { @@ -6684,18 +8679,18 @@ "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.15", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -6704,7 +8699,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "10.1-dev" } }, "autoload": { @@ -6733,7 +8728,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" }, "funding": [ { @@ -6741,32 +8736,32 @@ "type": "github" } ], - "time": "2023-07-26T13:44:30+00:00" + "time": "2023-07-26T13:45:28+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "5647d65443818959172645e7ed999217360654b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", + "reference": "5647d65443818959172645e7ed999217360654b6", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6793,7 +8788,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" }, "funding": [ { @@ -6801,28 +8797,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-05-07T09:13:23+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" @@ -6830,7 +8826,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6856,7 +8852,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { @@ -6864,32 +8860,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6915,7 +8911,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" }, "funding": [ { @@ -6923,32 +8919,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-02-03T06:56:46+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6974,7 +8970,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { @@ -6982,24 +8978,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.10", + "version": "10.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328" + "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6d351645c3fe5a30f5e86be6577d946af65a328", - "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", + "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -7009,27 +9004,26 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.0", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -7037,7 +9031,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -7069,7 +9063,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" }, "funding": [ { @@ -7085,32 +9079,81 @@ "type": "tidelift" } ], - "time": "2023-07-10T04:04:23+00:00" + "time": "2023-08-15T05:34:23+00:00" }, { - "name": "sebastian/cli-parser", - "version": "1.0.1", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" } }, "autoload": { @@ -7133,7 +9176,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" }, "funding": [ { @@ -7141,32 +9184,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2023-02-03T06:58:15+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -7189,7 +9232,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -7197,32 +9240,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -7244,7 +9287,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -7252,34 +9295,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7318,7 +9363,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -7326,33 +9372,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -7375,7 +9421,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" }, "funding": [ { @@ -7383,33 +9429,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-02-03T06:59:47+00:00" }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7441,7 +9487,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" }, "funding": [ { @@ -7449,27 +9496,27 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2023-05-01T07:48:21+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -7477,7 +9524,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7496,7 +9543,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -7504,7 +9551,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" }, "funding": [ { @@ -7512,34 +9560,34 @@ "type": "github" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2023-04-11T05:39:26+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7581,7 +9629,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" }, "funding": [ { @@ -7589,38 +9637,35 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2023-02-03T07:06:49+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7645,7 +9690,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" }, "funding": [ { @@ -7653,33 +9699,33 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2023-07-19T07:19:23+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -7702,7 +9748,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" }, "funding": [ { @@ -7710,34 +9756,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-02-03T07:08:02+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7759,7 +9805,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -7767,32 +9813,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -7814,7 +9860,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -7822,32 +9868,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7877,7 +9923,7 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -7885,87 +9931,32 @@ "type": "github" } ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2023-02-03T07:05:40+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -7988,7 +9979,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -7996,29 +9987,29 @@ "type": "github" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -8041,7 +10032,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -8049,46 +10040,46 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { "name": "slevomat/coding-standard", - "version": "7.2.1", + "version": "8.13.4", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90" + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/aff06ae7a84e4534bf6f821dc982a93a5d477c90", - "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4b2af2fb17773656d02fbfb5d18024ebd19fe322", + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": "^1.5.1", - "squizlabs/php_codesniffer": "^3.6.2" + "phpstan/phpdoc-parser": "^1.23.0", + "squizlabs/php_codesniffer": "^3.7.1" }, "require-dev": { - "phing/phing": "2.17.3", + "phing/phing": "2.17.4", "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.4.10|1.7.1", - "phpstan/phpstan-deprecation-rules": "1.0.0", - "phpstan/phpstan-phpunit": "1.0.0|1.1.1", - "phpstan/phpstan-strict-rules": "1.2.3", - "phpunit/phpunit": "7.5.20|8.5.21|9.5.20" + "phpstan/phpstan": "1.10.26", + "phpstan/phpstan-deprecation-rules": "1.1.3", + "phpstan/phpstan-phpunit": "1.3.13", + "phpstan/phpstan-strict-rules": "1.5.1", + "phpunit/phpunit": "7.5.20|8.5.21|9.6.8|10.2.6" }, "type": "phpcodesniffer-standard", "extra": { "branch-alias": { - "dev-master": "7.x-dev" + "dev-master": "8.x-dev" } }, "autoload": { "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard" + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8096,9 +10087,13 @@ "MIT" ], "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/7.2.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.13.4" }, "funding": [ { @@ -8110,7 +10105,314 @@ "type": "tidelift" } ], - "time": "2022-05-25T10:58:12+00:00" + "time": "2023-07-25T10:28:55+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.4.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-07-28T08:07:24+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "de24ff1e01814d5043bd6eb4ab36a5a852a04973" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/de24ff1e01814d5043bd6eb4ab36a5a852a04973", + "reference": "de24ff1e01814d5043bd6eb4ab36a5a852a04973", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "illuminate/cache": "^9.52", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^6.0", + "symfony/process": "^5.4|^6.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-06-28T13:24:59+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "dd15fbe82ef5392798941efae93c49395a87d943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/dd15fbe82ef5392798941efae93c49395a87d943", + "reference": "dd15fbe82ef5392798941efae93c49395a87d943", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.9", + "symfony/console": "^6.2.3", + "symfony/var-dumper": "^6.2.3" + }, + "require-dev": { + "livewire/livewire": "^2.11", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.3.4", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^1.22.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-06-28T13:51:52+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -8169,6 +10471,140 @@ }, "time": "2023-02-22T23:07:41+00:00" }, + { + "name": "symfony/yaml", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T07:08:24+00:00" + }, + { + "name": "thedoctor0/laravel-factory-generator", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/TheDoctor0/laravel-factory-generator.git", + "reference": "7ee56e4229b78d5f6274a4649819b2bca0bd56e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TheDoctor0/laravel-factory-generator/zipball/7ee56e4229b78d5f6274a4649819b2bca0bd56e3", + "reference": "7ee56e4229b78d5f6274a4649819b2bca0bd56e3", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9|^2.10|^3.0", + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/filesystem": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": ">=7.4" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TheDoctor0\\LaravelFactoryGenerator\\FactoryGeneratorServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TheDoctor0\\LaravelFactoryGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Automatically generate Laravel factories for your models.", + "keywords": [ + "factories", + "factory", + "generator", + "laravel", + "tests" + ], + "support": { + "issues": "https://github.com/TheDoctor0/laravel-factory-generator/issues", + "source": "https://github.com/TheDoctor0/laravel-factory-generator/tree/1.3.2" + }, + "funding": [ + { + "url": "https://www.paypal.me/thedoctor0", + "type": "custom" + }, + { + "url": "https://github.com/thedoctor0", + "type": "github" + } + ], + "time": "2023-04-21T16:45:43+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.1", @@ -8221,14 +10657,14 @@ } ], "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], + "minimum-stability": "stable", + "stability-flags": { + "krlove/eloquent-model-generator": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^7.3", - "ext-curl": "*", - "ext-json": "*" + "php": "^8.1" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/config/app.php b/config/app.php index c574d0f..27d8bd6 100644 --- a/config/app.php +++ b/config/app.php @@ -1,5 +1,7 @@ env('APP_URL', 'http://localhost'), - 'asset_url' => env('ASSET_URL', null), + 'asset_url' => env('ASSET_URL'), /* |-------------------------------------------------------------------------- @@ -141,6 +143,7 @@ return [ */ Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, @@ -174,6 +177,8 @@ return [ App\Providers\AuthServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + App\Providers\TranslationServiceProvider::class, + App\Providers\ViewServiceProvider::class, ], @@ -188,45 +193,6 @@ return [ | */ - 'aliases' => [ - - 'App' => Illuminate\Support\Facades\App::class, - 'Arr' => Illuminate\Support\Arr::class, - 'Artisan' => Illuminate\Support\Facades\Artisan::class, - 'Auth' => Illuminate\Support\Facades\Auth::class, - 'Blade' => Illuminate\Support\Facades\Blade::class, - 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, - 'Bus' => Illuminate\Support\Facades\Bus::class, - 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, - 'Cookie' => Illuminate\Support\Facades\Cookie::class, - 'Crypt' => Illuminate\Support\Facades\Crypt::class, - 'DB' => Illuminate\Support\Facades\DB::class, - 'Eloquent' => Illuminate\Database\Eloquent\Model::class, - 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, - 'Gate' => Illuminate\Support\Facades\Gate::class, - 'Hash' => Illuminate\Support\Facades\Hash::class, - 'Http' => Illuminate\Support\Facades\Http::class, - 'Lang' => Illuminate\Support\Facades\Lang::class, - 'Log' => Illuminate\Support\Facades\Log::class, - 'Mail' => Illuminate\Support\Facades\Mail::class, - 'Notification' => Illuminate\Support\Facades\Notification::class, - 'Password' => Illuminate\Support\Facades\Password::class, - 'Queue' => Illuminate\Support\Facades\Queue::class, - 'Redirect' => Illuminate\Support\Facades\Redirect::class, - 'Redis' => Illuminate\Support\Facades\Redis::class, - 'Request' => Illuminate\Support\Facades\Request::class, - 'Response' => Illuminate\Support\Facades\Response::class, - 'Route' => Illuminate\Support\Facades\Route::class, - 'Schema' => Illuminate\Support\Facades\Schema::class, - 'Session' => Illuminate\Support\Facades\Session::class, - 'Storage' => Illuminate\Support\Facades\Storage::class, - 'Str' => Illuminate\Support\Str::class, - 'URL' => Illuminate\Support\Facades\URL::class, - 'Validator' => Illuminate\Support\Facades\Validator::class, - 'View' => Illuminate\Support\Facades\View::class, - - ], + 'aliases' => Facade::defaultAliases()->merge([])->toArray(), ]; diff --git a/config/breadcrumbs.php b/config/breadcrumbs.php new file mode 100644 index 0000000..0b8d984 --- /dev/null +++ b/config/breadcrumbs.php @@ -0,0 +1,78 @@ + 'breadcrumbs/breadcrumb-layout', + + /* + |-------------------------------------------------------------------------- + | Breadcrumbs File(s) + |-------------------------------------------------------------------------- + | + | The file(s) where breadcrumbs are defined. e.g. + | + | - base_path('routes/breadcrumbs.php') + | - glob(base_path('breadcrumbs/*.php')) + | + */ + + 'files' => [ + base_path('routes/breadcrumbs-bo.php'), + base_path('routes/breadcrumbs-fo.php'), + ], + + /* + |-------------------------------------------------------------------------- + | Exceptions + |-------------------------------------------------------------------------- + | + | Determine when to throw an exception. + | + */ + + // * When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) + 'unnamed-route-exception' => true, + + // * When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) + 'missing-route-bound-breadcrumb-exception' => true, + + // * When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) + 'invalid-named-breadcrumb-exception' => true, + + /* + |-------------------------------------------------------------------------- + | Classes + |-------------------------------------------------------------------------- + | + | Subclass the default classes for more advanced customisations. + | + */ + + // * Manager + 'manager-class' => Diglactic\Breadcrumbs\Manager::class, + + // * Generator + 'generator-class' => Diglactic\Breadcrumbs\Generator::class, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php index 758e391..3e45d82 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -36,9 +36,20 @@ return [ 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ - 'cluster' => env('PUSHER_APP_CLUSTER'), - 'useTLS' => true, + 'host' => env('PUSHER_HOST') ?: 'api-' . env('PUSHER_APP_CLUSTER', 'mt1') . '.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html . + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), ], 'redis' => [ diff --git a/config/cache.php b/config/cache.php index 12cf3c9..9ac517a 100644 --- a/config/cache.php +++ b/config/cache.php @@ -46,6 +46,7 @@ return [ 'driver' => 'database', 'table' => 'cache', 'connection' => null, + 'lock_connection' => null, ], 'file' => [ @@ -61,8 +62,7 @@ return [ env('MEMCACHED_PASSWORD'), ], 'options' => [ - // phpcs:ignore - // Memcached::OPT_CONNECT_TIMEOUT => 2000, + // Memcached::OPT_CONNECT_TIMEOUT => 2000, . ], 'servers' => [ [ @@ -76,6 +76,7 @@ return [ 'redis' => [ 'driver' => 'redis', 'connection' => 'cache', + 'lock_connection' => 'default', ], 'dynamodb' => [ @@ -87,6 +88,10 @@ return [ 'endpoint' => env('DYNAMODB_ENDPOINT'), ], + 'octane' => [ + 'driver' => 'octane', + ], + ], /* @@ -100,6 +105,6 @@ return [ | */ - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache'), + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'), ]; diff --git a/config/database.php b/config/database.php index ac4559f..9dfe93d 100644 --- a/config/database.php +++ b/config/database.php @@ -74,7 +74,7 @@ return [ 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, - 'schema' => 'public', + 'search_path' => 'public', 'sslmode' => 'prefer', ], @@ -129,7 +129,8 @@ return [ 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ], @@ -137,7 +138,8 @@ return [ 'cache' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_CACHE_DB', '1'), ], diff --git a/config/exception-handler.php b/config/exception-handler.php deleted file mode 100644 index e6bd69b..0000000 --- a/config/exception-handler.php +++ /dev/null @@ -1,17 +0,0 @@ - !config('app.debug'), - - /** - * Put a developper secured mailbox in here - * so you can receive email if things go mad - */ - 'contactsList' => [ - env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr') - ] -]; diff --git a/config/filesystems.php b/config/filesystems.php index ceceed7..e77a2da 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -46,6 +46,7 @@ return [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), + 'throw' => false, ], 'public' => [ @@ -53,6 +54,14 @@ return [ 'root' => storage_path('app/public'), 'url' => env('APP_URL') . '/storage', 'visibility' => 'public', + 'throw' => false, + ], + + 'private' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'visibility' => 'private', + 'throw' => false, ], 's3' => [ @@ -63,10 +72,13 @@ return [ 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, ], ], + /* |-------------------------------------------------------------------------- | Symbolic Links diff --git a/config/hashing.php b/config/hashing.php index 6641c8c..db3d9dd 100644 --- a/config/hashing.php +++ b/config/hashing.php @@ -44,9 +44,9 @@ return [ */ 'argon' => [ - 'memory' => 1024, - 'threads' => 2, - 'time' => 2, + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, ], ]; diff --git a/config/logging.php b/config/logging.php index bef92ca..00679d6 100644 --- a/config/logging.php +++ b/config/logging.php @@ -19,6 +19,22 @@ return [ 'default' => env('LOG_CHANNEL', 'stack'), + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + /* |-------------------------------------------------------------------------- | Log Channels @@ -41,36 +57,19 @@ return [ 'ignore_exceptions' => false, ], - 'stackProd' => [ - 'driver' => 'stack', - 'channels' => ['dailyProd'], - 'ignore_exceptions' => false, - ], - - 'stackDaily' => [ - 'driver' => 'stack', - 'channels' => ['daily'], - 'ignore_exceptions' => false, - ], - 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', - ], - - 'dailyProd' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => 'notice', - 'days' => 60, + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', + 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, + 'replace_placeholders' => true, ], 'slack' => [ @@ -78,36 +77,44 @@ return [ 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', - 'level' => 'critical', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, ], 'papertrail' => [ 'driver' => 'monolog', - 'level' => 'debug', - 'handler' => SyslogUdpHandler::class, + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), ], + 'processors' => [PsrLogMessageProcessor::class], ], 'stderr' => [ 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], + 'processors' => [PsrLogMessageProcessor::class], ], 'syslog' => [ 'driver' => 'syslog', - 'level' => 'debug', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, ], 'errorlog' => [ 'driver' => 'errorlog', - 'level' => 'debug', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, ], 'null' => [ @@ -118,6 +125,23 @@ return [ 'emergency' => [ 'path' => storage_path('logs/laravel.log'), ], + + 'stdout' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDOUT_FORMATTER'), + 'with' => [ + 'stream' => 'php://stdout', + ], + ], + + 'k8s' => [ + 'driver' => 'stack', + 'channels' => ['daily', 'stdout'], + 'ignore_exceptions' => false, + ], + ], ]; diff --git a/config/mail.php b/config/mail.php index 0b5b1e3..81b4084 100644 --- a/config/mail.php +++ b/config/mail.php @@ -49,7 +49,7 @@ return [ 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, - 'auth_mode' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), ], 'ses' => [ @@ -57,16 +57,16 @@ return [ ], 'mailgun' => [ - 'transport' => 'mailgun', + 'transport' => 'mailgun' ], 'postmark' => [ - 'transport' => 'postmark', + 'transport' => 'postmark' ], 'sendmail' => [ 'transport' => 'sendmail', - 'path' => '/usr/sbin/sendmail -bs', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), ], 'log' => [ @@ -77,6 +77,14 @@ return [ 'array' => [ 'transport' => 'array', ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], ], /* diff --git a/config/purifier.php b/config/purifier.php new file mode 100644 index 0000000..d74b7a6 --- /dev/null +++ b/config/purifier.php @@ -0,0 +1,132 @@ +set('Core.Encoding', $this->config->get('purifier.encoding')); + * $config->set('Cache.SerializerPath', $this->config->get('purifier.cachePath')); + * if ( ! $this->config->get('purifier.finalize')) { + * $config->autoFinalize = false; + * } + * $config->load [$this->getConfig()); + * + * You must NOT delete the default settings + * anything in settings should be compacted with params that needed to instance HTMLPurifier_Config. + * + * @link http://htmlpurifier.org/live/configdoc/plain.html + */ + +// phpcs:disable Generic.Files.LineLength.TooLong +return [ + 'encoding' => 'UTF-8', + 'finalize' => true, + 'cachePath' => storage_path('app/purifier'), + 'cacheFileMode' => 0755, + 'settings' => [ + 'default' => [ + 'HTML.SafeIframe' => true, + // * For iframes + 'URI.SafeIframeRegexp' => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/)%", + 'HTML.Doctype' => 'HTML 4.01 Transitional', + // * Legacy filter en full avec safe legacy. + // 'HTML.Allowed' => 'h1[style|id],h2[style|id],h3[style|id],h4[style|id],h5[style|id],h6[style|id],figure[class|style],oembed[url],div[style],b,strong,i,em,u,s,pre,code[class],a[href|title|target|rel|id],ul[style],ol[style],dl[style],li,p[style],br,span[style|class],img[width|height|alt|src|style|class|title],iframe[src|width|height|class|frameborder|style],table[style|align|border|cellspacing|cellpadding|width],thead,tbody,th[colspan|align|valign|style],tr[align|valign|style],td[style|colspan|rowspan|scope|align|valign],hr,dl,dt,mark[class]', + // * Restricted basics. + 'HTML.Allowed' => 'br,p[style],b[style],u[style],i[style],a[href|title|target|rel],strong[style],span[class],ul[style],ol[style],li[style],h2[style],h3[style],h4[style],hr,blockquote[style]', + // * Legacy filter en full avec safe legacy. + // 'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align,list-style-type,float,width,height,vertical-align,border,border-color,margin-left', + // * Restricted basics. + 'CSS.AllowedProperties' => 'text-align,margin-left', + 'AutoFormat.AutoParagraph' => false, + 'AutoFormat.RemoveEmpty' => false, + 'AutoFormat.RemoveEmpty.RemoveNbsp' => false, + ], + "youtube" => [ + "HTML.SafeIframe" => 'true', + "URI.SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/)%", + ], + 'custom_definition' => [ + 'id' => 'html5-definitions', + 'rev' => 1, + 'debug' => true, + 'elements' => [ + // * http://developers.whatwg.org/sections.html + ['section', 'Block', 'Flow', 'Common'], + ['nav', 'Block', 'Flow', 'Common'], + ['article', 'Block', 'Flow', 'Common'], + ['aside', 'Block', 'Flow', 'Common'], + ['header', 'Block', 'Flow', 'Common'], + ['footer', 'Block', 'Flow', 'Common'], + + // * Content model actually excludes several tags, not modelled here + ['address', 'Block', 'Flow', 'Common'], + ['hgroup', 'Block', 'Required: h1 | h2 | h3 | h4 | h5 | h6', 'Common'], + + // * http://developers.whatwg.org/grouping-content.html + ['figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common'], + ['figcaption', 'Inline', 'Flow', 'Common'], + ['oembed', 'Inline', 'Flow', 'Common'], + + // * http://developers.whatwg.org/the-video-element.html#the-video-element + ['video', 'Block', 'Optional: (source, Flow) | (Flow, source) | Flow', 'Common', [ + 'src' => 'URI', + 'type' => 'Text', + 'width' => 'Length', + 'height' => 'Length', + 'poster' => 'URI', + 'preload' => 'Enum#auto,metadata,none', + 'controls' => 'Bool', + ]], + ['source', 'Block', 'Flow', 'Common', [ + 'src' => 'URI', + 'type' => 'Text', + ]], + + // * http://developers.whatwg.org/text-level-semantics.html + ['s', 'Inline', 'Inline', 'Common'], + ['var', 'Inline', 'Inline', 'Common'], + ['sub', 'Inline', 'Inline', 'Common'], + ['sup', 'Inline', 'Inline', 'Common'], + ['mark', 'Inline', 'Inline', 'Common'], + ['wbr', 'Inline', 'Empty', 'Core'], + + // * http://developers.whatwg.org/edits.html + ['ins', 'Block', 'Flow', 'Common', ['cite' => 'URI', 'datetime' => 'CDATA']], + ['del', 'Block', 'Flow', 'Common', ['cite' => 'URI', 'datetime' => 'CDATA']], + ], + 'attributes' => [ + ['iframe', 'allowfullscreen', 'Bool'], + ['table', 'height', 'Text'], + ['td', 'border', 'Text'], + ['th', 'border', 'Text'], + ['tr', 'width', 'Text'], + ['tr', 'height', 'Text'], + ['tr', 'border', 'Text'], + ['figure', 'class', 'Text'], + ['figure', 'style', 'Text'], + ['oembed', 'url', 'Text'], + ['span', 'style', 'Text'], + ['img', 'style', 'Text'], + ], + ], + 'custom_attributes' => [ + ['a', 'target', 'Enum#_blank,_self,_target,_top'], + ['a', 'id', 'Text'], + ['ol', 'style', 'Text'], + ['figure', 'style', 'Text'], + ['img', 'style', 'Text'], + ['span', 'style', 'Text'], + ['oembed', 'url', 'Text'], + ['h1', 'id', 'Text'], + ['h2', 'id', 'Text'], + ['h3', 'id', 'Text'], + ['h4', 'id', 'Text'], + ['h5', 'id', 'Text'], + ['h6', 'id', 'Text'], + ], + 'custom_elements' => [ + ['u', 'Inline', 'Inline', 'Common'], + ['oembed', 'Inline', 'Inline', 'Common'], + ], + ], +]; diff --git a/config/queue.php b/config/queue.php index 0ab0902..91725f8 100644 --- a/config/queue.php +++ b/config/queue.php @@ -39,6 +39,7 @@ return [ 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, + 'after_commit' => false, ], 'beanstalkd' => [ @@ -47,6 +48,7 @@ return [ 'queue' => 'default', 'retry_after' => 90, 'block_for' => 0, + 'after_commit' => false, ], 'sqs' => [ @@ -54,9 +56,10 @@ return [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'your-queue-name'), + 'queue' => env('SQS_QUEUE', 'default'), 'suffix' => env('SQS_SUFFIX'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, ], 'redis' => [ @@ -65,10 +68,27 @@ return [ 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, + 'after_commit' => false, ], ], + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + /* |-------------------------------------------------------------------------- | Failed Queue Jobs diff --git a/config/sentry.php b/config/sentry.php new file mode 100644 index 0000000..29627fe --- /dev/null +++ b/config/sentry.php @@ -0,0 +1,61 @@ + env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')), + + // The release version of your application. + // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')). + 'release' => env('SENTRY_RELEASE'), + + // When left empty or `null` the Laravel environment will be used. + 'environment' => env('SENTRY_ENVIRONMENT'), + + 'breadcrumbs' => [ + // Capture Laravel logs in breadcrumbs. + 'logs' => true, + + // Capture SQL queries in breadcrumbs. + 'sql_queries' => true, + + // Capture bindings on SQL queries logged in breadcrumbs. + 'sql_bindings' => false, + + // Capture queue job information in breadcrumbs. + 'queue_info' => true, + + // Capture command information in breadcrumbs. + 'command_info' => true, + ], + + 'tracing' => [ + // Trace queue jobs as their own transactions. + 'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', false), + + // Capture queue jobs as spans when executed on the sync driver. + 'queue_jobs' => true, + + // Capture SQL queries as spans. + 'sql_queries' => true, + + // Try to find out where the SQL query originated from and add it to the query spans. + 'sql_origin' => true, + + // Capture views as spans. + 'views' => true, + + // Indicates if the tracing integrations supplied by Sentry should be loaded. + 'default_integrations' => true, + + // Indicates that requests without a matching route should be traced. + 'missing_routes' => false, + ], + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send-default-pii. + 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces-sample-rate. + 'traces_sample_rate' => env('SENTRY_TRACES_SAMPLE_RATE') === null ? null : (float)env('SENTRY_TRACES_SAMPLE_RATE'), + + 'before_send' => [\App\Lib\Helpers\ExceptionsHelper::class, 'sentryEventHandler'], +]; diff --git a/config/services.php b/config/services.php index 915dfe7..88b9614 100644 --- a/config/services.php +++ b/config/services.php @@ -18,6 +18,7 @@ return [ 'domain' => env('MAILGUN_DOMAIN'), 'secret' => env('MAILGUN_SECRET'), 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', ], 'postmark' => [ diff --git a/config/session.php b/config/session.php index 13ef89b..4bf5f2e 100644 --- a/config/session.php +++ b/config/session.php @@ -100,7 +100,7 @@ return [ | */ - 'store' => env('SESSION_STORE', null), + 'store' => env('SESSION_STORE'), /* |-------------------------------------------------------------------------- @@ -155,7 +155,7 @@ return [ | */ - 'domain' => env('SESSION_DOMAIN', null), + 'domain' => env('SESSION_DOMAIN'), /* |-------------------------------------------------------------------------- diff --git a/config/view.php b/config/view.php index 53008fd..d8b71b1 100644 --- a/config/view.php +++ b/config/view.php @@ -15,6 +15,8 @@ return [ 'paths' => [ resource_path('views'), + // ! for vendor publish (mail notifications par ex) + resource_path('views/vendor'), ], /* diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..d05f5a8 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,3 @@ +{ + "include": ["./resources/js/**/*"] +} diff --git a/package.json b/package.json index 44c7820..6e70de4 100644 --- a/package.json +++ b/package.json @@ -1,40 +1,75 @@ { "private": true, "scripts": { - "dev": "npm run development", - "development": "mix", - "watch": "mix watch", - "watch-poll": "mix watch -- --watch-options-poll=1000", - "hot": "mix watch --hot", - "prod": "npm run production", - "production": "mix --production" + "prod": "vite build --mode production", + "dev": "NODE_ENV=development vite build -d --mode development", + "watch": "NODE_ENV=development vite build --mode development --watch", + "eslint": "node ./node_modules/.bin/eslint --max-warnings 0 -c .eslintrc.json ./resources", + "eslint-fix": "node ./node_modules/.bin/eslint --fix --max-warnings 0 -c .eslintrc.json ./resources", + "eslint-ci": "node ./node_modules/.bin/eslint --max-warnings 0 -c .eslintrc.json ./resources -f junit", + "stylelint": "node ./node_modules/.bin/stylelint --config './.stylelintrc.json' --max-warnings 0 '**/resources/**/*.scss'", + "stylelint-fix": "node ./node_modules/.bin/stylelint --config './.stylelintrc.json' --fix --max-warnings 0 '**/resources/**/*.scss'", + "stylelint-ci": "node ./node_modules/.bin/stylelint --config './.stylelintrc.json' --max-warnings 0 '**/resources/**/*.scss' -f json" }, "devDependencies": { - "axios": "^0.21.1", - "bootstrap": "^4.6.0", + "@babel/types": "^7.21.2", + "@fancyapps/fancybox": "^3.5.7", + "@fortawesome/fontawesome-svg-core": "^6.1.2", + "@fortawesome/free-brands-svg-icons": "^6.1.2", + "@fortawesome/free-regular-svg-icons": "^6.1.2", + "@fortawesome/free-solid-svg-icons": "^6.1.2", + "@fortawesome/vue-fontawesome": "^3.0.1", + "@rushstack/eslint-patch": "^1.1.4", + "@sipec/vue3-tags-input": "^3.0.4", + "@types/bootstrap": "^5.2.6", + "@types/toastify-js": "^1.11.1", + "@types/webpack-env": "^1.18.0", + "@typescript-eslint/eslint-plugin": "^5.36.2", + "@typescript-eslint/parser": "^5.36.2", + "@vitejs/plugin-legacy": "^4.0.1", + "@vitejs/plugin-vue": "^4.0.0", + "@vue/eslint-config-typescript": "^11.0.0", + "axios": "^1.1.2", + "bootstrap": "^5.3.1", + "chart.js": "^4.3.3", + "cropperjs": "^1.5.12", "cross-env": "^7.0", "cssnano": "^5.0.2", - "jquery": "^3.2", - "laravel-mix": "^6.0.19", - "laravel-mix-polyfill": "^3.0.0", - "lodash": "^4.17.19", - "popper.js": "^1.12", - "postcss": "^8.2.15", - "resolve-url-loader": "^4.0.0", - "sass": "^1.32.13", - "sass-loader": "^11.1.1", - "vue": "^2.6.12", - "vue-loader": "^15.9.6", - "vue-template-compiler": "^2.6.12" - }, - "dependencies": { - "@fancyapps/fancybox": "^3.5.7", - "@fortawesome/fontawesome-free": "^5.15.3", - "chart.js": "^2.9.4", - "jquery": "^3.5.1", - "popper.js": "^1.16.1", - "scratchcard-js": "^1.4.10", - "swiper": "^6.6.1", - "v-clipboard": "^2.2.3" + "eslint": "^8.35.0", + "eslint-import-resolver-alias": "^1.1.2", + "eslint-plugin-vue": "^9.4.0", + "laravel-vite-plugin": "^0.7.2", + "postcss": "^8.4.21", + "postcss-discard-comments": "^5.1.2", + "postcss-html": "^1.5.0", + "postcss-scss": "^4.0.6", + "prettier": "^2.7.1", + "resolve-url-loader": "^5.0.0", + "sass": "^1.58.3", + "sass-loader": "^12.6.0", + "scratchcard-js": "^1.5.0", + "slugify": "^1.6.5", + "stylelint": "^14.16.1", + "stylelint-config-idiomatic-order": "^8.1.0", + "stylelint-config-sass-guidelines": "^9.0.1", + "stylelint-config-standard-scss": "^6.1.0", + "stylelint-scss": "^4.4.0", + "stylelint-webpack-plugin": "^3.3.0", + "sweetalert2": "^11.4.8", + "swiper": "^10.2.0", + "toastify-js": "^1.12.0", + "ts-loader": "^9.3.1", + "typescript": "^4.9.5", + "typescript-eslint": "^0.0.1-alpha.0", + "v-clipboard": "^3.0.0-next.1", + "vite": "^4.0.0", + "vite-plugin-checker": "^0.5.6", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-stylelint": "^4.2.0", + "vue": "^3.2.38", + "vue-eslint-parser": "^9.1.0", + "vue-loader": "^16.8.3", + "vue-tsc": "^1.2.0", + "vue3-nestable": "^3.0.3" } } diff --git a/phpcs.xml b/phpcs.xml index 3905a44..3e28d83 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -1,11 +1,12 @@ - + Created with the PHP Coding Standard Generator. http://edorian.github.com/php-coding-standard-generator/ app/ config/ - database/seeders + database/factories routes/ @@ -19,6 +20,7 @@ + diff --git a/phpunit.xml b/phpunit.xml index 76f2246..eb13aff 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -12,20 +12,20 @@ ./tests/Feature - - + + ./app - - + + - - - - - - - - - + + + + + + + + + diff --git a/resources/js/app.js b/resources/js/app.js deleted file mode 100644 index 5be7ad4..0000000 --- a/resources/js/app.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * First we will load all of this project's JavaScript dependencies which - * includes Vue and other libraries. It is a great starting point when - * building robust, powerful web applications using Vue and Laravel. - */ - -require('./bootstrap'); -require('@fancyapps/fancybox'); - -window.Vue = require('vue').default; - -import Clipboard from 'v-clipboard'; -import Chart from 'chart.js'; - -Vue.use(Clipboard); - -/** - * The following block of code may be used to automatically register your - * Vue components. It will recursively scan this directory for the Vue - * components and automatically register them with their "basename". - * - * Eg. ./components/ExampleComponent.vue -> - */ - -// const files = require.context('./', true, /\.vue$/i) -// files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)) - -Vue.component('win-notification', require('./components/WinNotification.vue').default); -Vue.component('gain-views', require('./components/GainViews.vue').default); -Vue.component('prizes', require('./components/Prizes.vue').default); -Vue.component('instant-win', require('./components/InstantWin.vue').default); -Vue.component('codes-ean', require('./components/CodesEAN.vue').default); -Vue.component('banned-ip', require('./components/BannedIP.vue').default); -Vue.component('faq-themes', require('./components/FaqThemes.vue').default); -Vue.component('faq-questions', require('./components/FaqQuestions.vue').default); -Vue.component('web-coupons', require('./components/WebCoupons.vue').default); - -/** - * Next, we will create a fresh Vue application instance and attach it to - * the page. Then, you may begin adding components to this application - * or customize the JavaScript scaffolding to fit your unique needs. - */ - -const app = new Vue({ - el: '#app', -}); diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js deleted file mode 100644 index 64f1323..0000000 --- a/resources/js/bootstrap.js +++ /dev/null @@ -1,44 +0,0 @@ -window._ = require('lodash'); - -/** - * We'll load jQuery and the Bootstrap jQuery plugin which provides support - * for JavaScript based Bootstrap features such as modals and tabs. This - * code may be modified to fit the specific needs of your application. - */ - -try { - window.Popper = require('popper.js').default; - window.$ = window.jQuery = require('jquery'); - - require('bootstrap'); -} catch (e) { } - -/** - * We'll load the axios HTTP library which allows us to easily issue requests - * to our Laravel back-end. This library automatically handles sending the - * CSRF token as a header based on the value of the "XSRF" token cookie. - */ - -window.axios = require('axios'); - -window.axios.defaults.headers.common = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') -}; - -/** - * Echo exposes an expressive API for subscribing to channels and listening - * for events that are broadcast by Laravel. Echo and event broadcasting - * allows your team to easily build robust real-time web applications. - */ - -// import Echo from 'laravel-echo'; - -// window.Pusher = require('pusher-js'); - -// window.Echo = new Echo({ -// broadcaster: 'pusher', -// key: process.env.MIX_PUSHER_APP_KEY, -// cluster: process.env.MIX_PUSHER_APP_CLUSTER, -// forceTLS: true -// }); diff --git a/resources/js/components/BannedIP.vue b/resources/js/components/BannedIP.vue deleted file mode 100644 index 51bb897..0000000 --- a/resources/js/components/BannedIP.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - - - diff --git a/resources/js/components/CodesEAN.vue b/resources/js/components/CodesEAN.vue deleted file mode 100644 index 06c22d8..0000000 --- a/resources/js/components/CodesEAN.vue +++ /dev/null @@ -1,240 +0,0 @@ - - - - - diff --git a/resources/js/components/FaqQuestions.vue b/resources/js/components/FaqQuestions.vue deleted file mode 100644 index 14c6cd9..0000000 --- a/resources/js/components/FaqQuestions.vue +++ /dev/null @@ -1,159 +0,0 @@ - - - - - diff --git a/resources/js/components/FaqThemes.vue b/resources/js/components/FaqThemes.vue deleted file mode 100644 index c7771b2..0000000 --- a/resources/js/components/FaqThemes.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - - - diff --git a/resources/js/components/GainViews.vue b/resources/js/components/GainViews.vue deleted file mode 100644 index 8e843fa..0000000 --- a/resources/js/components/GainViews.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - - - diff --git a/resources/js/components/InstantWin.vue b/resources/js/components/InstantWin.vue deleted file mode 100644 index 6b8398b..0000000 --- a/resources/js/components/InstantWin.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/resources/js/components/Prizes.vue b/resources/js/components/Prizes.vue deleted file mode 100644 index 7a4d67d..0000000 --- a/resources/js/components/Prizes.vue +++ /dev/null @@ -1,362 +0,0 @@ - - - - - diff --git a/resources/js/components/WebCoupons.vue b/resources/js/components/WebCoupons.vue deleted file mode 100644 index 3647727..0000000 --- a/resources/js/components/WebCoupons.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/resources/js/components/WinNotification.vue b/resources/js/components/WinNotification.vue deleted file mode 100644 index 663932a..0000000 --- a/resources/js/components/WinNotification.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - diff --git a/resources/js/components/ckEditorComponent.vue b/resources/js/components/ckEditorComponent.vue deleted file mode 100644 index 82807e4..0000000 --- a/resources/js/components/ckEditorComponent.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - - - diff --git a/resources/js/vendor/ckeditor/build/ckeditor.js b/resources/js/vendor/ckeditor/build/ckeditor.js index 2c4d1e6..58d2359 100644 --- a/resources/js/vendor/ckeditor/build/ckeditor.js +++ b/resources/js/vendor/ckeditor/build/ckeditor.js @@ -1,7 +1,7 @@ -!function(t){const e=t.fr=t.fr||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 sur %1","Align cell text to the bottom":"Aligner le texte en bas","Align cell text to the center":"Aligner la cellule au centre","Align cell text to the left":"Aligner la cellule à gauche","Align cell text to the middle":"Aligner le texte au milieu","Align cell text to the right":"Aligner la cellule à droite","Align cell text to the top":"Aligner le texte en haut","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",Aquamarine:"Bleu vert",Background:"Fond",Big:"Grand",Black:"Noir","Block quote":"Citation",Blue:"Bleu","Blue marker":"Marqueur bleu",Bold:"Gras",Border:"Bordure","Break text":"Saut de ligne","Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Cancel:"Annuler","Cell properties":"Propriétés de la cellule","Center table":"Centrer le tableau ","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Character categories":"Catégories de caractères","Characters: %0":"Caractères : %0","Choose heading":"Choisir l'en-tête",Circle:"Cercle",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne",Dashed:"Tirets",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire","Decrease indent":"Diminuer le retrait",Default:"Par défaut","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne","Dim grey":"Gris pâle",Dimensions:"Dimensions",Disc:"Disque","Document colors":"Couleurs du document",Dotted:"Pointillés",Double:"Double",Downloadable:"Fichier téléchargeable","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Editor editing area: %0":"Zone d'édition de l'éditeur : %0","Editor toolbar":"Barre d'outils de l'éditeur","Enter table caption":"Saisir la légende du tableau","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police","Full size image":"Image taille réelle",Green:"Vert","Green marker":"Marqueur vert","Green pen":"Crayon vert",Grey:"Gris",Groove:"Rainuré","Header column":"Colonne d'entête","Header row":"Ligne d'entête",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6",Height:"Hauteur",Highlight:"Surlignage","Horizontal line":"Ligne horizontale","Horizontal text alignment toolbar":"Barre d'outils pour modifier l'alignement horizontal du texte",Huge:"Enorme","Image resize list":"Liste des tailles d'images","Image toolbar":"Barre d'outils des images","image widget":"Objet image","In line":"Aligné","Increase indent":"Augmenter le retrait","Insert column left":"Insérer une colonne à gauche","Insert column right":"Insérer une colonne à droite","Insert image":"Insérer une image","Insert media":"Insérer un média","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc","Insert row above":"Insérer une ligne au-dessus","Insert row below":"Insérer une ligne en-dessous","Insert table":"Insérer un tableau",Inset:"Relief intérieur",Italic:"Italique",Justify:"Justifier","Justify cell text":"Justifier le contenu de la cellule","Left aligned image":"Image alignée à gauche","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Link:"Lien","Link image":"Lien d'image","Link URL":"URL du lien","List properties":"Liste des propriétés","Lower-latin":"Lettres minuscules","Lower–roman":"Chiffres romains en minuscules","Media URL":"URL de média","media widget":"Widget média","Merge cell down":"Fusionner la cellule en-dessous","Merge cell left":"Fusionner la cellule à gauche","Merge cell right":"Fusionner la cellule à droite","Merge cell up":"Fusionner la cellule au-dessus","Merge cells":"Fusionner les cellules",Next:"Suivant",None:"Aucun","Numbered List":"Liste numérotée","Numbered list styles toolbar":"Barre d'outils des styles de liste numérotée","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet",Orange:"Orange",Original:"Taille originale",Outset:"Relief extérieur",Padding:"Remplissage pour aérer le texte",Paragraph:"Paragraphe","Paste the media URL in the input.":"Coller l'URL du média","Pink marker":"Marqueur rose",Previous:"Précedent",Purple:"Violet",Red:"Rouge","Red pen":"Crayon rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Remove Format":"Enlever le format","Remove highlight":"Enlever le surlignage","Resize image":"Redimensionner l'image","Resize image to %0":"Redimensionner à %0","Resize image to the original size":"Appliquer les dimensions d'origine","Restore default":"Restaurer par défaut","Reversed order":"Ordre inversé","Rich Text Editor":"Éditeur de texte enrichi",Ridge:"Relief","Right aligned image":"Image alignée à droite",Row:"Ligne",Save:"Enregistrer","Select all":"Sélectionner tout","Select column":"Sélectionner la colonne","Select row":"Sélectionner la ligne","Show more items":"Montrer plus d'éléments","Side image":"Image latérale",Small:"Petit",Solid:"Continu",Source:"Source","Special characters":"Caractères spéciaux","Split cell horizontally":"Scinder la cellule horizontalement","Split cell vertically":"Scinder la cellule verticalement",Square:"Carré","Start at":"Commencer à","Start index must be greater than 0.":"L'indice de départ doit être supérieur à 0.",Style:"Style","Table alignment toolbar":"Barre d'outils pour modifier l'alignement du tableau","Table cell text alignment":"Alignement du texte de la cellule","Table properties":"Propriétés du tableau","Table toolbar":"Barre d'outils des tableaux","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte","Text alternative":"Texte alternatif","Text highlight toolbar":"Barre d'outils du surlignage",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'La couleur est invalide. Essayez "#FF0000" ou "rgb(255,0,0)" ou "red".',"The URL must not be empty.":"L'URL ne doit pas être vide.",'The value is invalid. Try "10px" or "2em" or simply "2".':'La valeur est invalide. Essayez "10px" ou "2em" ou simplement "2".',"This link has no URL":"Ce lien n'a pas d'URL","This media URL is not supported.":"Cette URL de média n'est pas supportée.",Tiny:"Minuscule","Tip: Paste the URL into the content to embed faster.":"Astuce : Copier l'URL du média dans le contenu pour l'insérer plus rapidement","Toggle caption off":"Désactiver la légende","Toggle caption on":"Activer la légende","Toggle the circle list style":'Activer / désactiver le style de liste "cercle"',"Toggle the decimal list style":'Activer / désactiver le style de liste "chiffres"',"Toggle the decimal with leading zero list style":'Activer / désactiver le style de liste "chiffres de mêmes longueurs"',"Toggle the disc list style":'Activer / désactiver le style de liste "disque"',"Toggle the lower–latin list style":'Activer / désactiver le style de liste "lettres minuscules"',"Toggle the lower–roman list style":'Activer / désactiver le style de liste "chiffres romains en minuscules"',"Toggle the square list style":'Activer / désactiver le style de liste "carré"',"Toggle the upper–latin list style":'Activer / désactiver le style de liste "lettres majuscules"',"Toggle the upper–roman list style":'Activer / désactiver le style de liste "chiffres romains en majuscules"',Turquoise:"Turquoise",Underline:"Souligné",Undo:"Annuler",Unlink:"Supprimer le lien","Upload failed":"Échec de l'envoi","Upload in progress":"Téléchargement en cours","Upper-latin":"Lettres majuscules","Upper-roman":"Chiffres romains en majuscules","Vertical text alignment toolbar":"Barre d'outils pour modifier l'alignement vertical du texte",White:"Blanc","Widget toolbar":"Barre d'outils du widget",Width:"Largeur","Words: %0":"Mots : %0","Wrap text":"Retour à la ligne",Yellow:"Jaune","Yellow marker":"Marqueur jaune"}),e.getPluralForm=function(t){return 0==t||1==t?0:0!=t&&t%1e6==0?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +!function(t){const e=t.fr=t.fr||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 sur %1","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite",Aquamarine:"Bleu vert",Big:"Grand",Black:"Noir","Block quote":"Citation",Blue:"Bleu",Bold:"Gras","Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Cancel:"Annuler","Characters: %0":"Caractères : %0","Choose heading":"Choisir l'en-tête",Circle:"Cercle",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire","Decrease indent":"Diminuer le retrait",Default:"Par défaut","Dim grey":"Gris pâle",Disc:"Disque","Document colors":"Couleurs du document",Downloadable:"Fichier téléchargeable","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Editor block content toolbar":"Barre d'outils du contenu du bloc éditeur","Editor contextual toolbar":"Barre d'outils contextuelle de l'éditeur","Editor editing area: %0":"Zone d'édition de l'éditeur : %0","Editor toolbar":"Barre d'outils de l'éditeur","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police",Green:"Vert",Grey:"Gris",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6","Horizontal line":"Ligne horizontale",Huge:"Enorme","Increase indent":"Augmenter le retrait","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc",Italic:"Italique",Justify:"Justifier","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Link:"Lien","Link URL":"URL du lien","List properties":"Liste des propriétés","Lower-latin":"Lettres minuscules","Lower–roman":"Chiffres romains en minuscules",Next:"Suivant","Numbered List":"Liste numérotée","Numbered list styles toolbar":"Barre d'outils des styles de liste numérotée","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet",Orange:"Orange",Paragraph:"Paragraphe","Press Enter to type after or press Shift + Enter to type before the widget":"Appuyez sur la touche Entrée pour taper après ou sur Maj + Entrée pour taper avant le widget.",Previous:"Précedent",Purple:"Violet",Red:"Rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Remove Format":"Enlever le format","Reversed order":"Ordre inversé","Rich Text Editor":"Éditeur de texte enrichi",Save:"Enregistrer","Select all":"Sélectionner tout","Show more items":"Montrer plus d'éléments",Small:"Petit",Source:"Source",Square:"Carré","Start at":"Commencer à","Start index must be greater than 0.":"L'indice de départ doit être supérieur à 0.","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte","This link has no URL":"Ce lien n'a pas d'URL",Tiny:"Minuscule","Toggle the circle list style":'Activer / désactiver le style de liste "cercle"',"Toggle the decimal list style":'Activer / désactiver le style de liste "chiffres"',"Toggle the decimal with leading zero list style":'Activer / désactiver le style de liste "chiffres de mêmes longueurs"',"Toggle the disc list style":'Activer / désactiver le style de liste "disque"',"Toggle the lower–latin list style":'Activer / désactiver le style de liste "lettres minuscules"',"Toggle the lower–roman list style":'Activer / désactiver le style de liste "chiffres romains en minuscules"',"Toggle the square list style":'Activer / désactiver le style de liste "carré"',"Toggle the upper–latin list style":'Activer / désactiver le style de liste "lettres majuscules"',"Toggle the upper–roman list style":'Activer / désactiver le style de liste "chiffres romains en majuscules"',Turquoise:"Turquoise",Underline:"Souligné",Undo:"Annuler",Unlink:"Supprimer le lien","Upper-latin":"Lettres majuscules","Upper-roman":"Chiffres romains en majuscules",White:"Blanc","Widget toolbar":"Barre d'outils du widget","Words: %0":"Mots : %0",Yellow:"Jaune"}),e.getPluralForm=function(t){return 0==t||1==t?0:0!=t&&t%1e6==0?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), /*! - * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md. */ -function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClassicEditor=e():t.ClassicEditor=e()}(self,(()=>(()=>{var t={4051:function(t){t.exports=function(){"use strict";const t="SweetAlert2:",e=t=>{const e=[];for(let n=0;nt.charAt(0).toUpperCase()+t.slice(1),o=t=>Array.prototype.slice.call(t),i=e=>{console.warn("".concat(t," ").concat("object"==typeof e?e.join(" "):e))},r=e=>{console.error("".concat(t," ").concat(e))},s=[],a=t=>{s.includes(t)||(s.push(t),i(t))},l=(t,e)=>{a('"'.concat(t,'" is deprecated and will be removed in the next major release. Please use "').concat(e,'" instead.'))},c=t=>"function"==typeof t?t():t,d=t=>t&&"function"==typeof t.toPromise,u=t=>d(t)?t.toPromise():Promise.resolve(t),h=t=>t&&Promise.resolve(t)===t,m=t=>t[Math.floor(Math.random()*t.length)],g={title:"",titleText:"",text:"",html:"",footer:"",icon:void 0,iconColor:void 0,iconHtml:void 0,template:void 0,toast:!1,showClass:{popup:"swal2-show",backdrop:"swal2-backdrop-show",icon:"swal2-icon-show"},hideClass:{popup:"swal2-hide",backdrop:"swal2-backdrop-hide",icon:"swal2-icon-hide"},customClass:{},target:"body",color:void 0,backdrop:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showDenyButton:!1,showCancelButton:!1,preConfirm:void 0,preDeny:void 0,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:void 0,denyButtonText:"No",denyButtonAriaLabel:"",denyButtonColor:void 0,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:void 0,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusDeny:!1,focusCancel:!1,returnFocus:!0,showCloseButton:!1,closeButtonHtml:"×",closeButtonAriaLabel:"Close this dialog",loaderHtml:"",showLoaderOnConfirm:!1,showLoaderOnDeny:!1,imageUrl:void 0,imageWidth:void 0,imageHeight:void 0,imageAlt:"",timer:void 0,timerProgressBar:!1,width:void 0,padding:void 0,background:void 0,input:void 0,inputPlaceholder:"",inputLabel:"",inputValue:"",inputOptions:{},inputAutoTrim:!0,inputAttributes:{},inputValidator:void 0,returnInputValueOnDeny:!1,validationMessage:void 0,grow:!1,position:"center",progressSteps:[],currentProgressStep:void 0,progressStepsDistance:void 0,willOpen:void 0,didOpen:void 0,didRender:void 0,willClose:void 0,didClose:void 0,didDestroy:void 0,scrollbarPadding:!0},p=["allowEscapeKey","allowOutsideClick","background","buttonsStyling","cancelButtonAriaLabel","cancelButtonColor","cancelButtonText","closeButtonAriaLabel","closeButtonHtml","color","confirmButtonAriaLabel","confirmButtonColor","confirmButtonText","currentProgressStep","customClass","denyButtonAriaLabel","denyButtonColor","denyButtonText","didClose","didDestroy","footer","hideClass","html","icon","iconColor","iconHtml","imageAlt","imageHeight","imageUrl","imageWidth","preConfirm","preDeny","progressSteps","returnFocus","reverseButtons","showCancelButton","showCloseButton","showConfirmButton","showDenyButton","text","title","titleText","willClose"],f={},b=["allowOutsideClick","allowEnterKey","backdrop","focusConfirm","focusDeny","focusCancel","returnFocus","heightAuto","keydownListenerCapture"],k=t=>Object.prototype.hasOwnProperty.call(g,t),w=t=>-1!==p.indexOf(t),A=t=>f[t],C=t=>{k(t)||i('Unknown parameter "'.concat(t,'"'))},_=t=>{b.includes(t)&&i('The parameter "'.concat(t,'" is incompatible with toasts'))},v=t=>{A(t)&&l(t,A(t))},y=t=>{!t.backdrop&&t.allowOutsideClick&&i('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');for(const e in t)C(e),t.toast&&_(e),v(e)},x="swal2-",E=t=>{const e={};for(const n in t)e[t[n]]=x+t[n];return e},D=E(["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","no-war"]),S=E(["success","warning","info","question","error"]),I=()=>document.body.querySelector(".".concat(D.container)),T=t=>{const e=I();return e?e.querySelector(t):null},M=t=>T(".".concat(t)),B=()=>M(D.popup),N=()=>M(D.icon),z=()=>M(D.title),P=()=>M(D["html-container"]),L=()=>M(D.image),O=()=>M(D["progress-steps"]),R=()=>M(D["validation-message"]),j=()=>T(".".concat(D.actions," .").concat(D.confirm)),V=()=>T(".".concat(D.actions," .").concat(D.deny)),F=()=>M(D["input-label"]),H=()=>T(".".concat(D.loader)),U=()=>T(".".concat(D.actions," .").concat(D.cancel)),q=()=>M(D.actions),G=()=>M(D.footer),W=()=>M(D["timer-progress-bar"]),Z=()=>M(D.close),Y='\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n',K=()=>{const t=o(B().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')).sort(((t,e)=>{const n=parseInt(t.getAttribute("tabindex")),o=parseInt(e.getAttribute("tabindex"));return n>o?1:n"-1"!==t.getAttribute("tabindex")));return e(t.concat(n)).filter((t=>pt(t)))},$=()=>et(document.body,D.shown)&&!et(document.body,D["toast-shown"])&&!et(document.body,D["no-backdrop"]),Q=()=>B()&&et(B(),D.toast),J=()=>B().hasAttribute("data-loading"),X={previousBodyPadding:null},tt=(t,e)=>{if(t.textContent="",e){const n=(new DOMParser).parseFromString(e,"text/html");o(n.querySelector("head").childNodes).forEach((e=>{t.appendChild(e)})),o(n.querySelector("body").childNodes).forEach((e=>{t.appendChild(e)}))}},et=(t,e)=>{if(!e)return!1;const n=e.split(/\s+/);for(let e=0;e{o(t.classList).forEach((n=>{Object.values(D).includes(n)||Object.values(S).includes(n)||Object.values(e.showClass).includes(n)||t.classList.remove(n)}))},ot=(t,e,n)=>{if(nt(t,e),e.customClass&&e.customClass[n]){if("string"!=typeof e.customClass[n]&&!e.customClass[n].forEach)return i("Invalid type of customClass.".concat(n,'! Expected string or iterable object, got "').concat(typeof e.customClass[n],'"'));at(t,e.customClass[n])}},it=(t,e)=>{if(!e)return null;switch(e){case"select":case"textarea":case"file":return t.querySelector(".".concat(D.popup," > .").concat(D[e]));case"checkbox":return t.querySelector(".".concat(D.popup," > .").concat(D.checkbox," input"));case"radio":return t.querySelector(".".concat(D.popup," > .").concat(D.radio," input:checked"))||t.querySelector(".".concat(D.popup," > .").concat(D.radio," input:first-child"));case"range":return t.querySelector(".".concat(D.popup," > .").concat(D.range," input"));default:return t.querySelector(".".concat(D.popup," > .").concat(D.input))}},rt=t=>{if(t.focus(),"file"!==t.type){const e=t.value;t.value="",t.value=e}},st=(t,e,n)=>{t&&e&&("string"==typeof e&&(e=e.split(/\s+/).filter(Boolean)),e.forEach((e=>{Array.isArray(t)?t.forEach((t=>{n?t.classList.add(e):t.classList.remove(e)})):n?t.classList.add(e):t.classList.remove(e)})))},at=(t,e)=>{st(t,e,!0)},lt=(t,e)=>{st(t,e,!1)},ct=(t,e)=>{const n=o(t.childNodes);for(let t=0;t{n==="".concat(parseInt(n))&&(n=parseInt(n)),n||0===parseInt(n)?t.style[e]="number"==typeof n?"".concat(n,"px"):n:t.style.removeProperty(e)},ut=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";t.style.display=e},ht=t=>{t.style.display="none"},mt=(t,e,n,o)=>{const i=t.querySelector(e);i&&(i.style[n]=o)},gt=function(t,e){e?ut(t,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):ht(t)},pt=t=>!(!t||!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)),ft=()=>!pt(j())&&!pt(V())&&!pt(U()),bt=t=>!!(t.scrollHeight>t.clientHeight),kt=t=>{const e=window.getComputedStyle(t),n=parseFloat(e.getPropertyValue("animation-duration")||"0"),o=parseFloat(e.getPropertyValue("transition-duration")||"0");return n>0||o>0},wt=function(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=W();pt(n)&&(e&&(n.style.transition="none",n.style.width="100%"),setTimeout((()=>{n.style.transition="width ".concat(t/1e3,"s linear"),n.style.width="0%"}),10))},At=()=>{const t=W(),e=parseInt(window.getComputedStyle(t).width);t.style.removeProperty("transition"),t.style.width="100%";const n=e/parseInt(window.getComputedStyle(t).width)*100;t.style.removeProperty("transition"),t.style.width="".concat(n,"%")},Ct=()=>"undefined"==typeof window||"undefined"==typeof document,_t=100,vt={},yt=()=>{vt.previousActiveElement instanceof HTMLElement?(vt.previousActiveElement.focus(),vt.previousActiveElement=null):document.body&&document.body.focus()},xt=t=>new Promise((e=>{if(!t)return e();const n=window.scrollX,o=window.scrollY;vt.restoreFocusTimeout=setTimeout((()=>{yt(),e()}),_t),window.scrollTo(n,o)})),Et='\n
\n \n
    \n
    \n \n

    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n').replace(/(^|\n)\s*/g,""),Dt=()=>{const t=I();return!!t&&(t.remove(),lt([document.documentElement,document.body],[D["no-backdrop"],D["toast-shown"],D["has-column"]]),!0)},St=()=>{vt.currentInstance.resetValidationMessage()},It=()=>{const t=B(),e=ct(t,D.input),n=ct(t,D.file),o=t.querySelector(".".concat(D.range," input")),i=t.querySelector(".".concat(D.range," output")),r=ct(t,D.select),s=t.querySelector(".".concat(D.checkbox," input")),a=ct(t,D.textarea);e.oninput=St,n.onchange=St,r.onchange=St,s.onchange=St,a.oninput=St,o.oninput=()=>{St(),i.value=o.value},o.onchange=()=>{St(),i.value=o.value}},Tt=t=>"string"==typeof t?document.querySelector(t):t,Mt=t=>{const e=B();e.setAttribute("role",t.toast?"alert":"dialog"),e.setAttribute("aria-live",t.toast?"polite":"assertive"),t.toast||e.setAttribute("aria-modal","true")},Bt=t=>{"rtl"===window.getComputedStyle(t).direction&&at(I(),D.rtl)},Nt=t=>{const e=Dt();if(Ct())return void r("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=D.container,e&&at(n,D["no-transition"]),tt(n,Et);const o=Tt(t.target);o.appendChild(n),Mt(t),Bt(o),It(),zt(n,t)},zt=(t,e)=>{if(e.toast)return;const n=m([{text:"ШВАРЦЕНЕГГЕР обратился
    к РУССКОМУ НАРОДУ о войне",youtubeId:"fWClXZd9c78"},{text:"РУССКИЙ ПАТРИОТ
    открыл главную тайну спецоперации",youtubeId:"_RjBNkn88yA"},{text:"ГЕРОЙ НОВОРОССИИ СТРЕЛКОВ
    дал оценку ходу спецоперации",youtubeId:"yUmzQT4C8JY"},{text:"ФИНСКИЙ ДРУГ РОССИИ
    говорит ПО-РУССКИ о спецоперации",youtubeId:"hkCYb6edUrQ"},{text:"ЮРИЙ ПОДОЛЯКА честно
    о генералах РУССКОЙ АРМИИ",youtubeId:"w4-_8BJKfpk"},{text:"Полковник ФСБ СТРЕЛКОВ
    об успехах РОССИИ в спецоперации",youtubeId:"saK5UTKroDA"}]);if(/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|xn--p1ai)$/)){const e=document.createElement("div");e.className=D["no-war"],tt(e,'').concat(n.text,"")),t.appendChild(e),t.style.paddingTop="4em"}},Pt=(t,e)=>{t instanceof HTMLElement?e.appendChild(t):"object"==typeof t?Lt(t,e):t&&tt(e,t)},Lt=(t,e)=>{t.jquery?Ot(e,t):tt(e,t.toString())},Ot=(t,e)=>{if(t.textContent="",0 in e)for(let n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0))},Rt=(()=>{if(Ct())return!1;const t=document.createElement("div"),e={WebkitAnimation:"webkitAnimationEnd",animation:"animationend"};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&void 0!==t.style[n])return e[n];return!1})(),jt=()=>{const t=document.createElement("div");t.className=D["scrollbar-measure"],document.body.appendChild(t);const e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},Vt=(t,e)=>{const n=q(),o=H();e.showConfirmButton||e.showDenyButton||e.showCancelButton?ut(n):ht(n),ot(n,e,"actions"),Ft(n,o,e),tt(o,e.loaderHtml),ot(o,e,"loader")};function Ft(t,e,n){const o=j(),i=V(),r=U();Ut(o,"confirm",n),Ut(i,"deny",n),Ut(r,"cancel",n),Ht(o,i,r,n),n.reverseButtons&&(n.toast?(t.insertBefore(r,o),t.insertBefore(i,o)):(t.insertBefore(r,e),t.insertBefore(i,e),t.insertBefore(o,e)))}function Ht(t,e,n,o){if(!o.buttonsStyling)return lt([t,e,n],D.styled);at([t,e,n],D.styled),o.confirmButtonColor&&(t.style.backgroundColor=o.confirmButtonColor,at(t,D["default-outline"])),o.denyButtonColor&&(e.style.backgroundColor=o.denyButtonColor,at(e,D["default-outline"])),o.cancelButtonColor&&(n.style.backgroundColor=o.cancelButtonColor,at(n,D["default-outline"]))}function Ut(t,e,o){gt(t,o["show".concat(n(e),"Button")],"inline-block"),tt(t,o["".concat(e,"ButtonText")]),t.setAttribute("aria-label",o["".concat(e,"ButtonAriaLabel")]),t.className=D[e],ot(t,o,"".concat(e,"Button")),at(t,o["".concat(e,"ButtonClass")])}const qt=(t,e)=>{const n=I();n&&(Gt(n,e.backdrop),Wt(n,e.position),Zt(n,e.grow),ot(n,e,"container"))};function Gt(t,e){"string"==typeof e?t.style.background=e:e||at([document.documentElement,document.body],D["no-backdrop"])}function Wt(t,e){e in D?at(t,D[e]):(i('The "position" parameter is not valid, defaulting to "center"'),at(t,D.center))}function Zt(t,e){if(e&&"string"==typeof e){const n="grow-".concat(e);n in D&&at(t,D[n])}}var Yt={awaitingPromise:new WeakMap,promise:new WeakMap,innerParams:new WeakMap,domCache:new WeakMap};const Kt=["input","file","range","select","radio","checkbox","textarea"],$t=(t,e)=>{const n=B(),o=Yt.innerParams.get(t),i=!o||e.input!==o.input;Kt.forEach((t=>{const o=ct(n,D[t]);Xt(t,e.inputAttributes),o.className=D[t],i&&ht(o)})),e.input&&(i&&Qt(e),te(e))},Qt=t=>{if(!re[t.input])return r('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "'.concat(t.input,'"'));const e=oe(t.input),n=re[t.input](e,t);ut(e),setTimeout((()=>{rt(n)}))},Jt=t=>{for(let e=0;e{const n=it(B(),t);if(n){Jt(n);for(const t in e)n.setAttribute(t,e[t])}},te=t=>{const e=oe(t.input);"object"==typeof t.customClass&&at(e,t.customClass.input)},ee=(t,e)=>{t.placeholder&&!e.inputPlaceholder||(t.placeholder=e.inputPlaceholder)},ne=(t,e,n)=>{if(n.inputLabel){t.id=D.input;const o=document.createElement("label"),i=D["input-label"];o.setAttribute("for",t.id),o.className=i,"object"==typeof n.customClass&&at(o,n.customClass.inputLabel),o.innerText=n.inputLabel,e.insertAdjacentElement("beforebegin",o)}},oe=t=>ct(B(),D[t]||D.input),ie=(t,e)=>{["string","number"].includes(typeof e)?t.value="".concat(e):h(e)||i('Unexpected type of inputValue! Expected "string", "number" or "Promise", got "'.concat(typeof e,'"'))},re={};re.text=re.email=re.password=re.number=re.tel=re.url=(t,e)=>(ie(t,e.inputValue),ne(t,t,e),ee(t,e),t.type=e.input,t),re.file=(t,e)=>(ne(t,t,e),ee(t,e),t),re.range=(t,e)=>{const n=t.querySelector("input"),o=t.querySelector("output");return ie(n,e.inputValue),n.type=e.input,ie(o,e.inputValue),ne(n,t,e),t},re.select=(t,e)=>{if(t.textContent="",e.inputPlaceholder){const n=document.createElement("option");tt(n,e.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,t.appendChild(n)}return ne(t,t,e),t},re.radio=t=>(t.textContent="",t),re.checkbox=(t,e)=>{const n=it(B(),"checkbox");n.value="1",n.id=D.checkbox,n.checked=Boolean(e.inputValue);const o=t.querySelector("span");return tt(o,e.inputPlaceholder),n},re.textarea=(t,e)=>{ie(t,e.inputValue),ee(t,e),ne(t,t,e);const n=t=>parseInt(window.getComputedStyle(t).marginLeft)+parseInt(window.getComputedStyle(t).marginRight);return setTimeout((()=>{if("MutationObserver"in window){const e=parseInt(window.getComputedStyle(B()).width);new MutationObserver((()=>{const o=t.offsetWidth+n(t);B().style.width=o>e?"".concat(o,"px"):null})).observe(t,{attributes:!0,attributeFilter:["style"]})}})),t};const se=(t,e)=>{const n=P();ot(n,e,"htmlContainer"),e.html?(Pt(e.html,n),ut(n,"block")):e.text?(n.textContent=e.text,ut(n,"block")):ht(n),$t(t,e)},ae=(t,e)=>{const n=G();gt(n,e.footer),e.footer&&Pt(e.footer,n),ot(n,e,"footer")},le=(t,e)=>{const n=Z();tt(n,e.closeButtonHtml),ot(n,e,"closeButton"),gt(n,e.showCloseButton),n.setAttribute("aria-label",e.closeButtonAriaLabel)},ce=(t,e)=>{const n=Yt.innerParams.get(t),o=N();if(n&&e.icon===n.icon)return ge(o,e),void de(o,e);if(e.icon||e.iconHtml){if(e.icon&&-1===Object.keys(S).indexOf(e.icon))return r('Unknown icon! Expected "success", "error", "warning", "info" or "question", got "'.concat(e.icon,'"')),void ht(o);ut(o),ge(o,e),de(o,e),at(o,e.showClass.icon)}else ht(o)},de=(t,e)=>{for(const n in S)e.icon!==n&<(t,S[n]);at(t,S[e.icon]),pe(t,e),ue(),ot(t,e,"icon")},ue=()=>{const t=B(),e=window.getComputedStyle(t).getPropertyValue("background-color"),n=t.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let t=0;t
    \n \n
    \n
    \n',me='\n \n \n \n \n',ge=(t,e)=>{let n,o=t.innerHTML;e.iconHtml?n=fe(e.iconHtml):"success"===e.icon?(n=he,o=o.replace(/ style=".*?"/g,"")):n="error"===e.icon?me:fe({question:"?",warning:"!",info:"i"}[e.icon]),o.trim()!==n.trim()&&tt(t,n)},pe=(t,e)=>{if(e.iconColor){t.style.color=e.iconColor,t.style.borderColor=e.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])mt(t,n,"backgroundColor",e.iconColor);mt(t,".swal2-success-ring","borderColor",e.iconColor)}},fe=t=>'
    ').concat(t,"
    "),be=(t,e)=>{const n=L();if(!e.imageUrl)return ht(n);ut(n,""),n.setAttribute("src",e.imageUrl),n.setAttribute("alt",e.imageAlt),dt(n,"width",e.imageWidth),dt(n,"height",e.imageHeight),n.className=D.image,ot(n,e,"image")},ke=(t,e)=>{const n=O();if(!e.progressSteps||0===e.progressSteps.length)return ht(n);ut(n),n.textContent="",e.currentProgressStep>=e.progressSteps.length&&i("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),e.progressSteps.forEach(((t,o)=>{const i=we(t);if(n.appendChild(i),o===e.currentProgressStep&&at(i,D["active-progress-step"]),o!==e.progressSteps.length-1){const t=Ae(e);n.appendChild(t)}}))},we=t=>{const e=document.createElement("li");return at(e,D["progress-step"]),tt(e,t),e},Ae=t=>{const e=document.createElement("li");return at(e,D["progress-step-line"]),t.progressStepsDistance&&dt(e,"width",t.progressStepsDistance),e},Ce=(t,e)=>{const n=z();gt(n,e.title||e.titleText,"block"),e.title&&Pt(e.title,n),e.titleText&&(n.innerText=e.titleText),ot(n,e,"title")},_e=(t,e)=>{const n=I(),o=B();e.toast?(dt(n,"width",e.width),o.style.width="100%",o.insertBefore(H(),N())):dt(o,"width",e.width),dt(o,"padding",e.padding),e.color&&(o.style.color=e.color),e.background&&(o.style.background=e.background),ht(R()),ve(o,e)},ve=(t,e)=>{t.className="".concat(D.popup," ").concat(pt(t)?e.showClass.popup:""),e.toast?(at([document.documentElement,document.body],D["toast-shown"]),at(t,D.toast)):at(t,D.modal),ot(t,e,"popup"),"string"==typeof e.customClass&&at(t,e.customClass),e.icon&&at(t,D["icon-".concat(e.icon)])},ye=(t,e)=>{_e(t,e),qt(t,e),ke(t,e),ce(t,e),be(t,e),Ce(t,e),le(t,e),se(t,e),Vt(t,e),ae(t,e),"function"==typeof e.didRender&&e.didRender(B())},xe=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),Ee=()=>{o(document.body.children).forEach((t=>{t===I()||t.contains(I())||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")),t.setAttribute("aria-hidden","true"))}))},De=()=>{o(document.body.children).forEach((t=>{t.hasAttribute("data-previous-aria-hidden")?(t.setAttribute("aria-hidden",t.getAttribute("data-previous-aria-hidden")),t.removeAttribute("data-previous-aria-hidden")):t.removeAttribute("aria-hidden")}))},Se=["swal-title","swal-html","swal-footer"],Ie=t=>{const e="string"==typeof t.template?document.querySelector(t.template):t.template;if(!e)return{};const n=e.content;return Le(n),Object.assign(Te(n),Me(n),Be(n),Ne(n),ze(n),Pe(n,Se))},Te=t=>{const e={};return o(t.querySelectorAll("swal-param")).forEach((t=>{Oe(t,["name","value"]);const n=t.getAttribute("name"),o=t.getAttribute("value");"boolean"==typeof g[n]&&"false"===o&&(e[n]=!1),"object"==typeof g[n]&&(e[n]=JSON.parse(o))})),e},Me=t=>{const e={};return o(t.querySelectorAll("swal-button")).forEach((t=>{Oe(t,["type","color","aria-label"]);const o=t.getAttribute("type");e["".concat(o,"ButtonText")]=t.innerHTML,e["show".concat(n(o),"Button")]=!0,t.hasAttribute("color")&&(e["".concat(o,"ButtonColor")]=t.getAttribute("color")),t.hasAttribute("aria-label")&&(e["".concat(o,"ButtonAriaLabel")]=t.getAttribute("aria-label"))})),e},Be=t=>{const e={},n=t.querySelector("swal-image");return n&&(Oe(n,["src","width","height","alt"]),n.hasAttribute("src")&&(e.imageUrl=n.getAttribute("src")),n.hasAttribute("width")&&(e.imageWidth=n.getAttribute("width")),n.hasAttribute("height")&&(e.imageHeight=n.getAttribute("height")),n.hasAttribute("alt")&&(e.imageAlt=n.getAttribute("alt"))),e},Ne=t=>{const e={},n=t.querySelector("swal-icon");return n&&(Oe(n,["type","color"]),n.hasAttribute("type")&&(e.icon=n.getAttribute("type")),n.hasAttribute("color")&&(e.iconColor=n.getAttribute("color")),e.iconHtml=n.innerHTML),e},ze=t=>{const e={},n=t.querySelector("swal-input");n&&(Oe(n,["type","label","placeholder","value"]),e.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(e.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(e.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(e.inputValue=n.getAttribute("value")));const i=t.querySelectorAll("swal-input-option");return i.length&&(e.inputOptions={},o(i).forEach((t=>{Oe(t,["value"]);const n=t.getAttribute("value"),o=t.innerHTML;e.inputOptions[n]=o}))),e},Pe=(t,e)=>{const n={};for(const o in e){const i=e[o],r=t.querySelector(i);r&&(Oe(r,[]),n[i.replace(/^swal-/,"")]=r.innerHTML.trim())}return n},Le=t=>{const e=Se.concat(["swal-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);o(t.children).forEach((t=>{const n=t.tagName.toLowerCase();-1===e.indexOf(n)&&i("Unrecognized element <".concat(n,">"))}))},Oe=(t,e)=>{o(t.attributes).forEach((n=>{-1===e.indexOf(n.name)&&i(['Unrecognized attribute "'.concat(n.name,'" on <').concat(t.tagName.toLowerCase(),">."),"".concat(e.length?"Allowed attributes are: ".concat(e.join(", ")):"To set the value, use HTML within the element.")])}))};var Re={email:(t,e)=>/^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(t)?Promise.resolve():Promise.resolve(e||"Invalid email address"),url:(t,e)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(t)?Promise.resolve():Promise.resolve(e||"Invalid URL")};function je(t){t.inputValidator||Object.keys(Re).forEach((e=>{t.input===e&&(t.inputValidator=Re[e])}))}function Ve(t){(!t.target||"string"==typeof t.target&&!document.querySelector(t.target)||"string"!=typeof t.target&&!t.target.appendChild)&&(i('Target parameter is not valid, defaulting to "body"'),t.target="body")}function Fe(t){je(t),t.showLoaderOnConfirm&&!t.preConfirm&&i("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),Ve(t),"string"==typeof t.title&&(t.title=t.title.split("\n").join("
    ")),Nt(t)}class He{constructor(t,e){this.callback=t,this.remaining=e,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(t){const e=this.running;return e&&this.stop(),this.remaining+=t,e&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const Ue=()=>{null===X.previousBodyPadding&&document.body.scrollHeight>window.innerHeight&&(X.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight="".concat(X.previousBodyPadding+jt(),"px"))},qe=()=>{null!==X.previousBodyPadding&&(document.body.style.paddingRight="".concat(X.previousBodyPadding,"px"),X.previousBodyPadding=null)},Ge=()=>{if((/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!et(document.body,D.iosfix)){const t=document.body.scrollTop;document.body.style.top="".concat(-1*t,"px"),at(document.body,D.iosfix),Ze(),We()}},We=()=>{const t=navigator.userAgent,e=!!t.match(/iPad/i)||!!t.match(/iPhone/i),n=!!t.match(/WebKit/i);if(e&&n&&!t.match(/CriOS/i)){const t=44;B().scrollHeight>window.innerHeight-t&&(I().style.paddingBottom="".concat(t,"px"))}},Ze=()=>{const t=I();let e;t.ontouchstart=t=>{e=Ye(t)},t.ontouchmove=t=>{e&&(t.preventDefault(),t.stopPropagation())}},Ye=t=>{const e=t.target,n=I();return!(Ke(t)||$e(t)||e!==n&&(bt(n)||"INPUT"===e.tagName||"TEXTAREA"===e.tagName||bt(P())&&P().contains(e)))},Ke=t=>t.touches&&t.touches.length&&"stylus"===t.touches[0].touchType,$e=t=>t.touches&&t.touches.length>1,Qe=()=>{if(et(document.body,D.iosfix)){const t=parseInt(document.body.style.top,10);lt(document.body,D.iosfix),document.body.style.top="",document.body.scrollTop=-1*t}},Je=10,Xe=t=>{const e=I(),n=B();"function"==typeof t.willOpen&&t.willOpen(n);const o=window.getComputedStyle(document.body).overflowY;on(e,n,t),setTimeout((()=>{en(e,n)}),Je),$()&&(nn(e,t.scrollbarPadding,o),Ee()),Q()||vt.previousActiveElement||(vt.previousActiveElement=document.activeElement),"function"==typeof t.didOpen&&setTimeout((()=>t.didOpen(n))),lt(e,D["no-transition"])},tn=t=>{const e=B();if(t.target!==e)return;const n=I();e.removeEventListener(Rt,tn),n.style.overflowY="auto"},en=(t,e)=>{Rt&&kt(e)?(t.style.overflowY="hidden",e.addEventListener(Rt,tn)):t.style.overflowY="auto"},nn=(t,e,n)=>{Ge(),e&&"hidden"!==n&&Ue(),setTimeout((()=>{t.scrollTop=0}))},on=(t,e,n)=>{at(t,n.showClass.backdrop),e.style.setProperty("opacity","0","important"),ut(e,"grid"),setTimeout((()=>{at(e,n.showClass.popup),e.style.removeProperty("opacity")}),Je),at([document.documentElement,document.body],D.shown),n.heightAuto&&n.backdrop&&!n.toast&&at([document.documentElement,document.body],D["height-auto"])},rn=t=>{let e=B();e||new $o,e=B();const n=H();Q()?ht(N()):sn(e,t),ut(n),e.setAttribute("data-loading","true"),e.setAttribute("aria-busy","true"),e.focus()},sn=(t,e)=>{const n=q(),o=H();!e&&pt(j())&&(e=j()),ut(n),e&&(ht(e),o.setAttribute("data-button-to-replace",e.className)),o.parentNode.insertBefore(o,e),at([t,n],D.loading)},an=(t,e)=>{"select"===e.input||"radio"===e.input?hn(t,e):["text","email","number","tel","textarea"].includes(e.input)&&(d(e.inputValue)||h(e.inputValue))&&(rn(j()),mn(t,e))},ln=(t,e)=>{const n=t.getInput();if(!n)return null;switch(e.input){case"checkbox":return cn(n);case"radio":return dn(n);case"file":return un(n);default:return e.inputAutoTrim?n.value.trim():n.value}},cn=t=>t.checked?1:0,dn=t=>t.checked?t.value:null,un=t=>t.files.length?null!==t.getAttribute("multiple")?t.files:t.files[0]:null,hn=(t,e)=>{const n=B(),o=t=>gn[e.input](n,pn(t),e);d(e.inputOptions)||h(e.inputOptions)?(rn(j()),u(e.inputOptions).then((e=>{t.hideLoading(),o(e)}))):"object"==typeof e.inputOptions?o(e.inputOptions):r("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(typeof e.inputOptions))},mn=(t,e)=>{const n=t.getInput();ht(n),u(e.inputValue).then((o=>{n.value="number"===e.input?parseFloat(o)||0:"".concat(o),ut(n),n.focus(),t.hideLoading()})).catch((e=>{r("Error in inputValue promise: ".concat(e)),n.value="",ut(n),n.focus(),t.hideLoading()}))},gn={select:(t,e,n)=>{const o=ct(t,D.select),i=(t,e,o)=>{const i=document.createElement("option");i.value=o,tt(i,e),i.selected=fn(o,n.inputValue),t.appendChild(i)};e.forEach((t=>{const e=t[0],n=t[1];if(Array.isArray(n)){const t=document.createElement("optgroup");t.label=e,t.disabled=!1,o.appendChild(t),n.forEach((e=>i(t,e[1],e[0])))}else i(o,n,e)})),o.focus()},radio:(t,e,n)=>{const o=ct(t,D.radio);e.forEach((t=>{const e=t[0],i=t[1],r=document.createElement("input"),s=document.createElement("label");r.type="radio",r.name=D.radio,r.value=e,fn(e,n.inputValue)&&(r.checked=!0);const a=document.createElement("span");tt(a,i),a.className=D.label,s.appendChild(r),s.appendChild(a),o.appendChild(s)}));const i=o.querySelectorAll("input");i.length&&i[0].focus()}},pn=t=>{const e=[];return"undefined"!=typeof Map&&t instanceof Map?t.forEach(((t,n)=>{let o=t;"object"==typeof o&&(o=pn(o)),e.push([n,o])})):Object.keys(t).forEach((n=>{let o=t[n];"object"==typeof o&&(o=pn(o)),e.push([n,o])})),e},fn=(t,e)=>e&&e.toString()===t.toString();function bn(){const t=Yt.innerParams.get(this);if(!t)return;const e=Yt.domCache.get(this);ht(e.loader),Q()?t.icon&&ut(N()):kn(e),lt([e.popup,e.actions],D.loading),e.popup.removeAttribute("aria-busy"),e.popup.removeAttribute("data-loading"),e.confirmButton.disabled=!1,e.denyButton.disabled=!1,e.cancelButton.disabled=!1}const kn=t=>{const e=t.popup.getElementsByClassName(t.loader.getAttribute("data-button-to-replace"));e.length?ut(e[0],"inline-block"):ft()&&ht(t.actions)};function wn(t){const e=Yt.innerParams.get(t||this),n=Yt.domCache.get(t||this);return n?it(n.popup,e.input):null}var An={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const Cn=()=>pt(B()),_n=()=>j()&&j().click(),vn=()=>V()&&V().click(),yn=()=>U()&&U().click(),xn=t=>{t.keydownTarget&&t.keydownHandlerAdded&&(t.keydownTarget.removeEventListener("keydown",t.keydownHandler,{capture:t.keydownListenerCapture}),t.keydownHandlerAdded=!1)},En=(t,e,n,o)=>{xn(e),n.toast||(e.keydownHandler=e=>Tn(t,e,o),e.keydownTarget=n.keydownListenerCapture?window:B(),e.keydownListenerCapture=n.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)},Dn=(t,e,n)=>{const o=K();if(o.length)return(e+=n)===o.length?e=0:-1===e&&(e=o.length-1),o[e].focus();B().focus()},Sn=["ArrowRight","ArrowDown"],In=["ArrowLeft","ArrowUp"],Tn=(t,e,n)=>{const o=Yt.innerParams.get(t);o&&(e.isComposing||229===e.keyCode||(o.stopKeydownPropagation&&e.stopPropagation(),"Enter"===e.key?Mn(t,e,o):"Tab"===e.key?Bn(e,o):[...Sn,...In].includes(e.key)?Nn(e.key):"Escape"===e.key&&zn(e,o,n)))},Mn=(t,e,n)=>{if(c(n.allowEnterKey)&&e.target&&t.getInput()&&e.target instanceof HTMLElement&&e.target.outerHTML===t.getInput().outerHTML){if(["textarea","file"].includes(n.input))return;_n(),e.preventDefault()}},Bn=(t,e)=>{const n=t.target,o=K();let i=-1;for(let t=0;t{const e=j(),n=V(),o=U();if(document.activeElement instanceof HTMLElement&&![e,n,o].includes(document.activeElement))return;const i=Sn.includes(t)?"nextElementSibling":"previousElementSibling";let r=document.activeElement;for(let t=0;t{c(e.allowEscapeKey)&&(t.preventDefault(),n(xe.esc))};function Pn(t,e,n,o){Q()?Gn(t,o):(xt(n).then((()=>Gn(t,o))),xn(vt)),/^((?!chrome|android).)*safari/i.test(navigator.userAgent)?(e.setAttribute("style","display:none !important"),e.removeAttribute("class"),e.innerHTML=""):e.remove(),$()&&(qe(),Qe(),De()),Ln()}function Ln(){lt([document.documentElement,document.body],[D.shown,D["height-auto"],D["no-backdrop"],D["toast-shown"]])}function On(t){t=Hn(t);const e=An.swalPromiseResolve.get(this),n=jn(this);this.isAwaitingPromise()?t.isDismissed||(Fn(this),e(t)):n&&e(t)}function Rn(){return!!Yt.awaitingPromise.get(this)}const jn=t=>{const e=B();if(!e)return!1;const n=Yt.innerParams.get(t);if(!n||et(e,n.hideClass.popup))return!1;lt(e,n.showClass.popup),at(e,n.hideClass.popup);const o=I();return lt(o,n.showClass.backdrop),at(o,n.hideClass.backdrop),Un(t,e,n),!0};function Vn(t){const e=An.swalPromiseReject.get(this);Fn(this),e&&e(t)}const Fn=t=>{t.isAwaitingPromise()&&(Yt.awaitingPromise.delete(t),Yt.innerParams.get(t)||t._destroy())},Hn=t=>void 0===t?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},t),Un=(t,e,n)=>{const o=I(),i=Rt&&kt(e);"function"==typeof n.willClose&&n.willClose(e),i?qn(t,e,o,n.returnFocus,n.didClose):Pn(t,o,n.returnFocus,n.didClose)},qn=(t,e,n,o,i)=>{vt.swalCloseEventFinishedCallback=Pn.bind(null,t,n,o,i),e.addEventListener(Rt,(function(t){t.target===e&&(vt.swalCloseEventFinishedCallback(),delete vt.swalCloseEventFinishedCallback)}))},Gn=(t,e)=>{setTimeout((()=>{"function"==typeof e&&e.bind(t.params)(),t._destroy()}))};function Wn(t,e,n){const o=Yt.domCache.get(t);e.forEach((t=>{o[t].disabled=n}))}function Zn(t,e){if(!t)return!1;if("radio"===t.type){const n=t.parentNode.parentNode.querySelectorAll("input");for(let t=0;t{const e={};return Object.keys(t).forEach((n=>{w(n)?e[n]=t[n]:i("Invalid parameter to update: ".concat(n))})),e};function oo(){const t=Yt.domCache.get(this),e=Yt.innerParams.get(this);e?(t.popup&&vt.swalCloseEventFinishedCallback&&(vt.swalCloseEventFinishedCallback(),delete vt.swalCloseEventFinishedCallback),"function"==typeof e.didDestroy&&e.didDestroy(),io(this)):ro(this)}const io=t=>{ro(t),delete t.params,delete vt.keydownHandler,delete vt.keydownTarget,delete vt.currentInstance},ro=t=>{t.isAwaitingPromise()?(so(Yt,t),Yt.awaitingPromise.set(t,!0)):(so(An,t),so(Yt,t))},so=(t,e)=>{for(const n in t)t[n].delete(e)};var ao=Object.freeze({hideLoading:bn,disableLoading:bn,getInput:wn,close:On,isAwaitingPromise:Rn,rejectPromise:Vn,handleAwaitingPromise:Fn,closePopup:On,closeModal:On,closeToast:On,enableButtons:Yn,disableButtons:Kn,enableInput:$n,disableInput:Qn,showValidationMessage:Jn,resetValidationMessage:Xn,getProgressSteps:to,update:eo,_destroy:oo});const lo=t=>{const e=Yt.innerParams.get(t);t.disableButtons(),e.input?ho(t,"confirm"):bo(t,!0)},co=t=>{const e=Yt.innerParams.get(t);t.disableButtons(),e.returnInputValueOnDeny?ho(t,"deny"):go(t,!1)},uo=(t,e)=>{t.disableButtons(),e(xe.cancel)},ho=(t,e)=>{const o=Yt.innerParams.get(t);if(!o.input)return r('The "input" parameter is needed to be set when using returnInputValueOn'.concat(n(e)));const i=ln(t,o);o.inputValidator?mo(t,i,e):t.getInput().checkValidity()?"deny"===e?go(t,i):bo(t,i):(t.enableButtons(),t.showValidationMessage(o.validationMessage))},mo=(t,e,n)=>{const o=Yt.innerParams.get(t);t.disableInput(),Promise.resolve().then((()=>u(o.inputValidator(e,o.validationMessage)))).then((o=>{t.enableButtons(),t.enableInput(),o?t.showValidationMessage(o):"deny"===n?go(t,e):bo(t,e)}))},go=(t,e)=>{const n=Yt.innerParams.get(t||void 0);n.showLoaderOnDeny&&rn(V()),n.preDeny?(Yt.awaitingPromise.set(t||void 0,!0),Promise.resolve().then((()=>u(n.preDeny(e,n.validationMessage)))).then((n=>{!1===n?(t.hideLoading(),Fn(t)):t.closePopup({isDenied:!0,value:void 0===n?e:n})})).catch((e=>fo(t||void 0,e)))):t.closePopup({isDenied:!0,value:e})},po=(t,e)=>{t.closePopup({isConfirmed:!0,value:e})},fo=(t,e)=>{t.rejectPromise(e)},bo=(t,e)=>{const n=Yt.innerParams.get(t||void 0);n.showLoaderOnConfirm&&rn(),n.preConfirm?(t.resetValidationMessage(),Yt.awaitingPromise.set(t||void 0,!0),Promise.resolve().then((()=>u(n.preConfirm(e,n.validationMessage)))).then((n=>{pt(R())||!1===n?(t.hideLoading(),Fn(t)):po(t,void 0===n?e:n)})).catch((e=>fo(t||void 0,e)))):po(t,e)},ko=(t,e,n)=>{Yt.innerParams.get(t).toast?wo(t,e,n):(_o(e),vo(e),yo(t,e,n))},wo=(t,e,n)=>{e.popup.onclick=()=>{const e=Yt.innerParams.get(t);e&&(Ao(e)||e.timer||e.input)||n(xe.close)}},Ao=t=>t.showConfirmButton||t.showDenyButton||t.showCancelButton||t.showCloseButton;let Co=!1;const _o=t=>{t.popup.onmousedown=()=>{t.container.onmouseup=function(e){t.container.onmouseup=void 0,e.target===t.container&&(Co=!0)}}},vo=t=>{t.container.onmousedown=()=>{t.popup.onmouseup=function(e){t.popup.onmouseup=void 0,(e.target===t.popup||t.popup.contains(e.target))&&(Co=!0)}}},yo=(t,e,n)=>{e.container.onclick=o=>{const i=Yt.innerParams.get(t);Co?Co=!1:o.target===e.container&&c(i.allowOutsideClick)&&n(xe.backdrop)}},xo=t=>"object"==typeof t&&t.jquery,Eo=t=>t instanceof Element||xo(t),Do=t=>{const e={};return"object"!=typeof t[0]||Eo(t[0])?["title","html","icon"].forEach(((n,o)=>{const i=t[o];"string"==typeof i||Eo(i)?e[n]=i:void 0!==i&&r("Unexpected type of ".concat(n,'! Expected "string" or "Element", got ').concat(typeof i))})):Object.assign(e,t[0]),e};function So(){const t=this;for(var e=arguments.length,n=new Array(e),o=0;ovt.timeout&&vt.timeout.getTimerLeft(),Mo=()=>{if(vt.timeout)return At(),vt.timeout.stop()},Bo=()=>{if(vt.timeout){const t=vt.timeout.start();return wt(t),t}},No=()=>{const t=vt.timeout;return t&&(t.running?Mo():Bo())},zo=t=>{if(vt.timeout){const e=vt.timeout.increase(t);return wt(e,!0),e}},Po=()=>vt.timeout&&vt.timeout.isRunning();let Lo=!1;const Oo={};function Ro(){Oo[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,Lo||(document.body.addEventListener("click",jo),Lo=!0)}const jo=t=>{for(let e=t.target;e&&e!==document;e=e.parentNode)for(const t in Oo){const n=e.getAttribute(t);if(n)return void Oo[t].fire({template:n})}};var Vo=Object.freeze({isValidParameter:k,isUpdatableParameter:w,isDeprecatedParameter:A,argsToParams:Do,isVisible:Cn,clickConfirm:_n,clickDeny:vn,clickCancel:yn,getContainer:I,getPopup:B,getTitle:z,getHtmlContainer:P,getImage:L,getIcon:N,getInputLabel:F,getCloseButton:Z,getActions:q,getConfirmButton:j,getDenyButton:V,getCancelButton:U,getLoader:H,getFooter:G,getTimerProgressBar:W,getFocusableElements:K,getValidationMessage:R,isLoading:J,fire:So,mixin:Io,showLoading:rn,enableLoading:rn,getTimerLeft:To,stopTimer:Mo,resumeTimer:Bo,toggleTimer:No,increaseTimer:zo,isTimerRunning:Po,bindClickHandler:Ro});let Fo;class Ho{constructor(){if("undefined"==typeof window)return;Fo=this;for(var t=arguments.length,e=new Array(t),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};y(Object.assign({},e,t)),vt.currentInstance&&(vt.currentInstance._destroy(),$()&&De()),vt.currentInstance=Fo;const n=qo(t,e);Fe(n),Object.freeze(n),vt.timeout&&(vt.timeout.stop(),delete vt.timeout),clearTimeout(vt.restoreFocusTimeout);const o=Go(Fo);return ye(Fo,n),Yt.innerParams.set(Fo,n),Uo(Fo,o,n)}then(t){return Yt.promise.get(this).then(t)}finally(t){return Yt.promise.get(this).finally(t)}}const Uo=(t,e,n)=>new Promise(((o,i)=>{const r=e=>{t.closePopup({isDismissed:!0,dismiss:e})};An.swalPromiseResolve.set(t,o),An.swalPromiseReject.set(t,i),e.confirmButton.onclick=()=>lo(t),e.denyButton.onclick=()=>co(t),e.cancelButton.onclick=()=>uo(t,r),e.closeButton.onclick=()=>r(xe.close),ko(t,e,r),En(t,vt,n,r),an(t,n),Xe(n),Wo(vt,n,r),Zo(e,n),setTimeout((()=>{e.container.scrollTop=0}))})),qo=(t,e)=>{const n=Ie(t),o=Object.assign({},g,e,n,t);return o.showClass=Object.assign({},g.showClass,o.showClass),o.hideClass=Object.assign({},g.hideClass,o.hideClass),o},Go=t=>{const e={popup:B(),container:I(),actions:q(),confirmButton:j(),denyButton:V(),cancelButton:U(),loader:H(),closeButton:Z(),validationMessage:R(),progressSteps:O()};return Yt.domCache.set(t,e),e},Wo=(t,e,n)=>{const o=W();ht(o),e.timer&&(t.timeout=new He((()=>{n("timer"),delete t.timeout}),e.timer),e.timerProgressBar&&(ut(o),ot(o,e,"timerProgressBar"),setTimeout((()=>{t.timeout&&t.timeout.running&&wt(e.timer)}))))},Zo=(t,e)=>{if(!e.toast)return c(e.allowEnterKey)?void(Yo(t,e)||Dn(e,-1,1)):Ko()},Yo=(t,e)=>e.focusDeny&&pt(t.denyButton)?(t.denyButton.focus(),!0):e.focusCancel&&pt(t.cancelButton)?(t.cancelButton.focus(),!0):!(!e.focusConfirm||!pt(t.confirmButton)||(t.confirmButton.focus(),0)),Ko=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};Object.assign(Ho.prototype,ao),Object.assign(Ho,Vo),Object.keys(ao).forEach((t=>{Ho[t]=function(){if(Fo)return Fo[t](...arguments)}})),Ho.DismissReason=xe,Ho.version="11.4.19";const $o=Ho;return $o.default=$o,$o}(),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2),"undefined"!=typeof document&&function(t,e){var n=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=e);else try{n.innerHTML=e}catch(t){n.innerText=e}}(document,'.swal2-popup.swal2-toast{box-sizing:border-box;grid-column:1/4!important;grid-row:1/4!important;grid-template-columns:1fr 99fr 1fr;padding:1em;overflow-y:hidden;background:#fff;box-shadow:0 0 1px hsla(0deg,0%,0%,.075),0 1px 2px hsla(0deg,0%,0%,.075),1px 2px 4px hsla(0deg,0%,0%,.075),1px 3px 8px hsla(0deg,0%,0%,.075),2px 4px 16px hsla(0deg,0%,0%,.075);pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.5em;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-popup.swal2-toast .swal2-html-container{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-popup.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:700}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-container{display:grid;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;box-sizing:border-box;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(-webkit-min-content,auto) minmax(-webkit-min-content,auto) minmax(-webkit-min-content,auto);grid-template-rows:minmax(min-content,auto) minmax(min-content,auto) minmax(min-content,auto);height:100%;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show,.swal2-container.swal2-noanimation{background:rgba(0,0,0,.4)}.swal2-container.swal2-backdrop-hide{background:0 0!important}.swal2-container.swal2-bottom-start,.swal2-container.swal2-center-start,.swal2-container.swal2-top-start{grid-template-columns:minmax(0,1fr) auto auto}.swal2-container.swal2-bottom,.swal2-container.swal2-center,.swal2-container.swal2-top{grid-template-columns:auto minmax(0,1fr) auto}.swal2-container.swal2-bottom-end,.swal2-container.swal2-center-end,.swal2-container.swal2-top-end{grid-template-columns:auto auto minmax(0,1fr)}.swal2-container.swal2-top-start>.swal2-popup{align-self:start}.swal2-container.swal2-top>.swal2-popup{grid-column:2;align-self:start;justify-self:center}.swal2-container.swal2-top-end>.swal2-popup,.swal2-container.swal2-top-right>.swal2-popup{grid-column:3;align-self:start;justify-self:end}.swal2-container.swal2-center-left>.swal2-popup,.swal2-container.swal2-center-start>.swal2-popup{grid-row:2;align-self:center}.swal2-container.swal2-center>.swal2-popup{grid-column:2;grid-row:2;align-self:center;justify-self:center}.swal2-container.swal2-center-end>.swal2-popup,.swal2-container.swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;align-self:center;justify-self:end}.swal2-container.swal2-bottom-left>.swal2-popup,.swal2-container.swal2-bottom-start>.swal2-popup{grid-column:1;grid-row:3;align-self:end}.swal2-container.swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;justify-self:center;align-self:end}.swal2-container.swal2-bottom-end>.swal2-popup,.swal2-container.swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;align-self:end;justify-self:end}.swal2-container.swal2-grow-fullscreen>.swal2-popup,.swal2-container.swal2-grow-row>.swal2-popup{grid-column:1/4;width:100%}.swal2-container.swal2-grow-column>.swal2-popup,.swal2-container.swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}.swal2-container.swal2-no-transition{transition:none!important}.swal2-popup{display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0,100%);width:32em;max-width:100%;padding:0 0 1.25em;border:none;border-radius:5px;background:#fff;color:#545454;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-title{position:relative;max-width:100%;margin:0;padding:.8em 1em 0;color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:auto;margin:1.25em auto 0;padding:0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-loader{display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 transparent #2778c4 transparent}.swal2-styled{margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s;box-shadow:0 0 0 3px transparent;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#7066e0;color:#fff;font-size:1em}.swal2-styled.swal2-confirm:focus{box-shadow:0 0 0 3px rgba(112,102,224,.5)}.swal2-styled.swal2-deny{border:0;border-radius:.25em;background:initial;background-color:#dc3741;color:#fff;font-size:1em}.swal2-styled.swal2-deny:focus{box-shadow:0 0 0 3px rgba(220,55,65,.5)}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#6e7881;color:#fff;font-size:1em}.swal2-styled.swal2-cancel:focus{box-shadow:0 0 0 3px rgba(110,120,129,.5)}.swal2-styled.swal2-default-outline:focus{box-shadow:0 0 0 3px rgba(100,150,200,.5)}.swal2-styled:focus{outline:0}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1em 0 0;padding:1em 1em 0;border-top:1px solid #eee;color:inherit;font-size:1em}.swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto!important;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.swal2-timer-progress-bar{width:100%;height:.25em;background:rgba(0,0,0,.2)}.swal2-image{max-width:100%;margin:2em auto 1em}.swal2-close{z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:color .1s,box-shadow .1s;border:none;border-radius:5px;background:0 0;color:#ccc;font-family:serif;font-family:monospace;font-size:2.5em;cursor:pointer;justify-self:end}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-close:focus{outline:0;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}.swal2-close::-moz-focus-inner{border:0}.swal2-html-container{z-index:1;justify-content:center;margin:1em 1.6em .3em;padding:0;overflow:auto;color:inherit;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word;word-break:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em 2em 3px}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:auto;transition:border-color .1s,box-shadow .1s;border:1px solid #d9d9d9;border-radius:.1875em;background:0 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px transparent;color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em 2em 3px;background:#fff}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-file{width:75%;margin-right:auto;margin-left:auto;background:0 0;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:0 0;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:#fff;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{flex-shrink:0;margin:0 .4em}.swal2-input-label{display:flex;justify-content:center;margin:1em auto 0}.swal2-validation-message{align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;border:.25em solid transparent;border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474;color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-error.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-warning.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-warning.swal2-icon-show .swal2-icon-content{-webkit-animation:swal2-animate-i-mark .5s;animation:swal2-animate-i-mark .5s}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-info.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-info.swal2-icon-show .swal2-icon-content{-webkit-animation:swal2-animate-i-mark .8s;animation:swal2-animate-i-mark .8s}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-question.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-question.swal2-icon-show .swal2-icon-content{-webkit-animation:swal2-animate-question-mark .8s;animation:swal2-animate-question-mark .8s}.swal2-icon.swal2-success{border-color:#a5dc86;color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:0 0;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-no-war{display:flex;position:fixed;z-index:1061;top:0;left:0;align-items:center;justify-content:center;width:100%;height:3.375em;background:#20232a;color:#fff;text-align:center}.swal2-no-war a{color:#61dafb;text-decoration:none}.swal2-no-war a:hover{text-decoration:underline}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@-webkit-keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@-webkit-keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-container{background-color:transparent!important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:transparent;pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}')},1016:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,"#fullscreenoverlay{overflow:hidden}#fullscreeneditor{bottom:0;left:0;position:fixed!important;right:0;top:0;z-index:1000}#fullscreeneditor .ck-editor__editable.ck-rounded-corners.ck-editor__editable_inline,#fullscreeneditor .ck.ck-editor__main{height:100%}","",{version:3,sources:["webpack://./github/ckeditor5-fullscreen/css/style.css"],names:[],mappings:"AAAA,mBACC,eACD,CACA,kBAKC,QAAS,CAFT,MAAO,CAFJ,wBAA0B,CAG7B,OAAO,CAFP,KAAK,CAIL,YACD,CACA,2HACI,WACJ",sourcesContent:["#fullscreenoverlay{\n\toverflow: hidden;\n}\n#fullscreeneditor{\n position: fixed !important;\n\ttop:0;\n\tleft: 0;\n\tright:0;\n\tbottom: 0;\n\tz-index:1000;\n}\n#fullscreeneditor .ck-editor__editable.ck-rounded-corners.ck-editor__editable_inline, #fullscreeneditor .ck.ck-editor__main {\n height: 100%;\n}"],sourceRoot:""}]);const a=s},636:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css"],names:[],mappings:"AAKA,uBAWC,0BAAsC,CADtC,iBAAkB,CAFlB,aAAc,CACd,cAAe,CAPf,eAAgB,CAIhB,kBAAmB,CADnB,mBAOD,CAEA,gCACC,aAAc,CACd,2BACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content blockquote {\n\t/* See #12 */\n\toverflow: hidden;\n\n\t/* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */\n\tpadding-right: 1.5em;\n\tpadding-left: 1.5em;\n\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-style: italic;\n\tborder-left: solid 5px hsl(0, 0%, 80%);\n}\n\n.ck-content[dir="rtl"] blockquote {\n\tborder-left: 0;\n\tborder-right: solid 5px hsl(0, 0%, 80%);\n}\n'],sourceRoot:""}]);const a=s},390:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;pointer-events:none;position:relative}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);margin-left:-1px;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{border-color:var(--ck-clipboard-drop-target-color) transparent transparent transparent;border-style:solid;border-width:calc(var(--ck-clipboard-drop-target-dot-height)) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5);content:"";display:block;height:0;left:50%;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);transform:translateX(-50%);width:0}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-clipboard/clipboard.css"],names:[],mappings:"AASC,8DACC,cAAe,CAEf,mBAAoB,CADpB,iBAOD,CAJC,mEACC,iBAAkB,CAClB,OACD,CAWA,qJACC,YACD,CCzBF,MACC,yCAA0C,CAC1C,yCAA0C,CAC1C,6DACD,CAOE,mEAIC,gDAAiD,CADjD,sDAAuD,CAFvD,2DAA8D,CAI9D,gBAAiB,CAHjB,wDAqBD,CAfC,yEAWC,sFAAuF,CAEvF,kBAAmB,CADnB,qKAA0K,CAX1K,UAAW,CAIX,aAAc,CAFd,QAAS,CAIT,QAAS,CADT,iBAAkB,CAElB,wDAA2D,CAE3D,0BAA2B,CAR3B,OAYD,CA2DF,kEACC,gGACD,CAKA,gDACC,OAAS,CACT,sBACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: inline;\n\t\tposition: relative;\n\t\tpointer-events: none;\n\n\t\t& span {\n\t\t\tposition: absolute;\n\t\t\twidth: 0;\n\t\t}\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\t& > .ck-widget__selection-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t& > .ck-widget__type-around {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-clipboard-drop-target-dot-width: 12px;\n\t--ck-clipboard-drop-target-dot-height: 8px;\n\t--ck-clipboard-drop-target-color: var(--ck-color-focus-border)\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\t& span {\n\t\t\tbottom: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tbackground: var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-left: -1px;\n\n\t\t\t/* The triangle above the marker */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 50%;\n\t\t\t\ttop: calc(var(--ck-clipboard-drop-target-dot-height) * -.5);\n\n\t\t\t\ttransform: translateX(-50%);\n\t\t\t\tborder-color: var(--ck-clipboard-drop-target-color) transparent transparent transparent;\n\t\t\t\tborder-width: calc(var(--ck-clipboard-drop-target-dot-height)) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t// Horizontal drop target (between blocks).\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\theight: 0;\n\t\tmargin: 0;\n\t\ttext-align: initial;\n\n\t\t& .ck-clipboard-drop-target__line {\n\t\t\tposition: absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 0;\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-top: -1px;\n\n\t\t\t&::before {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-clipboard-drop-target-color);\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) 0 var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent var(--ck-clipboard-drop-target-color) transparent transparent;\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size)) var(--ck-clipboard-drop-target-dot-size) 0;\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t/*\n\t * Styles of the widget that it a drop target.\n\t */\n\t& .ck-widget.ck-clipboard-drop-target-range {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important;\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\tzoom: 0.6;\n\t\toutline: none !important;\n\t}\n}\n'],sourceRoot:""}]);const a=s},3638:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-modal)}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-bottom-width:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar{border-bottom-width:1px;border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-editor-classic/classiceditor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,cAIC,iBAMD,CAJC,2DAEC,yBACD,CCLC,gDCED,eDKC,CAPA,uICMA,qCAAsC,CDJpC,2BAA4B,CAC5B,4BAIF,CAPA,gDAMC,qBACD,CAEA,iFACC,uBAAwB,CCR1B,eDaC,CANA,yMCHA,qCAAsC,CDOpC,eAEF,CAKF,yCAEC,0CAA2C,CCpB3C,eD8BD,CAZA,yHCdE,qCAAsC,CDmBtC,wBAAyB,CACzB,yBAMF,CAHC,0DACC,wCACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor {\n\t/* All the elements within `.ck-editor` are positioned relatively to it.\n\t If any element needs to be positioned with respect to the , etc.,\n\t it must land outside of the `.ck-editor` in DOM. */\n\tposition: relative;\n\n\t& .ck-editor__top .ck-sticky-panel .ck-toolbar {\n\t\t/* https://github.com/ckeditor/ckeditor5-editor-classic/issues/62 */\n\t\tz-index: var(--ck-z-modal);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n.ck.ck-editor__top {\n\t& .ck-sticky-panel {\n\t\t& .ck-toolbar {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\tborder-bottom-width: 0;\n\t\t}\n\n\t\t& .ck-sticky-panel__content_sticky .ck-toolbar {\n\t\t\tborder-bottom-width: 1px;\n\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Note: Use ck-editor__main to make sure these styles don\'t apply to other editor types */\n.ck.ck-editor__main > .ck-editor__editable {\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/113 */\n\tbackground: var(--ck-color-base-background);\n\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&:not(.ck-focused) {\n\t\tborder-color: var(--ck-color-base-border);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},8894:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-placeholder,.ck.ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{content:attr(data-placeholder);left:0;pointer-events:none;position:absolute;right:0}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-reset_all .ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{color:var(--ck-color-engine-placeholder-text);cursor:text}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-engine/placeholder.css"],names:[],mappings:"AAMA,uCAEC,iBAWD,CATC,qDAIC,8BAA+B,CAF/B,MAAO,CAKP,mBAAoB,CANpB,iBAAkB,CAElB,OAKD,CAKA,wCACC,YACD,CAQD,iCACC,iBACD,CC5BC,qDAEC,6CAA8C,CAD9C,WAED",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder,\n.ck .ck-placeholder {\n\tposition: relative;\n\n\t&::before {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tcontent: attr(data-placeholder);\n\n\t\t/* See ckeditor/ckeditor5#469. */\n\t\tpointer-events: none;\n\t}\n}\n\n/* See ckeditor/ckeditor5#1987. */\n.ck.ck-read-only .ck-placeholder {\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n\n/*\n * Rules for the `ck-placeholder` are loaded before the rules for `ck-reset_all` in the base CKEditor 5 DLL build.\n * This fix overwrites the incorrectly set `position: static` from `ck-reset_all`.\n * See https://github.com/ckeditor/ckeditor5/issues/11418.\n */\n.ck.ck-reset_all .ck-placeholder {\n\tposition: relative;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder, .ck .ck-placeholder {\n\t&::before {\n\t\tcursor: text;\n\t\tcolor: var(--ck-color-engine-placeholder-text);\n\t}\n}\n"],sourceRoot:""}]);const a=s},4401:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable span[data-ck-unsafe-element]{display:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-engine/theme/renderer.css"],names:[],mappings:"AAMA,qDACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Elements marked by the Renderer as hidden should be invisible in the editor. */\n.ck.ck-editor__editable span[data-ck-unsafe-element] {\n\tdisplay: none;\n}\n"],sourceRoot:""}]);const a=s},2585:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-button.ck-color-table__remove-color{align-items:center;display:flex;width:100%}label.ck.ck-color-grid__label{font-weight:unset}.ck .ck-button.ck-color-table__remove-color{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard)}.ck .ck-button.ck-color-table__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-base-border)}[dir=ltr] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontcolor.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-font/fontcolor.css"],names:[],mappings:"AAKA,4CAEC,kBAAmB,CADnB,YAAa,CAEb,UACD,CAEA,8BACC,iBACD,CCNA,4CAEC,2BAA4B,CAC5B,4BAA6B,CAF7B,qEAiBD,CAbC,wDACC,mDACD,CAEA,kEAEE,uCAMF,CARA,kEAME,sCAEF",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-button.ck-color-table__remove-color {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n}\n\nlabel.ck.ck-color-grid__label {\n\tfont-weight: unset;\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck .ck-button.ck-color-table__remove-color {\n\tpadding: calc(var(--ck-spacing-standard) / 2 ) var(--ck-spacing-standard);\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n\n\t&:not(:focus) {\n\t\tborder-bottom: 1px solid var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]);const a=s},6203:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-content .text-tiny{font-size:.7em}.ck-content .text-small{font-size:.85em}.ck-content .text-big{font-size:1.4em}.ck-content .text-huge{font-size:1.8em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontsize.css"],names:[],mappings:"AAUC,uBACC,cACD,CAEA,wBACC,eACD,CAEA,sBACC,eACD,CAEA,uBACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* The values should be synchronized with the "FONT_SIZE_PRESET_UNITS" object in the "/src/fontsize/utils.js" file. */\n\n/* Styles should be prefixed with the `.ck-content` class.\nSee https://github.com/ckeditor/ckeditor5/issues/6636 */\n.ck-content {\n\t& .text-tiny {\n\t\tfont-size: .7em;\n\t}\n\n\t& .text-small {\n\t\tfont-size: .85em;\n\t}\n\n\t& .text-big {\n\t\tfont-size: 1.4em;\n\t}\n\n\t& .text-huge {\n\t\tfont-size: 1.8em;\n\t}\n}\n'],sourceRoot:""}]);const a=s},3230:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-heading/theme/heading.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-heading/heading.css"],names:[],mappings:"AAKA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,+BACC,eACD,CCZC,2EACC,SACD,CAEA,uEACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-heading_heading1 {\n\tfont-size: 20px;\n}\n\n.ck.ck-heading_heading2 {\n\tfont-size: 17px;\n}\n\n.ck.ck-heading_heading3 {\n\tfont-size: 14px;\n}\n\n.ck[class*="ck-heading_heading"] {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Resize dropdown's button label. */\n.ck.ck-dropdown.ck-heading-dropdown {\n\t& .ck-dropdown__button .ck-button__label {\n\t\twidth: 8em;\n\t}\n\n\t& .ck-dropdown__panel .ck-list__item {\n\t\tmin-width: 18em;\n\t}\n}\n"],sourceRoot:""}]);const a=s},713:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-highlight-marker-yellow:#fdfd77;--ck-highlight-marker-green:#62f962;--ck-highlight-marker-pink:#fc7899;--ck-highlight-marker-blue:#72ccfd;--ck-highlight-pen-red:#e71313;--ck-highlight-pen-green:#128a00}.ck-content .marker-yellow{background-color:var(--ck-highlight-marker-yellow)}.ck-content .marker-green{background-color:var(--ck-highlight-marker-green)}.ck-content .marker-pink{background-color:var(--ck-highlight-marker-pink)}.ck-content .marker-blue{background-color:var(--ck-highlight-marker-blue)}.ck-content .pen-red{background-color:transparent;color:var(--ck-highlight-pen-red)}.ck-content .pen-green{background-color:transparent;color:var(--ck-highlight-pen-green)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-highlight/theme/highlight.css"],names:[],mappings:"AAKA,MACC,oCAA+C,CAC/C,mCAA+C,CAC/C,kCAA8C,CAC9C,kCAA8C,CAC9C,8BAAwC,CACxC,gCACD,CAGC,2BACC,kDACD,CAFA,0BACC,iDACD,CAFA,yBACC,gDACD,CAFA,yBACC,gDACD,CAIA,qBAIC,4BAA6B,CAH7B,iCAID,CALA,uBAIC,4BAA6B,CAH7B,mCAID",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-highlight-marker-yellow: hsl(60, 97%, 73%);\n\t--ck-highlight-marker-green: hsl(120, 93%, 68%);\n\t--ck-highlight-marker-pink: hsl(345, 96%, 73%);\n\t--ck-highlight-marker-blue: hsl(201, 97%, 72%);\n\t--ck-highlight-pen-red: hsl(0, 85%, 49%);\n\t--ck-highlight-pen-green: hsl(112, 100%, 27%);\n}\n\n@define-mixin highlight-marker-color $color {\n\t.ck-content .marker-$color {\n\t\tbackground-color: var(--ck-highlight-marker-$color);\n\t}\n}\n\n@define-mixin highlight-pen-color $color {\n\t.ck-content .pen-$color {\n\t\tcolor: var(--ck-highlight-pen-$color);\n\n\t\t/* Override default yellow background of `` from user agent stylesheet */\n\t\tbackground-color: transparent;\n\t}\n}\n\n@mixin highlight-marker-color yellow;\n@mixin highlight-marker-color green;\n@mixin highlight-marker-color pink;\n@mixin highlight-marker-color blue;\n\n@mixin highlight-pen-color red;\n@mixin highlight-pen-color green;\n"],sourceRoot:""}]);const a=s},2536:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr{background:#dedede;border:0;height:4px;margin:15px 0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css"],names:[],mappings:"AAMA,yCAEC,iBACD,CAEA,eAGC,kBAA2B,CAC3B,QAAS,CAFT,UAAW,CADX,aAID",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n\n.ck-editor__editable .ck-horizontal-line {\n\t/* Necessary to render properly next to floated objects, e.g. side image case. */\n\tdisplay: flow-root;\n}\n\n.ck-content hr {\n\tmargin: 15px 0;\n\theight: 4px;\n\tbackground: hsl(0, 0%, 87%);\n\tborder: 0;\n}\n"],sourceRoot:""}]);const a=s},9048:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-content .image{clear:both;display:table;margin:.9em auto;min-width:50px;text-align:center}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.ck.ck-editor__editable .image-inline.ck-widget_selected,.ck.ck-editor__editable .image.ck-widget_selected{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/image.css"],names:[],mappings:"AAMC,mBAEC,UAAW,CADX,aAAc,CAOd,gBAAkB,CAGlB,cAAe,CARf,iBAuBD,CAbC,uBAEC,aAAc,CAGd,aAAc,CAGd,cAAe,CAGf,cACD,CAGD,0BAYC,sBAAuB,CANvB,mBAAoB,CAGpB,cAoBD,CAdC,kCACC,YACD,CAGA,gEAGC,WAAY,CACZ,aAAc,CAGd,cACD,CAUD,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAWA,2GACC,SAUD,CAHC,qEACC,YACD,CAOA,0FACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content {\n\t& .image {\n\t\tdisplay: table;\n\t\tclear: both;\n\t\ttext-align: center;\n\n\t\t/* Make sure there is some space between the content and the image. Center image by default. */\n\t\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\t \tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\t\tmargin: 0.9em auto;\n\n\t\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\n\t\tmin-width: 50px;\n\n\t\t& img {\n\t\t\t/* Prevent unnecessary margins caused by line-height (see #44). */\n\t\t\tdisplay: block;\n\n\t\t\t/* Center the image if its width is smaller than the content\'s width. */\n\t\t\tmargin: 0 auto;\n\n\t\t\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\n\t\t\tmax-width: 100%;\n\n\t\t\t/* Make sure the image is never smaller than the parent container (See: https://github.com/ckeditor/ckeditor5/issues/9300). */\n\t\t\tmin-width: 100%\n\t\t}\n\t}\n\n\t& .image-inline {\n\t\t/*\n\t\t * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).\n\t\t * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.\n\t\t * This strange behavior does not happen with inline-flex.\n\t\t */\n\t\tdisplay: inline-flex;\n\n\t\t/* While being resized, don\'t allow the image to exceed the width of the editing root. */\n\t\tmax-width: 100%;\n\n\t\t/* This is required by Safari to resize images in a sensible way. Without this, the browser breaks the ratio. */\n\t\talign-items: flex-start;\n\n\t\t/* When the picture is present it must act as a flex container to let the img resize properly */\n\t\t& picture {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t/* When the picture is present, it must act like a resizable img. */\n\t\t& picture,\n\t\t& img {\n\t\t\t/* This is necessary for the img to span the entire .image-inline wrapper and to resize properly. */\n\t\t\tflex-grow: 1;\n\t\t\tflex-shrink: 1;\n\n\t\t\t/* Prevents overflowing the editing root boundaries when an inline image is very wide. */\n\t\t\tmax-width: 100%;\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Inhertit the content styles padding of the
    in case the integration overrides `text-align: center`\n\t * of `.image` (e.g. to the left/right). This ensures the placeholder stays at the padding just like the native\n\t * caret does, and not at the edge of
    .\n\t */\n\t& .image > figcaption.ck-placeholder::before {\n\t\tpadding-left: inherit;\n\t\tpadding-right: inherit;\n\n\t\t/*\n\t\t * Make sure the image caption placeholder doesn\'t overflow the placeholder area.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\n\t\t */\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\n\t/*\n\t * Make sure the selected inline image always stays on top of its siblings.\n\t * See https://github.com/ckeditor/ckeditor5/issues/9108.\n\t */\n\t& .image.ck-widget_selected {\n\t\tz-index: 1;\n\t}\n\n\t& .image-inline.ck-widget_selected {\n\t\tz-index: 1;\n\n\t\t/*\n\t\t * Make sure the native browser selection style is not displayed.\n\t\t * Inline image widgets have their own styles for the selected state and\n\t\t * leaving this up to the browser is asking for a visual collision.\n\t\t */\n\t\t& ::selection {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* The inline image nested in the table should have its original size if not resized.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\n\t& td,\n\t& th {\n\t\t& .image-inline img {\n\t\t\tmax-width: none;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},1043:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-content .image.image_resized{box-sizing:border-box;display:block;max-width:100%}.ck-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageresize.css"],names:[],mappings:"AAKA,iCAQC,qBAAsB,CADtB,aAAc,CANd,cAkBD,CATC,qCAEC,UACD,CAEA,4CAEC,aACD,CAQC,sHACC,cACD,CAIF,oFACC,uCACD,CAEA,oFACC,sCACD,CAEA,oEACC,SACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .image.image_resized {\n\tmax-width: 100%;\n\t/*\n\tThe `
    ` element for resized images must not use `display:table` as browsers do not support `max-width` for it well.\n\tSee https://stackoverflow.com/questions/4019604/chrome-safari-ignoring-max-width-in-table/14420691#14420691 for more.\n\tFortunately, since we control the width, there is no risk that the image will look bad.\n\t*/\n\tdisplay: block;\n\tbox-sizing: border-box;\n\n\t& img {\n\t\t/* For resized images it is the `
    ` element that determines the image width. */\n\t\twidth: 100%;\n\t}\n\n\t& > figcaption {\n\t\t/* The `
    ` element uses `display:block`, so `
    ` also has to. */\n\t\tdisplay: block;\n\t}\n}\n\n.ck.ck-editor__editable {\n\t/* The resized inline image nested in the table should respect its parent size.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\n\t& td,\n\t& th {\n\t\t& .image-inline.image_resized img {\n\t\t\tmax-width: 100%;\n\t\t}\n\t}\n}\n\n[dir="ltr"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\n\tmargin-right: var(--ck-spacing-standard);\n}\n\n[dir="rtl"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\n\tmargin-left: var(--ck-spacing-standard);\n}\n\n.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label {\n\twidth: 4em;\n}\n'],sourceRoot:""}]);const a=s},4622:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right{margin-left:auto;margin-right:0}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-bottom:var(--ck-inline-image-style-spacing);margin-top:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css"],names:[],mappings:"AAKA,MACC,8BAA+B,CAC/B,qEACD,CAMC,qFAEC,oDACD,CAIA,yEAEC,UACD,CAEA,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD,CAEA,2CAEC,gBAAiB,CADjB,cAED,CAEA,0CACC,aAAc,CACd,iBACD,CAGA,6GAGC,YACD,CAGC,mGAGC,kDAAmD,CADnD,+CAED,CAEA,iDACC,iDACD,CAEA,kDACC,gDACD,CAUC,0lBAGC,qDAKD,CAHC,8nBACC,YACD,CAKD,oVAGC,2DACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-image-style-spacing: 1.5em;\n\t--ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);\n}\n\n.ck-content {\n\t/* Provides a minimal side margin for the left and right aligned images, so that the user has a visual feedback\n\tconfirming successful application of the style if image width exceeds the editor's size.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9342 */\n\t& .image-style-block-align-left,\n\t& .image-style-block-align-right {\n\t\tmax-width: calc(100% - var(--ck-image-style-spacing));\n\t}\n\n\t/* Allows displaying multiple floating images in the same line.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9183#issuecomment-804988132 */\n\t& .image-style-align-left,\n\t& .image-style-align-right {\n\t\tclear: none;\n\t}\n\n\t& .image-style-side {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t\tmax-width: 50%;\n\t}\n\n\t& .image-style-align-left {\n\t\tfloat: left;\n\t\tmargin-right: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-align-center {\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\n\t& .image-style-align-right {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-block-align-right {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t& .image-style-block-align-left {\n\t\tmargin-left: 0;\n\t\tmargin-right: auto;\n\t}\n\n\t/* Simulates margin collapsing with the preceding paragraph, which does not work for the floating elements. */\n\t& p + .image-style-align-left,\n\t& p + .image-style-align-right,\n\t& p + .image-style-side {\n\t\tmargin-top: 0;\n\t}\n\n\t& .image-inline {\n\t\t&.image-style-align-left,\n\t\t&.image-style-align-right {\n\t\t\tmargin-top: var(--ck-inline-image-style-spacing);\n\t\t\tmargin-bottom: var(--ck-inline-image-style-spacing);\n\t\t}\n\n\t\t&.image-style-align-left {\n\t\t\tmargin-right: var(--ck-inline-image-style-spacing);\n\t\t}\n\n\t\t&.image-style-align-right {\n\t\t\tmargin-left: var(--ck-inline-image-style-spacing);\n\t\t}\n\t}\n}\n\n.ck.ck-splitbutton {\n\t/* The button should display as a regular drop-down if the action button\n\tis forced to fire the same action as the arrow button. */\n\t&.ck-splitbutton_flatten {\n\t\t&:hover,\n\t\t&.ck-splitbutton_open {\n\t\t\t& > .ck-splitbutton__action:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\n\t\t\t\tbackground-color: var(--ck-color-button-on-background);\n\n\t\t\t\t&::after {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.ck-splitbutton_open:hover {\n\t\t\t& > .ck-splitbutton__action:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\n\t\t\t\tbackground-color: var(--ck-color-button-on-hover-background);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},9899:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{animation-delay:0ms,3s;animation-duration:.5s,.5s;animation-fill-mode:forwards,forwards;animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{height:0;opacity:1;width:0}33%{height:0;width:.3em}to{height:.45em;opacity:1;width:.3em}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css"],names:[],mappings:"AAKA,+BAUC,iBAAkB,CATlB,aAAc,CACd,iBAAkB,CAOlB,sCAAwC,CADxC,oCAAsC,CAGtC,SAMD,CAJC,qCACC,UAAW,CACX,iBACD,CChBD,MACC,iCAA8C,CAC9C,+CAA4D,CAG5D,8BAA+B,CAC/B,gCAAiC,CACjC,4DACD,CAEA,+BAWC,sBAA4B,CAN5B,0BAAgC,CADhC,qCAAuC,CADvC,wEAA0E,CAD1E,uDAAwD,CAMxD,oDAAuD,CAWvD,oFAAuF,CAlBvF,SAAU,CAgBV,eAAgB,CAChB,mFA0BD,CAtBC,qCAgBC,mBAAsB,CADtB,sBAAyB,CAEzB,4BAA6B,CAH7B,4CAA6C,CAF7C,sFAAuF,CADvF,oFAAqF,CASrF,qBAAsB,CAdtB,QAAS,CAJT,QAAS,CAGT,SAAU,CADV,OAAQ,CAKR,mCAAoC,CACpC,yBAA0B,CAH1B,OAcD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GAGC,QAAS,CAFT,SAAU,CACV,OAED,CACA,IAEC,QAAS,CADT,UAED,CACA,GAGC,YAAc,CAFd,SAAU,CACV,UAED,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-image-upload-complete-icon {\n\tdisplay: block;\n\tposition: absolute;\n\n\t/*\n\t * Smaller images should have the icon closer to the border.\n\t * Match the icon position with the linked image indicator brought by the link image feature.\n\t */\n\ttop: min(var(--ck-spacing-medium), 6%);\n\tright: min(var(--ck-spacing-medium), 6%);\n\tborder-radius: 50%;\n\tz-index: 1;\n\n\t&::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t}\n}\n','/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\n\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\n\n\t/* Match the icon size with the linked image indicator brought by the link image feature. */\n\t--ck-image-upload-icon-size: 20;\n\t--ck-image-upload-icon-width: 2px;\n\t--ck-image-upload-icon-is-visible: clamp(0px, 100% - 50px, 1px);\n}\n\n.ck-image-upload-complete-icon {\n\topacity: 0;\n\tbackground: var(--ck-color-image-upload-icon-background);\n\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\n\tanimation-fill-mode: forwards, forwards;\n\tanimation-duration: 500ms, 500ms;\n\n\t/* To make animation scalable. */\n\tfont-size: calc(1px * var(--ck-image-upload-icon-size));\n\n\t/* Hide completed upload icon after 3 seconds. */\n\tanimation-delay: 0ms, 3000ms;\n\n\t/*\n\t * Use CSS math to simulate container queries.\n\t * https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\n\t */\n\toverflow: hidden;\n\twidth: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\n\theight: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\n\n\t/* This is check icon element made from border-width mixed with animations. */\n\t&::after {\n\t\t/* Because of border transformation we need to "hard code" left position. */\n\t\tleft: 25%;\n\n\t\ttop: 50%;\n\t\topacity: 0;\n\t\theight: 0;\n\t\twidth: 0;\n\n\t\ttransform: scaleX(-1) rotate(135deg);\n\t\ttransform-origin: left top;\n\t\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\t\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\n\t\tanimation-name: ck-upload-complete-icon-check;\n\t\tanimation-duration: 500ms;\n\t\tanimation-delay: 500ms;\n\t\tanimation-fill-mode: forwards;\n\n\t\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\n\t\tbox-sizing: border-box;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-show {\n\tfrom {\n\t\topacity: 0;\n\t}\n\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-hide {\n\tfrom {\n\t\topacity: 1;\n\t}\n\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-check {\n\t0% {\n\t\topacity: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\t33% {\n\t\twidth: 0.3em;\n\t\theight: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t\twidth: 0.3em;\n\t\theight: 0.45em;\n\t}\n}\n'],sourceRoot:""}]);const a=s},9825:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css"],names:[],mappings:"AAKA,kCAGC,kBAAmB,CADnB,YAAa,CAEb,sBAAuB,CAEvB,MAAO,CALP,iBAAkB,CAIlB,KAOD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCAAyC,CACzC,8CACD,CAEA,iCAGC,QAAS,CADT,UAgBD,CAbC,8CACC,sGACD,CAEA,qCAOC,4DACD,CAGD,kCAEC,WAAY,CADZ,UAWD,CARC,yCAMC,yDAA0D,CAH1D,iBAAkB,CAElB,kCAAmC,CADnC,8DAA+D,CAF/D,+CAAgD,CADhD,8CAMD,CAGD,wCACC,GACC,uBACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-upload-placeholder-loader {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttop: 0;\n\tleft: 0;\n\n\t&::before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\n\t--ck-upload-placeholder-loader-size: 32px;\n\t--ck-upload-placeholder-image-aspect-ratio: 2.8;\n}\n\n.ck .ck-image-upload-placeholder {\n\t/* We need to control the full width of the SVG gray background. */\n\twidth: 100%;\n\tmargin: 0;\n\n\t&.image-inline {\n\t\twidth: calc( 2 * var(--ck-upload-placeholder-loader-size) * var(--ck-upload-placeholder-image-aspect-ratio) );\n\t}\n\n\t& img {\n\t\t/*\n\t\t * This is an arbitrary aspect for a 1x1 px GIF to display to the user. Not too tall, not too short.\n\t\t * There's nothing special about this number except that it should make the image placeholder look like\n\t\t * a real image during this short period after the upload started and before the image was read from the\n\t\t * file system (and a rich preview was loaded).\n\t\t */\n\t\taspect-ratio: var(--ck-upload-placeholder-image-aspect-ratio);\n\t}\n}\n\n.ck .ck-upload-placeholder-loader {\n\twidth: 100%;\n\theight: 100%;\n\n\t&::before {\n\t\twidth: var(--ck-upload-placeholder-loader-size);\n\t\theight: var(--ck-upload-placeholder-loader-size);\n\t\tborder-radius: 50%;\n\t\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\n\t\tborder-right: 2px solid transparent;\n\t\tanimation: ck-upload-placeholder-loader 1s linear infinite;\n\t}\n}\n\n@keyframes ck-upload-placeholder-loader {\n\tto {\n\t\ttransform: rotate( 360deg );\n\t}\n}\n"],sourceRoot:""}]);const a=s},5870:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width .1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css"],names:[],mappings:"AAMC,qEAEC,iBACD,CAGA,uGAIC,MAAO,CAFP,iBAAkB,CAClB,KAED,CCRC,yFACC,oBACD,CAID,uGAIC,gDAAiD,CAFjD,UAAW,CAGX,oBAAuB,CAFvB,OAGD,CAGD,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& .image,\n\t& .image-inline {\n\t\tposition: relative;\n\t}\n\n\t/* Upload progress bar. */\n\t& .image .ck-progress-bar,\n\t& .image-inline .ck-progress-bar {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& .image,\n\t& .image-inline {\n\t\t/* Showing animation. */\n\t\t&.ck-appear {\n\t\t\tanimation: fadeIn 700ms;\n\t\t}\n\t}\n\n\t/* Upload progress bar. */\n\t& .image .ck-progress-bar,\n\t& .image-inline .ck-progress-bar {\n\t\theight: 2px;\n\t\twidth: 0;\n\t\tbackground: var(--ck-color-upload-bar-background);\n\t\ttransition: width 100ms;\n\t}\n}\n\n@keyframes fadeIn {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n"],sourceRoot:""}]);const a=s},6831:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-text-alternative-form {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},399:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{border-right:1px solid var(--ck-color-base-text);height:100%;margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/link.css"],names:[],mappings:"AAMA,sBACC,mDAMD,CAHC,wCACC,yFACD,CAOD,4BACC,8CACD,CAGA,sCAEC,gDAAiD,CADjD,WAAY,CAEZ,iBAAkB,CAClB,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Class added to span element surrounding currently selected link. */\n.ck .ck-link_selected {\n\tbackground: var(--ck-color-link-selected-background);\n\n\t/* Give linked inline images some outline to let the user know they are also part of the link. */\n\t& span.image-inline {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background);\n\t}\n}\n\n/*\n * Classes used by the "fake visual selection" displayed in the content when an input\n * in the link UI has focus (the browser does not render the native selection in this state).\n */\n.ck .ck-fake-link-selection {\n\tbackground: var(--ck-color-link-fake-selection);\n}\n\n/* A collapsed fake visual selection. */\n.ck .ck-fake-link-selection_collapsed {\n\theight: 100%;\n\tborder-right: 1px solid var(--ck-color-base-text);\n\tmargin-right: -1px;\n\toutline: solid 1px hsla(0, 0%, 100%, .5);\n}\n'],sourceRoot:""}]);const a=s},9465:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{color:var(--ck-color-link-default);cursor:pointer;max-width:var(--ck-input-width);min-width:3em;padding:0 var(--ck-spacing-medium);text-align:center;text-overflow:ellipsis}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{max-width:100%;min-width:0}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkactions.css"],names:[],mappings:"AAOA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,8CACC,oBAKD,CAHC,gEACC,eACD,CCXD,oCDCD,oBAcE,cAUF,CARE,8CACC,eACD,CAEA,8DACC,cACD,CCrBD,CCKA,wDACC,cAAe,CACf,eAmCD,CAjCC,0EAEC,kCAAmC,CAEnC,cAAe,CAIf,+BAAgC,CAChC,aAAc,CARd,kCAAmC,CASnC,iBAAkB,CAPlB,sBAYD,CAHC,gFACC,yBACD,CAGD,mPAIC,eACD,CAEA,+DACC,eACD,CAGC,gFACC,yBACD,CAWD,qHACC,sCACD,CDvDD,oCC2DC,wDACC,8DAMD,CAJC,0EAEC,cAAe,CADf,WAED,CAGD,gJAME,aAEF,CD1ED",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-link-actions__preview {\n\t\tdisplay: inline-block;\n\n\t\t& .ck-button__label {\n\t\t\toverflow: hidden;\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-link-actions__preview {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\t& .ck-button.ck-link-actions__preview {\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\n\t\t& .ck-button__label {\n\t\t\tpadding: 0 var(--ck-spacing-medium);\n\t\t\tcolor: var(--ck-color-link-default);\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: pointer;\n\n\t\t\t/* Match the box model of the link editor form\'s input so the balloon\n\t\t\tdoes not change width when moving between actions and the form. */\n\t\t\tmax-width: var(--ck-input-width);\n\t\t\tmin-width: 3em;\n\t\t\ttext-align: center;\n\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t&,\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tbackground: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&:focus {\n\t\t\t& .ck-button__label {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-button:not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\t& .ck-button.ck-link-actions__preview {\n\t\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-standard) 0;\n\n\t\t\t& .ck-button__label {\n\t\t\t\tmin-width: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},4827:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{min-width:var(--ck-input-width);padding:0}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical .ck-button{border:0;border-radius:0;border-top:1px solid var(--ck-color-base-border);margin:0;padding:var(--ck-spacing-standard);width:50%}[dir=ltr] .ck.ck-link-form_layout-vertical .ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{border:0;padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkform.css"],names:[],mappings:"AAOA,iBACC,YAiBD,CAfC,2BACC,YACD,CCNA,oCDCD,iBAQE,cAUF,CARE,wCACC,eACD,CAEA,4BACC,cACD,CCfD,CDuBD,iCACC,aAYD,CALE,wHAEC,mCACD,CE/BF,iCAEC,+BAAgC,CADhC,SA+CD,CA5CC,wDACC,8EAMD,CAJC,uEACC,WAAY,CACZ,UACD,CAGD,4CAIC,QAAS,CADT,eAAgB,CAEhB,gDAAiD,CAHjD,QAAS,CADT,kCAAmC,CAKnC,SAaD,CAnBA,4GAaE,aAMF,CAJE,mEACC,kDACD,CAKF,6CACC,yDAWD,CATC,wEACC,QAAS,CACT,SAAU,CACV,UAKD,CAHC,8EACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-form {\n\tdisplay: flex;\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tdisplay: block;\n\n\t/*\n\t * Whether the form is in the responsive mode or not, if there are decorator buttons\n\t * keep the top margin of action buttons medium.\n\t */\n\t& .ck-button {\n\t\t&.ck-button-save,\n\t\t&.ck-button-cancel {\n\t\t\tmargin-top: var(--ck-spacing-medium);\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tpadding: 0;\n\tmin-width: var(--ck-input-width);\n\n\t& .ck-labeled-field-view {\n\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small);\n\n\t\t& .ck-input-text {\n\t\t\tmin-width: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t& .ck-button {\n\t\tpadding: var(--ck-spacing-standard);\n\t\tmargin: 0;\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\twidth: 50%;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: 0;\n\n\t\t\t&:last-of-type {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Using additional `.ck` class for stronger CSS specificity than `.ck.ck-link-form > :not(:first-child)`. */\n\t& .ck.ck-list {\n\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\n\n\t\t& .ck-button.ck-switchbutton {\n\t\t\tborder: 0;\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\n\t\t\t&:hover {\n\t\t\t\tbackground: none;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},3858:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{display:block;position:absolute}:root{--ck-link-image-indicator-icon-size:20;--ck-link-image-indicator-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{background-color:rgba(0,0,0,.4);background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+");background-position:50%;background-repeat:no-repeat;background-size:14px;border-radius:100%;content:"";height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));overflow:hidden;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkimage.css"],names:[],mappings:"AASE,+FACC,aAAc,CACd,iBACD,CCPF,MAEC,sCAAuC,CACvC,oEACD,CAME,+FAUC,+BAAqC,CACrC,83BAA+3B,CAG/3B,uBAA2B,CAD3B,2BAA4B,CAD5B,oBAAqB,CAGrB,kBAAmB,CAdnB,UAAW,CAsBX,oGAAuG,CAFvG,eAAgB,CAbhB,sCAAwC,CADxC,oCAAsC,CAetC,mGAED",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/* Linked image indicator */\n\t& figure.image > a,\n\t& a span.image-inline {\n\t\t&::after {\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t}\n\t}\n}\n\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Match the icon size with the upload indicator brought by the image upload feature. */\n\t--ck-link-image-indicator-icon-size: 20;\n\t--ck-link-image-indicator-icon-is-visible: clamp(0px, 100% - 50px, 1px);\n}\n\n.ck.ck-editor__editable {\n\t/* Linked image indicator */\n\t& figure.image > a,\n\t& a span.image-inline {\n\t\t&::after {\n\t\t\tcontent: "";\n\n\t\t\t/*\n\t\t\t * Smaller images should have the icon closer to the border.\n\t\t\t * Match the icon position with the upload indicator brought by the image upload feature.\n\t\t\t */\n\t\t\ttop: min(var(--ck-spacing-medium), 6%);\n\t\t\tright: min(var(--ck-spacing-medium), 6%);\n\n\t\t\tbackground-color: hsla(0, 0%, 0%, .4);\n\t\t\tbackground-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+");\n\t\t\tbackground-size: 14px;\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tborder-radius: 100%;\n\n\t\t\t/*\n\t\t\t* Use CSS math to simulate container queries.\n\t\t\t* https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\n\t\t\t*/\n\t\t\toverflow: hidden;\n\t\t\twidth: calc(var(--ck-link-image-indicator-icon-is-visible) * var(--ck-link-image-indicator-icon-size));\n\t\t\theight: calc(var(--ck-link-image-indicator-icon-is-visible) * var(--ck-link-image-indicator-icon-size));\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]);const a=s},3195:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-collapsible.ck-collapsible_collapsed>.ck-collapsible__children{display:none}:root{--ck-collapsible-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-collapsible>.ck.ck-button{border-radius:0;font-weight:700;padding:var(--ck-spacing-medium) var(--ck-spacing-large);width:100%}.ck.ck-collapsible>.ck.ck-button:focus{background:transparent}.ck.ck-collapsible>.ck.ck-button:active,.ck.ck-collapsible>.ck.ck-button:hover:not(:focus),.ck.ck-collapsible>.ck.ck-button:not(:focus){background:transparent;border-color:transparent;box-shadow:none}.ck.ck-collapsible>.ck.ck-button>.ck-icon{margin-right:var(--ck-spacing-medium);width:var(--ck-collapsible-arrow-size)}.ck.ck-collapsible>.ck-collapsible__children{padding:0 var(--ck-spacing-large) var(--ck-spacing-large)}.ck.ck-collapsible.ck-collapsible_collapsed>.ck.ck-button .ck-icon{transform:rotate(-90deg)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-list/theme/collapsible.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-list/collapsible.css"],names:[],mappings:"AAMC,sEACC,YACD,CCHD,MACC,yDACD,CAGC,iCAIC,eAAgB,CAFhB,eAAiB,CACjB,wDAAyD,CAFzD,UAmBD,CAdC,uCACC,sBACD,CAEA,wIACC,sBAAuB,CACvB,wBAAyB,CACzB,eACD,CAEA,0CACC,qCAAsC,CACtC,sCACD,CAGD,6CACC,yDACD,CAGC,mEACC,wBACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-collapsible.ck-collapsible_collapsed {\n\t& > .ck-collapsible__children {\n\t\tdisplay: none;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-collapsible-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-collapsible {\n\t& > .ck.ck-button {\n\t\twidth: 100%;\n\t\tfont-weight: bold;\n\t\tpadding: var(--ck-spacing-medium) var(--ck-spacing-large);\n\t\tborder-radius: 0;\n\n\t\t&:focus {\n\t\t\tbackground: transparent;\n\t\t}\n\n\t\t&:active, &:not(:focus), &:hover:not(:focus) {\n\t\t\tbackground: transparent;\n\t\t\tborder-color: transparent;\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t& > .ck-icon {\n\t\t\tmargin-right: var(--ck-spacing-medium);\n\t\t\twidth: var(--ck-collapsible-arrow-size);\n\t\t}\n\t}\n\n\t& > .ck-collapsible__children {\n\t\tpadding: 0 var(--ck-spacing-large) var(--ck-spacing-large);\n\t}\n\n\t&.ck-collapsible_collapsed {\n\t\t& > .ck.ck-button .ck-icon {\n\t\t\ttransform: rotate(-90deg);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},7133:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-list-properties.ck-list-properties_without-styles{padding:var(--ck-spacing-large)}.ck.ck-list-properties.ck-list-properties_without-styles>*{min-width:14em}.ck.ck-list-properties.ck-list-properties_without-styles>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-list-styles-list{grid-template-columns:repeat(4,auto)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible{border-top:1px solid var(--ck-color-base-border)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*{width:100%}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties .ck.ck-numbered-list-properties__start-index .ck-input{min-width:auto;width:100%}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order{background:transparent;margin-bottom:calc(var(--ck-spacing-tiny)*-1);padding-left:0;padding-right:0}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:active,.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:hover{background:none;border-color:transparent;box-shadow:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-list/listproperties.css"],names:[],mappings:"AAOC,yDACC,+BASD,CAPC,2DACC,cAKD,CAHC,6DACC,qCACD,CASD,wFACC,oCACD,CAGA,mFACC,gDAWD,CARE,+GACC,UAKD,CAHC,iHACC,qCACD,CAMJ,8EACC,cAAe,CACf,UACD,CAEA,uEACC,sBAAuB,CAGvB,6CAAgD,CAFhD,cAAe,CACf,eAQD,CALC,2JAGC,eAAgB,CADhB,wBAAyB,CADzB,eAGD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-list-properties {\n\t/* When there are no list styles and there is no collapsible. */\n\t&.ck-list-properties_without-styles {\n\t\tpadding: var(--ck-spacing-large);\n\n\t\t& > * {\n\t\t\tmin-width: 14em;\n\n\t\t\t& + * {\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * When the numbered list property fields (start at, reversed) should be displayed,\n\t * more horizontal space is needed. Reconfigure the style grid to create that space.\n\t */\n\t&.ck-list-properties_with-numbered-properties {\n\t\t& > .ck-list-styles-list {\n\t\t\tgrid-template-columns: repeat( 4, auto );\n\t\t}\n\n\t\t/* When list styles are rendered and property fields are in a collapsible. */\n\t\t& > .ck-collapsible {\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\n\t\t\t& > .ck-collapsible__children {\n\t\t\t\t& > * {\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t& + * {\n\t\t\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-numbered-list-properties__start-index .ck-input {\n\t\tmin-width: auto;\n\t\twidth: 100%;\n\t}\n\n\t& .ck.ck-numbered-list-properties__reversed-order {\n\t\tbackground: transparent;\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\t\tmargin-bottom: calc(-1 * var(--ck-spacing-tiny));\n\n\t\t&:active, &:hover {\n\t\t\tbox-shadow: none;\n\t\t\tborder-color: transparent;\n\t\t\tbackground: none;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},4553:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-list-styles-list{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-list{column-gap:var(--ck-spacing-medium);grid-template-columns:repeat(3,auto);padding:var(--ck-spacing-large);row-gap:var(--ck-spacing-medium)}.ck.ck-list-styles-list .ck-button{box-sizing:content-box;margin:0;padding:0}.ck.ck-list-styles-list .ck-button,.ck.ck-list-styles-list .ck-button .ck-icon{height:var(--ck-list-style-button-size);width:var(--ck-list-style-button-size)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-list/theme/liststyles.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-list/liststyles.css"],names:[],mappings:"AAKA,wBACC,YACD,CCFA,MACC,gCACD,CAEA,wBAGC,mCAAoC,CAFpC,oCAAwC,CAGxC,+BAAgC,CAFhC,gCA4BD,CAxBC,mCAiBC,sBAAuB,CAPvB,QAAS,CANT,SAmBD,CAJC,+EAhBA,uCAAwC,CADxC,sCAoBA",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-list-styles-list {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-list-style-button-size: 44px;\n}\n\n.ck.ck-list-styles-list {\n\tgrid-template-columns: repeat( 3, auto );\n\trow-gap: var(--ck-spacing-medium);\n\tcolumn-gap: var(--ck-spacing-medium);\n\tpadding: var(--ck-spacing-large);\n\n\t& .ck-button {\n\t\t/* Make the button look like a thumbnail (the icon "takes it all"). */\n\t\twidth: var(--ck-list-style-button-size);\n\t\theight: var(--ck-list-style-button-size);\n\t\tpadding: 0;\n\n\t\t/*\n\t\t * Buttons are aligned by the grid so disable default button margins to not collide with the\n\t\t * gaps in the grid.\n\t\t */\n\t\tmargin: 0;\n\n\t\t/*\n\t\t * Make sure the button border (which is displayed on focus, BTW) does not steal pixels\n\t\t * from the button dimensions and, as a result, decrease the size of the icon\n\t\t * (which becomes blurry as it scales down).\n\t\t */\n\t\tbox-sizing: content-box;\n\n\t\t& .ck-icon {\n\t\t\twidth: var(--ck-list-style-button-size);\n\t\t\theight: var(--ck-list-style-button-size);\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},5777:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-content .media{clear:both;display:block;margin:.9em 0;min-width:15em}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css"],names:[],mappings:"AAKA,mBAGC,UAAW,CASX,aAAc,CAJd,aAAe,CAQf,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .media {\n\t/* Don\'t allow floated content overlap the media.\n\thttps://github.com/ckeditor/ckeditor5-media-embed/issues/53 */\n\tclear: both;\n\n\t/* Make sure there is some space between the content and the media. */\n\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\tmargin: 0.9em 0;\n\n\t/* Make sure media is not overriden with Bootstrap default `flex` value.\n\tSee: https://github.com/ckeditor/ckeditor5/issues/1373. */\n\tdisplay: block;\n\n\t/* Give the media some minimal width in the content to prevent them\n\tfrom being "squashed" in tight spaces, e.g. in table cells (#44) */\n\tmin-width: 15em;\n}\n'],sourceRoot:""}]);const a=s},952:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck-media__wrapper .ck-media__placeholder{align-items:center;display:flex;flex-direction:column}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-tooltip{display:block}@media (hover:none){.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-tooltip{display:none}}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url{max-width:100%;position:relative}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url:hover .ck-tooltip{opacity:1;visibility:visible}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-media__placeholder__url__text{display:block;overflow:hidden}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck-media__placeholder__icon *{display:none}.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper>:not(.ck-media__placeholder),.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder{pointer-events:none}:root{--ck-media-embed-placeholder-icon-size:3em;--ck-color-media-embed-placeholder-url-text:#757575;--ck-color-media-embed-placeholder-url-text-hover:var(--ck-color-base-text)}.ck-media__wrapper{margin:0 auto}.ck-media__wrapper .ck-media__placeholder{background:var(--ck-color-base-foreground);padding:calc(var(--ck-spacing-standard)*3)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon{background-position:50%;background-size:cover;height:var(--ck-media-embed-placeholder-icon-size);margin-bottom:var(--ck-spacing-large);min-width:var(--ck-media-embed-placeholder-icon-size)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon .ck-icon{height:100%;width:100%}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text{color:var(--ck-color-media-embed-placeholder-url-text);font-style:italic;text-align:center;text-overflow:ellipsis;white-space:nowrap}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:var(--ck-color-media-embed-placeholder-url-text-hover);cursor:pointer;text-decoration:underline}.ck-media__wrapper[data-oembed-url*="open.spotify.com"]{max-height:380px;max-width:300px}.ck-media__wrapper[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Im0yMDYuNDc3IDI2MC45LTI4Ljk4NyAyOC45ODdhNS4yMTggNS4yMTggMCAwIDAgMy43OCAxLjYxaDQ5LjYyMWMxLjY5NCAwIDMuMTktLjc5OCA0LjE0Ni0yLjAzN3oiIGZpbGw9IiM1Yzg4YzUiLz48cGF0aCBkPSJNMjI2Ljc0MiAyMjIuOTg4Yy05LjI2NiAwLTE2Ljc3NyA3LjE3LTE2Ljc3NyAxNi4wMTQuMDA3IDIuNzYyLjY2MyA1LjQ3NCAyLjA5MyA3Ljg3NS40My43MDMuODMgMS40MDggMS4xOSAyLjEwNy4zMzMuNTAyLjY1IDEuMDA1Ljk1IDEuNTA4LjM0My40NzcuNjczLjk1Ny45ODggMS40NCAxLjMxIDEuNzY5IDIuNSAzLjUwMiAzLjYzNyA1LjE2OC43OTMgMS4yNzUgMS42ODMgMi42NCAyLjQ2NiAzLjk5IDIuMzYzIDQuMDk0IDQuMDA3IDguMDkyIDQuNiAxMy45MTR2LjAxMmMuMTgyLjQxMi41MTYuNjY2Ljg3OS42NjcuNDAzLS4wMDEuNzY4LS4zMTQuOTMtLjc5OS42MDMtNS43NTYgMi4yMzgtOS43MjkgNC41ODUtMTMuNzk0Ljc4Mi0xLjM1IDEuNjczLTIuNzE1IDIuNDY1LTMuOTkgMS4xMzctMS42NjYgMi4zMjgtMy40IDMuNjM4LTUuMTY5LjMxNS0uNDgyLjY0NS0uOTYyLjk4OC0xLjQzOS4zLS41MDMuNjE3LTEuMDA2Ljk1LTEuNTA4LjM1OS0uNy43Ni0xLjQwNCAxLjE5LTIuMTA3IDEuNDI2LTIuNDAyIDItNS4xMTQgMi4wMDQtNy44NzUgMC04Ljg0NC03LjUxMS0xNi4wMTQtMTYuNzc2LTE2LjAxNHoiIGZpbGw9IiNkZDRiM2UiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PGVsbGlwc2Ugcnk9IjUuNTY0IiByeD0iNS44MjgiIGN5PSIyMzkuMDAyIiBjeD0iMjI2Ljc0MiIgZmlsbD0iIzgwMmQyNyIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMTkwLjMwMSAyMzcuMjgzYy00LjY3IDAtOC40NTcgMy44NTMtOC40NTcgOC42MDZzMy43ODYgOC42MDcgOC40NTcgOC42MDdjMy4wNDMgMCA0LjgwNi0uOTU4IDYuMzM3LTIuNTE2IDEuNTMtMS41NTcgMi4wODctMy45MTMgMi4wODctNi4yOSAwLS4zNjItLjAyMy0uNzIyLS4wNjQtMS4wNzloLTguMjU3djMuMDQzaDQuODVjLS4xOTcuNzU5LS41MzEgMS40NS0xLjA1OCAxLjk4Ni0uOTQyLjk1OC0yLjAyOCAxLjU0OC0zLjkwMSAxLjU0OC0yLjg3NiAwLTUuMjA4LTIuMzcyLTUuMjA4LTUuMjk5IDAtMi45MjYgMi4zMzItNS4yOTkgNS4yMDgtNS4yOTkgMS4zOTkgMCAyLjYxOC40MDcgMy41ODQgMS4yOTNsMi4zODEtMi4zOGMwLS4wMDItLjAwMy0uMDA0LS4wMDQtLjAwNS0xLjU4OC0xLjUyNC0zLjYyLTIuMjE1LTUuOTU1LTIuMjE1em00LjQzIDUuNjYuMDAzLjAwNnYtLjAwM3oiIGZpbGw9IiNmZmYiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0ibTIxNS4xODQgMjUxLjkyOS03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVhNS4yMzMgNS4yMzMgMCAwIDAgLjQ0OS0yLjEyM3YtMzEuMTY1Yy0uNDY5LjY3NS0uOTM0IDEuMzQ5LTEuMzgyIDIuMDA1LS43OTIgMS4yNzUtMS42ODIgMi42NC0yLjQ2NSAzLjk5LTIuMzQ3IDQuMDY1LTMuOTgyIDguMDM4LTQuNTg1IDEzLjc5NC0uMTYyLjQ4NS0uNTI3Ljc5OC0uOTMuNzk5LS4zNjMtLjAwMS0uNjk3LS4yNTUtLjg3OS0uNjY3di0uMDEyYy0uNTkzLTUuODIyLTIuMjM3LTkuODItNC42LTEzLjkxNC0uNzgzLTEuMzUtMS42NzMtMi43MTUtMi40NjYtMy45OS0xLjEzNy0xLjY2Ni0yLjMyNy0zLjQtMy42MzctNS4xNjlsLS4wMDItLjAwM3oiIGZpbGw9IiNjM2MzYzMiLz48cGF0aCBkPSJtMjEyLjk4MyAyNDguNDk1LTM2Ljk1MiAzNi45NTN2LjgxMmE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOCA1LjIzOGgxLjAxNWwzNS42NjYtMzUuNjY2YTEzNi4yNzUgMTM2LjI3NSAwIDAgMC0yLjc2NC0zLjkgMzcuNTc1IDM3LjU3NSAwIDAgMC0uOTg5LTEuNDQgMzUuMTI3IDM1LjEyNyAwIDAgMC0uOTUtMS41MDhjLS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJtMjExLjk5OCAyNjEuMDgzLTYuMTUyIDYuMTUxIDI0LjI2NCAyNC4yNjRoLjc4MWE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOS01LjIzOHYtMS4wNDV6IiBmaWxsPSIjZmZmIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjwvZz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder{background:#4268b3}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NjcuNDg0IDBINTYuNTE3QzI1LjMwNCAwIDAgMjUuMzA0IDAgNTYuNTE3djkxMC45NjZDMCA5OTguNjk0IDI1LjI5NyAxMDI0IDU2LjUyMiAxMDI0SDU0N1Y2MjhINDE0VjQ3M2gxMzNWMzU5LjAyOWMwLTEzMi4yNjIgODAuNzczLTIwNC4yODIgMTk4Ljc1Ni0yMDQuMjgyIDU2LjUxMyAwIDEwNS4wODYgNC4yMDggMTE5LjI0NCA2LjA4OVYyOTlsLTgxLjYxNi4wMzdjLTYzLjk5MyAwLTc2LjM4NCAzMC40OTItNzYuMzg0IDc1LjIzNlY0NzNoMTUzLjQ4N2wtMTkuOTg2IDE1NUg3MDd2Mzk2aDI2MC40ODRjMzEuMjEzIDAgNTYuNTE2LTI1LjMwMyA1Ni41MTYtNTYuNTE2VjU2LjUxNUMxMDI0IDI1LjMwMyA5OTguNjk3IDAgOTY3LjQ4NCAwIiBmaWxsPSIjRkZGRkZFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#cdf}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder{background:linear-gradient(-135deg,#1400c7,#b800b1,#f50000)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTA0IiBoZWlnaHQ9IjUwNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIC4xNTloNTAzLjg0MVY1MDMuOTRIMHoiLz48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48cGF0aCBkPSJNMjUxLjkyMS4xNTljLTY4LjQxOCAwLTc2Ljk5Ny4yOS0xMDMuODY3IDEuNTE2LTI2LjgxNCAxLjIyMy00NS4xMjcgNS40ODItNjEuMTUxIDExLjcxLTE2LjU2NiA2LjQzNy0zMC42MTUgMTUuMDUxLTQ0LjYyMSAyOS4wNTYtMTQuMDA1IDE0LjAwNi0yMi42MTkgMjguMDU1LTI5LjA1NiA0NC42MjEtNi4yMjggMTYuMDI0LTEwLjQ4NyAzNC4zMzctMTEuNzEgNjEuMTUxQy4yOSAxNzUuMDgzIDAgMTgzLjY2MiAwIDI1Mi4wOGMwIDY4LjQxNy4yOSA3Ni45OTYgMS41MTYgMTAzLjg2NiAxLjIyMyAyNi44MTQgNS40ODIgNDUuMTI3IDExLjcxIDYxLjE1MSA2LjQzNyAxNi41NjYgMTUuMDUxIDMwLjYxNSAyOS4wNTYgNDQuNjIxIDE0LjAwNiAxNC4wMDUgMjguMDU1IDIyLjYxOSA0NC42MjEgMjkuMDU3IDE2LjAyNCA2LjIyNyAzNC4zMzcgMTAuNDg2IDYxLjE1MSAxMS43MDkgMjYuODcgMS4yMjYgMzUuNDQ5IDEuNTE2IDEwMy44NjcgMS41MTYgNjguNDE3IDAgNzYuOTk2LS4yOSAxMDMuODY2LTEuNTE2IDI2LjgxNC0xLjIyMyA0NS4xMjctNS40ODIgNjEuMTUxLTExLjcwOSAxNi41NjYtNi40MzggMzAuNjE1LTE1LjA1MiA0NC42MjEtMjkuMDU3IDE0LjAwNS0xNC4wMDYgMjIuNjE5LTI4LjA1NSAyOS4wNTctNDQuNjIxIDYuMjI3LTE2LjAyNCAxMC40ODYtMzQuMzM3IDExLjcwOS02MS4xNTEgMS4yMjYtMjYuODcgMS41MTYtMzUuNDQ5IDEuNTE2LTEwMy44NjYgMC02OC40MTgtLjI5LTc2Ljk5Ny0xLjUxNi0xMDMuODY3LTEuMjIzLTI2LjgxNC01LjQ4Mi00NS4xMjctMTEuNzA5LTYxLjE1MS02LjQzOC0xNi41NjYtMTUuMDUyLTMwLjYxNS0yOS4wNTctNDQuNjIxLTE0LjAwNi0xNC4wMDUtMjguMDU1LTIyLjYxOS00NC42MjEtMjkuMDU2LTE2LjAyNC02LjIyOC0zNC4zMzctMTAuNDg3LTYxLjE1MS0xMS43MUMzMjguOTE3LjQ0OSAzMjAuMzM4LjE1OSAyNTEuOTIxLjE1OVptMCA0NS4zOTFjNjcuMjY1IDAgNzUuMjMzLjI1NyAxMDEuNzk3IDEuNDY5IDI0LjU2MiAxLjEyIDM3LjkwMSA1LjIyNCA0Ni43NzggOC42NzQgMTEuNzU5IDQuNTcgMjAuMTUxIDEwLjAyOSAyOC45NjYgMTguODQ1IDguODE2IDguODE1IDE0LjI3NSAxNy4yMDcgMTguODQ1IDI4Ljk2NiAzLjQ1IDguODc3IDcuNTU0IDIyLjIxNiA4LjY3NCA0Ni43NzggMS4yMTIgMjYuNTY0IDEuNDY5IDM0LjUzMiAxLjQ2OSAxMDEuNzk4IDAgNjcuMjY1LS4yNTcgNzUuMjMzLTEuNDY5IDEwMS43OTctMS4xMiAyNC41NjItNS4yMjQgMzcuOTAxLTguNjc0IDQ2Ljc3OC00LjU3IDExLjc1OS0xMC4wMjkgMjAuMTUxLTE4Ljg0NSAyOC45NjYtOC44MTUgOC44MTYtMTcuMjA3IDE0LjI3NS0yOC45NjYgMTguODQ1LTguODc3IDMuNDUtMjIuMjE2IDcuNTU0LTQ2Ljc3OCA4LjY3NC0yNi41NiAxLjIxMi0zNC41MjcgMS40NjktMTAxLjc5NyAxLjQ2OS02Ny4yNzEgMC03NS4yMzctLjI1Ny0xMDEuNzk4LTEuNDY5LTI0LjU2Mi0xLjEyLTM3LjkwMS01LjIyNC00Ni43NzgtOC42NzQtMTEuNzU5LTQuNTctMjAuMTUxLTEwLjAyOS0yOC45NjYtMTguODQ1LTguODE1LTguODE1LTE0LjI3NS0xNy4yMDctMTguODQ1LTI4Ljk2Ni0zLjQ1LTguODc3LTcuNTU0LTIyLjIxNi04LjY3NC00Ni43NzgtMS4yMTItMjYuNTY0LTEuNDY5LTM0LjUzMi0xLjQ2OS0xMDEuNzk3IDAtNjcuMjY2LjI1Ny03NS4yMzQgMS40NjktMTAxLjc5OCAxLjEyLTI0LjU2MiA1LjIyNC0zNy45MDEgOC42NzQtNDYuNzc4IDQuNTctMTEuNzU5IDEwLjAyOS0yMC4xNTEgMTguODQ1LTI4Ljk2NiA4LjgxNS04LjgxNiAxNy4yMDctMTQuMjc1IDI4Ljk2Ni0xOC44NDUgOC44NzctMy40NSAyMi4yMTYtNy41NTQgNDYuNzc4LTguNjc0IDI2LjU2NC0xLjIxMiAzNC41MzItMS40NjkgMTAxLjc5OC0xLjQ2OVoiIGZpbGw9IiNGRkYiIG1hc2s9InVybCgjYikiLz48cGF0aCBkPSJNMjUxLjkyMSAzMzYuMDUzYy00Ni4zNzggMC04My45NzQtMzcuNTk2LTgzLjk3NC04My45NzMgMC00Ni4zNzggMzcuNTk2LTgzLjk3NCA4My45NzQtODMuOTc0IDQ2LjM3NyAwIDgzLjk3MyAzNy41OTYgODMuOTczIDgzLjk3NCAwIDQ2LjM3Ny0zNy41OTYgODMuOTczLTgzLjk3MyA4My45NzNabTAtMjEzLjMzOGMtNzEuNDQ3IDAtMTI5LjM2NSA1Ny45MTgtMTI5LjM2NSAxMjkuMzY1IDAgNzEuNDQ2IDU3LjkxOCAxMjkuMzY0IDEyOS4zNjUgMTI5LjM2NCA3MS40NDYgMCAxMjkuMzY0LTU3LjkxOCAxMjkuMzY0LTEyOS4zNjQgMC03MS40NDctNTcuOTE4LTEyOS4zNjUtMTI5LjM2NC0xMjkuMzY1Wk00MTYuNjI3IDExNy42MDRjMCAxNi42OTYtMTMuNTM1IDMwLjIzLTMwLjIzMSAzMC4yMy0xNi42OTUgMC0zMC4yMy0xMy41MzQtMzAuMjMtMzAuMjMgMC0xNi42OTYgMTMuNTM1LTMwLjIzMSAzMC4yMy0zMC4yMzEgMTYuNjk2IDAgMzAuMjMxIDEzLjUzNSAzMC4yMzEgMzAuMjMxIiBmaWxsPSIjRkZGIi8+PC9nPjwvc3ZnPg==)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#ffe0fe}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder{background:linear-gradient(90deg,#71c6f4,#0d70a5)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MDAgNDAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNNDAwIDIwMGMwIDExMC41LTg5LjUgMjAwLTIwMCAyMDBTMCAzMTAuNSAwIDIwMCA4OS41IDAgMjAwIDBzMjAwIDg5LjUgMjAwIDIwMHpNMTYzLjQgMzA1LjVjODguNyAwIDEzNy4yLTczLjUgMTM3LjItMTM3LjIgMC0yLjEgMC00LjItLjEtNi4yIDkuNC02LjggMTcuNi0xNS4zIDI0LjEtMjUtOC42IDMuOC0xNy45IDYuNC0yNy43IDcuNiAxMC02IDE3LjYtMTUuNCAyMS4yLTI2LjctOS4zIDUuNS0xOS42IDkuNS0zMC42IDExLjctOC44LTkuNC0yMS4zLTE1LjItMzUuMi0xNS4yLTI2LjYgMC00OC4yIDIxLjYtNDguMiA0OC4yIDAgMy44LjQgNy41IDEuMyAxMS00MC4xLTItNzUuNi0yMS4yLTk5LjQtNTAuNC00LjEgNy4xLTYuNSAxNS40LTYuNSAyNC4yIDAgMTYuNyA4LjUgMzEuNSAyMS41IDQwLjEtNy45LS4yLTE1LjMtMi40LTIxLjgtNnYuNmMwIDIzLjQgMTYuNiA0Mi44IDM4LjcgNDcuMy00IDEuMS04LjMgMS43LTEyLjcgMS43LTMuMSAwLTYuMS0uMy05LjEtLjkgNi4xIDE5LjIgMjMuOSAzMy4xIDQ1IDMzLjUtMTYuNSAxMi45LTM3LjMgMjAuNi01OS45IDIwLjYtMy45IDAtNy43LS4yLTExLjUtLjcgMjEuMSAxMy44IDQ2LjUgMjEuOCA3My43IDIxLjgiIHN0eWxlPSJmaWxsOiNmZmYiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text{color:#b8e6ff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-media-embed/mediaembedediting.css"],names:[],mappings:"AAQC,0CAGC,kBAAmB,CAFnB,YAAa,CACb,qBAoBD,CCpBA,kFACC,aAqBD,CAHC,oBAnBD,kFAoBE,YAEF,CADC,CDlBA,sEAIC,cAAe,CAEf,iBAUD,CCoBD,wFAEC,SAAU,CADV,kBAED,CD3BE,wGAEC,aAAc,CADd,eAED,CAWD,6kBACC,YACD,CAYF,2LACC,mBACD,CElDA,MACC,0CAA2C,CAE3C,mDAA4D,CAC5D,2EACD,CAEA,mBACC,aA+FD,CA7FC,0CAEC,0CAA2C,CAD3C,0CA6BD,CA1BC,uEAIC,uBAA2B,CAC3B,qBAAsB,CAHtB,kDAAmD,CACnD,qCAAsC,CAFtC,qDAUD,CAJC,gFAEC,WAAY,CADZ,UAED,CAGD,4EACC,sDAAuD,CAGvD,iBAAkB,CADlB,iBAAkB,CAElB,sBAAuB,CAHvB,kBAUD,CALC,kFACC,4DAA6D,CAC7D,cAAe,CACf,yBACD,CAIF,wDAEC,gBAAiB,CADjB,eAED,CAEA,4UAIC,wvGACD,CAEA,2EACC,kBAaD,CAXC,wGACC,orBACD,CAEA,6GACC,UAKD,CAHC,mHACC,UACD,CAIF,4EACC,2DAcD,CAZC,yGACC,4jHACD,CAGA,8GACC,aAKD,CAHC,oHACC,UACD,CAIF,6EAEC,iDAaD,CAXC,0GACC,wiCACD,CAEA,+GACC,aAKD,CAHC,qHACC,UACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css";\n\n.ck-media__wrapper {\n\t& .ck-media__placeholder {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\n\t\t& .ck-media__placeholder__url {\n\t\t\t@mixin ck-tooltip_enabled;\n\n\t\t\t/* Otherwise the URL will overflow when the content is very narrow. */\n\t\t\tmax-width: 100%;\n\n\t\t\tposition: relative;\n\n\t\t\t&:hover {\n\t\t\t\t@mixin ck-tooltip_visible;\n\t\t\t}\n\n\t\t\t& .ck-media__placeholder__url__text {\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="twitter.com"],\n\t&[data-oembed-url*="google.com/maps"],\n\t&[data-oembed-url*="goo.gl/maps"],\n\t&[data-oembed-url*="maps.google.com"],\n\t&[data-oembed-url*="maps.app.goo.gl"],\n\t&[data-oembed-url*="facebook.com"],\n\t&[data-oembed-url*="instagram.com"] {\n\t\t& .ck-media__placeholder__icon * {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/* Disable all mouse interaction as long as the editor is not read–only.\n https://github.com/ckeditor/ckeditor5-media-embed/issues/58 */\n.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper > *:not(.ck-media__placeholder) {\n\tpointer-events: none;\n}\n\n/* Disable all mouse interaction when the widget is not selected (e.g. to avoid opening links by accident).\n https://github.com/ckeditor/ckeditor5-media-embed/issues/18 */\n.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder {\n\tpointer-events: none;\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-media-embed-placeholder-icon-size: 3em;\n\n\t--ck-color-media-embed-placeholder-url-text: hsl(0, 0%, 46%);\n\t--ck-color-media-embed-placeholder-url-text-hover: var(--ck-color-base-text);\n}\n\n.ck-media__wrapper {\n\tmargin: 0 auto;\n\n\t& .ck-media__placeholder {\n\t\tpadding: calc( 3 * var(--ck-spacing-standard) );\n\t\tbackground: var(--ck-color-base-foreground);\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tmin-width: var(--ck-media-embed-placeholder-icon-size);\n\t\t\theight: var(--ck-media-embed-placeholder-icon-size);\n\t\t\tmargin-bottom: var(--ck-spacing-large);\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: cover;\n\n\t\t\t& .ck-icon {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: var(--ck-color-media-embed-placeholder-url-text);\n\t\t\twhite-space: nowrap;\n\t\t\ttext-align: center;\n\t\t\tfont-style: italic;\n\t\t\ttext-overflow: ellipsis;\n\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--ck-color-media-embed-placeholder-url-text-hover);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="open.spotify.com"] {\n\t\tmax-width: 300px;\n\t\tmax-height: 380px;\n\t}\n\n\t&[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon {\n\t\tbackground-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Ik0yMDYuNDc3IDI2MC45bC0yOC45ODcgMjguOTg3YTUuMjE4IDUuMjE4IDAgMCAwIDMuNzggMS42MWg0OS42MjFjMS42OTQgMCAzLjE5LS43OTggNC4xNDYtMi4wMzd6IiBmaWxsPSIjNWM4OGM1Ii8+PHBhdGggZD0iTTIyNi43NDIgMjIyLjk4OGMtOS4yNjYgMC0xNi43NzcgNy4xNy0xNi43NzcgMTYuMDE0LjAwNyAyLjc2Mi42NjMgNS40NzQgMi4wOTMgNy44NzUuNDMuNzAzLjgzIDEuNDA4IDEuMTkgMi4xMDcuMzMzLjUwMi42NSAxLjAwNS45NSAxLjUwOC4zNDMuNDc3LjY3My45NTcuOTg4IDEuNDQgMS4zMSAxLjc2OSAyLjUgMy41MDIgMy42MzcgNS4xNjguNzkzIDEuMjc1IDEuNjgzIDIuNjQgMi40NjYgMy45OSAyLjM2MyA0LjA5NCA0LjAwNyA4LjA5MiA0LjYgMTMuOTE0di4wMTJjLjE4Mi40MTIuNTE2LjY2Ni44NzkuNjY3LjQwMy0uMDAxLjc2OC0uMzE0LjkzLS43OTkuNjAzLTUuNzU2IDIuMjM4LTkuNzI5IDQuNTg1LTEzLjc5NC43ODItMS4zNSAxLjY3My0yLjcxNSAyLjQ2NS0zLjk5IDEuMTM3LTEuNjY2IDIuMzI4LTMuNCAzLjYzOC01LjE2OS4zMTUtLjQ4Mi42NDUtLjk2Mi45ODgtMS40MzkuMy0uNTAzLjYxNy0xLjAwNi45NS0xLjUwOC4zNTktLjcuNzYtMS40MDQgMS4xOS0yLjEwNyAxLjQyNi0yLjQwMiAyLTUuMTE0IDIuMDA0LTcuODc1IDAtOC44NDQtNy41MTEtMTYuMDE0LTE2Ljc3Ni0xNi4wMTR6IiBmaWxsPSIjZGQ0YjNlIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxlbGxpcHNlIHJ5PSI1LjU2NCIgcng9IjUuODI4IiBjeT0iMjM5LjAwMiIgY3g9IjIyNi43NDIiIGZpbGw9IiM4MDJkMjciIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0iTTE5MC4zMDEgMjM3LjI4M2MtNC42NyAwLTguNDU3IDMuODUzLTguNDU3IDguNjA2czMuNzg2IDguNjA3IDguNDU3IDguNjA3YzMuMDQzIDAgNC44MDYtLjk1OCA2LjMzNy0yLjUxNiAxLjUzLTEuNTU3IDIuMDg3LTMuOTEzIDIuMDg3LTYuMjkgMC0uMzYyLS4wMjMtLjcyMi0uMDY0LTEuMDc5aC04LjI1N3YzLjA0M2g0Ljg1Yy0uMTk3Ljc1OS0uNTMxIDEuNDUtMS4wNTggMS45ODYtLjk0Mi45NTgtMi4wMjggMS41NDgtMy45MDEgMS41NDgtMi44NzYgMC01LjIwOC0yLjM3Mi01LjIwOC01LjI5OSAwLTIuOTI2IDIuMzMyLTUuMjk5IDUuMjA4LTUuMjk5IDEuMzk5IDAgMi42MTguNDA3IDMuNTg0IDEuMjkzbDIuMzgxLTIuMzhjMC0uMDAyLS4wMDMtLjAwNC0uMDA0LS4wMDUtMS41ODgtMS41MjQtMy42Mi0yLjIxNS01Ljk1NS0yLjIxNXptNC40MyA1LjY2bC4wMDMuMDA2di0uMDAzeiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjE1LjE4NCAyNTEuOTI5bC03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVjLjI4Ny0uNjQ5LjQ0OS0xLjM2Ni40NDktMi4xMjN2LTMxLjE2NWMtLjQ2OS42NzUtLjkzNCAxLjM0OS0xLjM4MiAyLjAwNS0uNzkyIDEuMjc1LTEuNjgyIDIuNjQtMi40NjUgMy45OS0yLjM0NyA0LjA2NS0zLjk4MiA4LjAzOC00LjU4NSAxMy43OTQtLjE2Mi40ODUtLjUyNy43OTgtLjkzLjc5OS0uMzYzLS4wMDEtLjY5Ny0uMjU1LS44NzktLjY2N3YtLjAxMmMtLjU5My01LjgyMi0yLjIzNy05LjgyLTQuNi0xMy45MTQtLjc4My0xLjM1LTEuNjczLTIuNzE1LTIuNDY2LTMuOTktMS4xMzctMS42NjYtMi4zMjctMy40LTMuNjM3LTUuMTY5bC0uMDAyLS4wMDN6IiBmaWxsPSIjYzNjM2MzIi8+PHBhdGggZD0iTTIxMi45ODMgMjQ4LjQ5NWwtMzYuOTUyIDM2Ljk1M3YuODEyYTUuMjI3IDUuMjI3IDAgMCAwIDUuMjM4IDUuMjM4aDEuMDE1bDM1LjY2Ni0zNS42NjZhMTM2LjI3NSAxMzYuMjc1IDAgMCAwLTIuNzY0LTMuOSAzNy41NzUgMzcuNTc1IDAgMCAwLS45ODktMS40NGMtLjI5OS0uNTAzLS42MTYtMS4wMDYtLjk1LTEuNTA4LS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjExLjk5OCAyNjEuMDgzbC02LjE1MiA2LjE1MSAyNC4yNjQgMjQuMjY0aC43ODFhNS4yMjcgNS4yMjcgMCAwIDAgNS4yMzktNS4yMzh2LTEuMDQ1eiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48L2c+PC9zdmc+);\n\t}\n\n\t&[data-oembed-url*="facebook.com"] .ck-media__placeholder {\n\t\tbackground: hsl(220, 46%, 48%);\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMDI0cHgiIGhlaWdodD0iMTAyNHB4IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPiAgICAgICAgPHRpdGxlPkZpbGwgMTwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImZMb2dvX1doaXRlIiBmaWxsPSIjRkZGRkZFIj4gICAgICAgICAgICA8cGF0aCBkPSJNOTY3LjQ4NCwwIEw1Ni41MTcsMCBDMjUuMzA0LDAgMCwyNS4zMDQgMCw1Ni41MTcgTDAsOTY3LjQ4MyBDMCw5OTguNjk0IDI1LjI5NywxMDI0IDU2LjUyMiwxMDI0IEw1NDcsMTAyNCBMNTQ3LDYyOCBMNDE0LDYyOCBMNDE0LDQ3MyBMNTQ3LDQ3MyBMNTQ3LDM1OS4wMjkgQzU0NywyMjYuNzY3IDYyNy43NzMsMTU0Ljc0NyA3NDUuNzU2LDE1NC43NDcgQzgwMi4yNjksMTU0Ljc0NyA4NTAuODQyLDE1OC45NTUgODY1LDE2MC44MzYgTDg2NSwyOTkgTDc4My4zODQsMjk5LjAzNyBDNzE5LjM5MSwyOTkuMDM3IDcwNywzMjkuNTI5IDcwNywzNzQuMjczIEw3MDcsNDczIEw4NjAuNDg3LDQ3MyBMODQwLjUwMSw2MjggTDcwNyw2MjggTDcwNywxMDI0IEw5NjcuNDg0LDEwMjQgQzk5OC42OTcsMTAyNCAxMDI0LDk5OC42OTcgMTAyNCw5NjcuNDg0IEwxMDI0LDU2LjUxNSBDMTAyNCwyNS4zMDMgOTk4LjY5NywwIDk2Ny40ODQsMCIgaWQ9IkZpbGwtMSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(220, 100%, 90%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="instagram.com"] .ck-media__placeholder {\n\t\tbackground: linear-gradient(-135deg,hsl(246, 100%, 39%),hsl(302, 100%, 36%),hsl(0, 100%, 48%));\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MDRweCIgaGVpZ2h0PSI1MDRweCIgdmlld0JveD0iMCAwIDUwNCA1MDQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+Z2x5cGgtbG9nb19NYXkyMDE2PC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxkZWZzPiAgICAgICAgPHBvbHlnb24gaWQ9InBhdGgtMSIgcG9pbnRzPSIwIDAuMTU5IDUwMy44NDEgMC4xNTkgNTAzLjg0MSA1MDMuOTQgMCA1MDMuOTQiPjwvcG9seWdvbj4gICAgPC9kZWZzPiAgICA8ZyBpZD0iZ2x5cGgtbG9nb19NYXkyMDE2IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJHcm91cC0zIj4gICAgICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+ICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+ICAgICAgICAgICAgPC9tYXNrPiAgICAgICAgICAgIDxnIGlkPSJDbGlwLTIiPjwvZz4gICAgICAgICAgICA8cGF0aCBkPSJNMjUxLjkyMSwwLjE1OSBDMTgzLjUwMywwLjE1OSAxNzQuOTI0LDAuNDQ5IDE0OC4wNTQsMS42NzUgQzEyMS4yNCwyLjg5OCAxMDIuOTI3LDcuMTU3IDg2LjkwMywxMy4zODUgQzcwLjMzNywxOS44MjIgNTYuMjg4LDI4LjQzNiA0Mi4yODIsNDIuNDQxIEMyOC4yNzcsNTYuNDQ3IDE5LjY2Myw3MC40OTYgMTMuMjI2LDg3LjA2MiBDNi45OTgsMTAzLjA4NiAyLjczOSwxMjEuMzk5IDEuNTE2LDE0OC4yMTMgQzAuMjksMTc1LjA4MyAwLDE4My42NjIgMCwyNTIuMDggQzAsMzIwLjQ5NyAwLjI5LDMyOS4wNzYgMS41MTYsMzU1Ljk0NiBDMi43MzksMzgyLjc2IDYuOTk4LDQwMS4wNzMgMTMuMjI2LDQxNy4wOTcgQzE5LjY2Myw0MzMuNjYzIDI4LjI3Nyw0NDcuNzEyIDQyLjI4Miw0NjEuNzE4IEM1Ni4yODgsNDc1LjcyMyA3MC4zMzcsNDg0LjMzNyA4Ni45MDMsNDkwLjc3NSBDMTAyLjkyNyw0OTcuMDAyIDEyMS4yNCw1MDEuMjYxIDE0OC4wNTQsNTAyLjQ4NCBDMTc0LjkyNCw1MDMuNzEgMTgzLjUwMyw1MDQgMjUxLjkyMSw1MDQgQzMyMC4zMzgsNTA0IDMyOC45MTcsNTAzLjcxIDM1NS43ODcsNTAyLjQ4NCBDMzgyLjYwMSw1MDEuMjYxIDQwMC45MTQsNDk3LjAwMiA0MTYuOTM4LDQ5MC43NzUgQzQzMy41MDQsNDg0LjMzNyA0NDcuNTUzLDQ3NS43MjMgNDYxLjU1OSw0NjEuNzE4IEM0NzUuNTY0LDQ0Ny43MTIgNDg0LjE3OCw0MzMuNjYzIDQ5MC42MTYsNDE3LjA5NyBDNDk2Ljg0Myw0MDEuMDczIDUwMS4xMDIsMzgyLjc2IDUwMi4zMjUsMzU1Ljk0NiBDNTAzLjU1MSwzMjkuMDc2IDUwMy44NDEsMzIwLjQ5NyA1MDMuODQxLDI1Mi4wOCBDNTAzLjg0MSwxODMuNjYyIDUwMy41NTEsMTc1LjA4MyA1MDIuMzI1LDE0OC4yMTMgQzUwMS4xMDIsMTIxLjM5OSA0OTYuODQzLDEwMy4wODYgNDkwLjYxNiw4Ny4wNjIgQzQ4NC4xNzgsNzAuNDk2IDQ3NS41NjQsNTYuNDQ3IDQ2MS41NTksNDIuNDQxIEM0NDcuNTUzLDI4LjQzNiA0MzMuNTA0LDE5LjgyMiA0MTYuOTM4LDEzLjM4NSBDNDAwLjkxNCw3LjE1NyAzODIuNjAxLDIuODk4IDM1NS43ODcsMS42NzUgQzMyOC45MTcsMC40NDkgMzIwLjMzOCwwLjE1OSAyNTEuOTIxLDAuMTU5IFogTTI1MS45MjEsNDUuNTUgQzMxOS4xODYsNDUuNTUgMzI3LjE1NCw0NS44MDcgMzUzLjcxOCw0Ny4wMTkgQzM3OC4yOCw0OC4xMzkgMzkxLjYxOSw1Mi4yNDMgNDAwLjQ5Niw1NS42OTMgQzQxMi4yNTUsNjAuMjYzIDQyMC42NDcsNjUuNzIyIDQyOS40NjIsNzQuNTM4IEM0MzguMjc4LDgzLjM1MyA0NDMuNzM3LDkxLjc0NSA0NDguMzA3LDEwMy41MDQgQzQ1MS43NTcsMTEyLjM4MSA0NTUuODYxLDEyNS43MiA0NTYuOTgxLDE1MC4yODIgQzQ1OC4xOTMsMTc2Ljg0NiA0NTguNDUsMTg0LjgxNCA0NTguNDUsMjUyLjA4IEM0NTguNDUsMzE5LjM0NSA0NTguMTkzLDMyNy4zMTMgNDU2Ljk4MSwzNTMuODc3IEM0NTUuODYxLDM3OC40MzkgNDUxLjc1NywzOTEuNzc4IDQ0OC4zMDcsNDAwLjY1NSBDNDQzLjczNyw0MTIuNDE0IDQzOC4yNzgsNDIwLjgwNiA0MjkuNDYyLDQyOS42MjEgQzQyMC42NDcsNDM4LjQzNyA0MTIuMjU1LDQ0My44OTYgNDAwLjQ5Niw0NDguNDY2IEMzOTEuNjE5LDQ1MS45MTYgMzc4LjI4LDQ1Ni4wMiAzNTMuNzE4LDQ1Ny4xNCBDMzI3LjE1OCw0NTguMzUyIDMxOS4xOTEsNDU4LjYwOSAyNTEuOTIxLDQ1OC42MDkgQzE4NC42NSw0NTguNjA5IDE3Ni42ODQsNDU4LjM1MiAxNTAuMTIzLDQ1Ny4xNCBDMTI1LjU2MSw0NTYuMDIgMTEyLjIyMiw0NTEuOTE2IDEwMy4zNDUsNDQ4LjQ2NiBDOTEuNTg2LDQ0My44OTYgODMuMTk0LDQzOC40MzcgNzQuMzc5LDQyOS42MjEgQzY1LjU2NCw0MjAuODA2IDYwLjEwNCw0MTIuNDE0IDU1LjUzNCw0MDAuNjU1IEM1Mi4wODQsMzkxLjc3OCA0Ny45OCwzNzguNDM5IDQ2Ljg2LDM1My44NzcgQzQ1LjY0OCwzMjcuMzEzIDQ1LjM5MSwzMTkuMzQ1IDQ1LjM5MSwyNTIuMDggQzQ1LjM5MSwxODQuODE0IDQ1LjY0OCwxNzYuODQ2IDQ2Ljg2LDE1MC4yODIgQzQ3Ljk4LDEyNS43MiA1Mi4wODQsMTEyLjM4MSA1NS41MzQsMTAzLjUwNCBDNjAuMTA0LDkxLjc0NSA2NS41NjMsODMuMzUzIDc0LjM3OSw3NC41MzggQzgzLjE5NCw2NS43MjIgOTEuNTg2LDYwLjI2MyAxMDMuMzQ1LDU1LjY5MyBDMTEyLjIyMiw1Mi4yNDMgMTI1LjU2MSw0OC4xMzkgMTUwLjEyMyw0Ny4wMTkgQzE3Ni42ODcsNDUuODA3IDE4NC42NTUsNDUuNTUgMjUxLjkyMSw0NS41NSBaIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiBtYXNrPSJ1cmwoI21hc2stMikiPjwvcGF0aD4gICAgICAgIDwvZz4gICAgICAgIDxwYXRoIGQ9Ik0yNTEuOTIxLDMzNi4wNTMgQzIwNS41NDMsMzM2LjA1MyAxNjcuOTQ3LDI5OC40NTcgMTY3Ljk0NywyNTIuMDggQzE2Ny45NDcsMjA1LjcwMiAyMDUuNTQzLDE2OC4xMDYgMjUxLjkyMSwxNjguMTA2IEMyOTguMjk4LDE2OC4xMDYgMzM1Ljg5NCwyMDUuNzAyIDMzNS44OTQsMjUyLjA4IEMzMzUuODk0LDI5OC40NTcgMjk4LjI5OCwzMzYuMDUzIDI1MS45MjEsMzM2LjA1MyBaIE0yNTEuOTIxLDEyMi43MTUgQzE4MC40NzQsMTIyLjcxNSAxMjIuNTU2LDE4MC42MzMgMTIyLjU1NiwyNTIuMDggQzEyMi41NTYsMzIzLjUyNiAxODAuNDc0LDM4MS40NDQgMjUxLjkyMSwzODEuNDQ0IEMzMjMuMzY3LDM4MS40NDQgMzgxLjI4NSwzMjMuNTI2IDM4MS4yODUsMjUyLjA4IEMzODEuMjg1LDE4MC42MzMgMzIzLjM2NywxMjIuNzE1IDI1MS45MjEsMTIyLjcxNSBaIiBpZD0iRmlsbC00IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgICAgICA8cGF0aCBkPSJNNDE2LjYyNywxMTcuNjA0IEM0MTYuNjI3LDEzNC4zIDQwMy4wOTIsMTQ3LjgzNCAzODYuMzk2LDE0Ny44MzQgQzM2OS43MDEsMTQ3LjgzNCAzNTYuMTY2LDEzNC4zIDM1Ni4xNjYsMTE3LjYwNCBDMzU2LjE2NiwxMDAuOTA4IDM2OS43MDEsODcuMzczIDM4Ni4zOTYsODcuMzczIEM0MDMuMDkyLDg3LjM3MyA0MTYuNjI3LDEwMC45MDggNDE2LjYyNywxMTcuNjA0IiBpZD0iRmlsbC01IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgIDwvZz48L3N2Zz4=);\n\t\t}\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(302, 100%, 94%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder {\n\t\t/* Use gradient to contrast with focused widget (ckeditor/ckeditor5-media-embed#22). */\n\t\tbackground: linear-gradient( to right, hsl(201, 85%, 70%), hsl(201, 85%, 35%) );\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IldoaXRlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQwMCA0MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDB7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MDAsMjAwYzAsMTEwLjUtODkuNSwyMDAtMjAwLDIwMFMwLDMxMC41LDAsMjAwUzg5LjUsMCwyMDAsMFM0MDAsODkuNSw0MDAsMjAweiBNMTYzLjQsMzA1LjVjODguNywwLDEzNy4yLTczLjUsMTM3LjItMTM3LjJjMC0yLjEsMC00LjItMC4xLTYuMmM5LjQtNi44LDE3LjYtMTUuMywyNC4xLTI1Yy04LjYsMy44LTE3LjksNi40LTI3LjcsNy42YzEwLTYsMTcuNi0xNS40LDIxLjItMjYuN2MtOS4zLDUuNS0xOS42LDkuNS0zMC42LDExLjdjLTguOC05LjQtMjEuMy0xNS4yLTM1LjItMTUuMmMtMjYuNiwwLTQ4LjIsMjEuNi00OC4yLDQ4LjJjMCwzLjgsMC40LDcuNSwxLjMsMTFjLTQwLjEtMi03NS42LTIxLjItOTkuNC01MC40Yy00LjEsNy4xLTYuNSwxNS40LTYuNSwyNC4yYzAsMTYuNyw4LjUsMzEuNSwyMS41LDQwLjFjLTcuOS0wLjItMTUuMy0yLjQtMjEuOC02YzAsMC4yLDAsMC40LDAsMC42YzAsMjMuNCwxNi42LDQyLjgsMzguNyw0Ny4zYy00LDEuMS04LjMsMS43LTEyLjcsMS43Yy0zLjEsMC02LjEtMC4zLTkuMS0wLjljNi4xLDE5LjIsMjMuOSwzMy4xLDQ1LDMzLjVjLTE2LjUsMTIuOS0zNy4zLDIwLjYtNTkuOSwyMC42Yy0zLjksMC03LjctMC4yLTExLjUtMC43QzExMC44LDI5Ny41LDEzNi4yLDMwNS41LDE2My40LDMwNS41Ii8+PC9zdmc+);\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(201, 100%, 86%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},3525:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-media-form{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-media-form .ck-labeled-field-view{display:inline-block}.ck.ck-media-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-media-form{flex-wrap:wrap}.ck.ck-media-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-media-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,kBAEC,sBAAuB,CADvB,YAAa,CAEb,kBAAmB,CACnB,gBAqBD,CAnBC,yCACC,oBACD,CAEA,4BACC,YACD,CCbA,oCDCD,kBAeE,cAUF,CARE,yCACC,eACD,CAEA,6BACC,cACD,CCtBD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-media-form {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},671:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck-source-editing-area{overflow:hidden;position:relative}.ck-source-editing-area textarea,.ck-source-editing-area:after{border:1px solid transparent;font-family:monospace;font-size:var(--ck-font-size-normal);line-height:var(--ck-line-height-base);margin:0;padding:var(--ck-spacing-large);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";display:block;visibility:hidden}.ck-source-editing-area textarea{border-color:var(--ck-color-base-border);border-radius:0;box-sizing:border-box;height:100%;outline:none;overflow:hidden;position:absolute;resize:none;width:100%}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-source-editing/theme/sourceediting.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AASA,wBAEC,eAAgB,CADhB,iBAED,CAEA,+DAIC,4BAA6B,CAG7B,qBAAsB,CADtB,oCAAqC,CADrC,sCAAuC,CAFvC,QAAS,CADT,+BAAgC,CAMhC,oBACD,CAEA,8BACC,4BAA6B,CAE7B,aAAc,CADd,iBAED,CAEA,iCASC,wCAAyC,CC7BzC,eAAgB,CD2BhB,qBAAsB,CAJtB,WAAY,CAEZ,YAAa,CACb,eAAgB,CALhB,iBAAkB,CAGlB,WAAY,CAFZ,UAkBD,CApBA,yGChBE,qCAAsC,CD4BtC,wBAAyB,CACzB,yBAOF,CAJC,uDEpCA,2BAA2B,CCF3B,qCAA8B,CDC9B,YFwCA",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css";\n@import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css";\n\n.ck-source-editing-area {\n\tposition: relative;\n\toverflow: hidden;\n}\n\n.ck-source-editing-area::after,\n.ck-source-editing-area textarea {\n\tpadding: var(--ck-spacing-large);\n\tmargin: 0;\n\tborder: 1px solid transparent;\n\tline-height: var(--ck-line-height-base);\n\tfont-size: var(--ck-font-size-normal);\n\tfont-family: monospace;\n\twhite-space: pre-wrap;\n}\n\n.ck-source-editing-area::after {\n\tcontent: attr(data-value) " ";\n\tvisibility: hidden;\n\tdisplay: block;\n}\n\n.ck-source-editing-area textarea {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tresize: none;\n\toutline: none;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n\n\tborder-color: var(--ck-color-base-border);\n\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&:not([readonly]):focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},4046:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-character-grid{max-width:100%}.ck.ck-character-grid .ck-character-grid__tiles{display:grid}:root{--ck-character-grid-tile-size:24px}.ck.ck-character-grid{max-height:200px;overflow-x:hidden;overflow-y:auto;width:350px}.ck.ck-character-grid .ck-character-grid__tiles{grid-gap:var(--ck-spacing-standard);grid-template-columns:repeat(auto-fit,minmax(var(--ck-character-grid-tile-size),1fr));margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-character-grid .ck-character-grid__tile{border:0;font-size:1.2em;height:var(--ck-character-grid-tile-size);min-height:var(--ck-character-grid-tile-size);min-width:var(--ck-character-grid-tile-size);padding:0;transition:box-shadow .2s ease;width:var(--ck-character-grid-tile-size)}.ck.ck-character-grid .ck-character-grid__tile:focus:not(.ck-disabled),.ck.ck-character-grid .ck-character-grid__tile:hover:not(.ck-disabled){border:0;box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-character-grid .ck-character-grid__tile .ck-button__label{line-height:var(--ck-character-grid-tile-size);text-align:center;width:100%}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-special-characters/theme/charactergrid.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-special-characters/charactergrid.css"],names:[],mappings:"AAKA,sBACC,cAKD,CAHC,gDACC,YACD,CCHD,MACC,kCACD,CAEA,sBAIC,gBAAiB,CAFjB,iBAAkB,CADlB,eAAgB,CAEhB,WAiCD,CA9BC,gDAGC,mCAAoC,CAFpC,qFAAwF,CACxF,yDAED,CAEA,+CAQC,QAAS,CAHT,eAAgB,CAHhB,yCAA0C,CAE1C,6CAA8C,CAD9C,4CAA6C,CAG7C,SAAU,CACV,8BAA+B,CAN/B,wCAsBD,CAbC,8IAGC,QAAS,CACT,iGACD,CAGA,iEACC,8CAA+C,CAE/C,iBAAkB,CADlB,UAED",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-character-grid {\n\tmax-width: 100%;\n\t\n\t& .ck-character-grid__tiles {\n\t\tdisplay: grid;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n:root {\n\t--ck-character-grid-tile-size: 24px;\n}\n\n.ck.ck-character-grid {\n\toverflow-y: auto;\n\toverflow-x: hidden;\n\twidth: 350px;\n\tmax-height: 200px;\n\n\t& .ck-character-grid__tiles {\n\t\tgrid-template-columns: repeat(auto-fit, minmax(var(--ck-character-grid-tile-size), 1fr));\n\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\n\t\tgrid-gap: var(--ck-spacing-standard);\n\t}\n\n\t& .ck-character-grid__tile {\n\t\twidth: var(--ck-character-grid-tile-size);\n\t\theight: var(--ck-character-grid-tile-size);\n\t\tmin-width: var(--ck-character-grid-tile-size);\n\t\tmin-height: var(--ck-character-grid-tile-size);\n\t\tfont-size: 1.2em;\n\t\tpadding: 0;\n\t\ttransition: .2s ease box-shadow;\n\t\tborder: 0;\n\n\t\t&:focus:not( .ck-disabled ),\n\t\t&:hover:not( .ck-disabled ) {\n\t\t\t/* Disable the default .ck-button\'s border ring. */\n\t\t\tborder: 0;\n\t\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\n\t\t}\n\n\t\t/* Make sure the glyph is rendered in the center of the button */\n\t\t& .ck-button__label {\n\t\t\tline-height: var(--ck-character-grid-tile-size);\n\t\t\twidth: 100%;\n\t\t\ttext-align: center;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},4779:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-character-info{border-top:1px solid var(--ck-color-base-border);display:flex;justify-content:space-between;padding:var(--ck-spacing-small) var(--ck-spacing-large)}.ck.ck-character-info>*{font-size:var(--ck-font-size-small);text-transform:uppercase}.ck.ck-character-info .ck-character-info__name{max-width:280px;overflow:hidden;text-overflow:ellipsis}.ck.ck-character-info .ck-character-info__code{opacity:.6}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-special-characters/theme/characterinfo.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-special-characters/characterinfo.css"],names:[],mappings:"AAKA,sBCEC,gDAAiD,CDDjD,YAAa,CACb,6BAA8B,CCD9B,uDDED,CCCC,wBAEC,mCAAoC,CADpC,wBAED,CAEA,+CACC,eAAgB,CAEhB,eAAgB,CADhB,sBAED,CAEA,+CACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-character-info {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-character-info {\n\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\n\tborder-top: 1px solid var(--ck-color-base-border);\n\n\t& > * {\n\t\ttext-transform: uppercase;\n\t\tfont-size: var(--ck-font-size-small);\n\t}\n\n\t& .ck-character-info__name {\n\t\tmax-width: 280px;\n\t\ttext-overflow: ellipsis;\n\t\toverflow: hidden;\n\t}\n\n\t& .ck-character-info__code {\n\t\topacity: .6;\n\t}\n}\n"],sourceRoot:""}]);const a=s},8170:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-special-characters-navigation>.ck-label{max-width:160px;overflow:hidden;text-overflow:ellipsis}.ck.ck-special-characters-navigation>.ck-dropdown .ck-dropdown__panel{max-height:250px;overflow-x:hidden;overflow-y:auto}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-special-characters/specialcharacters.css"],names:[],mappings:"AASC,+CACC,eAAgB,CAEhB,eAAgB,CADhB,sBAED,CAEA,sEAEC,gBAAiB,CAEjB,iBAAkB,CADlB,eAED",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-special-characters-navigation {\n\n\t& > .ck-label {\n\t\tmax-width: 160px;\n\t\ttext-overflow: ellipsis;\n\t\toverflow: hidden;\n\t}\n\n\t& > .ck-dropdown .ck-dropdown__panel {\n\t\t/* There could be dozens of categories available. Use scroll to prevent a 10e6px dropdown. */\n\t\tmax-height: 250px;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t}\n}\n'],sourceRoot:""}]);const a=s},4082:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-input-color{display:flex;flex-direction:row-reverse;width:100%}.ck.ck-input-color>input.ck.ck-input-text{flex-grow:1;min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button{display:flex}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{overflow:hidden;position:relative}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{display:block;position:absolute}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border:1px solid var(--ck-color-input-border);height:20px;width:20px}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{background:red;border-radius:2px;height:150%;left:50%;top:-30%;transform:rotate(45deg);transform-origin:50%;width:8%}.ck.ck-input-color .ck.ck-input-color__remove-color{border-bottom:1px solid var(--ck-color-input-border);border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);width:100%}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard);margin-right:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/colorinput.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,mBAEC,YAAa,CACb,0BAA2B,CAF3B,UAgCD,CA5BC,0CAEC,WAAY,CADZ,cAED,CAEA,sCACC,cAMD,CAHC,kFACC,YACD,CAGD,8CAEC,YAWD,CATC,kFAEC,eAAgB,CADhB,iBAOD,CAJC,0IAEC,aAAc,CADd,iBAED,CC1BF,+CAGE,4BAA6B,CAD7B,yBAQF,CAVA,+CAQE,2BAA4B,CAD5B,wBAGF,CAGC,wEACC,SAoCD,CArCA,kFAME,2BAA4B,CAF5B,mBAAoB,CACpB,wBAgCF,CArCA,kFAYE,4BAA6B,CAF7B,oBAAqB,CACrB,yBA0BF,CAtBC,oFACC,oDACD,CAEA,4GC9BF,eD+CE,CAjBA,+PC1BD,qCD2CC,CAjBA,4GAKC,6CAA8C,CAD9C,WAAY,CADZ,UAcD,CAVC,oKAKC,cAA6B,CAC7B,iBAAkB,CAHlB,WAAY,CADZ,QAAS,CADT,QAAS,CAMT,uBAAwB,CACxB,oBAAqB,CAJrB,QAKD,CAKH,oDAEC,oDAAqD,CAGrD,2BAA4B,CAC5B,4BAA6B,CAH7B,qEAAwE,CAFxE,UAuBD,CAxBA,8DASE,yBAeF,CAxBA,8DAaE,wBAWF,CARC,gEACC,uCAMD,CAPA,0EAKE,sCAAuC,CADvC,cAGF",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-input-color {\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: row-reverse;\n\n\t& > input.ck.ck-input-text {\n\t\tmin-width: auto;\n\t\tflex-grow: 1;\n\t}\n\n\t& > div.ck.ck-dropdown {\n\t\tmin-width: auto;\n\n\t\t/* This dropdown has no arrow but a color preview instead. */\n\t\t& > .ck-input-color__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__button {\n\t\t/* Resolving issue with misaligned buttons on Safari (see #10589) */\n\t\tdisplay: flex;\n\n\t\t& .ck.ck-input-color__button__preview {\n\t\t\tposition: relative;\n\t\t\toverflow: hidden;\n\n\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_rounded.css";\n\n.ck.ck-input-color {\n\t& > .ck.ck-input-text {\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t& > .ck.ck-dropdown {\n\t\t& > .ck.ck-button.ck-input-color__button {\n\t\t\tpadding: 0;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tborder-left-width: 0;\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tborder-right-width: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\t&.ck-disabled {\n\t\t\t\tbackground: var(--ck-color-input-disabled-background);\n\t\t\t}\n\n\t\t\t& > .ck.ck-input-color__button__preview {\n\t\t\t\t@mixin ck-rounded-corners;\n\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder: 1px solid var(--ck-color-input-border);\n\n\t\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\t\ttop: -30%;\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\theight: 150%;\n\t\t\t\t\twidth: 8%;\n\t\t\t\t\tbackground: hsl(0, 100%, 50%);\n\t\t\t\t\tborder-radius: 2px;\n\t\t\t\t\ttransform: rotate(45deg);\n\t\t\t\t\ttransform-origin: 50%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__remove-color {\n\t\twidth: 100%;\n\t\tborder-bottom: 1px solid var(--ck-color-input-border);\n\t\tpadding: calc(var(--ck-spacing-standard) / 2) var(--ck-spacing-standard);\n\n\t\tborder-bottom-left-radius: 0;\n\t\tborder-bottom-right-radius: 0;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t}\n\n\t\t& .ck.ck-icon {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: 0;\n\t\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},4880:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/form.css"],names:[],mappings:"AAKA,YACC,mCAyBD,CAvBC,kBAEC,YACD,CAEA,8BACC,cAAe,CACf,OACD,CAEA,4BACC,cAWD,CARE,6DACC,4CACD,CAEA,mEACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form {\n\tpadding: 0 0 var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t& .ck.ck-input-text {\n\t\tmin-width: 100%;\n\t\twidth: 0;\n\t}\n\n\t& .ck.ck-dropdown {\n\t\tmin-width: 100%;\n\n\t\t& .ck-dropdown__button {\n\t\t\t&:not(:focus) {\n\t\t\t\tborder: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t& .ck-button__label {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},9865:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{min-width:100%;width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/formrow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/formrow.css"],names:[],mappings:"AAKA,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAaD,CAVC,iCACC,WACD,CAGC,wHAEC,sBACD,CCbF,iBACC,4DA2BD,CAvBE,6CAEE,mCAMF,CARA,6CAME,oCAEF,CAGD,2BAEC,cAAe,CADf,UAED,CAEA,2CACC,kCAKD,CAHC,wEACC,0BACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\tflex-grow: 1;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-form__row {\n\tpadding: var(--ck-spacing-standard) var(--ck-spacing-large) 0;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\t& + * {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck-label {\n\t\twidth: 100%;\n\t\tmin-width: 100%;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},8085:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2)}.ck .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{border:1px solid var(--ck-color-base-border);border-radius:1px;height:var(--ck-insert-table-dropdown-box-height);margin:var(--ck-insert-table-dropdown-box-margin);width:var(--ck-insert-table-dropdown-box-width)}.ck .ck-insert-table-dropdown-grid-box.ck-on{background:var(--ck-color-focus-outer-shadow);border-color:var(--ck-color-focus-border)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/inserttable.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,cACD,CCJA,MACC,uCAAwC,CACxC,0CAA2C,CAC3C,yCAA0C,CAC1C,yCACD,CAEA,oCAGC,yFAA0F,CAD1F,oJAED,CAEA,qCACC,iBACD,CAEA,uCAIC,4CAA6C,CAC7C,iBAAkB,CAHlB,iDAAkD,CAClD,iDAAkD,CAFlD,+CAUD,CAJC,6CAEC,6CAA8C,CAD9C,yCAED",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-insert-table-dropdown__grid {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-insert-table-dropdown-padding: 10px;\n\t--ck-insert-table-dropdown-box-height: 11px;\n\t--ck-insert-table-dropdown-box-width: 12px;\n\t--ck-insert-table-dropdown-box-margin: 1px;\n}\n\n.ck .ck-insert-table-dropdown__grid {\n\t/* The width of a container should match 10 items in a row so there will be a 10x10 grid. */\n\twidth: calc(var(--ck-insert-table-dropdown-box-width) * 10 + var(--ck-insert-table-dropdown-box-margin) * 20 + var(--ck-insert-table-dropdown-padding) * 2);\n\tpadding: var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;\n}\n\n.ck .ck-insert-table-dropdown__label {\n\ttext-align: center;\n}\n\n.ck .ck-insert-table-dropdown-grid-box {\n\twidth: var(--ck-insert-table-dropdown-box-width);\n\theight: var(--ck-insert-table-dropdown-box-height);\n\tmargin: var(--ck-insert-table-dropdown-box-margin);\n\tborder: 1px solid var(--ck-color-base-border);\n\tborder-radius: 1px;\n\n\t&.ck-on {\n\t\tborder-color: var(--ck-color-focus-border);\n\t\tbackground: var(--ck-color-focus-outer-shadow);\n\t}\n}\n\n"],sourceRoot:""}]);const a=s},4104:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-content .table{display:table;margin:.9em auto}.ck-content .table table{border:1px double #b3b3b3;border-collapse:collapse;border-spacing:0;height:100%;width:100%}.ck-content .table table td,.ck-content .table table th{border:1px solid #bfbfbf;min-width:2em;padding:.4em}.ck-content .table table th{background:rgba(0,0,0,.05);font-weight:700}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/table.css"],names:[],mappings:"AAKA,mBAKC,aAAc,CADd,gBAiCD,CA9BC,yBAYC,yBAAkC,CAVlC,wBAAyB,CACzB,gBAAiB,CAKjB,WAAY,CADZ,UAsBD,CAfC,wDAQC,wBAAiC,CANjC,aAAc,CACd,YAMD,CAEA,4BAEC,0BAA+B,CAD/B,eAED,CAMF,+BACC,gBACD,CAEA,+BACC,eACD,CAEA,+CAKC,oBAAqB,CAMrB,UACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .table {\n\t/* Give the table widget some air and center it horizontally */\n\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\tmargin: 0.9em auto;\n\tdisplay: table;\n\n\t& table {\n\t\t/* The table cells should have slight borders */\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\n\t\t/* Table width and height are set on the parent
    . Make sure the table inside stretches\n\t\tto the full dimensions of the container (https://github.com/ckeditor/ckeditor5/issues/6186). */\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\t/* The outer border of the table should be slightly darker than the inner lines.\n\t\tAlso see https://github.com/ckeditor/ckeditor5-table/issues/50. */\n\t\tborder: 1px double hsl(0, 0%, 70%);\n\n\t\t& td,\n\t\t& th {\n\t\t\tmin-width: 2em;\n\t\t\tpadding: .4em;\n\n\t\t\t/* The border is inherited from .ck-editor__nested-editable styles, so theoretically it\'s not necessary here.\n\t\t\tHowever, the border is a content style, so it should use .ck-content (so it works outside the editor).\n\t\t\tHence, the duplication. See https://github.com/ckeditor/ckeditor5/issues/6314 */\n\t\t\tborder: 1px solid hsl(0, 0%, 75%);\n\t\t}\n\n\t\t& th {\n\t\t\tfont-weight: bold;\n\t\t\tbackground: hsla(0, 0%, 0%, 5%);\n\t\t}\n\t}\n}\n\n/* Text alignment of the table header should match the editor settings and override the native browser styling,\nwhen content is available outside the editor. See https://github.com/ckeditor/ckeditor5/issues/6638 */\n.ck-content[dir="rtl"] .table th {\n\ttext-align: right;\n}\n\n.ck-content[dir="ltr"] .table th {\n\ttext-align: left;\n}\n\n.ck-editor__editable .ck-table-bogus-paragraph {\n\t/*\n\t * Use display:inline-block to force Chrome/Safari to limit text mutations to this element.\n\t * See https://github.com/ckeditor/ckeditor5/issues/6062.\n\t */\n\tdisplay: inline-block;\n\n\t/*\n\t * Inline HTML elements nested in the span should always be dimensioned in relation to the whole cell width.\n\t * See https://github.com/ckeditor/ckeditor5/issues/9117.\n\t */\n\twidth: 100%;\n}\n'],sourceRoot:""}]);const a=s},9888:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-table-caption-background:#f7f7f7;--ck-color-table-caption-text:#333;--ck-color-table-caption-highlighted-background:#fd0}.ck-content .table>figcaption{background-color:var(--ck-color-table-caption-background);caption-side:top;color:var(--ck-color-table-caption-text);display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;text-align:center;word-break:break-word}.ck.ck-editor__editable .table>figcaption.table__caption_highlighted{animation:ck-table-caption-highlight .6s ease-out}.ck.ck-editor__editable .table>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}@keyframes ck-table-caption-highlight{0%{background-color:var(--ck-color-table-caption-highlighted-background)}to{background-color:var(--ck-color-table-caption-background)}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tablecaption.css"],names:[],mappings:"AAKA,MACC,2CAAoD,CACpD,kCAA8C,CAC9C,oDACD,CAGA,8BAMC,yDAA0D,CAJ1D,gBAAiB,CAGjB,wCAAyC,CAJzC,qBAAsB,CAOtB,eAAgB,CAChB,mBAAoB,CAFpB,YAAa,CAHb,iBAAkB,CADlB,qBAOD,CAIC,qEACC,iDACD,CAEA,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAGD,sCACC,GACC,qEACD,CAEA,GACC,yDACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-table-caption-background: hsl(0, 0%, 97%);\n\t--ck-color-table-caption-text: hsl(0, 0%, 20%);\n\t--ck-color-table-caption-highlighted-background: hsl(52deg 100% 50%);\n}\n\n/* Content styles */\n.ck-content .table > figcaption {\n\tdisplay: table-caption;\n\tcaption-side: top;\n\tword-break: break-word;\n\ttext-align: center;\n\tcolor: var(--ck-color-table-caption-text);\n\tbackground-color: var(--ck-color-table-caption-background);\n\tpadding: .6em;\n\tfont-size: .75em;\n\toutline-offset: -1px;\n}\n\n/* Editing styles */\n.ck.ck-editor__editable .table > figcaption {\n\t&.table__caption_highlighted {\n\t\tanimation: ck-table-caption-highlight .6s ease-out;\n\t}\n\n\t&.ck-placeholder::before {\n\t\tpadding-left: inherit;\n\t\tpadding-right: inherit;\n\n\t\t/*\n\t\t * Make sure the table caption placeholder doesn't overflow the placeholder area.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\n\t\t */\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n@keyframes ck-table-caption-highlight {\n\t0% {\n\t\tbackground-color: var(--ck-color-table-caption-highlighted-background);\n\t}\n\n\t100% {\n\t\tbackground-color: var(--ck-color-table-caption-background);\n\t}\n}\n"],sourceRoot:""}]);const a=s},5737:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row{flex-wrap:wrap}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:first-of-type{flex-grow:0.57}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:last-of-type{flex-grow:0.43}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar .ck-button{flex-grow:1}.ck.ck-table-cell-properties-form{width:320px}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__padding-row{align-self:flex-end;padding:0;width:25%}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tablecellproperties.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tablecellproperties.css"],names:[],mappings:"AAOE,6FACC,cAiBD,CAdE,0HAEC,cACD,CAEA,yHAEC,cACD,CAEA,uHACC,WACD,CClBJ,kCACC,WAkBD,CAfE,2FACC,mBAAoB,CACpB,SAAU,CACV,SACD,CAGC,4GACC,eAAgB,CAGhB,qCACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-cell-properties-form {\n\t& .ck-form__row {\n\t\t&.ck-table-cell-properties-form__alignment-row {\n\t\t\tflex-wrap: wrap;\n\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\t&:first-of-type {\n\t\t\t\t\t/* 4 buttons out of 7 (h-alignment + v-alignment) = 0.57 */\n\t\t\t\t\tflex-grow: 0.57;\n\t\t\t\t}\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\t/* 3 buttons out of 7 (h-alignment + v-alignment) = 0.43 */\n\t\t\t\t\tflex-grow: 0.43;\n\t\t\t\t}\n\n\t\t\t\t& .ck-button {\n\t\t\t\t\tflex-grow: 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-cell-properties-form {\n\twidth: 320px;\n\n\t& .ck-form__row {\n\t\t&.ck-table-cell-properties-form__padding-row {\n\t\t\talign-self: flex-end;\n\t\t\tpadding: 0;\n\t\t\twidth: 25%;\n\t\t}\n\n\t\t&.ck-table-cell-properties-form__alignment-row {\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\tbackground: none;\n\n\t\t\t\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},4777:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-table-focused-cell-background:rgba(158,207,250,.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableediting.css"],names:[],mappings:"AAKA,MACC,6DACD,CAKE,8QAGC,wDAAyD,CAKzD,iBAAkB,CAClB,8CAA+C,CAC/C,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-table-focused-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck-widget.table {\n\t& td,\n\t& th {\n\t\t&.ck-editor__nested-editable.ck-editor__nested-editable_focused,\n\t\t&.ck-editor__nested-editable:focus {\n\t\t\t/* A very slight background to highlight the focused cell */\n\t\t\tbackground: var(--ck-color-table-focused-cell-background);\n\n\t\t\t/* Fixes the problem where surrounding cells cover the focused cell's border.\n\t\t\tIt does not fix the problem in all places but the UX is improved.\n\t\t\tSee https://github.com/ckeditor/ckeditor5-table/issues/29. */\n\t\t\tborder-style: none;\n\t\t\toutline: 1px solid var(--ck-color-focus-border);\n\t\t\toutline-offset: -1px; /* progressive enhancement - no IE support */\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},198:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{align-items:center;flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{align-items:center;display:flex;flex-direction:column-reverse}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;position:absolute;transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";left:50%;position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{max-width:80px;min-width:80px;width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);min-width:var(--ck-table-properties-min-error-width);padding:var(--ck-spacing-small) var(--ck-spacing-medium);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-color:transparent transparent var(--ck-color-base-error) transparent;border-style:solid;border-width:0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear .15s ease both}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableform.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableform.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAWE,wHACC,cACD,CAEA,8DAEC,kBAAmB,CADnB,cAgBD,CAbC,qFAGC,kBAAmB,CAFnB,YAAa,CACb,6BAMD,CAEA,sMACC,WACD,CAIF,4CAEC,iBAoBD,CAlBC,8EAGC,2DAAgE,CADhE,QAAS,CADT,iBAAkB,CAGlB,8BAA+B,CAG/B,SAUD,CAPC,oFACC,UAAW,CAGX,QAAS,CAFT,iBAAkB,CAClB,wDAA6D,CAE7D,0BACD,CChDH,MACC,0CAA2C,CAC3C,2CACD,CAMI,2FACC,kCAAmC,CACnC,iBACD,CAGD,8KAIC,cAAe,CADf,cAAe,CADf,UAGD,CAGD,8DACC,SAcD,CAZC,yMAEC,QACD,CAEA,iGACC,mBAAoB,CACpB,oBAAqB,CACrB,wCAAyC,CACzC,6CAA8C,CAC9C,gCACD,CAIF,4CACC,sCAyBD,CAvBC,8ECxCD,eDyDC,CAjBA,mMCpCA,qCDqDA,CAjBA,8EAGC,qCAAsC,CACtC,qCAAsC,CAEtC,oDAAqD,CADrD,wDAAyD,CAEzD,iBAUD,CAPC,oFACC,2EAA4E,CAE5E,kBAAmB,CADnB,kJAED,CAdD,8EAgBC,iEACD,CAGA,6GACC,YACD,CAIF,oDACC,GACC,SACD,CAEA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__background-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tflex-wrap: wrap;\n\t\t\talign-items: center;\n\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column-reverse;\n\t\t\t\talign-items: center;\n\n\t\t\t\t& .ck.ck-dropdown {\n\t\t\t\t\tflex-grow: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\tflex-grow: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\t/* Allow absolute positioning of the status (error) balloons. */\n\t\tposition: relative;\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\tposition: absolute;\n\t\t\tleft: 50%;\n\t\t\tbottom: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\ttransform: translate(-50%,100%);\n\n\t\t\t/* Make sure the balloon status stays on top of other form elements. */\n\t\t\tz-index: 1;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX( -50% );\n\t\t\t}\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n:root {\n\t--ck-table-properties-error-arrow-size: 6px;\n\t--ck-table-properties-min-error-width: 150px;\n}\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\t& > .ck-label {\n\t\t\t\t\tfont-size: var(--ck-font-size-tiny);\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__border-style,\n\t\t\t& .ck-table-form__border-width {\n\t\t\t\twidth: 80px;\n\t\t\t\tmin-width: 80px;\n\t\t\t\tmax-width: 80px;\n\t\t\t}\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tpadding: 0;\n\n\t\t\t& .ck-table-form__dimensions-row__width,\n\t\t\t& .ck-table-form__dimensions-row__height {\n\t\t\t\tmargin: 0\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\talign-self: flex-end;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\theight: var(--ck-ui-component-min-height);\n\t\t\t\tline-height: var(--ck-ui-component-min-height);\n\t\t\t\tmargin: 0 var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\tpadding-top: var(--ck-spacing-standard);\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\t@mixin ck-rounded-corners;\n\n\t\t\tbackground: var(--ck-color-base-error);\n\t\t\tcolor: var(--ck-color-base-background);\n\t\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\t\tmin-width: var(--ck-table-properties-min-error-width);\n\t\t\ttext-align: center;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tborder-color: transparent transparent var(--ck-color-base-error) transparent;\n\t\t\t\tborder-width: 0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size);\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\tanimation: ck-table-form-labeled-view-status-appear .15s ease both;\n\t\t}\n\n\t\t/* Hide the error balloon when the field is blurred. Makes the experience much more clear. */\n\t\t& .ck-input.ck-error:not(:focus) + .ck.ck-labeled-field-view__status {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n@keyframes ck-table-form-labeled-view-status-appear {\n\t0% {\n\t\topacity: 0;\n\t}\n\n\t100% {\n\t\topacity: 1;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},9221:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-content:baseline;flex-basis:0;flex-wrap:wrap}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableproperties.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableproperties.css"],names:[],mappings:"AAOE,mFAGC,sBAAuB,CADvB,YAAa,CADb,cAOD,CAHC,qHACC,gBACD,CCTH,6BACC,WAmBD,CAhBE,mFACC,mBAAoB,CACpB,SAYD,CAVC,kGACC,eAAgB,CAGhB,qCAKD,CAHC,uHACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\tflex-wrap: wrap;\n\t\t\tflex-basis: 0;\n\t\t\talign-content: baseline;\n\n\t\t\t& .ck.ck-toolbar .ck-toolbar__items {\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\twidth: 320px;\n\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\talign-self: flex-end;\n\t\t\tpadding: 0;\n\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\tbackground: none;\n\n\t\t\t\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\n\t\t\t\t& .ck-toolbar__items > * {\n\t\t\t\t\twidth: 40px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},5593:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,':root{--ck-table-selected-cell-background:rgba(158,207,250,.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{box-shadow:unset;caret-color:transparent;outline:unset;position:relative}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{background-color:var(--ck-table-selected-cell-background);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableselection.css"],names:[],mappings:"AAKA,MACC,wDACD,CAGC,0IAKC,gBAAiB,CAFjB,uBAAwB,CACxB,aAAc,CAFd,iBAiCD,CA3BC,sJAGC,yDAA0D,CAK1D,QAAS,CAPT,UAAW,CAKX,MAAO,CAJP,mBAAoB,CAEpB,iBAAkB,CAGlB,OAAQ,CAFR,KAID,CAEA,wTAEC,4BACD,CAMA,gKACC,aAKD,CAHC,0NACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-table-selected-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck.ck-editor__editable .table table {\n\t& td.ck-editor__editable_selected,\n\t& th.ck-editor__editable_selected {\n\t\tposition: relative;\n\t\tcaret-color: transparent;\n\t\toutline: unset;\n\t\tbox-shadow: unset;\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/6446 */\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tpointer-events: none;\n\t\t\tbackground-color: var(--ck-table-selected-cell-background);\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t& ::selection,\n\t\t&:focus {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t/*\n\t\t * To reduce the amount of noise, all widgets in the table selection have no outline and no selection handle.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9491.\n\t\t */\n\t\t& .ck-widget {\n\t\t\toutline: unset;\n\n\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},4499:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-button,a.ck.ck-button{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:block}@media (hover:none){.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:none}}.ck.ck-button,a.ck.ck-button{align-items:center;display:inline-flex;justify-content:left;position:relative}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button:hover .ck-tooltip,a.ck.ck-button:hover .ck-tooltip{opacity:1;visibility:visible}.ck.ck-button:focus:not(:hover) .ck-tooltip,a.ck.ck-button:focus:not(:hover) .ck-tooltip{display:none}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-default-active-shadow)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{-webkit-appearance:none;border:1px solid transparent;cursor:default;font-size:inherit;line-height:1;min-height:var(--ck-ui-component-min-height);min-width:var(--ck-ui-component-min-height);padding:var(--ck-spacing-tiny);text-align:center;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;vertical-align:middle;white-space:nowrap}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{color:inherit;cursor:inherit;font-size:inherit;font-weight:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{font-weight:700;opacity:.7}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:var(--ck-spacing-small);margin-right:calc(var(--ck-spacing-small)*-1)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-on-active-shadow)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-action-active-shadow)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/button.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/mixins/_button.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AAQA,6BCCC,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6BD,CE/BC,qDACC,aAqBD,CAHC,oBAnBD,qDAoBE,YAEF,CADC,CFvBF,6BAOC,kBAAmB,CADnB,mBAAoB,CAEpB,oBAAqB,CAHrB,iBA4BD,CAvBC,iEACC,YACD,CAGC,yGACC,oBACD,CAID,iFACC,sBACD,CEkBA,iEAEC,SAAU,CADV,kBAED,CAbA,yFACC,YACD,CC7BD,6BCAC,oDD0ID,CCvIE,6EACC,0DACD,CAEA,+EACC,2DAA4C,CAC5C,uEACD,CAID,qDACC,6DACD,CDhBD,6BEDC,eF2ID,CA1IA,wIEGE,qCFuIF,CA1IA,6BA6BC,uBAAwB,CANxB,4BAA6B,CAjB7B,cAAe,CAcf,iBAAkB,CAHlB,aAAc,CAJd,4CAA6C,CAD7C,2CAA4C,CAJ5C,8BAA+B,CAC/B,iBAAkB,CAiBlB,4DAA8D,CAnB9D,qBAAsB,CAFtB,kBAqID,CA3GC,oFGhCA,2BAA2B,CCF3B,2CAA8B,CDC9B,YHqCA,CAIC,kJAEC,aACD,CAGD,iEAIC,aAAc,CACd,cAAe,CAHf,iBAAkB,CAClB,mBAAoB,CAMpB,qBASD,CAlBA,qFAYE,eAMF,CAlBA,qFAgBE,gBAEF,CAEA,yEACC,aAYD,CAbA,6FAIE,mCASF,CAbA,6FAQE,oCAKF,CAbA,yEAWC,eAAiB,CACjB,UACD,CAIC,oIIrFD,oDJyFC,CAOA,gLKhGD,kCLkGC,CAEA,iGACC,UACD,CAGD,qEACC,yDAcD,CAXC,2HAEE,4CAA+C,CAC/C,oCAOF,CAVA,2HAQE,mCAAoC,CADpC,6CAGF,CAKA,mHACC,WACD,CAID,yCC/HA,+CDiIA,CC9HC,yFACC,qDACD,CAEA,2FACC,sDAA4C,CAC5C,kEACD,CAID,iEACC,wDACD,CDmHA,2DACC,iCACD,CAEA,+DACC,mCACD,CAID,2CC7IC,mDDkJD,CC/IE,2FACC,yDACD,CAEA,6FACC,0DAA4C,CAC5C,sEACD,CAID,mEACC,4DACD,CD6HD,2CAIC,wCACD,CAEA,uCAEC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n@import "../tooltip/mixins/_tooltip.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-unselectable;\n\t@mixin ck-tooltip_enabled;\n\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: left;\n\n\t& .ck-button__label {\n\t\tdisplay: none;\n\t}\n\n\t&.ck-button_with-text {\n\t\t& .ck-button__label {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n\n\t/* Center the icon horizontally in a button without text. */\n\t&:not(.ck-button_with-text) {\n\t\tjustify-content: center;\n\t}\n\n\t&:hover {\n\t\t@mixin ck-tooltip_visible;\n\t}\n\n\t/* Get rid of the native focus outline around the tooltip when focused (but not :hover). */\n\t&:focus:not(:hover) {\n\t\t@mixin ck-tooltip_disabled;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../mixins/_button.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-button-colors --ck-color-button-default;\n\t@mixin ck-rounded-corners;\n\n\twhite-space: nowrap;\n\tcursor: default;\n\tvertical-align: middle;\n\tpadding: var(--ck-spacing-tiny);\n\ttext-align: center;\n\n\t/* A very important piece of styling. Go to variable declaration to learn more. */\n\tmin-width: var(--ck-ui-component-min-height);\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Normalize the height of the line. Removing this will break consistent height\n\tamong text and text-less buttons (with icons). */\n\tline-height: 1;\n\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t/* Avoid flickering when the foucs border shows up. */\n\tborder: 1px solid transparent;\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .2s ease-in-out, border .2s ease-in-out;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/189 */\n\t-webkit-appearance: none;\n\n\t&:active,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t/* Allow icon coloring using the text "color" property. */\n\t& .ck-button__icon {\n\t\t& use,\n\t\t& use * {\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\n\t& .ck-button__label {\n\t\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\t\tfont-size: inherit;\n\t\tfont-weight: inherit;\n\t\tcolor: inherit;\n\t\tcursor: inherit;\n\n\t\t/* Must be consistent with .ck-icon\'s vertical align. Otherwise, buttons with and\n\t\twithout labels (but with icons) have different sizes in Chrome */\n\t\tvertical-align: middle;\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& .ck-button__keystroke {\n\t\tcolor: inherit;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t}\n\n\t\tfont-weight: bold;\n\t\topacity: .7;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t&.ck-disabled {\n\t\t&:active,\n\t\t&:focus {\n\t\t\t/* The disabled button should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t\t& .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t& .ck-button__keystroke {\n\t\t\topacity: .3;\n\t\t}\n\t}\n\n\t&.ck-button_with-text {\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-standard);\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-button_with-keystroke {\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__label {\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t/* A style of the button which is currently on, e.g. its feature is active. */\n\t&.ck-on {\n\t\t@mixin ck-button-colors --ck-color-button-on;\n\t}\n\n\t&.ck-button-save {\n\t\tcolor: var(--ck-color-button-save);\n\t}\n\n\t&.ck-button-cancel {\n\t\tcolor: var(--ck-color-button-cancel);\n\t}\n}\n\n/* A style of the button which handles the primary action. */\n.ck.ck-button-action,\na.ck.ck-button-action {\n\t@mixin ck-button-colors --ck-color-button-action;\n\n\tcolor: var(--ck-color-button-action-text);\n}\n\n.ck.ck-button-bold,\na.ck.ck-button-bold {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements a button of given background color.\n *\n * @param {String} $background - Background color of the button.\n * @param {String} $border - Border color of the button.\n */\n@define-mixin ck-button-colors $prefix {\n\tbackground: var($(prefix)-background);\n\n\t&:not(.ck-disabled) {\n\t\t&:hover {\n\t\t\tbackground: var($(prefix)-hover-background);\n\t\t}\n\n\t\t&:active {\n\t\t\tbackground: var($(prefix)-active-background);\n\t\t\tbox-shadow: inset 0 2px 2px var($(prefix)-active-shadow);\n\t\t}\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t&.ck-disabled {\n\t\tbackground: var($(prefix)-disabled-background);\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},9681:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:1.0769230769em;--ck-switch-button-toggle-spacing:1px;--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - var(--ck-switch-button-toggle-spacing)*2)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{background:var(--ck-color-switch-button-off-background);transition:background .4s ease;width:var(--ck-switch-button-toggle-width)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(var(--ck-border-radius)*.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{background:var(--ck-color-switch-button-inner-background);height:var(--ck-switch-button-toggle-inner-size);margin:var(--ck-switch-button-toggle-spacing);transition:all .3s ease;width:var(--ck-switch-button-toggle-inner-size)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var( --ck-switch-button-translation ))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(var( --ck-switch-button-translation )*-1))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/switchbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AASE,4HACC,aACD,CCCF,MAEC,8CAA+C,CAE/C,mDAAoD,CACpD,qCAAsC,CACtC,gKAKD,CAGC,0DAGE,4CAOF,CAVA,0DAQE,2CAEF,CAEA,iDC3BA,eDoEA,CAzCA,yICvBC,qCDgED,CAzCA,2DAKE,gBAoCF,CAzCA,2DAUE,iBA+BF,CAzCA,iDAiBC,uDAAwD,CAHxD,8BAAiC,CAEjC,0CAyBD,CAtBC,2EC9CD,eD2DC,CAbA,6LC1CA,qCAAsC,CD4CpC,8CAWF,CAbA,2EASC,yDAA0D,CAD1D,gDAAiD,CAFjD,6CAA8C,CAM9C,uBAA0B,CAL1B,+CAMD,CAEA,uDACC,6DAKD,CAHC,iFACC,+DACD,CAIF,6DExEA,kCF0EA,CAEA,uDACC,sDAkBD,CAhBC,6DACC,4DACD,CAEA,2FAKE,2DAMF,CAXA,2FASE,oEAEF",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__toggle {\n\t\tdisplay: block;\n\n\t\t& .ck-button__toggle__inner {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/* Note: To avoid rendering issues (aliasing) but to preserve the responsive nature\nof the component, floating–point numbers have been used which, for the default font size\n(see: --ck-font-size-base), will generate simple integers. */\n:root {\n\t/* 34px at 13px font-size */\n\t--ck-switch-button-toggle-width: 2.6153846154em;\n\t/* 14px at 13px font-size */\n\t--ck-switch-button-toggle-inner-size: 1.0769230769em;\n\t--ck-switch-button-toggle-spacing: 1px;\n\t--ck-switch-button-translation: calc(\n\t\tvar(--ck-switch-button-toggle-width) -\n\t\tvar(--ck-switch-button-toggle-inner-size) -\n\t\t2 * var(--ck-switch-button-toggle-spacing)\n\t);\n}\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__label {\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-right: calc(2 * var(--ck-spacing-large));\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-left: calc(2 * var(--ck-spacing-large));\n\t\t}\n\t}\n\n\t& .ck-button__toggle {\n\t\t@mixin ck-rounded-corners;\n\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Make sure the toggle is always to the right as far as possible. */\n\t\t\tmargin-left: auto;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Make sure the toggle is always to the left as far as possible. */\n\t\t\tmargin-right: auto;\n\t\t}\n\n\t\t/* Gently animate the background color of the toggle switch */\n\t\ttransition: background 400ms ease;\n\n\t\twidth: var(--ck-switch-button-toggle-width);\n\t\tbackground: var(--ck-color-switch-button-off-background);\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: calc(.5 * var(--ck-border-radius));\n\t\t\t}\n\n\t\t\t/* Leave some tiny bit of space around the inner part of the switch */\n\t\t\tmargin: var(--ck-switch-button-toggle-spacing);\n\t\t\twidth: var(--ck-switch-button-toggle-inner-size);\n\t\t\theight: var(--ck-switch-button-toggle-inner-size);\n\t\t\tbackground: var(--ck-color-switch-button-inner-background);\n\n\t\t\t/* Gently animate the inner part of the toggle switch */\n\t\t\ttransition: all 300ms ease;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-off-hover-background);\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\tbox-shadow: 0 0 0 5px var(--ck-color-switch-button-inner-shadow);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-button__toggle {\n\t\t@mixin ck-disabled;\n\t}\n\n\t&.ck-on .ck-button__toggle {\n\t\tbackground: var(--ck-color-switch-button-on-background);\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-on-hover-background);\n\t\t}\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t/*\n\t\t\t * Move the toggle switch to the right. It will be animated.\n\t\t\t */\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\ttransform: translateX( var( --ck-switch-button-translation ) );\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\ttransform: translateX( calc( -1 * var( --ck-switch-button-translation ) ) );\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},4923:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#000}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{border:0;height:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;width:var(--ck-color-grid-tile-size)}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-table__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{color:var(--ck-color-color-grid-check-icon);display:none}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorgrid/colorgrid.css"],names:[],mappings:"AAKA,kBACC,YACD,CCAA,MACC,8BAA+B,CAK/B,qCACD,CAEA,kBACC,YAAa,CACb,WACD,CAEA,wBAOC,QAAS,CALT,qCAAsC,CAEtC,yCAA0C,CAD1C,wCAAyC,CAEzC,SAAU,CACV,8BAA+B,CAL/B,oCAyCD,CAjCC,oCACC,YAAa,CACb,gBACD,CAEA,4DACC,gDACD,CAEA,oCAEC,2CAA4C,CAD5C,YAED,CAEA,8BACC,8FAKD,CAHC,0CACC,aACD,CAGD,8HAIC,QACD,CAEA,gGAEC,iGACD,CAGD,yBACC,oCACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-color-grid {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-grid-tile-size: 24px;\n\n\t/* Not using global colors here because these may change but some colors in a pallette\n\t * require special treatment. For instance, this ensures no matter what the UI text color is,\n\t * the check icon will look good on the black color tile. */\n\t--ck-color-color-grid-check-icon: hsl(0, 0%, 0%);\n}\n\n.ck.ck-color-grid {\n\tgrid-gap: 5px;\n\tpadding: 8px;\n}\n\n.ck.ck-color-grid__tile {\n\twidth: var(--ck-color-grid-tile-size);\n\theight: var(--ck-color-grid-tile-size);\n\tmin-width: var(--ck-color-grid-tile-size);\n\tmin-height: var(--ck-color-grid-tile-size);\n\tpadding: 0;\n\ttransition: .2s ease box-shadow;\n\tborder: 0;\n\n\t&.ck-disabled {\n\t\tcursor: unset;\n\t\ttransition: unset;\n\t}\n\n\t&.ck-color-table__color-tile_bordered {\n\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\tdisplay: none;\n\t\tcolor: var(--ck-color-color-grid-check-icon);\n\t}\n\n\t&.ck-on {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-base-text);\n\n\t\t& .ck.ck-icon {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t&.ck-on,\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\t/* Disable the default .ck-button\'s border ring. */\n\t\tborder: 0;\n\t}\n\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\n\t}\n}\n\n.ck.ck-color-grid__label {\n\tpadding: 0 var(--ck-spacing-standard);\n}\n'],sourceRoot:""}]);const a=s},3488:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-dropdown-max-width:75vw}.ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on .ck-tooltip{display:none}.ck.ck-dropdown .ck-dropdown__panel{-webkit-backface-visibility:hidden;display:none;max-width:var(--ck-dropdown-max-width);position:absolute;z-index:var(--ck-z-modal)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{bottom:auto;top:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-modal) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{margin-left:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{overflow:hidden;text-overflow:ellipsis;width:7em}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;box-shadow:var(--ck-drop-shadow),0 0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/dropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,MACC,4BACD,CAEA,gBACC,oBAAqB,CACrB,iBAqFD,CAnFC,oCACC,mBAAoB,CACpB,2BACD,CAGA,+CACC,UAOD,CCUA,iEACC,YACD,CDVA,oCAGC,kCAAmC,CAEnC,YAAa,CAEb,sCAAuC,CAEvC,iBAAkB,CAHlB,yBA4DD,CAvDC,+DACC,oBACD,CAEA,mSAKC,WACD,CAEA,mSAUC,WAAY,CADZ,QAED,CAEA,oHAEC,MACD,CAEA,oHAEC,OACD,CAEA,kHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAQF,mCACC,mCACD,CEhGA,MACC,sDACD,CAEA,gBAEC,iBA2ED,CAzEC,oCACC,mCACD,CAGC,8CAIC,sCAAuC,CAHvC,gCAID,CAIA,8CACC,+BAAgC,CAGhC,oCACD,CAGD,gDC/BA,kCDiCA,CAIE,mFAEC,oCACD,CAIA,mFAEC,qCACD,CAID,iEAEC,eAAgB,CAChB,sBAAuB,CAFvB,SAGD,CAGA,6EC1DD,kCD4DC,CAGA,qDACC,2BAA4B,CAC5B,4BACD,CAEA,sGACC,UACD,CAGA,yHAEC,eAKD,CAHC,qIE7EF,2CF+EE,CAKH,uBGlFC,eH8GD,CA5BA,qFG9EE,qCH0GF,CA5BA,uBAIC,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CE1FT,oCAA8B,CF6F9B,cAmBD,CAfC,6CACC,wBACD,CAEA,6CACC,yBACD,CAEA,6CACC,2BACD,CAEA,6CACC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import \"../tooltip/mixins/_tooltip.css\";\n\n:root {\n\t--ck-dropdown-max-width: 75vw;\n}\n\n.ck.ck-dropdown {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t& .ck-dropdown__arrow {\n\t\tpointer-events: none;\n\t\tz-index: var(--ck-z-default);\n\t}\n\n\t/* Dropdown button should span horizontally, e.g. in vertical toolbars */\n\t& .ck-button.ck-dropdown__button {\n\t\twidth: 100%;\n\n\t\t/* Disable main button's tooltip when the dropdown is open. Otherwise the panel may\n\t\tpartially cover the tooltip */\n\t\t&.ck-on {\n\t\t\t@mixin ck-tooltip_disabled;\n\t\t}\n\t}\n\n\t& .ck-dropdown__panel {\n\t\t/* This is to get rid of flickering when the tooltip is shown under the panel,\n\t\twhich looks like the panel moves vertically a pixel down and up. */\n\t\t-webkit-backface-visibility: hidden;\n\n\t\tdisplay: none;\n\t\tz-index: var(--ck-z-modal);\n\t\tmax-width: var(--ck-dropdown-max-width);\n\n\t\tposition: absolute;\n\n\t\t&.ck-dropdown__panel-visible {\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_n,\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_nme {\n\t\t\tbottom: 100%;\n\t\t}\n\n\t\t&.ck-dropdown__panel_se,\n\t\t&.ck-dropdown__panel_sw,\n\t\t&.ck-dropdown__panel_smw,\n\t\t&.ck-dropdown__panel_sme,\n\t\t&.ck-dropdown__panel_s {\n\t\t\t/*\n\t\t\t * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays.\n\t\t\t * See https://github.com/ckeditor/ckeditor5/issues/1053.\n\t\t\t */\n\t\t\ttop: 100%;\n\t\t\tbottom: auto;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_se {\n\t\t\tleft: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_sw {\n\t\t\tright: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_s,\n\t\t&.ck-dropdown__panel_n {\n\t\t\t/* Positioning panels relative to the center of the button */\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_smw {\n\t\t\t/* Positioning panels relative to the middle-west of the button */\n\t\t\tleft: 75%;\n\t\t\ttransform: translateX(-75%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nme,\n\t\t&.ck-dropdown__panel_sme {\n\t\t\t/* Positioning panels relative to the middle-east of the button */\n\t\t\tleft: 25%;\n\t\t\ttransform: translateX(-25%);\n\t\t}\n\t}\n}\n\n/*\n * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content.\n * See https://github.com/ckeditor/ckeditor5/issues/7874\n */\n.ck.ck-toolbar .ck-dropdown__panel {\n\tz-index: calc( var(--ck-z-modal) + 1 );\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-dropdown-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-dropdown {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-dropdown__arrow {\n\t\twidth: var(--ck-dropdown-arrow-size);\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-dropdown__arrow {\n\t\t\tright: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-dropdown__arrow {\n\t\t\tleft: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-dropdown__arrow {\n\t\t@mixin ck-disabled;\n\t}\n\n\t& .ck-button.ck-dropdown__button {\n\t\t@mixin ck-dir ltr {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t/* #23 */\n\t\t& .ck-button__label {\n\t\t\twidth: 7em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t\t&.ck-disabled .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/816 */\n\t\t&.ck-on {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t&.ck-dropdown__button_label-width_auto .ck-button__label {\n\t\t\twidth: auto;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/8699 */\n\t\t&.ck-off:active,\n\t\t&.ck-on:active {\n\t\t\tbox-shadow: none;\n\t\t\t\n\t\t\t&:focus {\n\t\t\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-dropdown__panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tbackground: var(--ck-color-dropdown-panel-background);\n\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\tbottom: 0;\n\n\t/* Make sure the panel is at least as wide as the drop-down\'s button. */\n\tmin-width: 100%;\n\n\t/* Disabled corner border radius to be consistent with the .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-dropdown__panel_se {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_sw {\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_ne {\n\t\tborder-bottom-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_nw {\n\t\tborder-bottom-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},6875:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-dropdown .ck-dropdown__panel .ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list,.ck.ck-dropdown .ck-dropdown__panel .ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/listdropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,6CCIC,eDqBD,CAzBA,iICQE,qCAAsC,CDJtC,wBAqBF,CAfE,mFCND,eDYC,CANA,6MCFA,qCAAsC,CDKpC,2BAA4B,CAC5B,4BAA6B,CAF7B,wBAIF,CAEA,kFCdD,eDmBC,CALA,2MCVA,qCAAsC,CDYpC,wBAAyB,CACzB,yBAEF",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-dropdown .ck-dropdown__panel .ck-list {\n\t/* Disabled radius of top-left border to be consistent with .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t/* Make sure the button belonging to the first/last child of the list goes well with the\n\tborder radius of the entire panel. */\n\t& .ck-list__item {\n\t\t&:first-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\n\t\t&:last-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},66:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button .ck-tooltip{display:none}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-right-radius:unset;border-top-right-radius:unset}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-left-radius:unset;border-top-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-left-radius:unset;border-top-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-right-radius:unset;border-top-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{background-color:var(--ck-color-split-button-hover-border);content:"";height:100%;position:absolute;width:1px}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{left:-1px}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{right:-1px}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/mixins/_tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/splitbutton.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,mBAEC,iBAUD,CARC,iDACC,qCACD,CC0BA,8DACC,YACD,CClCD,MACC,gDAAyD,CACzD,4CACD,CAMC,oIAKE,gCAAiC,CADjC,6BASF,CAbA,oIAWE,+BAAgC,CADhC,4BAGF,CAEA,0CAGC,eAiBD,CApBA,oDAQE,+BAAgC,CADhC,4BAaF,CApBA,oDAcE,gCAAiC,CADjC,6BAOF,CAHC,8CACC,mCACD,CASA,0KACC,wDACD,CAIA,8JAKC,0DAA2D,CAJ3D,UAAW,CAGX,WAAY,CAFZ,iBAAkB,CAClB,SAGD,CAGC,kLACC,SACD,CAIA,kLACC,UACD,CAMF,uCC7EA,eDuFA,CAVA,qHCzEC,qCDmFD,CARE,qKACC,2BACD,CAEA,mKACC,4BACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../tooltip/mixins/_tooltip.css";\n\n.ck.ck-splitbutton {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-splitbutton__action:focus {\n\t\tz-index: calc(var(--ck-z-default) + 1);\n\t}\n\n\t/* Disable tooltips for the buttons when the button is "open" */\n\t&.ck-splitbutton_open > .ck-button {\n\t\t@mixin ck-tooltip_disabled;\n\t}\n}\n\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Enables the tooltip, which is the tooltip is in DOM but\n * not yet displayed.\n */\n@define-mixin ck-tooltip_enabled {\n\t& .ck-tooltip {\n\t\tdisplay: block;\n\n\t\t/*\n\t\t * Don't display tooltips in devices which don't support :hover.\n\t\t * In fact, it's all about iOS, which forces user to click UI elements twice to execute\n\t\t * the primary action, when tooltips are enabled.\n\t\t *\n\t\t * Q: OK, but why not the following query?\n\t\t *\n\t\t * @media (hover) {\n\t\t * display: block;\n\t\t * }\n\t\t *\n\t\t * A: Because FF does not support it and it would completely disable tooltips\n\t\t * in that browser.\n\t\t *\n\t\t * More in https://github.com/ckeditor/ckeditor5/issues/920.\n\t\t */\n\t\t@media (hover:none) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/**\n * Disables the tooltip making it disappear from DOM.\n */\n@define-mixin ck-tooltip_disabled {\n\t& .ck-tooltip {\n\t\tdisplay: none;\n\t}\n}\n\n/**\n * Shows the tooltip, which is already in DOM.\n * Requires `ck-tooltip_enabled` first.\n */\n@define-mixin ck-tooltip_visible {\n\t& .ck-tooltip {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-split-button-hover-background: hsl(0, 0%, 92%);\n\t--ck-color-split-button-hover-border: hsl(0, 0%, 70%);\n}\n\n.ck.ck-splitbutton {\n\t/*\n\t * Note: ck-rounded and ck-dir mixins don\'t go together (because they both use @nest).\n\t */\n\t&:hover > .ck-splitbutton__action,\n\t&.ck-splitbutton_open > .ck-splitbutton__action {\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the action button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the action button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\t}\n\n\t& > .ck-splitbutton__arrow {\n\t\t/* It\'s a text-less button and since the icon is positioned absolutely in such situation,\n\t\tit must get some arbitrary min-width. */\n\t\tmin-width: unset;\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the arrow button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the arrow button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t& svg {\n\t\t\twidth: var(--ck-dropdown-arrow-size);\n\t\t}\n\t}\n\n\t/* When the split button is "open" (the arrow is on) or being hovered, it should get some styling\n\tas a whole. The background of both buttons should stand out and there should be a visual\n\tseparation between both buttons. */\n\t&.ck-splitbutton_open,\n\t&:hover {\n\t\t/* When the split button hovered as a whole, not as individual buttons. */\n\t\t& > .ck-button:not(.ck-on):not(.ck-disabled):not(:hover) {\n\t\t\tbackground: var(--ck-color-split-button-hover-background);\n\t\t}\n\n\t\t/* Splitbutton separator needs to be set with the ::after pseudoselector\n\t\tto display properly the borders on focus */\n\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\tcontent: \'\';\n\t\t\tposition: absolute;\n\t\t\twidth: 1px;\n\t\t\theight: 100%;\n\t\t\tbackground-color: var(--ck-color-split-button-hover-border);\n\t\t}\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\t\tleft: -1px;\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\t\tright: -1px;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Don\'t round the bottom left and right corners of the buttons when "open"\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-splitbutton_open {\n\t\t@mixin ck-rounded-corners {\n\t\t\t& > .ck-splitbutton__action {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t& > .ck-splitbutton__arrow {\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},5075:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{max-width:var(--ck-toolbar-dropdown-max-width);width:max-content}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/toolbardropdown.css"],names:[],mappings:"AAKA,MACC,oCACD,CAEA,4CAGC,8CAA+C,CAD/C,iBAQD,CAJE,6DACC,qCACD,CCZF,oCACC,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-dropdown-max-width: 60vw;\n}\n\n.ck.ck-toolbar-dropdown > .ck-dropdown__panel {\n\t/* https://github.com/ckeditor/ckeditor5/issues/5586 */\n\twidth: max-content;\n\tmax-width: var(--ck-toolbar-dropdown-max-width);\n\n\t& .ck-button {\n\t\t&:focus {\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-toolbar-dropdown .ck-toolbar {\n\tborder: 0;\n}\n"],sourceRoot:""}]);const a=s},4547:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable.ck-rounded-corners:not(.ck-editor__nested-editable){border-radius:var(--ck-border-radius)}.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable){border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck.ck-editor__editable_inline{border:1px solid transparent;overflow:auto;padding:0 var(--ck-spacing-standard)}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-base-foreground)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-base-foreground)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/editorui.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAWA,MACC,0CACD,CAEA,yDCJC,eDWD,CAPA,yJCAE,qCDOF,CAJC,oEEPA,2BAA2B,CCF3B,qCAA8B,CDC9B,YFWA,CAGD,+BAGC,4BAA6B,CAF7B,aAAc,CACd,oCA6BD,CA1BC,wCACC,eACD,CAEA,wCACC,gBACD,CAGA,4CACC,kCACD,CAGA,2CAKC,qCACD,CAGA,sDACC,kDACD,CAKA,gEACC,mDACD,CAIA,gEACC,gDACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_focus.css";\n@import "../../mixins/_button.css";\n\n:root {\n\t--ck-color-editable-blur-selection: hsl(0, 0%, 85%);\n}\n\n.ck.ck-editor__editable:not(.ck-editor__nested-editable) {\n\t@mixin ck-rounded-corners;\n\n\t&.ck-focused {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\t}\n}\n\n.ck.ck-editor__editable_inline {\n\toverflow: auto;\n\tpadding: 0 var(--ck-spacing-standard);\n\tborder: 1px solid transparent;\n\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/116 */\n\t& > *:first-child {\n\t\tmargin-top: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/847 */\n\t& > *:last-child {\n\t\t/*\n\t\t * This value should match with the default margins of the block elements (like .media or .image)\n\t\t * to avoid a content jumping when the fake selection container shows up (See https://github.com/ckeditor/ckeditor5/issues/9825).\n\t\t */\n\t\tmargin-bottom: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/6517 */\n\t&.ck-blurred ::selection {\n\t\tbackground: var(--ck-color-editable-blur-selection);\n\t}\n}\n\n/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/111 */\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_n"] {\n\t&::after {\n\t\tborder-bottom-color: var(--ck-color-base-foreground);\n\t}\n}\n\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_s"] {\n\t&::after {\n\t\tborder-top-color: var(--ck-color-base-foreground);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},5523:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-form__header{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{border-bottom:1px solid var(--ck-color-base-border);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);padding:var(--ck-spacing-small) var(--ck-spacing-large)}.ck.ck-form__header .ck-form__header__label{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/formheader/formheader.css"],names:[],mappings:"AAKA,oBAIC,kBAAmB,CAHnB,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CAEjB,6BACD,CCNA,MACC,4BACD,CAEA,oBAIC,mDAAoD,CAFpD,mCAAoC,CACpC,wCAAyC,CAFzC,uDAQD,CAHC,4CACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-form-header-height: 38px;\n}\n\n.ck.ck-form__header {\n\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\n\theight: var(--ck-form-header-height);\n\tline-height: var(--ck-form-header-height);\n\tborder-bottom: 1px solid var(--ck-color-base-border);\n\n\t& .ck-form__header__label {\n\t\tfont-weight: bold;\n\t}\n}\n"],sourceRoot:""}]);const a=s},1174:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{font-size:.8333350694em;height:var(--ck-icon-size);width:var(--ck-icon-size);will-change:transform}.ck.ck-icon,.ck.ck-icon *{color:inherit;cursor:inherit}.ck.ck-icon :not([fill]){fill:currentColor}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/icon/icon.css"],names:[],mappings:"AAKA,YACC,qBACD,CCFA,MACC,0EACD,CAEA,YAKC,uBAAwB,CAHxB,0BAA2B,CAD3B,yBAA0B,CAY1B,qBAcD,CAZC,0BARA,aAAc,CAGd,cAgBA,CAJC,yBAEC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-icon {\n\tvertical-align: middle;\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-icon-size: calc(var(--ck-line-height-base) * var(--ck-font-size-normal));\n}\n\n.ck.ck-icon {\n\twidth: var(--ck-icon-size);\n\theight: var(--ck-icon-size);\n\n\t/* Multiplied by the height of the line in "px" should give SVG "viewport" dimensions */\n\tfont-size: .8333350694em;\n\n\tcolor: inherit;\n\n\t/* Inherit cursor style (#5). */\n\tcursor: inherit;\n\n\t/* This will prevent blurry icons on Firefox. See #340. */\n\twill-change: transform;\n\n\t& * {\n\t\t/* Inherit cursor style (#5). */\n\t\tcursor: inherit;\n\n\t\t/* Allows dynamic coloring of the icons. */\n\t\tcolor: inherit;\n\n\t\t&:not([fill]) {\n\t\t\t/* Needed by FF. */\n\t\t\tfill: currentColor;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},6985:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-input-width:18em;--ck-input-text-width:var(--ck-input-width)}.ck.ck-input{border-radius:0}.ck-rounded-corners .ck.ck-input,.ck.ck-input.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);min-height:var(--ck-ui-component-min-height);min-width:var(--ck-input-width);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-input[readonly]{background:var(--ck-color-input-disabled-background);border:1px solid var(--ck-color-input-disabled-border);color:var(--ck-color-input-disabled-text)}.ck.ck-input[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input.ck-error{animation:ck-input-shake .3s ease both;border-color:var(--ck-color-input-error-border)}.ck.ck-input.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/input/input.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AASA,MACC,qBAAsB,CAGtB,2CACD,CAEA,aCLC,eD2CD,CAtCA,iECDE,qCDuCF,CAtCA,aAGC,2CAA4C,CAC5C,6CAA8C,CAK9C,4CAA6C,CAH7C,+BAAgC,CADhC,6DAA8D,CAO9D,4DA0BD,CAxBC,mBEnBA,2BAA2B,CCF3B,2CAA8B,CDC9B,YFuBA,CAEA,uBAEC,oDAAqD,CADrD,sDAAuD,CAEvD,yCAMD,CAJC,6BG/BD,oDHkCC,CAGD,sBAEC,sCAAuC,CADvC,+CAMD,CAHC,4BGzCD,iDH2CC,CAIF,0BACC,IACC,0BACD,CAEA,IACC,yBACD,CAEA,IACC,0BACD,CAEA,IACC,yBACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-input-width: 18em;\n\n\t/* Backward compatibility. */\n\t--ck-input-text-width: var(--ck-input-width);\n}\n\n.ck.ck-input {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-input-background);\n\tborder: 1px solid var(--ck-color-input-border);\n\tpadding: var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);\n\tmin-width: var(--ck-input-width);\n\n\t/* This is important to stay of the same height as surrounding buttons */\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .1s ease-in-out, border .1s ease-in-out;\n\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t&[readonly] {\n\t\tborder: 1px solid var(--ck-color-input-disabled-border);\n\t\tbackground: var(--ck-color-input-disabled-background);\n\t\tcolor: var(--ck-color-input-disabled-text);\n\n\t\t&:focus {\n\t\t\t/* The read-only input should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\tborder-color: var(--ck-color-input-error-border);\n\t\tanimation: ck-input-shake .3s ease both;\n\n\t\t&:focus {\n\t\t\t@mixin ck-box-shadow var(--ck-focus-error-outer-shadow);\n\t\t}\n\t}\n}\n\n@keyframes ck-input-shake {\n\t20% {\n\t\ttransform: translateX(-2px);\n\t}\n\n\t40% {\n\t\ttransform: translateX(2px);\n\t}\n\n\t60% {\n\t\ttransform: translateX(-1px);\n\t}\n\n\t80% {\n\t\ttransform: translateX(1px);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},2751:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/label/label.css"],names:[],mappings:"AAKA,aACC,aACD,CAEA,mBACC,YACD,CCNA,aACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tdisplay: block;\n}\n\n.ck.ck-voice-label {\n\tdisplay: none;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tfont-weight: bold;\n}\n"],sourceRoot:""}]);const a=s},8111:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{background:var(--ck-color-labeled-field-label-background);font-weight:400;line-height:normal;max-width:100%;overflow:hidden;padding:0 calc(var(--ck-font-size-tiny)*.5);pointer-events:none;text-overflow:ellipsis;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);transform-origin:0 0;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-spacing-medium),calc(var(--ck-font-size-base)*.6)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-spacing-medium)*-1),calc(var(--ck-font-size-base)*.6)) scale(1)}.ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{background:transparent;max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/labeledfield/labeledfieldview.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAMC,mEACC,YAAa,CACb,iBACD,CAEA,uCACC,aAAc,CACd,iBACD,CCND,MACC,kEAAsE,CACtE,gFAAiF,CACjF,yEACD,CAEA,0BCHC,eD4GD,CAzGA,2FCCE,qCDwGF,CAtGC,mEACC,UAmCD,CAjCC,gFACC,KA+BD,CAhCA,0FAIE,MA4BF,CAhCA,0FAQE,OAwBF,CAhCA,gFAiBC,yDAA0D,CAG1D,eAAmB,CADnB,kBAAoB,CAOpB,cAAe,CAFf,eAAgB,CANhB,2CAA8C,CAP9C,mBAAoB,CAYpB,sBAAuB,CARvB,6DAA+D,CAH/D,oBAAqB,CAgBrB,+JAID,CAQA,mKACC,gCACD,CAGD,yDACC,mCAAoC,CACpC,kCAAmC,CAInC,kBAKD,CAHC,6FACC,gCACD,CAID,4OAEC,yCACD,CAIA,oUAGE,wFAYF,CAfA,oUAOE,iGAQF,CAfA,gTAaC,sBAAuB,CAFvB,iEAAkE,CAGlE,SACD,CAKA,8FACC,sBACD,CAGA,yIACC,SACD,CAGA,kMACC,8HACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-labeled-field-view {\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\tdisplay: flex;\n\t\tposition: relative;\n\t}\n\n\t& .ck.ck-label {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-labeled-field-view-transition: .1s cubic-bezier(0, 0, 0.24, 0.95);\n\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-spacing-medium);\n\t--ck-color-labeled-field-label-background: var(--ck-color-base-background);\n}\n\n.ck.ck-labeled-field-view {\n\t@mixin ck-rounded-corners;\n\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\twidth: 100%;\n\n\t\t& > .ck.ck-label {\n\t\t\ttop: 0px;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tleft: 0px;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tright: 0px;\n\t\t\t}\n\n\t\t\tpointer-events: none;\n\t\t\ttransform-origin: 0 0;\n\n\t\t\t/* By default, display the label scaled down above the field. */\n\t\t\ttransform: translate(var(--ck-spacing-medium), -6px) scale(.75);\n\n\t\t\tbackground: var(--ck-color-labeled-field-label-background);\n\t\t\tpadding: 0 calc(.5 * var(--ck-font-size-tiny));\n\t\t\tline-height: initial;\n\t\t\tfont-weight: normal;\n\n\t\t\t/* Prevent overflow when the label is longer than the input */\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\n\t\t\tmax-width: 100%;\n\n\t\t\ttransition:\n\t\t\t\ttransform var(--ck-labeled-field-view-transition),\n\t\t\t\tpadding var(--ck-labeled-field-view-transition),\n\t\t\t\tbackground var(--ck-labeled-field-view-transition);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\t& > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\n\t\t& .ck-input:not([readonly]) + .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t& .ck-labeled-field-view__status {\n\t\tfont-size: var(--ck-font-size-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\n\t\t/* Let the info wrap to the next line to avoid stretching the layout horizontally.\n\t\tThe status could be very long. */\n\t\twhite-space: normal;\n\n\t\t&.ck-labeled-field-view__status_error {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t/* Disabled fields and fields that have no focus should fade out. */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\tcolor: var(--ck-color-input-disabled-text);\n\t}\n\n\t/* Fields that are disabled or not focused and without a placeholder should have full-sized labels. */\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-disabled.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t@mixin ck-dir ltr {\n\t\t\ttransform: translate(var(--ck-spacing-medium), calc(0.6 * var(--ck-font-size-base))) scale(1);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttransform: translate(calc(-1 * var(--ck-spacing-medium)), calc(0.6 * var(--ck-font-size-base))) scale(1);\n\t\t}\n\n\t\t/* Compensate for the default translate position. */\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width));\n\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t}\n\n\t/*------ DropdownView integration ----------------------------------------------------------------------------------- */\n\n\t/* Make sure dropdown\' background color in any of dropdown\'s state does not collide with labeled field. */\n\t& > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck.ck-button {\n\t\tbackground: transparent;\n\t}\n\n\t/* When the dropdown is "empty", the labeled field label replaces its label. */\n\t&.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck-button > .ck-button__label {\n\t\topacity: 0;\n\t}\n\n\t/* Make sure the label of the empty, unfocused input does not cover the dropdown arrow. */\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown + .ck-label {\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard));\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},1162:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-list{display:flex;flex-direction:column;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{background:var(--ck-color-list-background);list-style-type:none}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{border-radius:0;min-height:unset;padding:calc(var(--ck-line-height-base)*.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*.4*var(--ck-font-size-base));text-align:left;width:100%}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(var(--ck-line-height-base)*1.2*var(--ck-font-size-base))}.ck.ck-list__item .ck-button:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item .ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item .ck-button.ck-on:focus:not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item .ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item .ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item .ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck.ck-list__separator{background:var(--ck-color-base-border);height:1px;width:100%}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/list/list.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,YAGC,YAAa,CACb,qBAAsB,CCFtB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBDaD,CAZC,2DAEC,aACD,CAKA,kCACC,iBAAkB,CAClB,2BACD,CEfD,YCEC,eDGD,CALA,+DCME,qCDDF,CALA,YAIC,0CAA2C,CAD3C,oBAED,CAEA,kBACC,cAAe,CACf,cA2DD,CAzDC,6BAIC,eAAgB,CAHhB,gBAAiB,CAQjB,iIAEiE,CARjE,eAAgB,CADhB,UAwCD,CA7BC,+CAEC,yEACD,CAEA,oCACC,eACD,CAEA,mCACC,oDAAqD,CACrD,yCAaD,CAXC,0CACC,eACD,CAEA,2DACC,0DACD,CAEA,2DACC,4CACD,CAGD,qDACC,uDACD,CAMA,yCACC,0CAA2C,CAC3C,aAMD,CAJC,iEACC,uDAAwD,CACxD,aACD,CAKH,uBAGC,sCAAuC,CAFvC,UAAW,CACX,UAED",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-list {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t& .ck-list__item,\n\t& .ck-list__separator {\n\t\tdisplay: block;\n\t}\n\n\t/* Make sure that whatever child of the list item gets focus, it remains on the\n\ttop. Thanks to that, styles like box-shadow, outline, etc. are not masked by\n\tadjacent list items. */\n\t& .ck-list__item > *:focus {\n\t\tposition: relative;\n\t\tz-index: var(--ck-z-default);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-list {\n\t@mixin ck-rounded-corners;\n\n\tlist-style-type: none;\n\tbackground: var(--ck-color-list-background);\n}\n\n.ck.ck-list__item {\n\tcursor: default;\n\tmin-width: 12em;\n\n\t& .ck-button {\n\t\tmin-height: unset;\n\t\twidth: 100%;\n\t\ttext-align: left;\n\t\tborder-radius: 0;\n\n\t\t/* List items should have the same height. Use absolute units to make sure it is so\n\t\t because e.g. different heading styles may have different height\n\t\t https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\tpadding:\n\t\t\tcalc(.2 * var(--ck-line-height-base) * var(--ck-font-size-base))\n\t\t\tcalc(.4 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\n\t\t& .ck-button__label {\n\t\t\t/* https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\t\tline-height: calc(1.2 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-button-on-background);\n\t\t\tcolor: var(--ck-color-list-button-on-text);\n\n\t\t\t&:active {\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-on-background-focus);\n\t\t\t}\n\n\t\t\t&:focus:not(.ck-disabled) {\n\t\t\t\tborder-color: var(--ck-color-base-background);\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(.ck-disabled) {\n\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t}\n\t}\n\n\t/* It\'s unnecessary to change the background/text of a switch toggle; it has different ways\n\tof conveying its state (like the switcher) */\n\t& .ck-switchbutton {\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-background);\n\t\t\tcolor: inherit;\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-list__separator {\n\theight: 1px;\n\twidth: 100%;\n\tbackground: var(--ck-color-base-border);\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},8245:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-modal)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);box-shadow:var(--ck-drop-shadow),0 0;min-height:15px}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{border-style:solid;height:0;width:0}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-width:0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_n]:before{border-color:transparent transparent var(--ck-color-panel-border) transparent}.ck.ck-balloon-panel[class*=arrow_n]:after{border-color:transparent transparent var(--ck-color-panel-background) transparent;margin-top:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-width:var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-color:var(--ck-color-panel-border) transparent transparent;filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow))}.ck.ck-balloon-panel[class*=arrow_s]:after{border-color:var(--ck-color-panel-background) transparent transparent transparent;margin-bottom:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);right:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%;top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonpanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MAEC,8DACD,CAEA,qBACC,YAAa,CACb,iBAAkB,CAElB,yBAyCD,CAtCE,+GAEC,UAAW,CACX,iBACD,CAEA,wDACC,6CACD,CAEA,uDACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAGD,8CACC,aACD,CC9CD,MACC,6BAA8B,CAC9B,8BAA+B,CAC/B,iCAAkC,CAClC,oEACD,CAEA,qBCJC,eD4ID,CAxIA,iFCAE,qCDwIF,CAxIA,qBAMC,2CAA4C,CAC5C,6CAA8C,CEb9C,oCAA8B,CFU9B,eAoID,CA9HE,+GAIC,kBAAmB,CADnB,QAAS,CADT,OAGD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EACD,CAEA,2CACC,iFAAkF,CAClF,yCACD,CAIA,uFAEC,mHACD,CAEA,4CACC,iEAAkE,CAClE,uDACD,CAEA,2CACC,iFAAkF,CAClF,4CACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,2CACD,CAIA,2GAEC,+CAAkD,CAClD,2CACD,CAIA,2GAEC,gDAAmD,CACnD,2CACD,CAIA,yGAIC,8CAAiD,CAFjD,QAAS,CACT,uDAED,CAIA,2GAGC,8CAAiD,CADjD,+CAED,CAIA,2GAGC,8CAAiD,CADjD,gDAED,CAIA,6GAIC,8CAAiD,CADjD,uDAA0D,CAD1D,SAGD,CAIA,6GAIC,8CAAiD,CAFjD,QAAS,CACT,sDAED,CAIA,6GAGC,uDAA0D,CAD1D,SAAU,CAEV,2CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,2CACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Make sure the balloon arrow does not float over its children. */\n\t--ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3);\n}\n\n.ck.ck-balloon-panel {\n\tdisplay: none;\n\tposition: absolute;\n\n\tz-index: var(--ck-z-modal);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_visible {\n\t\tdisplay: block;\n\t}\n}\n','/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-arrow-offset: 2px;\n\t--ck-balloon-arrow-height: 10px;\n\t--ck-balloon-arrow-half-width: 8px;\n\t--ck-balloon-arrow-drop-shadow: 0 2px 2px var(--ck-color-shadow-drop);\n}\n\n.ck.ck-balloon-panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-style: solid;\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-border) transparent;\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-background) transparent;\n\t\t\tmargin-top: var(--ck-balloon-arrow-offset);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: var(--ck-color-panel-border) transparent transparent;\n\t\t\tfilter: drop-shadow(var(--ck-balloon-arrow-drop-shadow));\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: var(--ck-color-panel-background) transparent transparent transparent;\n\t\t\tmargin-bottom: var(--ck-balloon-arrow-offset);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_n {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_ne {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_s {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_se {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_smw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nmw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},1757:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-balloon-rotator__navigation{align-items:center;display:flex;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-bottom:var(--ck-spacing-small);margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-left:var(--ck-spacing-small);margin-right:var(--ck-spacing-standard)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonrotator.css"],names:[],mappings:"AAKA,oCAEC,kBAAmB,CADnB,YAAa,CAEb,sBACD,CAKA,6CACC,sBACD,CCXA,oCACC,6CAA8C,CAC9C,sDAAuD,CACvD,iCAgBD,CAbC,sCAGC,qCAAsC,CAFtC,oCAAqC,CACrC,kCAED,CAGA,iEAIC,mCAAoC,CAHpC,uCAID,CAMA,2DACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Buttons inside a toolbar should be centered when rotator bar is wider.\n * See: https://github.com/ckeditor/ckeditor5-ui/issues/495\n */\n.ck .ck-balloon-rotator__content .ck-toolbar {\n\tjustify-content: center;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tbackground: var(--ck-color-toolbar-background);\n\tborder-bottom: 1px solid var(--ck-color-toolbar-border);\n\tpadding: 0 var(--ck-spacing-small);\n\n\t/* Let's keep similar appearance to `ck-toolbar`. */\n\t& > * {\n\t\tmargin-right: var(--ck-spacing-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t/* Gives counter more breath than buttons. */\n\t& .ck-balloon-rotator__counter {\n\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t/* We need to use smaller margin because of previous button's right margin. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n.ck .ck-balloon-rotator__content {\n\n\t/* Disable default annotation shadow inside rotator with fake panels. */\n\t& .ck.ck-annotation-wrapper {\n\t\tbox-shadow: none;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3553:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-modal) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);box-shadow:var(--ck-drop-shadow),0 0;height:100%;min-height:15px;width:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/fakepanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,mBACC,iBAAkB,CAGlB,mCACD,CAEA,uBACC,iBACD,CAEA,mCACC,SACD,CAEA,oCACC,SACD,CCfA,MACC,6CAA8C,CAC9C,2CACD,CAGA,uBAKC,2CAA4C,CAC5C,6CAA8C,CAC9C,qCAAsC,CCXtC,oCAA8B,CDc9B,WAAY,CAPZ,eAAgB,CAMhB,UAED,CAEA,mCACC,0DAA2D,CAC3D,uDACD,CAEA,oCACC,kEAAqE,CACrE,+DACD,CACA,oCACC,kEAAqE,CACrE,+DACD,CAGA,yIAGC,4CACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-fake-panel {\n\tposition: absolute;\n\n\t/* Fake panels should be placed under main balloon content. */\n\tz-index: calc(var(--ck-z-modal) - 1);\n}\n\n.ck .ck-fake-panel div {\n\tposition: absolute;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tz-index: 2;\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tz-index: 1;\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-fake-panel-offset-horizontal: 6px;\n\t--ck-balloon-fake-panel-offset-vertical: 6px;\n}\n\n/* Let\'s use `.ck-balloon-panel` appearance. See: balloonpanel.css. */\n.ck .ck-fake-panel div {\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\tborder-radius: var(--ck-border-radius);\n\n\twidth: 100%;\n\theight: 100%;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tmargin-left: var(--ck-balloon-fake-panel-offset-horizontal);\n\tmargin-top: var(--ck-balloon-fake-panel-offset-vertical);\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 2);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 2);\n}\n.ck .ck-fake-panel div:nth-child( 3 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 3);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 3);\n}\n\n/* If balloon is positioned above element, we need to move fake panel to the top. */\n.ck .ck-balloon-panel_arrow_s + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_se + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_sw + .ck-fake-panel {\n\t--ck-balloon-fake-panel-offset-vertical: -6px;\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},3609:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{position:fixed;top:0;z-index:var(--ck-z-modal)}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{position:absolute;top:auto}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{border-top-left-radius:0;border-top-right-radius:0;border-width:0 1px 1px;box-shadow:var(--ck-drop-shadow),0 0}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/stickypanel.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAMC,qDAEC,cAAe,CACf,KAAM,CAFN,yBAGD,CAEA,kEAEC,iBAAkB,CADlB,QAED,CCPA,qDAIC,wBAAyB,CACzB,yBAA0B,CAF1B,sBAAuB,CCFxB,oCDKA",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\tz-index: var(--ck-z-modal); /* #315 */\n\t\tposition: fixed;\n\t\ttop: 0;\n\t}\n\n\t& .ck-sticky-panel__content_sticky_bottom-limit {\n\t\ttop: auto;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\t@mixin ck-drop-shadow;\n\n\t\tborder-width: 0 1px 1px;\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},1590:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck-vertical-form .ck-button:after{bottom:var(--ck-spacing-small);content:"";position:absolute;right:-1px;top:var(--ck-spacing-small);width:0;z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:var(--ck-spacing-small);content:"";position:absolute;right:-1px;top:var(--ck-spacing-small);width:0;z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-width)*.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border:0;border-radius:0;border-top:1px solid var(--ck-color-base-border);margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css"],names:[],mappings:"AAOA,mCAMC,8BAA+B,CAL/B,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,2BAA4B,CAH5B,OAAQ,CAKR,SACD,CCTC,oCDaC,wCAMC,8BAA+B,CAL/B,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,2BAA4B,CAH5B,OAAQ,CAKR,SACD,CCnBD,CCAD,qDACC,kDACD,CAEA,uBACC,+BAkED,CAhEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,oCA6CF,CA3CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAID,iGAMC,QAAS,CADT,eAAgB,CAEhB,gDAAiD,CAJjD,kCAAmC,CADnC,kCAkBD,CApBA,0OAcE,aAMF,CAGC,yMACC,kDACD,CDpEF",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck-vertical-form .ck-button::after {\n\tcontent: "";\n\twidth: 0;\n\tposition: absolute;\n\tright: -1px;\n\ttop: var(--ck-spacing-small);\n\tbottom: var(--ck-spacing-small);\n\tz-index: 1;\n}\n\n.ck.ck-responsive-form {\n\t@mixin ck-media-phone {\n\t\t& .ck-button::after {\n\t\t\tcontent: "";\n\t\t\twidth: 0;\n\t\t\tposition: absolute;\n\t\t\tright: -1px;\n\t\t\ttop: var(--ck-spacing-small);\n\t\t\tbottom: var(--ck-spacing-small);\n\t\t\tz-index: 1;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\n\tborder-right: 1px solid var(--ck-color-base-border);\n}\n\n.ck.ck-responsive-form {\n\tpadding: var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& > :not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& > :not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tpadding: 0;\n\t\twidth: calc(.8 * var(--ck-input-width));\n\n\t\t& .ck-labeled-field-view {\n\t\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\n\n\t\t\t& .ck-input-text {\n\t\t\t\tmin-width: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t/* Let the long error messages wrap in the narrow form. */\n\t\t\t& .ck-labeled-field-view__error {\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\t\t}\n\n\t\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\n\t\t& > .ck-button:nth-last-child(1),\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\tpadding: var(--ck-spacing-standard);\n\t\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t\tborder-radius: 0;\n\t\t\tborder: 0;\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\t&::after {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},6706:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/blocktoolbar.css"],names:[],mappings:"AAKA,4BACC,iBAAkB,CAClB,2BACD,CCHA,MACC,oDAAqD,CACrD,yDACD,CAEA,4BACC,0CAA2C,CAC3C,sCACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-block-toolbar-button {\n\tposition: absolute;\n\tz-index: var(--ck-z-default);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-block-toolbar-button: var(--ck-color-text);\n\t--ck-block-toolbar-button-size: var(--ck-font-size-normal);\n}\n\n.ck.ck-block-toolbar-button {\n\tcolor: var(--ck-color-block-toolbar-button);\n\tfont-size: var(--ck-block-toolbar-size);\n}\n"],sourceRoot:""}]);const a=s},5571:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck.ck-toolbar{align-items:center;display:flex;flex-flow:row nowrap;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-toolbar>.ck-toolbar__items{align-items:center;display:flex;flex-flow:row wrap;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar .ck-toolbar__line-break{flex-basis:100%}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);border:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;background:var(--ck-color-toolbar-border);margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);min-width:1px;width:1px}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{border:0;border-radius:0;margin:0;width:100%}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=rtl]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=ltr]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/toolbar.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,eAKC,kBAAmB,CAFnB,YAAa,CACb,oBAAqB,CCFrB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6CD,CA3CC,kCAGC,kBAAmB,CAFnB,YAAa,CACb,kBAAmB,CAEnB,WAED,CAEA,yCACC,oBAWD,CAJC,yGAEC,YACD,CAGD,uCACC,eACD,CAEA,sDACC,gBACD,CAEA,sDACC,qBACD,CAEA,sDACC,gBACD,CAGC,yFACC,YACD,CE/CF,eCGC,eD0FD,CA7FA,qECOE,qCDsFF,CA7FA,eAGC,6CAA8C,CAE9C,+CAAgD,CADhD,iCAyFD,CAtFC,yCACC,kBAAmB,CAGnB,yCAA0C,CAO1C,qCAAsC,CADtC,kCAAmC,CAPnC,aAAc,CADd,SAUD,CAEA,uCACC,QACD,CAGC,gEAEC,oCACD,CAIA,kEACC,YACD,CAGD,gHAIC,qCAAsC,CADtC,kCAED,CAEA,mCAEC,SAgBD,CAbC,0DAWC,QAAS,CAHT,eAAgB,CAHhB,QAAS,CAHT,UAUD,CAGD,kCAEC,SAWD,CATC,uDAEC,QAMD,CAHC,yFACC,eACD,CASD,kFACC,mCACD,CAvFF,qCA2FE,QAEF,CAYC,+FACC,cACD,CAEA,iJAEC,mCACD,CAEA,qHACC,aACD,CAIC,6JAEC,2BAA4B,CAD5B,wBAED,CAGA,2JAEC,4BAA6B,CAD7B,yBAED,CASD,8RACC,mCACD,CAWA,qHACC,cACD,CAIC,6JAEC,4BAA6B,CAD7B,yBAED,CAGA,2JAEC,2BAA4B,CAD5B,wBAED,CASD,8RACC,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-flow: row nowrap;\n\talign-items: center;\n\n\t& > .ck-toolbar__items {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\talign-items: center;\n\t\tflex-grow: 1;\n\n\t}\n\n\t& .ck.ck-toolbar__separator {\n\t\tdisplay: inline-block;\n\n\t\t/*\n\t\t * A leading or trailing separator makes no sense (separates from nothing on one side).\n\t\t * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and\n\t\t * moved to another toolbar in the dropdown.\n\t\t */\n\t\t&:first-child,\n\t\t&:last-child {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\tflex-basis: 100%;\n\t}\n\n\t&.ck-toolbar_grouping > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.ck-toolbar_vertical > .ck-toolbar__items {\n\t\tflex-direction: column;\n\t}\n\n\t&.ck-toolbar_floating > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t& > .ck-dropdown__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-toolbar-background);\n\tpadding: 0 var(--ck-spacing-small);\n\tborder: 1px solid var(--ck-color-toolbar-border);\n\n\t& .ck.ck-toolbar__separator {\n\t\talign-self: stretch;\n\t\twidth: 1px;\n\t\tmin-width: 1px;\n\t\tbackground: var(--ck-color-toolbar-border);\n\n\t\t/*\n\t\t * These margins make the separators look better in balloon toolbars (when aligned with the "tip").\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/7493.\n\t\t */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\theight: 0;\n\t}\n\n\t& > .ck-toolbar__items {\n\t\t& > *:not(.ck-toolbar__line-break) {\n\t\t\t/* (#11) Separate toolbar items. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\n\t\t/* Don\'t display a separator after an empty items container, for instance,\n\t\twhen all items were grouped */\n\t\t&:empty + .ck.ck-toolbar__separator {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& > .ck-toolbar__items > *:not(.ck-toolbar__line-break),\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/* Make sure items wrapped to the next line have v-spacing */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t&.ck-toolbar_vertical {\n\t\t/* Items in a vertical toolbar span the entire width. */\n\t\tpadding: 0;\n\n\t\t/* Specificity matters here. See https://github.com/ckeditor/ckeditor5-theme-lark/issues/168. */\n\t\t& > .ck-toolbar__items > .ck {\n\t\t\t/* Items in a vertical toolbar should span the horizontal space. */\n\t\t\twidth: 100%;\n\n\t\t\t/* Items in a vertical toolbar should have no margin. */\n\t\t\tmargin: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so rounded corners are pointless. */\n\t\t\tborder-radius: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so any border is pointless. */\n\t\t\tborder: 0;\n\t\t}\n\t}\n\n\t&.ck-toolbar_compact {\n\t\t/* No spacing around items. */\n\t\tpadding: 0;\n\n\t\t& > .ck-toolbar__items > * {\n\t\t\t/* Compact toolbar items have no spacing between them. */\n\t\t\tmargin: 0;\n\n\t\t\t/* "Middle" children should have no rounded corners. */\n\t\t\t&:not(:first-child):not(:last-child) {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/*\n\t\t * Dropdown button has asymmetric padding to fit the arrow.\n\t\t * This button has no arrow so let\'s revert that padding back to normal.\n\t\t */\n\t\t& > .ck.ck-button.ck-dropdown__button {\n\t\t\tpadding-left: var(--ck-spacing-tiny);\n\t\t}\n\t}\n\n\t@nest .ck-toolbar-container & {\n\t\tborder: 0;\n\t}\n}\n\n/* stylelint-disable */\n\n/*\n * Styles for RTL toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="rtl"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="rtl"] {\n\t& > .ck-toolbar__items > .ck {\n\t\tmargin-right: 0;\n\t}\n\n\t&:not(.ck-toolbar_compact) > .ck-toolbar__items > .ck {\n\t\t/* (#11) Separate toolbar items. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-left: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n/*\n * Styles for LTR toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="ltr"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="ltr"] {\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-right: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n}\n\n/* stylelint-enable */\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},9948:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck.ck-tooltip,.ck.ck-tooltip .ck-tooltip__text:after{-webkit-backface-visibility:hidden;pointer-events:none;position:absolute}.ck.ck-tooltip{display:none;opacity:0;visibility:hidden;z-index:var(--ck-z-modal)}.ck.ck-tooltip .ck-tooltip__text{display:inline-block}.ck.ck-tooltip .ck-tooltip__text:after{content:"";height:0;width:0}:root{--ck-tooltip-arrow-size:5px}.ck.ck-tooltip{left:50%;top:0;transition:opacity .2s ease-in-out .2s}.ck.ck-tooltip .ck-tooltip__text{border-radius:0}.ck-rounded-corners .ck.ck-tooltip .ck-tooltip__text,.ck.ck-tooltip .ck-tooltip__text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-tooltip .ck-tooltip__text{background:var(--ck-color-tooltip-background);color:var(--ck-color-tooltip-text);font-size:.9em;left:-50%;line-height:1.5;padding:var(--ck-spacing-small) var(--ck-spacing-medium);position:relative}.ck.ck-tooltip .ck-tooltip__text:after{border-style:solid;left:50%;transition:opacity .2s ease-in-out .2s}.ck.ck-tooltip.ck-tooltip_s,.ck.ck-tooltip.ck-tooltip_se,.ck.ck-tooltip.ck-tooltip_sw{bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(100%)}.ck.ck-tooltip.ck-tooltip_s .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after,.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{border-color:transparent transparent var(--ck-color-tooltip-background) transparent;border-width:0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);top:calc(var(--ck-tooltip-arrow-size)*-1 + 1px);transform:translateX(-50%)}.ck.ck-tooltip.ck-tooltip_sw{left:auto;right:50%}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text{left:auto;right:calc(var(--ck-tooltip-arrow-size)*-2)}.ck.ck-tooltip.ck-tooltip_sw .ck-tooltip__text:after{left:auto;right:0}.ck.ck-tooltip.ck-tooltip_se{left:50%;right:auto}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text{left:calc(var(--ck-tooltip-arrow-size)*-2);right:auto}.ck.ck-tooltip.ck-tooltip_se .ck-tooltip__text:after{left:0;right:auto;transform:translateX(50%)}.ck.ck-tooltip.ck-tooltip_n{top:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateY(-100%)}.ck.ck-tooltip.ck-tooltip_n .ck-tooltip__text:after{border-color:var(--ck-color-tooltip-background) transparent transparent transparent;border-width:var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size);bottom:calc(var(--ck-tooltip-arrow-size)*-1);transform:translateX(-50%)}.ck.ck-tooltip.ck-tooltip_e{left:calc(100% + var(--ck-tooltip-arrow-size));top:50%}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_e .ck-tooltip__text:after{border-color:transparent var(--ck-color-tooltip-background) transparent transparent;border-width:var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0;left:calc(var(--ck-tooltip-arrow-size)*-1);top:calc(50% - var(--ck-tooltip-arrow-size)*1)}.ck.ck-tooltip.ck-tooltip_w{left:auto;right:calc(100% + var(--ck-tooltip-arrow-size));top:50%}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text{left:0;transform:translateY(-50%)}.ck.ck-tooltip.ck-tooltip_w .ck-tooltip__text:after{border-color:transparent transparent transparent var(--ck-color-tooltip-background);border-width:var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);left:100%;top:calc(50% - var(--ck-tooltip-arrow-size)*1)}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/tooltip/tooltip.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,sDASC,kCAAmC,CAJnC,mBAAoB,CAHpB,iBAQD,CAEA,eAIC,YAAa,CADb,SAAU,CADV,iBAAkB,CAGlB,yBAWD,CATC,iCACC,oBAOD,CALC,uCACC,UAAW,CAEX,QAAS,CADT,OAED,CCxBF,MACC,2BACD,CAEA,eACC,QAAS,CAMT,KAAM,CAON,sCAwKD,CAtKC,iCChBA,eDqCA,CArBA,yGCZC,qCDiCD,CArBA,iCAOC,6CAA8C,CAF9C,kCAAmC,CAFnC,cAAe,CAMf,SAAU,CALV,eAAgB,CAEhB,wDAAyD,CAEzD,iBAaD,CAVC,uCAOC,kBAAmB,CACnB,QAAS,CAFT,sCAGD,CAYD,sFAGC,4CAA+C,CAC/C,0BASD,CAPC,8JAIC,mFAAoF,CACpF,qGAAsG,CAHtG,+CAAkD,CAClD,0BAGD,CAaD,6BAEC,SAAU,CADV,SAYD,CATC,+CACC,SAAU,CACV,2CACD,CAEA,qDACC,SAAU,CACV,OACD,CAYD,6BACC,QAAS,CACT,UAYD,CAVC,+CAEC,0CAA8C,CAD9C,UAED,CAEA,qDAEC,MAAO,CADP,UAAW,CAEX,yBACD,CAYD,4BACC,yCAA4C,CAC5C,2BAQD,CANC,oDAGC,mFAAoF,CACpF,qGAAsG,CAHtG,4CAA+C,CAC/C,0BAGD,CAUD,4BACC,8CAA+C,CAC/C,OAaD,CAXC,8CACC,MAAO,CACP,0BAQD,CANC,oDAGC,mFAAoF,CACpF,qGAAsG,CAHtG,0CAA6C,CAC7C,8CAGD,CAWF,4BAEC,SAAU,CADV,+CAAgD,CAEhD,OAaD,CAXC,8CACC,MAAO,CACP,0BAQD,CANC,oDAGC,mFAAoF,CACpF,qGAAsG,CAHtG,SAAU,CACV,8CAGD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-tooltip,\n.ck.ck-tooltip .ck-tooltip__text::after {\n\tposition: absolute;\n\n\t/* Without this, hovering the tooltip could keep it visible. */\n\tpointer-events: none;\n\n\t/* This is to get rid of flickering when transitioning opacity in Chrome.\n\tIt\'s weird but it works. */\n\t-webkit-backface-visibility: hidden;\n}\n\n.ck.ck-tooltip {\n\t/* Tooltip is hidden by default. */\n\tvisibility: hidden;\n\topacity: 0;\n\tdisplay: none;\n\tz-index: var(--ck-z-modal);\n\n\t& .ck-tooltip__text {\n\t\tdisplay: inline-block;\n\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-tooltip-arrow-size: 5px;\n}\n\n.ck.ck-tooltip {\n\tleft: 50%;\n\n\t/*\n\t * Prevent blurry tooltips in LoDPI environments.\n\t * See https://github.com/ckeditor/ckeditor5/issues/1802.\n\t */\n\ttop: 0;\n\n\t/*\n\t * For the transition to work, the tooltip must be controlled\n\t * using visibility+opacity. A delay prevents a "tooltip avalanche"\n\t * i.e. when scanning the toolbar with mouse cursor.\n\t */\n\ttransition: opacity .2s ease-in-out .2s;\n\n\t& .ck-tooltip__text {\n\t\t@mixin ck-rounded-corners;\n\n\t\tfont-size: .9em;\n\t\tline-height: 1.5;\n\t\tcolor: var(--ck-color-tooltip-text);\n\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\tbackground: var(--ck-color-tooltip-background);\n\t\tposition: relative;\n\t\tleft: -50%;\n\n\t\t&::after {\n\t\t\t/*\n\t\t\t * For the transition to work, the tooltip must be controlled\n\t\t\t * using visibility+opacity. A delay prevents a "tooltip avalanche"\n\t\t\t * i.e. when scanning the toolbar with mouse cursor.\n\t\t\t */\n\t\t\ttransition: opacity .2s ease-in-out .2s;\n\t\t\tborder-style: solid;\n\t\t\tleft: 50%;\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\t&.ck-tooltip_s,\n\t&.ck-tooltip_sw,\n\t&.ck-tooltip_se {\n\t\tbottom: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\ttransform: translateY( 100% );\n\n\t\t& .ck-tooltip__text::after {\n\t\t\t/* 1px addresses gliches in rendering causing gap between the triangle and the text */\n\t\t\ttop: calc(-1 * var(--ck-tooltip-arrow-size) + 1px);\n\t\t\ttransform: translateX( -50% );\n\t\t\tborder-color: transparent transparent var(--ck-color-tooltip-background) transparent;\n\t\t\tborder-width: 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south-west of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\n\t&.ck-tooltip_sw {\n\t\tright: 50%;\n\t\tleft: auto;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: auto;\n\t\t\tright: calc( -2 * var(--ck-tooltip-arrow-size));\n\t\t}\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip south-east of the element.\n\t *\n\t * [element]\n\t * ^\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t */\n\t&.ck-tooltip_se {\n\t\tleft: 50%;\n\t\tright: auto;\n\n\t\t& .ck-tooltip__text {\n\t\t\tright: auto;\n\t\t\tleft: calc( -2 * var(--ck-tooltip-arrow-size));\n\t\t}\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tright: auto;\n\t\t\tleft: 0;\n\t\t\ttransform: translateX( 50% );\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip north of the element.\n\t *\n\t * +-----------+\n\t * | Tooltip |\n\t * +-----------+\n\t * V\n\t * [element]\n\t */\n\t&.ck-tooltip_n {\n\t\ttop: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\ttransform: translateY( -100% );\n\n\t\t& .ck-tooltip__text::after {\n\t\t\tbottom: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\t\ttransform: translateX( -50% );\n\t\t\tborder-color: var(--ck-color-tooltip-background) transparent transparent transparent;\n\t\t\tborder-width: var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size);\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip east of the element.\n\t *\n\t * +----------+\n\t * [element] < | east |\n\t * +----------+\n\t */\n\t&.ck-tooltip_e {\n\t\tleft: calc(100% + var(--ck-tooltip-arrow-size));\n\t\ttop: 50%;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: 0;\n\t\t\ttransform: translateY( -50% );\n\n\t\t\t&::after {\n\t\t\t\tleft: calc(-1 * var(--ck-tooltip-arrow-size));\n\t\t\t\ttop: calc(50% - 1 * var(--ck-tooltip-arrow-size));\n\t\t\t\tborder-color: transparent var(--ck-color-tooltip-background) transparent transparent;\n\t\t\t\tborder-width: var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size) 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A class that displays the tooltip west of the element.\n\t *\n\t * +----------+\n\t * | west | > [element]\n\t * +----------+\n\t */\n\t&.ck-tooltip_w {\n\t\tright: calc(100% + var(--ck-tooltip-arrow-size));\n\t\tleft: auto;\n\t\ttop: 50%;\n\n\t\t& .ck-tooltip__text {\n\t\t\tleft: 0;\n\t\t\ttransform: translateY( -50% );\n\n\t\t\t&::after {\n\t\t\t\tleft: 100%;\n\t\t\t\ttop: calc(50% - 1 * var(--ck-tooltip-arrow-size));\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-color-tooltip-background);\n\t\t\t\tborder-width: var(--ck-tooltip-arrow-size) 0 var(--ck-tooltip-arrow-size) var(--ck-tooltip-arrow-size);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},6150:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck-hidden{display:none!important}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{box-sizing:border-box;height:auto;position:static;width:auto}:root{--ck-z-default:1;--ck-z-modal:calc(var(--ck-z-default) + 999)}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#c4c4c4;--ck-color-base-action:#61b045;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#198cf0;--ck-color-base-active-focus:#0e7fe1;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:208,79%,51%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#bcdefb;--ck-color-focus-disabled-shadow:rgba(119,186,248,.3);--ck-color-focus-error-shadow:rgba(255,64,31,.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,.15);--ck-color-shadow-drop-active:rgba(0,0,0,.2);--ck-color-shadow-inner:rgba(0,0,0,.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#e6e6e6;--ck-color-button-default-active-background:#d9d9d9;--ck-color-button-default-active-shadow:#bfbfbf;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#dedede;--ck-color-button-on-hover-background:#c4c4c4;--ck-color-button-on-active-background:#bababa;--ck-color-button-on-active-shadow:#a1a1a1;--ck-color-button-on-disabled-background:#dedede;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#579e3d;--ck-color-button-action-active-background:#53973b;--ck-color-button-action-active-shadow:#498433;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#b0b0b0;--ck-color-switch-button-off-hover-background:#a3a3a3;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#579e3d;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:#c7c7c7;--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:#c7c7c7;--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-base-active);--ck-color-list-button-on-background-focus:var(--ck-color-base-active-focus);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-foreground);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,176,255,.1);--ck-color-link-fake-selection:rgba(31,176,255,.3);--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{word-wrap:break-word;background:transparent;border:0;margin:0;padding:0;text-decoration:none;transition:none;vertical-align:middle}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset_all{border-collapse:collapse;color:var(--ck-color-text);cursor:auto;float:none;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);text-align:left;white-space:nowrap}.ck-reset_all .ck-rtl :not(.ck-reset_all-excluded *){text-align:right}.ck-reset_all iframe:not(.ck-reset_all-excluded *){vertical-align:inherit}.ck-reset_all textarea:not(.ck-reset_all-excluded *){white-space:pre-wrap}.ck-reset_all input[type=password]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text]:not(.ck-reset_all-excluded *),.ck-reset_all textarea:not(.ck-reset_all-excluded *){cursor:text}.ck-reset_all input[type=password][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all textarea[disabled]:not(.ck-reset_all-excluded *){cursor:default}.ck-reset_all fieldset:not(.ck-reset_all-excluded *){border:2px groove #dfdee3;padding:10px}.ck-reset_all button:not(.ck-reset_all-excluded *)::-moz-focus-inner{border:0;padding:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css","webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_colors.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_disabled.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_fonts.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_reset.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_rounded.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_shadow.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_spacing.css"],names:[],mappings:"AAQA,WAGC,sBACD,CCPA,2EAGC,qBAAsB,CAEtB,WAAY,CACZ,eAAgB,CAFhB,UAGD,CCPA,MACC,gBAAiB,CACjB,4CACD,CCAA,oDAEC,yBACD,CCNA,MACC,kCAAmD,CACnD,+BAAoD,CACpD,8BAAgD,CAChD,8BAAmD,CACnD,6BAAmD,CACnD,yBAA+C,CAC/C,8BAAmD,CACnD,oCAAuD,CACvD,6BAAkD,CAIlD,+CAAwD,CACxD,qEAA+E,CAC/E,qCAAwD,CACxD,qDAA8D,CAC9D,gDAAyD,CACzD,yCAAqD,CACrD,sCAAsD,CACtD,4CAA0D,CAC1D,sCAAsD,CAItD,gDAAuD,CACvD,kDAA+D,CAC/D,mDAAgE,CAChE,+CAA6D,CAC7D,yDAA8D,CAE9D,uCAAuD,CACvD,6CAA4D,CAC5D,8CAA4D,CAC5D,0CAAyD,CACzD,gDAA8D,CAE9D,+DAAsE,CACtE,iDAAkE,CAClE,kDAAkE,CAClE,8CAA+D,CAC/D,oDAAoE,CACpE,6DAAsE,CAEtE,8BAAoD,CACpD,gCAAqD,CAErD,+CAA4D,CAC5D,qDAAiE,CACjE,+EAAqF,CACrF,oDAAmE,CACnE,yEAA8E,CAC9E,oDAAgE,CAIhE,oEAA2E,CAC3E,4DAAoE,CAIpE,2DAAoE,CACpE,+BAAiD,CACjD,wDAAgE,CAChE,+CAA0D,CAC1D,4CAA2D,CAC3D,wCAAwD,CACxD,sCAAsD,CAItD,0DAAmE,CACnE,uFAA6F,CAC7F,gEAAuE,CACvE,4EAAiF,CACjF,8DAAsE,CAItE,2DAAoE,CACpE,mDAA6D,CAI7D,6DAAsE,CACtE,qDAA+D,CAI/D,uDAAgE,CAChE,uDAAiE,CAIjE,0CAAyD,CAIzD,wCAA2D,CAI3D,+BAAoD,CACpD,uDAAmE,CACnE,kDAAgE,CCpGhE,wBAAyB,CCAzB,0CAA2C,CAK3C,gGAAiG,CAKjG,4GAA6G,CAK7G,sGAAuG,CAKvG,sDAAuD,CCvBvD,wBAAyB,CACzB,6BAA8B,CAC9B,wDAA6D,CAE7D,yBAA0B,CAC1B,2BAA4B,CAC5B,yBAA0B,CAC1B,wBAAyB,CACzB,0BAA2B,CCJ3B,kCJoGD,CI9FA,2EAaC,oBAAqB,CANrB,sBAAuB,CADvB,QAAS,CAFT,QAAS,CACT,SAAU,CAGV,oBAAqB,CAErB,eAAgB,CADhB,qBAKD,CAKA,8DAGC,wBAAyB,CAEzB,0BAA2B,CAG3B,WAAY,CACZ,UAAW,CALX,iGAAkG,CAElG,eAAgB,CAChB,kBAGD,CAGC,qDACC,gBACD,CAEA,mDAEC,sBACD,CAEA,qDACC,oBACD,CAEA,mLAGC,WACD,CAEA,iNAGC,cACD,CAEA,qDAEC,yBAAoC,CADpC,YAED,CAEA,qEAGC,QAAQ,CADR,SAED,CAMD,8BAEC,gBACD,CCnFA,MACC,sBAAuB,CCAvB,gEAAiE,CAKjE,0DAA2D,CAK3D,wEAAyE,CCbzE,uBAA8B,CAC9B,mDAA2D,CAC3D,4CAAkD,CAClD,oDAA4D,CAC5D,mDAA2D,CAC3D,kDAA2D,CAC3D,yDFFD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which hides an element in DOM.\n */\n.ck-hidden {\n\t/* Override selector specificity. Otherwise, all elements with some display\n\tstyle defined will override this one, which is not a desired result. */\n\tdisplay: none !important;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\tbox-sizing: border-box;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-z-default: 1;\n\t--ck-z-modal: calc( var(--ck-z-default) + 999 );\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class that disables all transitions of the element and its children.\n */\n.ck-transitions-disabled,\n.ck-transitions-disabled * {\n\ttransition: none !important;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-base-foreground: \t\t\t\t\t\t\t\thsl(0, 0%, 98%);\n\t--ck-color-base-background: \t\t\t\t\t\t\t\thsl(0, 0%, 100%);\n\t--ck-color-base-border: \t\t\t\t\t\t\t\t\thsl(0, 0%, 77%);\n\t--ck-color-base-action: \t\t\t\t\t\t\t\t\thsl(104, 44%, 48%);\n\t--ck-color-base-focus: \t\t\t\t\t\t\t\t\t\thsl(209, 92%, 70%);\n\t--ck-color-base-text: \t\t\t\t\t\t\t\t\t\thsl(0, 0%, 20%);\n\t--ck-color-base-active: \t\t\t\t\t\t\t\t\thsl(208, 88%, 52%);\n\t--ck-color-base-active-focus:\t\t\t\t\t\t\t\thsl(208, 88%, 47%);\n\t--ck-color-base-error:\t\t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t/* -- Generic colors ------------------------------------------------------------------------ */\n\n\t--ck-color-focus-border-coordinates: \t\t\t\t\t\t208, 79%, 51%;\n\t--ck-color-focus-border: \t\t\t\t\t\t\t\t\thsl(var(--ck-color-focus-border-coordinates));\n\t--ck-color-focus-outer-shadow:\t\t\t\t\t\t\t\thsl(207, 89%, 86%);\n\t--ck-color-focus-disabled-shadow:\t\t\t\t\t\t\thsla(209, 90%, 72%,.3);\n\t--ck-color-focus-error-shadow:\t\t\t\t\t\t\t\thsla(9,100%,56%,.3);\n\t--ck-color-text: \t\t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-shadow-drop: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.15);\n\t--ck-color-shadow-drop-active:\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.2);\n\t--ck-color-shadow-inner: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Buttons ------------------------------------------------------------------------------- */\n\n\t--ck-color-button-default-background: \t\t\t\t\t\ttransparent;\n\t--ck-color-button-default-hover-background: \t\t\t\thsl(0, 0%, 90%);\n\t--ck-color-button-default-active-background: \t\t\t\thsl(0, 0%, 85%);\n\t--ck-color-button-default-active-shadow: \t\t\t\t\thsl(0, 0%, 75%);\n\t--ck-color-button-default-disabled-background: \t\t\t\ttransparent;\n\n\t--ck-color-button-on-background: \t\t\t\t\t\t\thsl(0, 0%, 87%);\n\t--ck-color-button-on-hover-background: \t\t\t\t\t\thsl(0, 0%, 77%);\n\t--ck-color-button-on-active-background: \t\t\t\t\thsl(0, 0%, 73%);\n\t--ck-color-button-on-active-shadow: \t\t\t\t\t\thsl(0, 0%, 63%);\n\t--ck-color-button-on-disabled-background: \t\t\t\t\thsl(0, 0%, 87%);\n\n\t--ck-color-button-action-background: \t\t\t\t\t\tvar(--ck-color-base-action);\n\t--ck-color-button-action-hover-background: \t\t\t\t\thsl(104, 44%, 43%);\n\t--ck-color-button-action-active-background: \t\t\t\thsl(104, 44%, 41%);\n\t--ck-color-button-action-active-shadow: \t\t\t\t\thsl(104, 44%, 36%);\n\t--ck-color-button-action-disabled-background: \t\t\t\thsl(104, 44%, 58%);\n\t--ck-color-button-action-text: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t--ck-color-button-save: \t\t\t\t\t\t\t\t\thsl(120, 100%, 27%);\n\t--ck-color-button-cancel: \t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t--ck-color-switch-button-off-background:\t\t\t\t\thsl(0, 0%, 69%);\n\t--ck-color-switch-button-off-hover-background:\t\t\t\thsl(0, 0%, 64%);\n\t--ck-color-switch-button-on-background:\t\t\t\t\t\tvar(--ck-color-button-action-background);\n\t--ck-color-switch-button-on-hover-background:\t\t\t\thsl(104, 44%, 43%);\n\t--ck-color-switch-button-inner-background:\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-switch-button-inner-shadow:\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Dropdown ------------------------------------------------------------------------------ */\n\n\t--ck-color-dropdown-panel-background: \t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-dropdown-panel-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Input --------------------------------------------------------------------------------- */\n\n\t--ck-color-input-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-input-border: \t\t\t\t\t\t\t\t\thsl(0, 0%, 78%);\n\t--ck-color-input-error-border:\t\t\t\t\t\t\t\tvar(--ck-color-base-error);\n\t--ck-color-input-text: \t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-input-disabled-background: \t\t\t\t\t\thsl(0, 0%, 95%);\n\t--ck-color-input-disabled-border: \t\t\t\t\t\t\thsl(0, 0%, 78%);\n\t--ck-color-input-disabled-text: \t\t\t\t\t\t\thsl(0, 0%, 46%);\n\n\t/* -- List ---------------------------------------------------------------------------------- */\n\n\t--ck-color-list-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-list-button-hover-background: \t\t\t\t\tvar(--ck-color-button-default-hover-background);\n\t--ck-color-list-button-on-background: \t\t\t\t\t\tvar(--ck-color-base-active);\n\t--ck-color-list-button-on-background-focus: \t\t\t\tvar(--ck-color-base-active-focus);\n\t--ck-color-list-button-on-text:\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Panel --------------------------------------------------------------------------------- */\n\n\t--ck-color-panel-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-panel-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Toolbar ------------------------------------------------------------------------------- */\n\n\t--ck-color-toolbar-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-foreground);\n\t--ck-color-toolbar-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Tooltip ------------------------------------------------------------------------------- */\n\n\t--ck-color-tooltip-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-tooltip-text: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Engine -------------------------------------------------------------------------------- */\n\n\t--ck-color-engine-placeholder-text: \t\t\t\t\t\thsl(0, 0%, 44%);\n\n\t/* -- Upload -------------------------------------------------------------------------------- */\n\n\t--ck-color-upload-bar-background:\t\t \t\t\t\t\thsl(209, 92%, 70%);\n\n\t/* -- Link -------------------------------------------------------------------------------- */\n\n\t--ck-color-link-default:\t\t\t\t\t\t\t\t\thsl(240, 100%, 47%);\n\t--ck-color-link-selected-background:\t\t\t\t\t\thsla(201, 100%, 56%, 0.1);\n\t--ck-color-link-fake-selection:\t\t\t\t\t\t\t\thsla(201, 100%, 56%, 0.3);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * An opacity value of disabled UI item.\n\t */\n\t--ck-disabled-opacity: .5;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * The geometry of the of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow-geometry: 0 0 0 3px;\n\n\t/**\n\t * A visual style of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when disabled).\n\t */\n\t--ck-focus-disabled-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when has errors).\n\t */\n\t--ck-focus-error-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);\n\n\t/**\n\t * A visual style of focused element's border or outline.\n\t */\n\t--ck-focus-ring: 1px solid var(--ck-color-focus-border);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-font-size-base: 13px;\n\t--ck-line-height-base: 1.84615;\n\t--ck-font-face: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\n\n\t--ck-font-size-tiny: 0.7em;\n\t--ck-font-size-small: 0.75em;\n\t--ck-font-size-normal: 1em;\n\t--ck-font-size-big: 1.4em;\n\t--ck-font-size-large: 1.8em;\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* This is super-important. This is **manually** adjusted so a button without an icon\n\tis never smaller than a button with icon, additionally making sure that text-less buttons\n\tare perfect squares. The value is also shared by other components which should stay "in-line"\n\twith buttons. */\n\t--ck-ui-component-min-height: 2.3em;\n}\n\n/**\n * Resets an element, ignoring its children.\n */\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\t/* Do not include inheritable rules here. */\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\ttext-decoration: none;\n\tvertical-align: middle;\n\ttransition: none;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/105 */\n\tword-wrap: break-word;\n}\n\n/**\n * Resets an element AND its children.\n */\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\t/* These are rule inherited by all children elements. */\n\tborder-collapse: collapse;\n\tfont: normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);\n\tcolor: var(--ck-color-text);\n\ttext-align: left;\n\twhite-space: nowrap;\n\tcursor: auto;\n\tfloat: none;\n}\n\n.ck-reset_all {\n\t& .ck-rtl *:not(.ck-reset_all-excluded *) {\n\t\ttext-align: right;\n\t}\n\n\t& iframe:not(.ck-reset_all-excluded *) {\n\t\t/* For IE */\n\t\tvertical-align: inherit;\n\t}\n\n\t& textarea:not(.ck-reset_all-excluded *) {\n\t\twhite-space: pre-wrap;\n\t}\n\n\t& textarea:not(.ck-reset_all-excluded *),\n\t& input[type="text"]:not(.ck-reset_all-excluded *),\n\t& input[type="password"]:not(.ck-reset_all-excluded *) {\n\t\tcursor: text;\n\t}\n\n\t& textarea[disabled]:not(.ck-reset_all-excluded *),\n\t& input[type="text"][disabled]:not(.ck-reset_all-excluded *),\n\t& input[type="password"][disabled]:not(.ck-reset_all-excluded *) {\n\t\tcursor: default;\n\t}\n\n\t& fieldset:not(.ck-reset_all-excluded *) {\n\t\tpadding: 10px;\n\t\tborder: 2px groove hsl(255, 7%, 88%);\n\t}\n\n\t& button:not(.ck-reset_all-excluded *)::-moz-focus-inner {\n\t\t/* See http://stackoverflow.com/questions/5517744/remove-extra-button-spacing-padding-in-firefox */\n\t\tpadding: 0;\n\t\tborder: 0\n\t}\n}\n\n/**\n * Default UI rules for RTL languages.\n */\n.ck[dir="rtl"],\n.ck[dir="rtl"] .ck {\n\ttext-align: right;\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Default border-radius value.\n */\n:root{\n\t--ck-border-radius: 2px;\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * A visual style of element's inner shadow (i.e. input).\n\t */\n\t--ck-inner-shadow: 2px 2px 3px var(--ck-color-shadow-inner) inset;\n\n\t/**\n\t * A visual style of element's drop shadow (i.e. panel).\n\t */\n\t--ck-drop-shadow: 0 1px 2px 1px var(--ck-color-shadow-drop);\n\n\t/**\n\t * A visual style of element's active shadow (i.e. comment or suggestion).\n\t */\n\t--ck-drop-shadow-active: 0 3px 6px 1px var(--ck-color-shadow-drop-active);\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-spacing-unit: \t\t\t\t\t\t0.6em;\n\t--ck-spacing-large: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 1.5);\n\t--ck-spacing-standard: \t\t\t\t\tvar(--ck-spacing-unit);\n\t--ck-spacing-medium: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.8);\n\t--ck-spacing-small: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.5);\n\t--ck-spacing-tiny: \t\t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.3);\n\t--ck-spacing-extra-tiny: \t\t\t\tcalc(var(--ck-spacing-unit) * 0.16);\n}\n"],sourceRoot:""}]);const a=s},6507:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px;--ck-resizer-tooltip-height:calc(var(--ck-spacing-small)*2 + 10px)}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);color:var(--ck-color-resizer-tooltip-text);display:block;font-size:var(--ck-font-size-tiny);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height);padding:0 var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-above-center,.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{left:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{right:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-above-center{left:50%;top:calc(var(--ck-resizer-tooltip-height)*-1);transform:translate(-50%)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-color:transparent;outline-style:solid;outline-width:var(--ck-widget-outline-thickness);transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{background-color:var(--ck-color-widget-editable-focus-background);border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{background-color:transparent;border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;box-sizing:border-box;left:calc(0px - var(--ck-widget-outline-thickness));opacity:0;padding:4px;top:0;transform:translateY(-100%);transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{color:var(--ck-color-widget-drag-handler-icon-color);height:var(--ck-widget-handler-icon-size);width:var(--ck-widget-handler-icon-size)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{background-color:var(--ck-color-widget-hover-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{background-color:var(--ck-color-focus-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widget.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widget.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MACC,+CAAgD,CAChD,6CAAsD,CACtD,uCAAgD,CAEhD,kDAAmD,CACnD,gCAAiC,CACjC,kEACD,CAOA,8DAEC,iBAqBD,CAnBC,4EACC,iBAOD,CALC,qFAGC,aACD,CASD,iLACC,kBACD,CAGD,kBACC,qDAAsD,CAEtD,qDAAsD,CACtD,6CAA8C,CAF9C,0CAA2C,CAI3C,aAAc,CADd,kCAAmC,CAGnC,uCAAwC,CACxC,4CAA6C,CAF7C,iCAsCD,CAlCC,8NAKC,iBACD,CAEA,0CAEC,qCAAsC,CADtC,oCAED,CAEA,2CAEC,sCAAuC,CADvC,oCAED,CAEA,8CACC,uCAAwC,CACxC,sCACD,CAEA,6CACC,uCAAwC,CACxC,qCACD,CAGA,8CAEC,QAAS,CADT,6CAAgD,CAEhD,yBACD,CCjFD,MACC,iCAAkC,CAClC,kCAAmC,CACnC,4CAA6C,CAC7C,wCAAyC,CAEzC,wCAAiD,CACjD,sCAAkD,CAClD,2EAA4E,CAC5E,yEACD,CAEA,eAGC,yBAA0B,CAD1B,mBAAoB,CADpB,gDAAiD,CAGjD,6GAUD,CARC,0EAEC,6EACD,CAEA,qBACC,iDACD,CAGD,gCACC,4BAWD,CAPC,yGAKC,iEAAkE,CCnCnE,2BAA2B,CCF3B,qCAA8B,CDC9B,YDqCA,CAIA,4EAKC,4BAA6B,CAa7B,iEAAkE,CAhBlE,qBAAsB,CAoBtB,mDAAoD,CAhBpD,SAAU,CALV,WAAY,CAsBZ,KAAM,CAFN,2BAA4B,CAT5B,6SAgCD,CAnBC,qFAIC,oDAAqD,CADrD,yCAA0C,CAD1C,wCAWD,CANC,kHACC,SAAU,CAGV,+DACD,CAID,wHACC,SACD,CAID,kFAEC,oDAAqD,CADrD,SAED,CAKC,oMAEC,6CAA8C,CAD9C,SAOD,CAHC,gRACC,SACD,CAOH,qFACC,SAAU,CACV,oDACD,CAGA,gDAEC,eAkBD,CAhBC,yEAOC,iCACD,CAGC,gOAEC,gDACD,CAOD,wIAEC,mDAQD,CALE,ghBAEC,gDACD,CAKH,yKAOC,yDACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-resizer: var(--ck-color-focus-border);\n\t--ck-color-resizer-tooltip-background: hsl(0, 0%, 15%);\n\t--ck-color-resizer-tooltip-text: hsl(0, 0%, 95%);\n\n\t--ck-resizer-border-radius: var(--ck-border-radius);\n\t--ck-resizer-tooltip-offset: 10px;\n\t--ck-resizer-tooltip-height: calc(var(--ck-spacing-small) * 2 + 10px);\n}\n\n.ck .ck-widget {\n\t/* This is neccessary for type around UI to be positioned properly. */\n\tposition: relative;\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n\n\t& .ck-widget__selection-handle {\n\t\tposition: absolute;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the icon in not a subject to font-size or line-height to avoid\n\t\t\tunnecessary spacing around it. */\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t/* Show the selection handle on mouse hover over the widget, but not for nested widgets. */\n\t&:hover > .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n\n\t/* Show the selection handle when the widget is selected, but not for nested widgets. */\n\t&.ck-widget_selected > .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n}\n\n.ck .ck-size-view {\n\tbackground: var(--ck-color-resizer-tooltip-background);\n\tcolor: var(--ck-color-resizer-tooltip-text);\n\tborder: 1px solid var(--ck-color-resizer-tooltip-text);\n\tborder-radius: var(--ck-resizer-border-radius);\n\tfont-size: var(--ck-font-size-tiny);\n\tdisplay: block;\n\tpadding: 0 var(--ck-spacing-small);\n\theight: var(--ck-resizer-tooltip-height);\n\tline-height: var(--ck-resizer-tooltip-height);\n\n\t&.ck-orientation-top-left,\n\t&.ck-orientation-top-right,\n\t&.ck-orientation-bottom-right,\n\t&.ck-orientation-bottom-left,\n\t&.ck-orientation-above-center {\n\t\tposition: absolute;\n\t}\n\n\t&.ck-orientation-top-left {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-top-right {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-right {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-left {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t/* Class applied if the widget is too small to contain the size label */\n\t&.ck-orientation-above-center {\n\t\ttop: calc(var(--ck-resizer-tooltip-height) * -1);\n\t\tleft: 50%;\n\t\ttransform: translate(-50%);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n\n:root {\n\t--ck-widget-outline-thickness: 3px;\n\t--ck-widget-handler-icon-size: 16px;\n\t--ck-widget-handler-animation-duration: 200ms;\n\t--ck-widget-handler-animation-curve: ease;\n\n\t--ck-color-widget-blurred-border: hsl(0, 0%, 87%);\n\t--ck-color-widget-hover-border: hsl(43, 100%, 62%);\n\t--ck-color-widget-editable-focus-background: var(--ck-color-base-background);\n\t--ck-color-widget-drag-handler-icon-color: var(--ck-color-base-background);\n}\n\n.ck .ck-widget {\n\toutline-width: var(--ck-widget-outline-thickness);\n\toutline-style: solid;\n\toutline-color: transparent;\n\ttransition: outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border);\n\t}\n\n\t&:hover {\n\t\toutline-color: var(--ck-color-widget-hover-border);\n\t}\n}\n\n.ck .ck-editor__nested-editable {\n\tborder: 1px solid transparent;\n\n\t/* The :focus style is applied before .ck-editor__nested-editable_focused class is rendered in the view.\n\tThese styles show a different border for a blink of an eye, so `:focus` need to have same styles applied. */\n\t&.ck-editor__nested-editable_focused,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\n\t\tbackground-color: var(--ck-color-widget-editable-focus-background);\n\t}\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t& .ck-widget__selection-handle {\n\t\tpadding: 4px;\n\t\tbox-sizing: border-box;\n\n\t\t/* Background and opacity will be animated as the handler shows up or the widget gets selected. */\n\t\tbackground-color: transparent;\n\t\topacity: 0;\n\n\t\t/* Transition:\n\t\t * background-color for the .ck-widget_selected state change,\n\t\t * visibility for hiding the handler,\n\t\t * opacity for the proper look of the icon when the handler disappears. */\n\t\ttransition:\n\t\t\tbackground-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\tvisibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\topacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t/* Make only top corners round. */\n\t\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\n\n\t\t/* Place the drag handler outside the widget wrapper. */\n\t\ttransform: translateY(-100%);\n\t\tleft: calc(0px - var(--ck-widget-outline-thickness));\n\t\ttop: 0;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the dimensions of the icon are independent of the fon-size of the content. */\n\t\t\twidth: var(--ck-widget-handler-icon-size);\n\t\t\theight: var(--ck-widget-handler-icon-size);\n\t\t\tcolor: var(--ck-color-widget-drag-handler-icon-color);\n\n\t\t\t/* The "selected" part of the icon is invisible by default */\n\t\t\t& .ck-icon__selected-indicator {\n\t\t\t\topacity: 0;\n\n\t\t\t\t/* Note: The animation is longer on purpose. Simply feels better. */\n\t\t\t\ttransition: opacity 300ms var(--ck-widget-handler-animation-curve);\n\t\t\t}\n\t\t}\n\n\t\t/* Advertise using the look of the icon that once clicked the handler, the widget will be selected. */\n\t\t&:hover .ck-icon .ck-icon__selected-indicator {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* Show the selection handler on mouse hover over the widget, but not for nested widgets. */\n\t&:hover > .ck-widget__selection-handle {\n\t\topacity: 1;\n\t\tbackground-color: var(--ck-color-widget-hover-border);\n\t}\n\n\t/* Show the selection handler when the widget is selected, but not for nested widgets. */\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\t& > .ck-widget__selection-handle {\n\t\t\topacity: 1;\n\t\t\tbackground-color: var(--ck-color-focus-border);\n\n\t\t\t/* When the widget is selected, notify the user using the proper look of the icon. */\n\t\t\t& .ck-icon .ck-icon__selected-indicator {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* In a RTL environment, align the selection handler to the right side of the widget */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle {\n\tleft: auto;\n\tright: calc(0px - var(--ck-widget-outline-thickness));\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/6415 */\n.ck.ck-editor__editable.ck-read-only .ck-widget {\n\t/* Prevent the :hover outline from showing up because of the used outline-color transition. */\n\ttransition: none;\n\n\t&:not(.ck-widget_selected) {\n\t\t/* Disable visual effects of hover/active widget when CKEditor is in readOnly mode.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/1261\n\t\t *\n\t\t * Leave the unit because this custom property is used in calc() by other features.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/6775\n\t\t */\n\t\t--ck-widget-outline-thickness: 0px;\n\t}\n\n\t&.ck-widget_with-selection-handle {\n\t\t& .ck-widget__selection-handle,\n\t\t& .ck-widget__selection-handle:hover {\n\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t}\n\t}\n}\n\n/* Style the widget when it\'s selected but the editable it belongs to lost focus. */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck.ck-editor__editable.ck-blurred .ck-widget {\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline-color: var(--ck-color-widget-blurred-border);\n\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t& > .ck-widget__selection-handle,\n\t\t\t& > .ck-widget__selection-handle:hover {\n\t\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable > .ck-widget.ck-widget_with-selection-handle:first-child,\n.ck.ck-editor__editable blockquote > .ck-widget.ck-widget_with-selection-handle:first-child {\n\t/* Do not crop selection handler if a widget is a first-child in the blockquote or in the root editable.\n\tIn fact, anything with overflow: hidden.\n\thttps://github.com/ckeditor/ckeditor5-block-quote/issues/28\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/44\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/66 */\n\tmargin-top: calc(1em + var(--ck-widget-handler-icon-size));\n}\n',"/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},2263:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;left:0;pointer-events:none;position:absolute;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{pointer-events:all;position:absolute}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius);height:var(--ck-resizer-size);width:var(--ck-resizer-size)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{left:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{right:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}","",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgetresize.css"],names:[],mappings:"AAKA,4BAEC,iBACD,CAEA,wBACC,YAAa,CAMb,MAAO,CAFP,mBAAoB,CAHpB,iBAAkB,CAMlB,KACD,CAGC,2EACC,aACD,CAGD,gCAIC,kBAAmB,CAHnB,iBAcD,CATC,4IAEC,kBACD,CAEA,4IAEC,kBACD,CCpCD,MACC,sBAAuB,CAGvB,yDAAiE,CACjE,6BACD,CAEA,wBACC,yCACD,CAEA,gCAGC,uCAAwC,CACxC,gDAA6D,CAC7D,6CAA8C,CAH9C,6BAA8B,CAD9B,4BAyBD,CAnBC,oEAEC,6BAA8B,CAD9B,4BAED,CAEA,qEAEC,8BAA+B,CAD/B,4BAED,CAEA,wEACC,+BAAgC,CAChC,8BACD,CAEA,uEACC,+BAAgC,CAChC,6BACD",sourcesContent:["/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget_with-resizer {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n}\n\n.ck .ck-widget__resizer {\n\tdisplay: none;\n\tposition: absolute;\n\n\t/* The wrapper itself should not interfere with the pointer device, only the handles should. */\n\tpointer-events: none;\n\n\tleft: 0;\n\ttop: 0;\n}\n\n.ck-focused .ck-widget_with-resizer.ck-widget_selected {\n\t& > .ck-widget__resizer {\n\t\tdisplay: block;\n\t}\n}\n\n.ck .ck-widget__resizer__handle {\n\tposition: absolute;\n\n\t/* Resizers are the only UI elements that should interfere with a pointer device. */\n\tpointer-events: all;\n\n\t&.ck-widget__resizer__handle-top-left,\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tcursor: nwse-resize;\n\t}\n\n\t&.ck-widget__resizer__handle-top-right,\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tcursor: nesw-resize;\n\t}\n}\n","/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-resizer-size: 10px;\n\n\t/* Set the resizer with a 50% offset. */\n\t--ck-resizer-offset: calc( ( var(--ck-resizer-size) / -2 ) - 2px);\n\t--ck-resizer-border-width: 1px;\n}\n\n.ck .ck-widget__resizer {\n\toutline: 1px solid var(--ck-color-resizer);\n}\n\n.ck .ck-widget__resizer__handle {\n\twidth: var(--ck-resizer-size);\n\theight: var(--ck-resizer-size);\n\tbackground: var(--ck-color-focus-border);\n\tborder: var(--ck-resizer-border-width) solid hsl(0, 0%, 100%);\n\tborder-radius: var(--ck-resizer-border-radius);\n\n\t&.ck-widget__resizer__handle-top-left {\n\t\ttop: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-top-right {\n\t\ttop: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n}\n"],sourceRoot:""}]);const a=s},5137:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var o=n(4015),i=n.n(o),r=n(3645),s=n.n(r)()(i());s.push([t.id,'.ck .ck-widget .ck-widget__type-around__button{display:block;overflow:hidden;position:absolute;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{left:50%;position:absolute;top:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{left:min(10%,30px);top:calc(var(--ck-widget-outline-thickness)*-.5);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;left:1px;position:absolute;top:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;left:0;position:absolute;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:block;top:calc(var(--ck-widget-outline-thickness)*-1 - 1px)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button);border-radius:100px;height:var(--ck-widget-type-around-button-size);opacity:0;pointer-events:none;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);width:var(--ck-widget-type-around-button-size)}.ck .ck-widget .ck-widget__type-around__button svg{height:8px;margin-top:1px;transform:translate(-50%,-50%);transition:transform .5s ease;width:10px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3));border-radius:100px;height:calc(var(--ck-widget-type-around-button-size) - 2px);width:calc(var(--ck-widget-type-around-button-size) - 2px)}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;background:var(--ck-color-base-text);height:1px;outline:1px solid hsla(0,0%,100%,.5);pointer-events:none}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css","webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css"],names:[],mappings:"AASC,+CACC,aAAc,CAEd,eAAgB,CADhB,iBAAkB,CAElB,2BAwBD,CAtBC,mDAGC,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAEA,qFAGC,kBAAoB,CADpB,gDAAoD,CAGpD,0BACD,CAEA,oFAEC,mDAAuD,CACvD,mBAAqB,CAErB,yBACD,CAUA,mLACC,UAAW,CACX,aAAc,CAGd,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAMD,2EACC,YAAa,CAEb,MAAO,CADP,iBAAkB,CAElB,OACD,CAOA,iFACC,gDAAqD,CACrD,iDACD,CAKA,wHAEC,aAAc,CADd,qDAED,CAKA,uHACC,wDAA6D,CAC7D,aACD,CAoBD,mOACC,YACD,CC3GA,MACC,wCAAyC,CACzC,wEAAyE,CACzE,8EAA+E,CAC/E,2FAA4F,CAC5F,wDAAyD,CACzD,uDAAwD,CACxD,yEACD,CAgBC,+CAGC,oDAAqD,CACrD,mBAAoB,CAFpB,+CAAgD,CAVjD,SAAU,CACV,mBAAoB,CAYnB,uMAAyM,CAJzM,8CAkDD,CA1CC,mDAEC,UAAW,CAGX,cAAe,CAFf,8BAA+B,CAC/B,6BAA8B,CAH9B,UAoBD,CAdC,qDACC,mBAAoB,CACpB,mBAAoB,CAEpB,SAAU,CACV,qDAAsD,CACtD,kBAAmB,CACnB,oBAAqB,CACrB,qBACD,CAEA,wDACC,kBACD,CAGD,qDAIC,6DAcD,CARE,kEACC,oDACD,CAEA,8DACC,wDACD,CAUF,uKAvED,SAAU,CACV,mBAwEC,CAOD,gGACC,0DACD,CAOA,uKAEC,2DAQD,CANC,mLAIC,uEAAkF,CADlF,mBAAoB,CADpB,2DAA4D,CAD5D,0DAID,CAOD,8GACC,gBACD,CAKA,mDAGC,mFAAoF,CAOpF,oCAAqC,CARrC,UAAW,CAOX,oCAAwC,CARxC,mBAUD,CAOC,6JAEC,yBACD,CAUA,yKACC,iDACD,CAMA,uOAlJD,SAAU,CACV,mBAmJC,CAoBA,6yBACC,SACD,CASF,uHACC,aAAc,CACd,iBACD,CAYG,iRAlMF,SAAU,CACV,mBAmME,CAQH,kIACC,qEAKD,CAHC,wIACC,WACD,CAGD,4CACC,GACC,oBACD,CACA,OACC,mBACD,CACD,CAEA,gDACC,OACC,mBACD,CACA,OACC,mBACD,CACD,CAEA,8CACC,GACC,6HACD,CACA,IACC,6HACD,CACA,GACC,+HACD,CACD,CAEA,kDACC,GACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\toverflow: hidden;\n\t\tz-index: var(--ck-z-default);\n\n\t\t& svg {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tz-index: calc(var(--ck-z-default) + 2);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_before {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\ttop: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tleft: min(10%, 30px);\n\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_after {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\tbottom: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tright: min(10%, 30px);\n\n\t\t\ttransform: translateY(50%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 1px;\n\t\t\tleft: 1px;\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t}\n\n\t/*\n\t * When the widget is hovered the "fake caret" would normally be narrower than the\n\t * extra outline displayed around the widget. Let\'s extend the "fake caret" to match\n\t * the full width of the widget.\n\t */\n\t&:hover > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tleft: calc( -1 * var(--ck-widget-outline-thickness) );\n\t\tright: calc( -1 * var(--ck-widget-outline-thickness) );\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed before the widget (backward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_before > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\ttop: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed after the widget (forward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_after > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tbottom: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n}\n\n/*\n * Integration with the read-only mode of the editor.\n */\n.ck.ck-editor__editable.ck-read-only .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the restricted editing mode (feature) of the editor.\n */\n.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the #isEnabled property of the WidgetTypeAround plugin.\n */\n.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around {\n\tdisplay: none;\n}\n','/*\n * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-widget-type-around-button-size: 20px;\n\t--ck-color-widget-type-around-button-active: var(--ck-color-focus-border);\n\t--ck-color-widget-type-around-button-hover: var(--ck-color-widget-hover-border);\n\t--ck-color-widget-type-around-button-blurred-editable: var(--ck-color-widget-blurred-border);\n\t--ck-color-widget-type-around-button-radar-start-alpha: 0;\n\t--ck-color-widget-type-around-button-radar-end-alpha: .3;\n\t--ck-color-widget-type-around-button-icon: var(--ck-color-base-background);\n}\n\n@define-mixin ck-widget-type-around-button-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n@define-mixin ck-widget-type-around-button-hidden {\n\topacity: 0;\n\tpointer-events: none;\n}\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\twidth: var(--ck-widget-type-around-button-size);\n\t\theight: var(--ck-widget-type-around-button-size);\n\t\tbackground: var(--ck-color-widget-type-around-button);\n\t\tborder-radius: 100px;\n\t\ttransition: opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t@mixin ck-widget-type-around-button-hidden;\n\n\t\t& svg {\n\t\t\twidth: 10px;\n\t\t\theight: 8px;\n\t\t\ttransform: translate(-50%,-50%);\n\t\t\ttransition: transform .5s ease;\n\t\t\tmargin-top: 1px;\n\n\t\t\t& * {\n\t\t\t\tstroke-dasharray: 10;\n\t\t\t\tstroke-dashoffset: 0;\n\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--ck-color-widget-type-around-button-icon);\n\t\t\t\tstroke-width: 1.5px;\n\t\t\t\tstroke-linecap: round;\n\t\t\t\tstroke-linejoin: round;\n\t\t\t}\n\n\t\t\t& line {\n\t\t\t\tstroke-dasharray: 7;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\t/*\n\t\t\t * Display the "sonar" around the button when hovered.\n\t\t\t */\n\t\t\tanimation: ck-widget-type-around-button-sonar 1s ease infinite;\n\n\t\t\t/*\n\t\t\t * Animate active button\'s icon.\n\t\t\t */\n\t\t\t& svg {\n\t\t\t\t& polyline {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-dash 2s linear;\n\t\t\t\t}\n\n\t\t\t\t& line {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-tip-dash 2s linear;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Show type around buttons when the widget gets selected or being hovered.\n\t */\n\t&.ck-widget_selected,\n\t&:hover {\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-visible;\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when the widget is NOT selected (but the buttons are visible\n\t * and still can be hovered).\n\t */\n\t&:not(.ck-widget_selected) > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\tbackground: var(--ck-color-widget-type-around-button-hover);\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\tbackground: var(--ck-color-widget-type-around-button-active);\n\n\t\t&::after {\n\t\t\twidth: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\theight: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\tborder-radius: 100px;\n\t\t\tbackground: linear-gradient(135deg, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,.3) 100%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the "before" button when the widget has a selection handle. Because some space\n\t * is consumed by the handle, the button must be moved slightly to the right to let it breathe.\n\t */\n\t&.ck-widget_with-selection-handle > .ck-widget__type-around > .ck-widget__type-around__button_before {\n\t\tmargin-left: 20px;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& .ck-widget__type-around__fake-caret {\n\t\tpointer-events: none;\n\t\theight: 1px;\n\t\tanimation: ck-widget-type-around-fake-caret-pulse linear 1s infinite normal forwards;\n\n\t\t/*\n\t\t * The semi-transparent-outline+background combo improves the contrast\n\t\t * when the background underneath the fake caret is dark.\n\t\t */\n\t\toutline: solid 1px hsla(0, 0%, 100%, .5);\n\t\tbackground: var(--ck-color-base-text);\n\t}\n\n\t/*\n\t * Styles of the widget when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t * Despite the widget being physically selected in the model, its outline should disappear.\n\t */\n\t&.ck-widget_selected {\n\t\t&.ck-widget_type-around_show-fake-caret_before,\n\t\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t\toutline-color: transparent;\n\t\t}\n\t}\n\n\t&.ck-widget_type-around_show-fake-caret_before,\n\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t/*\n\t\t * When the "fake caret" is visible we simulate that the widget is not selected\n\t\t * (despite being physically selected), so the outline color should be for the\n\t\t * unselected widget.\n\t\t */\n\t\t&.ck-widget_selected:hover {\n\t\t\toutline-color: var(--ck-color-widget-hover-border);\n\t\t}\n\n\t\t/*\n\t\t * Styles of the type around buttons when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t\t * In this state, the type around buttons would collide with the fake carets so they should disappear.\n\t\t */\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the selection handle. When the caret is visible, simply\n\t\t * hide the handle because it intersects with the caret (and does not make much sense anyway).\n\t\t */\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t&.ck-widget_selected,\n\t\t\t&.ck-widget_selected:hover {\n\t\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\t\topacity: 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the resize UI. When the caret is visible, simply\n\t\t * hide the resize UI because it creates too much noise. It can be visible when the user\n\t\t * hovers the widget, though.\n\t\t */\n\t\t&.ck-widget_selected.ck-widget_with-resizer > .ck-widget__resizer {\n\t\t\topacity: 0\n\t\t}\n\t}\n}\n\n/*\n * Styles for the "before" button when the widget has a selection handle in an RTL environment.\n * The selection handler is aligned to the right side of the widget so there is no need to create\n * additional space for it next to the "before" button.\n */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around > .ck-widget__type-around__button_before {\n\tmargin-left: 0;\n\tmargin-right: 20px;\n}\n\n/*\n * Hide type around buttons when the widget is selected as a child of a selected\n * nested editable (e.g. mulit-cell table selection).\n *\n * See https://github.com/ckeditor/ckeditor5/issues/7263.\n */\n.ck-editor__nested-editable.ck-editor__editable_selected {\n\t& .ck-widget {\n\t\t&.ck-widget_selected,\n\t\t&:hover {\n\t\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n * Styles for the buttons when the widget is selected but the user clicked outside of the editor (blurred the editor).\n */\n.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button:not(:hover) {\n\tbackground: var(--ck-color-widget-type-around-button-blurred-editable);\n\n\t& svg * {\n\t\tstroke: hsl(0,0%,60%);\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-dash {\n\t0% {\n\t\tstroke-dashoffset: 10;\n\t}\n\t20%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-tip-dash {\n\t0%, 20% {\n\t\tstroke-dashoffset: 7;\n\t}\n\t40%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-button-sonar {\n\t0% {\n\t\tbox-shadow: 0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n\t50% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha));\n\t}\n\t100% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n}\n\n@keyframes ck-widget-type-around-fake-caret-pulse {\n\t0% {\n\t\topacity: 1;\n\t}\n\t49% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0;\n\t}\n\t99% {\n\t\topacity: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t}\n}\n'],sourceRoot:""}]);const a=s},3645:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=t(e);return e[2]?"@media ".concat(e[2]," {").concat(n,"}"):n})).join("")},e.i=function(t,n,o){"string"==typeof t&&(t=[[null,t,""]]);var i={};if(o)for(var r=0;r{"use strict";function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=t&&("undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"]);if(null==n)return;var o,i,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(o=n.next()).done)&&(r.push(o.value),!e||r.length!==e);s=!0);}catch(t){a=!0,i=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw i}}return r}(t,e)||function(t,e){if(!t)return;if("string"==typeof t)return n(t,e);var o=Object.prototype.toString.call(t).slice(8,-1);"Object"===o&&t.constructor&&(o=t.constructor.name);if("Map"===o||"Set"===o)return Array.from(t);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return n(t,e)}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n{"use strict";var e=[];function n(t){for(var n=-1,o=0;o{"use strict";var e={};t.exports=function(t,n){var o=function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(t){n=null}e[t]=n}return e[t]}(t);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},9216:t=>{"use strict";t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},8575:t=>{"use strict";t.exports=function(t,e){Object.keys(e).forEach((function(n){t.setAttribute(n,e[n])}))}},9037:t=>{"use strict";var e,n=(e=[],function(t,n){return e[t]=n,e.filter(Boolean).join("\n")});function o(t,e,o,i){var r;if(o)r="";else{r="",i.supports&&(r+="@supports (".concat(i.supports,") {")),i.media&&(r+="@media ".concat(i.media," {"));var s=void 0!==i.layer;s&&(r+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),r+=i.css,s&&(r+="}"),i.media&&(r+="}"),i.supports&&(r+="}")}if(t.styleSheet)t.styleSheet.cssText=n(e,r);else{var a=document.createTextNode(r),l=t.childNodes;l[e]&&t.removeChild(l[e]),l.length?t.insertBefore(a,l[e]):t.appendChild(a)}}var i={singleton:null,singletonCounter:0};t.exports=function(t){var e=i.singletonCounter++,n=i.singleton||(i.singleton=t.insertStyleElement(t));return{update:function(t){o(n,e,!1,t)},remove:function(t){o(n,e,!0,t)}}}}},e={};function n(o){var i=e[o];if(void 0!==i)return i.exports;var r=e[o]={id:o,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var o={};return(()=>{"use strict";n.d(o,{default:()=>dE});const t=function(){return function t(){t.called=!0}};class e{constructor(e,n){this.source=e,this.name=n,this.path=[],this.stop=t(),this.off=t()}}const i=new Array(256).fill("").map(((t,e)=>("0"+e.toString(16)).slice(-2)));function r(){const t=4294967296*Math.random()>>>0,e=4294967296*Math.random()>>>0,n=4294967296*Math.random()>>>0,o=4294967296*Math.random()>>>0;return"e"+i[t>>0&255]+i[t>>8&255]+i[t>>16&255]+i[t>>24&255]+i[e>>0&255]+i[e>>8&255]+i[e>>16&255]+i[e>>24&255]+i[n>>0&255]+i[n>>8&255]+i[n>>16&255]+i[n>>24&255]+i[o>>0&255]+i[o>>8&255]+i[o>>16&255]+i[o>>24&255]}const s={get(t="normal"){return"number"!=typeof t?this[t]||this.normal:t},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};function a(t,e){const n=s.get(e.priority);for(let o=0;o{if("object"==typeof e&&null!==e){if(n.has(e))return`[object ${e.constructor.name}]`;n.add(e)}return e},i=e?` ${JSON.stringify(e,o)}`:"",r=d(t);return t+i+r}(t,n)),this.name="CKEditorError",this.context=e,this.data=n}is(t){return"CKEditorError"===t}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError"))throw t;const n=new l(t.message,e);throw n.stack=t.stack,n}}function c(t,e){console.warn(...u(t,e))}function d(t){return`\nRead more: https://ckeditor.com/docs/ckeditor5/latest/support/error-codes.html#error-${t}`}function u(t,e){const n=d(t);return e?[t,e,n]:[t,n]}const h="35.0.1",m="object"==typeof window?window:n.g;if(m.CKEDITOR_VERSION)throw new l("ckeditor-duplicated-modules",null);m.CKEDITOR_VERSION=h;const g=Symbol("listeningTo"),p=Symbol("emitterId"),f=Symbol("delegations"),b={on(t,e,n={}){this.listenTo(this,t,e,n)},once(t,e,n){let o=!1;this.listenTo(this,t,((t,...n)=>{o||(o=!0,t.off(),e.call(this,t,...n))}),n)},off(t,e){this.stopListening(this,t,e)},listenTo(t,e,n,o={}){let i,r;this[g]||(this[g]={});const s=this[g];A(t)||w(t);const a=A(t);(i=s[a])||(i=s[a]={emitter:t,callbacks:{}}),(r=i.callbacks[e])||(r=i.callbacks[e]=[]),r.push(n),function(t,e,n,o,i){e._addEventListener?e._addEventListener(n,o,i):t._addEventListener.call(e,n,o,i)}(this,t,e,n,o)},stopListening(t,e,n){const o=this[g];let i=t&&A(t);const r=o&&i?o[i]:void 0,s=r&&e?r.callbacks[e]:void 0;if(!(!o||t&&!r||e&&!s))if(n){x(this,t,e,n);-1!==s.indexOf(n)&&(1===s.length?delete r.callbacks[e]:x(this,t,e,n))}else if(s){for(;n=s.pop();)x(this,t,e,n);delete r.callbacks[e]}else if(r){for(e in r.callbacks)this.stopListening(t,e);delete o[i]}else{for(i in o)this.stopListening(o[i].emitter);delete this[g]}},fire(t,...n){try{const o=t instanceof e?t:new e(this,t),i=o.name;let r=v(this,i);if(o.path.push(this),r){const t=[o,...n];r=Array.from(r);for(let e=0;e{this[f]||(this[f]=new Map),t.forEach((t=>{const o=this[f].get(t);o?o.set(e,n):this[f].set(t,new Map([[e,n]]))}))}}},stopDelegating(t,e){if(this[f])if(t)if(e){const n=this[f].get(t);n&&n.delete(e)}else this[f].delete(t);else this[f].clear()},_addEventListener(t,e,n){!function(t,e){const n=C(t);if(n[e])return;let o=e,i=null;const r=[];for(;""!==o&&!n[o];)n[o]={callbacks:[],childEvents:[]},r.push(n[o]),i&&n[o].childEvents.push(i),i=o,o=o.substr(0,o.lastIndexOf(":"));if(""!==o){for(const t of r)t.callbacks=n[o].callbacks.slice();n[o].childEvents.push(i)}}(this,t);const o=_(this,t),i={callback:e,priority:s.get(n.priority)};for(const t of o)a(t,i)},_removeEventListener(t,e){const n=_(this,t);for(const t of n)for(let n=0;n-1?v(t,e.substr(0,e.lastIndexOf(":"))):null}function y(t,n,o){for(let[i,r]of t){r?"function"==typeof r&&(r=r(n.name)):r=n.name;const t=new e(n.source,r);t.path=[...n.path],i.fire(t,...o)}}function x(t,e,n,o){e._removeEventListener?e._removeEventListener(n,o):t._removeEventListener.call(e,n,o)}const E=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)},D=Symbol("observableProperties"),S=Symbol("boundObservables"),I=Symbol("boundProperties"),T=Symbol("decoratedMethods"),M=Symbol("decoratedOriginal"),B={set(t,e){if(E(t))return void Object.keys(t).forEach((e=>{this.set(e,t[e])}),this);z(this);const n=this[D];if(t in this&&!n.has(t))throw new l("observable-set-cannot-override",this);Object.defineProperty(this,t,{enumerable:!0,configurable:!0,get:()=>n.get(t),set(e){const o=n.get(t);let i=this.fire("set:"+t,t,e,o);void 0===i&&(i=e),o===i&&n.has(t)||(n.set(t,i),this.fire("change:"+t,t,i,o))}}),this[t]=e},bind(...t){if(!t.length||!O(t))throw new l("observable-bind-wrong-properties",this);if(new Set(t).size!==t.length)throw new l("observable-bind-duplicate-properties",this);z(this);const e=this[I];t.forEach((t=>{if(e.has(t))throw new l("observable-bind-rebind",this)}));const n=new Map;return t.forEach((t=>{const o={property:t,to:[]};e.set(t,o),n.set(t,o)})),{to:P,toMany:L,_observable:this,_bindProperties:t,_to:[],_bindings:n}},unbind(...t){if(!this[D])return;const e=this[I],n=this[S];if(t.length){if(!O(t))throw new l("observable-unbind-wrong-properties",this);t.forEach((t=>{const o=e.get(t);o&&(o.to.forEach((([t,e])=>{const i=n.get(t),r=i[e];r.delete(o),r.size||delete i[e],Object.keys(i).length||(n.delete(t),this.stopListening(t,"change"))})),e.delete(t))}))}else n.forEach(((t,e)=>{this.stopListening(e,"change")})),n.clear(),e.clear()},decorate(t){z(this);const e=this[t];if(!e)throw new l("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:t});this.on(t,((t,n)=>{t.return=e.apply(this,n)})),this[t]=function(...e){return this.fire(t,e)},this[t][M]=e,this[T]||(this[T]=[]),this[T].push(t)},...k};B.stopListening=function(t,e,n){if(!t&&this[T]){for(const t of this[T])this[t]=this[t][M];delete this[T]}k.stopListening.call(this,t,e,n)};const N=B;function z(t){t[D]||(Object.defineProperty(t,D,{value:new Map}),Object.defineProperty(t,S,{value:new Map}),Object.defineProperty(t,I,{value:new Map}))}function P(...t){const e=function(...t){if(!t.length)throw new l("observable-bind-to-parse-error",null);const e={to:[]};let n;"function"==typeof t[t.length-1]&&(e.callback=t.pop());return t.forEach((t=>{if("string"==typeof t)n.properties.push(t);else{if("object"!=typeof t)throw new l("observable-bind-to-parse-error",null);n={observable:t,properties:[]},e.to.push(n)}})),e}(...t),n=Array.from(this._bindings.keys()),o=n.length;if(!e.callback&&e.to.length>1)throw new l("observable-bind-to-no-callback",this);if(o>1&&e.callback)throw new l("observable-bind-to-extra-callback",this);var i;e.to.forEach((t=>{if(t.properties.length&&t.properties.length!==o)throw new l("observable-bind-to-properties-length",this);t.properties.length||(t.properties=this._bindProperties)})),this._to=e.to,e.callback&&(this._bindings.get(n[0]).callback=e.callback),i=this._observable,this._to.forEach((t=>{const e=i[S];let n;e.get(t.observable)||i.listenTo(t.observable,"change",((o,r)=>{n=e.get(t.observable)[r],n&&n.forEach((t=>{R(i,t.property)}))}))})),function(t){let e;t._bindings.forEach(((n,o)=>{t._to.forEach((i=>{e=i.properties[n.callback?0:t._bindProperties.indexOf(o)],n.to.push([i.observable,e]),function(t,e,n,o){const i=t[S],r=i.get(n),s=r||{};s[o]||(s[o]=new Set);s[o].add(e),r||i.set(n,s)}(t._observable,n,i.observable,e)}))}))}(this),this._bindProperties.forEach((t=>{R(this._observable,t)}))}function L(t,e,n){if(this._bindings.size>1)throw new l("observable-bind-to-many-not-one-binding",this);this.to(...function(t,e){const n=t.map((t=>[t,e]));return Array.prototype.concat.apply([],n)}(t,e),n)}function O(t){return t.every((t=>"string"==typeof t))}function R(t,e){const n=t[I].get(e);let o;n.callback?o=n.callback.apply(t,n.to.map((t=>t[0][t[1]]))):(o=n.to[0],o=o[0][o[1]]),Object.prototype.hasOwnProperty.call(t,e)?t[e]=o:t.set(e,o)}function j(t,...e){e.forEach((e=>{const n=Object.getOwnPropertyNames(e),o=Object.getOwnPropertySymbols(e);n.concat(o).forEach((n=>{if(n in t.prototype)return;const o=Object.getOwnPropertyDescriptor(e,n);o.enumerable=!1,Object.defineProperty(t.prototype,n,o)}))}))}class V{constructor(t){this.editor=t,this.set("isEnabled",!0),this._disableStack=new Set}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",F,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",F),this.isEnabled=!0)}destroy(){this.stopListening()}static get isContextPlugin(){return!1}}function F(t){t.return=!1,t.stop()}j(V,N);class H{constructor(t){this.editor=t,this.set("value",void 0),this.set("isEnabled",!1),this.affectsData=!0,this._disableStack=new Set,this.decorate("execute"),this.listenTo(this.editor.model.document,"change",(()=>{this.refresh()})),this.on("execute",(t=>{this.isEnabled||t.stop()}),{priority:"high"}),this.listenTo(t,"change:isReadOnly",((t,e,n)=>{n&&this.affectsData?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")}))}refresh(){this.isEnabled=!0}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",U,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",U),this.refresh())}execute(){}destroy(){this.stopListening()}}function U(t){t.return=!1,t.stop()}j(H,N);class q extends H{constructor(t){super(t),this._childCommandsDefinitions=[]}refresh(){}execute(...t){const e=this._getFirstEnabledCommand();return!!e&&e.execute(t)}registerChildCommand(t,e={priority:"normal"}){a(this._childCommandsDefinitions,{command:t,priority:e.priority}),t.on("change:isEnabled",(()=>this._checkEnabled())),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){const t=this._childCommandsDefinitions.find((({command:t})=>t.isEnabled));return t&&t.command}}const G="object"==typeof global&&global&&global.Object===Object&&global;var W="object"==typeof self&&self&&self.Object===Object&&self;const Z=G||W||Function("return this")();const Y=Z.Symbol;var K=Object.prototype,$=K.hasOwnProperty,Q=K.toString,J=Y?Y.toStringTag:void 0;const X=function(t){var e=$.call(t,J),n=t[J];try{t[J]=void 0;var o=!0}catch(t){}var i=Q.call(t);return o&&(e?t[J]=n:delete t[J]),i};var tt=Object.prototype.toString;const et=function(t){return tt.call(t)};var nt=Y?Y.toStringTag:void 0;const ot=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":nt&&nt in Object(t)?X(t):et(t)};const it=function(t,e){return function(n){return t(e(n))}};const rt=it(Object.getPrototypeOf,Object);const st=function(t){return null!=t&&"object"==typeof t};var at=Function.prototype,lt=Object.prototype,ct=at.toString,dt=lt.hasOwnProperty,ut=ct.call(Object);const ht=function(t){if(!st(t)||"[object Object]"!=ot(t))return!1;var e=rt(t);if(null===e)return!0;var n=dt.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ct.call(n)==ut};const mt=function(){this.__data__=[],this.size=0};const gt=function(t,e){return t===e||t!=t&&e!=e};const pt=function(t,e){for(var n=t.length;n--;)if(gt(t[n][0],e))return n;return-1};var ft=Array.prototype.splice;const bt=function(t){var e=this.__data__,n=pt(e,t);return!(n<0)&&(n==e.length-1?e.pop():ft.call(e,n,1),--this.size,!0)};const kt=function(t){var e=this.__data__,n=pt(e,t);return n<0?void 0:e[n][1]};const wt=function(t){return pt(this.__data__,t)>-1};const At=function(t,e){var n=this.__data__,o=pt(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this};function Ct(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t-1&&t%1==0&&t<=9007199254740991};var Be={};Be["[object Float32Array]"]=Be["[object Float64Array]"]=Be["[object Int8Array]"]=Be["[object Int16Array]"]=Be["[object Int32Array]"]=Be["[object Uint8Array]"]=Be["[object Uint8ClampedArray]"]=Be["[object Uint16Array]"]=Be["[object Uint32Array]"]=!0,Be["[object Arguments]"]=Be["[object Array]"]=Be["[object ArrayBuffer]"]=Be["[object Boolean]"]=Be["[object DataView]"]=Be["[object Date]"]=Be["[object Error]"]=Be["[object Function]"]=Be["[object Map]"]=Be["[object Number]"]=Be["[object Object]"]=Be["[object RegExp]"]=Be["[object Set]"]=Be["[object String]"]=Be["[object WeakMap]"]=!1;const Ne=function(t){return st(t)&&Me(t.length)&&!!Be[ot(t)]};const ze=function(t){return function(e){return t(e)}};var Pe="object"==typeof exports&&exports&&!exports.nodeType&&exports,Le=Pe&&"object"==typeof module&&module&&!module.nodeType&&module,Oe=Le&&Le.exports===Pe&&G.process;const Re=function(){try{var t=Le&&Le.require&&Le.require("util").types;return t||Oe&&Oe.binding&&Oe.binding("util")}catch(t){}}();var je=Re&&Re.isTypedArray;const Ve=je?ze(je):Ne;var Fe=Object.prototype.hasOwnProperty;const He=function(t,e){var n=ve(t),o=!n&&_e(t),i=!n&&!o&&Se(t),r=!n&&!o&&!i&&Ve(t),s=n||o||i||r,a=s?be(t.length,String):[],l=a.length;for(var c in t)!e&&!Fe.call(t,c)||s&&("length"==c||i&&("offset"==c||"parent"==c)||r&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||Te(c,l))||a.push(c);return a};var Ue=Object.prototype;const qe=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||Ue)};const Ge=it(Object.keys,Object);var We=Object.prototype.hasOwnProperty;const Ze=function(t){if(!qe(t))return Ge(t);var e=[];for(var n in Object(t))We.call(t,n)&&"constructor"!=n&&e.push(n);return e};const Ye=function(t){return null!=t&&Me(t.length)&&!Dt(t)};const Ke=function(t){return Ye(t)?He(t):Ze(t)};const $e=function(t,e){return t&&fe(e,Ke(e),t)};const Qe=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var Je=Object.prototype.hasOwnProperty;const Xe=function(t){if(!E(t))return Qe(t);var e=qe(t),n=[];for(var o in t)("constructor"!=o||!e&&Je.call(t,o))&&n.push(o);return n};const tn=function(t){return Ye(t)?He(t,!0):Xe(t)};const en=function(t,e){return t&&fe(e,tn(e),t)};var nn="object"==typeof exports&&exports&&!exports.nodeType&&exports,on=nn&&"object"==typeof module&&module&&!module.nodeType&&module,rn=on&&on.exports===nn?Z.Buffer:void 0,sn=rn?rn.allocUnsafe:void 0;const an=function(t,e){if(e)return t.slice();var n=t.length,o=sn?sn(n):new t.constructor(n);return t.copy(o),o};const ln=function(t,e){var n=-1,o=t.length;for(e||(e=Array(o));++n{this._setToTarget(t,o,e[o],n)}))}}function mo(t){return co(t,go)}function go(t){return uo(t)?t:void 0}function po(t){return!(!t||!t[Symbol.iterator])}class fo{constructor(t={},e={}){const n=po(t);if(n||(e=t),this._items=[],this._itemMap=new Map,this._idProperty=e.idProperty||"id",this._bindToExternalToInternalMap=new WeakMap,this._bindToInternalToExternalMap=new WeakMap,this._skippedIndexesFromExternal=[],n)for(const e of t)this._items.push(e),this._itemMap.set(this._getItemIdBeforeAdding(e),e)}get length(){return this._items.length}get first(){return this._items[0]||null}get last(){return this._items[this.length-1]||null}add(t,e){return this.addMany([t],e)}addMany(t,e){if(void 0===e)e=this._items.length;else if(e>this._items.length||e<0)throw new l("collection-add-item-invalid-index",this);let n=0;for(const o of t){const t=this._getItemIdBeforeAdding(o),i=e+n;this._items.splice(i,0,o),this._itemMap.set(t,o),this.fire("add",o,i),n++}return this.fire("change",{added:t,removed:[],index:e}),this}get(t){let e;if("string"==typeof t)e=this._itemMap.get(t);else{if("number"!=typeof t)throw new l("collection-get-invalid-arg",this);e=this._items[t]}return e||null}has(t){if("string"==typeof t)return this._itemMap.has(t);{const e=t[this._idProperty];return e&&this._itemMap.has(e)}}getIndex(t){let e;return e="string"==typeof t?this._itemMap.get(t):t,e?this._items.indexOf(e):-1}remove(t){const[e,n]=this._remove(t);return this.fire("change",{added:[],removed:[e],index:n}),e}map(t,e){return this._items.map(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);const t=Array.from(this._items);for(;this.length;)this._remove(0);this.fire("change",{added:[],removed:t,index:0})}bindTo(t){if(this._bindToCollection)throw new l("collection-bind-to-rebind",this);return this._bindToCollection=t,{as:t=>{this._setUpBindToBinding((e=>new t(e)))},using:t=>{"function"==typeof t?this._setUpBindToBinding(t):this._setUpBindToBinding((e=>e[t]))}}}_setUpBindToBinding(t){const e=this._bindToCollection,n=(n,o,i)=>{const r=e._bindToCollection==this,s=e._bindToInternalToExternalMap.get(o);if(r&&s)this._bindToExternalToInternalMap.set(o,s),this._bindToInternalToExternalMap.set(s,o);else{const n=t(o);if(!n)return void this._skippedIndexesFromExternal.push(i);let r=i;for(const t of this._skippedIndexesFromExternal)i>t&&r--;for(const t of e._skippedIndexesFromExternal)r>=t&&r++;this._bindToExternalToInternalMap.set(o,n),this._bindToInternalToExternalMap.set(n,o),this.add(n,r);for(let t=0;t{const o=this._bindToExternalToInternalMap.get(e);o&&this.remove(o),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce(((t,e)=>(ne&&t.push(e),t)),[])}))}_getItemIdBeforeAdding(t){const e=this._idProperty;let n;if(e in t){if(n=t[e],"string"!=typeof n)throw new l("collection-add-invalid-id",this);if(this.get(n))throw new l("collection-add-item-already-exists",this)}else t[e]=n=r();return n}_remove(t){let e,n,o,i=!1;const r=this._idProperty;if("string"==typeof t?(n=t,o=this._itemMap.get(n),i=!o,o&&(e=this._items.indexOf(o))):"number"==typeof t?(e=t,o=this._items[e],i=!o,o&&(n=o[r])):(o=t,n=o[r],e=this._items.indexOf(o),i=-1==e||!this._itemMap.get(n)),i)throw new l("collection-remove-404",this);this._items.splice(e,1),this._itemMap.delete(n);const s=this._bindToInternalToExternalMap.get(o);return this._bindToInternalToExternalMap.delete(o),this._bindToExternalToInternalMap.delete(s),this.fire("remove",o,e),[o,e]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}j(fo,k);const bo=fo;class ko{constructor(t,e=[],n=[]){this._context=t,this._plugins=new Map,this._availablePlugins=new Map;for(const t of e)t.pluginName&&this._availablePlugins.set(t.pluginName,t);this._contextPlugins=new Map;for(const[t,e]of n)this._contextPlugins.set(t,e),this._contextPlugins.set(e,t),t.pluginName&&this._availablePlugins.set(t.pluginName,t)}*[Symbol.iterator](){for(const t of this._plugins)"function"==typeof t[0]&&(yield t)}get(t){const e=this._plugins.get(t);if(!e){let e=t;throw"function"==typeof t&&(e=t.pluginName||t.name),new l("plugincollection-plugin-not-loaded",this._context,{plugin:e})}return e}has(t){return this._plugins.has(t)}init(t,e=[],n=[]){const o=this,i=this._context;!function t(e,n=new Set){e.forEach((e=>{a(e)&&(n.has(e)||(n.add(e),e.pluginName&&!o._availablePlugins.has(e.pluginName)&&o._availablePlugins.set(e.pluginName,e),e.requires&&t(e.requires,n)))}))}(t),h(t);const r=[...function t(e,n=new Set){return e.map((t=>a(t)?t:o._availablePlugins.get(t))).reduce(((e,o)=>n.has(o)?e:(n.add(o),o.requires&&(h(o.requires,o),t(o.requires,n).forEach((t=>e.add(t)))),e.add(o))),new Set)}(t.filter((t=>!d(t,e))))];!function(t,e){for(const n of e){if("function"!=typeof n)throw new l("plugincollection-replace-plugin-invalid-type",null,{pluginItem:n});const e=n.pluginName;if(!e)throw new l("plugincollection-replace-plugin-missing-name",null,{pluginItem:n});if(n.requires&&n.requires.length)throw new l("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:e});const i=o._availablePlugins.get(e);if(!i)throw new l("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:e});const r=t.indexOf(i);if(-1===r){if(o._contextPlugins.has(i))return;throw new l("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:e})}if(i.requires&&i.requires.length)throw new l("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:e});t.splice(r,1,n),o._availablePlugins.set(e,n)}}(r,n);const s=function(t){return t.map((t=>{const e=o._contextPlugins.get(t)||new t(i);return o._add(t,e),e}))}(r);return m(s,"init").then((()=>m(s,"afterInit"))).then((()=>s));function a(t){return"function"==typeof t}function c(t){return a(t)&&t.isContextPlugin}function d(t,e){return e.some((e=>e===t||(u(t)===e||u(e)===t)))}function u(t){return a(t)?t.pluginName||t.name:t}function h(t,n=null){t.map((t=>a(t)?t:o._availablePlugins.get(t)||t)).forEach((t=>{!function(t,e){if(a(t))return;if(e)throw new l("plugincollection-soft-required",i,{missingPlugin:t,requiredBy:u(e)});throw new l("plugincollection-plugin-not-found",i,{plugin:t})}(t,n),function(t,e){if(!c(e))return;if(c(t))return;throw new l("plugincollection-context-required",i,{plugin:u(t),requiredBy:u(e)})}(t,n),function(t,n){if(!n)return;if(!d(t,e))return;throw new l("plugincollection-required",i,{plugin:u(t),requiredBy:u(n)})}(t,n)}))}function m(t,e){return t.reduce(((t,n)=>n[e]?o._contextPlugins.has(n)?t:t.then(n[e].bind(n)):t),Promise.resolve())}}destroy(){const t=[];for(const[,e]of this)"function"!=typeof e.destroy||this._contextPlugins.has(e)||t.push(e.destroy());return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const n=t.pluginName;if(n){if(this._plugins.has(n))throw new l("plugincollection-plugin-name-conflict",null,{pluginName:n,plugin1:this._plugins.get(n).constructor,plugin2:t});this._plugins.set(n,e)}}}function wo(t){return Array.isArray(t)?t:[t]}function Ao(t,e,n=1){if("number"!=typeof n)throw new l("translation-service-quantity-not-a-number",null,{quantity:n});const o=Object.keys(window.CKEDITOR_TRANSLATIONS).length;1===o&&(t=Object.keys(window.CKEDITOR_TRANSLATIONS)[0]);const i=e.id||e.string;if(0===o||!function(t,e){return!!window.CKEDITOR_TRANSLATIONS[t]&&!!window.CKEDITOR_TRANSLATIONS[t].dictionary[e]}(t,i))return 1!==n?e.plural:e.string;const r=window.CKEDITOR_TRANSLATIONS[t].dictionary,s=window.CKEDITOR_TRANSLATIONS[t].getPluralForm||(t=>1===t?0:1),a=r[i];if("string"==typeof a)return a;return a[Number(s(n))]}j(ko,k),window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={});const Co=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function _o(t){return Co.includes(t)?"rtl":"ltr"}class vo{constructor(t={}){this.uiLanguage=t.uiLanguage||"en",this.contentLanguage=t.contentLanguage||this.uiLanguage,this.uiLanguageDirection=_o(this.uiLanguage),this.contentLanguageDirection=_o(this.contentLanguage),this.t=(t,e)=>this._t(t,e)}get language(){return console.warn("locale-deprecated-language-property: The Locale#language property has been deprecated and will be removed in the near future. Please use #uiLanguage and #contentLanguage properties instead."),this.uiLanguage}_t(t,e=[]){e=wo(e),"string"==typeof t&&(t={string:t});const n=!!t.plural?e[0]:1;return function(t,e){return t.replace(/%(\d+)/g,((t,n)=>nt.destroy()))).then((()=>this.plugins.destroy()))}_addEditor(t,e){if(this._contextOwner)throw new l("context-addeditor-private-context");this.editors.add(t),e&&(this._contextOwner=t)}_removeEditor(t){return this.editors.has(t)&&this.editors.remove(t),this._contextOwner===t?this.destroy():Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names())["plugins","removePlugins","extraPlugins"].includes(e)||(t[e]=this.config.get(e));return t}static create(t){return new Promise((e=>{const n=new this(t);e(n.initPlugins().then((()=>n)))}))}}class xo{constructor(t){this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}function Eo(t,e){const n=Math.min(t.length,e.length);for(let o=0;ot.data.length)throw new l("view-textproxy-wrong-offsetintext",this);if(n<0||e+n>t.data.length)throw new l("view-textproxy-wrong-length",this);this.data=t.data.substring(e,e+n),this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}is(t){return"$textProxy"===t||"view:$textProxy"===t||"textProxy"===t||"view:textProxy"===t}getAncestors(t={includeSelf:!1,parentFirst:!1}){const e=[];let n=t.includeSelf?this.textNode:this.parent;for(;null!==n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}}function Mo(t){return po(t)?new Map(t):function(t){const e=new Map;for(const n in t)e.set(n,t[n]);return e}(t)}class Bo{constructor(...t){this._patterns=[],this.add(...t)}add(...t){for(let e of t)("string"==typeof e||e instanceof RegExp)&&(e={name:e}),this._patterns.push(e)}match(...t){for(const e of t)for(const t of this._patterns){const n=No(e,t);if(n)return{element:e,pattern:t,match:n}}return null}matchAll(...t){const e=[];for(const n of t)for(const t of this._patterns){const o=No(n,t);o&&e.push({element:n,pattern:t,match:o})}return e.length>0?e:null}getElementName(){if(1!==this._patterns.length)return null;const t=this._patterns[0],e=t.name;return"function"==typeof t||!e||e instanceof RegExp?null:e}}function No(t,e){if("function"==typeof e)return e(t);const n={};return e.name&&(n.name=function(t,e){if(t instanceof RegExp)return!!e.match(t);return t===e}(e.name,t.name),!n.name)||e.attributes&&(n.attributes=function(t,e){const n=new Set(e.getAttributeKeys());ht(t)?(void 0!==t.style&&c("matcher-pattern-deprecated-attributes-style-key",t),void 0!==t.class&&c("matcher-pattern-deprecated-attributes-class-key",t)):(n.delete("style"),n.delete("class"));return zo(t,n,(t=>e.getAttribute(t)))}(e.attributes,t),!n.attributes)?null:!(e.classes&&(n.classes=function(t,e){return zo(t,e.getClassNames())}(e.classes,t),!n.classes))&&(!(e.styles&&(n.styles=function(t,e){return zo(t,e.getStyleNames(!0),(t=>e.getStyle(t)))}(e.styles,t),!n.styles))&&n)}function zo(t,e,n){const o=function(t){if(Array.isArray(t))return t.map((t=>ht(t)?(void 0!==t.key&&void 0!==t.value||c("matcher-pattern-missing-key-or-value",t),[t.key,t.value]):[t,!0]));if(ht(t))return Object.entries(t);return[[t,!0]]}(t),i=Array.from(e),r=[];return o.forEach((([t,e])=>{i.forEach((o=>{(function(t,e){return!0===t||t===e||t instanceof RegExp&&e.match(t)})(t,o)&&function(t,e,n){if(!0===t)return!0;const o=n(e);return t===o||t instanceof RegExp&&!!String(o).match(t)}(e,o,n)&&r.push(o)}))})),!o.length||r.lengthi?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var r=Array(i);++o0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}};const Ai=wi(bi);const Ci=function(t,e){return Ai(pi(t,e,hi),t+"")};const _i=function(t,e,n){if(!E(n))return!1;var o=typeof e;return!!("number"==o?Ye(n)&&Te(e,n.length):"string"==o&&e in n)&>(n[e],t)};const vi=function(t){return Ci((function(e,n){var o=-1,i=n.length,r=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(r=t.length>3&&"function"==typeof r?(i--,r):void 0,s&&_i(n[0],n[1],s)&&(r=i<3?void 0:r,i=1),e=Object(e);++oe===t));return Array.isArray(e)}set(t,e){if(E(t))for(const[e,n]of Object.entries(t))this._styleProcessor.toNormalizedForm(e,n,this._styles);else this._styleProcessor.toNormalizedForm(t,e,this._styles)}remove(t){const e=Ii(t);oi(this._styles,e),delete this._styles[t],this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){return this.isEmpty?"":this._getStylesEntries().map((t=>t.join(":"))).sort().join(";")+";"}getAsString(t){if(this.isEmpty)return;if(this._styles[t]&&!E(this._styles[t]))return this._styles[t];const e=this._styleProcessor.getReducedForm(t,this._styles).find((([e])=>e===t));return Array.isArray(e)?e[1]:void 0}getStyleNames(t=!1){if(this.isEmpty)return[];if(t)return this._styleProcessor.getStyleNames(this._styles);return this._getStylesEntries().map((([t])=>t))}clear(){this._styles={}}_getStylesEntries(){const t=[],e=Object.keys(this._styles);for(const n of e)t.push(...this._styleProcessor.getReducedForm(n,this._styles));return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");if(!(e.length>1))return;const n=e.splice(0,e.length-1).join("."),o=ii(this._styles,n);if(!o)return;!Array.from(Object.keys(o)).length&&this.remove(n)}}class Si{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(t,e,n){if(E(e))Ti(n,Ii(t),e);else if(this._normalizers.has(t)){const o=this._normalizers.get(t),{path:i,value:r}=o(e);Ti(n,i,r)}else Ti(n,t,e)}getNormalized(t,e){if(!t)return yi({},e);if(void 0!==e[t])return e[t];if(this._extractors.has(t)){const n=this._extractors.get(t);if("string"==typeof n)return ii(e,n);const o=n(t,e);if(o)return o}return ii(e,Ii(t))}getReducedForm(t,e){const n=this.getNormalized(t,e);if(void 0===n)return[];if(this._reducers.has(t)){return this._reducers.get(t)(n)}return[[t,n]]}getStyleNames(t){const e=Array.from(this._consumables.keys()).filter((e=>{const n=this.getNormalized(e,t);return n&&"object"==typeof n?Object.keys(n).length:n})),n=new Set([...e,...Object.keys(t)]);return Array.from(n.values())}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const n of e)this._mapStyleNames(n,[t])}_mapStyleNames(t,e){this._consumables.has(t)||this._consumables.set(t,[]),this._consumables.get(t).push(...e)}}function Ii(t){return t.replace("-",".")}function Ti(t,e,n){let o=n;E(n)&&(o=yi({},ii(t,e),n)),Ei(t,e,o)}class Mi extends So{constructor(t,e,n,o){if(super(t),this.name=e,this._attrs=function(t){t=Mo(t);for(const[e,n]of t)null===n?t.delete(e):"string"!=typeof n&&t.set(e,String(n));return t}(n),this._children=[],o&&this._insertChild(0,o),this._classes=new Set,this._attrs.has("class")){const t=this._attrs.get("class");Bi(this._classes,t),this._attrs.delete("class")}this._styles=new Di(this.document.stylesProcessor),this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style")),this._customProperties=new Map,this._unsafeAttributesToRender=[]}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}is(t,e=null){return e?e===this.name&&("element"===t||"view:element"===t):"element"===t||"view:element"===t||"node"===t||"view:node"===t}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){this._classes.size>0&&(yield"class"),this._styles.isEmpty||(yield"style"),yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries(),this._classes.size>0&&(yield["class",this.getAttribute("class")]),this._styles.isEmpty||(yield["style",this.getAttribute("style")])}getAttribute(t){if("class"==t)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==t){const t=this._styles.toString();return""==t?void 0:t}return this._attrs.get(t)}hasAttribute(t){return"class"==t?this._classes.size>0:"style"==t?!this._styles.isEmpty:this._attrs.has(t)}isSimilar(t){if(!(t instanceof Mi))return!1;if(this===t)return!0;if(this.name!=t.name)return!1;if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size)return!1;for(const[e,n]of this._attrs)if(!t._attrs.has(e)||t._attrs.get(e)!==n)return!1;for(const e of this._classes)if(!t._classes.has(e))return!1;for(const e of this._styles.getStyleNames())if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e))return!1;return!0}hasClass(...t){for(const e of t)if(!this._classes.has(e))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(t=!1){return this._styles.getStyleNames(t)}hasStyle(...t){for(const e of t)if(!this._styles.has(e))return!1;return!0}findAncestor(...t){const e=new Bo(...t);let n=this.parent;for(;n;){if(e.match(n))return n;n=n.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(","),e=this._styles.toString(),n=Array.from(this._attrs).map((t=>`${t[0]}="${t[1]}"`)).sort().join(" ");return this.name+(""==t?"":` class="${t}"`)+(e?` style="${e}"`:"")+(""==n?"":` ${n}`)}shouldRenderUnsafeAttribute(t){return this._unsafeAttributesToRender.includes(t)}_clone(t=!1){const e=[];if(t)for(const n of this.getChildren())e.push(n._clone(t));const n=new this.constructor(this.document,this.name,this._attrs,e);return n._classes=new Set(this._classes),n._styles.set(this._styles.getNormalized()),n._customProperties=new Map(this._customProperties),n.getFillerOffset=this.getFillerOffset,n._unsafeAttributesToRender=this._unsafeAttributesToRender,n}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=function(t,e){if("string"==typeof e)return[new Io(t,e)];po(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Io(t,e):e instanceof To?new Io(t,e.data):e))}(this.document,e);for(const e of o)null!==e.parent&&e._remove(),e.parent=this,e.document=this.document,this._children.splice(t,0,e),t++,n++;return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n0&&(this._classes.clear(),!0):"style"==t?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this);for(const e of wo(t))this._classes.add(e)}_removeClass(t){this._fireChange("attributes",this);for(const e of wo(t))this._classes.delete(e)}_setStyle(t,e){this._fireChange("attributes",this),this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this);for(const e of wo(t))this._styles.remove(e)}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function Bi(t,e){const n=e.split(/\s+/);t.clear(),n.forEach((e=>t.add(e)))}class Ni extends Mi{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=zi}is(t,e=null){return e?e===this.name&&("containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t}}function zi(){const t=[...this.getChildren()],e=t[this.childCount-1];if(e&&e.is("element","br"))return this.childCount;for(const e of t)if(!e.is("uiElement"))return null;return this.childCount}class Pi extends Ni{constructor(t,e,n,o){super(t,e,n,o),this.set("isReadOnly",!1),this.set("isFocused",!1),this.bind("isReadOnly").to(t),this.bind("isFocused").to(t,"isFocused",(e=>e&&t.selection.editableElement==this)),this.listenTo(t.selection,"change",(()=>{this.isFocused=t.isFocused&&t.selection.editableElement==this}))}is(t,e=null){return e?e===this.name&&("editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t}destroy(){this.stopListening()}}j(Pi,N);const Li=Symbol("rootName");class Oi extends Pi{constructor(t,e){super(t,e),this.rootName="main"}is(t,e=null){return e?e===this.name&&("rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t}get rootName(){return this.getCustomProperty(Li)}set rootName(t){this._setCustomProperty(Li,t)}set _name(t){this.name=t}}class Ri{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new l("view-tree-walker-no-start-position",null);if(t.direction&&"forward"!=t.direction&&"backward"!=t.direction)throw new l("view-tree-walker-unknown-direction",t.startPosition,{direction:t.direction});this.boundaries=t.boundaries||null,t.startPosition?this.position=ji._createAt(t.startPosition):this.position=ji._createAt(t.boundaries["backward"==t.direction?"end":"start"]),this.direction=t.direction||"forward",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(t){let e,n,o;do{o=this.position,({done:e,value:n}=this.next())}while(!e&&t(n));e||(this.position=o)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let t=this.position.clone();const e=this.position,n=t.parent;if(null===n.parent&&t.offset===n.childCount)return{done:!0};if(n===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0};let o;if(n instanceof Io){if(t.isAtEnd)return this.position=ji._createAfter(n),this._next();o=n.data[t.offset]}else o=n.getChild(t.offset);if(o instanceof Mi)return this.shallow?t.offset++:t=new ji(o,0),this.position=t,this._formatReturnValue("elementStart",o,e,t,1);if(o instanceof Io){if(this.singleCharacters)return t=new ji(o,0),this.position=t,this._next();{let n,i=o.data.length;return o==this._boundaryEndParent?(i=this.boundaries.end.offset,n=new To(o,0,i),t=ji._createAfter(n)):(n=new To(o,0,o.data.length),t.offset++),this.position=t,this._formatReturnValue("text",n,e,t,i)}}if("string"==typeof o){let o;if(this.singleCharacters)o=1;else{o=(n===this._boundaryEndParent?this.boundaries.end.offset:n.data.length)-t.offset}const i=new To(n,t.offset,o);return t.offset+=o,this.position=t,this._formatReturnValue("text",i,e,t,o)}return t=ji._createAfter(n),this.position=t,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",n,e,t)}_previous(){let t=this.position.clone();const e=this.position,n=t.parent;if(null===n.parent&&0===t.offset)return{done:!0};if(n==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0};let o;if(n instanceof Io){if(t.isAtStart)return this.position=ji._createBefore(n),this._previous();o=n.data[t.offset-1]}else o=n.getChild(t.offset-1);if(o instanceof Mi)return this.shallow?(t.offset--,this.position=t,this._formatReturnValue("elementStart",o,e,t,1)):(t=new ji(o,o.childCount),this.position=t,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",o,e,t));if(o instanceof Io){if(this.singleCharacters)return t=new ji(o,o.data.length),this.position=t,this._previous();{let n,i=o.data.length;if(o==this._boundaryStartParent){const e=this.boundaries.start.offset;n=new To(o,e,o.data.length-e),i=n.data.length,t=ji._createBefore(n)}else n=new To(o,0,o.data.length),t.offset--;return this.position=t,this._formatReturnValue("text",n,e,t,i)}}if("string"==typeof o){let o;if(this.singleCharacters)o=1;else{const e=n===this._boundaryStartParent?this.boundaries.start.offset:0;o=t.offset-e}t.offset-=o;const i=new To(n,t.offset,o);return this.position=t,this._formatReturnValue("text",i,e,t,o)}return t=ji._createBefore(n),this.position=t,this._formatReturnValue("elementStart",n,e,t,1)}_formatReturnValue(t,e,n,o,i){return e instanceof To&&(e.offsetInText+e.data.length==e.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?n=ji._createAfter(e.textNode):(o=ji._createAfter(e.textNode),this.position=o)),0===e.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?n=ji._createBefore(e.textNode):(o=ji._createBefore(e.textNode),this.position=o))),{done:!1,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}}class ji{constructor(t,e){this.parent=t,this.offset=e}get nodeAfter(){return this.parent.is("$text")?null:this.parent.getChild(this.offset)||null}get nodeBefore(){return this.parent.is("$text")?null:this.parent.getChild(this.offset-1)||null}get isAtStart(){return 0===this.offset}get isAtEnd(){const t=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;for(;!(t instanceof Pi);){if(!t.parent)return null;t=t.parent}return t}getShiftedBy(t){const e=ji._createAt(this),n=e.offset+t;return e.offset=n<0?0:n,e}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new Ri(e);return n.skip(t),n.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(t){const e=this.getAncestors(),n=t.getAncestors();let o=0;for(;e[o]==n[o]&&e[o];)o++;return 0===o?null:e[o-1]}is(t){return"position"===t||"view:position"===t}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return"before"==this.compareWith(t)}isAfter(t){return"after"==this.compareWith(t)}compareWith(t){if(this.root!==t.root)return"different";if(this.isEqual(t))return"same";const e=this.parent.is("node")?this.parent.getPath():[],n=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset),n.push(t.offset);const o=Eo(e,n);switch(o){case"prefix":return"before";case"extension":return"after";default:return e[o]0?new this(n,o):new this(o,n)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("$textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(ji._createBefore(t),e)}}function Fi(t){return!(!t.item.is("attributeElement")&&!t.item.is("uiElement"))}function Hi(t){let e=0;for(const n of t)e++;return e}class Ui{constructor(t=null,e,n){this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",this.setTo(t,e,n)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.end:t.start).clone()}get focus(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.start:t.end).clone()}get isCollapsed(){return 1===this.rangeCount&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){return this.anchor?this.anchor.editableElement:null}*getRanges(){for(const t of this._ranges)yield t.clone()}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel)return!1;if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let n=!1;for(const o of t._ranges)if(e.isEqual(o)){n=!0;break}if(!n)return!1}return!0}isSimilar(t){if(this.isBackward!=t.isBackward)return!1;const e=Hi(this.getRanges());if(e!=Hi(t.getRanges()))return!1;if(0==e)return!0;for(let e of this.getRanges()){e=e.getTrimmed();let n=!1;for(let o of t.getRanges())if(o=o.getTrimmed(),e.start.isEqual(o.start)&&e.end.isEqual(o.end)){n=!0;break}if(!n)return!1}return!0}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}setTo(t,e,n){if(null===t)this._setRanges([]),this._setFakeOptions(e);else if(t instanceof Ui||t instanceof qi)this._setRanges(t.getRanges(),t.isBackward),this._setFakeOptions({fake:t.isFake,label:t.fakeSelectionLabel});else if(t instanceof Vi)this._setRanges([t],e&&e.backward),this._setFakeOptions(e);else if(t instanceof ji)this._setRanges([new Vi(t)]),this._setFakeOptions(e);else if(t instanceof So){const o=!!n&&!!n.backward;let i;if(void 0===e)throw new l("view-selection-setto-required-second-parameter",this);i="in"==e?Vi._createIn(t):"on"==e?Vi._createOn(t):new Vi(ji._createAt(t,e)),this._setRanges([i],o),this._setFakeOptions(n)}else{if(!po(t))throw new l("view-selection-setto-not-selectable",this);this._setRanges(t,e&&e.backward),this._setFakeOptions(e)}this.fire("change")}setFocus(t,e){if(null===this.anchor)throw new l("view-selection-setfocus-no-ranges",this);const n=ji._createAt(t,e);if("same"==n.compareWith(this.focus))return;const o=this.anchor;this._ranges.pop(),"before"==n.compareWith(o)?this._addRange(new Vi(n,o),!0):this._addRange(new Vi(o,n)),this.fire("change")}is(t){return"selection"===t||"view:selection"===t}_setRanges(t,e=!1){t=Array.from(t),this._ranges=[];for(const e of t)this._addRange(e);this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake,this._fakeSelectionLabel=t.fake&&t.label||""}_addRange(t,e=!1){if(!(t instanceof Vi))throw new l("view-selection-add-range-not-range",this);this._pushRange(t),this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges)if(t.isIntersecting(e))throw new l("view-selection-range-intersects",this,{addedRange:t,intersectingRange:e});this._ranges.push(new Vi(t.start,t.end))}}j(Ui,k);class qi{constructor(t=null,e,n){this._selection=new Ui,this._selection.delegate("change").to(this),this._selection.setTo(t,e,n)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}is(t){return"selection"===t||"documentSelection"==t||"view:selection"==t||"view:documentSelection"==t}_setTo(t,e,n){this._selection.setTo(t,e,n)}_setFocus(t,e){this._selection.setFocus(t,e)}}j(qi,k);class Gi extends e{constructor(t,e,n){super(t,e),this.startRange=n,this._eventPhase="none",this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}const Wi=Symbol("bubbling contexts"),Zi={fire(t,...n){try{const o=t instanceof e?t:new e(this,t),i=Ji(this);if(!i.size)return;if(Ki(o,"capturing",this),$i(i,"$capture",o,...n))return o.return;const r=o.startRange||this.selection.getFirstRange(),s=r?r.getContainedElement():null,a=!!s&&Boolean(Qi(i,s));let l=s||function(t){if(!t)return null;const e=t.start.parent,n=t.end.parent,o=e.getPath(),i=n.getPath();return o.length>i.length?e:n}(r);if(Ki(o,"atTarget",l),!a){if($i(i,"$text",o,...n))return o.return;Ki(o,"bubbling",l)}for(;l;){if(l.is("rootElement")){if($i(i,"$root",o,...n))return o.return}else if(l.is("element")&&$i(i,l.name,o,...n))return o.return;if($i(i,l,o,...n))return o.return;l=l.parent,Ki(o,"bubbling",l)}return Ki(o,"bubbling",this),$i(i,"$document",o,...n),o.return}catch(t){l.rethrowUnexpectedError(t,this)}},_addEventListener(t,e,n){const o=wo(n.context||"$document"),i=Ji(this);for(const r of o){let o=i.get(r);o||(o=Object.create(k),i.set(r,o)),this.listenTo(o,t,e,n)}},_removeEventListener(t,e){const n=Ji(this);for(const o of n.values())this.stopListening(o,t,e)}},Yi=Zi;function Ki(t,e,n){t instanceof Gi&&(t._eventPhase=e,t._currentTarget=n)}function $i(t,e,n,...o){const i="string"==typeof e?t.get(e):Qi(t,e);return!!i&&(i.fire(n,...o),n.stop.called)}function Qi(t,e){for(const[n,o]of t)if("function"==typeof n&&n(e))return o;return null}function Ji(t){return t[Wi]||(t[Wi]=new Map),t[Wi]}class Xi{constructor(t){this.selection=new qi,this.roots=new bo({idProperty:"rootName"}),this.stylesProcessor=t,this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isSelecting",!1),this.set("isComposing",!1),this._postFixers=new Set}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.map((t=>t.destroy())),this.stopListening()}_callPostFixers(t){let e=!1;do{for(const n of this._postFixers)if(e=n(t),e)break}while(e)}}j(Xi,Yi),j(Xi,N);class tr extends Mi{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=er,this._priority=10,this._id=null,this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(null===this.id)throw new l("attribute-element-get-elements-with-same-id-no-id",this);return new Set(this._clonesGroup)}is(t,e=null){return e?e===this.name&&("attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t):"attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t}isSimilar(t){return null!==this.id||null!==t.id?this.id===t.id:super.isSimilar(t)&&this.priority==t.priority}_clone(t){const e=super._clone(t);return e._priority=this._priority,e._id=this._id,e}}function er(){if(nr(this))return null;let t=this.parent;for(;t&&t.is("attributeElement");){if(nr(t)>1)return null;t=t.parent}return!t||nr(t)>1?null:this.childCount}function nr(t){return Array.from(t.getChildren()).filter((t=>!t.is("uiElement"))).length}tr.DEFAULT_PRIORITY=10;class or extends Mi{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=ir}is(t,e=null){return e?e===this.name&&("emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t):"emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t}_insertChild(t,e){if(e&&(e instanceof So||Array.from(e).length>0))throw new l("view-emptyelement-cannot-add",[this,e])}}function ir(){return null}const rr=navigator.userAgent.toLowerCase(),sr={isMac:lr(rr),isWindows:function(t){return t.indexOf("windows")>-1}(rr),isGecko:function(t){return!!t.match(/gecko\/\d+/)}(rr),isSafari:function(t){return t.indexOf(" applewebkit/")>-1&&-1===t.indexOf("chrome")}(rr),isiOS:function(t){return!!t.match(/iphone|ipad/i)||lr(t)&&navigator.maxTouchPoints>0}(rr),isAndroid:function(t){return t.indexOf("android")>-1}(rr),isBlink:function(t){return t.indexOf("chrome/")>-1&&t.indexOf("edge/")<0}(rr),features:{isRegExpUnicodePropertySupported:function(){let t=!1;try{t=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(t){}return t}()}},ar=sr;function lr(t){return t.indexOf("macintosh")>-1}const cr={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"},dr={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"},ur=function(){const t={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let e=65;e<=90;e++){const n=String.fromCharCode(e);t[n.toLowerCase()]=e}for(let e=48;e<=57;e++)t[e-48]=e;for(let e=112;e<=123;e++)t["f"+(e-111)]=e;for(const e of"`-=[];',./\\")t[e]=e.charCodeAt(0);return t}(),hr=Object.fromEntries(Object.entries(ur).map((([t,e])=>[e,t.charAt(0).toUpperCase()+t.slice(1)])));function mr(t){let e;if("string"==typeof t){if(e=ur[t.toLowerCase()],!e)throw new l("keyboard-unknown-key",null,{key:t})}else e=t.keyCode+(t.altKey?ur.alt:0)+(t.ctrlKey?ur.ctrl:0)+(t.shiftKey?ur.shift:0)+(t.metaKey?ur.cmd:0);return e}function gr(t){return"string"==typeof t&&(t=function(t){return t.split("+").map((t=>t.trim()))}(t)),t.map((t=>"string"==typeof t?function(t){if(t.endsWith("!"))return mr(t.slice(0,-1));const e=mr(t);return ar.isMac&&e==ur.ctrl?ur.cmd:e}(t):t)).reduce(((t,e)=>e+t),0)}function pr(t){let e=gr(t);return Object.entries(ar.isMac?cr:dr).reduce(((t,[n,o])=>(0!=(e&ur[n])&&(e&=~ur[n],t+=o),t)),"")+(e?hr[e]:"")}function fr(t,e){const n="ltr"===e;switch(t){case ur.arrowleft:return n?"left":"right";case ur.arrowright:return n?"right":"left";case ur.arrowup:return"up";case ur.arrowdown:return"down"}}class br extends Mi{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=wr}is(t,e=null){return e?e===this.name&&("uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t):"uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t}_insertChild(t,e){if(e&&(e instanceof So||Array.from(e).length>0))throw new l("view-uielement-cannot-add",this)}render(t){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys())e.setAttribute(t,this.getAttribute(t));return e}}function kr(t){t.document.on("arrowKey",((e,n)=>function(t,e,n){if(e.keyCode==ur.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection(),o=1==t.rangeCount&&t.getRangeAt(0).collapsed;if(o||e.shiftKey){const e=t.focusNode,i=t.focusOffset,r=n.domPositionToView(e,i);if(null===r)return;let s=!1;const a=r.getLastMatchingPosition((t=>(t.item.is("uiElement")&&(s=!0),!(!t.item.is("uiElement")&&!t.item.is("attributeElement")))));if(s){const e=n.viewPositionToDom(a);o?t.collapse(e.parent,e.offset):t.extend(e.parent,e.offset)}}}}(0,n,t.domConverter)),{priority:"low"})}function wr(){return null}class Ar extends Mi{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=Cr}is(t,e=null){return e?e===this.name&&("rawElement"===t||"view:rawElement"===t||"element"===t||"view:element"===t):"rawElement"===t||"view:rawElement"===t||t===this.name||t==="view:"+this.name||"element"===t||"view:element"===t||"node"===t||"view:node"===t}_insertChild(t,e){if(e&&(e instanceof So||Array.from(e).length>0))throw new l("view-rawelement-cannot-add",[this,e])}}function Cr(){return null}class _r{constructor(t,e){this.document=t,this._children=[],e&&this._insertChild(0,e)}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}is(t){return"documentFragment"===t||"view:documentFragment"===t}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=function(t,e){if("string"==typeof e)return[new Io(t,e)];po(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Io(t,e):e instanceof To?new Io(t,e.data):e))}(this.document,e);for(const e of o)null!==e.parent&&e._remove(),e.parent=this,this._children.splice(t,0,e),t++,n++;return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n{}),o.renderUnsafeAttributes&&i._unsafeAttributesToRender.push(...o.renderUnsafeAttributes),i}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){ht(t)&&void 0===n&&(n=e),n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}breakAttributes(t){return t instanceof ji?this._breakAttributes(t):this._breakAttributesRange(t)}breakContainer(t){const e=t.parent;if(!e.is("containerElement"))throw new l("view-writer-break-non-container-element",this.document);if(!e.parent)throw new l("view-writer-break-root",this.document);if(t.isAtStart)return ji._createBefore(e);if(!t.isAtEnd){const n=e._clone(!1);this.insert(ji._createAfter(e),n);const o=new Vi(t,ji._createAt(e,"end")),i=new ji(n,0);this.move(o,i)}return ji._createAfter(e)}mergeAttributes(t){const e=t.offset,n=t.parent;if(n.is("$text"))return t;if(n.is("attributeElement")&&0===n.childCount){const t=n.parent,e=n.index;return n._remove(),this._removeFromClonedElementsGroup(n),this.mergeAttributes(new ji(t,e))}const o=n.getChild(e-1),i=n.getChild(e);if(!o||!i)return t;if(o.is("$text")&&i.is("$text"))return Sr(o,i);if(o.is("attributeElement")&&i.is("attributeElement")&&o.isSimilar(i)){const t=o.childCount;return o._appendChild(i.getChildren()),i._remove(),this._removeFromClonedElementsGroup(i),this.mergeAttributes(new ji(o,t))}return t}mergeContainers(t){const e=t.nodeBefore,n=t.nodeAfter;if(!(e&&n&&e.is("containerElement")&&n.is("containerElement")))throw new l("view-writer-merge-containers-invalid-position",this.document);const o=e.getChild(e.childCount-1),i=o instanceof Io?ji._createAt(o,"end"):ji._createAt(e,"end");return this.move(Vi._createIn(n),ji._createAt(e,"end")),this.remove(Vi._createOn(n)),i}insert(t,e){Ir(e=po(e)?[...e]:[e],this.document);const n=e.reduce(((t,e)=>{const n=t[t.length-1],o=!e.is("uiElement");return n&&n.breakAttributes==o?n.nodes.push(e):t.push({breakAttributes:o,nodes:[e]}),t}),[]);let o=null,i=t;for(const{nodes:t,breakAttributes:e}of n){const n=this._insertNodes(i,t,e);o||(o=n.start),i=n.end}return o?new Vi(o,i):new Vi(t)}remove(t){const e=t instanceof Vi?t:Vi._createOn(t);if(Br(e,this.document),e.isCollapsed)return new _r(this.document);const{start:n,end:o}=this._breakAttributesRange(e,!0),i=n.parent,r=o.offset-n.offset,s=i._removeChildren(n.offset,r);for(const t of s)this._removeFromClonedElementsGroup(t);const a=this.mergeAttributes(n);return e.start=a,e.end=a.clone(),new _r(this.document,s)}clear(t,e){Br(t,this.document);const n=t.getWalker({direction:"backward",ignoreElementEnd:!0});for(const o of n){const n=o.item;let i;if(n.is("element")&&e.isSimilar(n))i=Vi._createOn(n);else if(!o.nextPosition.isAfter(t.start)&&n.is("$textProxy")){const t=n.getAncestors().find((t=>t.is("element")&&e.isSimilar(t)));t&&(i=Vi._createIn(t))}i&&(i.end.isAfter(t.end)&&(i.end=t.end),i.start.isBefore(t.start)&&(i.start=t.start),this.remove(i))}}move(t,e){let n;if(e.isAfter(t.end)){const o=(e=this._breakAttributes(e,!0)).parent,i=o.childCount;t=this._breakAttributesRange(t,!0),n=this.remove(t),e.offset+=o.childCount-i}else n=this.remove(t);return this.insert(e,n)}wrap(t,e){if(!(e instanceof tr))throw new l("view-writer-wrap-invalid-attribute",this.document);if(Br(t,this.document),t.isCollapsed){let o=t.start;o.parent.is("element")&&(n=o.parent,!Array.from(n.getChildren()).some((t=>!t.is("uiElement"))))&&(o=o.getLastMatchingPosition((t=>t.item.is("uiElement")))),o=this._wrapPosition(o,e);const i=this.document.selection;return i.isCollapsed&&i.getFirstPosition().isEqual(t.start)&&this.setSelection(o),new Vi(o)}return this._wrapRange(t,e);var n}unwrap(t,e){if(!(e instanceof tr))throw new l("view-writer-unwrap-invalid-attribute",this.document);if(Br(t,this.document),t.isCollapsed)return t;const{start:n,end:o}=this._breakAttributesRange(t,!0),i=n.parent,r=this._unwrapChildren(i,n.offset,o.offset,e),s=this.mergeAttributes(r.start);s.isEqual(r.start)||r.end.offset--;const a=this.mergeAttributes(r.end);return new Vi(s,a)}rename(t,e){const n=new Ni(this.document,t,e.getAttributes());return this.insert(ji._createAfter(e),n),this.move(Vi._createIn(e),ji._createAt(n,0)),this.remove(Vi._createOn(e)),n}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return ji._createAt(t,e)}createPositionAfter(t){return ji._createAfter(t)}createPositionBefore(t){return ji._createBefore(t)}createRange(t,e){return new Vi(t,e)}createRangeOn(t){return Vi._createOn(t)}createRangeIn(t){return Vi._createIn(t)}createSelection(t,e,n){return new Ui(t,e,n)}createSlot(t){if(!this._slotFactory)throw new l("view-writer-invalid-create-slot-context",this.document);return this._slotFactory(this,t)}_registerSlotFactory(t){this._slotFactory=t}_clearSlotFactory(){this._slotFactory=null}_insertNodes(t,e,n){let o,i;if(o=n?yr(t):t.parent.is("$text")?t.parent.parent:t.parent,!o)throw new l("view-writer-invalid-position-container",this.document);i=n?this._breakAttributes(t,!0):t.parent.is("$text")?Dr(t):t;const r=o._insertChild(i.offset,e);for(const t of e)this._addToClonedElementsGroup(t);const s=i.getShiftedBy(r),a=this.mergeAttributes(i);a.isEqual(i)||s.offset--;const c=this.mergeAttributes(s);return new Vi(a,c)}_wrapChildren(t,e,n,o){let i=e;const r=[];for(;i!1,t.parent._insertChild(t.offset,n);const o=new Vi(t,t.getShiftedBy(1));this.wrap(o,e);const i=new ji(n.parent,n.index);n._remove();const r=i.nodeBefore,s=i.nodeAfter;return r instanceof Io&&s instanceof Io?Sr(r,s):Er(i)}_wrapAttributeElement(t,e){if(!Nr(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const n of t.getAttributeKeys())if("class"!==n&&"style"!==n&&e.hasAttribute(n)&&e.getAttribute(n)!==t.getAttribute(n))return!1;for(const n of t.getStyleNames())if(e.hasStyle(n)&&e.getStyle(n)!==t.getStyle(n))return!1;for(const n of t.getAttributeKeys())"class"!==n&&"style"!==n&&(e.hasAttribute(n)||this.setAttribute(n,t.getAttribute(n),e));for(const n of t.getStyleNames())e.hasStyle(n)||this.setStyle(n,t.getStyle(n),e);for(const n of t.getClassNames())e.hasClass(n)||this.addClass(n,e);return!0}_unwrapAttributeElement(t,e){if(!Nr(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const n of t.getAttributeKeys())if("class"!==n&&"style"!==n&&(!e.hasAttribute(n)||e.getAttribute(n)!==t.getAttribute(n)))return!1;if(!e.hasClass(...t.getClassNames()))return!1;for(const n of t.getStyleNames())if(!e.hasStyle(n)||e.getStyle(n)!==t.getStyle(n))return!1;for(const n of t.getAttributeKeys())"class"!==n&&"style"!==n&&this.removeAttribute(n,e);return this.removeClass(Array.from(t.getClassNames()),e),this.removeStyle(Array.from(t.getStyleNames()),e),!0}_breakAttributesRange(t,e=!1){const n=t.start,o=t.end;if(Br(t,this.document),t.isCollapsed){const n=this._breakAttributes(t.start,e);return new Vi(n,n)}const i=this._breakAttributes(o,e),r=i.parent.childCount,s=this._breakAttributes(n,e);return i.offset+=i.parent.childCount-r,new Vi(s,i)}_breakAttributes(t,e=!1){const n=t.offset,o=t.parent;if(t.parent.is("emptyElement"))throw new l("view-writer-cannot-break-empty-element",this.document);if(t.parent.is("uiElement"))throw new l("view-writer-cannot-break-ui-element",this.document);if(t.parent.is("rawElement"))throw new l("view-writer-cannot-break-raw-element",this.document);if(!e&&o.is("$text")&&Mr(o.parent))return t.clone();if(Mr(o))return t.clone();if(o.is("$text"))return this._breakAttributes(Dr(t),e);if(n==o.childCount){const t=new ji(o.parent,o.index+1);return this._breakAttributes(t,e)}if(0===n){const t=new ji(o.parent,o.index);return this._breakAttributes(t,e)}{const t=o.index+1,i=o._clone();o.parent._insertChild(t,i),this._addToClonedElementsGroup(i);const r=o.childCount-n,s=o._removeChildren(n,r);i._appendChild(s);const a=new ji(o.parent,t);return this._breakAttributes(a,e)}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement"))return;if(t.is("element"))for(const e of t.getChildren())this._addToClonedElementsGroup(e);const e=t.id;if(!e)return;let n=this._cloneGroups.get(e);n||(n=new Set,this._cloneGroups.set(e,n)),n.add(t),t._clonesGroup=n}_removeFromClonedElementsGroup(t){if(t.is("element"))for(const e of t.getChildren())this._removeFromClonedElementsGroup(e);const e=t.id;if(!e)return;const n=this._cloneGroups.get(e);n&&n.delete(t)}}function yr(t){let e=t.parent;for(;!Mr(e);){if(!e)return;e=e.parent}return e}function xr(t,e){return t.prioritye.priority)&&t.getIdentity()n instanceof t)))throw new l("view-writer-insert-invalid-node-type",e);n.is("$text")||Ir(n.getChildren(),e)}}const Tr=[Io,tr,Ni,or,Ar,br];function Mr(t){return t&&(t.is("containerElement")||t.is("documentFragment"))}function Br(t,e){const n=yr(t.start),o=yr(t.end);if(!n||!o||n!==o)throw new l("view-writer-invalid-range-container",e)}function Nr(t,e){return null===t.id&&null===e.id}function zr(t){return"[object Text]"==Object.prototype.toString.call(t)}const Pr=t=>t.createTextNode(" "),Lr=t=>{const e=t.createElement("span");return e.dataset.ckeFiller=!0,e.innerText=" ",e},Or=t=>{const e=t.createElement("br");return e.dataset.ckeFiller=!0,e},Rr="⁠".repeat(7);function jr(t){return zr(t)&&t.data.substr(0,7)===Rr}function Vr(t){return 7==t.data.length&&jr(t)}function Fr(t){return jr(t)?t.data.slice(7):t.data}function Hr(t,e){if(e.keyCode==ur.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(1==t.rangeCount&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer,n=t.getRangeAt(0).startOffset;jr(e)&&n<=7&&t.collapse(e,0)}}}function Ur(t,e,n,o=!1){n=n||function(t,e){return t===e};const i=Array.isArray(t)?t:Array.prototype.slice.call(t),r=Array.isArray(e)?e:Array.prototype.slice.call(e),s=function(t,e,n){const o=qr(t,e,n);if(-1===o)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const i=Gr(t,o),r=Gr(e,o),s=qr(i,r,n),a=t.length-s,l=e.length-s;return{firstIndex:o,lastIndexOld:a,lastIndexNew:l}}(i,r,n);return o?function(t,e){const{firstIndex:n,lastIndexOld:o,lastIndexNew:i}=t;if(-1===n)return Array(e).fill("equal");let r=[];n>0&&(r=r.concat(Array(n).fill("equal")));i-n>0&&(r=r.concat(Array(i-n).fill("insert")));o-n>0&&(r=r.concat(Array(o-n).fill("delete")));i0&&n.push({index:o,type:"insert",values:t.slice(o,r)});i-o>0&&n.push({index:o+(r-o),type:"delete",howMany:i-o});return n}(r,s)}function qr(t,e,n){for(let o=0;o200||i>200||o+i>300)return Wr.fastDiff(t,e,n,!0);let r,s;if(ic?-1:1;d[o+h]&&(d[o]=d[o+h].slice(0)),d[o]||(d[o]=[]),d[o].push(i>c?r:s);let m=Math.max(i,c),g=m-o;for(;gc;m--)u[m]=h(m);u[c]=h(c),g++}while(u[c]!==l);return d[c].slice(1)}function Zr(t,e,n){t.insertBefore(n,t.childNodes[e]||null)}function Yr(t){const e=t.parentNode;e&&e.removeChild(t)}function Kr(t){return t&&t.nodeType===Node.COMMENT_NODE}function $r(t){if(t){if(t.defaultView)return t instanceof t.defaultView.Document;if(t.ownerDocument&&t.ownerDocument.defaultView)return t instanceof t.ownerDocument.defaultView.Node}return!1}Wr.fastDiff=Ur;var Qr=n(3379),Jr=n.n(Qr),Xr=n(9037),ts=n.n(Xr),es=n(569),ns=n.n(es),os=n(8575),is=n.n(os),rs=n(9216),ss=n.n(rs),as=n(4401),ls={attributes:{"data-cke":!0}};ls.setAttributes=is(),ls.insert=ns().bind(null,"head"),ls.domAPI=ts(),ls.insertStyleElement=ss();Jr()(as.Z,ls);as.Z&&as.Z.locals&&as.Z.locals;class cs{constructor(t,e){this.domDocuments=new Set,this.domConverter=t,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this.selection=e,this.set("isFocused",!1),this.set("isSelecting",!1),ar.isBlink&&!ar.isAndroid&&this.on("change:isSelecting",(()=>{this.isSelecting||this.render()})),this._inlineFiller=null,this._fakeSelectionContainer=null}markToSync(t,e){if("text"===t)this.domConverter.mapViewToDom(e.parent)&&this.markedTexts.add(e);else{if(!this.domConverter.mapViewToDom(e))return;if("attributes"===t)this.markedAttributes.add(e);else{if("children"!==t)throw new l("view-renderer-unknown-type",this);this.markedChildren.add(e)}}}render(){let t;const e=!(ar.isBlink&&!ar.isAndroid)||!this.isSelecting;for(const t of this.markedChildren)this._updateChildrenMappings(t);e?(this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?t=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(t=this.selection.getFirstPosition(),this.markedChildren.add(t.parent))):this._inlineFiller&&this._inlineFiller.parentNode&&(t=this.domConverter.domPositionToView(this._inlineFiller),t&&t.parent.is("$text")&&(t=ji._createBefore(t.parent)));for(const t of this.markedAttributes)this._updateAttrs(t);for(const e of this.markedChildren)this._updateChildren(e,{inlineFillerPosition:t});for(const e of this.markedTexts)!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)&&this._updateText(e,{inlineFillerPosition:t});if(e)if(t){const e=this.domConverter.viewPositionToDom(t),n=e.parent.ownerDocument;jr(e.parent)?this._inlineFiller=e.parent:this._inlineFiller=ds(n,e.parent,e.offset)}else this._inlineFiller=null;this._updateFocus(),this._updateSelection(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(t){if(!this.domConverter.mapViewToDom(t))return;const e=Array.from(this.domConverter.mapViewToDom(t).childNodes),n=Array.from(this.domConverter.viewChildrenToDom(t,{withChildren:!1})),o=this._diffNodeLists(e,n),i=this._findReplaceActions(o,e,n);if(-1!==i.indexOf("replace")){const o={equal:0,insert:0,delete:0};for(const r of i)if("replace"===r){const i=o.equal+o.insert,r=o.equal+o.delete,s=t.getChild(i);!s||s.is("uiElement")||s.is("rawElement")||this._updateElementMappings(s,e[r]),Yr(n[i]),o.equal++}else o[r]++}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e),this.domConverter.bindElements(e,t),this.markedChildren.add(t),this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();return t.parent.is("$text")?ji._createBefore(this.selection.getFirstPosition().parent):t}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=this.domConverter.viewPositionToDom(t);return!!(e&&zr(e.parent)&&jr(e.parent))}_removeInlineFiller(){const t=this._inlineFiller;if(!jr(t))throw new l("view-renderer-filler-was-lost",this);Vr(t)?t.remove():t.data=t.data.substr(7),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=t.parent,n=t.offset;if(!this.domConverter.mapViewToDom(e.root))return!1;if(!e.is("element"))return!1;if(!function(t){if("false"==t.getAttribute("contenteditable"))return!1;const e=t.findAncestor((t=>t.hasAttribute("contenteditable")));return!e||"true"==e.getAttribute("contenteditable")}(e))return!1;if(n===e.getFillerOffset())return!1;const o=t.nodeBefore,i=t.nodeAfter;return!(o instanceof Io||i instanceof Io)}_updateText(t,e){const n=this.domConverter.findCorrespondingDomText(t),o=this.domConverter.viewToDom(t),i=n.data;let r=o.data;const s=e.inlineFillerPosition;if(s&&s.parent==t.parent&&s.offset==t.index&&(r=Rr+r),i!=r){const t=Ur(i,r);for(const e of t)"insert"===e.type?n.insertData(e.index,e.values.join("")):n.deleteData(e.index,e.howMany)}}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const n=Array.from(e.attributes).map((t=>t.name)),o=t.getAttributeKeys();for(const n of o)this.domConverter.setDomElementAttribute(e,n,t.getAttribute(n),t);for(const o of n)t.hasAttribute(o)||this.domConverter.removeDomElementAttribute(e,o)}_updateChildren(t,e){const n=this.domConverter.mapViewToDom(t);if(!n)return;const o=e.inlineFillerPosition,i=this.domConverter.mapViewToDom(t).childNodes,r=Array.from(this.domConverter.viewChildrenToDom(t,{bind:!0}));o&&o.parent===t&&ds(n.ownerDocument,r,o.offset);const s=this._diffNodeLists(i,r);let a=0;const l=new Set;for(const t of s)"delete"===t?(l.add(i[a]),Yr(i[a])):"equal"===t&&a++;a=0;for(const t of s)"insert"===t?(Zr(n,a,r[a]),a++):"equal"===t&&(this._markDescendantTextToSync(this.domConverter.domToView(r[a])),a++);for(const t of l)t.parentNode||this.domConverter.unbindDomElement(t)}_diffNodeLists(t,e){return Wr(t=function(t,e){const n=Array.from(t);if(0==n.length||!e)return n;n[n.length-1]==e&&n.pop();return n}(t,this._fakeSelectionContainer),e,hs.bind(null,this.domConverter))}_findReplaceActions(t,e,n){if(-1===t.indexOf("insert")||-1===t.indexOf("delete"))return t;let o=[],i=[],r=[];const s={equal:0,insert:0,delete:0};for(const a of t)"insert"===a?r.push(n[s.equal+s.insert]):"delete"===a?i.push(e[s.equal+s.delete]):(o=o.concat(Wr(i,r,us).map((t=>"equal"===t?"replace":t))),o.push("equal"),i=[],r=[]),s[a]++;return o.concat(Wr(i,r,us).map((t=>"equal"===t?"replace":t)))}_markDescendantTextToSync(t){if(t)if(t.is("$text"))this.markedTexts.add(t);else if(t.is("element"))for(const e of t.getChildren())this._markDescendantTextToSync(e)}_updateSelection(){if(ar.isBlink&&!ar.isAndroid&&this.isSelecting&&!this.markedChildren.size)return;if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const t=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&t&&(this.selection.isFake?this._updateFakeSelection(t):(this._removeFakeSelection(),this._updateDomSelection(t)))}_updateFakeSelection(t){const e=t.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(t){const e=t.createElement("div");return e.className="ck-fake-selection-container",Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),e.textContent=" ",e}(e));const n=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(n,this.selection),!this._fakeSelectionNeedsUpdate(t))return;n.parentElement&&n.parentElement==t||t.appendChild(n),n.textContent=this.selection.fakeSelectionLabel||" ";const o=e.getSelection(),i=e.createRange();o.removeAllRanges(),i.selectNodeContents(n),o.addRange(i)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e))return;const n=this.domConverter.viewPositionToDom(this.selection.anchor),o=this.domConverter.viewPositionToDom(this.selection.focus);e.collapse(n.parent,n.offset),e.extend(o.parent,o.offset),ar.isGecko&&function(t,e){const n=t.parent;if(n.nodeType!=Node.ELEMENT_NODE||t.offset!=n.childNodes.length-1)return;const o=n.childNodes[t.offset];o&&"BR"==o.tagName&&e.addRange(e.getRangeAt(0))}(o,e)}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t))return!0;const e=t&&this.domConverter.domSelectionToView(t);return(!e||!this.selection.isEqual(e))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(e))}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer,n=t.ownerDocument.getSelection();return!e||e.parentElement!==t||(n.anchorNode!==e&&!e.contains(n.anchorNode)||e.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const t of this.domDocuments){if(t.getSelection().rangeCount){const e=t.activeElement,n=this.domConverter.mapDomToView(e);e&&n&&t.getSelection().removeAllRanges()}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;t&&t.remove()}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;t&&this.domConverter.focus(t)}}}function ds(t,e,n){const o=e instanceof Array?e:e.childNodes,i=o[n];if(zr(i))return i.data=Rr+i.data,i;{const i=t.createTextNode(Rr);return Array.isArray(e)?o.splice(n,0,i):Zr(e,n,i),i}}function us(t,e){return $r(t)&&$r(e)&&!zr(t)&&!zr(e)&&!Kr(t)&&!Kr(e)&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function hs(t,e,n){return e===n||(zr(e)&&zr(n)?e.data===n.data:!(!t.isBlockFiller(e)||!t.isBlockFiller(n)))}j(cs,N);const ms={window,document};function gs(t){let e=0;for(;t.previousSibling;)t=t.previousSibling,e++;return e}function ps(t){const e=[];let n=t;for(;n&&n.nodeType!=Node.DOCUMENT_NODE;)e.unshift(n),n=n.parentNode;return e}const fs=Or(ms.document),bs=Pr(ms.document),ks=Lr(ms.document),ws="data-ck-unsafe-attribute-",As="data-ck-unsafe-element";class Cs{constructor(t,e={}){this.document=t,this.renderingMode=e.renderingMode||"editing",this.blockFillerMode=e.blockFillerMode||("editing"===this.renderingMode?"br":"nbsp"),this.preElements=["pre"],this.blockElements=["address","article","aside","blockquote","caption","center","dd","details","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","legend","li","main","menu","nav","ol","p","pre","section","summary","table","tbody","td","tfoot","th","thead","tr","ul"],this.inlineObjectElements=["object","iframe","input","button","textarea","select","option","video","embed","audio","img","canvas"],this.unsafeElements=["script","style"],this._domDocument="editing"===this.renderingMode?ms.document:ms.document.implementation.createHTMLDocument(""),this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap,this._rawContentElementMatcher=new Bo,this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new Ui(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t),this._viewToDomMapping.delete(e);for(const e of t.childNodes)this.unbindDomElement(e)}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}shouldRenderAttribute(t,e,n){return"data"===this.renderingMode||!(t=t.toLowerCase()).startsWith("on")&&(("srcdoc"!==t||!e.match(/\bon\S+\s*=|javascript:|<\s*\/*script/i))&&("img"===n&&("src"===t||"srcset"===t)||("source"===n&&"srcset"===t||!e.match(/^\s*(javascript:|data:(image\/svg|text\/x?html))/i))))}setContentOf(t,e){if("data"===this.renderingMode)return void(t.innerHTML=e);const n=(new DOMParser).parseFromString(e,"text/html"),o=n.createDocumentFragment(),i=n.body.childNodes;for(;i.length>0;)o.appendChild(i[0]);const r=n.createTreeWalker(o,NodeFilter.SHOW_ELEMENT),s=[];let a;for(;a=r.nextNode();)s.push(a);for(const t of s){for(const e of t.getAttributeNames())this.setDomElementAttribute(t,e,t.getAttribute(e));const e=t.tagName.toLowerCase();this._shouldRenameElement(e)&&(ys(e),t.replaceWith(this._createReplacementDomElement(e,t)))}for(;t.firstChild;)t.firstChild.remove();t.append(o)}viewToDom(t,e={}){if(t.is("$text")){const e=this._processDataFromViewText(t);return this._domDocument.createTextNode(e)}{if(this.mapViewToDom(t))return this.mapViewToDom(t);let n;if(t.is("documentFragment"))n=this._domDocument.createDocumentFragment(),e.bind&&this.bindDocumentFragments(n,t);else{if(t.is("uiElement"))return n="$comment"===t.name?this._domDocument.createComment(t.getCustomProperty("$rawContent")):t.render(this._domDocument,this),e.bind&&this.bindElements(n,t),n;this._shouldRenameElement(t.name)?(ys(t.name),n=this._createReplacementDomElement(t.name)):n=t.hasAttribute("xmlns")?this._domDocument.createElementNS(t.getAttribute("xmlns"),t.name):this._domDocument.createElement(t.name),t.is("rawElement")&&t.render(n,this),e.bind&&this.bindElements(n,t);for(const e of t.getAttributeKeys())this.setDomElementAttribute(n,e,t.getAttribute(e),t)}if(!1!==e.withChildren)for(const o of this.viewChildrenToDom(t,e))n.appendChild(o);return n}}setDomElementAttribute(t,e,n,o=null){const i=this.shouldRenderAttribute(e,n,t.tagName.toLowerCase())||o&&o.shouldRenderUnsafeAttribute(e);i||c("domconverter-unsafe-attribute-detected",{domElement:t,key:e,value:n}),t.hasAttribute(e)&&!i?t.removeAttribute(e):t.hasAttribute(ws+e)&&i&&t.removeAttribute(ws+e),t.setAttribute(i?e:ws+e,n)}removeDomElementAttribute(t,e){e!=As&&(t.removeAttribute(e),t.removeAttribute(ws+e))}*viewChildrenToDom(t,e={}){const n=t.getFillerOffset&&t.getFillerOffset();let o=0;for(const i of t.getChildren()){n===o&&(yield this._getBlockFiller());const t=i.is("element")&&i.getCustomProperty("dataPipeline:transparentRendering");t&&"data"==this.renderingMode?yield*this.viewChildrenToDom(i,e):(t&&c("domconverter-transparent-rendering-unsupported-in-editing-pipeline",{viewElement:i}),yield this.viewToDom(i,e)),o++}n===o&&(yield this._getBlockFiller())}viewRangeToDom(t){const e=this.viewPositionToDom(t.start),n=this.viewPositionToDom(t.end),o=this._domDocument.createRange();return o.setStart(e.parent,e.offset),o.setEnd(n.parent,n.offset),o}viewPositionToDom(t){const e=t.parent;if(e.is("$text")){const n=this.findCorrespondingDomText(e);if(!n)return null;let o=t.offset;return jr(n)&&(o+=7),{parent:n,offset:o}}{let n,o,i;if(0===t.offset){if(n=this.mapViewToDom(e),!n)return null;i=n.childNodes[0]}else{const e=t.nodeBefore;if(o=e.is("$text")?this.findCorrespondingDomText(e):this.mapViewToDom(t.nodeBefore),!o)return null;n=o.parentNode,i=o.nextSibling}if(zr(i)&&jr(i))return{parent:i,offset:7};return{parent:n,offset:o?gs(o)+1:0}}}domToView(t,e={}){if(this.isBlockFiller(t))return null;const n=this.getHostViewElement(t);if(n)return n;if(Kr(t)&&e.skipComments)return null;if(zr(t)){if(Vr(t))return null;{const e=this._processDataFromDomText(t);return""===e?null:new Io(this.document,e)}}{if(this.mapDomToView(t))return this.mapDomToView(t);let n;if(this.isDocumentFragment(t))n=new _r(this.document),e.bind&&this.bindDocumentFragments(t,n);else{n=this._createViewElement(t,e),e.bind&&this.bindElements(t,n);const o=t.attributes;if(o)for(let t=o.length,e=0;e{const{scrollLeft:e,scrollTop:n}=t;o.push([e,n])})),e.focus(),_s(e,(t=>{const[e,n]=o.shift();t.scrollLeft=e,t.scrollTop=n})),ms.window.scrollTo(t,n)}}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isBlockFiller(t){return"br"==this.blockFillerMode?t.isEqualNode(fs):!("BR"!==t.tagName||!vs(t,this.blockElements)||1!==t.parentNode.childNodes.length)||(t.isEqualNode(ks)||function(t,e){return t.isEqualNode(bs)&&vs(t,e)&&1===t.parentNode.childNodes.length}(t,this.blockElements))}isDomSelectionBackward(t){if(t.isCollapsed)return!1;const e=this._domDocument.createRange();e.setStart(t.anchorNode,t.anchorOffset),e.setEnd(t.focusNode,t.focusOffset);const n=e.collapsed;return e.detach(),n}getHostViewElement(t){const e=ps(t);for(e.pop();e.length;){const t=e.pop(),n=this._domToViewMapping.get(t);if(n&&(n.is("uiElement")||n.is("rawElement")))return n}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}registerRawContentMatcher(t){this._rawContentElementMatcher.add(t)}_getBlockFiller(){switch(this.blockFillerMode){case"nbsp":return Pr(this._domDocument);case"markedNbsp":return Lr(this._domDocument);case"br":return Or(this._domDocument)}}_isDomSelectionPositionCorrect(t,e){if(zr(t)&&jr(t)&&e<7)return!1;if(this.isElement(t)&&jr(t.childNodes[e]))return!1;const n=this.mapDomToView(t);return!n||!n.is("uiElement")&&!n.is("rawElement")}_processDataFromViewText(t){let e=t.data;if(t.getAncestors().some((t=>this.preElements.includes(t.name))))return e;if(" "==e.charAt(0)){const n=this._getTouchingInlineViewNode(t,!1);!(n&&n.is("$textProxy")&&this._nodeEndsWithSpace(n))&&n||(e=" "+e.substr(1))}if(" "==e.charAt(e.length-1)){const n=this._getTouchingInlineViewNode(t,!0),o=n&&n.is("$textProxy")&&" "==n.data.charAt(0);" "!=e.charAt(e.length-2)&&n&&!o||(e=e.substr(0,e.length-1)+" ")}return e.replace(/ {2}/g,"  ")}_nodeEndsWithSpace(t){if(t.getAncestors().some((t=>this.preElements.includes(t.name))))return!1;const e=this._processDataFromViewText(t);return" "==e.charAt(e.length-1)}_processDataFromDomText(t){let e=t.data;if(function(t,e){return ps(t).some((t=>t.tagName&&e.includes(t.tagName.toLowerCase())))}(t,this.preElements))return Fr(t);e=e.replace(/[ \n\t\r]{1,}/g," ");const n=this._getTouchingInlineDomNode(t,!1),o=this._getTouchingInlineDomNode(t,!0),i=this._checkShouldLeftTrimDomText(t,n),r=this._checkShouldRightTrimDomText(t,o);i&&(e=e.replace(/^ /,"")),r&&(e=e.replace(/ $/,"")),e=Fr(new Text(e)),e=e.replace(/ \u00A0/g," ");const s=o&&this.isElement(o)&&"BR"!=o.tagName,a=o&&zr(o)&&" "==o.data.charAt(0);return(/( |\u00A0)\u00A0$/.test(e)||!o||s||a)&&(e=e.replace(/\u00A0$/," ")),(i||n&&this.isElement(n)&&"BR"!=n.tagName)&&(e=e.replace(/^\u00A0/," ")),e}_checkShouldLeftTrimDomText(t,e){return!e||(this.isElement(e)?"BR"===e.tagName:!this._encounteredRawContentDomNodes.has(t.previousSibling)&&/[^\S\u00A0]/.test(e.data.charAt(e.data.length-1)))}_checkShouldRightTrimDomText(t,e){return!e&&!jr(t)}_getTouchingInlineViewNode(t,e){const n=new Ri({startPosition:e?ji._createAfter(t):ji._createBefore(t),direction:e?"forward":"backward"});for(const t of n){if(t.item.is("element")&&this.inlineObjectElements.includes(t.item.name))return t.item;if(t.item.is("containerElement"))return null;if(t.item.is("element","br"))return null;if(t.item.is("$textProxy"))return t.item}return null}_getTouchingInlineDomNode(t,e){if(!t.parentNode)return null;const n=e?"firstChild":"lastChild",o=e?"nextSibling":"previousSibling";let i=!0;do{if(!i&&t[n]?t=t[n]:t[o]?(t=t[o],i=!1):(t=t.parentNode,i=!0),!t||this._isBlockElement(t))return null}while(!zr(t)&&"BR"!=t.tagName&&!this._isInlineObjectElement(t));return t}_isBlockElement(t){return this.isElement(t)&&this.blockElements.includes(t.tagName.toLowerCase())}_isInlineObjectElement(t){return this.isElement(t)&&this.inlineObjectElements.includes(t.tagName.toLowerCase())}_createViewElement(t,e){if(Kr(t))return new br(this.document,"$comment");const n=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();return new Mi(this.document,n)}_isViewElementWithRawContent(t,e){return!1!==e.withChildren&&this._rawContentElementMatcher.match(t)}_shouldRenameElement(t){const e=t.toLowerCase();return"editing"===this.renderingMode&&this.unsafeElements.includes(e)}_createReplacementDomElement(t,e=null){const n=this._domDocument.createElement("span");if(n.setAttribute(As,t),e){for(;e.firstChild;)n.appendChild(e.firstChild);for(const t of e.getAttributeNames())n.setAttribute(t,e.getAttribute(t))}return n}}function _s(t,e){for(;t&&t!=ms.document;)e(t),t=t.parentNode}function vs(t,e){const n=t.parentNode;return n&&n.tagName&&e.includes(n.tagName.toLowerCase())}function ys(t){"script"===t&&c("domconverter-unsafe-script-element-detected"),"style"===t&&c("domconverter-unsafe-style-element-detected")}function xs(t){const e=Object.prototype.toString.apply(t);return"[object Window]"==e||"[object global]"==e}const Es=vi((function(t,e){fe(e,tn(e),t)})),Ds=Es({},k,{listenTo(t,e,n,o={}){if($r(t)||xs(t)){const i={capture:!!o.useCapture,passive:!!o.usePassive},r=this._getProxyEmitter(t,i)||new Is(t,i);this.listenTo(r,e,n,o)}else k.listenTo.call(this,t,e,n,o)},stopListening(t,e,n){if($r(t)||xs(t)){const o=this._getAllProxyEmitters(t);for(const t of o)this.stopListening(t,e,n)}else k.stopListening.call(this,t,e,n)},_getProxyEmitter(t,e){return function(t,e){const n=t[g];return n&&n[e]?n[e].emitter:null}(this,Ts(t,e))},_getAllProxyEmitters(t){return[{capture:!1,passive:!1},{capture:!1,passive:!0},{capture:!0,passive:!1},{capture:!0,passive:!0}].map((e=>this._getProxyEmitter(t,e))).filter((t=>!!t))}}),Ss=Ds;class Is{constructor(t,e){w(this,Ts(t,e)),this._domNode=t,this._options=e}attach(t){if(this._domListeners&&this._domListeners[t])return;const e=this._createDomListener(t);this._domNode.addEventListener(t,e,this._options),this._domListeners||(this._domListeners={}),this._domListeners[t]=e}detach(t){let e;!this._domListeners[t]||(e=this._events[t])&&e.callbacks.length||this._domListeners[t].removeListener()}_addEventListener(t,e,n){this.attach(t),k._addEventListener.call(this,t,e,n)}_removeEventListener(t,e){k._removeEventListener.call(this,t,e),this.detach(t)}_createDomListener(t){const e=e=>{this.fire(t,e)};return e.removeListener=()=>{this._domNode.removeEventListener(t,e,this._options),delete this._domListeners[t]},e}}function Ts(t,e){let n=function(t){return t["data-ck-expando"]||(t["data-ck-expando"]=r())}(t);for(const t of Object.keys(e).sort())e[t]&&(n+="-"+t);return n}j(Is,k);class Ms{constructor(t){this.view=t,this.document=t.document,this.isEnabled=!1}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}destroy(){this.disable(),this.stopListening()}checkShouldIgnoreEventFromTarget(t){return t&&3===t.nodeType&&(t=t.parentNode),!(!t||1!==t.nodeType)&&t.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}j(Ms,Ss);const Bs=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const Ns=function(t){return this.__data__.has(t)};function zs(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new ae;++ea))return!1;var c=r.get(t),d=r.get(e);if(c&&d)return c==e&&d==t;var u=-1,h=!0,m=2&n?new Ps:void 0;for(r.set(t,e),r.set(e,t);++u{this.listenTo(t,e,((t,e)=>{this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(e.target)&&this.onDomEvent(e)}),{useCapture:this.useCapture})}))}fire(t,e,n){this.isEnabled&&this.document.fire(t,new ta(this.view,e,n))}}class na extends ea{constructor(t){super(t),this.domEventType=["keydown","keyup"]}onDomEvent(t){this.fire(t.type,t,{keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,get keystroke(){return mr(this)}})}}const oa=function(){return Z.Date.now()};var ia=/\s/;const ra=function(t){for(var e=t.length;e--&&ia.test(t.charAt(e)););return e};var sa=/^\s+/;const aa=function(t){return t?t.slice(0,ra(t)+1).replace(sa,""):t};var la=/^[-+]0x[0-9a-f]+$/i,ca=/^0b[01]+$/i,da=/^0o[0-7]+$/i,ua=parseInt;const ha=function(t){if("number"==typeof t)return t;if(Po(t))return NaN;if(E(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=E(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=aa(t);var n=ca.test(t);return n||da.test(t)?ua(t.slice(2),n?2:8):la.test(t)?NaN:+t};var ma=Math.max,ga=Math.min;const pa=function(t,e,n){var o,i,r,s,a,l,c=0,d=!1,u=!1,h=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function m(e){var n=o,r=i;return o=i=void 0,c=e,s=t.apply(r,n)}function g(t){return c=t,a=setTimeout(f,e),d?m(t):s}function p(t){var n=t-l;return void 0===l||n>=e||n<0||u&&t-c>=r}function f(){var t=oa();if(p(t))return b(t);a=setTimeout(f,function(t){var n=e-(t-l);return u?ga(n,r-(t-c)):n}(t))}function b(t){return a=void 0,h&&o?m(t):(o=i=void 0,s)}function k(){var t=oa(),n=p(t);if(o=arguments,i=this,l=t,n){if(void 0===a)return g(l);if(u)return clearTimeout(a),a=setTimeout(f,e),m(l)}return void 0===a&&(a=setTimeout(f,e)),s}return e=ha(e)||0,E(n)&&(d=!!n.leading,r=(u="maxWait"in n)?ma(ha(n.maxWait)||0,e):r,h="trailing"in n?!!n.trailing:h),k.cancel=function(){void 0!==a&&clearTimeout(a),c=0,o=l=i=a=void 0},k.flush=function(){return void 0===a?s:b(oa())},k};class fa extends Ms{constructor(t){super(t),this._fireSelectionChangeDoneDebounced=pa((t=>this.document.fire("selectionChangeDone",t)),200)}observe(){const t=this.document;t.on("arrowKey",((e,n)=>{t.selection.isFake&&this.isEnabled&&n.preventDefault()}),{context:"$capture"}),t.on("arrowKey",((e,n)=>{t.selection.isFake&&this.isEnabled&&this._handleSelectionMove(n.keyCode)}),{priority:"lowest"})}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection,n=new Ui(e.getRanges(),{backward:e.isBackward,fake:!1});t!=ur.arrowleft&&t!=ur.arrowup||n.setTo(n.getFirstPosition()),t!=ur.arrowright&&t!=ur.arrowdown||n.setTo(n.getLastPosition());const o={oldSelection:e,newSelection:n,domSelection:null};this.document.fire("selectionChange",o),this._fireSelectionChangeDoneDebounced(o)}}class ba extends Ms{constructor(t){super(t),this.mutationObserver=t.getObserver(Xs),this.selection=this.document.selection,this.domConverter=t.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=pa((t=>this.document.fire("selectionChangeDone",t)),200),this._clearInfiniteLoopInterval=setInterval((()=>this._clearInfiniteLoop()),1e3),this._documentIsSelectingInactivityTimeoutDebounced=pa((()=>this.document.isSelecting=!1),5e3),this._loopbackCounter=0}observe(t){const e=t.ownerDocument,n=()=>{this.document.isSelecting=!1,this._documentIsSelectingInactivityTimeoutDebounced.cancel()};this.listenTo(t,"selectstart",(()=>{this.document.isSelecting=!0,this._documentIsSelectingInactivityTimeoutDebounced()}),{priority:"highest"}),this.listenTo(t,"keydown",n,{priority:"highest"}),this.listenTo(t,"keyup",n,{priority:"highest"}),this._documents.has(e)||(this.listenTo(e,"mouseup",n,{priority:"highest"}),this.listenTo(e,"selectionchange",((t,n)=>{this._handleSelectionChange(n,e),this._documentIsSelectingInactivityTimeoutDebounced()})),this._documents.add(e))}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel(),this._documentIsSelectingInactivityTimeoutDebounced.cancel()}_handleSelectionChange(t,e){if(!this.isEnabled)return;const n=e.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(n.anchorNode))return;this.mutationObserver.flush();const o=this.domConverter.domSelectionToView(n);if(0!=o.rangeCount){if(this.view.hasDomSelection=!0,!(this.selection.isEqual(o)&&this.domConverter.isDomSelectionCorrect(n)||++this._loopbackCounter>60))if(this.selection.isSimilar(o))this.view.forceRender();else{const t={oldSelection:this.selection,newSelection:o,domSelection:n};this.document.fire("selectionChange",t),this._fireSelectionChangeDoneDebounced(t)}}else this.view.hasDomSelection=!1}_clearInfiniteLoop(){this._loopbackCounter=0}}class ka extends ea{constructor(t){super(t),this.domEventType=["focus","blur"],this.useCapture=!0;const e=this.document;e.on("focus",(()=>{e.isFocused=!0,this._renderTimeoutId=setTimeout((()=>t.change((()=>{}))),50)})),e.on("blur",((n,o)=>{const i=e.selection.editableElement;null!==i&&i!==o.target||(e.isFocused=!1,t.change((()=>{})))}))}onDomEvent(t){this.fire(t.type,t)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class wa extends ea{constructor(t){super(t),this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",(()=>{e.isComposing=!0})),e.on("compositionend",(()=>{e.isComposing=!1}))}onDomEvent(t){this.fire(t.type,t)}}class Aa extends ea{constructor(t){super(t),this.domEventType=["beforeinput"]}onDomEvent(t){this.fire(t.type,t)}}class Ca{constructor(){this._replacedElements=[]}replace(t,e){this._replacedElements.push({element:t,newElement:e}),t.style.display="none",e&&t.parentNode.insertBefore(e,t.nextSibling)}restore(){this._replacedElements.forEach((({element:t,newElement:e})=>{t.style.display="",e&&e.remove()})),this._replacedElements=[]}}const _a=function(t){return"string"==typeof t||!ve(t)&&st(t)&&"[object String]"==ot(t)};function va(t,e,n={},o=[]){const i=n&&n.xmlns,r=i?t.createElementNS(i,e):t.createElement(e);for(const t in n)r.setAttribute(t,n[t]);!_a(o)&&po(o)||(o=[o]);for(let e of o)_a(e)&&(e=t.createTextNode(e)),r.appendChild(e);return r}function ya(t){return"[object Range]"==Object.prototype.toString.apply(t)}function xa(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}const Ea=["top","right","bottom","left","width","height"];class Da{constructor(t){const e=ya(t);if(Object.defineProperty(this,"_source",{value:t._source||t,writable:!0,enumerable:!1}),Ta(t)||e)if(e){const e=Da.getDomRangeRects(t);Sa(this,Da.getBoundingRect(e))}else Sa(this,t.getBoundingClientRect());else if(xs(t)){const{innerWidth:e,innerHeight:n}=t;Sa(this,{top:0,right:e,bottom:n,left:0,width:e,height:n})}else Sa(this,t)}clone(){return new Da(this)}moveTo(t,e){return this.top=e,this.right=t+this.width,this.bottom=e+this.height,this.left=t,this}moveBy(t,e){return this.top+=e,this.right+=t,this.left+=t,this.bottom+=e,this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left),width:0,height:0};return e.width=e.right-e.left,e.height=e.bottom-e.top,e.width<0||e.height<0?null:new Da(e)}getIntersectionArea(t){const e=this.getIntersection(t);return e?e.getArea():0}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(!Ia(t)){let n=t.parentNode||t.commonAncestorContainer;for(;n&&!Ia(n);){const t=new Da(n),o=e.getIntersection(t);if(!o)return null;o.getArea(){for(const e of t){const t=Ma._getElementCallbacks(e.target);if(t)for(const n of t)n(e)}}))}}function Ba(t){const e=t.next();return e.done?null:e.value}Ma._observerInstance=null,Ma._elementCallbacks=null;class Na{constructor(){this.set("isFocused",!1),this.set("focusedElement",null),this._elements=new Set,this._nextEventLoopTimeout=null}add(t){if(this._elements.has(t))throw new l("focustracker-add-element-already-exist",this);this.listenTo(t,"focus",(()=>this._focus(t)),{useCapture:!0}),this.listenTo(t,"blur",(()=>this._blur()),{useCapture:!0}),this._elements.add(t)}remove(t){t===this.focusedElement&&this._blur(),this._elements.has(t)&&(this.stopListening(t),this._elements.delete(t))}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=t,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout((()=>{this.focusedElement=null,this.isFocused=!1}),0)}}j(Na,Ss),j(Na,N);const za=Na;class Pa{constructor(){this._listener=Object.create(Ss)}listenTo(t){this._listener.listenTo(t,"keydown",((t,e)=>{this._listener.fire("_keydown:"+mr(e),e)}))}set(t,e,n={}){const o=gr(t),i=n.priority;this._listener.listenTo(this._listener,"_keydown:"+o,((t,n)=>{e(n,(()=>{n.preventDefault(),n.stopPropagation(),t.stop()})),t.return=!0}),{priority:i})}press(t){return!!this._listener.fire("_keydown:"+mr(t),t)}destroy(){this._listener.stopListening()}}class La extends Ms{constructor(t){super(t),this.document.on("keydown",((t,e)=>{if(this.isEnabled&&((n=e.keyCode)==ur.arrowright||n==ur.arrowleft||n==ur.arrowup||n==ur.arrowdown)){const n=new Gi(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(n,e),n.stop.called&&t.stop()}var n}))}observe(){}}class Oa extends Ms{constructor(t){super(t);const e=this.document;e.on("keydown",((t,n)=>{if(!this.isEnabled||n.keyCode!=ur.tab||n.ctrlKey)return;const o=new Gi(e,"tab",e.selection.getFirstRange());e.fire(o,n),o.stop.called&&t.stop()}))}observe(){}}function Ra(t,e,n){const o=e.clone().moveBy(0,n),i=e.clone().moveBy(0,-n),r=new Da(t).excludeScrollbarsAndBorders();if(![i,o].every((t=>r.contains(t)))){let{scrollX:s,scrollY:a}=t;Fa(i,r)?a-=r.top-e.top+n:Va(o,r)&&(a+=e.bottom-r.bottom+n),Ha(e,r)?s-=r.left-e.left+n:Ua(e,r)&&(s+=e.right-r.right+n),t.scrollTo(s,a)}}function ja(t,e){const n=qa(t);let o,i;for(;t!=n.document.body;)i=e(),o=new Da(t).excludeScrollbarsAndBorders(),o.contains(i)||(Fa(i,o)?t.scrollTop-=o.top-i.top:Va(i,o)&&(t.scrollTop+=i.bottom-o.bottom),Ha(i,o)?t.scrollLeft-=o.left-i.left:Ua(i,o)&&(t.scrollLeft+=i.right-o.right)),t=t.parentNode}function Va(t,e){return t.bottom>e.bottom}function Fa(t,e){return t.tope.right}function qa(t){return ya(t)?t.startContainer.ownerDocument.defaultView:t.ownerDocument.defaultView}function Ga(t){if(ya(t)){let e=t.commonAncestorContainer;return zr(e)&&(e=e.parentNode),e}return t.parentNode}function Wa(t,e){const n=qa(t),o=new Da(t);if(n===e)return o;{let t=n;for(;t!=e;){const e=t.frameElement,n=new Da(e).excludeScrollbarsAndBorders();o.moveBy(n.left,n.top),t=t.parent}}return o}class Za{constructor(t){this.document=new Xi(t),this.domConverter=new Cs(this.document),this.domRoots=new Map,this.set("isRenderingInProgress",!1),this.set("hasDomSelection",!1),this._renderer=new cs(this.domConverter,this.document.selection),this._renderer.bind("isFocused","isSelecting").to(this.document),this._initialDomRootAttributes=new WeakMap,this._observers=new Map,this._ongoingChange=!1,this._postFixersInProgress=!1,this._renderingDisabled=!1,this._hasChangedSinceTheLastRendering=!1,this._writer=new vr(this.document),this.addObserver(Xs),this.addObserver(ba),this.addObserver(ka),this.addObserver(na),this.addObserver(fa),this.addObserver(wa),this.addObserver(La),this.addObserver(Oa),ar.isAndroid&&this.addObserver(Aa),this.document.on("arrowKey",Hr,{priority:"low"}),kr(this),this.on("render",(()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1})),this.listenTo(this.document.selection,"change",(()=>{this._hasChangedSinceTheLastRendering=!0})),this.listenTo(this.document,"change:isFocused",(()=>{this._hasChangedSinceTheLastRendering=!0}))}attachDomRoot(t,e="main"){const n=this.document.getRoot(e);n._name=t.tagName.toLowerCase();const o={};for(const{name:e,value:i}of Array.from(t.attributes))o[e]=i,"class"===e?this._writer.addClass(i.split(" "),n):this._writer.setAttribute(e,i,n);this._initialDomRootAttributes.set(t,o);const i=()=>{this._writer.setAttribute("contenteditable",!n.isReadOnly,n),n.isReadOnly?this._writer.addClass("ck-read-only",n):this._writer.removeClass("ck-read-only",n)};i(),this.domRoots.set(e,t),this.domConverter.bindElements(t,n),this._renderer.markToSync("children",n),this._renderer.markToSync("attributes",n),this._renderer.domDocuments.add(t.ownerDocument),n.on("change:children",((t,e)=>this._renderer.markToSync("children",e))),n.on("change:attributes",((t,e)=>this._renderer.markToSync("attributes",e))),n.on("change:text",((t,e)=>this._renderer.markToSync("text",e))),n.on("change:isReadOnly",(()=>this.change(i))),n.on("change",(()=>{this._hasChangedSinceTheLastRendering=!0}));for(const n of this._observers.values())n.observe(t,e)}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach((({name:t})=>e.removeAttribute(t)));const n=this._initialDomRootAttributes.get(e);for(const t in n)e.setAttribute(t,n[t]);this.domRoots.delete(t),this.domConverter.unbindDomElement(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e)return e;e=new t(this),this._observers.set(t,e);for(const[t,n]of this.domRoots)e.observe(n,t);return e.enable(),e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values())t.disable()}enableObservers(){for(const t of this._observers.values())t.enable()}scrollToTheSelection(){const t=this.document.selection.getFirstRange();t&&function({target:t,viewportOffset:e=0}){const n=qa(t);let o=n,i=null;for(;o;){let r;r=Ga(o==n?t:i),ja(r,(()=>Wa(t,o)));const s=Wa(t,o);if(Ra(o,s,e),o.parent!=o){if(i=o.frameElement,o=o.parent,!i)return}else o=null}}({target:this.domConverter.viewRangeToDom(t),viewportOffset:20})}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;t&&(this.domConverter.focus(t),this.forceRender())}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress)throw new l("cannot-change-view-tree",this);try{if(this._ongoingChange)return t(this._writer);this._ongoingChange=!0;const e=t(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),e}catch(t){l.rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.change((()=>{}))}destroy(){for(const t of this._observers.values())t.destroy();this.document.destroy(),this.stopListening()}createPositionAt(t,e){return ji._createAt(t,e)}createPositionAfter(t){return ji._createAfter(t)}createPositionBefore(t){return ji._createBefore(t)}createRange(t,e){return new Vi(t,e)}createRangeOn(t){return Vi._createOn(t)}createRangeIn(t){return Vi._createIn(t)}createSelection(t,e,n){return new Ui(t,e,n)}_disableRendering(t){this._renderingDisabled=t,0==t&&this.change((()=>{}))}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}j(Za,N);class Ya{constructor(t){this.parent=null,this._attrs=Mo(t)}get index(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildIndex(this)))throw new l("model-node-not-found-in-parent",this);return t}get startOffset(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildStartOffset(this)))throw new l("model-node-not-found-in-parent",this);return t}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.startOffset),e=e.parent;return t}getAncestors(t={includeSelf:!1,parentFirst:!1}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e),o=t.getAncestors(e);let i=0;for(;n[i]==o[i]&&n[i];)i++;return 0===i?null:n[i-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),n=t.getPath(),o=Eo(e,n);switch(o){case"prefix":return!0;case"extension":return!1;default:return e[o](t[e[0]]=e[1],t)),{})),t}is(t){return"node"===t||"model:node"===t}_clone(){return new Ya(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=Mo(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}class Ka extends Ya{constructor(t,e){super(e),this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}is(t){return"$text"===t||"model:$text"===t||"text"===t||"model:text"===t||"node"===t||"model:node"===t}toJSON(){const t=super.toJSON();return t.data=this.data,t}_clone(){return new Ka(this.data,this.getAttributes())}static fromJSON(t){return new Ka(t.data,t.attributes)}}class $a{constructor(t,e,n){if(this.textNode=t,e<0||e>t.offsetSize)throw new l("model-textproxy-wrong-offsetintext",this);if(n<0||e+n>t.offsetSize)throw new l("model-textproxy-wrong-length",this);this.data=t.data.substring(e,e+n),this.offsetInText=e}get startOffset(){return null!==this.textNode.startOffset?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return null!==this.startOffset?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}is(t){return"$textProxy"===t||"model:$textProxy"===t||"textProxy"===t||"model:textProxy"===t}getPath(){const t=this.textNode.getPath();return t.length>0&&(t[t.length-1]+=this.offsetInText),t}getAncestors(t={includeSelf:!1,parentFirst:!1}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}class Qa{constructor(t){this._nodes=[],t&&this._insertNodes(0,t)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce(((t,e)=>t+e.offsetSize),0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return-1==e?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return null===e?null:this._nodes.slice(0,e).reduce(((t,e)=>t+e.offsetSize),0)}indexToOffset(t){if(t==this._nodes.length)return this.maxOffset;const e=this._nodes[t];if(!e)throw new l("model-nodelist-index-out-of-bounds",this);return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const n of this._nodes){if(t>=e&&tt.toJSON()))}}class Ja extends Ya{constructor(t,e,n){super(e),this.name=t,this._children=new Qa,n&&this._insertChild(0,n)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}is(t,e=null){return e?e===this.name&&("element"===t||"model:element"===t):"element"===t||"model:element"===t||"node"===t||"model:node"===t}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const n of t)e=e.getChild(e.offsetToIndex(n));return e}findAncestor(t,e={includeSelf:!1}){let n=e.includeSelf?this:this.parent;for(;n;){if(n.name===t)return n;n=n.parent}return null}toJSON(){const t=super.toJSON();if(t.name=this.name,this._children.length>0){t.children=[];for(const e of this._children)t.children.push(e.toJSON())}return t}_clone(t=!1){const e=t?Array.from(this._children).map((t=>t._clone(!0))):null;return new Ja(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=function(t){if("string"==typeof t)return[new Ka(t)];po(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new Ka(t):t instanceof $a?new Ka(t.data,t.getAttributes()):t))}(e);for(const t of n)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n)t.parent=null;return n}static fromJSON(t){let e=null;if(t.children){e=[];for(const n of t.children)n.name?e.push(Ja.fromJSON(n)):e.push(Ka.fromJSON(n))}return new Ja(t.name,t.attributes,e)}}class Xa{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new l("model-tree-walker-no-start-position",null);const e=t.direction||"forward";if("forward"!=e&&"backward"!=e)throw new l("model-tree-walker-unknown-direction",t,{direction:e});this.direction=e,this.boundaries=t.boundaries||null,t.startPosition?this.position=t.startPosition.clone():this.position=el._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null,this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(t){let e,n,o,i;do{o=this.position,i=this._visitedParent,({done:e,value:n}=this.next())}while(!e&&t(n));e||(this.position=o,this._visitedParent=i)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const t=this.position,e=this.position.clone(),n=this._visitedParent;if(null===n.parent&&e.offset===n.maxOffset)return{done:!0};if(n===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0};const o=nl(e,n),i=o||ol(e,n,o);if(i instanceof Ja)return this.shallow?e.offset++:(e.path.push(0),this._visitedParent=i),this.position=e,tl("elementStart",i,t,e,1);if(i instanceof Ka){let o;if(this.singleCharacters)o=1;else{let t=i.endOffset;this._boundaryEndParent==n&&this.boundaries.end.offsett&&(t=this.boundaries.start.offset),o=e.offset-t}const i=e.offset-r.startOffset,s=new $a(r,i-o,o);return e.offset-=o,this.position=e,tl("text",s,t,e,o)}return e.path.pop(),this.position=e,this._visitedParent=n.parent,tl("elementStart",n,t,e,1)}}function tl(t,e,n,o,i){return{done:!1,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}class el{constructor(t,e,n="toNone"){if(!t.is("element")&&!t.is("documentFragment"))throw new l("model-position-root-invalid",t);if(!(e instanceof Array)||0===e.length)throw new l("model-position-path-incorrect-format",t,{path:e});t.is("rootElement")?e=e.slice():(e=[...t.getPath(),...e],t=t.root),this.root=t,this.path=e,this.stickiness=n}get offset(){return this.path[this.path.length-1]}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;en.path.length){if(e.offset!==o.maxOffset)return!1;e.path=e.path.slice(0,-1),o=o.parent,e.offset++}else{if(0!==n.offset)return!1;n.path=n.path.slice(0,-1)}}}is(t){return"position"===t||"model:position"===t}hasSameParentAs(t){if(this.root!==t.root)return!1;return"same"==Eo(this.getParentPath(),t.getParentPath())}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=el._createAt(this)}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;return e.containsPosition(this)||e.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(t.splitPosition,t.moveTargetPosition):t.graveyardPosition?this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1):this._getTransformedByInsertion(t.insertionPosition,1)}_getTransformedByMergeOperation(t){const e=t.movedRange;let n;return e.containsPosition(this)||e.start.isEqual(this)?(n=this._getCombined(t.sourcePosition,t.targetPosition),t.sourcePosition.isBefore(t.targetPosition)&&(n=n._getTransformedByDeletion(t.deletionPosition,1))):n=this.isEqual(t.deletionPosition)?el._createAt(t.deletionPosition):this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1),n}_getTransformedByDeletion(t,e){const n=el._createAt(this);if(this.root!=t.root)return n;if("same"==Eo(t.getParentPath(),this.getParentPath())){if(t.offsetthis.offset)return null;n.offset-=e}}else if("prefix"==Eo(t.getParentPath(),this.getParentPath())){const o=t.path.length-1;if(t.offset<=this.path[o]){if(t.offset+e>this.path[o])return null;n.path[o]-=e}}return n}_getTransformedByInsertion(t,e){const n=el._createAt(this);if(this.root!=t.root)return n;if("same"==Eo(t.getParentPath(),this.getParentPath()))(t.offsete+1;){const e=o.maxOffset-n.offset;0!==e&&t.push(new rl(n,n.getShiftedBy(e))),n.path=n.path.slice(0,-1),n.offset++,o=o.parent}for(;n.path.length<=this.end.path.length;){const e=this.end.path[n.path.length-1],o=e-n.offset;0!==o&&t.push(new rl(n,n.getShiftedBy(o))),n.offset=e,n.path.push(0)}return t}getWalker(t={}){return t.boundaries=this,new Xa(t)}*getItems(t={}){t.boundaries=this,t.ignoreElementEnd=!0;const e=new Xa(t);for(const t of e)yield t.item}*getPositions(t={}){t.boundaries=this;const e=new Xa(t);yield e.position;for(const t of e)yield t.nextPosition}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new rl(this.start,this.end)]}getTransformedByOperations(t){const e=[new rl(this.start,this.end)];for(const n of t)for(let t=0;t0?new this(n,o):new this(o,n)}static _createIn(t){return new this(el._createAt(t,0),el._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(el._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(0===t.length)throw new l("range-create-from-ranges-empty-array",null);if(1==t.length)return t[0].clone();const e=t[0];t.sort(((t,e)=>t.start.isAfter(e.start)?1:-1));const n=t.indexOf(e),o=new this(e.start,e.end);if(n>0)for(let e=n-1;t[e].end.isEqual(o.start);e++)o.start=el._createAt(t[e].start);for(let e=n+1;e{if(e.viewPosition)return;const n=this._modelToViewMapping.get(e.modelPosition.parent);if(!n)throw new l("mapping-model-position-view-parent-not-found",this,{modelPosition:e.modelPosition});e.viewPosition=this.findPositionIn(n,e.modelPosition.offset)}),{priority:"low"}),this.on("viewToModelPosition",((t,e)=>{if(e.modelPosition)return;const n=this.findMappedViewAncestor(e.viewPosition),o=this._viewToModelMapping.get(n),i=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,n);e.modelPosition=el._createAt(o,i)}),{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e),this._viewToModelMapping.set(e,t)}unbindViewElement(t,e={}){const n=this.toModelElement(t);if(this._elementToMarkerNames.has(t))for(const e of this._elementToMarkerNames.get(t))this._unboundMarkerNames.add(e);e.defer?this._deferredBindingRemovals.set(t,t.root):(this._viewToModelMapping.delete(t),this._modelToViewMapping.get(n)==t&&this._modelToViewMapping.delete(n))}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t),this._viewToModelMapping.get(e)==t&&this._viewToModelMapping.delete(e)}bindElementToMarker(t,e){const n=this._markerNameToElements.get(e)||new Set;n.add(t);const o=this._elementToMarkerNames.get(t)||new Set;o.add(e),this._markerNameToElements.set(e,n),this._elementToMarkerNames.set(t,o)}unbindElementFromMarkerName(t,e){const n=this._markerNameToElements.get(e);n&&(n.delete(t),0==n.size&&this._markerNameToElements.delete(e));const o=this._elementToMarkerNames.get(t);o&&(o.delete(e),0==o.size&&this._elementToMarkerNames.delete(t))}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),t}flushDeferredBindings(){for(const[t,e]of this._deferredBindingRemovals)t.root==e&&this.unbindViewElement(t);this._deferredBindingRemovals=new Map}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set,this._deferredBindingRemovals=new Map}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new rl(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new Vi(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};return this.fire("viewToModelPosition",e),e.modelPosition}toViewPosition(t,e={isPhantom:!1}){const n={modelPosition:t,mapper:this,isPhantom:e.isPhantom};return this.fire("modelToViewPosition",n),n.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e)return null;const n=new Set;for(const t of e)if(t.is("attributeElement"))for(const e of t.getElementsWithSameId())n.add(e);else n.add(t);return n}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;for(;!this._viewToModelMapping.has(e);)e=e.parent;return e}_toModelOffset(t,e,n){if(n!=t){return this._toModelOffset(t.parent,t.index,n)+this._toModelOffset(t,e,t)}if(t.is("$text"))return e;let o=0;for(let n=0;n1?e[0]+":"+e[1]:e[0]}class cl{constructor(t){this._conversionApi={dispatcher:this,...t},this._firedEventsMap=new WeakMap}convertChanges(t,e,n){const o=this._createConversionApi(n,t.getRefreshedItems());for(const e of t.getMarkersToRemove())this._convertMarkerRemove(e.name,e.range,o);const i=this._reduceChanges(t.getChanges());for(const t of i)"insert"===t.type?this._convertInsert(rl._createFromPositionAndShift(t.position,t.length),o):"reinsert"===t.type?this._convertReinsert(rl._createFromPositionAndShift(t.position,t.length),o):"remove"===t.type?this._convertRemove(t.position,t.length,t.name,o):this._convertAttribute(t.range,t.attributeKey,t.attributeOldValue,t.attributeNewValue,o);for(const t of o.mapper.flushUnboundMarkerNames()){const n=e.get(t).getRange();this._convertMarkerRemove(t,n,o),this._convertMarkerAdd(t,n,o)}for(const e of t.getMarkersToAdd())this._convertMarkerAdd(e.name,e.range,o);o.mapper.flushDeferredBindings(),o.consumable.verifyAllConsumed("insert")}convert(t,e,n,o={}){const i=this._createConversionApi(n,void 0,o);this._convertInsert(t,i);for(const[t,n]of e)this._convertMarkerAdd(t,n,i);i.consumable.verifyAllConsumed("insert")}convertSelection(t,e,n){const o=Array.from(e.getMarkersAtPosition(t.getFirstPosition())),i=this._createConversionApi(n);if(this._addConsumablesForSelection(i.consumable,t,o),this.fire("selection",{selection:t},i),t.isCollapsed){for(const e of o){const n=e.getRange();if(!dl(t.getFirstPosition(),e,i.mapper))continue;const o={item:t,markerName:e.name,markerRange:n};i.consumable.test(t,"addMarker:"+e.name)&&this.fire("addMarker:"+e.name,o,i)}for(const e of t.getAttributeKeys()){const n={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};i.consumable.test(t,"attribute:"+n.attributeKey)&&this.fire("attribute:"+n.attributeKey+":$text",n,i)}}}_convertInsert(t,e,n={}){n.doNotAddConsumables||this._addConsumablesForInsert(e.consumable,Array.from(t));for(const n of Array.from(t.getWalker({shallow:!0})).map(ul))this._testAndFire("insert",n,e)}_convertRemove(t,e,n,o){this.fire("remove:"+n,{position:t,length:e},o)}_convertAttribute(t,e,n,o,i){this._addConsumablesForRange(i.consumable,t,`attribute:${e}`);for(const r of t){const t={item:r.item,range:rl._createFromPositionAndShift(r.previousPosition,r.length),attributeKey:e,attributeOldValue:n,attributeNewValue:o};this._testAndFire(`attribute:${e}`,t,i)}}_convertReinsert(t,e){const n=Array.from(t.getWalker({shallow:!0}));this._addConsumablesForInsert(e.consumable,n);for(const t of n.map(ul))this._testAndFire("insert",{...t,reconversion:!0},e)}_convertMarkerAdd(t,e,n){if("$graveyard"==e.root.rootName)return;const o="addMarker:"+t;if(n.consumable.add(e,o),this.fire(o,{markerName:t,markerRange:e},n),n.consumable.consume(e,o)){this._addConsumablesForRange(n.consumable,e,o);for(const i of e.getItems()){if(!n.consumable.test(i,o))continue;const r={item:i,range:rl._createOn(i),markerName:t,markerRange:e};this.fire(o,r,n)}}}_convertMarkerRemove(t,e,n){"$graveyard"!=e.root.rootName&&this.fire("removeMarker:"+t,{markerName:t,markerRange:e},n)}_reduceChanges(t){const e={changes:t};return this.fire("reduceChanges",e),e.changes}_addConsumablesForInsert(t,e){for(const n of e){const e=n.item;if(null===t.test(e,"insert")){t.add(e,"insert");for(const n of e.getAttributeKeys())t.add(e,"attribute:"+n)}}return t}_addConsumablesForRange(t,e,n){for(const o of e.getItems())t.add(o,n);return t}_addConsumablesForSelection(t,e,n){t.add(e,"selection");for(const o of n)t.add(e,"addMarker:"+o.name);for(const n of e.getAttributeKeys())t.add(e,"attribute:"+n);return t}_testAndFire(t,e,n){const o=function(t,e){const n=e.item.name||"$text";return`${t}:${n}`}(t,e),i=e.item.is("$textProxy")?n.consumable._getSymbolForTextProxy(e.item):e.item,r=this._firedEventsMap.get(n),s=r.get(i);if(s){if(s.has(o))return;s.add(o)}else r.set(i,new Set([o]));this.fire(o,e,n)}_testAndFireAddAttributes(t,e){const n={item:t,range:rl._createOn(t)};for(const t of n.item.getAttributeKeys())n.attributeKey=t,n.attributeOldValue=null,n.attributeNewValue=n.item.getAttribute(t),this._testAndFire(`attribute:${t}`,n,e)}_createConversionApi(t,e=new Set,n={}){const o={...this._conversionApi,consumable:new al,writer:t,options:n,convertItem:t=>this._convertInsert(rl._createOn(t),o),convertChildren:t=>this._convertInsert(rl._createIn(t),o,{doNotAddConsumables:!0}),convertAttributes:t=>this._testAndFireAddAttributes(t,o),canReuseView:t=>!e.has(o.mapper.toModelElement(t))};return this._firedEventsMap.set(o,new Map),o}}function dl(t,e,n){const o=e.getRange(),i=Array.from(t.getAncestors());i.shift(),i.reverse();return!i.some((t=>{if(o.containsItem(t)){return!!n.toViewElement(t).getCustomProperty("addHighlight")}}))}function ul(t){return{item:t.item,range:rl._createFromPositionAndShift(t.previousPosition,t.length)}}j(cl,k);class hl{constructor(t,e,n){this._lastRangeBackward=!1,this._ranges=[],this._attrs=new Map,t&&this.setTo(t,e,n)}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){return 1===this._ranges.length&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let n=!1;for(const o of t._ranges)if(e.isEqual(o)){n=!0;break}if(!n)return!1}return!0}*getRanges(){for(const t of this._ranges)yield new rl(t.start,t.end)}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?new rl(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?new rl(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(t,e,n){if(null===t)this._setRanges([]);else if(t instanceof hl)this._setRanges(t.getRanges(),t.isBackward);else if(t&&"function"==typeof t.getRanges)this._setRanges(t.getRanges(),t.isBackward);else if(t instanceof rl)this._setRanges([t],!!e&&!!e.backward);else if(t instanceof el)this._setRanges([new rl(t)]);else if(t instanceof Ya){const o=!!n&&!!n.backward;let i;if("in"==e)i=rl._createIn(t);else if("on"==e)i=rl._createOn(t);else{if(void 0===e)throw new l("model-selection-setto-required-second-parameter",[this,t]);i=new rl(el._createAt(t,e))}this._setRanges([i],o)}else{if(!po(t))throw new l("model-selection-setto-not-selectable",[this,t]);this._setRanges(t,e&&!!e.backward)}}_setRanges(t,e=!1){const n=(t=Array.from(t)).some((e=>{if(!(e instanceof rl))throw new l("model-selection-set-ranges-not-range",[this,t]);return this._ranges.every((t=>!t.isEqual(e)))}));if(t.length!==this._ranges.length||n){this._removeAllRanges();for(const e of t)this._pushRange(e);this._lastRangeBackward=!!e,this.fire("change:range",{directChange:!0})}}setFocus(t,e){if(null===this.anchor)throw new l("model-selection-setfocus-no-ranges",[this,t]);const n=el._createAt(t,e);if("same"==n.compareWith(this.focus))return;const o=this.anchor;this._ranges.length&&this._popRange(),"before"==n.compareWith(o)?(this._pushRange(new rl(n,o)),this._lastRangeBackward=!0):(this._pushRange(new rl(o,n)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){this.hasAttribute(t)&&(this._attrs.delete(t),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}setAttribute(t,e){this.getAttribute(t)!==e&&(this._attrs.set(t,e),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}is(t){return"selection"===t||"model:selection"===t}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const n=pl(e.start,t);n&&fl(n,e)&&(yield n);for(const n of e.getWalker()){const o=n.item;"elementEnd"==n.type&&gl(o,t,e)&&(yield o)}const o=pl(e.end,t);o&&!e.end.isTouching(el._createAt(o,0))&&fl(o,e)&&(yield o)}}containsEntireContent(t=this.anchor.root){const e=el._createAt(t,0),n=el._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&n.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t),this._ranges.push(new rl(t.start,t.end))}_checkRange(t){for(let e=0;e0;)this._popRange()}_popRange(){this._ranges.pop()}}function ml(t,e){return!e.has(t)&&(e.add(t),t.root.document.model.schema.isBlock(t)&&t.parent)}function gl(t,e,n){return ml(t,e)&&fl(t,n)}function pl(t,e){const n=t.parent.root.document.model.schema,o=t.parent.getAncestors({parentFirst:!0,includeSelf:!0});let i=!1;const r=o.find((t=>!i&&(i=n.isLimit(t),!i&&ml(t,e))));return o.forEach((t=>e.add(t))),r}function fl(t,e){const n=function(t){const e=t.root.document.model.schema;let n=t.parent;for(;n;){if(e.isBlock(n))return n;n=n.parent}}(t);if(!n)return!0;return!e.containsRange(rl._createOn(n),!0)}j(hl,k);class bl extends rl{constructor(t,e){super(t,e),kl.call(this)}detach(){this.stopListening()}is(t){return"liveRange"===t||"model:liveRange"===t||"range"==t||"model:range"===t}toRange(){return new rl(this.start,this.end)}static fromRange(t){return new bl(t.start,t.end)}}function kl(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&wl.call(this,n)}),{priority:"low"})}function wl(t){const e=this.getTransformedByOperation(t),n=rl._createFromRanges(e),o=!n.isEqual(this),i=function(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return!1}(this,t);let r=null;if(o){"$graveyard"==n.root.rootName&&(r="remove"==t.type?t.sourcePosition:t.deletionPosition);const e=this.toRange();this.start=n.start,this.end=n.end,this.fire("change:range",e,{deletionPosition:r})}else i&&this.fire("change:content",this.toRange(),{deletionPosition:r})}j(bl,k);const Al="selection:";class Cl{constructor(t){this._selection=new _l(t),this._selection.delegate("change:range").to(this),this._selection.delegate("change:attribute").to(this),this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection._updateMarkers(),this._selection._updateAttributes(!1)}observeMarkers(t){this._selection.observeMarkers(t)}is(t){return"selection"===t||"model:selection"==t||"documentSelection"==t||"model:documentSelection"==t}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(t,e,n){this._selection.setTo(t,e,n)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection._getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return Al+t}static _isStoreAttributeKey(t){return t.startsWith(Al)}}j(Cl,k);class _l extends hl{constructor(t){super(),this.markers=new bo({idProperty:"name"}),this._model=t.model,this._document=t,this._attributePriority=new Map,this._selectionRestorePosition=null,this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this._observedMarkers=new Set,this.listenTo(this._model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&"marker"!=n.type&&"rename"!=n.type&&"noop"!=n.type&&(0==this._ranges.length&&this._selectionRestorePosition&&this._fixGraveyardSelection(this._selectionRestorePosition),this._selectionRestorePosition=null,this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1})))}),{priority:"lowest"}),this.on("change:range",(()=>{for(const t of this.getRanges())if(!this._document._validateSelectionRange(t))throw new l("document-selection-wrong-position",this,{range:t})})),this.listenTo(this._model.markers,"update",((t,e,n,o)=>{this._updateMarker(e,o)})),this.listenTo(this._document,"change",((t,e)=>{!function(t,e){const n=t.document.differ;for(const o of n.getChanges()){if("insert"!=o.type)continue;const n=o.position.parent;o.length===n.maxOffset&&t.enqueueChange(e,(t=>{const e=Array.from(n.getAttributeKeys()).filter((t=>t.startsWith(Al)));for(const o of e)t.removeAttribute(o,n)}))}}(this._model,e)}))}get isCollapsed(){return 0===this._ranges.length?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t{if(this._hasChangedRange=!0,e.root==this._document.graveyard){this._selectionRestorePosition=o.deletionPosition;const t=this._ranges.indexOf(e);this._ranges.splice(t,1),e.detach()}})),e}_updateMarkers(){if(!this._observedMarkers.size)return;const t=[];let e=!1;for(const e of this._model.markers){const n=e.name.split(":",1)[0];if(!this._observedMarkers.has(n))continue;const o=e.getRange();for(const n of this.getRanges())o.containsRange(n,!n.isCollapsed)&&t.push(e)}const n=Array.from(this.markers);for(const n of t)this.markers.has(n)||(this.markers.add(n),e=!0);for(const n of Array.from(this.markers))t.includes(n)||(this.markers.remove(n),e=!0);e&&this.fire("change:marker",{oldMarkers:n,directChange:!1})}_updateMarker(t,e){const n=t.name.split(":",1)[0];if(!this._observedMarkers.has(n))return;let o=!1;const i=Array.from(this.markers),r=this.markers.has(t);if(e){let n=!1;for(const t of this.getRanges())if(e.containsRange(t,!t.isCollapsed)){n=!0;break}n&&!r?(this.markers.add(t),o=!0):!n&&r&&(this.markers.remove(t),o=!0)}else r&&(this.markers.remove(t),o=!0);o&&this.fire("change:marker",{oldMarkers:i,directChange:!1})}_updateAttributes(t){const e=Mo(this._getSurroundingAttributes()),n=Mo(this.getAttributes());if(t)this._attributePriority=new Map,this._attrs=new Map;else for(const[t,e]of this._attributePriority)"low"==e&&(this._attrs.delete(t),this._attributePriority.delete(t));this._setAttributesTo(e);const o=[];for(const[t,e]of this.getAttributes())n.has(t)&&n.get(t)===e||o.push(t);for(const[t]of n)this.hasAttribute(t)||o.push(t);o.length>0&&this.fire("change:attribute",{attributeKeys:o,directChange:!1})}_setAttribute(t,e,n=!0){const o=n?"normal":"low";if("low"==o&&"normal"==this._attributePriority.get(t))return!1;return super.getAttribute(t)!==e&&(this._attrs.set(t,e),this._attributePriority.set(t,o),!0)}_removeAttribute(t,e=!0){const n=e?"normal":"low";return("low"!=n||"normal"!=this._attributePriority.get(t))&&(this._attributePriority.set(t,n),!!super.hasAttribute(t)&&(this._attrs.delete(t),!0))}_setAttributesTo(t){const e=new Set;for(const[e,n]of this.getAttributes())t.get(e)!==n&&this._removeAttribute(e,!1);for(const[n,o]of t){this._setAttribute(n,o,!1)&&e.add(n)}return e}*_getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty)for(const e of t.getAttributeKeys())if(e.startsWith(Al)){const n=e.substr(Al.length);yield[n,t.getAttribute(e)]}}_getSurroundingAttributes(){const t=this.getFirstPosition(),e=this._model.schema;let n=null;if(this.isCollapsed){const o=t.textNode?t.textNode:t.nodeBefore,i=t.textNode?t.textNode:t.nodeAfter;if(this.isGravityOverridden||(n=vl(o)),n||(n=vl(i)),!this.isGravityOverridden&&!n){let t=o;for(;t&&!e.isInline(t)&&!n;)t=t.previousSibling,n=vl(t)}if(!n){let t=i;for(;t&&!e.isInline(t)&&!n;)t=t.nextSibling,n=vl(t)}n||(n=this._getStoredAttributes())}else{const t=this.getFirstRange();for(const o of t){if(o.item.is("element")&&e.isObject(o.item))break;if("text"==o.type){n=o.item.getAttributes();break}}}return n}_fixGraveyardSelection(t){const e=this._model.schema.getNearestSelectionRange(t);e&&this._pushRange(e)}}function vl(t){return t instanceof $a||t instanceof Ka?t.getAttributes():null}class yl{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers)t(e);return this}}const xl=function(t){return lo(t,5)};class El extends yl{elementToElement(t){return this.add(function(t){(t=xl(t)).model=Il(t.model),t.view=Tl(t.view,"container"),t.model.attributes.length&&(t.model.children=!0);return e=>{e.on("insert:"+t.model.name,function(t,e=Rl){return(n,o,i)=>{if(!e(o.item,i.consumable,{preflight:!0}))return;const r=t(o.item,i,o);if(!r)return;e(o.item,i.consumable);const s=i.mapper.toViewPosition(o.range.start);i.mapper.bindElements(o.item,r),i.writer.insert(s,r),i.convertAttributes(o.item),Ll(r,o.item.getChildren(),i,{reconversion:o.reconversion})}}(t.view,Pl(t.model)),{priority:t.converterPriority||"normal"}),(t.model.children||t.model.attributes.length)&&e.on("reduceChanges",zl(t.model),{priority:"low"})}}(t))}elementToStructure(t){return this.add(function(t){return(t=xl(t)).model=Il(t.model),t.view=Tl(t.view,"container"),t.model.children=!0,e=>{if(e._conversionApi.schema.checkChild(t.model.name,"$text"))throw new l("conversion-element-to-structure-disallowed-text",e,{elementName:t.model.name});var n,o;e.on("insert:"+t.model.name,(n=t.view,o=Pl(t.model),(t,e,i)=>{if(!o(e.item,i.consumable,{preflight:!0}))return;const r=new Map;i.writer._registerSlotFactory(function(t,e,n){return(o,i="children")=>{const r=o.createContainerElement("$slot");let s=null;if("children"===i)s=Array.from(t.getChildren());else{if("function"!=typeof i)throw new l("conversion-slot-mode-unknown",n.dispatcher,{modeOrFilter:i});s=Array.from(t.getChildren()).filter((t=>i(t)))}return e.set(r,s),r}}(e.item,r,i));const s=n(e.item,i,e);if(i.writer._clearSlotFactory(),!s)return;!function(t,e,n){const o=Array.from(e.values()).flat(),i=new Set(o);if(i.size!=o.length)throw new l("conversion-slot-filter-overlap",n.dispatcher,{element:t});if(i.size!=t.childCount)throw new l("conversion-slot-filter-incomplete",n.dispatcher,{element:t})}(e.item,r,i),o(e.item,i.consumable);const a=i.mapper.toViewPosition(e.range.start);i.mapper.bindElements(e.item,s),i.writer.insert(a,s),i.convertAttributes(e.item),function(t,e,n,o){n.mapper.on("modelToViewPosition",s,{priority:"highest"});let i=null,r=null;for([i,r]of e)Ll(t,r,n,o),n.writer.move(n.writer.createRangeIn(i),n.writer.createPositionBefore(i)),n.writer.remove(i);function s(t,e){const n=e.modelPosition.nodeAfter,o=r.indexOf(n);o<0||(e.viewPosition=e.mapper.findPositionIn(i,o))}n.mapper.off("modelToViewPosition",s)}(s,r,i,{reconversion:e.reconversion})}),{priority:t.converterPriority||"normal"}),e.on("reduceChanges",zl(t.model),{priority:"low"})}}(t))}attributeToElement(t){return this.add(function(t){t=xl(t);let e="attribute:"+(t.model.key?t.model.key:t.model);t.model.name&&(e+=":"+t.model.name);if(t.model.values)for(const e of t.model.values)t.view[e]=Tl(t.view[e],"attribute");else t.view=Tl(t.view,"attribute");const n=Ml(t);return o=>{o.on(e,function(t){return(e,n,o)=>{if(!o.consumable.test(n.item,e.name))return;const i=t(n.attributeOldValue,o,n),r=t(n.attributeNewValue,o,n);if(!i&&!r)return;o.consumable.consume(n.item,e.name);const s=o.writer,a=s.document.selection;if(n.item instanceof hl||n.item instanceof Cl)s.wrap(a.getFirstRange(),r);else{let t=o.mapper.toViewRange(n.range);null!==n.attributeOldValue&&i&&(t=s.unwrap(t,i)),null!==n.attributeNewValue&&r&&s.wrap(t,r)}}}(n),{priority:t.converterPriority||"normal"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=xl(t);let e="attribute:"+(t.model.key?t.model.key:t.model);t.model.name&&(e+=":"+t.model.name);if(t.model.values)for(const e of t.model.values)t.view[e]=Bl(t.view[e]);else t.view=Bl(t.view);const n=Ml(t);return o=>{var i;o.on(e,(i=n,(t,e,n)=>{if(!n.consumable.test(e.item,t.name))return;const o=i(e.attributeOldValue,n,e),r=i(e.attributeNewValue,n,e);if(!o&&!r)return;n.consumable.consume(e.item,t.name);const s=n.mapper.toViewElement(e.item),a=n.writer;if(!s)throw new l("conversion-attribute-to-attribute-on-text",n.dispatcher,e);if(null!==e.attributeOldValue&&o)if("class"==o.key){const t=wo(o.value);for(const e of t)a.removeClass(e,s)}else if("style"==o.key){const t=Object.keys(o.value);for(const e of t)a.removeStyle(e,s)}else a.removeAttribute(o.key,s);if(null!==e.attributeNewValue&&r)if("class"==r.key){const t=wo(r.value);for(const e of t)a.addClass(e,s)}else if("style"==r.key){const t=Object.keys(r.value);for(const e of t)a.setStyle(e,r.value[e],s)}else a.setAttribute(r.key,r.value,s)}),{priority:t.converterPriority||"normal"})}}(t))}markerToElement(t){return this.add(function(t){return(t=xl(t)).view=Tl(t.view,"ui"),e=>{var n;e.on("addMarker:"+t.model,(n=t.view,(t,e,o)=>{e.isOpening=!0;const i=n(e,o);e.isOpening=!1;const r=n(e,o);if(!i||!r)return;const s=e.markerRange;if(s.isCollapsed&&!o.consumable.consume(s,t.name))return;for(const e of s)if(!o.consumable.consume(e.item,t.name))return;const a=o.mapper,l=o.writer;l.insert(a.toViewPosition(s.start),i),o.mapper.bindElementToMarker(i,e.markerName),s.isCollapsed||(l.insert(a.toViewPosition(s.end),r),o.mapper.bindElementToMarker(r,e.markerName)),t.stop()}),{priority:t.converterPriority||"normal"}),e.on("removeMarker:"+t.model,(t.view,(t,e,n)=>{const o=n.mapper.markerNameToElements(e.markerName);if(o){for(const t of o)n.mapper.unbindElementFromMarkerName(t,e.markerName),n.writer.clear(n.writer.createRangeOn(t),t);n.writer.clearClonedElementsGroup(e.markerName),t.stop()}}),{priority:t.converterPriority||"normal"})}}(t))}markerToHighlight(t){return this.add(function(t){return e=>{var n;e.on("addMarker:"+t.model,(n=t.view,(t,e,o)=>{if(!e.item)return;if(!(e.item instanceof hl||e.item instanceof Cl||e.item.is("$textProxy")))return;const i=Nl(n,e,o);if(!i)return;if(!o.consumable.consume(e.item,t.name))return;const r=o.writer,s=Dl(r,i),a=r.document.selection;if(e.item instanceof hl||e.item instanceof Cl)r.wrap(a.getFirstRange(),s,a);else{const t=o.mapper.toViewRange(e.range),n=r.wrap(t,s);for(const t of n.getItems())if(t.is("attributeElement")&&t.isSimilar(s)){o.mapper.bindElementToMarker(t,e.markerName);break}}}),{priority:t.converterPriority||"normal"}),e.on("addMarker:"+t.model,function(t){return(e,n,o)=>{if(!n.item)return;if(!(n.item instanceof Ja))return;const i=Nl(t,n,o);if(!i)return;if(!o.consumable.test(n.item,e.name))return;const r=o.mapper.toViewElement(n.item);if(r&&r.getCustomProperty("addHighlight")){o.consumable.consume(n.item,e.name);for(const t of rl._createIn(n.item))o.consumable.consume(t.item,e.name);r.getCustomProperty("addHighlight")(r,i,o.writer),o.mapper.bindElementToMarker(r,n.markerName)}}}(t.view),{priority:t.converterPriority||"normal"}),e.on("removeMarker:"+t.model,function(t){return(e,n,o)=>{if(n.markerRange.isCollapsed)return;const i=Nl(t,n,o);if(!i)return;const r=Dl(o.writer,i),s=o.mapper.markerNameToElements(n.markerName);if(s){for(const t of s)o.mapper.unbindElementFromMarkerName(t,n.markerName),t.is("attributeElement")?o.writer.unwrap(o.writer.createRangeOn(t),r):t.getCustomProperty("removeHighlight")(t,i.id,o.writer);o.writer.clearClonedElementsGroup(n.markerName),e.stop()}}}(t.view),{priority:t.converterPriority||"normal"})}}(t))}markerToData(t){return this.add(function(t){const e=(t=xl(t)).model;t.view||(t.view=n=>({group:e,name:n.substr(t.model.length+1)}));return n=>{var o;n.on("addMarker:"+e,(o=t.view,(t,e,n)=>{const i=o(e.markerName,n);if(!i)return;const r=e.markerRange;n.consumable.consume(r,t.name)&&(Sl(r,!1,n,e,i),Sl(r,!0,n,e,i),t.stop())}),{priority:t.converterPriority||"normal"}),n.on("removeMarker:"+e,function(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i)return;const r=o.mapper.markerNameToElements(n.markerName);if(r){for(const t of r)o.mapper.unbindElementFromMarkerName(t,n.markerName),t.is("containerElement")?(s(`data-${i.group}-start-before`,t),s(`data-${i.group}-start-after`,t),s(`data-${i.group}-end-before`,t),s(`data-${i.group}-end-after`,t)):o.writer.clear(o.writer.createRangeOn(t),t);o.writer.clearClonedElementsGroup(n.markerName),e.stop()}function s(t,e){if(e.hasAttribute(t)){const n=new Set(e.getAttribute(t).split(","));n.delete(i.name),0==n.size?o.writer.removeAttribute(t,e):o.writer.setAttribute(t,Array.from(n).join(","),e)}}}}(t.view),{priority:t.converterPriority||"normal"})}}(t))}}function Dl(t,e){const n=t.createAttributeElement("span",e.attributes);return e.classes&&n._addClass(e.classes),"number"==typeof e.priority&&(n._priority=e.priority),n._id=e.id,n}function Sl(t,e,n,o,i){const r=e?t.start:t.end,s=r.nodeAfter&&r.nodeAfter.is("element")?r.nodeAfter:null,a=r.nodeBefore&&r.nodeBefore.is("element")?r.nodeBefore:null;if(s||a){let t,r;e&&s||!e&&!a?(t=s,r=!0):(t=a,r=!1);const l=n.mapper.toViewElement(t);if(l)return void function(t,e,n,o,i,r){const s=`data-${r.group}-${e?"start":"end"}-${n?"before":"after"}`,a=t.hasAttribute(s)?t.getAttribute(s).split(","):[];a.unshift(r.name),o.writer.setAttribute(s,a.join(","),t),o.mapper.bindElementToMarker(t,i.markerName)}(l,e,r,n,o,i)}!function(t,e,n,o,i){const r=`${i.group}-${e?"start":"end"}`,s=i.name?{name:i.name}:null,a=n.writer.createUIElement(r,s);n.writer.insert(t,a),n.mapper.bindElementToMarker(a,o.markerName)}(n.mapper.toViewPosition(r),e,n,o,i)}function Il(t){return"string"==typeof t&&(t={name:t}),t.attributes?Array.isArray(t.attributes)||(t.attributes=[t.attributes]):t.attributes=[],t.children=!!t.children,t}function Tl(t,e){return"function"==typeof t?t:(n,o)=>function(t,e,n){"string"==typeof t&&(t={name:t});let o;const i=e.writer,r=Object.assign({},t.attributes);if("container"==n)o=i.createContainerElement(t.name,r);else if("attribute"==n){const e={priority:t.priority||tr.DEFAULT_PRIORITY};o=i.createAttributeElement(t.name,r,e)}else o=i.createUIElement(t.name,r);if(t.styles){const e=Object.keys(t.styles);for(const n of e)i.setStyle(n,t.styles[n],o)}if(t.classes){const e=t.classes;if("string"==typeof e)i.addClass(e,o);else for(const t of e)i.addClass(t,o)}return o}(t,o,e)}function Ml(t){return t.model.values?(e,n)=>{const o=t.view[e];return o?o(e,n):null}:t.view}function Bl(t){return"string"==typeof t?e=>({key:t,value:e}):"object"==typeof t?t.value?()=>t:e=>({key:t.key,value:e}):t}function Nl(t,e,n){const o="function"==typeof t?t(e,n):t;return o?(o.priority||(o.priority=10),o.id||(o.id=e.markerName),o):null}function zl(t){const e=function(t){return(e,n)=>{if(!e.is("element",t.name))return!1;if("attribute"==n.type){if(t.attributes.includes(n.attributeKey))return!0}else if(t.children)return!0;return!1}}(t);return(t,n)=>{const o=[];n.reconvertedElements||(n.reconvertedElements=new Set);for(const t of n.changes){const i=t.position?t.position.parent:t.range.start.nodeAfter;if(i&&e(i,t)){if(!n.reconvertedElements.has(i)){n.reconvertedElements.add(i);const t=el._createBefore(i);o.push({type:"remove",name:i.name,position:t,length:1},{type:"reinsert",name:i.name,position:t,length:1})}}else o.push(t)}n.changes=o}}function Pl(t){return(e,n,o={})=>{const i=["insert"];for(const n of t.attributes)e.hasAttribute(n)&&i.push(`attribute:${n}`);return!!i.every((t=>n.test(e,t)))&&(o.preflight||i.forEach((t=>n.consume(e,t))),!0)}}function Ll(t,e,n,o){for(const i of e)Ol(t.root,i,n,o)||n.convertItem(i)}function Ol(t,e,n,o){const{writer:i,mapper:r}=n;if(!o.reconversion)return!1;const s=r.toViewElement(e);return!(!s||s.root==t)&&(!!n.canReuseView(s)&&(i.move(i.createRangeOn(s),r.toViewPosition(el._createBefore(e))),!0))}function Rl(t,e,{preflight:n}={}){return n?e.test(t,"insert"):e.consume(t,"insert")}function jl(t){const{schema:e,document:n}=t.model;for(const o of n.getRootNames()){const i=n.getRoot(o);if(i.isEmpty&&!e.checkChild(i,"$text")&&e.checkChild(i,"paragraph"))return t.insertElement("paragraph",i),!0}return!1}function Vl(t,e,n){const o=n.createContext(t);return!!n.checkChild(o,"paragraph")&&!!n.checkChild(o.push("paragraph"),e)}function Fl(t,e){const n=e.createElement("paragraph");return e.insert(n,t),e.createPositionAt(n,0)}class Hl extends yl{elementToElement(t){return this.add(Ul(t))}elementToAttribute(t){return this.add(function(t){Wl(t=xl(t));const e=Zl(t,!1),n=ql(t.view),o=n?"element:"+n:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"low"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=xl(t);let e=null;("string"==typeof t.view||t.view.key)&&(e=function(t){"string"==typeof t.view&&(t.view={key:t.view});const e=t.view.key;let n;if("class"==e||"style"==e){n={["class"==e?"classes":"styles"]:t.view.value}}else{n={attributes:{[e]:void 0===t.view.value?/[\s\S]*/:t.view.value}}}t.view.name&&(n.name=t.view.name);return t.view=n,e}(t));Wl(t,e);const n=Zl(t,!0);return e=>{e.on("element",n,{priority:t.converterPriority||"low"})}}(t))}elementToMarker(t){return this.add(function(t){return function(t){const e=t.model;t.model=(t,n)=>{const o="string"==typeof e?e:e(t,n);return n.writer.createElement("$marker",{"data-name":o})}}(t=xl(t)),Ul(t)}(t))}dataToMarker(t){return this.add(function(t){(t=xl(t)).model||(t.model=e=>e?t.view+":"+e:t.view);const e=Gl(Yl(t,"start")),n=Gl(Yl(t,"end"));return o=>{o.on("element:"+t.view+"-start",e,{priority:t.converterPriority||"normal"}),o.on("element:"+t.view+"-end",n,{priority:t.converterPriority||"normal"});const i=s.get("low"),r=s.get("highest"),a=s.get(t.converterPriority)/r;o.on("element",function(t){return(e,n,o)=>{const i=`data-${t.view}`;function r(e,i){for(const r of i){const i=t.model(r,o),s=o.writer.createElement("$marker",{"data-name":i});o.writer.insert(s,e),n.modelCursor.isEqual(e)?n.modelCursor=n.modelCursor.getShiftedBy(1):n.modelCursor=n.modelCursor._getTransformedByInsertion(e,1),n.modelRange=n.modelRange._getTransformedByInsertion(e,1)[0]}}(o.consumable.test(n.viewItem,{attributes:i+"-end-after"})||o.consumable.test(n.viewItem,{attributes:i+"-start-after"})||o.consumable.test(n.viewItem,{attributes:i+"-end-before"})||o.consumable.test(n.viewItem,{attributes:i+"-start-before"}))&&(n.modelRange||Object.assign(n,o.convertChildren(n.viewItem,n.modelCursor)),o.consumable.consume(n.viewItem,{attributes:i+"-end-after"})&&r(n.modelRange.end,n.viewItem.getAttribute(i+"-end-after").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-start-after"})&&r(n.modelRange.end,n.viewItem.getAttribute(i+"-start-after").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-end-before"})&&r(n.modelRange.start,n.viewItem.getAttribute(i+"-end-before").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-start-before"})&&r(n.modelRange.start,n.viewItem.getAttribute(i+"-start-before").split(",")))}}(t),{priority:i+a})}}(t))}}function Ul(t){const e=Gl(t=xl(t)),n=ql(t.view),o=n?"element:"+n:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"normal"})}}function ql(t){return"string"==typeof t?t:"object"==typeof t&&"string"==typeof t.name?t.name:null}function Gl(t){const e=new Bo(t.view);return(n,o,i)=>{const r=e.match(o.viewItem);if(!r)return;const s=r.match;if(s.name=!0,!i.consumable.test(o.viewItem,s))return;const a=function(t,e,n){return t instanceof Function?t(e,n):n.writer.createElement(t)}(t.model,o.viewItem,i);a&&i.safeInsert(a,o.modelCursor)&&(i.consumable.consume(o.viewItem,s),i.convertChildren(o.viewItem,a),i.updateConversionResult(a,o))}}function Wl(t,e=null){const n=null===e||(t=>t.getAttribute(e)),o="object"!=typeof t.model?t.model:t.model.key,i="object"!=typeof t.model||void 0===t.model.value?n:t.model.value;t.model={key:o,value:i}}function Zl(t,e){const n=new Bo(t.view);return(o,i,r)=>{if(!i.modelRange&&e)return;const s=n.match(i.viewItem);if(!s)return;if(!function(t,e){const n="function"==typeof t?t(e):t;if("object"==typeof n&&!ql(n))return!1;return!n.classes&&!n.attributes&&!n.styles}(t.view,i.viewItem)?delete s.match.name:s.match.name=!0,!r.consumable.test(i.viewItem,s.match))return;const a=t.model.key,l="function"==typeof t.model.value?t.model.value(i.viewItem,r):t.model.value;if(null===l)return;i.modelRange||Object.assign(i,r.convertChildren(i.viewItem,i.modelCursor));const c=function(t,e,n,o){let i=!1;for(const r of Array.from(t.getItems({shallow:n})))o.schema.checkAttribute(r,e.key)&&(i=!0,r.hasAttribute(e.key)||o.writer.setAttribute(e.key,e.value,r));return i}(i.modelRange,{key:a,value:l},e,r);c&&(r.consumable.test(i.viewItem,{name:!0})&&(s.match.name=!0),r.consumable.consume(i.viewItem,s.match))}}function Yl(t,e){const n={};return n.view=t.view+"-"+e,n.model=(e,n)=>{const o=e.getAttribute("name"),i=t.model(o,n);return n.writer.createElement("$marker",{"data-name":i})},n}class Kl{constructor(t,e){this.model=t,this.view=new Za(e),this.mapper=new sl,this.downcastDispatcher=new cl({mapper:this.mapper,schema:t.schema});const n=this.model.document,o=n.selection,i=this.model.markers;this.listenTo(this.model,"_beforeChanges",(()=>{this.view._disableRendering(!0)}),{priority:"highest"}),this.listenTo(this.model,"_afterChanges",(()=>{this.view._disableRendering(!1)}),{priority:"lowest"}),this.listenTo(n,"change",(()=>{this.view.change((t=>{this.downcastDispatcher.convertChanges(n.differ,i,t),this.downcastDispatcher.convertSelection(o,i,t)}))}),{priority:"low"}),this.listenTo(this.view.document,"selectionChange",function(t,e){return(n,o)=>{const i=o.newSelection,r=[];for(const t of i.getRanges())r.push(e.toModelRange(t));const s=t.createSelection(r,{backward:i.isBackward});s.isEqual(t.document.selection)||t.change((t=>{t.setSelection(s)}))}}(this.model,this.mapper)),this.downcastDispatcher.on("insert:$text",((t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewPosition(e.range.start),r=o.createText(e.item.data);o.insert(i,r)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,n)=>{n.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||n.convertChildren(e.item)}),{priority:"lowest"}),this.downcastDispatcher.on("remove",((t,e,n)=>{const o=n.mapper.toViewPosition(e.position),i=e.position.getShiftedBy(e.length),r=n.mapper.toViewPosition(i,{isPhantom:!0}),s=n.writer.createRange(o,r),a=n.writer.remove(s.getTrimmed());for(const t of n.writer.createRangeIn(a).getItems())n.mapper.unbindViewElement(t,{defer:!0})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=n.writer,i=o.document.selection;for(const t of i.getRanges())t.isCollapsed&&t.end.parent.isAttached()&&n.writer.mergeAttributes(t.start);o.setSelection(null)}),{priority:"high"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=e.selection;if(o.isCollapsed)return;if(!n.consumable.consume(o,"selection"))return;const i=[];for(const t of o.getRanges()){const e=n.mapper.toViewRange(t);i.push(e)}n.writer.setSelection(i,{backward:o.isBackward})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=e.selection;if(!o.isCollapsed)return;if(!n.consumable.consume(o,"selection"))return;const i=n.writer,r=o.getFirstPosition(),s=n.mapper.toViewPosition(r),a=i.breakAttributes(s);i.setSelection(a)}),{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using((t=>{if("$graveyard"==t.rootName)return null;const e=new Oi(this.view.document,t.name);return e.rootName=t.rootName,this.mapper.bindElements(t,e),e}))}destroy(){this.view.destroy(),this.stopListening()}reconvertMarker(t){const e="string"==typeof t?t:t.name,n=this.model.markers.get(e);if(!n)throw new l("editingcontroller-reconvertmarker-marker-not-exist",this,{markerName:e});this.model.change((()=>{this.model.markers._refresh(n)}))}reconvertItem(t){this.model.change((()=>{this.model.document.differ._refreshItem(t)}))}}j(Kl,N);class $l{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const n=this.get(t);if(!n)throw new l("commandcollection-command-not-found",this,{commandName:t});return n.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands())t.destroy()}}class Ql{constructor(){this._consumables=new Map}add(t,e){let n;t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):(this._consumables.has(t)?n=this._consumables.get(t):(n=new Jl(t),this._consumables.set(t,n)),n.add(e))}test(t,e){const n=this._consumables.get(t);return void 0===n?null:t.is("$text")||t.is("documentFragment")?n:n.test(e)}consume(t,e){return!!this.test(t,e)&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!1):this._consumables.get(t).consume(e),!0)}revert(t,e){const n=this._consumables.get(t);void 0!==n&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):n.revert(e))}static consumablesFromElement(t){const e={element:t,name:!0,attributes:[],classes:[],styles:[]},n=t.getAttributeKeys();for(const t of n)"style"!=t&&"class"!=t&&e.attributes.push(t);const o=t.getClassNames();for(const t of o)e.classes.push(t);const i=t.getStyleNames();for(const t of i)e.styles.push(t);return e}static createFrom(t,e){if(e||(e=new Ql(t)),t.is("$text"))return e.add(t),e;t.is("element")&&e.add(t,Ql.consumablesFromElement(t)),t.is("documentFragment")&&e.add(t);for(const n of t.getChildren())e=Ql.createFrom(n,e);return e}}class Jl{constructor(t){this.element=t,this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){t.name&&(this._canConsumeName=!0);for(const e in this._consumables)e in t&&this._add(e,t[e])}test(t){if(t.name&&!this._canConsumeName)return this._canConsumeName;for(const e in this._consumables)if(e in t){const n=this._test(e,t[e]);if(!0!==n)return n}return!0}consume(t){t.name&&(this._canConsumeName=!1);for(const e in this._consumables)e in t&&this._consume(e,t[e])}revert(t){t.name&&(this._canConsumeName=!0);for(const e in this._consumables)e in t&&this._revert(e,t[e])}_add(t,e){const n=ve(e)?e:[e],o=this._consumables[t];for(const e of n){if("attributes"===t&&("class"===e||"style"===e))throw new l("viewconsumable-invalid-attribute",this);if(o.set(e,!0),"styles"===t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))o.set(t,!0)}}_test(t,e){const n=ve(e)?e:[e],o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){const t=o.get(e);if(void 0===t)return null;if(!t)return!1}else{const t="class"==e?"classes":"styles",n=this._test(t,[...this._consumables[t].keys()]);if(!0!==n)return n}return!0}_consume(t,e){const n=ve(e)?e:[e],o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){if(o.set(e,!1),"styles"==t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))o.set(t,!1)}else{const t="class"==e?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}}_revert(t,e){const n=ve(e)?e:[e],o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){!1===o.get(e)&&o.set(e,!0)}else{const t="class"==e?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}}}class Xl{constructor(){this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",((t,e)=>{e[0]=new tc(e[0])}),{priority:"highest"}),this.on("checkChild",((t,e)=>{e[0]=new tc(e[0]),e[1]=this.getDefinition(e[1])}),{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t])throw new l("schema-cannot-register-item-twice",this,{itemName:t});this._sourceDefinitions[t]=[Object.assign({},e)],this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t])throw new l("schema-cannot-extend-missing-item",this,{itemName:t});this._sourceDefinitions[t].push(Object.assign({},e)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(t){let e;return e="string"==typeof t?t:t.is&&(t.is("$text")||t.is("$textProxy"))?"$text":t.name,this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!(!e||!e.isBlock)}isLimit(t){const e=this.getDefinition(t);return!!e&&!(!e.isLimit&&!e.isObject)}isObject(t){const e=this.getDefinition(t);return!!e&&!!(e.isObject||e.isLimit&&e.isSelectable&&e.isContent)}isInline(t){const e=this.getDefinition(t);return!(!e||!e.isInline)}isSelectable(t){const e=this.getDefinition(t);return!!e&&!(!e.isSelectable&&!e.isObject)}isContent(t){const e=this.getDefinition(t);return!!e&&!(!e.isContent&&!e.isObject)}checkChild(t,e){return!!e&&this._checkContextMatch(e,t)}checkAttribute(t,e){const n=this.getDefinition(t.last);return!!n&&n.allowAttributes.includes(e)}checkMerge(t,e=null){if(t instanceof el){const e=t.nodeBefore,n=t.nodeAfter;if(!(e instanceof Ja))throw new l("schema-check-merge-no-element-before",this);if(!(n instanceof Ja))throw new l("schema-check-merge-no-element-after",this);return this.checkMerge(e,n)}for(const n of e.getChildren())if(!this.checkChild(t,n))return!1;return!0}addChildCheck(t){this.on("checkChild",((e,[n,o])=>{if(!o)return;const i=t(n,o);"boolean"==typeof i&&(e.stop(),e.return=i)}),{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",((e,[n,o])=>{const i=t(n,o);"boolean"==typeof i&&(e.stop(),e.return=i)}),{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof el)e=t.parent;else{e=(t instanceof rl?[t]:Array.from(t.getRanges())).reduce(((t,e)=>{const n=e.getCommonAncestor();return t?t.getCommonAncestor(n,{includeSelf:!0}):n}),null)}for(;!this.isLimit(e)&&e.parent;)e=e.parent;return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const n=[...t.getFirstPosition().getAncestors(),new Ka("",t.getAttributes())];return this.checkAttribute(n,e)}{const n=t.getRanges();for(const t of n)for(const n of t)if(this.checkAttribute(n.item,e))return!0}return!1}*getValidRanges(t,e){t=function*(t){for(const e of t)yield*e.getMinimalFlatRanges()}(t);for(const n of t)yield*this._getValidRangesForRange(n,e)}getNearestSelectionRange(t,e="both"){if(this.checkChild(t,"$text"))return new rl(t);let n,o;const i=t.getAncestors().reverse().find((t=>this.isLimit(t)))||t.root;"both"!=e&&"backward"!=e||(n=new Xa({boundaries:rl._createIn(i),startPosition:t,direction:"backward"})),"both"!=e&&"forward"!=e||(o=new Xa({boundaries:rl._createIn(i),startPosition:t}));for(const t of function*(t,e){let n=!1;for(;!n;){if(n=!0,t){const e=t.next();e.done||(n=!1,yield{walker:t,value:e.value})}if(e){const t=e.next();t.done||(n=!1,yield{walker:e,value:t.value})}}}(n,o)){const e=t.walker==n?"elementEnd":"elementStart",o=t.value;if(o.type==e&&this.isObject(o.item))return rl._createOn(o.item);if(this.checkChild(o.nextPosition,"$text"))return new rl(o.nextPosition)}return null}findAllowedParent(t,e){let n=t.parent;for(;n;){if(this.checkChild(n,e))return n;if(this.isLimit(n))return null;n=n.parent}return null}setAllowedAttributes(t,e,n){const o=n.model;for(const[i,r]of Object.entries(e))o.schema.checkAttribute(t,i)&&n.setAttribute(i,r,t)}removeDisallowedAttributes(t,e){for(const n of t)if(n.is("$text"))mc(this,n,e);else{const t=rl._createIn(n).getPositions();for(const n of t){mc(this,n.nodeBefore||n.parent,e)}}}getAttributesWithProperty(t,e,n){const o={};for(const[i,r]of t.getAttributes()){const t=this.getAttributeProperties(i);void 0!==t[e]&&(void 0!==n&&n!==t[e]||(o[i]=r))}return o}createContext(t){return new tc(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={},e=this._sourceDefinitions,n=Object.keys(e);for(const o of n)t[o]=ec(e[o],o);for(const e of n)nc(t,e);for(const e of n)oc(t,e);for(const e of n)ic(t,e);for(const e of n)rc(t,e),sc(t,e);for(const e of n)ac(t,e),lc(t,e),cc(t,e);this._compiledDefinitions=t}_checkContextMatch(t,e,n=e.length-1){const o=e.getItem(n);if(t.allowIn.includes(o.name)){if(0==n)return!0;{const t=this.getDefinition(o);return this._checkContextMatch(t,e,n-1)}}return!1}*_getValidRangesForRange(t,e){let n=t.start,o=t.start;for(const i of t.getItems({shallow:!0}))i.is("element")&&(yield*this._getValidRangesForRange(rl._createIn(i),e)),this.checkAttribute(i,e)||(n.isEqual(o)||(yield new rl(n,o)),n=el._createAfter(i)),o=el._createAfter(i);n.isEqual(o)||(yield new rl(n,o))}}j(Xl,N);class tc{constructor(t){if(t instanceof tc)return t;"string"==typeof t?t=[t]:Array.isArray(t)||(t=t.getAncestors({includeSelf:!0})),this._items=t.map(hc)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new tc([t]);return e._items=[...this._items,...e._items],e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map((t=>t.name))}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function ec(t,e){const n={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],allowChildren:[],inheritTypesFrom:[]};return function(t,e){for(const n of t){const t=Object.keys(n).filter((t=>t.startsWith("is")));for(const o of t)e[o]=n[o]}}(t,n),dc(t,n,"allowIn"),dc(t,n,"allowContentOf"),dc(t,n,"allowWhere"),dc(t,n,"allowAttributes"),dc(t,n,"allowAttributesOf"),dc(t,n,"allowChildren"),dc(t,n,"inheritTypesFrom"),function(t,e){for(const n of t){const t=n.inheritAllFrom;t&&(e.allowContentOf.push(t),e.allowWhere.push(t),e.allowAttributesOf.push(t),e.inheritTypesFrom.push(t))}}(t,n),n}function nc(t,e){const n=t[e];for(const o of n.allowChildren){const n=t[o];n&&n.allowIn.push(e)}n.allowChildren.length=0}function oc(t,e){for(const n of t[e].allowContentOf)if(t[n]){uc(t,n).forEach((t=>{t.allowIn.push(e)}))}delete t[e].allowContentOf}function ic(t,e){for(const n of t[e].allowWhere){const o=t[n];if(o){const n=o.allowIn;t[e].allowIn.push(...n)}}delete t[e].allowWhere}function rc(t,e){for(const n of t[e].allowAttributesOf){const o=t[n];if(o){const n=o.allowAttributes;t[e].allowAttributes.push(...n)}}delete t[e].allowAttributesOf}function sc(t,e){const n=t[e];for(const e of n.inheritTypesFrom){const o=t[e];if(o){const t=Object.keys(o).filter((t=>t.startsWith("is")));for(const e of t)e in n||(n[e]=o[e])}}delete n.inheritTypesFrom}function ac(t,e){const n=t[e],o=n.allowIn.filter((e=>t[e]));n.allowIn=Array.from(new Set(o))}function lc(t,e){const n=t[e];for(const o of n.allowIn){t[o].allowChildren.push(e)}}function cc(t,e){const n=t[e];n.allowAttributes=Array.from(new Set(n.allowAttributes))}function dc(t,e,n){for(const o of t)"string"==typeof o[n]?e[n].push(o[n]):Array.isArray(o[n])&&e[n].push(...o[n])}function uc(t,e){const n=t[e];return(o=t,Object.keys(o).map((t=>o[t]))).filter((t=>t.allowIn.includes(n.name)));var o}function hc(t){return"string"==typeof t||t.is("documentFragment")?{name:"string"==typeof t?t:"$documentFragment",*getAttributeKeys(){},getAttribute(){}}:{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute:e=>t.getAttribute(e)}}function mc(t,e,n){for(const o of e.getAttributeKeys())t.checkAttribute(e,o)||n.removeAttribute(o,e)}class gc{constructor(t={}){this._splitParts=new Map,this._cursorParents=new Map,this._modelCursor=null,this._emptyElementsToKeep=new Set,this.conversionApi=Object.assign({},t),this.conversionApi.convertItem=this._convertItem.bind(this),this.conversionApi.convertChildren=this._convertChildren.bind(this),this.conversionApi.safeInsert=this._safeInsert.bind(this),this.conversionApi.updateConversionResult=this._updateConversionResult.bind(this),this.conversionApi.splitToAllowedParent=this._splitToAllowedParent.bind(this),this.conversionApi.getSplitParts=this._getSplitParts.bind(this),this.conversionApi.keepEmptyElement=this._keepEmptyElement.bind(this)}convert(t,e,n=["$root"]){this.fire("viewCleanup",t),this._modelCursor=function(t,e){let n;for(const o of new tc(t)){const t={};for(const e of o.getAttributeKeys())t[e]=o.getAttribute(e);const i=e.createElement(o.name,t);n&&e.append(i,n),n=el._createAt(i,0)}return n}(n,e),this.conversionApi.writer=e,this.conversionApi.consumable=Ql.createFrom(t),this.conversionApi.store={};const{modelRange:o}=this._convertItem(t,this._modelCursor),i=e.createDocumentFragment();if(o){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren()))e.append(t,i);i.markers=function(t,e){const n=new Set,o=new Map,i=rl._createIn(t).getItems();for(const t of i)"$marker"==t.name&&n.add(t);for(const t of n){const n=t.getAttribute("data-name"),i=e.createPositionBefore(t);o.has(n)?o.get(n).end=i.clone():o.set(n,new rl(i.clone())),e.remove(t)}return o}(i,e)}return this._modelCursor=null,this._splitParts.clear(),this._cursorParents.clear(),this._emptyElementsToKeep.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,i}_convertItem(t,e){const n=Object.assign({viewItem:t,modelCursor:e,modelRange:null});if(t.is("element")?this.fire("element:"+t.name,n,this.conversionApi):t.is("$text")?this.fire("text",n,this.conversionApi):this.fire("documentFragment",n,this.conversionApi),n.modelRange&&!(n.modelRange instanceof rl))throw new l("view-conversion-dispatcher-incorrect-result",this);return{modelRange:n.modelRange,modelCursor:n.modelCursor}}_convertChildren(t,e){let n=e.is("position")?e:el._createAt(e,0);const o=new rl(n);for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,n);t.modelRange instanceof rl&&(o.end=t.modelRange.end,n=t.modelCursor)}return{modelRange:o,modelCursor:n}}_safeInsert(t,e){const n=this._splitToAllowedParent(t,e);return!!n&&(this.conversionApi.writer.insert(t,n.position),!0)}_updateConversionResult(t,e){const n=this._getSplitParts(t),o=this.conversionApi.writer;e.modelRange||(e.modelRange=o.createRange(o.createPositionBefore(t),o.createPositionAfter(n[n.length-1])));const i=this._cursorParents.get(t);e.modelCursor=i?o.createPositionAt(i,0):e.modelRange.end}_splitToAllowedParent(t,e){const{schema:n,writer:o}=this.conversionApi;let i=n.findAllowedParent(e,t);if(i){if(i===e.parent)return{position:e};this._modelCursor.parent.getAncestors().includes(i)&&(i=null)}if(!i)return Vl(e,t,n)?{position:Fl(e,o)}:null;const r=this.conversionApi.writer.split(e,i),s=[];for(const t of r.range.getWalker())if("elementEnd"==t.type)s.push(t.item);else{const e=s.pop(),n=t.item;this._registerSplitPair(e,n)}const a=r.range.end.parent;return this._cursorParents.set(t,a),{position:r.position,cursorParent:a}}_registerSplitPair(t,e){this._splitParts.has(t)||this._splitParts.set(t,[t]);const n=this._splitParts.get(t);this._splitParts.set(e,n),n.push(e)}_getSplitParts(t){let e;return e=this._splitParts.has(t)?this._splitParts.get(t):[t],e}_keepEmptyElement(t){this._emptyElementsToKeep.add(t)}_removeEmptyElements(){let t=!1;for(const e of this._splitParts.keys())e.isEmpty&&!this._emptyElementsToKeep.has(e)&&(this.conversionApi.writer.remove(e),this._splitParts.delete(e),t=!0);t&&this._removeEmptyElements()}}j(gc,k);class pc{getHtml(t){const e=document.implementation.createHTMLDocument("").createElement("div");return e.appendChild(t),e.innerHTML}}class fc{constructor(t){this.domParser=new DOMParser,this.domConverter=new Cs(t,{renderingMode:"data"}),this.htmlWriter=new pc}toData(t){const e=this.domConverter.viewToDom(t);return this.htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this.domConverter.domToView(e)}registerRawContentMatcher(t){this.domConverter.registerRawContentMatcher(t)}useFillerType(t){this.domConverter.blockFillerMode="marked"==t?"markedNbsp":"nbsp"}_toDom(t){t.match(/<(?:html|body|head|meta)(?:\s[^>]*)?>/i)||(t=`${t}`);const e=this.domParser.parseFromString(t,"text/html"),n=e.createDocumentFragment(),o=e.body.childNodes;for(;o.length>0;)n.appendChild(o[0]);return n}}class bc{constructor(t,e){this.model=t,this.mapper=new sl,this.downcastDispatcher=new cl({mapper:this.mapper,schema:t.schema}),this.downcastDispatcher.on("insert:$text",((t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewPosition(e.range.start),r=o.createText(e.item.data);o.insert(i,r)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,n)=>{n.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||n.convertChildren(e.item)}),{priority:"lowest"}),this.upcastDispatcher=new gc({schema:t.schema}),this.viewDocument=new Xi(e),this.stylesProcessor=e,this.htmlProcessor=new fc(this.viewDocument),this.processor=this.htmlProcessor,this._viewWriter=new vr(this.viewDocument),this.upcastDispatcher.on("text",((t,e,{schema:n,consumable:o,writer:i})=>{let r=e.modelCursor;if(!o.test(e.viewItem))return;if(!n.checkChild(r,"$text")){if(!Vl(r,"$text",n))return;if(0==e.viewItem.data.trim().length)return;r=Fl(r,i)}o.consume(e.viewItem);const s=i.createText(e.viewItem.data);i.insert(s,r),e.modelRange=i.createRange(r,r.getShiftedBy(s.offsetSize)),e.modelCursor=e.modelRange.end}),{priority:"lowest"}),this.upcastDispatcher.on("element",((t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=o}}),{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",((t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=o}}),{priority:"lowest"}),this.decorate("init"),this.decorate("set"),this.decorate("get"),this.on("init",(()=>{this.fire("ready")}),{priority:"lowest"}),this.on("ready",(()=>{this.model.enqueueChange({isUndoable:!1},jl)}),{priority:"lowest"})}get(t={}){const{rootName:e="main",trim:n="empty"}=t;if(!this._checkIfRootsExists([e]))throw new l("datacontroller-get-non-existent-root",this);const o=this.model.document.getRoot(e);return"empty"!==n||this.model.hasContent(o,{ignoreWhitespaces:!0})?this.stringify(o,t):""}stringify(t,e={}){const n=this.toView(t,e);return this.processor.toData(n)}toView(t,e={}){const n=this.viewDocument,o=this._viewWriter;this.mapper.clearBindings();const i=rl._createIn(t),r=new _r(n);this.mapper.bindElements(t,r);const s=t.is("documentFragment")?t.markers:function(t){const e=[],n=t.root.document;if(!n)return new Map;const o=rl._createIn(t);for(const t of n.model.markers){const n=t.getRange(),i=n.isCollapsed,r=n.start.isEqual(o.start)||n.end.isEqual(o.end);if(i&&r)e.push([t.name,n]);else{const i=o.getIntersection(n);i&&e.push([t.name,i])}}return e.sort((([t,e],[n,o])=>{if("after"!==e.end.compareWith(o.start))return 1;if("before"!==e.start.compareWith(o.end))return-1;switch(e.start.compareWith(o.start)){case"before":return 1;case"after":return-1;default:switch(e.end.compareWith(o.end)){case"before":return 1;case"after":return-1;default:return n.localeCompare(t)}}})),new Map(e)}(t);return this.downcastDispatcher.convert(i,s,o,e),r}init(t){if(this.model.document.version)throw new l("datacontroller-init-document-not-empty",this);let e={};if("string"==typeof t?e.main=t:e=t,!this._checkIfRootsExists(Object.keys(e)))throw new l("datacontroller-init-non-existent-root",this);return this.model.enqueueChange({isUndoable:!1},(t=>{for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.insert(this.parse(e[n],o),o,0)}})),Promise.resolve()}set(t,e={}){let n={};if("string"==typeof t?n.main=t:n=t,!this._checkIfRootsExists(Object.keys(n)))throw new l("datacontroller-set-non-existent-root",this);this.model.enqueueChange(e.batchType||{},(t=>{t.setSelection(null),t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const e of Object.keys(n)){const o=this.model.document.getRoot(e);t.remove(t.createRangeIn(o)),t.insert(this.parse(n[e],o),o,0)}}))}parse(t,e="$root"){const n=this.processor.toView(t);return this.toModel(n,e)}toModel(t,e="$root"){return this.model.change((n=>this.upcastDispatcher.convert(t,n,e)))}addStyleProcessorRules(t){t(this.stylesProcessor)}registerRawContentMatcher(t){this.processor&&this.processor!==this.htmlProcessor&&this.processor.registerRawContentMatcher(t),this.htmlProcessor.registerRawContentMatcher(t)}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t)if(!this.model.document.getRootNames().includes(e))return!1;return!0}}j(bc,N);class kc{constructor(t,e){this._helpers=new Map,this._downcast=wo(t),this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=wo(e),this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(t,e){const n=this._downcast.includes(e);if(!this._upcast.includes(e)&&!n)throw new l("conversion-add-alias-dispatcher-not-registered",this);this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:n})}for(t){if(!this._helpers.has(t))throw new l("conversion-for-unknown-group",this);return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:n}of wc(t))this.for("upcast").elementToElement({model:e,view:n,converterPriority:t.converterPriority})}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:n}of wc(t))this.for("upcast").elementToAttribute({view:n,model:e,converterPriority:t.converterPriority})}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:n}of wc(t))this.for("upcast").attributeToAttribute({view:n,model:e})}_createConversionHelpers({name:t,dispatchers:e,isDowncast:n}){if(this._helpers.has(t))throw new l("conversion-group-exists",this);const o=n?new El(e):new Hl(e);this._helpers.set(t,o)}}function*wc(t){if(t.model.values)for(const e of t.model.values){const n={key:t.model.key,value:e},o=t.view[e],i=t.upcastAlso?t.upcastAlso[e]:void 0;yield*Ac(n,o,i)}else yield*Ac(t.model,t.view,t.upcastAlso)}function*Ac(t,e,n){if(yield{model:t,view:e},n)for(const e of wo(n))yield{model:t,view:e}}class Cc{constructor(t={}){"string"==typeof t&&(t="transparent"===t?{isUndoable:!1}:{},c("batch-constructor-deprecated-string-type"));const{isUndoable:e=!0,isLocal:n=!0,isUndo:o=!1,isTyping:i=!1}=t;this.operations=[],this.isUndoable=e,this.isLocal=n,this.isUndo=o,this.isTyping=i}get type(){return c("batch-type-deprecated"),"default"}get baseVersion(){for(const t of this.operations)if(null!==t.baseVersion)return t.baseVersion;return null}addOperation(t){return t.batch=this,this.operations.push(t),t}}class _c{constructor(t){this.baseVersion=t,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);return t.__className=this.constructor.className,delete t.batch,delete t.isDocumentOperation,t}static get className(){return"Operation"}static fromJSON(t){return new this(t.baseVersion)}}class vc{constructor(t){this.markers=new Map,this._children=new Qa,t&&this._insertChild(0,t)}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}is(t){return"documentFragment"===t||"model:documentFragment"===t}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const n of t)e=e.getChild(e.offsetToIndex(n));return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children)t.push(e.toJSON());return t}static fromJSON(t){const e=[];for(const n of t)n.name?e.push(Ja.fromJSON(n)):e.push(Ka.fromJSON(n));return new vc(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=function(t){if("string"==typeof t)return[new Ka(t)];po(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new Ka(t):t instanceof $a?new Ka(t.data,t.getAttributes()):t))}(e);for(const t of n)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n)t.parent=null;return n}}function yc(t,e){const n=(e=Dc(e)).reduce(((t,e)=>t+e.offsetSize),0),o=t.parent;Ic(t);const i=t.index;return o._insertChild(i,e),Sc(o,i+e.length),Sc(o,i),new rl(t,t.getShiftedBy(n))}function xc(t){if(!t.isFlat)throw new l("operation-utils-remove-range-not-flat",this);const e=t.start.parent;Ic(t.start),Ic(t.end);const n=e._removeChildren(t.start.index,t.end.index-t.start.index);return Sc(e,t.start.index),n}function Ec(t,e){if(!t.isFlat)throw new l("operation-utils-move-range-not-flat",this);const n=xc(t);return yc(e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset),n)}function Dc(t){const e=[];t instanceof Array||(t=[t]);for(let n=0;nt.maxOffset)throw new l("move-operation-nodes-do-not-exist",this);if(t===e&&n=n&&this.targetPosition.path[t]t._clone(!0)))),e=new Pc(this.position,t,this.baseVersion);return e.shouldReceiveAttributes=this.shouldReceiveAttributes,e}getReversed(){const t=this.position.root.document.graveyard,e=new el(t,[0]);return new zc(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffsett._clone(!0)))),yc(this.position,t)}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t.nodes=this.nodes.toJSON(),t}static get className(){return"InsertOperation"}static fromJSON(t,e){const n=[];for(const e of t.nodes)e.name?n.push(Ja.fromJSON(e)):n.push(Ka.fromJSON(e));const o=new Pc(el.fromJSON(t.position,e),n,t.baseVersion);return o.shouldReceiveAttributes=t.shouldReceiveAttributes,o}}class Lc extends _c{constructor(t,e,n,o,i,r){super(r),this.name=t,this.oldRange=e?e.clone():null,this.newRange=n?n.clone():null,this.affectsData=i,this._markers=o}get type(){return"marker"}clone(){return new Lc(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new Lc(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){const t=this.newRange?"_set":"_remove";this._markers[t](this.name,this.newRange,!0,this.affectsData)}toJSON(){const t=super.toJSON();return this.oldRange&&(t.oldRange=this.oldRange.toJSON()),this.newRange&&(t.newRange=this.newRange.toJSON()),delete t._markers,t}static get className(){return"MarkerOperation"}static fromJSON(t,e){return new Lc(t.name,t.oldRange?rl.fromJSON(t.oldRange,e):null,t.newRange?rl.fromJSON(t.newRange,e):null,e.model.markers,t.affectsData,t.baseVersion)}}class Oc extends _c{constructor(t,e,n,o){super(o),this.position=t,this.position.stickiness="toNext",this.oldName=e,this.newName=n}get type(){return"rename"}clone(){return new Oc(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new Oc(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const t=this.position.nodeAfter;if(!(t instanceof Ja))throw new l("rename-operation-wrong-position",this);if(t.name!==this.oldName)throw new l("rename-operation-wrong-name",this)}_execute(){this.position.nodeAfter.name=this.newName}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t}static get className(){return"RenameOperation"}static fromJSON(t,e){return new Oc(el.fromJSON(t.position,e),t.oldName,t.newName,t.baseVersion)}}class Rc extends _c{constructor(t,e,n,o,i){super(i),this.root=t,this.key=e,this.oldValue=n,this.newValue=o}get type(){return null===this.oldValue?"addRootAttribute":null===this.newValue?"removeRootAttribute":"changeRootAttribute"}clone(){return new Rc(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new Rc(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment"))throw new l("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key});if(null!==this.oldValue&&this.root.getAttribute(this.key)!==this.oldValue)throw new l("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key});if(null===this.oldValue&&null!==this.newValue&&this.root.hasAttribute(this.key))throw new l("rootattribute-operation-attribute-exists",this,{root:this.root,key:this.key})}_execute(){null!==this.newValue?this.root._setAttribute(this.key,this.newValue):this.root._removeAttribute(this.key)}toJSON(){const t=super.toJSON();return t.root=this.root.toJSON(),t}static get className(){return"RootAttributeOperation"}static fromJSON(t,e){if(!e.getRoot(t.root))throw new l("rootattribute-operation-fromjson-no-root",this,{rootName:t.root});return new Rc(e.getRoot(t.root),t.key,t.oldValue,t.newValue,t.baseVersion)}}class jc extends _c{constructor(t,e,n,o,i){super(i),this.sourcePosition=t.clone(),this.sourcePosition.stickiness="toPrevious",this.howMany=e,this.targetPosition=n.clone(),this.targetPosition.stickiness="toNext",this.graveyardPosition=o.clone()}get type(){return"merge"}get deletionPosition(){return new el(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const t=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new rl(this.sourcePosition,t)}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.targetPosition._getTransformedByMergeOperation(this),e=this.sourcePosition.path.slice(0,-1),n=new el(this.sourcePosition.root,e)._getTransformedByMergeOperation(this);return new Vc(t,this.howMany,n,this.graveyardPosition,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent,e=this.targetPosition.parent;if(!t.parent)throw new l("merge-operation-source-position-invalid",this);if(!e.parent)throw new l("merge-operation-target-position-invalid",this);if(this.howMany!=t.maxOffset)throw new l("merge-operation-how-many-invalid",this)}_execute(){const t=this.sourcePosition.parent;Ec(rl._createIn(t),this.targetPosition),Ec(rl._createOn(t),this.graveyardPosition)}toJSON(){const t=super.toJSON();return t.sourcePosition=t.sourcePosition.toJSON(),t.targetPosition=t.targetPosition.toJSON(),t.graveyardPosition=t.graveyardPosition.toJSON(),t}static get className(){return"MergeOperation"}static fromJSON(t,e){const n=el.fromJSON(t.sourcePosition,e),o=el.fromJSON(t.targetPosition,e),i=el.fromJSON(t.graveyardPosition,e);return new this(n,t.howMany,o,i,t.baseVersion)}}class Vc extends _c{constructor(t,e,n,o,i){super(i),this.splitPosition=t.clone(),this.splitPosition.stickiness="toNext",this.howMany=e,this.insertionPosition=n,this.graveyardPosition=o?o.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();return t.push(0),new el(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new rl(this.splitPosition,t)}clone(){return new this.constructor(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.splitPosition.root.document.graveyard,e=new el(t,[0]);return new jc(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent,e=this.splitPosition.offset;if(!t||t.maxOffset{for(const e of t.getAttributeKeys())this.removeAttribute(e,t)};if(t instanceof rl)for(const n of t.getItems())e(n);else e(t)}move(t,e,n){if(this._assertWriterUsedCorrectly(),!(t instanceof rl))throw new l("writer-move-invalid-range",this);if(!t.isFlat)throw new l("writer-move-range-not-flat",this);const o=el._createAt(e,n);if(o.isEqual(t.start))return;if(this._addOperationForAffectedMarkers("move",t),!Zc(t.root,o.root))throw new l("writer-move-different-document",this);const i=t.root.document?t.root.document.version:null,r=new zc(t.start,t.end.offset-t.start.offset,o,i);this.batch.addOperation(r),this.model.applyOperation(r)}remove(t){this._assertWriterUsedCorrectly();const e=(t instanceof rl?t:rl._createOn(t)).getMinimalFlatRanges().reverse();for(const t of e)this._addOperationForAffectedMarkers("move",t),Wc(t.start,t.end.offset-t.start.offset,this.batch,this.model)}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore,n=t.nodeAfter;if(this._addOperationForAffectedMarkers("merge",t),!(e instanceof Ja))throw new l("writer-merge-no-element-before",this);if(!(n instanceof Ja))throw new l("writer-merge-no-element-after",this);t.root.document?this._merge(t):this._mergeDetached(t)}createPositionFromPath(t,e,n){return this.model.createPositionFromPath(t,e,n)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(t,e,n){return this.model.createSelection(t,e,n)}_mergeDetached(t){const e=t.nodeBefore,n=t.nodeAfter;this.move(rl._createIn(n),el._createAt(e,"end")),this.remove(n)}_merge(t){const e=el._createAt(t.nodeBefore,"end"),n=el._createAt(t.nodeAfter,0),o=t.root.document.graveyard,i=new el(o,[0]),r=t.root.document.version,s=new jc(n,t.nodeAfter.maxOffset,e,i,r);this.batch.addOperation(s),this.model.applyOperation(s)}rename(t,e){if(this._assertWriterUsedCorrectly(),!(t instanceof Ja))throw new l("writer-rename-not-element-instance",this);const n=t.root.document?t.root.document.version:null,o=new Oc(el._createBefore(t),t.name,e,n);this.batch.addOperation(o),this.model.applyOperation(o)}split(t,e){this._assertWriterUsedCorrectly();let n,o,i=t.parent;if(!i.parent)throw new l("writer-split-element-no-parent",this);if(e||(e=i.parent),!t.parent.getAncestors({includeSelf:!0}).includes(e))throw new l("writer-split-invalid-limit-element",this);do{const e=i.root.document?i.root.document.version:null,r=i.maxOffset-t.offset,s=Vc.getInsertionPosition(t),a=new Vc(t,r,s,null,e);this.batch.addOperation(a),this.model.applyOperation(a),n||o||(n=i,o=t.parent.nextSibling),i=(t=this.createPositionAfter(t.parent)).parent}while(i!==e);return{position:t,range:new rl(el._createAt(n,"end"),el._createAt(o,0))}}wrap(t,e){if(this._assertWriterUsedCorrectly(),!t.isFlat)throw new l("writer-wrap-range-not-flat",this);const n=e instanceof Ja?e:new Ja(e);if(n.childCount>0)throw new l("writer-wrap-element-not-empty",this);if(null!==n.parent)throw new l("writer-wrap-element-attached",this);this.insert(n,t.start);const o=new rl(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(o,el._createAt(n,0))}unwrap(t){if(this._assertWriterUsedCorrectly(),null===t.parent)throw new l("writer-unwrap-element-no-parent",this);this.move(rl._createIn(t),this.createPositionAfter(t)),this.remove(t)}addMarker(t,e){if(this._assertWriterUsedCorrectly(),!e||"boolean"!=typeof e.usingOperation)throw new l("writer-addmarker-no-usingoperation",this);const n=e.usingOperation,o=e.range,i=void 0!==e.affectsData&&e.affectsData;if(this.model.markers.has(t))throw new l("writer-addmarker-marker-exists",this);if(!o)throw new l("writer-addmarker-no-range",this);return n?(Gc(this,t,null,o,i),this.model.markers.get(t)):this.model.markers._set(t,o,n,i)}updateMarker(t,e){this._assertWriterUsedCorrectly();const n="string"==typeof t?t:t.name,o=this.model.markers.get(n);if(!o)throw new l("writer-updatemarker-marker-not-exists",this);if(!e)return c("writer-updatemarker-reconvert-using-editingcontroller",{markerName:n}),void this.model.markers._refresh(o);const i="boolean"==typeof e.usingOperation,r="boolean"==typeof e.affectsData,s=r?e.affectsData:o.affectsData;if(!i&&!e.range&&!r)throw new l("writer-updatemarker-wrong-options",this);const a=o.getRange(),d=e.range?e.range:a;i&&e.usingOperation!==o.managedUsingOperations?e.usingOperation?Gc(this,n,null,d,s):(Gc(this,n,a,null,s),this.model.markers._set(n,d,void 0,s)):o.managedUsingOperations?Gc(this,n,a,d,s):this.model.markers._set(n,d,void 0,s)}removeMarker(t){this._assertWriterUsedCorrectly();const e="string"==typeof t?t:t.name;if(!this.model.markers.has(e))throw new l("writer-removemarker-no-marker",this);const n=this.model.markers.get(e);if(!n.managedUsingOperations)return void this.model.markers._remove(e);Gc(this,e,n.getRange(),null,n.affectsData)}setSelection(t,e,n){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(t,e,n)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._setSelectionAttribute(t,e);else for(const[e,n]of Mo(t))this._setSelectionAttribute(e,n)}removeSelectionAttribute(t){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._removeSelectionAttribute(t);else for(const e of t)this._removeSelectionAttribute(e)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const n=this.model.document.selection;if(n.isCollapsed&&n.anchor.parent.isEmpty){const o=Cl._getStoreAttributeKey(t);this.setAttribute(o,e,n.anchor.parent)}n._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const n=Cl._getStoreAttributeKey(t);this.removeAttribute(n,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new l("writer-incorrect-use",this)}_addOperationForAffectedMarkers(t,e){for(const n of this.model.markers){if(!n.managedUsingOperations)continue;const o=n.getRange();let i=!1;if("move"===t)i=e.containsPosition(o.start)||e.start.isEqual(o.start)||e.containsPosition(o.end)||e.end.isEqual(o.end);else{const t=e.nodeBefore,n=e.nodeAfter,r=o.start.parent==t&&o.start.isAtEnd,s=o.end.parent==n&&0==o.end.offset,a=o.end.nodeAfter==n,l=o.start.nodeAfter==n;i=r||s||a||l}i&&this.updateMarker(n.name,{range:o})}}}function Uc(t,e,n,o){const i=t.model,r=i.document;let s,a,l,c=o.start;for(const t of o.getWalker({shallow:!0}))l=t.item.getAttribute(e),s&&a!=l&&(a!=n&&d(),c=s),s=t.nextPosition,a=l;function d(){const o=new rl(c,s),l=o.root.document?r.version:null,d=new Bc(o,e,a,n,l);t.batch.addOperation(d),i.applyOperation(d)}s instanceof el&&s!=c&&a!=n&&d()}function qc(t,e,n,o){const i=t.model,r=i.document,s=o.getAttribute(e);let a,l;if(s!=n){if(o.root===o){const t=o.document?r.version:null;l=new Rc(o,e,s,n,t)}else{a=new rl(el._createBefore(o),t.createPositionAfter(o));const i=a.root.document?r.version:null;l=new Bc(a,e,s,n,i)}t.batch.addOperation(l),i.applyOperation(l)}}function Gc(t,e,n,o,i){const r=t.model,s=r.document,a=new Lc(e,n,o,r.markers,i,s.version);t.batch.addOperation(a),r.applyOperation(a)}function Wc(t,e,n,o){let i;if(t.root.document){const n=o.document,r=new el(n.graveyard,[0]);i=new zc(t,e,r,n.version)}else i=new Nc(t,e);n.addOperation(i),o.applyOperation(i)}function Zc(t,e){return t===e||t instanceof Fc&&e instanceof Fc}class Yc{constructor(t){this._markerCollection=t,this._changesInElement=new Map,this._elementSnapshots=new Map,this._changedMarkers=new Map,this._changeCount=0,this._cachedChanges=null,this._cachedChangesWithGraveyard=null,this._refreshedItems=new Set}get isEmpty(){return 0==this._changesInElement.size&&0==this._changedMarkers.size}bufferOperation(t){switch(t.type){case"insert":if(this._isInInsertedElement(t.position.parent))return;this._markInsert(t.position.parent,t.position.offset,t.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const e of t.range.getItems({shallow:!0}))this._isInInsertedElement(e.parent)||this._markAttribute(e);break;case"remove":case"move":case"reinsert":{if(t.sourcePosition.isEqual(t.targetPosition)||t.sourcePosition.getShiftedBy(t.howMany).isEqual(t.targetPosition))return;const e=this._isInInsertedElement(t.sourcePosition.parent),n=this._isInInsertedElement(t.targetPosition.parent);e||this._markRemove(t.sourcePosition.parent,t.sourcePosition.offset,t.howMany),n||this._markInsert(t.targetPosition.parent,t.getMovedRangeStart().offset,t.howMany);break}case"rename":{if(this._isInInsertedElement(t.position.parent))return;this._markRemove(t.position.parent,t.position.offset,1),this._markInsert(t.position.parent,t.position.offset,1);const e=rl._createFromPositionAndShift(t.position,1);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getData();this.bufferMarkerChange(t.name,e,e)}break}case"split":{const e=t.splitPosition.parent;this._isInInsertedElement(e)||this._markRemove(e,t.splitPosition.offset,t.howMany),this._isInInsertedElement(t.insertionPosition.parent)||this._markInsert(t.insertionPosition.parent,t.insertionPosition.offset,1),t.graveyardPosition&&this._markRemove(t.graveyardPosition.parent,t.graveyardPosition.offset,1);break}case"merge":{const e=t.sourcePosition.parent;this._isInInsertedElement(e.parent)||this._markRemove(e.parent,e.startOffset,1);const n=t.graveyardPosition.parent;this._markInsert(n,t.graveyardPosition.offset,1);const o=t.targetPosition.parent;this._isInInsertedElement(o)||this._markInsert(o,t.targetPosition.offset,e.maxOffset);break}}this._cachedChanges=null}bufferMarkerChange(t,e,n){const o=this._changedMarkers.get(t);o?(o.newMarkerData=n,null==o.oldMarkerData.range&&null==n.range&&this._changedMarkers.delete(t)):this._changedMarkers.set(t,{newMarkerData:n,oldMarkerData:e})}getMarkersToRemove(){const t=[];for(const[e,n]of this._changedMarkers)null!=n.oldMarkerData.range&&t.push({name:e,range:n.oldMarkerData.range});return t}getMarkersToAdd(){const t=[];for(const[e,n]of this._changedMarkers)null!=n.newMarkerData.range&&t.push({name:e,range:n.newMarkerData.range});return t}getChangedMarkers(){return Array.from(this._changedMarkers).map((([t,e])=>({name:t,data:{oldRange:e.oldMarkerData.range,newRange:e.newMarkerData.range}})))}hasDataChanges(){if(this._changesInElement.size>0)return!0;for(const{newMarkerData:t,oldMarkerData:e}of this._changedMarkers.values()){if(t.affectsData!==e.affectsData)return!0;if(t.affectsData){const n=t.range&&!e.range,o=!t.range&&e.range,i=t.range&&e.range&&!t.range.isEqual(e.range);if(n||o||i)return!0}}return!1}getChanges(t={includeChangesInGraveyard:!1}){if(this._cachedChanges)return t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();let e=[];for(const t of this._changesInElement.keys()){const n=this._changesInElement.get(t).sort(((t,e)=>t.offset===e.offset?t.type!=e.type?"remove"==t.type?-1:1:0:t.offsett.position.root!=e.position.root?t.position.root.rootNamet));for(const t of e)delete t.changeCount,"attribute"==t.type&&(delete t.position,delete t.length);return this._changeCount=0,this._cachedChangesWithGraveyard=e,this._cachedChanges=e.filter(Qc),t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice()}getRefreshedItems(){return new Set(this._refreshedItems)}reset(){this._changesInElement.clear(),this._elementSnapshots.clear(),this._changedMarkers.clear(),this._refreshedItems=new Set,this._cachedChanges=null}_refreshItem(t){if(this._isInInsertedElement(t.parent))return;this._markRemove(t.parent,t.startOffset,t.offsetSize),this._markInsert(t.parent,t.startOffset,t.offsetSize),this._refreshedItems.add(t);const e=rl._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getData();this.bufferMarkerChange(t.name,e,e)}this._cachedChanges=null}_markInsert(t,e,n){const o={type:"insert",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o)}_markRemove(t,e,n){const o={type:"remove",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o),this._removeAllNestedChanges(t,e,n)}_markAttribute(t){const e={type:"attribute",offset:t.startOffset,howMany:t.offsetSize,count:this._changeCount++};this._markChange(t.parent,e)}_markChange(t,e){this._makeSnapshot(t);const n=this._getChangesForElement(t);this._handleChange(e,n),n.push(e);for(let t=0;tn.offset){if(o>i){const t={type:"attribute",offset:i,howMany:o-i,count:this._changeCount++};this._handleChange(t,e),e.push(t)}t.nodesToHandle=n.offset-t.offset,t.howMany=t.nodesToHandle}else t.offset>=n.offset&&t.offseti?(t.nodesToHandle=o-i,t.offset=i):t.nodesToHandle=0);if("remove"==n.type&&t.offsetn.offset){const i={type:"attribute",offset:n.offset,howMany:o-n.offset,count:this._changeCount++};this._handleChange(i,e),e.push(i),t.nodesToHandle=n.offset-t.offset,t.howMany=t.nodesToHandle}"attribute"==n.type&&(t.offset>=n.offset&&o<=i?(t.nodesToHandle=0,t.howMany=0,t.offset=0):t.offset<=n.offset&&o>=i&&(n.howMany=0))}}t.howMany=t.nodesToHandle,delete t.nodesToHandle}_getInsertDiff(t,e,n){return{type:"insert",position:el._createAt(t,e),name:n.name,attributes:new Map(n.attributes),length:1,changeCount:this._changeCount++}}_getRemoveDiff(t,e,n){return{type:"remove",position:el._createAt(t,e),name:n.name,attributes:new Map(n.attributes),length:1,changeCount:this._changeCount++}}_getAttributesDiff(t,e,n){const o=[];n=new Map(n);for(const[i,r]of e){const e=n.has(i)?n.get(i):null;e!==r&&o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:i,attributeOldValue:r,attributeNewValue:e,changeCount:this._changeCount++}),n.delete(i)}for(const[e,i]of n)o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:i,changeCount:this._changeCount++});return o}_isInInsertedElement(t){const e=t.parent;if(!e)return!1;const n=this._changesInElement.get(e),o=t.startOffset;if(n)for(const t of n)if("insert"==t.type&&o>=t.offset&&oo){for(let e=0;ethis._version+1&&this._gaps.set(this._version,t),this._version=t}get lastOperation(){return this._operations[this._operations.length-1]}addOperation(t){if(t.baseVersion!==this.version)throw new l("model-document-history-addoperation-incorrect-version",this,{operation:t,historyVersion:this.version});this._operations.push(t),this._version++,this._baseVersionToOperationIndex.set(t.baseVersion,this._operations.length-1)}getOperations(t,e=this.version){if(!this._operations.length)return[];const n=this._operations[0];void 0===t&&(t=n.baseVersion);let o=e-1;for(const[e,n]of this._gaps)t>e&&te&&othis.lastOperation.baseVersion)return[];let i=this._baseVersionToOperationIndex.get(t);void 0===i&&(i=0);let r=this._baseVersionToOperationIndex.get(o);return void 0===r&&(r=this._operations.length-1),this._operations.slice(i,r+1)}getOperation(t){const e=this._baseVersionToOperationIndex.get(t);if(void 0!==e)return this._operations[e]}setOperationAsUndone(t,e){this._undoPairs.set(e,t),this._undoneOperations.add(t)}isUndoingOperation(t){return this._undoPairs.has(t)}isUndoneOperation(t){return this._undoneOperations.has(t)}getUndoneOperation(t){return this._undoPairs.get(t)}reset(){this._version=0,this._undoPairs=new Map,this._operations=[],this._undoneOperations=new Set,this._gaps=new Map,this._baseVersionToOperationIndex=new Map}}function Xc(t,e){return!!(n=t.charAt(e-1))&&1==n.length&&/[\ud800-\udbff]/.test(n)&&function(t){return!!t&&1==t.length&&/[\udc00-\udfff]/.test(t)}(t.charAt(e));var n}function td(t,e){return!!(n=t.charAt(e))&&1==n.length&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(n);var n}const ed=function(){const t=/\p{Regional_Indicator}{2}/u.source,e="(?:"+[/\p{Emoji}[\u{E0020}-\u{E007E}]+\u{E007F}/u,/\p{Emoji}\u{FE0F}?\u{20E3}/u,/\p{Emoji}\u{FE0F}/u,/(?=\p{General_Category=Other_Symbol})\p{Emoji}\p{Emoji_Modifier}*/u].map((t=>t.source)).join("|")+")";return new RegExp(`${t}|${e}(?:‍${e})*`,"ug")}();function nd(t,e){const n=String(t).matchAll(ed);return Array.from(n).some((t=>t.index{const n=e[0];n.isDocumentOperation&&this.differ.bufferOperation(n)}),{priority:"high"}),this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&this.history.addOperation(n)}),{priority:"low"}),this.listenTo(this.selection,"change",(()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0})),this.listenTo(t.markers,"update",((t,e,n,o,i)=>{const r={...e.getData(),range:o};this.differ.bufferMarkerChange(e.name,i,r),null===n&&e.on("change",((t,n)=>{const o=e.getData();this.differ.bufferMarkerChange(e.name,{...o,range:n},o)}))}))}get version(){return this.history.version}set version(t){this.history.version=t}get graveyard(){return this.getRoot(od)}createRoot(t="$root",e="main"){if(this.roots.get(e))throw new l("model-document-createroot-name-exists",this,{name:e});const n=new Fc(this,t,e);return this.roots.add(n),n}destroy(){this.selection.destroy(),this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(){return Array.from(this.roots,(t=>t.rootName)).filter((t=>t!=od))}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=Do(this);return t.selection="[engine.model.DocumentSelection]",t.model="[engine.model.Model]",t}_handleChangeBlock(t){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(t),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",t.batch):this.fire("change",t.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const t of this.roots)if(t!==this.graveyard)return t;return this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot(),e=this.model,n=e.schema,o=e.createPositionFromPath(t,[0]);return n.getNearestSelectionRange(o)||e.createRange(o)}_validateSelectionRange(t){return rd(t.start)&&rd(t.end)}_callPostFixers(t){let e=!1;do{for(const n of this._postFixers)if(this.selection.refresh(),e=n(t),e)break}while(e)}}function rd(t){const e=t.textNode;if(e){const n=e.data,o=t.offset-e.startOffset;return!Xc(n,o)&&!td(n,o)}return!0}j(id,k);class sd{constructor(){this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){const e=t instanceof ad?t.name:t;return this._markers.has(e)}get(t){return this._markers.get(t)||null}_set(t,e,n=!1,o=!1){const i=t instanceof ad?t.name:t;if(i.includes(","))throw new l("markercollection-incorrect-marker-name",this);const r=this._markers.get(i);if(r){const t=r.getData(),s=r.getRange();let a=!1;return s.isEqual(e)||(r._attachLiveRange(bl.fromRange(e)),a=!0),n!=r.managedUsingOperations&&(r._managedUsingOperations=n,a=!0),"boolean"==typeof o&&o!=r.affectsData&&(r._affectsData=o,a=!0),a&&this.fire("update:"+i,r,s,e,t),r}const s=bl.fromRange(e),a=new ad(i,s,n,o);return this._markers.set(i,a),this.fire("update:"+i,a,null,e,{...a.getData(),range:null}),a}_remove(t){const e=t instanceof ad?t.name:t,n=this._markers.get(e);return!!n&&(this._markers.delete(e),this.fire("update:"+e,n,n.getRange(),null,n.getData()),this._destroyMarker(n),!0)}_refresh(t){const e=t instanceof ad?t.name:t,n=this._markers.get(e);if(!n)throw new l("markercollection-refresh-marker-not-exists",this);const o=n.getRange();this.fire("update:"+e,n,o,o,n.getData())}*getMarkersAtPosition(t){for(const e of this)e.getRange().containsPosition(t)&&(yield e)}*getMarkersIntersectingRange(t){for(const e of this)null!==e.getRange().getIntersection(t)&&(yield e)}destroy(){for(const t of this._markers.values())this._destroyMarker(t);this._markers=null,this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values())e.name.startsWith(t+":")&&(yield e)}_destroyMarker(t){t.stopListening(),t._detachLiveRange()}}j(sd,k);class ad{constructor(t,e,n,o){this.name=t,this._liveRange=this._attachLiveRange(e),this._managedUsingOperations=n,this._affectsData=o}get managedUsingOperations(){if(!this._liveRange)throw new l("marker-destroyed",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new l("marker-destroyed",this);return this._affectsData}getData(){return{range:this.getRange(),affectsData:this.affectsData,managedUsingOperations:this.managedUsingOperations}}getStart(){if(!this._liveRange)throw new l("marker-destroyed",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new l("marker-destroyed",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new l("marker-destroyed",this);return this._liveRange.toRange()}is(t){return"marker"===t||"model:marker"===t}_attachLiveRange(t){return this._liveRange&&this._detachLiveRange(),t.delegate("change:range").to(this),t.delegate("change:content").to(this),this._liveRange=t,t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}j(ad,k);class ld extends _c{get type(){return"noop"}clone(){return new ld(this.baseVersion)}getReversed(){return new ld(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}const cd={};cd[Bc.className]=Bc,cd[Pc.className]=Pc,cd[Lc.className]=Lc,cd[zc.className]=zc,cd[ld.className]=ld,cd[_c.className]=_c,cd[Oc.className]=Oc,cd[Rc.className]=Rc,cd[Vc.className]=Vc,cd[jc.className]=jc;class dd extends el{constructor(t,e,n="toNone"){if(super(t,e,n),!this.root.is("rootElement"))throw new l("model-liveposition-root-not-rootelement",t);ud.call(this)}detach(){this.stopListening()}is(t){return"livePosition"===t||"model:livePosition"===t||"position"==t||"model:position"===t}toPosition(){return new el(this.root,this.path.slice(),this.stickiness)}static fromPosition(t,e){return new this(t.root,t.path.slice(),e||t.stickiness)}}function ud(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&hd.call(this,n)}),{priority:"low"})}function hd(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path,this.root=e.root,this.fire("change",t)}}j(dd,k);class md{constructor(t,e,n){this.model=t,this.writer=e,this.position=n,this.canMergeWith=new Set([this.position.parent]),this.schema=t.schema,this._documentFragment=e.createDocumentFragment(),this._documentFragmentPosition=e.createPositionAt(this._documentFragment,0),this._firstNode=null,this._lastNode=null,this._lastAutoParagraph=null,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null}handleNodes(t){for(const e of Array.from(t))this._handleNode(e);this._insertPartialFragment(),this._lastAutoParagraph&&this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph),this._mergeOnRight(),this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer),this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(t){const e=this.writer.createPositionAfter(this._lastNode),n=this.writer.createPositionAfter(t);if(n.isAfter(e)){if(this._lastNode=t,this.position.parent!=t||!this.position.isAtEnd)throw new l("insertcontent-invalid-insertion-position",this);this.position=n,this._setAffectedBoundaries(this.position)}}getSelectionRange(){return this.nodeToSelect?rl._createOn(this.nodeToSelect):this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){return this._affectedStart?new rl(this._affectedStart,this._affectedEnd):null}destroy(){this._affectedStart&&this._affectedStart.detach(),this._affectedEnd&&this._affectedEnd.detach()}_handleNode(t){if(this.schema.isObject(t))return void this._handleObject(t);let e=this._checkAndAutoParagraphToAllowedPosition(t);e||(e=this._checkAndSplitToAllowedPosition(t),e)?(this._appendToFragment(t),this._firstNode||(this._firstNode=t),this._lastNode=t):this._handleDisallowedNode(t)}_insertPartialFragment(){if(this._documentFragment.isEmpty)return;const t=dd.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position),this._documentFragment.getChild(0)==this._firstNode&&(this.writer.insert(this._firstNode,this.position),this._mergeOnLeft(),this.position=t.toPosition()),this._documentFragment.isEmpty||this.writer.insert(this._documentFragment,this.position),this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0),this.position=t.toPosition(),t.detach()}_handleObject(t){this._checkAndSplitToAllowedPosition(t)?this._appendToFragment(t):this._tryAutoparagraphing(t)}_handleDisallowedNode(t){t.is("element")?this.handleNodes(t.getChildren()):this._tryAutoparagraphing(t)}_appendToFragment(t){if(!this.schema.checkChild(this.position,t))throw new l("insertcontent-wrong-position",this,{node:t,position:this.position});this.writer.insert(t,this._documentFragmentPosition),this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(t.offsetSize),this.schema.isObject(t)&&!this.schema.checkChild(this.position,"$text")?this.nodeToSelect=t:this.nodeToSelect=null,this._filterAttributesOf.push(t)}_setAffectedBoundaries(t){this._affectedStart||(this._affectedStart=dd.fromPosition(t,"toPrevious")),this._affectedEnd&&!this._affectedEnd.isBefore(t)||(this._affectedEnd&&this._affectedEnd.detach(),this._affectedEnd=dd.fromPosition(t,"toNext"))}_mergeOnLeft(){const t=this._firstNode;if(!(t instanceof Ja))return;if(!this._canMergeLeft(t))return;const e=dd._createBefore(t);e.stickiness="toNext";const n=dd.fromPosition(this.position,"toNext");this._affectedStart.isEqual(e)&&(this._affectedStart.detach(),this._affectedStart=dd._createAt(e.nodeBefore,"end","toPrevious")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode&&(this._affectedEnd.detach(),this._affectedEnd=dd._createAt(e.nodeBefore,"end","toNext")),this.position=n.toPosition(),n.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_mergeOnRight(){const t=this._lastNode;if(!(t instanceof Ja))return;if(!this._canMergeRight(t))return;const e=dd._createAfter(t);if(e.stickiness="toNext",!this.position.isEqual(e))throw new l("insertcontent-invalid-insertion-position",this);this.position=el._createAt(e.nodeBefore,"end");const n=dd.fromPosition(this.position,"toPrevious");this._affectedEnd.isEqual(e)&&(this._affectedEnd.detach(),this._affectedEnd=dd._createAt(e.nodeBefore,"end","toNext")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode&&(this._affectedStart.detach(),this._affectedStart=dd._createAt(e.nodeBefore,0,"toPrevious")),this.position=n.toPosition(),n.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_canMergeLeft(t){const e=t.previousSibling;return e instanceof Ja&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(e,t)}_canMergeRight(t){const e=t.nextSibling;return e instanceof Ja&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(t,e)}_tryAutoparagraphing(t){const e=this.writer.createElement("paragraph");this._getAllowedIn(this.position.parent,e)&&this.schema.checkChild(e,t)&&(e._appendChild(t),this._handleNode(e))}_checkAndAutoParagraphToAllowedPosition(t){if(this.schema.checkChild(this.position.parent,t))return!0;if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",t))return!1;this._insertPartialFragment();const e=this.writer.createElement("paragraph");return this.writer.insert(e,this.position),this._setAffectedBoundaries(this.position),this._lastAutoParagraph=e,this.position=this.writer.createPositionAt(e,0),!0}_checkAndSplitToAllowedPosition(t){const e=this._getAllowedIn(this.position.parent,t);if(!e)return!1;for(e!=this.position.parent&&this._insertPartialFragment();e!=this.position.parent;)if(this.position.isAtStart){const t=this.position.parent;this.position=this.writer.createPositionBefore(t),t.isEmpty&&t.parent===e&&this.writer.remove(t)}else if(this.position.isAtEnd)this.position=this.writer.createPositionAfter(this.position.parent);else{const t=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position),this.writer.split(this.position),this.position=t,this.canMergeWith.add(this.position.nodeAfter)}return!0}_getAllowedIn(t,e){return this.schema.checkChild(t,e)?t:this.schema.isLimit(t)?null:this._getAllowedIn(t.parent,e)}}function gd(t,e,n="auto"){const o=t.getSelectedElement();if(o&&e.schema.isObject(o)&&!e.schema.isInline(o))return["before","after"].includes(n)?e.createRange(e.createPositionAt(o,n)):e.createRangeOn(o);const i=Ba(t.getSelectedBlocks());if(!i)return e.createRange(t.focus);if(i.isEmpty)return e.createRange(e.createPositionAt(i,0));const r=e.createPositionAfter(i);return t.focus.isTouching(r)?e.createRange(r):e.createRange(e.createPositionBefore(i))}function pd(t,e,n,o,i={}){if(!t.schema.isObject(e))throw new l("insertobject-element-not-an-object",t,{object:e});let r;r=n?n.is("selection")?n:t.createSelection(n,o):t.document.selection;let s=r;i.findOptimalPosition&&t.schema.isBlock(e)&&(s=t.createSelection(gd(r,t,i.findOptimalPosition)));const a=Ba(r.getSelectedBlocks()),c={};return a&&Object.assign(c,t.schema.getAttributesWithProperty(a,"copyOnReplace",!0)),t.change((n=>{s.isCollapsed||t.deleteContent(s,{doNotAutoparagraph:!0});let o=e;const r=s.anchor.parent;!t.schema.checkChild(r,e)&&t.schema.checkChild(r,"paragraph")&&t.schema.checkChild("paragraph",e)&&(o=n.createElement("paragraph"),n.insert(e,o)),t.schema.setAllowedAttributes(o,c,n);const a=t.insertContent(o,s);return a.isCollapsed||i.setSelection&&function(t,e,n,o){const i=t.model;if("after"==n){let n=e.nextSibling;!(n&&i.schema.checkChild(n,"$text"))&&i.schema.checkChild(e.parent,"paragraph")&&(n=t.createElement("paragraph"),i.schema.setAllowedAttributes(n,o,t),i.insertContent(n,t.createPositionAfter(e))),n&&t.setSelection(n,0)}else{if("on"!=n)throw new l("insertobject-invalid-place-parameter-value",i);t.setSelection(e,"on")}}(n,e,i.setSelection,c),a}))}function fd(t,e,n={}){if(e.isCollapsed)return;const o=e.getFirstRange();if("$graveyard"==o.root.rootName)return;const i=t.schema;t.change((t=>{if(!n.doNotResetEntireContent&&function(t,e){const n=t.getLimitElement(e);if(!e.containsEntireContent(n))return!1;const o=e.getFirstRange();if(o.start.parent==o.end.parent)return!1;return t.checkChild(n,"paragraph")}(i,e))return void function(t,e){const n=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(n)),Ad(t,t.createPositionAt(n,0),e)}(t,e);const r={};if(!n.doNotAutoparagraph){const t=e.getSelectedElement();t&&Object.assign(r,i.getAttributesWithProperty(t,"copyOnReplace",!0))}const[s,a]=function(t){const e=t.root.document.model,n=t.start;let o=t.end;if(e.hasContent(t,{ignoreMarkers:!0})){const n=function(t){const e=t.parent,n=e.root.document.model.schema,o=e.getAncestors({parentFirst:!0,includeSelf:!0});for(const t of o){if(n.isLimit(t))return null;if(n.isBlock(t))return t}}(o);if(n&&o.isTouching(e.createPositionAt(n,0))){const n=e.createSelection(t);e.modifySelection(n,{direction:"backward"});const i=n.getLastPosition(),r=e.createRange(i,o);e.hasContent(r,{ignoreMarkers:!0})||(o=i)}}return[dd.fromPosition(n,"toPrevious"),dd.fromPosition(o,"toNext")]}(o);s.isTouching(a)||t.remove(t.createRange(s,a)),n.leaveUnmerged||(!function(t,e,n){const o=t.model;if(!wd(t.model.schema,e,n))return;const[i,r]=function(t,e){const n=t.getAncestors(),o=e.getAncestors();let i=0;for(;n[i]&&n[i]==o[i];)i++;return[n[i],o[i]]}(e,n);if(!i||!r)return;!o.hasContent(i,{ignoreMarkers:!0})&&o.hasContent(r,{ignoreMarkers:!0})?kd(t,e,n,i.parent):bd(t,e,n,i.parent)}(t,s,a),i.removeDisallowedAttributes(s.parent.getChildren(),t)),Cd(t,e,s),!n.doNotAutoparagraph&&function(t,e){const n=t.checkChild(e,"$text"),o=t.checkChild(e,"paragraph");return!n&&o}(i,s)&&Ad(t,s,e,r),s.detach(),a.detach()}))}function bd(t,e,n,o){const i=e.parent,r=n.parent;if(i!=o&&r!=o){for(e=t.createPositionAfter(i),(n=t.createPositionBefore(r)).isEqual(e)||t.insert(r,e),t.merge(e);n.parent.isEmpty;){const e=n.parent;n=t.createPositionBefore(e),t.remove(e)}wd(t.model.schema,e,n)&&bd(t,e,n,o)}}function kd(t,e,n,o){const i=e.parent,r=n.parent;if(i!=o&&r!=o){for(e=t.createPositionAfter(i),(n=t.createPositionBefore(r)).isEqual(e)||t.insert(i,n);e.parent.isEmpty;){const n=e.parent;e=t.createPositionBefore(n),t.remove(n)}n=t.createPositionBefore(r),function(t,e){const n=e.nodeBefore,o=e.nodeAfter;n.name!=o.name&&t.rename(n,o.name);t.clearAttributes(n),t.setAttributes(Object.fromEntries(o.getAttributes()),n),t.merge(e)}(t,n),wd(t.model.schema,e,n)&&kd(t,e,n,o)}}function wd(t,e,n){const o=e.parent,i=n.parent;return o!=i&&(!t.isLimit(o)&&!t.isLimit(i)&&function(t,e,n){const o=new rl(t,e);for(const t of o.getWalker())if(n.isLimit(t.item))return!1;return!0}(e,n,t))}function Ad(t,e,n,o={}){const i=t.createElement("paragraph");t.model.schema.setAllowedAttributes(i,o,t),t.insert(i,e),Cd(t,n,t.createPositionAt(i,0))}function Cd(t,e,n){e instanceof Cl?t.setSelection(n):e.setTo(n)}const _d=' ,.?!:;"-()';function vd(t,e){const{isForward:n,walker:o,unit:i,schema:r,treatEmojiAsSingleUnit:s}=t,{type:a,item:l,nextPosition:c}=e;if("text"==a)return"word"===t.unit?function(t,e){let n=t.position.textNode;if(n){let o=t.position.offset-n.startOffset;for(;!xd(n.data,o,e)&&!Ed(n,o,e);){t.next();const i=e?t.position.nodeAfter:t.position.nodeBefore;if(i&&i.is("$text")){const o=i.data.charAt(e?0:i.data.length-1);_d.includes(o)||(t.next(),n=t.position.textNode)}o=t.position.offset-n.startOffset}}return t.position}(o,n):function(t,e,n){const o=t.position.textNode;if(o){const i=o.data;let r=t.position.offset-o.startOffset;for(;Xc(i,r)||"character"==e&&td(i,r)||n&&nd(i,r);)t.next(),r=t.position.offset-o.startOffset}return t.position}(o,i,s);if(a==(n?"elementStart":"elementEnd")){if(r.isSelectable(l))return el._createAt(l,n?"after":"before");if(r.checkChild(c,"$text"))return c}else{if(r.isLimit(l))return void o.skip((()=>!0));if(r.checkChild(c,"$text"))return c}}function yd(t,e){const n=t.root,o=el._createAt(n,e?"end":0);return e?new rl(t,o):new rl(o,t)}function xd(t,e,n){const o=e+(n?0:-1);return _d.includes(t.charAt(o))}function Ed(t,e,n){return e===(n?t.endOffset:0)}function Dd(t,e){const n=[];Array.from(t.getItems({direction:"backward"})).map((t=>e.createRangeOn(t))).filter((e=>(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end)))).forEach((t=>{n.push(t.start.parent),e.remove(t)})),n.forEach((t=>{let n=t;for(;n.parent&&n.isEmpty;){const t=e.createRangeOn(n);n=n.parent,e.remove(t)}}))}function Sd(t){t.document.registerPostFixer((e=>function(t,e){const n=e.document.selection,o=e.schema,i=[];let r=!1;for(const t of n.getRanges()){const e=Id(t,o);e&&!e.isEqual(t)?(i.push(e),r=!0):i.push(t)}r&&t.setSelection(function(t){const e=[...t],n=new Set;let o=1;for(;o!n.has(e)))}(i),{backward:n.isBackward})}(e,t)))}function Id(t,e){return t.isCollapsed?function(t,e){const n=t.start,o=e.getNearestSelectionRange(n);if(!o){const t=n.getAncestors().reverse().find((t=>e.isObject(t)));return t?rl._createOn(t):null}if(!o.isCollapsed)return o;const i=o.start;if(n.isEqual(i))return null;return new rl(i)}(t,e):function(t,e){const{start:n,end:o}=t,i=e.checkChild(n,"$text"),r=e.checkChild(o,"$text"),s=e.getLimitElement(n),a=e.getLimitElement(o);if(s===a){if(i&&r)return null;if(function(t,e,n){const o=t.nodeAfter&&!n.isLimit(t.nodeAfter)||n.checkChild(t,"$text"),i=e.nodeBefore&&!n.isLimit(e.nodeBefore)||n.checkChild(e,"$text");return o||i}(n,o,e)){const t=n.nodeAfter&&e.isSelectable(n.nodeAfter)?null:e.getNearestSelectionRange(n,"forward"),i=o.nodeBefore&&e.isSelectable(o.nodeBefore)?null:e.getNearestSelectionRange(o,"backward"),r=t?t.start:n,s=i?i.end:o;return new rl(r,s)}}const l=s&&!s.is("rootElement"),c=a&&!a.is("rootElement");if(l||c){const t=n.nodeAfter&&o.nodeBefore&&n.nodeAfter.parent===o.nodeBefore.parent,i=l&&(!t||!Md(n.nodeAfter,e)),r=c&&(!t||!Md(o.nodeBefore,e));let d=n,u=o;return i&&(d=el._createBefore(Td(s,e))),r&&(u=el._createAfter(Td(a,e))),new rl(d,u)}return null}(t,e)}function Td(t,e){let n=t,o=n;for(;e.isLimit(o)&&o.parent;)n=o,o=o.parent;return n}function Md(t,e){return t&&e.isSelectable(t)}class Bd{constructor(){this.markers=new sd,this.document=new id(this),this.schema=new Xl,this._pendingChanges=[],this._currentWriter=null,["insertContent","insertObject","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach((t=>this.decorate(t))),this.on("applyOperation",((t,e)=>{e[0]._validate()}),{priority:"highest"}),this.schema.register("$root",{isLimit:!0}),this.schema.register("$container",{allowIn:["$root","$container"]}),this.schema.register("$block",{allowIn:["$root","$container"],isBlock:!0}),this.schema.register("$blockObject",{allowWhere:"$block",isBlock:!0,isObject:!0}),this.schema.register("$inlineObject",{allowWhere:"$text",allowAttributesOf:"$text",isInline:!0,isObject:!0}),this.schema.register("$text",{allowIn:"$block",isInline:!0,isContent:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$documentFragment",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$marker"),this.schema.addChildCheck(((t,e)=>{if("$marker"===e.name)return!0})),Sd(this),this.document.registerPostFixer(jl)}change(t){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new Cc,callback:t}),this._runPendingChanges()[0]):t(this._currentWriter)}catch(t){l.rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{t?"function"==typeof t?(e=t,t=new Cc):t instanceof Cc||(t=new Cc(t)):t=new Cc,this._pendingChanges.push({batch:t,callback:e}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(t){l.rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,n){return function(t,e,n,o){return t.change((i=>{let r;r=n?n instanceof hl||n instanceof Cl?n:i.createSelection(n,o):t.document.selection,r.isCollapsed||t.deleteContent(r,{doNotAutoparagraph:!0});const s=new md(t,i,r.anchor);let a;a=e.is("documentFragment")?e.getChildren():[e],s.handleNodes(a);const l=s.getSelectionRange();l&&(r instanceof Cl?i.setSelection(l):r.setTo(l));const c=s.getAffectedRange()||t.createRange(r.anchor);return s.destroy(),c}))}(this,t,e,n)}insertObject(t,e,n,o){return pd(this,t,e,n,o)}deleteContent(t,e){fd(this,t,e)}modifySelection(t,e){!function(t,e,n={}){const o=t.schema,i="backward"!=n.direction,r=n.unit?n.unit:"character",s=!!n.treatEmojiAsSingleUnit,a=e.focus,l=new Xa({boundaries:yd(a,i),singleCharacters:!0,direction:i?"forward":"backward"}),c={walker:l,schema:o,isForward:i,unit:r,treatEmojiAsSingleUnit:s};let d;for(;d=l.next();){if(d.done)return;const n=vd(c,d.value);if(n)return void(e instanceof Cl?t.change((t=>{t.setSelectionFocus(n)})):e.setFocus(n))}}(this,t,e)}getSelectedContent(t){return function(t,e){return t.change((t=>{const n=t.createDocumentFragment(),o=e.getFirstRange();if(!o||o.isCollapsed)return n;const i=o.start.root,r=o.start.getCommonPath(o.end),s=i.getNodeByPath(r);let a;a=o.start.parent==o.end.parent?o:t.createRange(t.createPositionAt(s,o.start.path[r.length]),t.createPositionAt(s,o.end.path[r.length]+1));const l=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:!0}))e.is("$textProxy")?t.appendText(e.data,e.getAttributes(),n):t.append(t.cloneElement(e,!0),n);if(a!=o){const e=o._getTransformedByMove(a.start,t.createPositionAt(n,0),l)[0],i=t.createRange(t.createPositionAt(n,0),e.start);Dd(t.createRange(e.end,t.createPositionAt(n,"end")),t),Dd(i,t)}return n}))}(this,t)}hasContent(t,e={}){const n=t instanceof Ja?rl._createIn(t):t;if(n.isCollapsed)return!1;const{ignoreWhitespaces:o=!1,ignoreMarkers:i=!1}=e;if(!i)for(const t of this.markers.getMarkersIntersectingRange(n))if(t.affectsData)return!0;for(const t of n.getItems())if(this.schema.isContent(t)){if(!t.is("$textProxy"))return!0;if(!o)return!0;if(-1!==t.data.search(/\S/))return!0}return!1}createPositionFromPath(t,e,n){return new el(t,e,n)}createPositionAt(t,e){return el._createAt(t,e)}createPositionAfter(t){return el._createAfter(t)}createPositionBefore(t){return el._createBefore(t)}createRange(t,e){return new rl(t,e)}createRangeIn(t){return rl._createIn(t)}createRangeOn(t){return rl._createOn(t)}createSelection(t,e,n){return new hl(t,e,n)}createBatch(t){return new Cc(t)}createOperationFromJSON(t){return class{static fromJSON(t,e){return cd[t.__className].fromJSON(t,e)}}.fromJSON(t,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const t=[];for(this.fire("_beforeChanges");this._pendingChanges.length;){const e=this._pendingChanges[0].batch;this._currentWriter=new Hc(this,e);const n=this._pendingChanges[0].callback(this._currentWriter);t.push(n),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}return this.fire("_afterChanges"),t}}j(Bd,N);class Nd extends Pa{constructor(t){super(),this.editor=t}set(t,e,n={}){if("string"==typeof e){const t=e;e=(e,n)=>{this.editor.execute(t),n()}}super.set(t,e,n)}}class zd{constructor(t={}){const e=t.language||this.constructor.defaultConfig&&this.constructor.defaultConfig.language;this._context=t.context||new yo({language:e}),this._context._addEditor(this,!t.context);const n=Array.from(this.constructor.builtinPlugins||[]);this.config=new ho(t,this.constructor.defaultConfig),this.config.define("plugins",n),this.config.define(this._context._getEditorConfig()),this.plugins=new ko(this,n,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this._readOnlyLocks=new Set,this.commands=new $l,this.set("state","initializing"),this.once("ready",(()=>this.state="ready"),{priority:"high"}),this.once("destroy",(()=>this.state="destroyed"),{priority:"high"}),this.model=new Bd;const o=new Si;this.data=new bc(this.model,o),this.editing=new Kl(this.model,o),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new kc([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher),this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher),this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher),this.keystrokes=new Nd(this),this.keystrokes.listenTo(this.editing.view.document)}get isReadOnly(){return this._readOnlyLocks.size>0}set isReadOnly(t){throw new l("editor-isreadonly-has-no-setter")}enableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new l("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)||(this._readOnlyLocks.add(t),1===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!0,!1))}disableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new l("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)&&(this._readOnlyLocks.delete(t),0===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!1,!0))}initPlugins(){const t=this.config,e=t.get("plugins"),n=t.get("removePlugins")||[],o=t.get("extraPlugins")||[],i=t.get("substitutePlugins")||[];return this.plugins.init(e.concat(o),n,i)}destroy(){let t=Promise.resolve();return"initializing"==this.state&&(t=new Promise((t=>this.once("ready",t)))),t.then((()=>{this.fire("destroy"),this.stopListening(),this.commands.destroy()})).then((()=>this.plugins.destroy())).then((()=>{this.model.destroy(),this.data.destroy(),this.editing.destroy(),this.keystrokes.destroy()})).then((()=>this._context._removeEditor(this)))}execute(...t){try{return this.commands.execute(...t)}catch(t){l.rethrowUnexpectedError(t,this)}}focus(){this.editing.view.focus()}}j(zd,N);class Pd{constructor(t){this.editor=t,this._components=new Map}*names(){for(const t of this._components.values())yield t.originalName}add(t,e){this._components.set(Ld(t),{callback:e,originalName:t})}create(t){if(!this.has(t))throw new l("componentfactory-item-missing",this,{name:t});return this._components.get(Ld(t)).callback(this.editor.locale)}has(t){return this._components.has(Ld(t))}}function Ld(t){return String(t).toLowerCase()}class Od{constructor(t){this.editor=t,this.componentFactory=new Pd(t),this.focusTracker=new za,this.set("viewportOffset",this._readViewportOffsetFromConfig()),this._editableElementsMap=new Map,this.listenTo(t.editing.view.document,"layoutChanged",(()=>this.update()))}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy();for(const t of this._editableElementsMap.values())t.ckeditorInstance=null;this._editableElementsMap=new Map}setEditableElement(t,e){this._editableElementsMap.set(t,e),e.ckeditorInstance||(e.ckeditorInstance=this.editor)}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}_readViewportOffsetFromConfig(){const t=this.editor,e=t.config.get("ui.viewportOffset");if(e)return e;const n=t.config.get("toolbar.viewportTopOffset");return n?(console.warn("editor-ui-deprecated-viewport-offset-config: The `toolbar.vieportTopOffset` configuration option is deprecated. It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead."),{top:n}):{top:0}}}j(Od,N);const Rd={setData(t){this.data.set(t)},getData(t){return this.data.get(t)}},jd=Rd;function Vd(t,e){t instanceof HTMLTextAreaElement&&(t.value=e),t.innerHTML=e}const Fd={updateSourceElement(t=this.data.get()){if(!this.sourceElement)throw new l("editor-missing-sourceelement",this);const e=this.config.get("updateSourceElementOnDestroy"),n=this.sourceElement instanceof HTMLTextAreaElement;Vd(this.sourceElement,e||n?t:"")}};class Hd extends xo{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new bo({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(t){if("string"!=typeof t)throw new l("pendingactions-add-invalid-message",this);const e=Object.create(N);return e.set("message",t),this._actions.add(e),this.hasAny=!0,e}remove(t){this._actions.remove(t),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}const Ud='',qd='',Gd={cancel:'',caption:'',check:'',cog:'',eraser:'',lowVision:'',image:Ud,alignBottom:'',alignMiddle:'',alignTop:'',alignLeft:'',alignCenter:'',alignRight:'',alignJustify:'',objectLeft:'',objectCenter:'',objectRight:'',objectFullWidth:'',objectInline:'',objectBlockLeft:'',objectBlockRight:'',objectSizeFull:'',objectSizeLarge:'',objectSizeSmall:'',objectSizeMedium:'',pencil:'',pilcrow:'',quote:'',threeVerticalDots:qd};function Wd({emitter:t,activator:e,callback:n,contextElements:o}){t.listenTo(document,"mousedown",((t,i)=>{if(!e())return;const r="function"==typeof i.composedPath?i.composedPath():[];for(const t of o)if(t.contains(i.target)||r.includes(t))return;n()}))}function Zd(t){t.set("_isCssTransitionsDisabled",!1),t.disableCssTransitions=()=>{t._isCssTransitionsDisabled=!0},t.enableCssTransitions=()=>{t._isCssTransitionsDisabled=!1},t.extendTemplate({attributes:{class:[t.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}function Yd({view:t}){t.listenTo(t.element,"submit",((e,n)=>{n.preventDefault(),t.fire("submit")}),{useCapture:!0})}class Kd extends bo{constructor(t=[]){super(t,{idProperty:"viewUid"}),this.on("add",((t,e,n)=>{this._renderViewIntoCollectionParent(e,n)})),this.on("remove",((t,e)=>{e.element&&this._parentElement&&e.element.remove()})),this._parentElement=null}destroy(){this.map((t=>t.destroy()))}setParent(t){this._parentElement=t;for(const t of this)this._renderViewIntoCollectionParent(t)}delegate(...t){if(!t.length||!t.every((t=>"string"==typeof t)))throw new l("ui-viewcollection-delegate-wrong-events",this);return{to:e=>{for(const n of this)for(const o of t)n.delegate(o).to(e);this.on("add",((n,o)=>{for(const n of t)o.delegate(n).to(e)})),this.on("remove",((n,o)=>{for(const n of t)o.stopDelegating(n,e)}))}}}_renderViewIntoCollectionParent(t,e){t.isRendered||t.render(),t.element&&this._parentElement&&this._parentElement.insertBefore(t.element,this._parentElement.children[e])}}var $d=n(6150),Qd={attributes:{"data-cke":!0}};Qd.setAttributes=is(),Qd.insert=ns().bind(null,"head"),Qd.domAPI=ts(),Qd.insertStyleElement=ss();Jr()($d.Z,Qd);$d.Z&&$d.Z.locals&&$d.Z.locals;class Jd{constructor(t){this.element=null,this.isRendered=!1,this.locale=t,this.t=t&&t.t,this._viewCollections=new bo,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",((e,n)=>{n.locale=t})),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=Xd.bind(this,this)}createCollection(t){const e=new Kd(t);return this._viewCollections.add(e),e}registerChild(t){po(t)||(t=[t]);for(const e of t)this._unboundChildren.add(e)}deregisterChild(t){po(t)||(t=[t]);for(const e of t)this._unboundChildren.remove(e)}setTemplate(t){this.template=new Xd(t)}extendTemplate(t){Xd.extend(this.template,t)}render(){if(this.isRendered)throw new l("ui-view-render-already-rendered",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map((t=>t.destroy())),this.template&&this.template._revertData&&this.template.revert(this.element)}}j(Jd,Ss),j(Jd,N);class Xd{constructor(t){Object.assign(this,cu(lu(t))),this._isRendered=!1,this._revertData=null}render(){const t=this._renderNode({intoFragment:!0});return this._isRendered=!0,t}apply(t){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:t,isApplying:!0,revertData:this._revertData}),t}revert(t){if(!this._revertData)throw new l("ui-template-revert-not-applied",[this,t]);this._revertTemplateFromNode(t,this._revertData)}*getViews(){yield*function*t(e){if(e.children)for(const n of e.children)pu(n)?yield n:fu(n)&&(yield*t(n))}(this)}static bind(t,e){return{to:(n,o)=>new eu({eventNameOrFunction:n,attribute:n,observable:t,emitter:e,callback:o}),if:(n,o,i)=>new nu({observable:t,emitter:e,attribute:n,valueIfTrue:o,callback:i})}}static extend(t,e){if(t._isRendered)throw new l("template-extend-render",[this,t]);mu(t,cu(lu(e)))}_renderNode(t){let e;if(e=t.node?this.tag&&this.text:this.tag?this.text:!this.text,e)throw new l("ui-template-wrong-syntax",this);return this.text?this._renderText(t):this._renderElement(t)}_renderElement(t){let e=t.node;return e||(e=t.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(t),this._renderElementChildren(t),this._setUpListeners(t),e}_renderText(t){let e=t.node;return e?t.revertData.text=e.textContent:e=t.node=document.createTextNode(""),ou(this.text)?this._bindToObservable({schema:this.text,updater:ru(e),data:t}):e.textContent=this.text.join(""),e}_renderAttributes(t){let e,n,o,i;if(!this.attributes)return;const r=t.node,s=t.revertData;for(e in this.attributes)if(o=r.getAttribute(e),n=this.attributes[e],s&&(s.attributes[e]=o),i=E(n[0])&&n[0].ns?n[0].ns:null,ou(n)){const a=i?n[0].value:n;s&&ku(e)&&a.unshift(o),this._bindToObservable({schema:a,updater:su(r,e,i),data:t})}else"style"==e&&"string"!=typeof n[0]?this._renderStyleAttribute(n[0],t):(s&&o&&ku(e)&&n.unshift(o),n=n.map((t=>t&&t.value||t)).reduce(((t,e)=>t.concat(e)),[]).reduce(uu,""),gu(n)||r.setAttributeNS(i,e,n))}_renderStyleAttribute(t,e){const n=e.node;for(const o in t){const i=t[o];ou(i)?this._bindToObservable({schema:[i],updater:au(n,o),data:e}):n.style[o]=i}}_renderElementChildren(t){const e=t.node,n=t.intoFragment?document.createDocumentFragment():e,o=t.isApplying;let i=0;for(const r of this.children)if(bu(r)){if(!o){r.setParent(e);for(const t of r)n.appendChild(t.element)}}else if(pu(r))o||(r.isRendered||r.render(),n.appendChild(r.element));else if($r(r))n.appendChild(r);else if(o){const e={children:[],bindings:[],attributes:{}};t.revertData.children.push(e),r._renderNode({node:n.childNodes[i++],isApplying:!0,revertData:e})}else n.appendChild(r.render());t.intoFragment&&e.appendChild(n)}_setUpListeners(t){if(this.eventListeners)for(const e in this.eventListeners){const n=this.eventListeners[e].map((n=>{const[o,i]=e.split("@");return n.activateDomEventListener(o,i,t)}));t.revertData&&t.revertData.bindings.push(n)}}_bindToObservable({schema:t,updater:e,data:n}){const o=n.revertData;iu(t,e,n);const i=t.filter((t=>!gu(t))).filter((t=>t.observable)).map((o=>o.activateAttributeListener(t,e,n)));o&&o.bindings.push(i)}_revertTemplateFromNode(t,e){for(const t of e.bindings)for(const e of t)e();if(e.text)t.textContent=e.text;else{for(const n in e.attributes){const o=e.attributes[n];null===o?t.removeAttribute(n):t.setAttribute(n,o)}for(let n=0;niu(t,e,n);return this.emitter.listenTo(this.observable,"change:"+this.attribute,o),()=>{this.emitter.stopListening(this.observable,"change:"+this.attribute,o)}}}class eu extends tu{activateDomEventListener(t,e,n){const o=(t,n)=>{e&&!n.target.matches(e)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(n):this.observable.fire(this.eventNameOrFunction,n))};return this.emitter.listenTo(n.node,t,o),()=>{this.emitter.stopListening(n.node,t,o)}}}class nu extends tu{getValue(t){return!gu(super.getValue(t))&&(this.valueIfTrue||!0)}}function ou(t){return!!t&&(t.value&&(t=t.value),Array.isArray(t)?t.some(ou):t instanceof tu)}function iu(t,e,{node:n}){let o=function(t,e){return t.map((t=>t instanceof tu?t.getValue(e):t))}(t,n);o=1==t.length&&t[0]instanceof nu?o[0]:o.reduce(uu,""),gu(o)?e.remove():e.set(o)}function ru(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function su(t,e,n){return{set(o){t.setAttributeNS(n,e,o)},remove(){t.removeAttributeNS(n,e)}}}function au(t,e){return{set(n){t.style[e]=n},remove(){t.style[e]=null}}}function lu(t){return co(t,(t=>{if(t&&(t instanceof tu||fu(t)||pu(t)||bu(t)))return t}))}function cu(t){if("string"==typeof t?t=function(t){return{text:[t]}}(t):t.text&&function(t){t.text=wo(t.text)}(t),t.on&&(t.eventListeners=function(t){for(const e in t)du(t,e);return t}(t.on),delete t.on),!t.text){t.attributes&&function(t){for(const e in t)t[e].value&&(t[e].value=wo(t[e].value)),du(t,e)}(t.attributes);const e=[];if(t.children)if(bu(t.children))e.push(t.children);else for(const n of t.children)fu(n)||pu(n)||$r(n)?e.push(n):e.push(new Xd(n));t.children=e}return t}function du(t,e){t[e]=wo(t[e])}function uu(t,e){return gu(e)?t:gu(t)?e:`${t} ${e}`}function hu(t,e){for(const n in e)t[n]?t[n].push(...e[n]):t[n]=e[n]}function mu(t,e){if(e.attributes&&(t.attributes||(t.attributes={}),hu(t.attributes,e.attributes)),e.eventListeners&&(t.eventListeners||(t.eventListeners={}),hu(t.eventListeners,e.eventListeners)),e.text&&t.text.push(...e.text),e.children&&e.children.length){if(t.children.length!=e.children.length)throw new l("ui-template-extend-children-mismatch",t);let n=0;for(const o of e.children)mu(t.children[n++],o)}}function gu(t){return!t&&0!==t}function pu(t){return t instanceof Jd}function fu(t){return t instanceof Xd}function bu(t){return t instanceof Kd}function ku(t){return"class"==t||"style"==t}class wu extends Kd{constructor(t,e=[]){super(e),this.locale=t}attachToDom(){this._bodyCollectionContainer=new Xd({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");t||(t=va(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(t)),t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const t=document.querySelector(".ck-body-wrapper");t&&0==t.childElementCount&&t.remove()}}var Au=n(1174),Cu={attributes:{"data-cke":!0}};Cu.setAttributes=is(),Cu.insert=ns().bind(null,"head"),Cu.domAPI=ts(),Cu.insertStyleElement=ss();Jr()(Au.Z,Cu);Au.Z&&Au.Z.locals&&Au.Z.locals;class _u extends Jd{constructor(){super();const t=this.bindTemplate;this.set("content",""),this.set("viewBox","0 0 20 20"),this.set("fillColor",""),this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon"],viewBox:t.to("viewBox")}})}render(){super.render(),this._updateXMLContent(),this._colorFillPaths(),this.on("change:content",(()=>{this._updateXMLContent(),this._colorFillPaths()})),this.on("change:fillColor",(()=>{this._colorFillPaths()}))}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),e=t.getAttribute("viewBox");for(e&&(this.viewBox=e),this.element.innerHTML="";t.childNodes.length>0;)this.element.appendChild(t.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach((t=>{t.style.fill=this.fillColor}))}}var vu=n(9948),yu={attributes:{"data-cke":!0}};yu.setAttributes=is(),yu.insert=ns().bind(null,"head"),yu.domAPI=ts(),yu.insertStyleElement=ss();Jr()(vu.Z,yu);vu.Z&&vu.Z.locals&&vu.Z.locals;class xu extends Jd{constructor(t){super(t),this.set("text",""),this.set("position","s");const e=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip",e.to("position",(t=>"ck-tooltip_"+t)),e.if("text","ck-hidden",(t=>!t.trim()))]},children:[{tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:e.to("text")}]}]})}}var Eu=n(4499),Du={attributes:{"data-cke":!0}};Du.setAttributes=is(),Du.insert=ns().bind(null,"head"),Du.domAPI=ts(),Du.insertStyleElement=ss();Jr()(Eu.Z,Du);Eu.Z&&Eu.Z.locals&&Eu.Z.locals;class Su extends Jd{constructor(t){super(t);const e=this.bindTemplate,n=r();this.set("class"),this.set("labelStyle"),this.set("icon"),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isVisible",!0),this.set("isToggleable",!1),this.set("keystroke"),this.set("label"),this.set("tabindex",-1),this.set("tooltip"),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.set("withKeystroke",!1),this.children=this.createCollection(),this.tooltipView=this._createTooltipView(),this.labelView=this._createLabelView(n),this.iconView=new _u,this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}}),this.keystrokeView=this._createKeystrokeView(),this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this));const o={tag:"button",attributes:{class:["ck","ck-button",e.to("class"),e.if("isEnabled","ck-disabled",(t=>!t)),e.if("isVisible","ck-hidden",(t=>!t)),e.to("isOn",(t=>t?"ck-on":"ck-off")),e.if("withText","ck-button_with-text"),e.if("withKeystroke","ck-button_with-keystroke")],type:e.to("type",(t=>t||"button")),tabindex:e.to("tabindex"),"aria-labelledby":`ck-editor__aria-label_${n}`,"aria-disabled":e.if("isEnabled",!0,(t=>!t)),"aria-pressed":e.to("isOn",(t=>!!this.isToggleable&&String(!!t)))},children:this.children,on:{click:e.to((t=>{this.isEnabled?this.fire("execute"):t.preventDefault()}))}};ar.isSafari&&(o.on.mousedown=e.to((t=>{this.focus(),t.preventDefault()}))),this.setTemplate(o)}render(){super.render(),this.icon&&(this.iconView.bind("content").to(this,"icon"),this.children.add(this.iconView)),this.children.add(this.tooltipView),this.children.add(this.labelView),this.withKeystroke&&this.keystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}_createTooltipView(){const t=new xu;return t.bind("text").to(this,"_tooltipString"),t.bind("position").to(this,"tooltipPosition"),t}_createLabelView(t){const e=new Jd,n=this.bindTemplate;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:n.to("labelStyle"),id:`ck-editor__aria-label_${t}`},children:[{text:this.bindTemplate.to("label")}]}),e}_createKeystrokeView(){const t=new Jd;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",(t=>pr(t)))}]}),t}_getTooltipString(t,e,n){return t?"string"==typeof t?t:(n&&(n=pr(n)),t instanceof Function?t(e,n):`${e}${n?` (${n})`:""}`):""}}var Iu=n(9681),Tu={attributes:{"data-cke":!0}};Tu.setAttributes=is(),Tu.insert=ns().bind(null,"head"),Tu.domAPI=ts(),Tu.insertStyleElement=ss();Jr()(Iu.Z,Tu);Iu.Z&&Iu.Z.locals&&Iu.Z.locals;class Mu extends Su{constructor(t){super(t),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new Jd;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),t}}function Bu(t,e){const n=t.t,o={Black:n("Black"),"Dim grey":n("Dim grey"),Grey:n("Grey"),"Light grey":n("Light grey"),White:n("White"),Red:n("Red"),Orange:n("Orange"),Yellow:n("Yellow"),"Light green":n("Light green"),Green:n("Green"),Aquamarine:n("Aquamarine"),Turquoise:n("Turquoise"),"Light blue":n("Light blue"),Blue:n("Blue"),Purple:n("Purple")};return e.map((t=>{const e=o[t.label];return e&&e!=t.label&&(t.label=e),t}))}function Nu(t){return t.map(zu).filter((t=>!!t))}function zu(t){return"string"==typeof t?{model:t,label:t,hasBorder:!1,view:{name:"span",styles:{color:t}}}:{model:t.color,label:t.label||t.color,hasBorder:void 0!==t.hasBorder&&t.hasBorder,view:{name:"span",styles:{color:`${t.color}`}}}}class Pu extends Su{constructor(t){super(t);const e=this.bindTemplate;this.set("color"),this.set("hasBorder"),this.icon='',this.extendTemplate({attributes:{style:{backgroundColor:e.to("color")},class:["ck","ck-color-grid__tile",e.if("hasBorder","ck-color-table__color-tile_bordered")]}})}render(){super.render(),this.iconView.fillColor="hsl(0, 0%, 100%)"}}function Lu(t){return!!(t&&t.getClientRects&&t.getClientRects().length)}class Ou{constructor(t){if(Object.assign(this,t),t.actions&&t.keystrokeHandler)for(const e in t.actions){let n=t.actions[e];"string"==typeof n&&(n=[n]);for(const o of n)t.keystrokeHandler.set(o,((t,n)=>{this[e](),n()}))}}get first(){return this.focusables.find(Ru)||null}get last(){return this.focusables.filter(Ru).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let t=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find(((e,n)=>{const o=e.element===this.focusTracker.focusedElement;return o&&(t=n),o})),t)}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(t){t&&t.focus()}_getFocusableItem(t){const e=this.current,n=this.focusables.length;if(!n)return null;if(null===e)return this[1===t?"first":"last"];let o=(e+n+t)%n;do{const e=this.focusables.get(o);if(Ru(e))return e;o=(o+n+t)%n}while(o!==e);return null}}function Ru(t){return!(!t.focus||!Lu(t.element))}var ju=n(4923),Vu={attributes:{"data-cke":!0}};Vu.setAttributes=is(),Vu.insert=ns().bind(null,"head"),Vu.domAPI=ts(),Vu.insertStyleElement=ss();Jr()(ju.Z,Vu);ju.Z&&ju.Z.locals&&ju.Z.locals;class Fu extends Jd{constructor(t,e){super(t);const n=e&&e.colorDefinitions||[],o={};e&&e.columns&&(o.gridTemplateColumns=`repeat( ${e.columns}, 1fr)`),this.set("selectedColor"),this.items=this.createCollection(),this.focusTracker=new za,this.keystrokes=new Pa,this._focusCycler=new Ou({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowleft",focusNext:"arrowright"}}),this.items.on("add",((t,e)=>{e.isOn=e.color===this.selectedColor})),n.forEach((t=>{const e=new Pu;e.set({color:t.color,label:t.label,tooltip:!0,hasBorder:t.options.hasBorder}),e.on("execute",(()=>{this.fire("execute",{value:t.color,hasBorder:t.options.hasBorder,label:t.label})})),this.items.add(e)})),this.setTemplate({tag:"div",children:this.items,attributes:{class:["ck","ck-color-grid"],style:o}}),this.on("change:selectedColor",((t,e,n)=>{for(const t of this.items)t.isOn=t.color===n}))}focus(){this.items.length&&this.items.first.focus()}focusLast(){this.items.length&&this.items.last.focus()}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}}const Hu='';class Uu extends Su{constructor(t){super(t),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{"aria-haspopup":!0}}),this.delegate("execute").to(this,"open")}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const t=new _u;return t.content=Hu,t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),t}}var qu=n(66),Gu={attributes:{"data-cke":!0}};Gu.setAttributes=is(),Gu.insert=ns().bind(null,"head"),Gu.domAPI=ts(),Gu.insertStyleElement=ss();Jr()(qu.Z,Gu);qu.Z&&qu.Z.locals&&qu.Z.locals;class Wu extends Jd{constructor(t){super(t);const e=this.bindTemplate;this.set("class"),this.set("icon"),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isToggleable",!1),this.set("isVisible",!0),this.set("keystroke"),this.set("label"),this.set("tabindex",-1),this.set("tooltip"),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.children=this.createCollection(),this.actionView=this._createActionView(),this.arrowView=this._createArrowView(),this.keystrokes=new Pa,this.focusTracker=new za,this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",e.to("class"),e.if("isVisible","ck-hidden",(t=>!t)),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render(),this.children.add(this.actionView),this.children.add(this.arrowView),this.focusTracker.add(this.actionView.element),this.focusTracker.add(this.arrowView.element),this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",((t,e)=>{this.focusTracker.focusedElement===this.actionView.element&&(this.arrowView.focus(),e())})),this.keystrokes.set("arrowleft",((t,e)=>{this.focusTracker.focusedElement===this.arrowView.element&&(this.actionView.focus(),e())}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this.actionView.focus()}_createActionView(){const t=new Su;return t.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this),t.extendTemplate({attributes:{class:"ck-splitbutton__action"}}),t.delegate("execute").to(this),t}_createArrowView(){const t=new Su,e=t.bindTemplate;return t.icon=Hu,t.extendTemplate({attributes:{class:"ck-splitbutton__arrow","aria-haspopup":!0,"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("isEnabled").to(this),t.bind("label").to(this),t.bind("tooltip").to(this),t.delegate("execute").to(this,"open"),t}}class Zu extends Jd{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",(t=>`ck-dropdown__panel_${t}`)),e.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:e.to((t=>t.preventDefault()))}})}focus(){this.children.length&&("function"==typeof this.children.first.focus?this.children.first.focus():c("ui-dropdown-panel-focus-child-missing-focus",{childView:this.children.first,dropdownPanel:this}))}focusLast(){if(this.children.length){const t=this.children.last;"function"==typeof t.focusLast?t.focusLast():t.focus()}}}var Yu=n(3488),Ku={attributes:{"data-cke":!0}};Ku.setAttributes=is(),Ku.insert=ns().bind(null,"head"),Ku.domAPI=ts(),Ku.insertStyleElement=ss();Jr()(Yu.Z,Ku);Yu.Z&&Yu.Z.locals&&Yu.Z.locals;function $u({element:t,target:e,positions:n,limiter:o,fitInViewport:i,viewportOffsetConfig:r}){Dt(e)&&(e=e()),Dt(o)&&(o=o());const s=function(t){return t&&t.parentNode?t.offsetParent===ms.document.body?null:t.offsetParent:null}(t),a=new Da(t),l=new Da(e);let c;const d=i&&function(t){t=Object.assign({top:0,bottom:0,left:0,right:0},t);const e=new Da(ms.window);return e.top+=t.top,e.height-=t.top,e.bottom-=t.bottom,e.height-=t.bottom,e}(r)||null,u={targetRect:l,elementRect:a,positionedElementAncestor:s,viewportRect:d};if(o||i){const t=o&&new Da(o).getVisible();Object.assign(u,{limiterRect:t,viewportRect:d}),c=function(t,e){const{elementRect:n}=e,o=n.getArea(),i=t.map((t=>new Ju(t,e))).filter((t=>!!t.name));let r=0,s=null;for(const t of i){const{limiterIntersectionArea:e,viewportIntersectionArea:n}=t;if(e===o)return t;const i=n**2+e**2;i>r&&(r=i,s=t)}return s}(n,u)||new Ju(n[0],u)}else c=new Ju(n[0],u);return c}function Qu(t){const{scrollX:e,scrollY:n}=ms.window;return t.clone().moveBy(e,n)}class Ju{constructor(t,e){const n=t(e.targetRect,e.elementRect,e.viewportRect);if(!n)return;const{left:o,top:i,name:r,config:s}=n;this.name=r,this.config=s,this._positioningFunctionCorrdinates={left:o,top:i},this._options=e}get left(){return this._absoluteRect.left}get top(){return this._absoluteRect.top}get limiterIntersectionArea(){const t=this._options.limiterRect;if(t){const e=this._options.viewportRect;if(!e)return t.getIntersectionArea(this._rect);{const n=t.getIntersection(e);if(n)return n.getIntersectionArea(this._rect)}}return 0}get viewportIntersectionArea(){const t=this._options.viewportRect;return t?t.getIntersectionArea(this._rect):0}get _rect(){return this._cachedRect||(this._cachedRect=this._options.elementRect.clone().moveTo(this._positioningFunctionCorrdinates.left,this._positioningFunctionCorrdinates.top)),this._cachedRect}get _absoluteRect(){return this._cachedAbsoluteRect||(this._cachedAbsoluteRect=Qu(this._rect),this._options.positionedElementAncestor&&function(t,e){const n=Qu(new Da(e)),o=xa(e);let i=0,r=0;i-=n.left,r-=n.top,i+=e.scrollLeft,r+=e.scrollTop,i-=o.left,r-=o.top,t.moveBy(i,r)}(this._cachedAbsoluteRect,this._options.positionedElementAncestor)),this._cachedAbsoluteRect}}class Xu extends Jd{constructor(t,e,n){super(t);const o=this.bindTemplate;this.buttonView=e,this.panelView=n,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class"),this.set("id"),this.set("panelPosition","auto"),this.keystrokes=new Pa,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",o.to("class"),o.if("isEnabled","ck-disabled",(t=>!t))],id:o.to("id"),"aria-describedby":o.to("ariaDescribedById")},children:[e,n]}),e.extendTemplate({attributes:{class:["ck-dropdown__button"]}})}render(){super.render(),this.listenTo(this.buttonView,"open",(()=>{this.isOpen=!this.isOpen})),this.panelView.bind("isVisible").to(this,"isOpen"),this.on("change:isOpen",(()=>{this.isOpen?("auto"===this.panelPosition?this.panelView.position=Xu._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions}).name:this.panelView.position=this.panelPosition,this.panelView.focus()):this.focus()})),this.keystrokes.listenTo(this.element);const t=(t,e)=>{this.isOpen&&(this.isOpen=!1,e())};this.keystrokes.set("arrowdown",((t,e)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,e())})),this.keystrokes.set("arrowright",((t,e)=>{this.isOpen&&e()})),this.keystrokes.set("arrowleft",t),this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:t,north:e,southEast:n,southWest:o,northEast:i,northWest:r,southMiddleEast:s,southMiddleWest:a,northMiddleEast:l,northMiddleWest:c}=Xu.defaultPanelPositions;return"rtl"!==this.locale.uiLanguageDirection?[n,o,s,a,t,i,r,l,c,e]:[o,n,a,s,t,r,i,c,l,e]}}Xu.defaultPanelPositions={south:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/2,name:"s"}),southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),southMiddleEast:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/4,name:"sme"}),southMiddleWest:(t,e)=>({top:t.bottom,left:t.left-3*(e.width-t.width)/4,name:"smw"}),north:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/2,name:"n"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),northMiddleEast:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/4,name:"nme"}),northMiddleWest:(t,e)=>({top:t.top-e.height,left:t.left-3*(e.width-t.width)/4,name:"nmw"})},Xu._getOptimalPosition=$u;class th extends Jd{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class eh extends Jd{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}function nh(t){return Array.isArray(t)?{items:t,removeItems:[]}:t?Object.assign({items:[],removeItems:[]},t):{items:[],removeItems:[]}}var oh=n(5571),ih={attributes:{"data-cke":!0}};ih.setAttributes=is(),ih.insert=ns().bind(null,"head"),ih.domAPI=ts(),ih.insertStyleElement=ss();Jr()(oh.Z,ih);oh.Z&&oh.Z.locals&&oh.Z.locals;class rh extends Jd{constructor(t,e){super(t);const n=this.bindTemplate,o=this.t;this.options=e||{},this.set("ariaLabel",o("Editor toolbar")),this.set("maxWidth","auto"),this.items=this.createCollection(),this.focusTracker=new za,this.keystrokes=new Pa,this.set("class"),this.set("isCompact",!1),this.itemsView=new sh(t),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection();const i="rtl"===t.uiLanguageDirection;this._focusCycler=new Ou({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:[i?"arrowright":"arrowleft","arrowup"],focusNext:[i?"arrowleft":"arrowright","arrowdown"]}});const r=["ck","ck-toolbar",n.to("class"),n.if("isCompact","ck-toolbar_compact")];var s;this.options.shouldGroupWhenFull&&this.options.isFloating&&r.push("ck-toolbar_floating"),this.setTemplate({tag:"div",attributes:{class:r,role:"toolbar","aria-label":n.to("ariaLabel"),style:{maxWidth:n.to("maxWidth")}},children:this.children,on:{mousedown:(s=this,s.bindTemplate.to((t=>{t.target===s.element&&t.preventDefault()})))}}),this._behavior=this.options.shouldGroupWhenFull?new lh(this):new ah(this)}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element),this._behavior.render(this)}destroy(){return this._behavior.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy(),super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e){const n=nh(t),o=n.items.filter(((t,o,i)=>"|"===t||-1===n.removeItems.indexOf(t)&&("-"===t?!this.options.shouldGroupWhenFull||(c("toolbarview-line-break-ignored-when-grouping-items",i),!1):!!e.has(t)||(c("toolbarview-item-unavailable",{name:t}),!1)))),i=this._cleanSeparators(o).map((t=>"|"===t?new th:"-"===t?new eh:e.create(t)));this.items.addMany(i)}_cleanSeparators(t){const e=t=>"-"!==t&&"|"!==t,n=t.length,o=t.findIndex(e),i=n-t.slice().reverse().findIndex(e);return t.slice(o,i).filter(((t,n,o)=>{if(e(t))return!0;return!(n>0&&o[n-1]===t)}))}}class sh extends Jd{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class ah{constructor(t){const e=t.bindTemplate;t.set("isVertical",!1),t.itemsView.children.bindTo(t.items).using((t=>t)),t.focusables.bindTo(t.items).using((t=>t)),t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class lh{constructor(t){this.view=t,this.viewChildren=t.children,this.viewFocusables=t.focusables,this.viewItemsView=t.itemsView,this.viewFocusTracker=t.focusTracker,this.viewLocale=t.locale,this.ungroupedItems=t.createCollection(),this.groupedItems=t.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),this.resizeObserver=null,this.cachedPadding=null,this.shouldUpdateGroupingOnNextResize=!1,t.itemsView.children.bindTo(this.ungroupedItems).using((t=>t)),this.ungroupedItems.on("add",this._updateFocusCycleableItems.bind(this)),this.ungroupedItems.on("remove",this._updateFocusCycleableItems.bind(this)),t.children.on("add",this._updateFocusCycleableItems.bind(this)),t.children.on("remove",this._updateFocusCycleableItems.bind(this)),t.items.on("change",((t,e)=>{const n=e.index;for(const t of e.removed)n>=this.ungroupedItems.length?this.groupedItems.remove(t):this.ungroupedItems.remove(t);for(let t=n;tthis.ungroupedItems.length?this.groupedItems.add(o,t-this.ungroupedItems.length):this.ungroupedItems.add(o,t)}this._updateGrouping()})),t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element,this._enableGroupingOnResize(),this._enableGroupingOnMaxWidthChange(t)}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;if(!Lu(this.viewElement))return void(this.shouldUpdateGroupingOnNextResize=!0);const t=this.groupedItems.length;let e;for(;this._areItemsOverflowing;)this._groupLastItem(),e=!0;if(!e&&this.groupedItems.length){for(;this.groupedItems.length&&!this._areItemsOverflowing;)this._ungroupFirstItem();this._areItemsOverflowing&&this._groupLastItem()}this.groupedItems.length!==t&&this.view.fire("groupedItemsUpdate")}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const t=this.viewElement,e=this.viewLocale.uiLanguageDirection,n=new Da(t.lastChild),o=new Da(t);if(!this.cachedPadding){const n=ms.window.getComputedStyle(t),o="ltr"===e?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(n[o])}return"ltr"===e?n.right>o.right-this.cachedPadding:n.left{t&&t===e.contentRect.width&&!this.shouldUpdateGroupingOnNextResize||(this.shouldUpdateGroupingOnNextResize=!1,this._updateGrouping(),t=e.contentRect.width)})),this._updateGrouping()}_enableGroupingOnMaxWidthChange(t){t.on("change:maxWidth",(()=>{this._updateGrouping()}))}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new th),this.viewChildren.add(this.groupedItemsDropdown),this.viewFocusTracker.add(this.groupedItemsDropdown.element)),this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)),this.groupedItems.length||(this.viewChildren.remove(this.groupedItemsDropdown),this.viewChildren.remove(this.viewChildren.last),this.viewFocusTracker.remove(this.groupedItemsDropdown.element))}_createGroupedItemsDropdown(){const t=this.viewLocale,e=t.t,n=kh(t);return n.class="ck-toolbar__grouped-dropdown",n.panelPosition="ltr"===t.uiLanguageDirection?"sw":"se",wh(n,[]),n.buttonView.set({label:e("Show more items"),tooltip:!0,tooltipPosition:"rtl"===t.uiLanguageDirection?"se":"sw",icon:qd}),n.toolbarView.items.bindTo(this.groupedItems).using((t=>t)),n}_updateFocusCycleableItems(){this.viewFocusables.clear(),this.ungroupedItems.map((t=>{this.viewFocusables.add(t)})),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}var ch=n(1162),dh={attributes:{"data-cke":!0}};dh.setAttributes=is(),dh.insert=ns().bind(null,"head"),dh.domAPI=ts(),dh.insertStyleElement=ss();Jr()(ch.Z,dh);ch.Z&&ch.Z.locals&&ch.Z.locals;class uh extends Jd{constructor(){super(),this.items=this.createCollection(),this.focusTracker=new za,this.keystrokes=new Pa,this._focusCycler=new Ou({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"]},children:this.items})}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}class hh extends Jd{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item"]},children:this.children})}focus(){this.children.first.focus()}}class mh extends Jd{constructor(t){super(t),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}var gh=n(5075),ph={attributes:{"data-cke":!0}};ph.setAttributes=is(),ph.insert=ns().bind(null,"head"),ph.domAPI=ts(),ph.insertStyleElement=ss();Jr()(gh.Z,ph);gh.Z&&gh.Z.locals&&gh.Z.locals;var fh=n(6875),bh={attributes:{"data-cke":!0}};bh.setAttributes=is(),bh.insert=ns().bind(null,"head"),bh.domAPI=ts(),bh.insertStyleElement=ss();Jr()(fh.Z,bh);fh.Z&&fh.Z.locals&&fh.Z.locals;function kh(t,e=Uu){const n=new e(t),o=new Zu(t),i=new Xu(t,n,o);return n.bind("isEnabled").to(i),n instanceof Uu?n.bind("isOn").to(i,"isOpen"):n.arrowView.bind("isOn").to(i,"isOpen"),function(t){(function(t){t.on("render",(()=>{Wd({emitter:t,activator:()=>t.isOpen,callback:()=>{t.isOpen=!1},contextElements:[t.element]})}))})(t),function(t){t.on("execute",(e=>{e.source instanceof Mu||(t.isOpen=!1)}))}(t),function(t){t.keystrokes.set("arrowdown",((e,n)=>{t.isOpen&&(t.panelView.focus(),n())})),t.keystrokes.set("arrowup",((e,n)=>{t.isOpen&&(t.panelView.focusLast(),n())}))}(t)}(i),i}function wh(t,e,n={}){const o=t.locale,i=o.t,r=t.toolbarView=new rh(o);r.set("ariaLabel",i("Dropdown toolbar")),t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),e.map((t=>r.items.add(t))),n.enableActiveItemFocusOnDropdownOpen&&Ch(t,(()=>r.items.find((t=>t.isOn)))),t.panelView.children.add(r),r.items.delegate("execute").to(t)}function Ah(t,e){const n=t.locale,o=t.listView=new uh(n);o.items.bindTo(e).using((({type:t,model:e})=>{if("separator"===t)return new mh(n);if("button"===t||"switchbutton"===t){const o=new hh(n);let i;return i="button"===t?new Su(n):new Mu(n),i.bind(...Object.keys(e)).to(e),i.delegate("execute").to(o),o.children.add(i),o}})),t.panelView.children.add(o),o.items.delegate("execute").to(t),Ch(t,(()=>o.items.find((t=>t instanceof hh&&t.children.first.isOn))))}function Ch(t,e){t.on("change:isOpen",(()=>{if(!t.isOpen)return;const n=e();n&&("function"==typeof n.focus?n.focus():c("ui-dropdown-focus-child-on-open-child-missing-focus",{view:n}))}),{priority:"low"})}var _h=n(4547),vh={attributes:{"data-cke":!0}};vh.setAttributes=is(),vh.insert=ns().bind(null,"head"),vh.domAPI=ts(),vh.insertStyleElement=ss();Jr()(_h.Z,vh);_h.Z&&_h.Z.locals&&_h.Z.locals;class yh extends Jd{constructor(t){super(t),this.body=new wu(t)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}var xh=n(2751),Eh={attributes:{"data-cke":!0}};Eh.setAttributes=is(),Eh.insert=ns().bind(null,"head"),Eh.domAPI=ts(),Eh.insertStyleElement=ss();Jr()(xh.Z,Eh);xh.Z&&xh.Z.locals&&xh.Z.locals;class Dh extends Jd{constructor(t){super(t),this.set("text"),this.set("for"),this.id=`ck-editor__label_${r()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class Sh extends yh{constructor(t){super(t),this.top=this.createCollection(),this.main=this.createCollection(),this._voiceLabelView=this._createVoiceLabel(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:t.uiLanguageDirection,lang:t.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const t=this.t,e=new Dh;return e.text=t("Rich Text Editor"),e.extendTemplate({attributes:{class:"ck-voice-label"}}),e}}class Ih extends Jd{constructor(t,e,n){super(t),this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}}),this.name=null,this.set("isFocused",!1),this._editableElement=n,this._hasExternalElement=!!this._editableElement,this._editingView=e}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",(()=>this._updateIsFocusedClasses())),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}_updateIsFocusedClasses(){const t=this._editingView;function e(e){t.change((n=>{const o=t.document.getRoot(e.name);n.addClass(e.isFocused?"ck-focused":"ck-blurred",o),n.removeClass(e.isFocused?"ck-blurred":"ck-focused",o)}))}t.isRenderingInProgress?function n(o){t.once("change:isRenderingInProgress",((t,i,r)=>{r?n(o):e(o)}))}(this):e(this)}}class Th extends Ih{constructor(t,e,n,o={}){super(t,e,n);const i=t.t;this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}}),this._generateLabel=o.label||(()=>i("Editor editing area: %0",this.name))}render(){super.render();const t=this._editingView;t.change((e=>{const n=t.document.getRoot(this.name);e.setAttribute("aria-label",this._generateLabel(this),n)}))}}var Mh=n(5523),Bh={attributes:{"data-cke":!0}};Bh.setAttributes=is(),Bh.insert=ns().bind(null,"head"),Bh.domAPI=ts(),Bh.insertStyleElement=ss();Jr()(Mh.Z,Bh);Mh.Z&&Mh.Z.locals&&Mh.Z.locals;class Nh extends Jd{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("label",e.label||""),this.set("class",e.class||null),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",n.to("class")]},children:this.children});const o=new Jd(t);o.setTemplate({tag:"span",attributes:{class:["ck","ck-form__header__label"]},children:[{text:n.to("label")}]}),this.children.add(o)}}var zh=n(6985),Ph={attributes:{"data-cke":!0}};Ph.setAttributes=is(),Ph.insert=ns().bind(null,"head"),Ph.domAPI=ts(),Ph.insertStyleElement=ss();Jr()(zh.Z,Ph);zh.Z&&zh.Z.locals&&zh.Z.locals;class Lh extends Jd{constructor(t){super(t),this.set("value"),this.set("id"),this.set("placeholder"),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById"),this.focusTracker=new za,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0),this.set("inputMode","text");const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck","ck-input",e.if("isFocused","ck-input_focused"),e.if("isEmpty","ck-input-text_empty"),e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),readonly:e.to("isReadOnly"),inputmode:e.to("inputMode"),"aria-invalid":e.if("hasError",!0),"aria-describedby":e.to("ariaDescribedById")},on:{input:e.to(((...t)=>{this.fire("input",...t),this._updateIsEmpty()})),change:e.to(this._updateIsEmpty.bind(this))}})}render(){super.render(),this.focusTracker.add(this.element),this._setDomElementValue(this.value),this._updateIsEmpty(),this.on("change:value",((t,e,n)=>{this._setDomElementValue(n),this._updateIsEmpty()}))}destroy(){super.destroy(),this.focusTracker.destroy()}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=!this.element.value}_setDomElementValue(t){this.element.value=t||0===t?t:""}}class Oh extends Lh{constructor(t){super(t),this.extendTemplate({attributes:{type:"text",class:["ck-input-text"]}})}}class Rh extends Lh{constructor(t,{min:e,max:n,step:o}={}){super(t);const i=this.bindTemplate;this.set("min",e),this.set("max",n),this.set("step",o),this.extendTemplate({attributes:{type:"number",class:["ck-input-number"],min:i.to("min"),max:i.to("max"),step:i.to("step")}})}}var jh=n(8111),Vh={attributes:{"data-cke":!0}};Vh.setAttributes=is(),Vh.insert=ns().bind(null,"head"),Vh.domAPI=ts(),Vh.insertStyleElement=ss();Jr()(jh.Z,Vh);jh.Z&&jh.Z.locals&&jh.Z.locals;class Fh extends Jd{constructor(t,e){super(t);const n=`ck-labeled-field-view-${r()}`,o=`ck-labeled-field-view-status-${r()}`;this.fieldView=e(this,n,o),this.set("label"),this.set("isEnabled",!0),this.set("isEmpty",!0),this.set("isFocused",!1),this.set("errorText",null),this.set("infoText",null),this.set("class"),this.set("placeholder"),this.labelView=this._createLabelView(n),this.statusView=this._createStatusView(o),this.bind("_statusText").to(this,"errorText",this,"infoText",((t,e)=>t||e));const i=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",i.to("class"),i.if("isEnabled","ck-disabled",(t=>!t)),i.if("isEmpty","ck-labeled-field-view_empty"),i.if("isFocused","ck-labeled-field-view_focused"),i.if("placeholder","ck-labeled-field-view_placeholder"),i.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:[this.fieldView,this.labelView]},this.statusView]})}_createLabelView(t){const e=new Dh(this.locale);return e.for=t,e.bind("text").to(this,"label"),e}_createStatusView(t){const e=new Jd(this.locale),n=this.bindTemplate;return e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",n.if("errorText","ck-labeled-field-view__status_error"),n.if("_statusText","ck-hidden",(t=>!t))],id:t,role:n.if("errorText","alert")},children:[{text:n.to("_statusText")}]}),e}focus(){this.fieldView.focus()}}function Hh(t,e,n){const o=new Oh(t.locale);return o.set({id:e,ariaDescribedById:n}),o.bind("isReadOnly").to(t,"isEnabled",(t=>!t)),o.bind("hasError").to(t,"errorText",(t=>!!t)),o.on("input",(()=>{t.errorText=null})),t.bind("isEmpty","isFocused","placeholder").to(o),o}function Uh(t,e,n){const o=new Rh(t.locale);return o.set({id:e,ariaDescribedById:n,inputMode:"numeric"}),o.bind("isReadOnly").to(t,"isEnabled",(t=>!t)),o.bind("hasError").to(t,"errorText",(t=>!!t)),o.on("input",(()=>{t.errorText=null})),t.bind("isEmpty","isFocused","placeholder").to(o),o}function qh(t,e,n){const o=kh(t.locale);return o.set({id:e,ariaDescribedById:n}),o.bind("isEnabled").to(t),o}class Gh extends xo{static get pluginName(){return"Notification"}init(){this.on("show:warning",((t,e)=>{window.alert(e.message)}),{priority:"lowest"})}showSuccess(t,e={}){this._showNotification({message:t,type:"success",namespace:e.namespace,title:e.title})}showInfo(t,e={}){this._showNotification({message:t,type:"info",namespace:e.namespace,title:e.title})}showWarning(t,e={}){this._showNotification({message:t,type:"warning",namespace:e.namespace,title:e.title})}_showNotification(t){const e=`show:${t.type}`+(t.namespace?`:${t.namespace}`:"");this.fire(e,{message:t.message,type:t.type,title:t.title||""})}}class Wh{constructor(t,e){e&&Es(this,e),t&&this.set(t)}}function Zh(t){return e=>e+t}j(Wh,N);var Yh=n(8245),Kh={attributes:{"data-cke":!0}};Kh.setAttributes=is(),Kh.insert=ns().bind(null,"head"),Kh.domAPI=ts(),Kh.insertStyleElement=ss();Jr()(Yh.Z,Kh);Yh.Z&&Yh.Z.locals&&Yh.Z.locals;const $h=Zh("px"),Qh=ms.document.body;class Jh extends Jd{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class"),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",(t=>`ck-balloon-panel_${t}`)),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",$h),left:e.to("left",$h)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(t){this.show();const e=Jh.defaultPositions,n=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthMiddleWest,e.southArrowNorthMiddleEast,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthMiddleWest,e.northArrowSouthMiddleEast,e.northArrowSouthWest,e.northArrowSouthEast,e.viewportStickyNorth],limiter:Qh,fitInViewport:!0},t),o=Jh._getOptimalPosition(n),i=parseInt(o.left),r=parseInt(o.top),{name:s,config:a={}}=o,{withArrow:l=!0}=a;Object.assign(this,{top:r,left:i,position:s,withArrow:l})}pin(t){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(t):this._stopPinning()},this._startPinning(t),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(t){this.attachTo(t);const e=Xh(t.target),n=t.limiter?Xh(t.limiter):Qh;this.listenTo(ms.document,"scroll",((o,i)=>{const r=i.target,s=e&&r.contains(e),a=n&&r.contains(n);!s&&!a&&e&&n||this.attachTo(t)}),{useCapture:!0}),this.listenTo(ms.window,"resize",(()=>{this.attachTo(t)}))}_stopPinning(){this.stopListening(ms.document,"scroll"),this.stopListening(ms.window,"resize")}}function Xh(t){return uo(t)?t:ya(t)?t.commonAncestorContainer:"function"==typeof t?Xh(t()):null}Jh.arrowHorizontalOffset=25,Jh.arrowVerticalOffset=10,Jh.stickyVerticalOffset=20,Jh._getOptimalPosition=$u,Jh.defaultPositions=function({horizontalOffset:t=Jh.arrowHorizontalOffset,verticalOffset:e=Jh.arrowVerticalOffset,stickyVerticalOffset:n=Jh.stickyVerticalOffset,config:o}={}){return{northWestArrowSouthWest:(e,n)=>({top:i(e,n),left:e.left-t,name:"arrow_sw",...o&&{config:o}}),northWestArrowSouthMiddleWest:(e,n)=>({top:i(e,n),left:e.left-.25*n.width-t,name:"arrow_smw",...o&&{config:o}}),northWestArrowSouth:(t,e)=>({top:i(t,e),left:t.left-e.width/2,name:"arrow_s",...o&&{config:o}}),northWestArrowSouthMiddleEast:(e,n)=>({top:i(e,n),left:e.left-.75*n.width+t,name:"arrow_sme",...o&&{config:o}}),northWestArrowSouthEast:(e,n)=>({top:i(e,n),left:e.left-n.width+t,name:"arrow_se",...o&&{config:o}}),northArrowSouthWest:(e,n)=>({top:i(e,n),left:e.left+e.width/2-t,name:"arrow_sw",...o&&{config:o}}),northArrowSouthMiddleWest:(e,n)=>({top:i(e,n),left:e.left+e.width/2-.25*n.width-t,name:"arrow_smw",...o&&{config:o}}),northArrowSouth:(t,e)=>({top:i(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s",...o&&{config:o}}),northArrowSouthMiddleEast:(e,n)=>({top:i(e,n),left:e.left+e.width/2-.75*n.width+t,name:"arrow_sme",...o&&{config:o}}),northArrowSouthEast:(e,n)=>({top:i(e,n),left:e.left+e.width/2-n.width+t,name:"arrow_se",...o&&{config:o}}),northEastArrowSouthWest:(e,n)=>({top:i(e,n),left:e.right-t,name:"arrow_sw",...o&&{config:o}}),northEastArrowSouthMiddleWest:(e,n)=>({top:i(e,n),left:e.right-.25*n.width-t,name:"arrow_smw",...o&&{config:o}}),northEastArrowSouth:(t,e)=>({top:i(t,e),left:t.right-e.width/2,name:"arrow_s",...o&&{config:o}}),northEastArrowSouthMiddleEast:(e,n)=>({top:i(e,n),left:e.right-.75*n.width+t,name:"arrow_sme",...o&&{config:o}}),northEastArrowSouthEast:(e,n)=>({top:i(e,n),left:e.right-n.width+t,name:"arrow_se",...o&&{config:o}}),southWestArrowNorthWest:(e,n)=>({top:r(e),left:e.left-t,name:"arrow_nw",...o&&{config:o}}),southWestArrowNorthMiddleWest:(e,n)=>({top:r(e),left:e.left-.25*n.width-t,name:"arrow_nmw",...o&&{config:o}}),southWestArrowNorth:(t,e)=>({top:r(t),left:t.left-e.width/2,name:"arrow_n",...o&&{config:o}}),southWestArrowNorthMiddleEast:(e,n)=>({top:r(e),left:e.left-.75*n.width+t,name:"arrow_nme",...o&&{config:o}}),southWestArrowNorthEast:(e,n)=>({top:r(e),left:e.left-n.width+t,name:"arrow_ne",...o&&{config:o}}),southArrowNorthWest:(e,n)=>({top:r(e),left:e.left+e.width/2-t,name:"arrow_nw",...o&&{config:o}}),southArrowNorthMiddleWest:(e,n)=>({top:r(e),left:e.left+e.width/2-.25*n.width-t,name:"arrow_nmw",...o&&{config:o}}),southArrowNorth:(t,e)=>({top:r(t),left:t.left+t.width/2-e.width/2,name:"arrow_n",...o&&{config:o}}),southArrowNorthMiddleEast:(e,n)=>({top:r(e),left:e.left+e.width/2-.75*n.width+t,name:"arrow_nme",...o&&{config:o}}),southArrowNorthEast:(e,n)=>({top:r(e),left:e.left+e.width/2-n.width+t,name:"arrow_ne",...o&&{config:o}}),southEastArrowNorthWest:(e,n)=>({top:r(e),left:e.right-t,name:"arrow_nw",...o&&{config:o}}),southEastArrowNorthMiddleWest:(e,n)=>({top:r(e),left:e.right-.25*n.width-t,name:"arrow_nmw",...o&&{config:o}}),southEastArrowNorth:(t,e)=>({top:r(t),left:t.right-e.width/2,name:"arrow_n",...o&&{config:o}}),southEastArrowNorthMiddleEast:(e,n)=>({top:r(e),left:e.right-.75*n.width+t,name:"arrow_nme",...o&&{config:o}}),southEastArrowNorthEast:(e,n)=>({top:r(e),left:e.right-n.width+t,name:"arrow_ne",...o&&{config:o}}),viewportStickyNorth:(t,e,i)=>t.getIntersection(i)?{top:i.top+n,left:t.left+t.width/2-e.width/2,name:"arrowless",config:{withArrow:!1,...o}}:null};function i(t,n){return t.top-n.height-e}function r(t){return t.bottom+e}}();var tm=n(1757),em={attributes:{"data-cke":!0}};em.setAttributes=is(),em.insert=ns().bind(null,"head"),em.domAPI=ts(),em.insertStyleElement=ss();Jr()(tm.Z,em);tm.Z&&tm.Z.locals&&tm.Z.locals;var nm=n(3553),om={attributes:{"data-cke":!0}};om.setAttributes=is(),om.insert=ns().bind(null,"head"),om.domAPI=ts(),om.insertStyleElement=ss();Jr()(nm.Z,om);nm.Z&&nm.Z.locals&&nm.Z.locals;const im=Zh("px");class rm extends V{static get pluginName(){return"ContextualBalloon"}constructor(t){super(t),this.positionLimiter=()=>{const t=this.editor.editing.view,e=t.document.selection.editableElement;return e?t.domConverter.mapViewToDom(e.root):null},this.set("visibleView",null),this.view=new Jh(t.locale),t.ui.view.body.add(this.view),t.ui.focusTracker.add(this.view.element),this._viewToStack=new Map,this._idToStack=new Map,this.set("_numberOfStacks",0),this.set("_singleViewMode",!1),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}destroy(){super.destroy(),this.view.destroy(),this._rotatorView.destroy(),this._fakePanelsView.destroy()}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this.hasView(t.view))throw new l("contextualballoon-add-view-exist",[this,t]);const e=t.stackId||"main";if(!this._idToStack.has(e))return this._idToStack.set(e,new Map([[t.view,t]])),this._viewToStack.set(t.view,this._idToStack.get(e)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!t.singleViewMode||this.showStack(e));const n=this._idToStack.get(e);t.singleViewMode&&this.showStack(e),n.set(t.view,t),this._viewToStack.set(t.view,n),n===this._visibleStack&&this._showView(t)}remove(t){if(!this.hasView(t))throw new l("contextualballoon-remove-view-not-exist",[this,t]);const e=this._viewToStack.get(t);this._singleViewMode&&this.visibleView===t&&(this._singleViewMode=!1),this.visibleView===t&&(1===e.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(e.values())[e.size-2])),1===e.size?(this._idToStack.delete(this._getStackId(e)),this._numberOfStacks=this._idToStack.size):e.delete(t),this._viewToStack.delete(t)}updatePosition(t){t&&(this._visibleStack.get(this.visibleView).position=t),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e)throw new l("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==e&&this._showView(Array.from(e.values()).pop())}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){return Array.from(this._idToStack.entries()).find((e=>e[1]===t))[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;t[e]||(e=0),this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;t[e]||(e=t.length-1),this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new sm(this.editor.locale),e=this.editor.locale.t;return this.view.content.add(t),t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>1)),t.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"}),t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((t,n)=>{if(n<2)return"";const o=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("%0 of %1",[o,n])})),t.buttonNextView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()})),t.buttonPrevView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()})),t}_createFakePanelsView(){const t=new am(this.editor.locale,this.view);return t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>=2?Math.min(t-1,2):0)),t.listenTo(this.view,"change:top",(()=>t.updatePosition())),t.listenTo(this.view,"change:left",(()=>t.updatePosition())),this.editor.ui.view.body.add(t),t}_showView({view:t,balloonClassName:e="",withArrow:n=!0,singleViewMode:o=!1}){this.view.class=e,this.view.withArrow=n,this._rotatorView.showView(t),this.visibleView=t,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),o&&(this._singleViewMode=!0)}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;return t&&(t.limiter||(t=Object.assign({},t,{limiter:this.positionLimiter})),t=Object.assign({},t,{viewportOffsetConfig:this.editor.ui.viewportOffset})),t}}class sm extends Jd{constructor(t){super(t);const e=t.t,n=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new za,this.buttonPrevView=this._createButtonView(e("Previous"),''),this.buttonNextView=this._createButtonView(e("Next"),''),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",n.to("isNavigationVisible",(t=>t?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:n.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}destroy(){super.destroy(),this.focusTracker.destroy()}showView(t){this.hideView(),this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const n=new Su(this.locale);return n.set({label:t,icon:e,tooltip:!0}),n}}class am extends Jd{constructor(t,e){super(t);const n=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=e,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",n.to("numberOfPanels",(t=>t?"":"ck-hidden"))],style:{top:n.to("top",im),left:n.to("left",im),width:n.to("width",im),height:n.to("height",im)}},children:this.content}),this.on("change:numberOfPanels",((t,e,n,o)=>{n>o?this._addPanels(n-o):this._removePanels(o-n),this.updatePosition()}))}_addPanels(t){for(;t--;){const t=new Jd;t.setTemplate({tag:"div"}),this.content.add(t),this.registerChild(t)}}_removePanels(t){for(;t--;){const t=this.content.last;this.content.remove(t),this.deregisterChild(t),t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView,{width:n,height:o}=new Da(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:n,height:o})}}}var lm=n(3609),cm={attributes:{"data-cke":!0}};cm.setAttributes=is(),cm.insert=ns().bind(null,"head"),cm.domAPI=ts(),cm.insertStyleElement=ss();Jr()(lm.Z,cm);lm.Z&&lm.Z.locals&&lm.Z.locals;const dm=Zh("px");class um extends Jd{constructor(t){super(t);const e=this.bindTemplate;this.set("isActive",!1),this.set("isSticky",!1),this.set("limiterElement",null),this.set("limiterBottomOffset",50),this.set("viewportTopOffset",0),this.set("_marginLeft",null),this.set("_isStickyToTheLimiter",!1),this.set("_hasViewportTopOffset",!1),this.content=this.createCollection(),this._contentPanelPlaceholder=new Xd({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:e.to("isSticky",(t=>t?"block":"none")),height:e.to("isSticky",(t=>t?dm(this._panelRect.height):null))}}}).render(),this._contentPanel=new Xd({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",e.if("isSticky","ck-sticky-panel__content_sticky"),e.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:e.to("isSticky",(t=>t?dm(this._contentPanelPlaceholder.getBoundingClientRect().width):null)),top:e.to("_hasViewportTopOffset",(t=>t?dm(this.viewportTopOffset):null)),bottom:e.to("_isStickyToTheLimiter",(t=>t?dm(this.limiterBottomOffset):null)),marginLeft:e.to("_marginLeft")}},children:this.content}).render(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this._contentPanel]})}render(){super.render(),this._checkIfShouldBeSticky(),this.listenTo(ms.window,"scroll",(()=>{this._checkIfShouldBeSticky()})),this.listenTo(this,"change:isActive",(()=>{this._checkIfShouldBeSticky()}))}_checkIfShouldBeSticky(){const t=this._panelRect=this._contentPanel.getBoundingClientRect();let e;this.limiterElement?(e=this._limiterRect=this.limiterElement.getBoundingClientRect(),this.isSticky=this.isActive&&e.topwm(s,t)))),fm.get(s).set(n,{text:o,isDirectHost:i,keepOnFocus:r,hostElement:i?n:null}),e.change((t=>wm(s,t)))}function km(t,e){return!!e.hasClass("ck-placeholder")&&(t.removeClass("ck-placeholder",e),!0)}function wm(t,e){const n=fm.get(t),o=[];let i=!1;for(const[t,r]of n)r.isDirectHost&&(o.push(t),Am(e,t,r)&&(i=!0));for(const[t,r]of n){if(r.isDirectHost)continue;const n=Cm(t);n&&(o.includes(n)||(r.hostElement=n,Am(e,t,r)&&(i=!0)))}return i}function Am(t,e,n){const{text:o,isDirectHost:i,hostElement:r}=n;let s=!1;r.getAttribute("data-placeholder")!==o&&(t.setAttribute("data-placeholder",o,r),s=!0);return(i||1==e.childCount)&&function(t,e){if(!t.isAttached())return!1;const n=Array.from(t.getChildren()).some((t=>!t.is("uiElement")));if(n)return!1;if(e)return!0;const o=t.document;if(!o.isFocused)return!0;const i=o.selection.anchor;return i&&i.parent!==t}(r,n.keepOnFocus)?function(t,e){return!e.hasClass("ck-placeholder")&&(t.addClass("ck-placeholder",e),!0)}(t,r)&&(s=!0):km(t,r)&&(s=!0),s}function Cm(t){if(t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement")&&!e.is("attributeElement"))return e}return null}const _m=new Map;function vm(t,e,n){let o=_m.get(t);o||(o=new Map,_m.set(t,o)),o.set(e,n)}function ym(t){return[t]}function xm(t,e,n={}){const o=function(t,e){const n=_m.get(t);return n&&n.has(e)?n.get(e):ym}(t.constructor,e.constructor);try{return o(t=t.clone(),e,n)}catch(t){throw t}}function Em(t,e,n){t=t.slice(),e=e.slice();const o=new Dm(n.document,n.useRelations,n.forceWeakRemove);o.setOriginalOperations(t),o.setOriginalOperations(e);const i=o.originalOperations;if(0==t.length||0==e.length)return{operationsA:t,operationsB:e,originalOperations:i};const r=new WeakMap;for(const e of t)r.set(e,0);const s={nextBaseVersionA:t[t.length-1].baseVersion+1,nextBaseVersionB:e[e.length-1].baseVersion+1,originalOperationsACount:t.length,originalOperationsBCount:e.length};let a=0;for(;a{if(t.key===e.key&&t.range.start.hasSameParentAs(e.range.start)){const o=t.range.getDifference(e.range).map((e=>new Bc(e,t.key,t.oldValue,t.newValue,0))),i=t.range.getIntersection(e.range);return i&&n.aIsStrong&&o.push(new Bc(i,e.key,e.newValue,t.newValue,0)),0==o.length?[new ld(0)]:o}return[t]})),vm(Bc,Pc,((t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const n=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes).map((e=>new Bc(e,t.key,t.oldValue,t.newValue,t.baseVersion)));if(e.shouldReceiveAttributes){const o=Tm(e,t.key,t.oldValue);o&&n.unshift(o)}return n}return t.range=t.range._getTransformedByInsertion(e.position,e.howMany,!1)[0],[t]})),vm(Bc,jc,((t,e)=>{const n=[];t.range.start.hasSameParentAs(e.deletionPosition)&&(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition))&&n.push(rl._createFromPositionAndShift(e.graveyardPosition,1));const o=t.range._getTransformedByMergeOperation(e);return o.isCollapsed||n.push(o),n.map((e=>new Bc(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),vm(Bc,zc,((t,e)=>{const n=function(t,e){const n=rl._createFromPositionAndShift(e.sourcePosition,e.howMany);let o=null,i=[];n.containsRange(t,!0)?o=t:t.start.hasSameParentAs(n.start)?(i=t.getDifference(n),o=t.getIntersection(n)):i=[t];const r=[];for(let t of i){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=e.getMovedRangeStart(),o=t.start.hasSameParentAs(n);t=t._getTransformedByInsertion(n,e.howMany,o),r.push(...t)}o&&r.push(o._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,!1)[0]);return r}(t.range,e);return n.map((e=>new Bc(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),vm(Bc,Vc,((t,e)=>{if(t.range.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.range.end.offset++,[t];if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const n=t.clone();return n.range=new rl(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition)),t.range.end=e.splitPosition.clone(),t.range.end.stickiness="toPrevious",[t,n]}return t.range=t.range._getTransformedBySplitOperation(e),[t]})),vm(Pc,Bc,((t,e)=>{const n=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const o=Tm(t,e.key,e.newValue);o&&n.push(o)}return n})),vm(Pc,Pc,((t,e,n)=>(t.position.isEqual(e.position)&&n.aIsStrong||(t.position=t.position._getTransformedByInsertOperation(e)),[t]))),vm(Pc,zc,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),vm(Pc,Vc,((t,e)=>(t.position=t.position._getTransformedBySplitOperation(e),[t]))),vm(Pc,jc,((t,e)=>(t.position=t.position._getTransformedByMergeOperation(e),[t]))),vm(Lc,Pc,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]),t.newRange&&(t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]),[t]))),vm(Lc,Lc,((t,e,n)=>{if(t.name==e.name){if(!n.aIsStrong)return[new ld(0)];t.oldRange=e.newRange?e.newRange.clone():null}return[t]})),vm(Lc,jc,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByMergeOperation(e)),t.newRange&&(t.newRange=t.newRange._getTransformedByMergeOperation(e)),[t]))),vm(Lc,zc,((t,e,n)=>{if(t.oldRange&&(t.oldRange=rl._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))),t.newRange){if(n.abRelation){const o=rl._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if("left"==n.abRelation.side&&e.targetPosition.isEqual(t.newRange.start))return t.newRange.start.path=n.abRelation.path,t.newRange.end=o.end,[t];if("right"==n.abRelation.side&&e.targetPosition.isEqual(t.newRange.end))return t.newRange.start=o.start,t.newRange.end.path=n.abRelation.path,[t]}t.newRange=rl._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]})),vm(Lc,Vc,((t,e,n)=>{if(t.oldRange&&(t.oldRange=t.oldRange._getTransformedBySplitOperation(e)),t.newRange){if(n.abRelation){const o=t.newRange._getTransformedBySplitOperation(e);return t.newRange.start.isEqual(e.splitPosition)&&n.abRelation.wasStartBeforeMergedElement?t.newRange.start=el._createAt(e.insertionPosition):t.newRange.start.isEqual(e.splitPosition)&&!n.abRelation.wasInLeftElement&&(t.newRange.start=el._createAt(e.moveTargetPosition)),t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasInRightElement?t.newRange.end=el._createAt(e.moveTargetPosition):t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasEndBeforeMergedElement?t.newRange.end=el._createAt(e.insertionPosition):t.newRange.end=o.end,[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]})),vm(jc,Pc,((t,e)=>(t.sourcePosition.hasSameParentAs(e.position)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e),t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e),[t]))),vm(jc,jc,((t,e,n)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(n.bWasUndone){const n=e.graveyardPosition.path.slice();return n.push(0),t.sourcePosition=new el(e.graveyardPosition.root,n),t.howMany=0,[t]}return[new ld(0)]}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!n.bWasUndone&&"splitAtSource"!=n.abRelation){const o="$graveyard"==t.targetPosition.root.rootName,i="$graveyard"==e.targetPosition.root.rootName,r=o&&!i;if(i&&!o||!r&&n.aIsStrong){const n=e.targetPosition._getTransformedByMergeOperation(e),o=t.targetPosition._getTransformedByMergeOperation(e);return[new zc(n,t.howMany,o,0)]}return[new ld(0)]}return t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),t.graveyardPosition.isEqual(e.graveyardPosition)&&n.aIsStrong||(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),vm(jc,zc,((t,e,n)=>{const o=rl._createFromPositionAndShift(e.sourcePosition,e.howMany);return"remove"==e.type&&!n.bWasUndone&&!n.forceWeakRemove&&t.deletionPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.sourcePosition)?[new ld(0)]:(t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition.hasSameParentAs(e.sourcePosition)&&(t.howMany-=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e),t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e),t.graveyardPosition.isEqual(e.targetPosition)||(t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)),[t])})),vm(jc,Vc,((t,e,n)=>{if(e.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1),t.deletionPosition.isEqual(e.graveyardPosition)&&(t.howMany=e.howMany)),t.targetPosition.isEqual(e.splitPosition)){const o=0!=e.howMany,i=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(o||i||"mergeTargetNotMoved"==n.abRelation)return t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),[t]}if(t.sourcePosition.isEqual(e.splitPosition)){if("mergeSourceNotMoved"==n.abRelation)return t.howMany=0,t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t];if("mergeSameElement"==n.abRelation||t.sourcePosition.offset>0)return t.sourcePosition=e.moveTargetPosition.clone(),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]}return t.sourcePosition.hasSameParentAs(e.splitPosition)&&(t.howMany=e.splitPosition.offset),t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]})),vm(zc,Pc,((t,e)=>{const n=rl._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByInsertOperation(e,!1)[0];return t.sourcePosition=n.start,t.howMany=n.end.offset-n.start.offset,t.targetPosition.isEqual(e.position)||(t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)),[t]})),vm(zc,zc,((t,e,n)=>{const o=rl._createFromPositionAndShift(t.sourcePosition,t.howMany),i=rl._createFromPositionAndShift(e.sourcePosition,e.howMany);let r,s=n.aIsStrong,a=!n.aIsStrong;if("insertBefore"==n.abRelation||"insertAfter"==n.baRelation?a=!0:"insertAfter"!=n.abRelation&&"insertBefore"!=n.baRelation||(a=!1),r=t.targetPosition.isEqual(e.targetPosition)&&a?t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany):t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Mm(t,e)&&Mm(e,t))return[e.getReversed()];if(o.containsPosition(e.targetPosition)&&o.containsRange(i,!0))return o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Bm([o],r);if(i.containsPosition(t.targetPosition)&&i.containsRange(o,!0))return o.start=o.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),o.end=o.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),Bm([o],r);const l=Eo(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if("prefix"==l||"extension"==l)return o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Bm([o],r);"remove"!=t.type||"remove"==e.type||n.aWasUndone||n.forceWeakRemove?"remove"==t.type||"remove"!=e.type||n.bWasUndone||n.forceWeakRemove||(s=!1):s=!0;const c=[],d=o.getDifference(i);for(const t of d){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany),t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const n="same"==Eo(t.start.getParentPath(),e.getMovedRangeStart().getParentPath()),o=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,n);c.push(...o)}const u=o.getIntersection(i);return null!==u&&s&&(u.start=u.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),u.end=u.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),0===c.length?c.push(u):1==c.length?i.start.isBefore(o.start)||i.start.isEqual(o.start)?c.unshift(u):c.push(u):c.splice(1,0,u)),0===c.length?[new ld(t.baseVersion)]:Bm(c,r)})),vm(zc,Vc,((t,e,n)=>{let o=t.targetPosition.clone();t.targetPosition.isEqual(e.insertionPosition)&&e.graveyardPosition&&"moveTargetAfter"!=n.abRelation||(o=t.targetPosition._getTransformedBySplitOperation(e));const i=rl._createFromPositionAndShift(t.sourcePosition,t.howMany);if(i.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.howMany++,t.targetPosition=o,[t];if(i.start.hasSameParentAs(e.splitPosition)&&i.containsPosition(e.splitPosition)){let t=new rl(e.splitPosition,i.end);t=t._getTransformedBySplitOperation(e);return Bm([new rl(i.start,e.splitPosition),t],o)}t.targetPosition.isEqual(e.splitPosition)&&"insertAtSource"==n.abRelation&&(o=e.moveTargetPosition),t.targetPosition.isEqual(e.insertionPosition)&&"insertBetween"==n.abRelation&&(o=t.targetPosition);const r=[i._getTransformedBySplitOperation(e)];if(e.graveyardPosition){const o=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);t.howMany>1&&o&&!n.aWasUndone&&r.push(rl._createFromPositionAndShift(e.insertionPosition,1))}return Bm(r,o)})),vm(zc,jc,((t,e,n)=>{const o=rl._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.sourcePosition))if("remove"!=t.type||n.forceWeakRemove){if(1==t.howMany)return n.bWasUndone?(t.sourcePosition=e.graveyardPosition.clone(),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]):[new ld(0)]}else if(!n.aWasUndone){const n=[];let o=e.graveyardPosition.clone(),i=e.targetPosition._getTransformedByMergeOperation(e);t.howMany>1&&(n.push(new zc(t.sourcePosition,t.howMany-1,t.targetPosition,0)),o=o._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1),i=i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1));const r=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition),s=new zc(o,1,r,0),a=s.getMovedRangeStart().path.slice();a.push(0);const l=new el(s.targetPosition.root,a);i=i._getTransformedByMove(o,r,1);const c=new zc(i,e.howMany,l,0);return n.push(s),n.push(c),n}const i=rl._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByMergeOperation(e);return t.sourcePosition=i.start,t.howMany=i.end.offset-i.start.offset,t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]})),vm(Oc,Pc,((t,e)=>(t.position=t.position._getTransformedByInsertOperation(e),[t]))),vm(Oc,jc,((t,e)=>t.position.isEqual(e.deletionPosition)?(t.position=e.graveyardPosition.clone(),t.position.stickiness="toNext",[t]):(t.position=t.position._getTransformedByMergeOperation(e),[t]))),vm(Oc,zc,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),vm(Oc,Oc,((t,e,n)=>{if(t.position.isEqual(e.position)){if(!n.aIsStrong)return[new ld(0)];t.oldName=e.newName}return[t]})),vm(Oc,Vc,((t,e)=>{if("same"==Eo(t.position.path,e.splitPosition.getParentPath())&&!e.graveyardPosition){const e=new Oc(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}return t.position=t.position._getTransformedBySplitOperation(e),[t]})),vm(Rc,Rc,((t,e,n)=>{if(t.root===e.root&&t.key===e.key){if(!n.aIsStrong||t.newValue===e.newValue)return[new ld(0)];t.oldValue=e.newValue}return[t]})),vm(Vc,Pc,((t,e)=>(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset{if(!t.graveyardPosition&&!n.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const n=e.graveyardPosition.path.slice();n.push(0);const o=new el(e.graveyardPosition.root,n),i=Vc.getInsertionPosition(new el(e.graveyardPosition.root,n)),r=new Vc(o,0,i,null,0);return t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=Vc.getInsertionPosition(t.splitPosition),t.graveyardPosition=r.insertionPosition.clone(),t.graveyardPosition.stickiness="toNext",[r,t]}return t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)&&t.howMany--,t.splitPosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=Vc.getInsertionPosition(t.splitPosition),t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),vm(Vc,zc,((t,e,n)=>{const o=rl._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const i=o.start.isEqual(t.graveyardPosition)||o.containsPosition(t.graveyardPosition);if(!n.bWasUndone&&i){const n=t.splitPosition._getTransformedByMoveOperation(e),o=t.graveyardPosition._getTransformedByMoveOperation(e),i=o.path.slice();i.push(0);const r=new el(o.root,i);return[new zc(n,t.howMany,r,0)]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}const i=t.splitPosition.isEqual(e.targetPosition);if(i&&("insertAtSource"==n.baRelation||"splitBefore"==n.abRelation))return t.howMany+=e.howMany,t.splitPosition=t.splitPosition._getTransformedByDeletion(e.sourcePosition,e.howMany),t.insertionPosition=Vc.getInsertionPosition(t.splitPosition),[t];if(i&&n.abRelation&&n.abRelation.howMany){const{howMany:e,offset:o}=n.abRelation;return t.howMany+=e,t.splitPosition=t.splitPosition.getShiftedBy(o),[t]}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.splitPosition)){const n=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);return t.howMany-=n,t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition)return[new ld(0)];if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition))return[new ld(0)];if("splitBefore"==n.abRelation)return t.howMany=0,t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e),[t]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const o="$graveyard"==t.splitPosition.root.rootName,i="$graveyard"==e.splitPosition.root.rootName,r=o&&!i;if(i&&!o||!r&&n.aIsStrong){const n=[];return e.howMany&&n.push(new zc(e.moveTargetPosition,e.howMany,e.splitPosition,0)),t.howMany&&n.push(new zc(t.splitPosition,t.howMany,t.moveTargetPosition,0)),n}return[new ld(0)]}if(t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)),t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==n.abRelation)return t.howMany++,[t];if(e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==n.baRelation){const n=e.insertionPosition.path.slice();n.push(0);const o=new el(e.insertionPosition.root,n);return[t,new zc(t.insertionPosition,1,o,0)]}return t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset{const{top:n,right:o,bottom:i,left:r}=e,s=[];return[n,o,r,i].every((t=>!!t))?s.push([t,ig(e)]):(n&&s.push([t+"-top",n]),o&&s.push([t+"-right",o]),i&&s.push([t+"-bottom",i]),r&&s.push([t+"-left",r])),s}}function ig({top:t,right:e,bottom:n,left:o}){const i=[];return o!==e?i.push(t,e,n,o):n!==t?i.push(t,e,n):e!==t?i.push(t,e):i.push(t),i.join(" ")}function rg(t){return e=>({path:t,value:ng(e)})}function sg(t){return t.replace(/, /g,",").split(" ").map((t=>t.replace(/,/g,", ")))}function ag(t){t.setNormalizer("background",lg),t.setNormalizer("background-color",(t=>({path:"background.color",value:t}))),t.setReducer("background",(t=>{const e=[];return e.push(["background-color",t.color]),e})),t.setStyleRelation("background",["background-color"])}function lg(t){const e={},n=sg(t);for(const t of n)o=t,Km.includes(o)?(e.repeat=e.repeat||[],e.repeat.push(t)):Qm(t)?(e.position=e.position||[],e.position.push(t)):Xm(t)?e.attachment=t:Hm(t)?e.color=t:eg(t)&&(e.image=t);var o;return{path:"background",value:e}}function cg(t){t.setNormalizer("border",dg),t.setNormalizer("border-top",ug("top")),t.setNormalizer("border-right",ug("right")),t.setNormalizer("border-bottom",ug("bottom")),t.setNormalizer("border-left",ug("left")),t.setNormalizer("border-color",hg("color")),t.setNormalizer("border-width",hg("width")),t.setNormalizer("border-style",hg("style")),t.setNormalizer("border-top-color",gg("color","top")),t.setNormalizer("border-top-style",gg("style","top")),t.setNormalizer("border-top-width",gg("width","top")),t.setNormalizer("border-right-color",gg("color","right")),t.setNormalizer("border-right-style",gg("style","right")),t.setNormalizer("border-right-width",gg("width","right")),t.setNormalizer("border-bottom-color",gg("color","bottom")),t.setNormalizer("border-bottom-style",gg("style","bottom")),t.setNormalizer("border-bottom-width",gg("width","bottom")),t.setNormalizer("border-left-color",gg("color","left")),t.setNormalizer("border-left-style",gg("style","left")),t.setNormalizer("border-left-width",gg("width","left")),t.setExtractor("border-top",pg("top")),t.setExtractor("border-right",pg("right")),t.setExtractor("border-bottom",pg("bottom")),t.setExtractor("border-left",pg("left")),t.setExtractor("border-top-color","border.color.top"),t.setExtractor("border-right-color","border.color.right"),t.setExtractor("border-bottom-color","border.color.bottom"),t.setExtractor("border-left-color","border.color.left"),t.setExtractor("border-top-width","border.width.top"),t.setExtractor("border-right-width","border.width.right"),t.setExtractor("border-bottom-width","border.width.bottom"),t.setExtractor("border-left-width","border.width.left"),t.setExtractor("border-top-style","border.style.top"),t.setExtractor("border-right-style","border.style.right"),t.setExtractor("border-bottom-style","border.style.bottom"),t.setExtractor("border-left-style","border.style.left"),t.setReducer("border-color",og("border-color")),t.setReducer("border-style",og("border-style")),t.setReducer("border-width",og("border-width")),t.setReducer("border-top",kg("top")),t.setReducer("border-right",kg("right")),t.setReducer("border-bottom",kg("bottom")),t.setReducer("border-left",kg("left")),t.setReducer("border",function(){return e=>{const n=fg(e,"top"),o=fg(e,"right"),i=fg(e,"bottom"),r=fg(e,"left"),s=[n,o,i,r],a={width:t(s,"width"),style:t(s,"style"),color:t(s,"color")},l=wg(a,"all");if(l.length)return l;const c=Object.entries(a).reduce(((t,[e,n])=>(n&&(t.push([`border-${e}`,n]),s.forEach((t=>t[e]=null))),t)),[]);return[...c,...wg(n,"top"),...wg(o,"right"),...wg(i,"bottom"),...wg(r,"left")]};function t(t,e){return t.map((t=>t[e])).reduce(((t,e)=>t==e?t:null))}}()),t.setStyleRelation("border",["border-color","border-style","border-width","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-width","border-right-width","border-bottom-width","border-left-width"]),t.setStyleRelation("border-color",["border-top-color","border-right-color","border-bottom-color","border-left-color"]),t.setStyleRelation("border-style",["border-top-style","border-right-style","border-bottom-style","border-left-style"]),t.setStyleRelation("border-width",["border-top-width","border-right-width","border-bottom-width","border-left-width"]),t.setStyleRelation("border-top",["border-top-color","border-top-style","border-top-width"]),t.setStyleRelation("border-right",["border-right-color","border-right-style","border-right-width"]),t.setStyleRelation("border-bottom",["border-bottom-color","border-bottom-style","border-bottom-width"]),t.setStyleRelation("border-left",["border-left-color","border-left-style","border-left-width"])}function dg(t){const{color:e,style:n,width:o}=bg(t);return{path:"border",value:{color:ng(e),style:ng(n),width:ng(o)}}}function ug(t){return e=>{const{color:n,style:o,width:i}=bg(e),r={};return void 0!==n&&(r.color={[t]:n}),void 0!==o&&(r.style={[t]:o}),void 0!==i&&(r.width={[t]:i}),{path:"border",value:r}}}function hg(t){return e=>({path:"border",value:mg(e,t)})}function mg(t,e){return{[e]:ng(t)}}function gg(t,e){return n=>({path:"border",value:{[t]:{[e]:n}}})}function pg(t){return(e,n)=>{if(n.border)return fg(n.border,t)}}function fg(t,e){const n={};return t.width&&t.width[e]&&(n.width=t.width[e]),t.style&&t.style[e]&&(n.style=t.style[e]),t.color&&t.color[e]&&(n.color=t.color[e]),n}function bg(t){const e={},n=sg(t);for(const t of n)Wm(t)||/thin|medium|thick/.test(t)?e.width=t:qm(t)?e.style=t:e.color=t;return e}function kg(t){return e=>wg(e,t)}function wg(t,e){const n=[];if(t&&t.width&&n.push("width"),t&&t.style&&n.push("style"),t&&t.color&&n.push("color"),3==n.length){const o=n.map((e=>t[e])).join(" ");return["all"==e?["border",o]:[`border-${e}`,o]]}return"all"==e?[]:n.map((n=>[`border-${e}-${n}`,t[n]]))}function Ag(t){t.setNormalizer("margin",rg("margin")),t.setNormalizer("margin-top",(t=>({path:"margin.top",value:t}))),t.setNormalizer("margin-right",(t=>({path:"margin.right",value:t}))),t.setNormalizer("margin-bottom",(t=>({path:"margin.bottom",value:t}))),t.setNormalizer("margin-left",(t=>({path:"margin.left",value:t}))),t.setReducer("margin",og("margin")),t.setStyleRelation("margin",["margin-top","margin-right","margin-bottom","margin-left"])}function Cg(t){t.setNormalizer("padding",rg("padding")),t.setNormalizer("padding-top",(t=>({path:"padding.top",value:t}))),t.setNormalizer("padding-right",(t=>({path:"padding.right",value:t}))),t.setNormalizer("padding-bottom",(t=>({path:"padding.bottom",value:t}))),t.setNormalizer("padding-left",(t=>({path:"padding.left",value:t}))),t.setReducer("padding",og("padding")),t.setStyleRelation("padding",["padding-top","padding-right","padding-bottom","padding-left"])}class _g extends Od{constructor(t,e){super(t),this.view=e,this._toolbarConfig=nh(t.config.get("toolbar")),this._elementReplacer=new Ca}get element(){return this.view.element}init(t){const e=this.editor,n=this.view,o=e.editing.view,i=n.editable,r=o.document.getRoot();i.name=r.rootName,n.render();const s=i.element;this.setEditableElement(i.name,s),this.focusTracker.add(s),n.editable.bind("isFocused").to(this.focusTracker),o.attachDomRoot(s),t&&this._elementReplacer.replace(t,this.element),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){const t=this.view,e=this.editor.editing.view;this._elementReplacer.restore(),e.detachDomRoot(t.editable.name),t.destroy(),super.destroy()}_initToolbar(){const t=this.editor,e=this.view,n=t.editing.view;e.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused"),e.stickyPanel.limiterElement=e.element,e.stickyPanel.bind("viewportTopOffset").to(this,"viewportOffset",(({top:t})=>t)),e.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory),function({origin:t,originKeystrokeHandler:e,originFocusTracker:n,toolbar:o,beforeFocus:i,afterBlur:r}){n.add(o.element),e.set("Alt+F10",((t,e)=>{n.isFocused&&!o.focusTracker.isFocused&&(i&&i(),o.focus(),e())})),o.keystrokes.set("Esc",((e,n)=>{o.focusTracker.isFocused&&(t.focus(),r&&r(),n())}))}({origin:n,originFocusTracker:this.focusTracker,originKeystrokeHandler:t.keystrokes,toolbar:e.toolbar})}_initPlaceholder(){const t=this.editor,e=t.editing.view,n=e.document.getRoot(),o=t.sourceElement,i=t.config.get("placeholder")||o&&"textarea"===o.tagName.toLowerCase()&&o.getAttribute("placeholder");i&&bm({view:e,element:n,text:i,isDirectHost:!1,keepOnFocus:!0})}}var vg=n(3638),yg={attributes:{"data-cke":!0}};yg.setAttributes=is(),yg.insert=ns().bind(null,"head"),yg.domAPI=ts(),yg.insertStyleElement=ss();Jr()(vg.Z,yg);vg.Z&&vg.Z.locals&&vg.Z.locals;class xg extends Sh{constructor(t,e,n={}){super(t),this.stickyPanel=new um(t),this.toolbar=new rh(t,{shouldGroupWhenFull:n.shouldToolbarGroupWhenFull}),this.editable=new Th(t,e)}render(){super.render(),this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class Eg extends zd{constructor(t,e={}){if(!uo(t)&&void 0!==e.initialData)throw new l("editor-create-initial-data",null);super(e),void 0===this.config.get("initialData")&&this.config.set("initialData",function(t){return uo(t)?(e=t,e instanceof HTMLTextAreaElement?e.value:e.innerHTML):t;var e}(t)),uo(t)&&(this.sourceElement=t),this.model.document.createRoot();const n=!this.config.get("toolbar.shouldNotGroupWhenFull"),o=new xg(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:n});this.ui=new _g(this,o),function(t){if(!Dt(t.updateSourceElement))throw new l("attachtoform-missing-elementapi-interface",t);const e=t.sourceElement;if(e&&"textarea"===e.tagName.toLowerCase()&&e.form){let n;const o=e.form,i=()=>t.updateSourceElement();Dt(o.submit)&&(n=o.submit,o.submit=()=>{i(),n.apply(o)}),o.addEventListener("submit",i),t.on("destroy",(()=>{o.removeEventListener("submit",i),n&&(o.submit=n)}))}}(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(t,e={}){return new Promise((n=>{const o=new this(t,e);n(o.initPlugins().then((()=>o.ui.init(uo(t)?t:null))).then((()=>o.data.init(o.config.get("initialData")))).then((()=>o.fire("ready"))).then((()=>o)))}))}}j(Eg,jd),j(Eg,Fd);const Dg=["left","right","center","justify"];function Sg(t){return Dg.includes(t)}function Ig(t,e){return"rtl"==e.contentLanguageDirection?"right"===t:"left"===t}function Tg(t){const e=t.map((t=>{let e;return e="string"==typeof t?{name:t}:t,e})).filter((t=>{const e=!!Dg.includes(t.name);return e||c("alignment-config-name-not-recognized",{option:t}),e})),n=e.filter((t=>!!t.className)).length;if(n&&n{const i=o.slice(n+1);if(i.some((t=>t.name==e.name)))throw new l("alignment-config-name-already-defined",{option:e,configuredOptions:t});if(e.className){if(i.some((t=>t.className==e.className)))throw new l("alignment-config-classname-already-defined",{option:e,configuredOptions:t})}})),e}const Mg="alignment";class Bg extends H{refresh(){const t=this.editor.locale,e=Ba(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=!!e&&this._canBeAligned(e),this.isEnabled&&e.hasAttribute("alignment")?this.value=e.getAttribute("alignment"):this.value="rtl"===t.contentLanguageDirection?"right":"left"}execute(t={}){const e=this.editor,n=e.locale,o=e.model,i=o.document,r=t.value;o.change((t=>{const e=Array.from(i.selection.getSelectedBlocks()).filter((t=>this._canBeAligned(t))),o=e[0].getAttribute("alignment");Ig(r,n)||o===r||!r?function(t,e){for(const n of t)e.removeAttribute(Mg,n)}(e,t):function(t,e,n){for(const o of t)e.setAttribute(Mg,n,o)}(e,t,r)}))}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,Mg)}}class Ng extends V{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t),t.config.define("alignment",{options:[...Dg.map((t=>({name:t})))]})}init(){const t=this.editor,e=t.locale,n=t.model.schema,o=Tg(t.config.get("alignment.options")).filter((t=>Sg(t.name)&&!Ig(t.name,e))),i=o.some((t=>!!t.className));n.extend("$block",{allowAttributes:"alignment"}),t.model.schema.setAttributeProperties("alignment",{isFormatting:!0}),i?t.conversion.attributeToAttribute(function(t){const e={model:{key:"alignment",values:t.map((t=>t.name))},view:{}};for(const n of t)e.view[n.name]={key:"class",value:n.className};return e}(o)):t.conversion.for("downcast").attributeToAttribute(function(t){const e={model:{key:"alignment",values:t.map((t=>t.name))},view:{}};for(const{name:n}of t)e.view[n]={key:"style",value:{"text-align":n}};return e}(o));const r=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"style",value:{"text-align":n}},model:{key:"alignment",value:n}});return e}(o);for(const e of r)t.conversion.for("upcast").attributeToAttribute(e);const s=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"align",value:n},model:{key:"alignment",value:n}});return e}(o);for(const e of s)t.conversion.for("upcast").attributeToAttribute(e);t.commands.add("alignment",new Bg(t))}}const zg=new Map([["left",Gd.alignLeft],["right",Gd.alignRight],["center",Gd.alignCenter],["justify",Gd.alignJustify]]);class Pg extends V{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor,e=t.ui.componentFactory,n=t.t,o=Tg(t.config.get("alignment.options"));o.map((t=>t.name)).filter(Sg).forEach((t=>this._addButton(t))),e.add("alignment",(i=>{const r=kh(i),s=o.map((t=>e.create(`alignment:${t.name}`)));wh(r,s,{enableActiveItemFocusOnDropdownOpen:!0}),r.buttonView.set({label:n("Text alignment"),tooltip:!0}),r.toolbarView.isVertical=!0,r.toolbarView.ariaLabel=n("Text alignment toolbar"),r.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const a="rtl"===i.contentLanguageDirection?zg.get("right"):zg.get("left");return r.buttonView.bind("icon").toMany(s,"isOn",((...t)=>{const e=t.findIndex((t=>t));return e<0?a:s[e].icon})),r.bind("isEnabled").toMany(s,"isEnabled",((...t)=>t.some((t=>t)))),this.listenTo(r,"execute",(()=>{t.editing.view.focus()})),r}))}_addButton(t){const e=this.editor;e.ui.componentFactory.add(`alignment:${t}`,(n=>{const o=e.commands.get("alignment"),i=new Su(n);return i.set({label:this.localizedOptionTitles[t],icon:zg.get(t),tooltip:!0,isToggleable:!0}),i.bind("isEnabled").to(o),i.bind("isOn").to(o,"value",(e=>e===t)),this.listenTo(i,"execute",(()=>{e.execute("alignment",{value:t}),e.editing.view.focus()})),i}))}}class Lg{constructor(t,e=20){this.model=t,this.size=0,this.limit=e,this.isLocked=!1,this._changeCallback=(t,e)=>{e.isLocal&&e.isUndoable&&e!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch({isTyping:!0})),this._batch}input(t){this.size+=t,this.size>=this.limit&&this._reset(!0)}lock(){this.isLocked=!0}unlock(){this.isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t){this.isLocked&&!t||(this._batch=null,this.size=0)}}class Og extends H{constructor(t,e){super(t),this._buffer=new Lg(t.model,e)}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(t={}){const e=this.editor.model,n=e.document,o=t.text||"",i=o.length,r=t.range?e.createSelection(t.range):n.selection,s=t.resultRange;e.enqueueChange(this._buffer.batch,(t=>{this._buffer.lock(),e.deleteContent(r),o&&e.insertContent(t.createText(o,n.selection.getAttributes()),r),s?t.setSelection(s):r.is("documentSelection")||t.setSelection(r),this._buffer.unlock(),this._buffer.input(i)}))}}function Rg(t){if(t.newChildren.length-t.oldChildren.length!=1)return;const e=function(t,e){const n=[];let o=0,i=null;return t.forEach((t=>{"equal"==t?(r(),o++):"insert"==t?(i&&"insert"==i.type?i.values.push(e[o]):(r(),i={type:"insert",index:o,values:[e[o]]}),o++):i&&"delete"==i.type?i.howMany++:(r(),i={type:"delete",index:o,howMany:1})})),r(),n;function r(){i&&(n.push(i),i=null)}}(Wr(t.oldChildren,t.newChildren,jg),t.newChildren);if(e.length>1)return;const n=e[0];return n.values[0]&&n.values[0].is("$text")?n:void 0}function jg(t,e){return t&&t.is("$text")&&e&&e.is("$text")?t.data===e.data:t===e}function Vg(t,e){const n=e.selection,o=t.shiftKey&&t.keyCode===ur.delete,i=!n.isCollapsed;return o&&i}const Fg=[mr("arrowUp"),mr("arrowRight"),mr("arrowDown"),mr("arrowLeft"),9,16,17,18,19,20,27,33,34,35,36,45,91,93,144,145,173,174,175,176,177,178,179,255];for(let t=112;t<=135;t++)Fg.push(t);function Hg(t){return!(!t.ctrlKey&&!t.metaKey)||Fg.includes(t.keyCode)}class Ug{constructor(t){this.editor=t,this.editing=this.editor.editing}handle(t,e){if(function(t){if(0==t.length)return!1;for(const e of t)if("children"===e.type&&!Rg(e))return!0;return!1}(t))this._handleContainerChildrenMutations(t,e);else for(const n of t)this._handleTextMutation(n,e),this._handleTextNodeInsertion(n)}_handleContainerChildrenMutations(t,e){const n=function(t){const e=t.map((t=>t.node)).reduce(((t,e)=>t.getCommonAncestor(e,{includeSelf:!0})));if(!e)return;return e.getAncestors({includeSelf:!0,parentFirst:!0}).find((t=>t.is("containerElement")||t.is("rootElement")))}(t);if(!n)return;const o=this.editor.editing.view.domConverter.mapViewToDom(n),i=new Cs(this.editor.editing.view.document),r=this.editor.data.toModel(i.domToView(o)).getChild(0),s=this.editor.editing.mapper.toModelElement(n);if(!s)return;const a=Array.from(r.getChildren()),l=Array.from(s.getChildren()),c=a[a.length-1],d=l[l.length-1],u=c&&c.is("element","softBreak"),h=d&&!d.is("element","softBreak");u&&h&&a.pop();const m=this.editor.model.schema;if(!qg(a,m)||!qg(l,m))return;const g=a.map((t=>t.is("$text")?t.data:"@")).join("").replace(/\u00A0/g," "),p=l.map((t=>t.is("$text")?t.data:"@")).join("").replace(/\u00A0/g," ");if(p===g)return;const f=Wr(p,g),{firstChangeAt:b,insertions:k,deletions:w}=Gg(f);let A=null;e&&(A=this.editing.mapper.toModelRange(e.getFirstRange()));const C=g.substr(b,k),_=this.editor.model.createRange(this.editor.model.createPositionAt(s,b),this.editor.model.createPositionAt(s,b+w));this.editor.execute("input",{text:C,range:_,resultRange:A})}_handleTextMutation(t,e){if("text"!=t.type)return;const n=t.newText.replace(/\u00A0/g," "),o=t.oldText.replace(/\u00A0/g," ");if(o===n)return;const i=Wr(o,n),{firstChangeAt:r,insertions:s,deletions:a}=Gg(i);let l=null;e&&(l=this.editing.mapper.toModelRange(e.getFirstRange()));const c=this.editing.view.createPositionAt(t.node,r),d=this.editing.mapper.toModelPosition(c),u=this.editor.model.createRange(d,d.getShiftedBy(a)),h=n.substr(r,s);this.editor.execute("input",{text:h,range:u,resultRange:l})}_handleTextNodeInsertion(t){if("children"!=t.type)return;const e=Rg(t),n=this.editing.view.createPositionAt(t.node,e.index),o=this.editing.mapper.toModelPosition(n),i=e.values[0].data;this.editor.execute("input",{text:i.replace(/\u00A0/g," "),range:this.editor.model.createRange(o)})}}function qg(t,e){return t.every((t=>e.isInline(t)))}function Gg(t){let e=null,n=null;for(let o=0;o{n.deleteContent(n.document.selection)})),t.unlock()}ar.isAndroid?o.document.on("beforeinput",((t,e)=>r(e)),{priority:"lowest"}):o.document.on("keydown",((t,e)=>r(e)),{priority:"lowest"}),o.document.on("compositionstart",(function(){const t=n.document,e=1!==t.selection.rangeCount||t.selection.getFirstRange().isFlat;t.selection.isCollapsed||e||s()}),{priority:"lowest"}),o.document.on("compositionend",(()=>{e=n.createSelection(n.document.selection)}),{priority:"lowest"})}(t),function(t){t.editing.view.document.on("mutations",((e,n,o)=>{new Ug(t).handle(n,o)}))}(t)}}class Zg extends H{constructor(t,e){super(t),this.direction=e,this._buffer=new Lg(t.model,t.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model,n=e.document;e.enqueueChange(this._buffer.batch,(o=>{this._buffer.lock();const i=o.createSelection(t.selection||n.selection),r=t.sequence||1,s=i.isCollapsed;if(i.isCollapsed&&e.modifySelection(i,{direction:this.direction,unit:t.unit,treatEmojiAsSingleUnit:!0}),this._shouldEntireContentBeReplacedWithParagraph(r))return void this._replaceEntireContentWithParagraph(o);if(this._shouldReplaceFirstBlockWithParagraph(i,r))return void this.editor.execute("paragraph",{selection:i});if(i.isCollapsed)return;let a=0;i.getFirstRange().getMinimalFlatRanges().forEach((t=>{a+=Hi(t.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))})),e.deleteContent(i,{doNotResetEntireContent:s,direction:this.direction}),this._buffer.input(a),o.setSelection(i),this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1)return!1;const e=this.editor.model,n=e.document.selection,o=e.schema.getLimitElement(n);if(!(n.isCollapsed&&n.containsEntireContent(o)))return!1;if(!e.schema.checkChild(o,"paragraph"))return!1;const i=o.getChild(0);return!i||"paragraph"!==i.name}_replaceEntireContentWithParagraph(t){const e=this.editor.model,n=e.document.selection,o=e.schema.getLimitElement(n),i=t.createElement("paragraph");t.remove(t.createRangeIn(o)),t.insert(i,o),t.setSelection(i,0)}_shouldReplaceFirstBlockWithParagraph(t,e){const n=this.editor.model;if(e>1||"backward"!=this.direction)return!1;if(!t.isCollapsed)return!1;const o=t.getFirstPosition(),i=n.schema.getLimitElement(o),r=i.getChild(0);return o.parent==r&&(!!t.containsEntireContent(r)&&(!!n.schema.checkChild(i,"paragraph")&&"paragraph"!=r.name))}}class Yg extends Ms{constructor(t){super(t);const e=t.document;let n=0;function o(t,n,o){const i=new Gi(e,"delete",e.selection.getFirstRange());e.fire(i,new ta(e,n,o)),i.stop.called&&t.stop()}e.on("keyup",((t,e)=>{e.keyCode!=ur.delete&&e.keyCode!=ur.backspace||(n=0)})),e.on("keydown",((t,i)=>{if(ar.isWindows&&Vg(i,e))return;const r={};if(i.keyCode==ur.delete)r.direction="forward",r.unit="character";else{if(i.keyCode!=ur.backspace)return;r.direction="backward",r.unit="codePoint"}const s=ar.isMac?i.altKey:i.ctrlKey;r.unit=s?"word":r.unit,r.sequence=++n,o(t,i.domEvent,r)})),ar.isAndroid&&e.on("beforeinput",((e,n)=>{if("deleteContentBackward"!=n.domEvent.inputType)return;const i={unit:"codepoint",direction:"backward",sequence:1},r=n.domTarget.ownerDocument.defaultView.getSelection();r.anchorNode==r.focusNode&&r.anchorOffset+1!=r.focusOffset&&(i.selectionToRemove=t.domConverter.domSelectionToView(r)),o(e,n.domEvent,i)}))}observe(){}}class Kg extends V{static get pluginName(){return"Delete"}init(){const t=this.editor,e=t.editing.view,n=e.document,o=t.model.document;e.addObserver(Yg),this._undoOnBackspace=!1;const i=new Zg(t,"forward");if(t.commands.add("deleteForward",i),t.commands.add("forwardDelete",i),t.commands.add("delete",new Zg(t,"backward")),this.listenTo(n,"delete",((n,o)=>{const i={unit:o.unit,sequence:o.sequence};if(o.selectionToRemove){const e=t.model.createSelection(),n=[];for(const e of o.selectionToRemove.getRanges())n.push(t.editing.mapper.toModelRange(e));e.setTo(n),i.selection=e}t.execute("forward"==o.direction?"deleteForward":"delete",i),o.preventDefault(),e.scrollToTheSelection()}),{priority:"low"}),ar.isAndroid){let t=null;this.listenTo(n,"delete",((e,n)=>{const o=n.domTarget.ownerDocument.defaultView.getSelection();t={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}}),{priority:"lowest"}),this.listenTo(n,"keyup",((e,n)=>{if(t){const e=n.domTarget.ownerDocument.defaultView.getSelection();e.collapse(t.anchorNode,t.anchorOffset),e.extend(t.focusNode,t.focusOffset),t=null}}))}this.editor.plugins.has("UndoEditing")&&(this.listenTo(n,"delete",((e,n)=>{this._undoOnBackspace&&"backward"==n.direction&&1==n.sequence&&"codePoint"==n.unit&&(this._undoOnBackspace=!1,t.execute("undo"),n.preventDefault(),e.stop())}),{context:"$capture"}),this.listenTo(o,"change",(()=>{this._undoOnBackspace=!1})))}requestUndoOnBackspace(){this.editor.plugins.has("UndoEditing")&&(this._undoOnBackspace=!0)}}class $g extends V{static get requires(){return[Wg,Kg]}static get pluginName(){return"Typing"}}function Qg(t,e){let n=t.start;return{text:Array.from(t.getItems()).reduce(((t,o)=>o.is("$text")||o.is("$textProxy")?t+o.data:(n=e.createPositionAfter(o),"")),""),range:e.createRange(n,t.end)}}class Jg{constructor(t,e){this.model=t,this.testCallback=e,this.hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",(()=>{this.isEnabled?this._startListening():(this.stopListening(t.document.selection),this.stopListening(t.document))})),this._startListening()}_startListening(){const t=this.model.document;this.listenTo(t.selection,"change:range",((e,{directChange:n})=>{n&&(t.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this.hasMatch=!1))})),this.listenTo(t,"change:data",((t,e)=>{!e.isUndo&&e.isLocal&&this._evaluateTextBeforeSelection("data",{batch:e})}))}_evaluateTextBeforeSelection(t,e={}){const n=this.model,o=n.document.selection,i=n.createRange(n.createPositionAt(o.focus.parent,0),o.focus),{text:r,range:s}=Qg(i,n),a=this.testCallback(r);if(!a&&this.hasMatch&&this.fire("unmatched"),this.hasMatch=!!a,a){const n=Object.assign(e,{text:r,range:s});"object"==typeof a&&Object.assign(n,a),this.fire(`matched:${t}`,n)}}}j(Jg,N);class Xg extends V{static get pluginName(){return"TwoStepCaretMovement"}constructor(t){super(t),this.attributes=new Set,this._overrideUid=null}init(){const t=this.editor,e=t.model,n=t.editing.view,o=t.locale,i=e.document.selection;this.listenTo(n.document,"arrowKey",((t,e)=>{if(!i.isCollapsed)return;if(e.shiftKey||e.altKey||e.ctrlKey)return;const n=e.keyCode==ur.arrowright,r=e.keyCode==ur.arrowleft;if(!n&&!r)return;const s=o.contentLanguageDirection;let a=!1;a="ltr"===s&&n||"rtl"===s&&r?this._handleForwardMovement(e):this._handleBackwardMovement(e),!0===a&&t.stop()}),{context:"$text",priority:"highest"}),this._isNextGravityRestorationSkipped=!1,this.listenTo(i,"change:range",((t,e)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!e.directChange&&op(i.getFirstPosition(),this.attributes)||this._restoreGravity())}))}registerAttribute(t){this.attributes.add(t)}_handleForwardMovement(t){const e=this.attributes,n=this.editor.model.document.selection,o=n.getFirstPosition();return!this._isGravityOverridden&&((!o.isAtStart||!tp(n,e))&&(op(o,e)?(np(t),this._overrideGravity(),!0):void 0))}_handleBackwardMovement(t){const e=this.attributes,n=this.editor.model,o=n.document.selection,i=o.getFirstPosition();return this._isGravityOverridden?(np(t),this._restoreGravity(),ep(n,e,i),!0):i.isAtStart?!!tp(o,e)&&(np(t),ep(n,e,i),!0):function(t,e){return op(t.getShiftedBy(-1),e)}(i,e)?i.isAtEnd&&!tp(o,e)&&op(i,e)?(np(t),ep(n,e,i),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1):void 0}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((t=>t.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((t=>{t.restoreSelectionGravity(this._overrideUid),this._overrideUid=null}))}}function tp(t,e){for(const n of e)if(t.hasAttribute(n))return!0;return!1}function ep(t,e,n){const o=n.nodeBefore;t.change((t=>{o?t.setSelectionAttribute(o.getAttributes()):t.removeSelectionAttribute(e)}))}function np(t){t.preventDefault()}function op(t,e){const{nodeBefore:n,nodeAfter:o}=t;for(const t of e){const e=n?n.getAttribute(t):void 0;if((o?o.getAttribute(t):void 0)!==e)return!0}return!1}var ip=/[\\^$.*+?()[\]{}|]/g,rp=RegExp(ip.source);const sp=function(t){return(t=Ko(t))&&rp.test(t)?t.replace(ip,"\\$&"):t},ap={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:/(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i,to:[null,"½",null]},oneThird:{from:/(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i,to:[null,"⅓",null]},twoThirds:{from:/(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i,to:[null,"⅔",null]},oneForth:{from:/(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i,to:[null,"¼",null]},threeQuarters:{from:/(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i,to:[null,"¾",null]},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:mp('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:mp("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:mp("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:mp('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:mp('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:mp("'"),to:[null,"‚",null,"’"]}},lp={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},cp=["symbols","mathematical","typography","quotes"];function dp(t){return"string"==typeof t?new RegExp(`(${sp(t)})$`):t}function up(t){return"string"==typeof t?()=>[t]:t instanceof Array?()=>t:t}function hp(t){return(t.textNode?t.textNode:t.nodeAfter).getAttributes()}function mp(t){return new RegExp(`(^|\\s)(${t})([^${t}]*)(${t})$`)}function gp(t,e,n,o){return o.createRange(pp(t,e,n,!0,o),pp(t,e,n,!1,o))}function pp(t,e,n,o,i){let r=t.textNode||(o?t.nodeBefore:t.nodeAfter),s=null;for(;r&&r.getAttribute(e)==n;)s=r,r=o?r.previousSibling:r.nextSibling;return s?i.createPositionAt(s,o?"before":"after"):t}function fp(t,e,n,o){let i,r=null;"function"==typeof o?i=o:(r=t.commands.get(o),i=()=>{t.execute(o)}),t.model.document.on("change:data",((s,a)=>{if(r&&!r.isEnabled||!e.isEnabled)return;const l=Ba(t.model.document.selection.getRanges());if(!l.isCollapsed)return;if(a.isUndo||!a.isLocal)return;const c=Array.from(t.model.document.differ.getChanges()),d=c[0];if(1!=c.length||"insert"!==d.type||"$text"!=d.name||1!=d.length)return;const u=d.position.parent;if(u.is("element","codeBlock"))return;if(u.is("element","listItem")&&"function"!=typeof o&&!["numberedList","bulletedList","todoList"].includes(o))return;if(r&&!0===r.value)return;const h=u.getChild(0),m=t.model.createRangeOn(h);if(!m.containsRange(l)&&!l.end.isEqual(m.end))return;const g=n.exec(h.data.substr(0,l.end.offset));g&&t.model.enqueueChange((e=>{const n=e.createPositionAt(u,0),o=e.createPositionAt(u,g[0].length),r=new bl(n,o);if(!1!==i({match:g})){e.remove(r);const n=t.model.document.selection.getFirstRange(),o=e.createRangeIn(u);!u.isEmpty||o.isEqual(n)||o.containsRange(n,!0)||e.remove(u)}r.detach(),t.model.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function bp(t,e,n,o){let i,r;n instanceof RegExp?i=n:r=n,r=r||(t=>{let e;const n=[],o=[];for(;null!==(e=i.exec(t))&&!(e&&e.length<4);){let{index:t,1:i,2:r,3:s}=e;const a=i+r+s;t+=e[0].length-a.length;const l=[t,t+i.length],c=[t+i.length+r.length,t+i.length+r.length+s.length];n.push(l),n.push(c),o.push([t+i.length,t+i.length+r.length])}return{remove:n,format:o}}),t.model.document.on("change:data",((n,i)=>{if(i.isUndo||!i.isLocal||!e.isEnabled)return;const s=t.model,a=s.document.selection;if(!a.isCollapsed)return;const l=Array.from(s.document.differ.getChanges()),c=l[0];if(1!=l.length||"insert"!==c.type||"$text"!=c.name||1!=c.length)return;const d=a.focus,u=d.parent,{text:h,range:m}=function(t,e){let n=t.start;return{text:Array.from(t.getItems()).reduce(((t,o)=>!o.is("$text")&&!o.is("$textProxy")||o.getAttribute("code")?(n=e.createPositionAfter(o),""):t+o.data),""),range:e.createRange(n,t.end)}}(s.createRange(s.createPositionAt(u,0),d),s),g=r(h),p=kp(m.start,g.format,s),f=kp(m.start,g.remove,s);p.length&&f.length&&s.enqueueChange((e=>{if(!1!==o(e,p)){for(const t of f.reverse())e.remove(t);s.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function kp(t,e,n){return e.filter((t=>void 0!==t[0]&&void 0!==t[1])).map((e=>n.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1]))))}function wp(t,e){return(n,o)=>{if(!t.commands.get(e).isEnabled)return!1;const i=t.model.schema.getValidRanges(o,e);for(const t of i)n.setAttribute(e,!0,t);n.removeSelectionAttribute(e)}}function*Ap(t,e){for(const n of e)n&&t.getAttributeProperties(n[0]).copyOnEnter&&(yield n)}class Cp extends H{execute(){const t=this.editor.model,e=t.document;t.change((n=>{!function(t,e,n,o){const i=n.isCollapsed,r=n.getFirstRange(),s=r.start.parent,a=r.end.parent;if(o.isLimit(s)||o.isLimit(a))return void(i||s!=a||t.deleteContent(n));if(i){const t=Ap(e.model.schema,n.getAttributes());_p(e,r.start),e.setSelectionAttribute(t)}else{const o=!(r.start.isAtStart&&r.end.isAtEnd),i=s==a;t.deleteContent(n,{leaveUnmerged:o}),o&&(i?_p(e,n.focus):e.setSelection(a,0))}}(this.editor.model,n,e.selection,t.schema),this.fire("afterExecute",{writer:n})}))}}function _p(t,e){t.split(e),t.setSelection(e.parent.nextSibling,0)}class vp extends Ms{constructor(t){super(t);const e=this.document;e.on("keydown",((t,n)=>{if(this.isEnabled&&n.keyCode==ur.enter){const o=new Gi(e,"enter",e.selection.getFirstRange());e.fire(o,new ta(e,n.domEvent,{isSoft:n.shiftKey})),o.stop.called&&t.stop()}}))}observe(){}}class yp extends V{static get pluginName(){return"Enter"}init(){const t=this.editor,e=t.editing.view,n=e.document;e.addObserver(vp),t.commands.add("enter",new Cp(t)),this.listenTo(n,"enter",((n,o)=>{o.preventDefault(),o.isSoft||(t.execute("enter"),e.scrollToTheSelection())}),{priority:"low"})}}class xp extends H{execute(){const t=this.editor.model,e=t.document;t.change((n=>{!function(t,e,n){const o=n.isCollapsed,i=n.getFirstRange(),r=i.start.parent,s=i.end.parent,a=r==s;if(o){const o=Ap(t.schema,n.getAttributes());Ep(t,e,i.end),e.removeSelectionAttribute(n.getAttributeKeys()),e.setSelectionAttribute(o)}else{const o=!(i.start.isAtStart&&i.end.isAtEnd);t.deleteContent(n,{leaveUnmerged:o}),a?Ep(t,e,n.focus):o&&e.setSelection(s,0)}}(t,n,e.selection),this.fire("afterExecute",{writer:n})}))}refresh(){const t=this.editor.model,e=t.document;this.isEnabled=function(t,e){if(e.rangeCount>1)return!1;const n=e.anchor;if(!n||!t.checkChild(n,"softBreak"))return!1;const o=e.getFirstRange(),i=o.start.parent,r=o.end.parent;if((Dp(i,t)||Dp(r,t))&&i!==r)return!1;return!0}(t.schema,e.selection)}}function Ep(t,e,n){const o=e.createElement("softBreak");t.insertContent(o,n),e.setSelection(o,"after")}function Dp(t,e){return!t.is("rootElement")&&(e.isLimit(t)||Dp(t.parent,e))}class Sp extends V{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor,e=t.model.schema,n=t.conversion,o=t.editing.view,i=o.document;e.register("softBreak",{allowWhere:"$text",isInline:!0}),n.for("upcast").elementToElement({model:"softBreak",view:"br"}),n.for("downcast").elementToElement({model:"softBreak",view:(t,{writer:e})=>e.createEmptyElement("br")}),o.addObserver(vp),t.commands.add("shiftEnter",new xp(t)),this.listenTo(i,"enter",((e,n)=>{n.preventDefault(),n.isSoft&&(t.execute("shiftEnter"),o.scrollToTheSelection())}),{priority:"low"})}}class Ip extends H{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,n=e.schema,o=e.document.selection,i=Array.from(o.getSelectedBlocks()),r=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(r){const e=i.filter((t=>Tp(t)||Bp(n,t)));this._applyQuote(t,e)}else this._removeQuote(t,i.filter(Tp))}))}_getValue(){const t=Ba(this.editor.model.document.selection.getSelectedBlocks());return!(!t||!Tp(t))}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,n=Ba(t.getSelectedBlocks());return!!n&&Bp(e,n)}_removeQuote(t,e){Mp(t,e).reverse().forEach((e=>{if(e.start.isAtStart&&e.end.isAtEnd)return void t.unwrap(e.start.parent);if(e.start.isAtStart){const n=t.createPositionBefore(e.start.parent);return void t.move(e,n)}e.end.isAtEnd||t.split(e.end);const n=t.createPositionAfter(e.end.parent);t.move(e,n)}))}_applyQuote(t,e){const n=[];Mp(t,e).reverse().forEach((e=>{let o=Tp(e.start);o||(o=t.createElement("blockQuote"),t.wrap(e,o)),n.push(o)})),n.reverse().reduce(((e,n)=>e.nextSibling==n?(t.merge(t.createPositionAfter(e)),e):n))}}function Tp(t){return"blockQuote"==t.parent.name?t.parent:null}function Mp(t,e){let n,o=0;const i=[];for(;o{const o=t.model.document.differ.getChanges();for(const t of o)if("insert"==t.type){const o=t.position.nodeAfter;if(!o)continue;if(o.is("element","blockQuote")&&o.isEmpty)return n.remove(o),!0;if(o.is("element","blockQuote")&&!e.checkChild(t.position,o))return n.unwrap(o),!0;if(o.is("element")){const t=n.createRangeIn(o);for(const o of t.getItems())if(o.is("element","blockQuote")&&!e.checkChild(n.createPositionBefore(o),o))return n.unwrap(o),!0}}else if("remove"==t.type){const e=t.position.parent;if(e.is("element","blockQuote")&&e.isEmpty)return n.remove(e),!0}return!1}));const n=this.editor.editing.view.document,o=t.model.document.selection,i=t.commands.get("blockQuote");this.listenTo(n,"enter",((e,n)=>{if(!o.isCollapsed||!i.value)return;o.getLastPosition().parent.isEmpty&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),n.preventDefault(),e.stop())}),{context:"blockquote"}),this.listenTo(n,"delete",((e,n)=>{if("backward"!=n.direction||!o.isCollapsed||!i.value)return;const r=o.getLastPosition().parent;r.isEmpty&&!r.previousSibling&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),n.preventDefault(),e.stop())}),{context:"blockquote"})}}var zp=n(636),Pp={attributes:{"data-cke":!0}};Pp.setAttributes=is(),Pp.insert=ns().bind(null,"head"),Pp.domAPI=ts(),Pp.insertStyleElement=ss();Jr()(zp.Z,Pp);zp.Z&&zp.Z.locals&&zp.Z.locals;class Lp extends V{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("blockQuote",(n=>{const o=t.commands.get("blockQuote"),i=new Su(n);return i.set({label:e("Block quote"),icon:Gd.quote,tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute("blockQuote"),t.editing.view.focus()})),i}))}}class Op extends H{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,n=e.document.selection,o=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(n.isCollapsed)o?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const i=e.schema.getValidRanges(n.getRanges(),this.attributeKey);for(const e of i)o?t.setAttribute(this.attributeKey,o,e):t.removeAttribute(this.attributeKey,e)}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,n=t.document.selection;if(n.isCollapsed)return n.hasAttribute(this.attributeKey);for(const t of n.getRanges())for(const n of t.getItems())if(e.checkAttribute(n,this.attributeKey))return n.hasAttribute(this.attributeKey);return!1}}const Rp="bold";class jp extends V{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Rp}),t.model.schema.setAttributeProperties(Rp,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:Rp,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e?"bold"==e||Number(e)>=600?{name:!0,styles:["font-weight"]}:void 0:null}]}),t.commands.add(Rp,new Op(t,Rp)),t.keystrokes.set("CTRL+B",Rp)}}const Vp="bold";class Fp extends V{static get pluginName(){return"BoldUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Vp,(n=>{const o=t.commands.get(Vp),i=new Su(n);return i.set({label:e("Bold"),icon:'',keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute(Vp),t.editing.view.focus()})),i}))}}class Hp{constructor(t){this.files=function(t){const e=Array.from(t.files||[]),n=Array.from(t.items||[]);if(e.length)return e;return n.filter((t=>"file"===t.kind)).map((t=>t.getAsFile()))}(t),this._native=t}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}set effectAllowed(t){this._native.effectAllowed=t}get effectAllowed(){return this._native.effectAllowed}set dropEffect(t){this._native.dropEffect=t}get dropEffect(){return this._native.dropEffect}get isCanceled(){return"none"==this._native.dropEffect||!!this._native.mozUserCancelled}}class Up extends ea{constructor(t){super(t);const n=this.document;function o(t){return(o,i)=>{i.preventDefault();const r=i.dropRange?[i.dropRange]:null,s=new e(n,t);n.fire(s,{dataTransfer:i.dataTransfer,method:o.name,targetRanges:r,target:i.target}),s.stop.called&&i.stopPropagation()}}this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"],this.listenTo(n,"paste",o("clipboardInput"),{priority:"low"}),this.listenTo(n,"drop",o("clipboardInput"),{priority:"low"}),this.listenTo(n,"dragover",o("dragging"),{priority:"low"})}onDomEvent(t){const e={dataTransfer:new Hp(t.clipboardData?t.clipboardData:t.dataTransfer)};"drop"!=t.type&&"dragover"!=t.type||(e.dropRange=function(t,e){const n=e.target.ownerDocument,o=e.clientX,i=e.clientY;let r;n.caretRangeFromPoint&&n.caretRangeFromPoint(o,i)?r=n.caretRangeFromPoint(o,i):e.rangeParent&&(r=n.createRange(),r.setStart(e.rangeParent,e.rangeOffset),r.collapse(!0));if(r)return t.domConverter.domRangeToView(r);return null}(this.view,t)),this.fire(t.type,t,e)}}const qp=["figcaption","li"];function Gp(t){let e="";if(t.is("$text")||t.is("$textProxy"))e=t.data;else if(t.is("element","img")&&t.hasAttribute("alt"))e=t.getAttribute("alt");else if(t.is("element","br"))e="\n";else{let n=null;for(const o of t.getChildren()){const t=Gp(o);n&&(n.is("containerElement")||o.is("containerElement"))&&(qp.includes(n.name)||qp.includes(o.name)?e+="\n":e+="\n\n"),e+=t,n=o}}return e}class Wp extends V{static get pluginName(){return"ClipboardPipeline"}init(){this.editor.editing.view.addObserver(Up),this._setupPasteDrop(),this._setupCopyCut()}_setupPasteDrop(){const t=this.editor,n=t.model,o=t.editing.view,i=o.document;this.listenTo(i,"clipboardInput",(e=>{t.isReadOnly&&e.stop()}),{priority:"highest"}),this.listenTo(i,"clipboardInput",((t,n)=>{const i=n.dataTransfer;let r=n.content||"";var s;r||(i.getData("text/html")?r=function(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1==e.length?" ":e)).replace(//g,"")}(i.getData("text/html")):i.getData("text/plain")&&(((s=(s=i.getData("text/plain")).replace(//g,">").replace(/\r?\n\r?\n/g,"

    ").replace(/\r?\n/g,"
    ").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g,"  ")).includes("

    ")||s.includes("
    "))&&(s=`

    ${s}

    `),r=s),r=this.editor.data.htmlProcessor.toView(r));const a=new e(this,"inputTransformation");this.fire(a,{content:r,dataTransfer:i,targetRanges:n.targetRanges,method:n.method}),a.stop.called&&t.stop(),o.scrollToTheSelection()}),{priority:"low"}),this.listenTo(this,"inputTransformation",((t,e)=>{if(e.content.isEmpty)return;const o=this.editor.data.toModel(e.content,"$clipboardHolder");0!=o.childCount&&(t.stop(),n.change((()=>{this.fire("contentInsertion",{content:o,method:e.method,dataTransfer:e.dataTransfer,targetRanges:e.targetRanges})})))}),{priority:"low"}),this.listenTo(this,"contentInsertion",((t,e)=>{e.resultRange=n.insertContent(e.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor,e=t.model.document,n=t.editing.view.document;function o(o,i){const r=i.dataTransfer;i.preventDefault();const s=t.data.toView(t.model.getSelectedContent(e.selection));n.fire("clipboardOutput",{dataTransfer:r,content:s,method:o.name})}this.listenTo(n,"copy",o,{priority:"low"}),this.listenTo(n,"cut",((e,n)=>{t.isReadOnly?n.preventDefault():o(e,n)}),{priority:"low"}),this.listenTo(n,"clipboardOutput",((n,o)=>{o.content.isEmpty||(o.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(o.content)),o.dataTransfer.setData("text/plain",Gp(o.content))),"cut"==o.method&&t.model.deleteContent(e.selection)}),{priority:"low"})}}class Zp{constructor(){this._stack=[]}add(t,e){const n=this._stack,o=n[0];this._insertDescriptor(t);const i=n[0];o===i||Yp(o,i)||this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}remove(t,e){const n=this._stack,o=n[0];this._removeDescriptor(t);const i=n[0];o===i||Yp(o,i)||this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}_insertDescriptor(t){const e=this._stack,n=e.findIndex((e=>e.id===t.id));if(Yp(t,e[n]))return;n>-1&&e.splice(n,1);let o=0;for(;e[o]&&Kp(e[o],t);)o++;e.splice(o,0,t)}_removeDescriptor(t){const e=this._stack,n=e.findIndex((e=>e.id===t));n>-1&&e.splice(n,1)}}function Yp(t,e){return t&&e&&t.priority==e.priority&&$p(t.classes)==$p(e.classes)}function Kp(t,e){return t.priority>e.priority||!(t.priority$p(e.classes)}function $p(t){return Array.isArray(t)?t.sort().join(","):t}j(Zp,k);const Qp='',Jp="ck-widget_selected";function Xp(t){return!!t.is("element")&&!!t.getCustomProperty("widget")}function tf(t,e,n={}){if(!t.is("containerElement"))throw new l("widget-to-widget-wrong-element-type",null,{element:t});return e.setAttribute("contenteditable","false",t),e.addClass("ck-widget",t),e.setCustomProperty("widget",!0,t),t.getFillerOffset=lf,n.label&&function(t,e,n){n.setCustomProperty("widgetLabel",e,t)}(t,n.label,e),n.hasSelectionHandle&&function(t,e){const n=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t),n=new _u;return n.set("content",Qp),n.render(),e.appendChild(n.element),e}));e.insert(e.createPositionAt(t,0),n),e.addClass(["ck-widget_with-selection-handle"],t)}(t,e),of(t,e),t}function ef(t,e,n){if(e.classes&&n.addClass(wo(e.classes),t),e.attributes)for(const o in e.attributes)n.setAttribute(o,e.attributes[o],t)}function nf(t,e,n){if(e.classes&&n.removeClass(wo(e.classes),t),e.attributes)for(const o in e.attributes)n.removeAttribute(o,t)}function of(t,e,n=ef,o=nf){const i=new Zp;i.on("change:top",((e,i)=>{i.oldDescriptor&&o(t,i.oldDescriptor,i.writer),i.newDescriptor&&n(t,i.newDescriptor,i.writer)})),e.setCustomProperty("addHighlight",((t,e,n)=>i.add(e,n)),t),e.setCustomProperty("removeHighlight",((t,e,n)=>i.remove(e,n)),t)}function rf(t){const e=t.getCustomProperty("widgetLabel");return e?"function"==typeof e?e():e:""}function sf(t,e,n={}){return e.addClass(["ck-editor__editable","ck-editor__nested-editable"],t),e.setAttribute("role","textbox",t),n.label&&e.setAttribute("aria-label",n.label,t),e.setAttribute("contenteditable",t.isReadOnly?"false":"true",t),t.on("change:isReadOnly",((n,o,i)=>{e.setAttribute("contenteditable",i?"false":"true",t)})),t.on("change:isFocused",((n,o,i)=>{i?e.addClass("ck-editor__nested-editable_focused",t):e.removeClass("ck-editor__nested-editable_focused",t)})),of(t,e),t}function af(t,e){const n=t.getSelectedElement();if(n){const o=uf(t);if(o)return e.createRange(e.createPositionAt(n,o))}return gd(t,e)}function lf(){return null}const cf="widget-type-around";function df(t,e,n){return t&&Xp(t)&&!n.isInline(e)}function uf(t){return t.getAttribute(cf)}var hf=n(5137),mf={attributes:{"data-cke":!0}};mf.setAttributes=is(),mf.insert=ns().bind(null,"head"),mf.domAPI=ts(),mf.insertStyleElement=ss();Jr()(hf.Z,mf);hf.Z&&hf.Z.locals&&hf.Z.locals;const gf=["before","after"],pf=(new DOMParser).parseFromString('',"image/svg+xml").firstChild,ff="ck-widget__type-around_disabled";class bf extends V{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[yp,Kg]}constructor(t){super(t),this._currentFakeCaretModelElement=null}init(){const t=this.editor,e=t.editing.view;this.on("change:isEnabled",((n,o,i)=>{e.change((t=>{for(const n of e.document.roots)i?t.removeClass(ff,n):t.addClass(ff,n)})),i||t.model.change((t=>{t.removeSelectionAttribute(cf)}))})),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableInsertObjectIntegration(),this._enableDeleteContentIntegration()}destroy(){this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const n=this.editor,o=n.editing.view,i=n.model.schema.getAttributesWithProperty(t,"copyOnReplace",!0);n.execute("insertParagraph",{position:n.model.createPositionAt(t,e),attributes:i}),o.focus(),o.scrollToTheSelection()}_listenToIfEnabled(t,e,n,o){this.listenTo(t,e,((...t)=>{this.isEnabled&&n(...t)}),o)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor.model.document.selection,e=uf(t);if(!e)return!1;const n=t.getSelectedElement();return this._insertParagraph(n,e),!0}_enableTypeAroundUIInjection(){const t=this.editor,e=t.model.schema,n=t.locale.t,o={before:n("Insert paragraph before block"),after:n("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,n,i)=>{const r=i.mapper.toViewElement(n.item);df(r,n.item,e)&&function(t,e,n){const o=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const n=this.toDomElement(t);return function(t,e){for(const n of gf){const o=new Xd({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${n}`],title:e[n]},children:[t.ownerDocument.importNode(pf,!0)]});t.appendChild(o.render())}}(n,e),function(t){const e=new Xd({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}(n),n}));t.insert(t.createPositionAt(n,"end"),o)}(i.writer,o,r)}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor,e=t.model,n=e.document.selection,o=e.schema,i=t.editing.view;function r(t){return`ck-widget_type-around_show-fake-caret_${t}`}this._listenToIfEnabled(i.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[Xp,"$text"],priority:"high"}),this._listenToIfEnabled(n,"change:range",((e,n)=>{n.directChange&&t.model.change((t=>{t.removeSelectionAttribute(cf)}))})),this._listenToIfEnabled(e.document,"change:data",(()=>{const e=n.getSelectedElement();if(e){if(df(t.editing.mapper.toViewElement(e),e,o))return}t.model.change((t=>{t.removeSelectionAttribute(cf)}))})),this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,n)=>{const i=n.writer;if(this._currentFakeCaretModelElement){const t=n.mapper.toViewElement(this._currentFakeCaretModelElement);t&&(i.removeClass(gf.map(r),t),this._currentFakeCaretModelElement=null)}const s=e.selection.getSelectedElement();if(!s)return;const a=n.mapper.toViewElement(s);if(!df(a,s,o))return;const l=uf(e.selection);l&&(i.addClass(r(l),a),this._currentFakeCaretModelElement=s)})),this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,n,o)=>{o||t.model.change((t=>{t.removeSelectionAttribute(cf)}))}))}_handleArrowKeyPress(t,e){const n=this.editor,o=n.model,i=o.document.selection,r=o.schema,s=n.editing.view,a=function(t,e){const n=fr(t,e);return"down"===n||"right"===n}(e.keyCode,n.locale.contentLanguageDirection),l=s.document.selection.getSelectedElement();let c;df(l,n.editing.mapper.toModelElement(l),r)?c=this._handleArrowKeyPressOnSelectedWidget(a):i.isCollapsed?c=this._handleArrowKeyPressWhenSelectionNextToAWidget(a):e.shiftKey||(c=this._handleArrowKeyPressWhenNonCollapsedSelection(a)),c&&(e.preventDefault(),t.stop())}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor.model,n=uf(e.document.selection);return e.change((e=>{if(!n)return e.setSelectionAttribute(cf,t?"after":"before"),!0;if(!(n===(t?"after":"before")))return e.removeSelectionAttribute(cf),!0;return!1}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor,n=e.model,o=n.schema,i=e.plugins.get("Widget"),r=i._getObjectElementNextToSelection(t);return!!df(e.editing.mapper.toViewElement(r),r,o)&&(n.change((e=>{i._setSelectionOverElement(r),e.setSelectionAttribute(cf,t?"before":"after")})),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(t){const e=this.editor,n=e.model,o=n.schema,i=e.editing.mapper,r=n.document.selection,s=t?r.getLastPosition().nodeBefore:r.getFirstPosition().nodeAfter;return!!df(i.toViewElement(s),s,o)&&(n.change((e=>{e.setSelection(s,"on"),e.setSelectionAttribute(cf,t?"after":"before")})),!0)}_enableInsertingParagraphsOnButtonClick(){const t=this.editor,e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((n,o)=>{const i=o.domTarget.closest(".ck-widget__type-around__button");if(!i)return;const r=function(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}(i),s=function(t,e){const n=t.closest(".ck-widget");return e.mapDomToView(n)}(i,e.domConverter),a=t.editing.mapper.toModelElement(s);this._insertParagraph(a,r),o.preventDefault(),n.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor,e=t.model.document.selection,n=t.editing.view;this._listenToIfEnabled(n.document,"enter",((n,o)=>{if("atTarget"!=n.eventPhase)return;const i=e.getSelectedElement(),r=t.editing.mapper.toViewElement(i),s=t.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:df(r,i,s)&&(this._insertParagraph(i,o.isSoft?"before":"after"),a=!0),a&&(o.preventDefault(),n.stop())}),{context:Xp})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor.editing.view,e=[ur.enter,ur.delete,ur.backspace];this._listenToIfEnabled(t.document,"keydown",((t,n)=>{e.includes(n.keyCode)||Hg(n)||this._insertParagraphAccordingToFakeCaretPosition()}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor,e=t.editing.view,n=t.model,o=n.schema;this._listenToIfEnabled(e.document,"delete",((e,i)=>{if("atTarget"!=e.eventPhase)return;const r=uf(n.document.selection);if(!r)return;const s=i.direction,a=n.document.selection.getSelectedElement(),l="forward"==s;if("before"===r===l)t.execute("delete",{selection:n.createSelection(a,"on")});else{const e=o.getNearestSelectionRange(n.createPositionAt(a,r),s);if(e)if(e.isCollapsed){const i=n.createSelection(e.start);if(n.modifySelection(i,{direction:s}),i.focus.isEqual(e.start)){const t=function(t,e){let n=e;for(const o of e.getAncestors({parentFirst:!0})){if(o.childCount>1||t.isLimit(o))break;n=o}return n}(o,e.start.parent);n.deleteContent(n.createSelection(t,"on"),{doNotAutoparagraph:!0})}else n.change((n=>{n.setSelection(e),t.execute(l?"deleteForward":"delete")}))}else n.change((n=>{n.setSelection(e),t.execute(l?"deleteForward":"delete")}))}i.preventDefault(),e.stop()}),{context:Xp})}_enableInsertContentIntegration(){const t=this.editor,e=this.editor.model,n=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[o,i])=>{if(i&&!i.is("documentSelection"))return;const r=uf(n);return r?(t.stop(),e.change((t=>{const i=n.getSelectedElement(),s=e.createPositionAt(i,r),a=t.createSelection(s),l=e.insertContent(o,a);return t.setSelection(a),l}))):void 0}),{priority:"high"})}_enableInsertObjectIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"insertObject",((t,n)=>{const[,o,,i={}]=n;if(o&&!o.is("documentSelection"))return;const r=uf(e);r&&(i.findOptimalPosition=r,n[3]=i)}),{priority:"high"})}_enableDeleteContentIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"deleteContent",((t,[n])=>{if(n&&!n.is("documentSelection"))return;uf(e)&&t.stop()}),{priority:"high"})}}function kf(t){const e=t.model;return(n,o)=>{const i=o.keyCode==ur.arrowup,r=o.keyCode==ur.arrowdown,s=o.shiftKey,a=e.document.selection;if(!i&&!r)return;const l=r;if(s&&function(t,e){return!t.isCollapsed&&t.isBackward==e}(a,l))return;const c=function(t,e,n){const o=t.model;if(n){const t=e.isCollapsed?e.focus:e.getLastPosition(),n=wf(o,t,"forward");if(!n)return null;const i=o.createRange(t,n),r=Af(o.schema,i,"backward");return r?o.createRange(t,r):null}{const t=e.isCollapsed?e.focus:e.getFirstPosition(),n=wf(o,t,"backward");if(!n)return null;const i=o.createRange(n,t),r=Af(o.schema,i,"forward");return r?o.createRange(r,t):null}}(t,a,l);if(c){if(c.isCollapsed){if(a.isCollapsed)return;if(s)return}(c.isCollapsed||function(t,e,n){const o=t.model,i=t.view.domConverter;if(n){const t=o.createSelection(e.start);o.modifySelection(t),t.focus.isAtEnd||e.start.isEqual(t.focus)||(e=o.createRange(t.focus,e.end))}const r=t.mapper.toViewRange(e),s=i.viewRangeToDom(r),a=Da.getDomRangeRects(s);let l;for(const t of a)if(void 0!==l){if(Math.round(t.top)>=l)return!1;l=Math.max(l,Math.round(t.bottom))}else l=Math.round(t.bottom);return!0}(t,c,l))&&(e.change((t=>{const n=l?c.end:c.start;if(s){const o=e.createSelection(a.anchor);o.setFocus(n),t.setSelection(o)}else t.setSelection(n)})),n.stop(),o.preventDefault(),o.stopPropagation())}}}function wf(t,e,n){const o=t.schema,i=t.createRangeIn(e.root),r="forward"==n?"elementStart":"elementEnd";for(const{previousPosition:t,item:s,type:a}of i.getWalker({startPosition:e,direction:n})){if(o.isLimit(s)&&!o.isInline(s))return t;if(a==r&&o.isBlock(s))return null}return null}function Af(t,e,n){const o="backward"==n?e.end:e.start;if(t.checkChild(o,"$text"))return o;for(const{nextPosition:o}of e.getWalker({direction:n}))if(t.checkChild(o,"$text"))return o;return null}var Cf=n(6507),_f={attributes:{"data-cke":!0}};_f.setAttributes=is(),_f.insert=ns().bind(null,"head"),_f.domAPI=ts(),_f.insertStyleElement=ss();Jr()(Cf.Z,_f);Cf.Z&&Cf.Z.locals&&Cf.Z.locals;class vf extends V{static get pluginName(){return"Widget"}static get requires(){return[bf,Kg]}init(){const t=this.editor,e=t.editing.view,n=e.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",((e,n,o)=>{const i=o.writer,r=n.selection;if(r.isCollapsed)return;const s=r.getSelectedElement();if(!s)return;const a=t.editing.mapper.toViewElement(s);Xp(a)&&o.consumable.consume(r,"selection")&&i.setSelection(i.createRangeOn(a),{fake:!0,label:rf(a)})})),this.editor.editing.downcastDispatcher.on("selection",((t,e,n)=>{this._clearPreviouslySelectedWidgets(n.writer);const o=n.writer,i=o.document.selection;let r=null;for(const t of i.getRanges())for(const e of t){const t=e.item;Xp(t)&&!yf(t,r)&&(o.addClass(Jp,t),this._previouslySelected.add(t),r=t)}}),{priority:"low"}),e.addObserver(zm),this.listenTo(n,"mousedown",((...t)=>this._onMousedown(...t))),this.listenTo(n,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[Xp,"$text"]}),this.listenTo(n,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"}),this.listenTo(n,"arrowKey",kf(this.editor.editing),{context:"$text"}),this.listenTo(n,"delete",((t,e)=>{this._handleDelete("forward"==e.direction)&&(e.preventDefault(),t.stop())}),{context:"$root"})}_onMousedown(t,e){const n=this.editor,o=n.editing.view,i=o.document;let r=e.target;if(function(t){for(;t;){if(t.is("editableElement")&&!t.is("rootElement"))return!0;if(Xp(t))return!1;t=t.parent}return!1}(r)){if((ar.isSafari||ar.isGecko)&&e.domEvent.detail>=3){const t=n.editing.mapper,o=r.is("attributeElement")?r.findAncestor((t=>!t.is("attributeElement"))):r,i=t.toModelElement(o);e.preventDefault(),this.editor.model.change((t=>{t.setSelection(i,"in")}))}return}if(!Xp(r)&&(r=r.findAncestor(Xp),!r))return;ar.isAndroid&&e.preventDefault(),i.isFocused||o.focus();const s=n.editing.mapper.toModelElement(r);this._setSelectionOverElement(s)}_handleSelectionChangeOnArrowKeyPress(t,e){const n=e.keyCode,o=this.editor.model,i=o.schema,r=o.document.selection,s=r.getSelectedElement(),a=fr(n,this.editor.locale.contentLanguageDirection),l="down"==a||"right"==a,c="up"==a||"down"==a;if(s&&i.isObject(s)){const n=l?r.getLastPosition():r.getFirstPosition(),s=i.getNearestSelectionRange(n,l?"forward":"backward");return void(s&&(o.change((t=>{t.setSelection(s)})),e.preventDefault(),t.stop()))}if(!r.isCollapsed&&!e.shiftKey){const n=r.getFirstPosition(),s=r.getLastPosition(),a=n.nodeAfter,c=s.nodeBefore;return void((a&&i.isObject(a)||c&&i.isObject(c))&&(o.change((t=>{t.setSelection(l?s:n)})),e.preventDefault(),t.stop()))}if(!r.isCollapsed)return;const d=this._getObjectElementNextToSelection(l);if(d&&i.isObject(d)){if(i.isInline(d)&&c)return;this._setSelectionOverElement(d),e.preventDefault(),t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const n=this.editor.model,o=n.schema,i=n.document.selection.getSelectedElement();i&&o.isObject(i)&&(e.preventDefault(),t.stop())}_handleDelete(t){if(this.editor.isReadOnly)return;const e=this.editor.model.document.selection;if(!e.isCollapsed)return;const n=this._getObjectElementNextToSelection(t);return n?(this.editor.model.change((t=>{let o=e.anchor.parent;for(;o.isEmpty;){const e=o;o=e.parent,t.remove(e)}this._setSelectionOverElement(n)})),!0):void 0}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model,n=e.schema,o=e.document.selection,i=e.createSelection(o);if(e.modifySelection(i,{direction:t?"forward":"backward"}),i.isEqual(o))return null;const r=t?i.focus.nodeBefore:i.focus.nodeAfter;return r&&n.isObject(r)?r:null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected)t.removeClass(Jp,e);this._previouslySelected.clear()}}function yf(t,e){return!!e&&Array.from(t.getAncestors()).includes(e)}const xf=function(t,e,n){var o=!0,i=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return E(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),pa(t,e,{leading:o,maxWait:e,trailing:i})};var Ef=n(390),Df={attributes:{"data-cke":!0}};Df.setAttributes=is(),Df.insert=ns().bind(null,"head"),Df.domAPI=ts(),Df.insertStyleElement=ss();Jr()(Ef.Z,Df);Ef.Z&&Ef.Z.locals&&Ef.Z.locals;class Sf extends V{static get pluginName(){return"DragDrop"}static get requires(){return[Wp,vf]}init(){const t=this.editor,e=t.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,this._updateDropMarkerThrottled=xf((t=>this._updateDropMarker(t)),40),this._removeDropMarkerDelayed=Mf((()=>this._removeDropMarker()),40),this._clearDraggableAttributesDelayed=Mf((()=>this._clearDraggableAttributes()),40),e.addObserver(Up),e.addObserver(zm),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDropMarker(),this._setupDraggableAttributeHandling(),this.listenTo(t,"change:isReadOnly",((t,e,n)=>{n?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})),this.on("change:isEnabled",((t,e,n)=>{n||this._finalizeDragging(!1)})),ar.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._updateDropMarkerThrottled.cancel(),this._removeDropMarkerDelayed.cancel(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const t=this.editor,e=t.model,n=e.document,o=t.editing.view,i=o.document;this.listenTo(i,"dragstart",((o,s)=>{const a=n.selection;if(s.target&&s.target.is("editableElement"))return void s.preventDefault();const l=s.target?Bf(s.target):null;if(l){const n=t.editing.mapper.toModelElement(l);this._draggedRange=bl.fromRange(e.createRangeOn(n)),t.plugins.has("WidgetToolbarRepository")&&t.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}else if(!i.selection.isCollapsed){const t=i.selection.getSelectedElement();t&&Xp(t)||(this._draggedRange=bl.fromRange(a.getFirstRange()))}if(!this._draggedRange)return void s.preventDefault();this._draggingUid=r(),s.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",s.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const c=e.createSelection(this._draggedRange.toRange()),d=t.data.toView(e.getSelectedContent(c));i.fire("clipboardOutput",{dataTransfer:s.dataTransfer,content:d,method:o.name}),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")}),{priority:"low"}),this.listenTo(i,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&"move"==e.dataTransfer.dropEffect)}),{priority:"low"}),this.listenTo(i,"dragenter",(()=>{this.isEnabled&&o.focus()})),this.listenTo(i,"dragleave",(()=>{this._removeDropMarkerDelayed()})),this.listenTo(i,"dragging",((e,n)=>{if(!this.isEnabled)return void(n.dataTransfer.dropEffect="none");this._removeDropMarkerDelayed.cancel();const o=If(t,n.targetRanges,n.target);this._draggedRange||(n.dataTransfer.dropEffect="copy"),ar.isGecko||("copy"==n.dataTransfer.effectAllowed?n.dataTransfer.dropEffect="copy":["all","copyMove"].includes(n.dataTransfer.effectAllowed)&&(n.dataTransfer.dropEffect="move")),o&&this._updateDropMarkerThrottled(o)}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"clipboardInput",((e,n)=>{if("drop"!=n.method)return;const o=If(t,n.targetRanges,n.target);if(this._removeDropMarker(),!o)return this._finalizeDragging(!1),void e.stop();this._draggedRange&&this._draggingUid!=n.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==Tf(n.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(o,!0))return this._finalizeDragging(!1),void e.stop();n.targetRanges=[t.editing.mapper.toViewRange(o)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get(Wp);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const n=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(n)))}),{priority:"high"}),t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const n="move"==Tf(e.dataTransfer),o=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(o&&n)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor,e=t.editing.view,n=e.document;this.listenTo(n,"mousedown",((o,i)=>{if(ar.isAndroid||!i)return;this._clearDraggableAttributesDelayed.cancel();let r=Bf(i.target);if(ar.isBlink&&!t.isReadOnly&&!r&&!n.selection.isCollapsed){const t=n.selection.getSelectedElement();t&&Xp(t)||(r=n.selection.editableElement)}r&&(e.change((t=>{t.setAttribute("draggable","true",r)})),this._draggableElement=t.editing.mapper.toModelElement(r))})),this.listenTo(n,"mouseup",(()=>{ar.isAndroid||this._clearDraggableAttributesDelayed()}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement)),this._draggableElement=null}))}_setupDropMarker(){const t=this.editor;t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:n})=>{if(t.model.schema.checkChild(e.markerRange.start,"$text"))return n.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);return e.innerHTML="⁠⁠",e}))}})}_updateDropMarker(t){const e=this.editor,n=e.model.markers;e.model.change((e=>{n.has("drop-target")?n.get("drop-target").getRange().isEqual(t)||e.updateMarker("drop-target",{range:t}):e.addMarker("drop-target",{range:t,usingOperation:!1,affectsData:!1})}))}_removeDropMarker(){const t=this.editor.model;this._removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),t.markers.has("drop-target")&&t.change((t=>{t.removeMarker("drop-target")}))}_finalizeDragging(t){const e=this.editor,n=e.model;this._removeDropMarker(),this._clearDraggableAttributes(),e.plugins.has("WidgetToolbarRepository")&&e.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop"),this._draggingUid="",this._draggedRange&&(t&&this.isEnabled&&n.deleteContent(n.createSelection(this._draggedRange),{doNotAutoparagraph:!0}),this._draggedRange.detach(),this._draggedRange=null)}}function If(t,e,n){const o=t.model,i=t.editing.mapper;let r=null;const s=e?e[0].start:null;if(n.is("uiElement")&&(n=n.parent),r=function(t,e){const n=t.model,o=t.editing.mapper;if(Xp(e))return n.createRangeOn(o.toModelElement(e));if(!e.is("editableElement")){const t=e.findAncestor((t=>Xp(t)||t.is("editableElement")));if(Xp(t))return n.createRangeOn(o.toModelElement(t))}return null}(t,n),r)return r;const a=function(t,e){const n=t.editing.mapper,o=t.editing.view,i=n.toModelElement(e);if(i)return i;const r=o.createPositionBefore(e),s=n.findMappedViewAncestor(r);return n.toModelElement(s)}(t,n),l=s?i.toModelPosition(s):null;return l?(r=function(t,e,n){const o=t.model;if(!o.schema.checkChild(n,"$block"))return null;const i=o.createPositionAt(n,0),r=e.path.slice(0,i.path.length),s=o.createPositionFromPath(e.root,r).nodeAfter;if(s&&o.schema.isObject(s))return o.createRangeOn(s);return null}(t,l,a),r||(r=o.schema.getNearestSelectionRange(l,ar.isGecko?"forward":"backward"),r||function(t,e){const n=t.model;for(;e;){if(n.schema.isObject(e))return n.createRangeOn(e);e=e.parent}}(t,l.parent))):function(t,e){const n=t.model,o=n.schema,i=n.createPositionAt(e,0);return o.getNearestSelectionRange(i,"forward")}(t,a)}function Tf(t){return ar.isGecko?t.dropEffect:["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function Mf(t,e){let n;function o(...i){o.cancel(),n=setTimeout((()=>t(...i)),e)}return o.cancel=()=>{clearTimeout(n)},o}function Bf(t){if(t.is("editableElement"))return null;if(t.hasClass("ck-widget__selection-handle"))return t.findAncestor(Xp);if(Xp(t))return t;const e=t.findAncestor((t=>Xp(t)||t.is("editableElement")));return Xp(e)?e:null}class Nf extends V{static get pluginName(){return"PastePlainText"}static get requires(){return[Wp]}init(){const t=this.editor,e=t.model,n=t.editing.view,o=n.document,i=e.document.selection;let r=!1;n.addObserver(Up),this.listenTo(o,"keydown",((t,e)=>{r=e.shiftKey})),t.plugins.get(Wp).on("contentInsertion",((t,n)=>{(r||function(t,e){if(t.childCount>1)return!1;const n=t.getChild(0);if(e.isObject(n))return!1;return 0==[...n.getAttributeKeys()].length}(n.content,e.schema))&&e.change((t=>{const o=Array.from(i.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));i.isCollapsed||e.deleteContent(i,{doNotAutoparagraph:!0}),o.push(...i.getAttributes());const r=t.createRangeIn(n.content);for(const e of r.getItems())e.is("$textProxy")&&t.setAttributes(o,e)}))}))}}class zf extends V{static get pluginName(){return"Clipboard"}static get requires(){return[Wp,Sf,Nf]}}class Pf extends H{constructor(t){super(t),this.affectsData=!1}execute(){const t=this.editor.model,e=t.document.selection;let n=t.schema.getLimitElement(e);if(e.containsEntireContent(n)||!Lf(t.schema,n))do{if(n=n.parent,!n)return}while(!Lf(t.schema,n));t.change((t=>{t.setSelection(n,"in")}))}}function Lf(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const Of=gr("Ctrl+A");class Rf extends V{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor,e=t.editing.view.document;t.commands.add("selectAll",new Pf(t)),this.listenTo(e,"keydown",((e,n)=>{mr(n)===Of&&(t.execute("selectAll"),n.preventDefault())}))}}class jf extends V{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(e=>{const n=t.commands.get("selectAll"),o=new Su(e),i=e.t;return o.set({label:i("Select all"),icon:'',keystroke:"Ctrl+A",tooltip:!0}),o.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(o,"execute",(()=>{t.execute("selectAll"),t.editing.view.focus()})),o}))}}class Vf extends V{static get requires(){return[Rf,jf]}static get pluginName(){return"SelectAll"}}class Ff extends H{constructor(t){super(t),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this.listenTo(t.data,"set",((t,e)=>{e[1]={...e[1]};const n=e[1];n.batchType||(n.batchType={isUndoable:!1})}),{priority:"high"}),this.listenTo(t.data,"set",((t,e)=>{e[1].batchType.isUndoable||this.clearStack()}))}refresh(){this.isEnabled=this._stack.length>0}addBatch(t){const e=this.editor.model.document.selection,n={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:n}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(t,e,n){const o=this.editor.model,i=o.document,r=[],s=t.map((t=>t.getTransformedByOperations(n))),a=s.flat();for(const t of s){const e=t.filter((t=>t.root!=i.graveyard)).filter((t=>!Uf(t,a)));e.length&&(Hf(e),r.push(e[0]))}r.length&&o.change((t=>{t.setSelection(r,{backward:e})}))}_undo(t,e){const n=this.editor.model,o=n.document;this._createdBatches.add(e);const i=t.operations.slice().filter((t=>t.isDocumentOperation));i.reverse();for(const t of i){const i=t.baseVersion+1,r=Array.from(o.history.getOperations(i)),s=Em([t.getReversed()],r,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const i of s)e.addOperation(i),n.applyOperation(i),o.history.setOperationAsUndone(t,i)}}}function Hf(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;ee!==t&&e.containsRange(t,!0)))}class qf extends Ff{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1,n=this._stack.splice(e,1)[0],o=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(o,(()=>{this._undo(n.batch,o);const t=this.editor.model.document.history.getOperations(n.batch.baseVersion);this._restoreSelection(n.selection.ranges,n.selection.isBackward,t),this.fire("revert",n.batch,o)})),this.refresh()}}class Gf extends Ff{execute(){const t=this._stack.pop(),e=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(e,(()=>{const n=t.batch.operations[t.batch.operations.length-1].baseVersion+1,o=this.editor.model.document.history.getOperations(n);this._restoreSelection(t.selection.ranges,t.selection.isBackward,o),this._undo(t.batch,e)})),this.refresh()}}class Wf extends V{static get pluginName(){return"UndoEditing"}constructor(t){super(t),this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new qf(t),this._redoCommand=new Gf(t),t.commands.add("undo",this._undoCommand),t.commands.add("redo",this._redoCommand),this.listenTo(t.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation)return;const o=n.batch,i=this._redoCommand._createdBatches.has(o),r=this._undoCommand._createdBatches.has(o);this._batchRegistry.has(o)||(this._batchRegistry.add(o),o.isUndoable&&(i?this._undoCommand.addBatch(o):r||(this._undoCommand.addBatch(o),this._redoCommand.clearStack())))}),{priority:"highest"}),this.listenTo(this._undoCommand,"revert",((t,e,n)=>{this._redoCommand.addBatch(n)})),t.keystrokes.set("CTRL+Z","undo"),t.keystrokes.set("CTRL+Y","redo"),t.keystrokes.set("CTRL+SHIFT+Z","redo")}}const Zf='',Yf='';class Kf extends V{static get pluginName(){return"UndoUI"}init(){const t=this.editor,e=t.locale,n=t.t,o="ltr"==e.uiLanguageDirection?Zf:Yf,i="ltr"==e.uiLanguageDirection?Yf:Zf;this._addButton("undo",n("Undo"),"CTRL+Z",o),this._addButton("redo",n("Redo"),"CTRL+Y",i)}_addButton(t,e,n,o){const i=this.editor;i.ui.componentFactory.add(t,(r=>{const s=i.commands.get(t),a=new Su(r);return a.set({label:e,icon:o,keystroke:n,tooltip:!0}),a.bind("isEnabled").to(s,"isEnabled"),this.listenTo(a,"execute",(()=>{i.execute(t),i.editing.view.focus()})),a}))}}class $f extends V{static get requires(){return[Wf,Kf]}static get pluginName(){return"Undo"}}class Qf extends H{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=e.selection.getAttribute(this.attributeKey),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,n=e.document.selection,o=t.value;e.change((t=>{if(n.isCollapsed)o?t.setSelectionAttribute(this.attributeKey,o):t.removeSelectionAttribute(this.attributeKey);else{const i=e.schema.getValidRanges(n.getRanges(),this.attributeKey);for(const e of i)o?t.setAttribute(this.attributeKey,o,e):t.removeAttribute(this.attributeKey,e)}}))}}class Jf extends bo{constructor(t){super(t),this.set("isEmpty",!0),this.on("change",(()=>{this.set("isEmpty",0===this.length)}))}add(t,e){this.find((e=>e.color===t.color))||super.add(t,e)}hasColor(t){return!!this.find((e=>e.color===t))}}j(Jf,N);var Xf=n(2585),tb={attributes:{"data-cke":!0}};tb.setAttributes=is(),tb.insert=ns().bind(null,"head"),tb.domAPI=ts(),tb.insertStyleElement=ss();Jr()(Xf.Z,tb);Xf.Z&&Xf.Z.locals&&Xf.Z.locals;class eb extends Jd{constructor(t,{colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r}){super(t),this.items=this.createCollection(),this.colorDefinitions=e,this.focusTracker=new za,this.keystrokes=new Pa,this.set("selectedColor"),this.removeButtonLabel=o,this.columns=n,this.documentColors=new Jf,this.documentColorsCount=r,this._focusCycler=new Ou({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this._documentColorsLabel=i,this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-table"]},children:this.items}),this.items.add(this._removeColorButton())}updateDocumentColors(t,e){const n=t.document,o=this.documentColorsCount;this.documentColors.clear();for(const i of n.getRootNames()){const r=n.getRoot(i),s=t.createRangeIn(r);for(const t of s.getItems())if(t.is("$textProxy")&&t.hasAttribute(e)&&(this._addColorToDocumentColors(t.getAttribute(e)),this.documentColors.length>=o))return}}updateSelectedColors(){const t=this.documentColorsGrid,e=this.staticColorsGrid,n=this.selectedColor;e.selectedColor=n,t&&(t.selectedColor=n)}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}appendGrids(){if(!this.staticColorsGrid&&(this.staticColorsGrid=this._createStaticColorsGrid(),this.items.add(this.staticColorsGrid),this.documentColorsCount)){const t=Xd.bind(this.documentColors,this.documentColors),e=new Dh(this.locale);e.text=this._documentColorsLabel,e.extendTemplate({attributes:{class:["ck","ck-color-grid__label",t.if("isEmpty","ck-hidden")]}}),this.items.add(e),this.documentColorsGrid=this._createDocumentColorsGrid(),this.items.add(this.documentColorsGrid)}}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}_removeColorButton(){const t=new Su;return t.set({withText:!0,icon:Gd.eraser,tooltip:!0,label:this.removeButtonLabel}),t.class="ck-color-table__remove-color",t.on("execute",(()=>{this.fire("execute",{value:null})})),t}_createStaticColorsGrid(){const t=new Fu(this.locale,{colorDefinitions:this.colorDefinitions,columns:this.columns});return t.delegate("execute").to(this),t}_createDocumentColorsGrid(){const t=Xd.bind(this.documentColors,this.documentColors),e=new Fu(this.locale,{columns:this.columns});return e.delegate("execute").to(this),e.extendTemplate({attributes:{class:t.if("isEmpty","ck-hidden")}}),e.items.bindTo(this.documentColors).using((t=>{const e=new Pu;return e.set({color:t.color,hasBorder:t.options&&t.options.hasBorder}),t.label&&e.set({label:t.label,tooltip:!0}),e.on("execute",(()=>{this.fire("execute",{value:t.color})})),e})),this.documentColors.on("change:isEmpty",((t,n,o)=>{o&&(e.selectedColor=null)})),e}_addColorToDocumentColors(t){const e=this.colorDefinitions.find((e=>e.color===t));e?this.documentColors.add(Object.assign({},e)):this.documentColors.add({color:t,label:t,options:{hasBorder:!1}})}}const nb="fontSize",ob="fontFamily",ib="fontColor";function rb(t,e){const n={model:{key:t,values:[]},view:{},upcastAlso:{}};for(const t of e)n.model.values.push(t.model),n.view[t.model]=t.view,t.upcastAlso&&(n.upcastAlso[t.model]=t.upcastAlso);return n}function sb(t){return(e,{writer:n})=>n.createAttributeElement("span",{style:`${t}:${e}`},{priority:7})}class ab extends Qf{constructor(t){super(t,ib)}}class lb extends V{static get pluginName(){return"FontColorEditing"}constructor(t){var e;super(t),t.config.define(ib,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5}),t.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{color:/[\s\S]+/}},model:{key:ib,value:(e="color",t=>t.getStyle(e).replace(/\s/g,""))}}),t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{color:/^#?\w+$/}},model:{key:ib,value:t=>t.getAttribute("color")}}),t.conversion.for("downcast").attributeToElement({model:ib,view:sb("color")}),t.commands.add(ib,new ab(t)),t.model.schema.extend("$text",{allowAttributes:ib}),t.model.schema.setAttributeProperties(ib,{isFormatting:!0,copyOnEnter:!0})}}class cb extends V{constructor(t,{commandName:e,icon:n,componentName:o,dropdownLabel:i}){super(t),this.commandName=e,this.componentName=o,this.icon=n,this.dropdownLabel=i,this.columns=t.config.get(`${this.componentName}.columns`),this.colorTableView=void 0}init(){const t=this.editor,e=t.locale,n=e.t,o=t.commands.get(this.commandName),i=Bu(e,Nu(t.config.get(this.componentName).colors)),r=t.config.get(`${this.componentName}.documentColors`);t.ui.componentFactory.add(this.componentName,(e=>{const s=kh(e);return this.colorTableView=function({dropdownView:t,colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r}){const s=t.locale,a=new eb(s,{colors:e,columns:n,removeButtonLabel:o,documentColorsLabel:i,documentColorsCount:r});return t.colorTableView=a,t.panelView.children.add(a),a.delegate("execute").to(t,"execute"),a}({dropdownView:s,colors:i.map((t=>({label:t.label,color:t.model,options:{hasBorder:t.hasBorder}}))),columns:this.columns,removeButtonLabel:n("Remove color"),documentColorsLabel:0!==r?n("Document colors"):void 0,documentColorsCount:void 0===r?this.columns:r}),this.colorTableView.bind("selectedColor").to(o,"value"),s.buttonView.set({label:this.dropdownLabel,icon:this.icon,tooltip:!0}),s.extendTemplate({attributes:{class:"ck-color-ui-dropdown"}}),s.bind("isEnabled").to(o),s.on("execute",((e,n)=>{t.execute(this.commandName,n),t.editing.view.focus()})),s.on("change:isOpen",((e,n,o)=>{s.colorTableView.appendGrids(),o&&(0!==r&&this.colorTableView.updateDocumentColors(t.model,this.componentName),this.colorTableView.updateSelectedColors())})),Ch(s,(()=>s.colorTableView.staticColorsGrid.items.find((t=>t.isOn)))),s}))}}class db extends cb{constructor(t){const e=t.locale.t;super(t,{commandName:ib,componentName:ib,icon:'',dropdownLabel:e("Font Color")})}static get pluginName(){return"FontColorUI"}}class ub extends Qf{constructor(t){super(t,ob)}}function hb(t){return t.map(mb).filter((t=>!!t))}function mb(t){return"object"==typeof t?t:"default"===t?{title:"Default",model:void 0}:"string"==typeof t?function(t){const e=t.replace(/"|'/g,"").split(","),n=e[0],o=e.map(gb).join(", ");return{title:n,model:o,view:{name:"span",styles:{"font-family":o},priority:7}}}(t):void 0}function gb(t){return(t=t.trim()).indexOf(" ")>0&&(t=`'${t}'`),t}class pb extends V{static get pluginName(){return"FontFamilyEditing"}constructor(t){super(t),t.config.define(ob,{options:["default","Arial, Helvetica, sans-serif","Courier New, Courier, monospace","Georgia, serif","Lucida Sans Unicode, Lucida Grande, sans-serif","Tahoma, Geneva, sans-serif","Times New Roman, Times, serif","Trebuchet MS, Helvetica, sans-serif","Verdana, Geneva, sans-serif"],supportAllValues:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:ob}),t.model.schema.setAttributeProperties(ob,{isFormatting:!0,copyOnEnter:!0});const e=hb(t.config.get("fontFamily.options")).filter((t=>t.model)),n=rb(ob,e);t.config.get("fontFamily.supportAllValues")?(this._prepareAnyValueConverters(),this._prepareCompatibilityConverter()):t.conversion.attributeToElement(n),t.commands.add(ob,new ub(t))}_prepareAnyValueConverters(){const t=this.editor;t.conversion.for("downcast").attributeToElement({model:ob,view:(t,{writer:e})=>e.createAttributeElement("span",{style:"font-family:"+t},{priority:7})}),t.conversion.for("upcast").elementToAttribute({model:{key:ob,value:t=>t.getStyle("font-family")},view:{name:"span",styles:{"font-family":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{face:/.*/}},model:{key:ob,value:t=>t.getAttribute("face")}})}}class fb extends V{static get pluginName(){return"FontFamilyUI"}init(){const t=this.editor,e=t.t,n=this._getLocalizedOptions(),o=t.commands.get(ob);t.ui.componentFactory.add(ob,(i=>{const r=kh(i);return Ah(r,function(t,e){const n=new bo;for(const o of t){const t={type:"button",model:new Wh({commandName:ob,commandParam:o.model,label:o.title,withText:!0})};t.model.bind("isOn").to(e,"value",(t=>t===o.model||!(!t||!o.model)&&t.split(",")[0].replace(/'/g,"").toLowerCase()===o.model.toLowerCase())),o.view&&o.view.styles&&t.model.set("labelStyle",`font-family: ${o.view.styles["font-family"]}`),n.add(t)}return n}(n,o)),r.buttonView.set({label:e("Font Family"),icon:'',tooltip:!0}),r.extendTemplate({attributes:{class:"ck-font-family-dropdown"}}),r.bind("isEnabled").to(o),this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam}),t.editing.view.focus()})),r}))}_getLocalizedOptions(){const t=this.editor,e=t.t;return hb(t.config.get(ob).options).map((t=>("Default"===t.title&&(t.title=e("Default")),t)))}}class bb extends Qf{constructor(t){super(t,nb)}}function kb(t){return t.map((t=>function(t){if(e=t,"object"==typeof e&&e.title&&e.model&&e.view)return Ab(t);var e;const n=function(t){return wb[t]||wb[t.model]}(t);if(n)return Ab(n);if("default"===t)return{model:void 0,title:"Default"};if(function(t){let e;if("object"==typeof t){if(!t.model)throw new l("font-size-invalid-definition",null,t);e=parseFloat(t.model)}else e=parseFloat(t);return isNaN(e)}(t))return;return function(t){"number"!=typeof t&&"string"!=typeof t||(t={title:String(t),model:`${parseFloat(t)}px`});return t.view={name:"span",styles:{"font-size":t.model}},Ab(t)}(t)}(t))).filter((t=>!!t))}const wb={get tiny(){return{title:"Tiny",model:"tiny",view:{name:"span",classes:"text-tiny",priority:7}}},get small(){return{title:"Small",model:"small",view:{name:"span",classes:"text-small",priority:7}}},get big(){return{title:"Big",model:"big",view:{name:"span",classes:"text-big",priority:7}}},get huge(){return{title:"Huge",model:"huge",view:{name:"span",classes:"text-huge",priority:7}}}};function Ab(t){return t.view.priority||(t.view.priority=7),t}const Cb=["x-small","x-small","small","medium","large","x-large","xx-large","xxx-large"];class _b extends V{static get pluginName(){return"FontSizeEditing"}constructor(t){super(t),t.config.define(nb,{options:["tiny","small","default","big","huge"],supportAllValues:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:nb}),t.model.schema.setAttributeProperties(nb,{isFormatting:!0,copyOnEnter:!0});const e=t.config.get("fontSize.supportAllValues"),n=kb(this.editor.config.get("fontSize.options")).filter((t=>t.model)),o=rb(nb,n);e?(this._prepareAnyValueConverters(o),this._prepareCompatibilityConverter()):t.conversion.attributeToElement(o),t.commands.add(nb,new bb(t))}_prepareAnyValueConverters(t){const e=this.editor,n=t.model.values.filter((t=>!Wm(String(t))&&!Ym(String(t))));if(n.length)throw new l("font-size-invalid-use-of-named-presets",null,{presets:n});e.conversion.for("downcast").attributeToElement({model:nb,view:(t,{writer:e})=>{if(t)return e.createAttributeElement("span",{style:"font-size:"+t},{priority:7})}}),e.conversion.for("upcast").elementToAttribute({model:{key:nb,value:t=>t.getStyle("font-size")},view:{name:"span",styles:{"font-size":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{size:/^[+-]?\d{1,3}$/}},model:{key:nb,value:t=>{const e=t.getAttribute("size"),n="-"===e[0]||"+"===e[0];let o=parseInt(e,10);n&&(o=3+o);const i=Cb.length-1,r=Math.min(Math.max(o,0),i);return Cb[r]}}})}}var vb=n(6203),yb={attributes:{"data-cke":!0}};yb.setAttributes=is(),yb.insert=ns().bind(null,"head"),yb.domAPI=ts(),yb.insertStyleElement=ss();Jr()(vb.Z,yb);vb.Z&&vb.Z.locals&&vb.Z.locals;class xb extends V{static get pluginName(){return"FontSizeUI"}init(){const t=this.editor,e=t.t,n=this._getLocalizedOptions(),o=t.commands.get(nb);t.ui.componentFactory.add(nb,(i=>{const r=kh(i);return Ah(r,function(t,e){const n=new bo;for(const o of t){const t={type:"button",model:new Wh({commandName:nb,commandParam:o.model,label:o.title,class:"ck-fontsize-option",withText:!0})};o.view&&o.view.styles&&t.model.set("labelStyle",`font-size:${o.view.styles["font-size"]}`),o.view&&o.view.classes&&t.model.set("class",`${t.model.class} ${o.view.classes}`),t.model.bind("isOn").to(e,"value",(t=>t===o.model)),n.add(t)}return n}(n,o)),r.buttonView.set({label:e("Font Size"),icon:'',tooltip:!0}),r.extendTemplate({attributes:{class:["ck-font-size-dropdown"]}}),r.bind("isEnabled").to(o),this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam}),t.editing.view.focus()})),r}))}_getLocalizedOptions(){const t=this.editor,e=t.t,n={Default:e("Default"),Tiny:e("Tiny"),Small:e("Small"),Big:e("Big"),Huge:e("Huge")};return kb(t.config.get(nb).options).map((t=>{const e=n[t.title];return e&&e!=t.title&&(t=Object.assign({},t,{title:e})),t}))}}class Eb extends H{refresh(){const t=this.editor.model,e=Ba(t.document.selection.getSelectedBlocks());this.value=!!e&&e.is("element","paragraph"),this.isEnabled=!!e&&Db(e,t.schema)}execute(t={}){const e=this.editor.model,n=e.document;e.change((o=>{const i=(t.selection||n.selection).getSelectedBlocks();for(const t of i)!t.is("element","paragraph")&&Db(t,e.schema)&&o.rename(t,"paragraph")}))}}function Db(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class Sb extends H{execute(t){const e=this.editor.model,n=t.attributes;let o=t.position;e.change((t=>{const i=t.createElement("paragraph");if(n&&e.schema.setAllowedAttributes(i,n,t),!e.schema.checkChild(o.parent,i)){const n=e.schema.findAllowedParent(o,i);if(!n)return;o=t.split(o,n).position}e.insertContent(i,o),t.setSelection(i,"in")}))}}class Ib extends V{static get pluginName(){return"Paragraph"}init(){const t=this.editor,e=t.model;t.commands.add("paragraph",new Eb(t)),t.commands.add("insertParagraph",new Sb(t)),e.schema.register("paragraph",{inheritAllFrom:"$block"}),t.conversion.elementToElement({model:"paragraph",view:"p"}),t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>Ib.paragraphLikeElements.has(t.name)?t.isEmpty?null:e.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}Ib.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);class Tb extends H{constructor(t,e){super(t),this.modelElements=e}refresh(){const t=Ba(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name,this.isEnabled=!!t&&this.modelElements.some((e=>Mb(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model,n=e.document,o=t.value;e.change((t=>{const i=Array.from(n.selection.getSelectedBlocks()).filter((t=>Mb(t,o,e.schema)));for(const e of i)e.is("element",o)||t.rename(e,o)}))}}function Mb(t,e,n){return n.checkChild(t.parent,e)&&!n.isObject(t)}const Bb="paragraph";class Nb extends V{static get pluginName(){return"HeadingEditing"}constructor(t){super(t),t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[Ib]}init(){const t=this.editor,e=t.config.get("heading.options"),n=[];for(const o of e)o.model!==Bb&&(t.model.schema.register(o.model,{inheritAllFrom:"$block"}),t.conversion.elementToElement(o),n.push(o.model));this._addDefaultH1Conversion(t),t.commands.add("heading",new Tb(t,n))}afterInit(){const t=this.editor,e=t.commands.get("enter"),n=t.config.get("heading.options");e&&this.listenTo(e,"afterExecute",((e,o)=>{const i=t.model.document.selection.getFirstPosition().parent;n.some((t=>i.is("element",t.model)))&&!i.is("element",Bb)&&0===i.childCount&&o.writer.rename(i,Bb)}))}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:s.get("low")+1})}}var zb=n(3230),Pb={attributes:{"data-cke":!0}};Pb.setAttributes=is(),Pb.insert=ns().bind(null,"head"),Pb.domAPI=ts(),Pb.insertStyleElement=ss();Jr()(zb.Z,Pb);zb.Z&&zb.Z.locals&&zb.Z.locals;class Lb extends V{static get pluginName(){return"HeadingUI"}init(){const t=this.editor,e=t.t,n=function(t){const e=t.t,n={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=n[t.title];return e&&e!=t.title&&(t.title=e),t}))}(t),o=e("Choose heading"),i=e("Heading");t.ui.componentFactory.add("heading",(e=>{const r={},s=new bo,a=t.commands.get("heading"),l=t.commands.get("paragraph"),c=[a];for(const t of n){const e={type:"button",model:new Wh({label:t.title,class:t.class,withText:!0})};"paragraph"===t.model?(e.model.bind("isOn").to(l,"value"),e.model.set("commandName","paragraph"),c.push(l)):(e.model.bind("isOn").to(a,"value",(e=>e===t.model)),e.model.set({commandName:"heading",commandValue:t.model})),s.add(e),r[t.model]=t.title}const d=kh(e);return Ah(d,s),d.buttonView.set({isOn:!1,withText:!0,tooltip:i}),d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),d.bind("isEnabled").toMany(c,"isEnabled",((...t)=>t.some((t=>t)))),d.buttonView.bind("label").to(a,"value",l,"value",((t,e)=>{const n=t||e&&"paragraph";return r[n]?r[n]:o})),this.listenTo(d,"execute",(e=>{t.execute(e.source.commandName,e.source.commandValue?{value:e.source.commandValue}:void 0),t.editing.view.focus()})),d}))}}class Ob extends V{static get requires(){return[rm]}static get pluginName(){return"WidgetToolbarRepository"}init(){const t=this.editor;if(t.plugins.has("BalloonToolbar")){const e=t.plugins.get("BalloonToolbar");this.listenTo(e,"show",(e=>{(function(t){const e=t.getSelectedElement();return!(!e||!Xp(e))})(t.editing.view.document.selection)&&e.stop()}),{priority:"high"})}this._toolbarDefinitions=new Map,this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",(()=>{this._updateToolbarsVisibility()})),this.listenTo(t.ui,"update",(()=>{this._updateToolbarsVisibility()})),this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>{this._updateToolbarsVisibility()}),{priority:"low"})}destroy(){super.destroy();for(const t of this._toolbarDefinitions.values())t.view.destroy()}register(t,{ariaLabel:e,items:n,getRelatedElement:o,balloonClassName:i="ck-toolbar-container"}){if(!n.length)return void c("widget-toolbar-no-items",{toolbarId:t});const r=this.editor,s=r.t,a=new rh(r.locale);if(a.ariaLabel=e||s("Widget toolbar"),this._toolbarDefinitions.has(t))throw new l("widget-toolbar-duplicated",this,{toolbarId:t});a.fillFromConfig(n,r.ui.componentFactory),this._toolbarDefinitions.set(t,{view:a,getRelatedElement:o,balloonClassName:i})}_updateToolbarsVisibility(){let t=0,e=null,n=null;for(const o of this._toolbarDefinitions.values()){const i=o.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&i)if(this.editor.ui.focusTracker.isFocused){const r=i.getAncestors().length;r>t&&(t=r,e=i,n=o)}else this._isToolbarVisible(o)&&this._hideToolbar(o);else this._isToolbarInBalloon(o)&&this._hideToolbar(o)}n&&this._showToolbar(n,e)}_hideToolbar(t){this._balloon.remove(t.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(t,e){this._isToolbarVisible(t)?Rb(this.editor,e):this._isToolbarInBalloon(t)||(this._balloon.add({view:t.view,position:jb(this.editor,e),balloonClassName:t.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",(()=>{for(const t of this._toolbarDefinitions.values())if(this._isToolbarVisible(t)){const e=t.getRelatedElement(this.editor.editing.view.document.selection);Rb(this.editor,e)}})))}_isToolbarVisible(t){return this._balloon.visibleView===t.view}_isToolbarInBalloon(t){return this._balloon.hasView(t.view)}}function Rb(t,e){const n=t.plugins.get("ContextualBalloon"),o=jb(t,e);n.updatePosition(o)}function jb(t,e){const n=t.editing.view,o=Jh.defaultPositions;return{target:n.domConverter.mapViewToDom(e),positions:[o.northArrowSouth,o.northArrowSouthWest,o.northArrowSouthEast,o.southArrowNorth,o.southArrowNorthWest,o.southArrowNorthEast,o.viewportStickyNorth]}}class Vb{constructor(t){this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=t,this._referenceCoordinates=null}begin(t,e,n){const o=new Da(e);this.activeHandlePosition=function(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e)if(t.classList.contains(Fb(n)))return n}(t),this._referenceCoordinates=function(t,e){const n=new Da(t),o=e.split("-"),i={x:"right"==o[1]?n.right:n.left,y:"bottom"==o[0]?n.bottom:n.top};return i.x+=t.ownerDocument.defaultView.scrollX,i.y+=t.ownerDocument.defaultView.scrollY,i}(e,function(t){const e=t.split("-"),n={top:"bottom",bottom:"top",left:"right",right:"left"};return`${n[e[0]]}-${n[e[1]]}`}(this.activeHandlePosition)),this.originalWidth=o.width,this.originalHeight=o.height,this.aspectRatio=o.width/o.height;const i=n.style.width;i&&i.match(/^\d+(\.\d*)?%$/)?this.originalWidthPercents=parseFloat(i):this.originalWidthPercents=function(t,e){const n=t.parentElement,o=parseFloat(n.ownerDocument.defaultView.getComputedStyle(n).width);return e.width/o*100}(n,o)}update(t){this.proposedWidth=t.width,this.proposedHeight=t.height,this.proposedWidthPercents=t.widthPercents,this.proposedHandleHostWidth=t.handleHostWidth,this.proposedHandleHostHeight=t.handleHostHeight}}function Fb(t){return`ck-widget__resizer__handle-${t}`}j(Vb,N);class Hb extends Jd{constructor(){super();const t=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-size-view",t.to("_viewPosition",(t=>t?`ck-orientation-${t}`:""))],style:{display:t.if("_isVisible","none",(t=>!t))}},children:[{text:t.to("_label")}]})}_bindToState(t,e){this.bind("_isVisible").to(e,"proposedWidth",e,"proposedHeight",((t,e)=>null!==t&&null!==e)),this.bind("_label").to(e,"proposedHandleHostWidth",e,"proposedHandleHostHeight",e,"proposedWidthPercents",((e,n,o)=>"px"===t.unit?`${e}×${n}`:`${o}%`)),this.bind("_viewPosition").to(e,"activeHandlePosition",e,"proposedHandleHostWidth",e,"proposedHandleHostHeight",((t,e,n)=>e<50||n<50?"above-center":t))}_dismiss(){this.unbind(),this._isVisible=!1}}class Ub{constructor(t){this._options=t,this._viewResizerWrapper=null,this.set("isEnabled",!0),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",(t=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),t.stop())}),{priority:"high"}),this.on("change:isEnabled",(()=>{this.isEnabled&&this.redraw()}))}attach(){const t=this,e=this._options.viewElement;this._options.editor.editing.view.change((n=>{const o=n.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(e){const n=this.toDomElement(e);return t._appendHandles(n),t._appendSizeUI(n),t.on("change:isEnabled",((t,e,o)=>{n.style.display=o?"":"none"})),n.style.display=t.isEnabled?"":"none",n}));n.insert(n.createPositionAt(e,"end"),o),n.addClass("ck-widget_with-resizer",e),this._viewResizerWrapper=o}))}begin(t){this.state=new Vb(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(t,this._getHandleHost(),this._getResizeHost())}updateSize(t){const e=this._proposeNewSize(t);this._options.editor.editing.view.change((t=>{const n=this._options.unit||"%",o=("%"===n?e.widthPercents:e.width)+n;t.setStyle("width",o,this._options.viewElement)}));const n=this._getHandleHost(),o=new Da(n);e.handleHostWidth=Math.round(o.width),e.handleHostHeight=Math.round(o.height);const i=new Da(n);e.width=Math.round(i.width),e.height=Math.round(i.height),this.redraw(o),this.state.update(e)}commit(){const t=this._options.unit||"%",e=("%"===t?this.state.proposedWidthPercents:this.state.proposedWidth)+t;this._options.editor.editing.view.change((()=>{this._cleanup(),this._options.onCommit(e)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(t){const e=this._domResizerWrapper;if(!((n=e)&&n.ownerDocument&&n.ownerDocument.contains(n)))return;var n;const o=e.parentElement,i=this._getHandleHost(),r=this._viewResizerWrapper,s=[r.getStyle("width"),r.getStyle("height"),r.getStyle("left"),r.getStyle("top")];let a;if(o.isSameNode(i)){const e=t||new Da(i);a=[e.width+"px",e.height+"px",void 0,void 0]}else a=[i.offsetWidth+"px",i.offsetHeight+"px",i.offsetLeft+"px",i.offsetTop+"px"];"same"!==Eo(s,a)&&this._options.editor.editing.view.change((t=>{t.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},r)}))}containsHandle(t){return this._domResizerWrapper.contains(t)}static isResizeHandle(t){return t.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change((t=>{t.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(t){const e=this.state,n={x:(o=t).pageX,y:o.pageY};var o;const i=!this._options.isCentered||this._options.isCentered(this),r={x:e._referenceCoordinates.x-(n.x+e.originalWidth),y:n.y-e.originalHeight-e._referenceCoordinates.y};i&&e.activeHandlePosition.endsWith("-right")&&(r.x=n.x-(e._referenceCoordinates.x+e.originalWidth)),i&&(r.x*=2);const s={width:Math.abs(e.originalWidth+r.x),height:Math.abs(e.originalHeight+r.y)};s.dominant=s.width/e.aspectRatio>s.height?"width":"height",s.max=s[s.dominant];const a={width:s.width,height:s.height};return"width"==s.dominant?a.height=a.width/e.aspectRatio:a.width=a.height*e.aspectRatio,{width:Math.round(a.width),height:Math.round(a.height),widthPercents:Math.min(Math.round(e.originalWidthPercents/e.originalWidth*a.width*100)/100,100)}}_getResizeHost(){const t=this._domResizerWrapper.parentElement;return this._options.getResizeHost(t)}_getHandleHost(){const t=this._domResizerWrapper.parentElement;return this._options.getHandleHost(t)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const o of e)t.appendChild(new Xd({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(n=o,`ck-widget__resizer__handle-${n}`)}}).render());var n}_appendSizeUI(t){this._sizeView=new Hb,this._sizeView.render(),t.appendChild(this._sizeView.element)}}j(Ub,N);var qb=n(2263),Gb={attributes:{"data-cke":!0}};Gb.setAttributes=is(),Gb.insert=ns().bind(null,"head"),Gb.domAPI=ts(),Gb.insertStyleElement=ss();Jr()(qb.Z,Gb);qb.Z&&qb.Z.locals&&qb.Z.locals;class Wb extends V{static get pluginName(){return"WidgetResize"}init(){const t=this.editor.editing,e=ms.window.document;this.set("visibleResizer",null),this.set("_activeResizer",null),this._resizers=new Map,t.view.addObserver(zm),this._observer=Object.create(Ss),this.listenTo(t.view.document,"mousedown",this._mouseDownListener.bind(this),{priority:"high"}),this._observer.listenTo(e,"mousemove",this._mouseMoveListener.bind(this)),this._observer.listenTo(e,"mouseup",this._mouseUpListener.bind(this));const n=()=>{this.visibleResizer&&this.visibleResizer.redraw()};this._redrawFocusedResizerThrottled=xf(n,200),this.on("change:visibleResizer",n),this.editor.ui.on("update",this._redrawFocusedResizerThrottled),this.editor.model.document.on("change",(()=>{for(const[t,e]of this._resizers)t.isAttached()||(this._resizers.delete(t),e.destroy())}),{priority:"lowest"}),this._observer.listenTo(ms.window,"resize",this._redrawFocusedResizerThrottled);const o=this.editor.editing.view.document.selection;o.on("change",(()=>{const t=o.getSelectedElement();this.visibleResizer=this.getResizerByViewElement(t)||null}))}destroy(){this._observer.stopListening();for(const t of this._resizers.values())t.destroy();this._redrawFocusedResizerThrottled.cancel()}attachTo(t){const e=new Ub(t),n=this.editor.plugins;if(e.attach(),n.has("WidgetToolbarRepository")){const t=n.get("WidgetToolbarRepository");e.on("begin",(()=>{t.forceDisabled("resize")}),{priority:"lowest"}),e.on("cancel",(()=>{t.clearForceDisabled("resize")}),{priority:"highest"}),e.on("commit",(()=>{t.clearForceDisabled("resize")}),{priority:"highest"})}this._resizers.set(t.viewElement,e);const o=this.editor.editing.view.document.selection.getSelectedElement();return this.getResizerByViewElement(o)==e&&(this.visibleResizer=e),e}getResizerByViewElement(t){return this._resizers.get(t)}_getResizerByHandle(t){for(const e of this._resizers.values())if(e.containsHandle(t))return e}_mouseDownListener(t,e){const n=e.domTarget;Ub.isResizeHandle(n)&&(this._activeResizer=this._getResizerByHandle(n),this._activeResizer&&(this._activeResizer.begin(n),t.stop(),e.preventDefault()))}_mouseMoveListener(t,e){this._activeResizer&&this._activeResizer.updateSize(e)}_mouseUpListener(){this._activeResizer&&(this._activeResizer.commit(),this._activeResizer=null)}}j(Wb,N);class Zb extends H{refresh(){const t=this.editor.model,e=t.schema,n=t.document.selection;this.isEnabled=function(t,e,n){const o=function(t,e){const n=af(t,e).start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(t,n);return e.checkChild(o,"horizontalLine")}(n,e,t)}execute(){const t=this.editor.model;t.change((e=>{const n=e.createElement("horizontalLine");t.insertObject(n,null,null,{setSelection:"after"})}))}}var Yb=n(2536),Kb={attributes:{"data-cke":!0}};Kb.setAttributes=is(),Kb.insert=ns().bind(null,"head"),Kb.domAPI=ts(),Kb.insertStyleElement=ss();Jr()(Yb.Z,Kb);Yb.Z&&Yb.Z.locals&&Yb.Z.locals;class $b extends V{static get pluginName(){return"HorizontalLineEditing"}init(){const t=this.editor,e=t.model.schema,n=t.t,o=t.conversion;e.register("horizontalLine",{inheritAllFrom:"$blockObject"}),o.for("dataDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>e.createEmptyElement("hr")}),o.for("editingDowncast").elementToStructure({model:"horizontalLine",view:(t,{writer:e})=>{const o=n("Horizontal line"),i=e.createContainerElement("div",null,e.createEmptyElement("hr"));return e.addClass("ck-horizontal-line",i),e.setCustomProperty("hr",!0,i),function(t,e,n){return e.setCustomProperty("horizontalLine",!0,t),tf(t,e,{label:n})}(i,e,o)}}),o.for("upcast").elementToElement({view:"hr",model:"horizontalLine"}),t.commands.add("horizontalLine",new Zb(t))}}class Qb extends V{static get pluginName(){return"HorizontalLineUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("horizontalLine",(n=>{const o=t.commands.get("horizontalLine"),i=new Su(n);return i.set({label:e("Horizontal line"),icon:'',tooltip:!0}),i.bind("isEnabled").to(o,"isEnabled"),this.listenTo(i,"execute",(()=>{t.execute("horizontalLine"),t.editing.view.focus()})),i}))}}class Jb extends H{refresh(){const t=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!t,this.isEnabled&&t.hasAttribute("alt")?this.value=t.getAttribute("alt"):this.value=!1}execute(t){const e=this.editor,n=e.plugins.get("ImageUtils"),o=e.model,i=n.getClosestSelectedImageElement(o.document.selection);o.change((e=>{e.setAttribute("alt",t.newValue,i)}))}}function Xb(t){return t.createContainerElement("figure",{class:"image"},[t.createEmptyElement("img"),t.createSlot()])}function tk(t,e){const n=t.plugins.get("ImageUtils"),o=t.plugins.has("ImageInlineEditing")&&t.plugins.has("ImageBlockEditing");return t=>{if(!n.isInlineImageView(t))return null;if(!o)return i(t);return(t.findAncestor(n.isBlockImageView)?"imageBlock":"imageInline")!==e?null:i(t)};function i(t){const e={name:!0};return t.hasAttribute("src")&&(e.attributes=["src"]),e}}function ek(t,e){const n=Ba(e.getSelectedBlocks());return!n||t.isObject(n)||n.isEmpty&&"listItem"!=n.name?"imageBlock":"imageInline"}class nk extends V{static get pluginName(){return"ImageUtils"}isImage(t){return this.isInlineImage(t)||this.isBlockImage(t)}isInlineImageView(t){return!!t&&t.is("element","img")}isBlockImageView(t){return!!t&&t.is("element","figure")&&t.hasClass("image")}insertImage(t={},e=null,n=null){const o=this.editor,i=o.model,r=i.document.selection;n=ok(o,e||r,n),t={...Object.fromEntries(r.getAttributes()),...t};for(const e in t)i.schema.checkAttribute(n,e)||delete t[e];return i.change((o=>{const r=o.createElement(n,t);return i.insertObject(r,e,null,{setSelection:"on",findOptimalPosition:!e&&"imageInline"!=n}),r.parent?r:null}))}getClosestSelectedImageWidget(t){const e=t.getFirstPosition();if(!e)return null;const n=t.getSelectedElement();if(n&&this.isImageWidget(n))return n;let o=e.parent;for(;o;){if(o.is("element")&&this.isImageWidget(o))return o;o=o.parent}return null}getClosestSelectedImageElement(t){const e=t.getSelectedElement();return this.isImage(e)?e:t.getFirstPosition().findAncestor("imageBlock")}isImageAllowed(){const t=this.editor.model.document.selection;return function(t,e){if("imageBlock"==ok(t,e)){const n=function(t,e){const n=af(t,e).start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(e,t.model);if(t.model.schema.checkChild(n,"imageBlock"))return!0}else if(t.model.schema.checkChild(e.focus,"imageInline"))return!0;return!1}(this.editor,t)&&function(t){return[...t.focus.getAncestors()].every((t=>!t.is("element","imageBlock")))}(t)}toImageWidget(t,e,n){e.setCustomProperty("image",!0,t);return tf(t,e,{label:()=>{const e=this.findViewImgElement(t).getAttribute("alt");return e?`${e} ${n}`:n}})}isImageWidget(t){return!!t.getCustomProperty("image")&&Xp(t)}isBlockImage(t){return!!t&&t.is("element","imageBlock")}isInlineImage(t){return!!t&&t.is("element","imageInline")}findViewImgElement(t){if(this.isInlineImageView(t))return t;const e=this.editor.editing.view;for(const{item:n}of e.createRangeIn(t))if(this.isInlineImageView(n))return n}}function ok(t,e,n){const o=t.model.schema,i=t.config.get("image.insert.type");return t.plugins.has("ImageBlockEditing")?t.plugins.has("ImageInlineEditing")?n||("inline"===i?"imageInline":"block"===i?"imageBlock":e.is("selection")?ek(o,e):o.checkChild(e,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}class ik extends V{static get requires(){return[nk]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new Jb(this.editor))}}var rk=n(6831),sk={attributes:{"data-cke":!0}};sk.setAttributes=is(),sk.insert=ns().bind(null,"head"),sk.domAPI=ts(),sk.insertStyleElement=ss();Jr()(rk.Z,sk);rk.Z&&rk.Z.locals&&rk.Z.locals;var ak=n(1590),lk={attributes:{"data-cke":!0}};lk.setAttributes=is(),lk.insert=ns().bind(null,"head"),lk.domAPI=ts(),lk.insertStyleElement=ss();Jr()(ak.Z,lk);ak.Z&&ak.Z.locals&&ak.Z.locals;class ck extends Jd{constructor(t){super(t);const e=this.locale.t;this.focusTracker=new za,this.keystrokes=new Pa,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(e("Save"),Gd.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(e("Cancel"),Gd.cancel,"ck-button-cancel","cancel"),this._focusables=new Kd,this._focusCycler=new Ou({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),Zd(this)}render(){super.render(),this.keystrokes.listenTo(this.element),Yd({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createButton(t,e,n,o){const i=new Su(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}_createLabeledInputView(){const t=this.locale.t,e=new Fh(this.locale,Hh);return e.label=t("Text alternative"),e}}function dk(t){const e=t.editing.view,n=Jh.defaultPositions,o=t.plugins.get("ImageUtils");return{target:e.domConverter.mapViewToDom(o.getClosestSelectedImageWidget(e.document.selection)),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast,n.viewportStickyNorth]}}class uk extends V{static get requires(){return[rm]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const t=this.editor,e=t.t;t.ui.componentFactory.add("imageTextAlternative",(n=>{const o=t.commands.get("imageTextAlternative"),i=new Su(n);return i.set({label:e("Change image text alternative"),icon:Gd.lowVision,tooltip:!0}),i.bind("isEnabled").to(o,"isEnabled"),this.listenTo(i,"execute",(()=>{this._showForm()})),i}))}_createForm(){const t=this.editor,e=t.editing.view.document,n=t.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new ck(t.locale),this._form.render(),this.listenTo(this._form,"submit",(()=>{t.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)})),this.listenTo(this._form,"cancel",(()=>{this._hideForm(!0)})),this._form.keystrokes.set("Esc",((t,e)=>{this._hideForm(!0),e()})),this.listenTo(t.ui,"update",(()=>{n.getClosestSelectedImageWidget(e.selection)?this._isVisible&&function(t){const e=t.plugins.get("ContextualBalloon");if(t.plugins.get("ImageUtils").getClosestSelectedImageWidget(t.editing.view.document.selection)){const n=dk(t);e.updatePosition(n)}}(t):this._hideForm(!0)})),Wd({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const t=this.editor,e=t.commands.get("imageTextAlternative"),n=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:dk(t)}),n.fieldView.value=n.fieldView.element.value=e.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(t){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),t&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class hk extends V{static get requires(){return[ik,uk]}static get pluginName(){return"ImageTextAlternative"}}function mk(t,e){return t=>{t.on(`attribute:srcset:${e}`,n)};function n(e,n,o){if(!o.consumable.consume(n.item,e.name))return;const i=o.writer,r=o.mapper.toViewElement(n.item),s=t.findViewImgElement(r);if(null===n.attributeNewValue){const t=n.attributeOldValue;t.data&&(i.removeAttribute("srcset",s),i.removeAttribute("sizes",s),t.width&&i.removeAttribute("width",s))}else{const t=n.attributeNewValue;t.data&&(i.setAttribute("srcset",t.data,s),i.setAttribute("sizes","100vw",s),t.width&&i.setAttribute("width",t.width,s))}}}function gk(t,e,n){return t=>{t.on(`attribute:${n}:${e}`,o)};function o(e,n,o){if(!o.consumable.consume(n.item,e.name))return;const i=o.writer,r=o.mapper.toViewElement(n.item),s=t.findViewImgElement(r);i.setAttribute(n.attributeKey,n.attributeNewValue||"",s)}}class pk extends Ms{observe(t){this.listenTo(t,"load",((t,e)=>{const n=e.target;this.checkShouldIgnoreEventFromTarget(n)||"IMG"==n.tagName&&this._fireEvents(e)}),{useCapture:!0})}_fireEvents(t){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",t))}}class fk extends H{constructor(t){super(t);const e=t.config.get("image.insert.type");t.plugins.has("ImageBlockEditing")||"block"===e&&c("image-block-plugin-required"),t.plugins.has("ImageInlineEditing")||"inline"===e&&c("image-inline-plugin-required")}refresh(){this.isEnabled=this.editor.plugins.get("ImageUtils").isImageAllowed()}execute(t){const e=wo(t.source),n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageUtils"),i=Object.fromEntries(n.getAttributes());e.forEach(((t,e)=>{const r=n.getSelectedElement();if("string"==typeof t&&(t={src:t}),e&&r&&o.isImage(r)){const e=this.editor.model.createPositionAfter(r);o.insertImage({...t,...i},e)}else o.insertImage({...t,...i})}))}}class bk extends V{static get requires(){return[nk]}static get pluginName(){return"ImageEditing"}init(){const t=this.editor,e=t.conversion;t.editing.view.addObserver(pk),e.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:t=>{const e={data:t.getAttribute("srcset")};return t.hasAttribute("width")&&(e.width=t.getAttribute("width")),e}}});const n=new fk(t);t.commands.add("insertImage",n),t.commands.add("imageInsert",n)}}class kk extends H{constructor(t,e){super(t),this._modelElementName=e}refresh(){const t=this.editor.plugins.get("ImageUtils"),e=t.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=t.isInlineImage(e):this.isEnabled=t.isBlockImage(e)}execute(){const t=this.editor,e=this.editor.model,n=t.plugins.get("ImageUtils"),o=n.getClosestSelectedImageElement(e.document.selection),i=Object.fromEntries(o.getAttributes());return i.src||i.uploadId?e.change((t=>{const r=Array.from(e.markers).filter((t=>t.getRange().containsItem(o))),s=n.insertImage(i,e.createSelection(o,"on"),this._modelElementName);if(!s)return null;const a=t.createRangeOn(s);for(const e of r){const n=e.getRange(),o="$graveyard"!=n.root.rootName?n.getJoined(a,!0):a;t.updateMarker(e,{range:o})}return{oldElement:o,newElement:s}})):null}}class wk extends V{static get requires(){return[bk,nk,Wp]}static get pluginName(){return"ImageBlockEditing"}init(){const t=this.editor;t.model.schema.register("imageBlock",{inheritAllFrom:"$blockObject",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),t.plugins.has("ImageInlineEditing")&&(t.commands.add("imageTypeBlock",new kk(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const t=this.editor,e=t.t,n=t.conversion,o=t.plugins.get("ImageUtils");n.for("dataDowncast").elementToStructure({model:"imageBlock",view:(t,{writer:e})=>Xb(e)}),n.for("editingDowncast").elementToStructure({model:"imageBlock",view:(t,{writer:n})=>o.toImageWidget(Xb(n),n,e("image widget"))}),n.for("downcast").add(gk(o,"imageBlock","src")).add(gk(o,"imageBlock","alt")).add(mk(o,"imageBlock")),n.for("upcast").elementToElement({view:tk(t,"imageBlock"),model:(t,{writer:e})=>e.createElement("imageBlock",t.hasAttribute("src")?{src:t.getAttribute("src")}:null)}).add(function(t){return t=>{t.on("element:figure",e)};function e(e,n,o){if(!o.consumable.test(n.viewItem,{name:!0,classes:"image"}))return;const i=t.findViewImgElement(n.viewItem);if(!i||!o.consumable.test(i,{name:!0}))return;o.consumable.consume(n.viewItem,{name:!0,classes:"image"});const r=Ba(o.convertItem(i,n.modelCursor).modelRange.getItems());r?(o.convertChildren(n.viewItem,r),o.updateConversionResult(r,n)):o.consumable.revert(n.viewItem,{name:!0,classes:"image"})}}(o))}_setupClipboardIntegration(){const t=this.editor,e=t.model,n=t.editing.view,o=t.plugins.get("ImageUtils");this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((i,r)=>{const s=Array.from(r.content.getChildren());let a;if(!s.every(o.isInlineImageView))return;a=r.targetRanges?t.editing.mapper.toModelRange(r.targetRanges[0]):e.document.selection.getFirstRange();const l=e.createSelection(a);if("imageBlock"===ek(e.schema,l)){const t=new Pm(n.document),e=s.map((e=>t.createElement("figure",{class:"image"},e)));r.content=t.createDocumentFragment(e)}}))}}var Ak=n(9048),Ck={attributes:{"data-cke":!0}};Ck.setAttributes=is(),Ck.insert=ns().bind(null,"head"),Ck.domAPI=ts(),Ck.insertStyleElement=ss();Jr()(Ak.Z,Ck);Ak.Z&&Ak.Z.locals&&Ak.Z.locals;class _k extends V{static get requires(){return[wk,vf,hk]}static get pluginName(){return"ImageBlock"}}class vk extends V{static get requires(){return[bk,nk,Wp]}static get pluginName(){return"ImageInlineEditing"}init(){const t=this.editor,e=t.model.schema;e.register("imageInline",{inheritAllFrom:"$inlineObject",allowAttributes:["alt","src","srcset"]}),e.addChildCheck(((t,e)=>{if(t.endsWith("caption")&&"imageInline"===e.name)return!1})),this._setupConversion(),t.plugins.has("ImageBlockEditing")&&(t.commands.add("imageTypeInline",new kk(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const t=this.editor,e=t.t,n=t.conversion,o=t.plugins.get("ImageUtils");n.for("dataDowncast").elementToElement({model:"imageInline",view:(t,{writer:e})=>e.createEmptyElement("img")}),n.for("editingDowncast").elementToStructure({model:"imageInline",view:(t,{writer:n})=>o.toImageWidget(function(t){return t.createContainerElement("span",{class:"image-inline"},t.createEmptyElement("img"))}(n),n,e("image widget"))}),n.for("downcast").add(gk(o,"imageInline","src")).add(gk(o,"imageInline","alt")).add(mk(o,"imageInline")),n.for("upcast").elementToElement({view:tk(t,"imageInline"),model:(t,{writer:e})=>e.createElement("imageInline",t.hasAttribute("src")?{src:t.getAttribute("src")}:null)})}_setupClipboardIntegration(){const t=this.editor,e=t.model,n=t.editing.view,o=t.plugins.get("ImageUtils");this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((i,r)=>{const s=Array.from(r.content.getChildren());let a;if(!s.every(o.isBlockImageView))return;a=r.targetRanges?t.editing.mapper.toModelRange(r.targetRanges[0]):e.document.selection.getFirstRange();const l=e.createSelection(a);if("imageInline"===ek(e.schema,l)){const t=new Pm(n.document),e=s.map((e=>1===e.childCount?(Array.from(e.getAttributes()).forEach((n=>t.setAttribute(...n,o.findViewImgElement(e)))),e.getChild(0)):e));r.content=t.createDocumentFragment(e)}}))}}class yk extends V{static get requires(){return[vk,vf,hk]}static get pluginName(){return"ImageInline"}}class xk extends H{refresh(){const t=this.editor,e=t.plugins.get("ImageUtils").getClosestSelectedImageElement(t.model.document.selection);this.isEnabled=!!e,e&&e.hasAttribute("width")?this.value={width:e.getAttribute("width"),height:null}:this.value=null}execute(t){const e=this.editor,n=e.model,o=e.plugins.get("ImageUtils").getClosestSelectedImageElement(n.document.selection);this.value={width:t.width,height:null},o&&n.change((e=>{e.setAttribute("width",t.width,o)}))}}class Ek extends V{static get requires(){return[nk]}static get pluginName(){return"ImageResizeEditing"}constructor(t){super(t),t.config.define("image",{resizeUnit:"%",resizeOptions:[{name:"resizeImage:original",value:null,icon:"original"},{name:"resizeImage:25",value:"25",icon:"small"},{name:"resizeImage:50",value:"50",icon:"medium"},{name:"resizeImage:75",value:"75",icon:"large"}]})}init(){const t=this.editor,e=new xk(t);this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline"),t.commands.add("resizeImage",e),t.commands.add("imageResize",e)}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:"width"}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:"width"})}_registerConverters(t){const e=this.editor;e.conversion.for("downcast").add((e=>e.on(`attribute:width:${t}`,((t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewElement(e.item);null!==e.attributeNewValue?(o.setStyle("width",e.attributeNewValue,i),o.addClass("image_resized",i)):(o.removeStyle("width",i),o.removeClass("image_resized",i))})))),e.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===t?"figure":"img",styles:{width:/.+/}},model:{key:"width",value:t=>t.getStyle("width")}})}}const Dk={small:Gd.objectSizeSmall,medium:Gd.objectSizeMedium,large:Gd.objectSizeLarge,original:Gd.objectSizeFull};class Sk extends V{static get requires(){return[Ek]}static get pluginName(){return"ImageResizeButtons"}constructor(t){super(t),this._resizeUnit=t.config.get("image.resizeUnit")}init(){const t=this.editor,e=t.config.get("image.resizeOptions"),n=t.commands.get("resizeImage");this.bind("isEnabled").to(n);for(const t of e)this._registerImageResizeButton(t);this._registerImageResizeDropdown(e)}_registerImageResizeButton(t){const e=this.editor,{name:n,value:o,icon:i}=t,r=o?o+this._resizeUnit:null;e.ui.componentFactory.add(n,(n=>{const o=new Su(n),s=e.commands.get("resizeImage"),a=this._getOptionLabelValue(t,!0);if(!Dk[i])throw new l("imageresizebuttons-missing-icon",e,t);return o.set({label:a,icon:Dk[i],tooltip:a,isToggleable:!0}),o.bind("isEnabled").to(this),o.bind("isOn").to(s,"value",Ik(r)),this.listenTo(o,"execute",(()=>{e.execute("resizeImage",{width:r})})),o}))}_registerImageResizeDropdown(t){const e=this.editor,n=e.t,o=t.find((t=>!t.value)),i=i=>{const r=e.commands.get("resizeImage"),s=kh(i,Uu),a=s.buttonView;return a.set({tooltip:n("Resize image"),commandValue:o.value,icon:Dk.medium,isToggleable:!0,label:this._getOptionLabelValue(o),withText:!0,class:"ck-resize-image-button"}),a.bind("label").to(r,"value",(t=>t&&t.width?t.width:this._getOptionLabelValue(o))),s.bind("isOn").to(r),s.bind("isEnabled").to(this),Ah(s,this._getResizeDropdownListItemDefinitions(t,r)),s.listView.ariaLabel=n("Image resize list"),this.listenTo(s,"execute",(t=>{e.execute(t.source.commandName,{width:t.source.commandValue}),e.editing.view.focus()})),s};e.ui.componentFactory.add("resizeImage",i),e.ui.componentFactory.add("imageResize",i)}_getOptionLabelValue(t,e){const n=this.editor.t;return t.label?t.label:e?t.value?n("Resize image to %0",t.value+this._resizeUnit):n("Resize image to the original size"):t.value?t.value+this._resizeUnit:n("Original")}_getResizeDropdownListItemDefinitions(t,e){const n=new bo;return t.map((t=>{const o=t.value?t.value+this._resizeUnit:null,i={type:"button",model:new Wh({commandName:"resizeImage",commandValue:o,label:this._getOptionLabelValue(t),withText:!0,icon:null})};i.model.bind("isOn").to(e,"value",Ik(o)),n.add(i)})),n}}function Ik(t){return e=>null===t&&e===t||e&&e.width===t}const Tk=/(image|image-inline)/,Mk="image_resized";class Bk extends V{static get requires(){return[Wb]}static get pluginName(){return"ImageResizeHandles"}init(){const t=this.editor.commands.get("resizeImage");this.bind("isEnabled").to(t),this._setupResizerCreator()}_setupResizerCreator(){const t=this.editor,e=t.editing.view;e.addObserver(pk),this.listenTo(e.document,"imageLoaded",((n,o)=>{if(!o.target.matches("figure.image.ck-widget > img,figure.image.ck-widget > picture > img,figure.image.ck-widget > a > img,figure.image.ck-widget > a > picture > img,span.image-inline.ck-widget > img,span.image-inline.ck-widget > picture > img"))return;const i=t.editing.view.domConverter,r=i.domToView(o.target).findAncestor({classes:Tk});let s=this.editor.plugins.get(Wb).getResizerByViewElement(r);if(s)return void s.redraw();const a=t.editing.mapper,l=a.toModelElement(r);s=t.plugins.get(Wb).attachTo({unit:t.config.get("image.resizeUnit"),modelElement:l,viewElement:r,editor:t,getHandleHost:t=>t.querySelector("img"),getResizeHost:()=>i.mapViewToDom(a.toViewElement(l.parent)),isCentered(){const t=l.getAttribute("imageStyle");return!t||"block"==t||"alignCenter"==t},onCommit(n){e.change((t=>{t.removeClass(Mk,r)})),t.execute("resizeImage",{width:n})}}),s.on("updateSize",(()=>{r.hasClass(Mk)||e.change((t=>{t.addClass(Mk,r)}))})),s.bind("isEnabled").to(this)}))}}var Nk=n(1043),zk={attributes:{"data-cke":!0}};zk.setAttributes=is(),zk.insert=ns().bind(null,"head"),zk.domAPI=ts(),zk.insertStyleElement=ss();Jr()(Nk.Z,zk);Nk.Z&&Nk.Z.locals&&Nk.Z.locals;class Pk extends H{constructor(t,e){super(t),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(e.map((t=>{if(t.isDefault)for(const e of t.modelElements)this._defaultStyles[e]=t.name;return[t.name,t]})))}refresh(){const t=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!t,this.isEnabled?t.hasAttribute("imageStyle")?this.value=t.getAttribute("imageStyle"):this.value=this._defaultStyles[t.name]:this.value=!1}execute(t={}){const e=this.editor,n=e.model,o=e.plugins.get("ImageUtils");n.change((e=>{const i=t.value;let r=o.getClosestSelectedImageElement(n.document.selection);i&&this.shouldConvertImageType(i,r)&&(this.editor.execute(o.isBlockImage(r)?"imageTypeInline":"imageTypeBlock"),r=o.getClosestSelectedImageElement(n.document.selection)),!i||this._styles.get(i).isDefault?e.removeAttribute("imageStyle",r):e.setAttribute("imageStyle",i,r)}))}shouldConvertImageType(t,e){return!this._styles.get(t).modelElements.includes(e.name)}}const{objectFullWidth:Lk,objectInline:Ok,objectLeft:Rk,objectRight:jk,objectCenter:Vk,objectBlockLeft:Fk,objectBlockRight:Hk}=Gd,Uk={get inline(){return{name:"inline",title:"In line",icon:Ok,modelElements:["imageInline"],isDefault:!0}},get alignLeft(){return{name:"alignLeft",title:"Left aligned image",icon:Rk,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"}},get alignBlockLeft(){return{name:"alignBlockLeft",title:"Left aligned image",icon:Fk,modelElements:["imageBlock"],className:"image-style-block-align-left"}},get alignCenter(){return{name:"alignCenter",title:"Centered image",icon:Vk,modelElements:["imageBlock"],className:"image-style-align-center"}},get alignRight(){return{name:"alignRight",title:"Right aligned image",icon:jk,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"}},get alignBlockRight(){return{name:"alignBlockRight",title:"Right aligned image",icon:Hk,modelElements:["imageBlock"],className:"image-style-block-align-right"}},get block(){return{name:"block",title:"Centered image",icon:Vk,modelElements:["imageBlock"],isDefault:!0}},get side(){return{name:"side",title:"Side image",icon:jk,modelElements:["imageBlock"],className:"image-style-side"}}},qk={full:Lk,left:Fk,right:Hk,center:Vk,inlineLeft:Rk,inlineRight:jk,inline:Ok},Gk=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function Wk(t){c("image-style-configuration-definition-invalid",t)}const Zk={normalizeStyles:function(t){const e=(t.configuredStyles.options||[]).map((t=>function(t){t="string"==typeof t?Uk[t]?{...Uk[t]}:{name:t}:function(t,e){const n={...e};for(const o in t)Object.prototype.hasOwnProperty.call(e,o)||(n[o]=t[o]);return n}(Uk[t.name],t);"string"==typeof t.icon&&(t.icon=qk[t.icon]||t.icon);return t}(t))).filter((e=>function(t,{isBlockPluginLoaded:e,isInlinePluginLoaded:n}){const{modelElements:o,name:i}=t;if(!(o&&o.length&&i))return Wk({style:t}),!1;{const i=[e?"imageBlock":null,n?"imageInline":null];if(!o.some((t=>i.includes(t))))return c("image-style-missing-dependency",{style:t,missingPlugins:o.map((t=>"imageBlock"===t?"ImageBlockEditing":"ImageInlineEditing"))}),!1}return!0}(e,t)));return e},getDefaultStylesConfiguration:function(t,e){return t&&e?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:t?{options:["block","side"]}:e?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(t){return t.has("ImageBlockEditing")&&t.has("ImageInlineEditing")?[...Gk]:[]},warnInvalidStyle:Wk,DEFAULT_OPTIONS:Uk,DEFAULT_ICONS:qk,DEFAULT_DROPDOWN_DEFINITIONS:Gk};function Yk(t,e){for(const n of e)if(n.name===t)return n}class Kk extends V{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[nk]}init(){const{normalizeStyles:t,getDefaultStylesConfiguration:e}=Zk,n=this.editor,o=n.plugins.has("ImageBlockEditing"),i=n.plugins.has("ImageInlineEditing");n.config.define("image.styles",e(o,i)),this.normalizedStyles=t({configuredStyles:n.config.get("image.styles"),isBlockPluginLoaded:o,isInlinePluginLoaded:i}),this._setupConversion(o,i),this._setupPostFixer(),n.commands.add("imageStyle",new Pk(n,this.normalizedStyles))}_setupConversion(t,e){const n=this.editor,o=n.model.schema,i=(r=this.normalizedStyles,(t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=Yk(e.attributeNewValue,r),i=Yk(e.attributeOldValue,r),s=n.mapper.toViewElement(e.item),a=n.writer;i&&a.removeClass(i.className,s),o&&a.addClass(o.className,s)});var r;const s=function(t){const e={imageInline:t.filter((t=>!t.isDefault&&t.modelElements.includes("imageInline"))),imageBlock:t.filter((t=>!t.isDefault&&t.modelElements.includes("imageBlock")))};return(t,n,o)=>{if(!n.modelRange)return;const i=n.viewItem,r=Ba(n.modelRange.getItems());if(r&&o.schema.checkAttribute(r,"imageStyle"))for(const t of e[r.name])o.consumable.consume(i,{classes:t.className})&&o.writer.setAttribute("imageStyle",t.name,r)}}(this.normalizedStyles);n.editing.downcastDispatcher.on("attribute:imageStyle",i),n.data.downcastDispatcher.on("attribute:imageStyle",i),t&&(o.extend("imageBlock",{allowAttributes:"imageStyle"}),n.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),e&&(o.extend("imageInline",{allowAttributes:"imageStyle"}),n.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const t=this.editor,e=t.model.document,n=t.plugins.get(nk),o=new Map(this.normalizedStyles.map((t=>[t.name,t])));e.registerPostFixer((t=>{let i=!1;for(const r of e.differ.getChanges())if("insert"==r.type||"attribute"==r.type&&"imageStyle"==r.attributeKey){let e="insert"==r.type?r.position.nodeAfter:r.range.start.nodeAfter;if(e&&e.is("element","paragraph")&&e.childCount>0&&(e=e.getChild(0)),!n.isImage(e))continue;const s=e.getAttribute("imageStyle");if(!s)continue;const a=o.get(s);a&&a.modelElements.includes(e.name)||(t.removeAttribute("imageStyle",e),i=!0)}return i}))}}var $k=n(4622),Qk={attributes:{"data-cke":!0}};Qk.setAttributes=is(),Qk.insert=ns().bind(null,"head"),Qk.domAPI=ts(),Qk.insertStyleElement=ss();Jr()($k.Z,Qk);$k.Z&&$k.Z.locals&&$k.Z.locals;class Jk extends V{static get requires(){return[Kk]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const t=this.editor.t;return{"Wrap text":t("Wrap text"),"Break text":t("Break text"),"In line":t("In line"),"Full size image":t("Full size image"),"Side image":t("Side image"),"Left aligned image":t("Left aligned image"),"Centered image":t("Centered image"),"Right aligned image":t("Right aligned image")}}init(){const t=this.editor.plugins,e=this.editor.config.get("image.toolbar")||[],n=Xk(t.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const t of n)this._createButton(t);const o=Xk([...e.filter(E),...Zk.getDefaultDropdownDefinitions(t)],this.localizedDefaultStylesTitles);for(const t of o)this._createDropdown(t,n)}_createDropdown(t,e){const n=this.editor.ui.componentFactory;n.add(t.name,(o=>{let i;const{defaultItem:r,items:s,title:a}=t,l=s.filter((t=>e.find((({name:e})=>tw(e)===t)))).map((t=>{const e=n.create(t);return t===r&&(i=e),e}));s.length!==l.length&&Zk.warnInvalidStyle({dropdown:t});const c=kh(o,Wu),d=c.buttonView,u=d.arrowView;return wh(c,l,{enableActiveItemFocusOnDropdownOpen:!0}),d.set({label:ew(a,i.label),class:null,tooltip:!0}),u.unbind("label"),u.set({label:a}),d.bind("icon").toMany(l,"isOn",((...t)=>{const e=t.findIndex(hi);return e<0?i.icon:l[e].icon})),d.bind("label").toMany(l,"isOn",((...t)=>{const e=t.findIndex(hi);return ew(a,e<0?i.label:l[e].label)})),d.bind("isOn").toMany(l,"isOn",((...t)=>t.some(hi))),d.bind("class").toMany(l,"isOn",((...t)=>t.some(hi)?"ck-splitbutton_flatten":null)),d.on("execute",(()=>{l.some((({isOn:t})=>t))?c.isOpen=!c.isOpen:i.fire("execute")})),c.bind("isEnabled").toMany(l,"isEnabled",((...t)=>t.some(hi))),this.listenTo(c,"execute",(()=>{this.editor.editing.view.focus()})),c}))}_createButton(t){const e=t.name;this.editor.ui.componentFactory.add(tw(e),(n=>{const o=this.editor.commands.get("imageStyle"),i=new Su(n);return i.set({label:t.title,icon:t.icon,tooltip:!0,isToggleable:!0}),i.bind("isEnabled").to(o,"isEnabled"),i.bind("isOn").to(o,"value",(t=>t===e)),i.on("execute",this._executeCommand.bind(this,e)),i}))}_executeCommand(t){this.editor.execute("imageStyle",{value:t}),this.editor.editing.view.focus()}}function Xk(t,e){for(const n of t)e[n.title]&&(n.title=e[n.title]);return t}function tw(t){return`imageStyle:${t}`}function ew(t,e){return(t?t+": ":"")+e}class nw{constructor(){const t=new window.FileReader;this._reader=t,this._data=void 0,this.set("loaded",0),t.onprogress=t=>{this.loaded=t.loaded}}get error(){return this._reader.error}get data(){return this._data}read(t){const e=this._reader;return this.total=t.size,new Promise(((n,o)=>{e.onload=()=>{const t=e.result;this._data=t,n(t)},e.onerror=()=>{o("error")},e.onabort=()=>{o("aborted")},this._reader.readAsDataURL(t)}))}abort(){this._reader.abort()}}j(nw,N);class ow extends V{static get pluginName(){return"FileRepository"}static get requires(){return[Hd]}init(){this.loaders=new bo,this.loaders.on("add",(()=>this._updatePendingAction())),this.loaders.on("remove",(()=>this._updatePendingAction())),this._loadersMap=new Map,this._pendingAction=null,this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0))}getLoader(t){return this._loadersMap.get(t)||null}createLoader(t){if(!this.createUploadAdapter)return c("filerepository-no-upload-adapter"),null;const e=new iw(Promise.resolve(t),this.createUploadAdapter);return this.loaders.add(e),this._loadersMap.set(t,e),t instanceof Promise&&e.file.then((t=>{this._loadersMap.set(t,e)})).catch((()=>{})),e.on("change:uploaded",(()=>{let t=0;for(const e of this.loaders)t+=e.uploaded;this.uploaded=t})),e.on("change:uploadTotal",(()=>{let t=0;for(const e of this.loaders)e.uploadTotal&&(t+=e.uploadTotal);this.uploadTotal=t})),e}destroyLoader(t){const e=t instanceof iw?t:this.getLoader(t);e._destroy(),this.loaders.remove(e),this._loadersMap.forEach(((t,n)=>{t===e&&this._loadersMap.delete(n)}))}_updatePendingAction(){const t=this.editor.plugins.get(Hd);if(this.loaders.length){if(!this._pendingAction){const e=this.editor.t,n=t=>`${e("Upload in progress")} ${parseInt(t)}%.`;this._pendingAction=t.add(n(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",n)}}else t.remove(this._pendingAction),this._pendingAction=null}}j(ow,N);class iw{constructor(t,e){this.id=r(),this._filePromiseWrapper=this._createFilePromiseWrapper(t),this._adapter=e(this),this._reader=new nw,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0)),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then((t=>this._filePromiseWrapper?t:null)):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new l("filerepository-read-wrong-status",this);return this.status="reading",this.file.then((t=>this._reader.read(t))).then((t=>{if("reading"!==this.status)throw this.status;return this.status="idle",t})).catch((t=>{if("aborted"===t)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:t}))}upload(){if("idle"!=this.status)throw new l("filerepository-upload-wrong-status",this);return this.status="uploading",this.file.then((()=>this._adapter.upload())).then((t=>(this.uploadResponse=t,this.status="idle",t))).catch((t=>{if("aborted"===this.status)throw"aborted";throw this.status="error",t}))}abort(){const t=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==t?this._reader.abort():"uploading"==t&&this._adapter.abort&&this._adapter.abort():(this._filePromiseWrapper.promise.catch((()=>{})),this._filePromiseWrapper.rejecter("aborted")),this._destroy()}_destroy(){this._filePromiseWrapper=void 0,this._reader=void 0,this._adapter=void 0,this.uploadResponse=void 0}_createFilePromiseWrapper(t){const e={};return e.promise=new Promise(((n,o)=>{e.rejecter=o,e.isFulfilled=!1,t.then((t=>{e.isFulfilled=!0,n(t)})).catch((t=>{e.isFulfilled=!0,o(t)}))})),e}}j(iw,N);class rw extends Jd{constructor(t){super(t),this.buttonView=new Su(t),this._fileInputView=new sw(t),this._fileInputView.bind("acceptedType").to(this),this._fileInputView.bind("allowMultipleFiles").to(this),this._fileInputView.delegate("done").to(this),this.setTemplate({tag:"span",attributes:{class:"ck-file-dialog-button"},children:[this.buttonView,this._fileInputView]}),this.buttonView.on("execute",(()=>{this._fileInputView.open()}))}focus(){this.buttonView.focus()}}class sw extends Jd{constructor(t){super(t),this.set("acceptedType"),this.set("allowMultipleFiles",!1);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:e.to("acceptedType"),multiple:e.to("allowMultipleFiles")},on:{change:e.to((()=>{this.element&&this.element.files&&this.element.files.length&&this.fire("done",this.element.files),this.element.value=""}))}})}open(){this.element.click()}}class aw{constructor(t,e){this.loader=t,this.options=e}upload(){return this.loader.file.then((t=>new Promise(((e,n)=>{this._initRequest(),this._initListeners(e,n,t),this._sendRequest(t)}))))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const t=this.xhr=new XMLHttpRequest;t.open("POST",this.options.uploadUrl,!0),t.responseType="json"}_initListeners(t,e,n){const o=this.xhr,i=this.loader,r=`Couldn't upload file: ${n.name}.`;o.addEventListener("error",(()=>e(r))),o.addEventListener("abort",(()=>e())),o.addEventListener("load",(()=>{const n=o.response;if(!n||n.error)return e(n&&n.error&&n.error.message?n.error.message:r);const i=n.url?{default:n.url}:n.urls;t({...n,urls:i})})),o.upload&&o.upload.addEventListener("progress",(t=>{t.lengthComputable&&(i.uploadTotal=t.total,i.uploaded=t.loaded)}))}_sendRequest(t){const e=this.options.headers||{},n=this.options.withCredentials||!1;for(const t of Object.keys(e))this.xhr.setRequestHeader(t,e[t]);this.xhr.withCredentials=n;const o=new FormData;o.append("upload",t),this.xhr.send(o)}}function lw(t){const e=t.map((t=>t.replace("+","\\+")));return new RegExp(`^image\\/(${e.join("|")})$`)}function cw(t){return new Promise(((e,n)=>{const o=t.getAttribute("src");fetch(o).then((t=>t.blob())).then((t=>{const n=dw(t,o),i=n.replace("image/",""),r=new File([t],`image.${i}`,{type:n});e(r)})).catch((t=>t&&"TypeError"===t.name?function(t){return function(t){return new Promise(((e,n)=>{const o=ms.document.createElement("img");o.addEventListener("load",(()=>{const t=ms.document.createElement("canvas");t.width=o.width,t.height=o.height;t.getContext("2d").drawImage(o,0,0),t.toBlob((t=>t?e(t):n()))})),o.addEventListener("error",(()=>n())),o.src=t}))}(t).then((e=>{const n=dw(e,t),o=n.replace("image/","");return new File([e],`image.${o}`,{type:n})}))}(o).then(e).catch(n):n(t)))}))}function dw(t,e){return t.type?t.type:e.match(/data:(image\/\w+);base64/)?e.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class uw extends V{static get pluginName(){return"ImageUploadUI"}init(){const t=this.editor,e=t.t,n=n=>{const o=new rw(n),i=t.commands.get("uploadImage"),r=t.config.get("image.upload.types"),s=lw(r);return o.set({acceptedType:r.map((t=>`image/${t}`)).join(","),allowMultipleFiles:!0}),o.buttonView.set({label:e("Insert image"),icon:Gd.image,tooltip:!0}),o.buttonView.bind("isEnabled").to(i),o.on("done",((e,n)=>{const o=Array.from(n).filter((t=>s.test(t.type)));o.length&&t.execute("uploadImage",{file:o})})),o};t.ui.componentFactory.add("uploadImage",n),t.ui.componentFactory.add("imageUpload",n)}}var hw=n(5870),mw={attributes:{"data-cke":!0}};mw.setAttributes=is(),mw.insert=ns().bind(null,"head"),mw.domAPI=ts(),mw.insertStyleElement=ss();Jr()(hw.Z,mw);hw.Z&&hw.Z.locals&&hw.Z.locals;var gw=n(9899),pw={attributes:{"data-cke":!0}};pw.setAttributes=is(),pw.insert=ns().bind(null,"head"),pw.domAPI=ts(),pw.insertStyleElement=ss();Jr()(gw.Z,pw);gw.Z&&gw.Z.locals&&gw.Z.locals;var fw=n(9825),bw={attributes:{"data-cke":!0}};bw.setAttributes=is(),bw.insert=ns().bind(null,"head"),bw.domAPI=ts(),bw.insertStyleElement=ss();Jr()(fw.Z,bw);fw.Z&&fw.Z.locals&&fw.Z.locals;class kw extends V{static get pluginName(){return"ImageUploadProgress"}constructor(t){super(t),this.placeholder="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="}init(){const t=this.editor;t.plugins.has("ImageBlockEditing")&&t.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",((...t)=>this.uploadStatusChange(...t))),t.plugins.has("ImageInlineEditing")&&t.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",((...t)=>this.uploadStatusChange(...t)))}uploadStatusChange(t,e,n){const o=this.editor,i=e.item,r=i.getAttribute("uploadId");if(!n.consumable.consume(e.item,t.name))return;const s=o.plugins.get("ImageUtils"),a=o.plugins.get(ow),l=r?e.attributeNewValue:null,c=this.placeholder,d=o.editing.mapper.toViewElement(i),u=n.writer;if("reading"==l)return ww(d,u),void Aw(s,c,d,u);if("uploading"==l){const t=a.loaders.get(r);return ww(d,u),void(t?(Cw(d,u),function(t,e,n,o){const i=function(t){const e=t.createUIElement("div",{class:"ck-progress-bar"});return t.setCustomProperty("progressBar",!0,e),e}(e);e.insert(e.createPositionAt(t,"end"),i),n.on("change:uploadedPercent",((t,e,n)=>{o.change((t=>{t.setStyle("width",n+"%",i)}))}))}(d,u,t,o.editing.view),function(t,e,n,o){if(o.data){const i=t.findViewImgElement(e);n.setAttribute("src",o.data,i)}}(s,d,u,t)):Aw(s,c,d,u))}"complete"==l&&a.loaders.get(r)&&function(t,e,n){const o=e.createUIElement("div",{class:"ck-image-upload-complete-icon"});e.insert(e.createPositionAt(t,"end"),o),setTimeout((()=>{n.change((t=>t.remove(t.createRangeOn(o))))}),3e3)}(d,u,o.editing.view),function(t,e){vw(t,e,"progressBar")}(d,u),Cw(d,u),function(t,e){e.removeClass("ck-appear",t)}(d,u)}}function ww(t,e){t.hasClass("ck-appear")||e.addClass("ck-appear",t)}function Aw(t,e,n,o){n.hasClass("ck-image-upload-placeholder")||o.addClass("ck-image-upload-placeholder",n);const i=t.findViewImgElement(n);i.getAttribute("src")!==e&&o.setAttribute("src",e,i),_w(n,"placeholder")||o.insert(o.createPositionAfter(i),function(t){const e=t.createUIElement("div",{class:"ck-upload-placeholder-loader"});return t.setCustomProperty("placeholder",!0,e),e}(o))}function Cw(t,e){t.hasClass("ck-image-upload-placeholder")&&e.removeClass("ck-image-upload-placeholder",t),vw(t,e,"placeholder")}function _w(t,e){for(const n of t.getChildren())if(n.getCustomProperty(e))return n}function vw(t,e,n){const o=_w(t,n);o&&e.remove(e.createRangeOn(o))}class yw extends H{refresh(){const t=this.editor,e=t.plugins.get("ImageUtils"),n=t.model.document.selection.getSelectedElement();this.isEnabled=e.isImageAllowed()||e.isImage(n)}execute(t){const e=wo(t.file),n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageUtils"),i=Object.fromEntries(n.getAttributes());e.forEach(((t,e)=>{const r=n.getSelectedElement();if(e&&r&&o.isImage(r)){const e=this.editor.model.createPositionAfter(r);this._uploadImage(t,i,e)}else this._uploadImage(t,i)}))}_uploadImage(t,e,n){const o=this.editor,i=o.plugins.get(ow).createLoader(t),r=o.plugins.get("ImageUtils");i&&r.insertImage({...e,uploadId:i.id},n)}}class xw extends V{static get requires(){return[ow,Gh,Wp,nk]}static get pluginName(){return"ImageUploadEditing"}constructor(t){super(t),t.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const t=this.editor,e=t.model.document,n=t.conversion,o=t.plugins.get(ow),i=t.plugins.get("ImageUtils"),r=lw(t.config.get("image.upload.types")),s=new yw(t);t.commands.add("uploadImage",s),t.commands.add("imageUpload",s),n.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(t.editing.view.document,"clipboardInput",((e,n)=>{if(o=n.dataTransfer,Array.from(o.types).includes("text/html")&&""!==o.getData("text/html"))return;var o;const i=Array.from(n.dataTransfer.files).filter((t=>!!t&&r.test(t.type)));i.length&&(e.stop(),t.model.change((e=>{n.targetRanges&&e.setSelection(n.targetRanges.map((e=>t.editing.mapper.toModelRange(e)))),t.model.enqueueChange((()=>{t.execute("uploadImage",{file:i})}))})))})),this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((e,n)=>{const r=Array.from(t.editing.view.createRangeIn(n.content)).filter((t=>function(t,e){return!(!t.isInlineImageView(e)||!e.getAttribute("src"))&&(e.getAttribute("src").match(/^data:image\/\w+;base64,/g)||e.getAttribute("src").match(/^blob:/g))}(i,t.item)&&!t.item.getAttribute("uploadProcessed"))).map((t=>({promise:cw(t.item),imageElement:t.item})));if(!r.length)return;const s=new Pm(t.editing.view.document);for(const t of r){s.setAttribute("uploadProcessed",!0,t.imageElement);const e=o.createLoader(t.promise);e&&(s.setAttribute("src","",t.imageElement),s.setAttribute("uploadId",e.id,t.imageElement))}})),t.editing.view.document.on("dragover",((t,e)=>{e.preventDefault()})),e.on("change",(()=>{const n=e.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),i=new Set;for(const e of n)if("insert"==e.type&&"$text"!=e.name){const n=e.position.nodeAfter,r="$graveyard"==e.position.root.rootName;for(const e of Ew(t,n)){const t=e.getAttribute("uploadId");if(!t)continue;const n=o.loaders.get(t);n&&(r?i.has(t)||n.abort():(i.add(t),this._uploadImageElements.set(t,e),"idle"==n.status&&this._readAndUpload(n)))}}})),this.on("uploadComplete",((t,{imageElement:e,data:n})=>{const o=n.urls?n.urls:n;this.editor.model.change((t=>{t.setAttribute("src",o.default,e),this._parseAndSetSrcsetAttributeOnImage(o,e,t)}))}),{priority:"low"})}afterInit(){const t=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&t.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&t.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(t){const e=this.editor,n=e.model,o=e.locale.t,i=e.plugins.get(ow),r=e.plugins.get(Gh),s=e.plugins.get("ImageUtils"),a=this._uploadImageElements;return n.enqueueChange({isUndoable:!1},(e=>{e.setAttribute("uploadStatus","reading",a.get(t.id))})),t.read().then((()=>{const o=t.upload(),i=a.get(t.id);if(ar.isSafari){const t=e.editing.mapper.toViewElement(i),n=s.findViewImgElement(t);e.editing.view.once("render",(()=>{if(!n.parent)return;const t=e.editing.view.domConverter.mapViewToDom(n.parent);if(!t)return;const o=t.style.display;t.style.display="none",t._ckHack=t.offsetHeight,t.style.display=o}))}return n.enqueueChange({isUndoable:!1},(t=>{t.setAttribute("uploadStatus","uploading",i)})),o})).then((e=>{n.enqueueChange({isUndoable:!1},(n=>{const o=a.get(t.id);n.setAttribute("uploadStatus","complete",o),this.fire("uploadComplete",{data:e,imageElement:o})})),l()})).catch((e=>{if("error"!==t.status&&"aborted"!==t.status)throw e;"error"==t.status&&e&&r.showWarning(e,{title:o("Upload failed"),namespace:"upload"}),n.enqueueChange({isUndoable:!1},(e=>{e.remove(a.get(t.id))})),l()}));function l(){n.enqueueChange({isUndoable:!1},(e=>{const n=a.get(t.id);e.removeAttribute("uploadId",n),e.removeAttribute("uploadStatus",n),a.delete(t.id)})),i.destroyLoader(t)}}_parseAndSetSrcsetAttributeOnImage(t,e,n){let o=0;const i=Object.keys(t).filter((t=>{const e=parseInt(t,10);if(!isNaN(e))return o=Math.max(o,e),!0})).map((e=>`${t[e]} ${e}w`)).join(", ");""!=i&&n.setAttribute("srcset",{data:i,width:o},e)}}function Ew(t,e){const n=t.plugins.get("ImageUtils");return Array.from(t.model.createRangeOn(e)).filter((t=>n.isImage(t.item))).map((t=>t.item))}class Dw extends V{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new q(t)),t.commands.add("outdent",new q(t))}}const Sw='',Iw='';class Tw extends V{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,n=t.t,o="ltr"==e.uiLanguageDirection?Sw:Iw,i="ltr"==e.uiLanguageDirection?Iw:Sw;this._defineButton("indent",n("Increase indent"),o),this._defineButton("outdent",n("Decrease indent"),i)}_defineButton(t,e,n){const o=this.editor;o.ui.componentFactory.add(t,(i=>{const r=o.commands.get(t),s=new Su(i);return s.set({label:e,icon:n,tooltip:!0}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(s,"execute",(()=>{o.execute(t),o.editing.view.focus()})),s}))}}class Mw extends H{constructor(t,e){super(t),this._indentBehavior=e}refresh(){const t=this.editor.model,e=Ba(t.document.selection.getSelectedBlocks());e&&t.schema.checkAttribute(e,"blockIndent")?this.isEnabled=this._indentBehavior.checkEnabled(e.getAttribute("blockIndent")):this.isEnabled=!1}execute(){const t=this.editor.model,e=function(t){const e=t.document.selection,n=t.schema;return Array.from(e.getSelectedBlocks()).filter((t=>n.checkAttribute(t,"blockIndent")))}(t);t.change((t=>{for(const n of e){const e=n.getAttribute("blockIndent"),o=this._indentBehavior.getNextIndent(e);o?t.setAttribute("blockIndent",o,n):t.removeAttribute("blockIndent",n)}}))}}class Bw{constructor(t){this.isForward="forward"===t.direction,this.offset=t.offset,this.unit=t.unit}checkEnabled(t){const e=parseFloat(t||0);return this.isForward||e>0}getNextIndent(t){const e=parseFloat(t||0);if(!(!t||t.endsWith(this.unit)))return this.isForward?this.offset+this.unit:void 0;const n=e+(this.isForward?this.offset:-this.offset);return n>0?n+this.unit:void 0}}class Nw{constructor(t){this.isForward="forward"===t.direction,this.classes=t.classes}checkEnabled(t){const e=this.classes.indexOf(t);return this.isForward?e=0}getNextIndent(t){const e=this.classes.indexOf(t),n=this.isForward?1:-1;return this.classes[e+n]}}const zw=["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"];const Pw="italic";class Lw extends V{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Pw}),t.model.schema.setAttributeProperties(Pw,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:Pw,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(Pw,new Op(t,Pw)),t.keystrokes.set("CTRL+I",Pw)}}const Ow="italic";class Rw extends V{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Ow,(n=>{const o=t.commands.get(Ow),i=new Su(n);return i.set({label:e("Italic"),icon:'',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute(Ow),t.editing.view.focus()})),i}))}}class jw{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){Array.isArray(t)?t.forEach((t=>this._definitions.add(t))):this._definitions.add(t)}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,n)=>{if(!n.consumable.test(e.item,"attribute:linkHref"))return;if(!e.item.is("selection")&&!n.schema.isInline(e.item))return;const o=n.writer,i=o.document.selection;for(const t of this._definitions){const r=o.createAttributeElement("a",t.attributes,{priority:5});t.classes&&o.addClass(t.classes,r);for(const e in t.styles)o.setStyle(e,t.styles[e],r);o.setCustomProperty("link",!0,r),t.callback(e.attributeNewValue)?e.item.is("selection")?o.wrap(i.getFirstRange(),r):o.wrap(n.mapper.toViewRange(e.range),r):o.unwrap(n.mapper.toViewRange(e.range),r)}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:imageBlock",((t,e,{writer:n,mapper:o})=>{const i=o.toViewElement(e.item),r=Array.from(i.getChildren()).find((t=>"a"===t.name));for(const t of this._definitions){const o=Mo(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of o)"class"===t?n.addClass(e,r):n.setAttribute(t,e,r);t.classes&&n.addClass(t.classes,r);for(const e in t.styles)n.setStyle(e,t.styles[e],r)}else{for(const[t,e]of o)"class"===t?n.removeClass(e,r):n.removeAttribute(t,r);t.classes&&n.removeClass(t.classes,r);for(const e in t.styles)n.removeStyle(e,r)}}}))}}}const Vw=function(t,e,n){var o=t.length;return n=void 0===n?o:n,!e&&n>=o?t:ti(t,e,n)};var Fw=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const Hw=function(t){return Fw.test(t)};const Uw=function(t){return t.split("")};var qw="[\\ud800-\\udfff]",Gw="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Ww="\\ud83c[\\udffb-\\udfff]",Zw="[^\\ud800-\\udfff]",Yw="(?:\\ud83c[\\udde6-\\uddff]){2}",Kw="[\\ud800-\\udbff][\\udc00-\\udfff]",$w="(?:"+Gw+"|"+Ww+")"+"?",Qw="[\\ufe0e\\ufe0f]?",Jw=Qw+$w+("(?:\\u200d(?:"+[Zw,Yw,Kw].join("|")+")"+Qw+$w+")*"),Xw="(?:"+[Zw+Gw+"?",Gw,Yw,Kw,qw].join("|")+")",tA=RegExp(Ww+"(?="+Ww+")|"+Xw+Jw,"g");const eA=function(t){return t.match(tA)||[]};const nA=function(t){return Hw(t)?eA(t):Uw(t)};const oA=function(t){return function(e){e=Ko(e);var n=Hw(e)?nA(e):void 0,o=n?n[0]:e.charAt(0),i=n?Vw(n,1).join(""):e.slice(1);return o[t]()+i}}("toUpperCase"),iA=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,rA=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i,sA=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,aA=/^((\w+:(\/{2,})?)|(\W))/i,lA="Ctrl+K";function cA(t,{writer:e}){const n=e.createAttributeElement("a",{href:t},{priority:5});return e.setCustomProperty("link",!0,n),n}function dA(t){return function(t){return t.replace(iA,"").match(rA)}(t=String(t))?t:"#"}function uA(t,e){return!!t&&e.checkAttribute(t.name,"linkHref")}function hA(t,e){const n=(o=t,sA.test(o)?"mailto:":e);var o;const i=!!n&&!aA.test(t);return t&&i?n+t:t}function mA(t){window.open(t,"_blank","noopener")}class gA extends H{constructor(t){super(t),this.manualDecorators=new bo,this.automaticDecorators=new jw}restoreManualDecoratorStates(){for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}refresh(){const t=this.editor.model,e=t.document.selection,n=e.getSelectedElement()||Ba(e.getSelectedBlocks());uA(n,t.schema)?(this.value=n.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttribute(n,"linkHref")):(this.value=e.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref"));for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}execute(t,e={}){const n=this.editor.model,o=n.document.selection,i=[],r=[];for(const t in e)e[t]?i.push(t):r.push(t);n.change((e=>{if(o.isCollapsed){const s=o.getFirstPosition();if(o.hasAttribute("linkHref")){const a=gp(s,"linkHref",o.getAttribute("linkHref"),n);e.setAttribute("linkHref",t,a),i.forEach((t=>{e.setAttribute(t,!0,a)})),r.forEach((t=>{e.removeAttribute(t,a)})),e.setSelection(e.createPositionAfter(a.end.nodeBefore))}else if(""!==t){const r=Mo(o.getAttributes());r.set("linkHref",t),i.forEach((t=>{r.set(t,!0)}));const{end:a}=n.insertContent(e.createText(t,r),s);e.setSelection(a)}["linkHref",...i,...r].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const s=n.schema.getValidRanges(o.getRanges(),"linkHref"),a=[];for(const t of o.getSelectedBlocks())n.schema.checkAttribute(t,"linkHref")&&a.push(e.createRangeOn(t));const l=a.slice();for(const t of s)this._isRangeToUpdate(t,a)&&l.push(t);for(const n of l)e.setAttribute("linkHref",t,n),i.forEach((t=>{e.setAttribute(t,!0,n)})),r.forEach((t=>{e.removeAttribute(t,n)}))}}))}_getDecoratorStateFromModel(t){const e=this.editor.model,n=e.document.selection,o=n.getSelectedElement();return uA(o,e.schema)?o.getAttribute(t):n.getAttribute(t)}_isRangeToUpdate(t,e){for(const n of e)if(n.containsRange(t))return!1;return!0}}class pA extends H{refresh(){const t=this.editor.model,e=t.document.selection,n=e.getSelectedElement();uA(n,t.schema)?this.isEnabled=t.schema.checkAttribute(n,"linkHref"):this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref")}execute(){const t=this.editor,e=this.editor.model,n=e.document.selection,o=t.commands.get("link");e.change((t=>{const i=n.isCollapsed?[gp(n.getFirstPosition(),"linkHref",n.getAttribute("linkHref"),e)]:e.schema.getValidRanges(n.getRanges(),"linkHref");for(const e of i)if(t.removeAttribute("linkHref",e),o)for(const n of o.manualDecorators)t.removeAttribute(n.id,e)}))}}class fA{constructor({id:t,label:e,attributes:n,classes:o,styles:i,defaultValue:r}){this.id=t,this.set("value"),this.defaultValue=r,this.label=e,this.attributes=n,this.classes=o,this.styles=i}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}j(fA,N);var bA=n(399),kA={attributes:{"data-cke":!0}};kA.setAttributes=is(),kA.insert=ns().bind(null,"head"),kA.domAPI=ts(),kA.insertStyleElement=ss();Jr()(bA.Z,kA);bA.Z&&bA.Z.locals&&bA.Z.locals;const wA="automatic",AA=/^(https?:)?\/\//;class CA extends V{static get pluginName(){return"LinkEditing"}static get requires(){return[Xg,Wg,Wp]}constructor(t){super(t),t.config.define("link",{addTargetToExternalLinks:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"linkHref"}),t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:cA}),t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>cA(dA(t),e)}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:t=>t.getAttribute("href")}}),t.commands.add("link",new gA(t)),t.commands.add("unlink",new pA(t));const e=function(t,e){const n={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};return e.forEach((t=>(t.label&&n[t.label]&&(t.label=n[t.label]),t))),e}(t.t,function(t){const e=[];if(t)for(const[n,o]of Object.entries(t)){const t=Object.assign({},o,{id:`link${oA(n)}`});e.push(t)}return e}(t.config.get("link.decorators")));this._enableAutomaticDecorators(e.filter((t=>t.mode===wA))),this._enableManualDecorators(e.filter((t=>"manual"===t.mode)));t.plugins.get(Xg).registerAttribute("linkHref"),function(t,e,n,o){const i=t.editing.view,r=new Set;i.document.registerPostFixer((i=>{const s=t.model.document.selection;let a=!1;if(s.hasAttribute(e)){const l=gp(s.getFirstPosition(),e,s.getAttribute(e),t.model),c=t.editing.mapper.toViewRange(l);for(const t of c.getItems())t.is("element",n)&&!t.hasClass(o)&&(i.addClass(o,t),r.add(t),a=!0)}return a})),t.conversion.for("editingDowncast").add((t=>{function e(){i.change((t=>{for(const e of r.values())t.removeClass(o,e),r.delete(e)}))}t.on("insert",e,{priority:"highest"}),t.on("remove",e,{priority:"highest"}),t.on("attribute",e,{priority:"highest"}),t.on("selection",e,{priority:"highest"})}))}(t,"linkHref","a","ck-link_selected"),this._enableLinkOpen(),this._enableInsertContentSelectionAttributesFixer(),this._enableClickingAfterLink(),this._enableTypingOverLink(),this._handleDeleteContentAfterLink()}_enableAutomaticDecorators(t){const e=this.editor,n=e.commands.get("link").automaticDecorators;e.config.get("link.addTargetToExternalLinks")&&n.add({id:"linkIsExternal",mode:wA,callback:t=>AA.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}}),n.add(t),n.length&&e.conversion.for("downcast").add(n.getDispatcher())}_enableManualDecorators(t){if(!t.length)return;const e=this.editor,n=e.commands.get("link").manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id}),t=new fA(t),n.add(t),e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,{writer:n,schema:o},{item:i})=>{if((i.is("selection")||o.isInline(i))&&e){const e=n.createAttributeElement("a",t.attributes,{priority:5});t.classes&&n.addClass(t.classes,e);for(const o in t.styles)n.setStyle(o,t.styles[o],e);return n.setCustomProperty("link",!0,e),e}}}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",...t._createPattern()},model:{key:t.id}})}))}_enableLinkOpen(){const t=this.editor,e=t.editing.view.document,n=t.model.document;this.listenTo(e,"click",((t,e)=>{if(!(ar.isMac?e.domEvent.metaKey:e.domEvent.ctrlKey))return;let n=e.domTarget;if("a"!=n.tagName.toLowerCase()&&(n=n.closest("a")),!n)return;const o=n.getAttribute("href");o&&(t.stop(),e.preventDefault(),mA(o))}),{context:"$capture"}),this.listenTo(e,"enter",((t,e)=>{const o=n.selection,i=o.getSelectedElement(),r=i?i.getAttribute("linkHref"):o.getAttribute("linkHref");r&&e.domEvent.altKey&&(t.stop(),mA(r))}),{context:"a"})}_enableInsertContentSelectionAttributesFixer(){const t=this.editor.model,e=t.document.selection;this.listenTo(t,"insertContent",(()=>{const n=e.anchor.nodeBefore,o=e.anchor.nodeAfter;e.hasAttribute("linkHref")&&n&&n.hasAttribute("linkHref")&&(o&&o.hasAttribute("linkHref")||t.change((e=>{_A(e,yA(t.schema))})))}),{priority:"low"})}_enableClickingAfterLink(){const t=this.editor,e=t.model;t.editing.view.addObserver(zm);let n=!1;this.listenTo(t.editing.view.document,"mousedown",(()=>{n=!0})),this.listenTo(t.editing.view.document,"selectionChange",(()=>{if(!n)return;n=!1;const t=e.document.selection;if(!t.isCollapsed)return;if(!t.hasAttribute("linkHref"))return;const o=t.getFirstPosition(),i=gp(o,"linkHref",t.getAttribute("linkHref"),e);(o.isTouching(i.start)||o.isTouching(i.end))&&e.change((t=>{_A(t,yA(e.schema))}))}))}_enableTypingOverLink(){const t=this.editor,e=t.editing.view;let n,o;this.listenTo(e.document,"delete",(()=>{o=!0}),{priority:"high"}),this.listenTo(t.model,"deleteContent",(()=>{const e=t.model.document.selection;e.isCollapsed||(o?o=!1:vA(t)&&function(t){const e=t.document.selection,n=e.getFirstPosition(),o=e.getLastPosition(),i=n.nodeAfter;if(!i)return!1;if(!i.is("$text"))return!1;if(!i.hasAttribute("linkHref"))return!1;const r=o.textNode||o.nodeBefore;if(i===r)return!0;return gp(n,"linkHref",i.getAttribute("linkHref"),t).containsRange(t.createRange(n,o),!0)}(t.model)&&(n=e.getAttributes()))}),{priority:"high"}),this.listenTo(t.model,"insertContent",((e,[i])=>{o=!1,vA(t)&&n&&(t.model.change((t=>{for(const[e,o]of n)t.setAttribute(e,o,i)})),n=null)}),{priority:"high"})}_handleDeleteContentAfterLink(){const t=this.editor,e=t.model,n=e.document.selection,o=t.editing.view;let i=!1,r=!1;this.listenTo(o.document,"delete",((t,e)=>{r=e.domEvent.keyCode===ur.backspace}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{i=!1;const t=n.getFirstPosition(),o=n.getAttribute("linkHref");if(!o)return;const r=gp(t,"linkHref",o,e);i=r.containsPosition(t)||r.end.isEqual(t)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{r&&(r=!1,i||t.model.enqueueChange((t=>{_A(t,yA(e.schema))})))}),{priority:"low"})}}function _A(t,e){t.removeSelectionAttribute("linkHref");for(const n of e)t.removeSelectionAttribute(n)}function vA(t){return t.model.change((t=>t.batch)).isTyping}function yA(t){return t.getDefinition("$text").allowAttributes.filter((t=>t.startsWith("link")))}var xA=n(4827),EA={attributes:{"data-cke":!0}};EA.setAttributes=is(),EA.insert=ns().bind(null,"head"),EA.domAPI=ts(),EA.insertStyleElement=ss();Jr()(xA.Z,EA);xA.Z&&xA.Z.locals&&xA.Z.locals;class DA extends Jd{constructor(t,e){super(t);const n=t.t;this.focusTracker=new za,this.keystrokes=new Pa,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(n("Save"),Gd.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(n("Cancel"),Gd.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e),this.children=this._createFormChildren(e.manualDecorators),this._focusables=new Kd,this._focusCycler=new Ou({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];e.manualDecorators.length&&o.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children}),Zd(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>(t[e.name]=e.isOn,t)),{})}render(){super.render(),Yd({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t,e=new Fh(this.locale,Hh);return e.label=t("Link URL"),e}_createButton(t,e,n,o){const i=new Su(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const n of t.manualDecorators){const o=new Mu(this.locale);o.set({name:n.id,label:n.label,withText:!0}),o.bind("isOn").toMany([n,t],"value",((t,e)=>void 0===e&&void 0===t?n.defaultValue:t)),o.on("execute",(()=>{n.set("value",!o.isOn)})),e.add(o)}return e}_createFormChildren(t){const e=this.createCollection();if(e.add(this.urlInputView),t.length){const t=new Jd;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}}),e.add(t)}return e.add(this.saveButtonView),e.add(this.cancelButtonView),e}}var SA=n(9465),IA={attributes:{"data-cke":!0}};IA.setAttributes=is(),IA.insert=ns().bind(null,"head"),IA.domAPI=ts(),IA.insertStyleElement=ss();Jr()(SA.Z,IA);SA.Z&&SA.Z.locals&&SA.Z.locals;class TA extends Jd{constructor(t){super(t);const e=t.t;this.focusTracker=new za,this.keystrokes=new Pa,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(e("Unlink"),'',"unlink"),this.editButtonView=this._createButton(e("Edit link"),Gd.pencil,"edit"),this.set("href"),this._focusables=new Kd,this._focusCycler=new Ou({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createButton(t,e,n){const o=new Su(this.locale);return o.set({label:t,icon:e,tooltip:!0}),o.delegate("execute").to(this,n),o}_createPreviewButton(){const t=new Su(this.locale),e=this.bindTemplate,n=this.t;return t.set({withText:!0,tooltip:n("Open link in new tab")}),t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&dA(t))),target:"_blank",rel:"noopener noreferrer"}}),t.bind("label").to(this,"href",(t=>t||n("This link has no URL"))),t.bind("isEnabled").to(this,"href",(t=>!!t)),t.template.tag="a",t.template.eventListeners={},t}}const MA='',BA="link-ui";class NA extends V{static get requires(){return[rm]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(Nm),this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._balloon=t.plugins.get(rm),this._createToolbarLinkButton(),this._enableUserBalloonInteractions(),t.conversion.for("editingDowncast").markerToHighlight({model:BA,view:{classes:["ck-fake-link-selection"]}}),t.conversion.for("editingDowncast").markerToElement({model:BA,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy(),this.formView.destroy()}_createActionsView(){const t=this.editor,e=new TA(t.locale),n=t.commands.get("link"),o=t.commands.get("unlink");return e.bind("href").to(n,"value"),e.editButtonView.bind("isEnabled").to(n),e.unlinkButtonView.bind("isEnabled").to(o),this.listenTo(e,"edit",(()=>{this._addFormView()})),this.listenTo(e,"unlink",(()=>{t.execute("unlink"),this._hideUI()})),e.keystrokes.set("Esc",((t,e)=>{this._hideUI(),e()})),e.keystrokes.set(lA,((t,e)=>{this._addFormView(),e()})),e}_createFormView(){const t=this.editor,e=t.commands.get("link"),n=t.config.get("link.defaultProtocol"),o=new DA(t.locale,e);return o.urlInputView.fieldView.bind("value").to(e,"value"),o.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t)),o.saveButtonView.bind("isEnabled").to(e),this.listenTo(o,"submit",(()=>{const{value:e}=o.urlInputView.fieldView.element,i=hA(e,n);t.execute("link",i,o.getDecoratorSwitchesState()),this._closeFormView()})),this.listenTo(o,"cancel",(()=>{this._closeFormView()})),o.keystrokes.set("Esc",((t,e)=>{this._closeFormView(),e()})),o}_createToolbarLinkButton(){const t=this.editor,e=t.commands.get("link"),n=t.t;t.keystrokes.set(lA,((t,n)=>{n(),e.isEnabled&&this._showUI(!0)})),t.ui.componentFactory.add("link",(t=>{const o=new Su(t);return o.isEnabled=!0,o.label=n("Link"),o.icon=MA,o.keystroke=lA,o.tooltip=!0,o.isToggleable=!0,o.bind("isEnabled").to(e,"isEnabled"),o.bind("isOn").to(e,"value",(t=>!!t)),this.listenTo(o,"execute",(()=>this._showUI(!0))),o}))}_enableUserBalloonInteractions(){const t=this.editor.editing.view.document;this.listenTo(t,"click",(()=>{this._getSelectedLinkElement()&&this._showUI()})),this.editor.keystrokes.set("Tab",((t,e)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),e())}),{priority:"high"}),this.editor.keystrokes.set("Esc",((t,e)=>{this._isUIVisible&&(this._hideUI(),e())})),Wd({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this._isFormInPanel)return;const t=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions(),this.formView.urlInputView.fieldView.element.value=t.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates(),void 0!==t.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(t=!1){this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),t&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),t&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const t=this.editor;this.stopListening(t.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),t.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor,e=t.editing.view.document;let n=this._getSelectedLinkElement(),o=r();const i=()=>{const t=this._getSelectedLinkElement(),e=r();n&&!t||!n&&e!==o?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),n=t,o=e};function r(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",i),this.listenTo(this._balloon,"change:visibleView",i)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){return this._balloon.visibleView==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view,e=this.editor.model,n=t.document;let o=null;if(e.markers.has(BA)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(BA)),n=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));o=t.domConverter.viewRangeToDom(n)}else o=()=>{const e=this._getSelectedLinkElement();return e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(n.selection.getFirstRange())};return{target:o}}_getSelectedLinkElement(){const t=this.editor.editing.view,e=t.document.selection,n=e.getSelectedElement();if(e.isCollapsed||n&&Xp(n))return zA(e.getFirstPosition());{const n=e.getFirstRange().getTrimmed(),o=zA(n.start),i=zA(n.end);return o&&o==i&&t.createRangeIn(o).getTrimmed().isEqual(n)?o:null}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const n=t.document.selection.getFirstRange();if(t.markers.has(BA))e.updateMarker(BA,{range:n});else if(n.start.isAtEnd){const o=n.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:n});e.addMarker(BA,{usingOperation:!1,affectsData:!1,range:e.createRange(o,n.end)})}else e.addMarker(BA,{usingOperation:!1,affectsData:!1,range:n})}))}_hideFakeVisualSelection(){const t=this.editor.model;t.markers.has(BA)&&t.change((t=>{t.removeMarker(BA)}))}}function zA(t){return t.getAncestors().find((t=>{return(e=t).is("attributeElement")&&!!e.getCustomProperty("link");var e}))}const PA=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i");class LA extends V{static get requires(){return[Kg]}static get pluginName(){return"AutoLink"}init(){const t=this.editor.model.document.selection;t.on("change:range",(()=>{this.isEnabled=!t.anchor.parent.is("element","codeBlock")})),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling()}_enableTypingHandling(){const t=this.editor,e=new Jg(t.model,(t=>{if(!function(t){return t.length>4&&" "===t[t.length-1]&&" "!==t[t.length-2]}(t))return;const e=OA(t.substr(0,t.length-1));return e?{url:e}:void 0}));e.on("matched:data",((e,n)=>{const{batch:o,range:i,url:r}=n;if(!o.isTyping)return;const s=i.end.getShiftedBy(-1),a=s.getShiftedBy(-r.length),l=t.model.createRange(a,s);this._applyAutoLink(r,l)})),e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor,e=t.model,n=t.commands.get("enter");n&&n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling)return;const n=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(n)}))}_enableShiftEnterHandling(){const t=this.editor,e=t.model,n=t.commands.get("shiftEnter");n&&n.on("execute",(()=>{const t=e.document.selection.getFirstPosition(),n=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(n)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model,{text:n,range:o}=Qg(t,e),i=OA(n);if(i){const t=e.createRange(o.end.getShiftedBy(-i.length),o.end);this._applyAutoLink(i,t)}}_applyAutoLink(t,e){const n=this.editor.model,o=this.editor.plugins.get("Delete");this.isEnabled&&function(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}(e,n)&&n.enqueueChange((i=>{const r=this.editor.config.get("link.defaultProtocol"),s=hA(t,r);i.setAttribute("linkHref",s,e),n.enqueueChange((()=>{o.requestUndoOnBackspace()}))}))}}function OA(t){const e=PA.exec(t);return e?e[2]:null}class RA extends V{static get requires(){return["ImageEditing","ImageUtils",CA]}static get pluginName(){return"LinkImageEditing"}init(){const t=this.editor,e=t.model.schema;t.plugins.has("ImageBlockEditing")&&e.extend("imageBlock",{allowAttributes:["linkHref"]}),t.conversion.for("upcast").add(function(t){const e=t.plugins.has("ImageInlineEditing"),n=t.plugins.get("ImageUtils");return t=>{t.on("element:a",((t,o,i)=>{const r=o.viewItem,s=n.findViewImgElement(r);if(!s)return;const a=s.findAncestor((t=>n.isBlockImageView(t)));if(e&&!a)return;const l={attributes:["href"]};if(!i.consumable.consume(r,l))return;const c=r.getAttribute("href");if(!c)return;let d=o.modelCursor.parent;if(!d.is("element","imageBlock")){const t=i.convertItem(s,o.modelCursor);o.modelRange=t.modelRange,o.modelCursor=t.modelCursor,d=o.modelCursor.nodeBefore}d&&d.is("element","imageBlock")&&i.writer.setAttribute("linkHref",c,d)}),{priority:"high"})}}(t)),t.conversion.for("downcast").add(function(t){const e=t.plugins.get("ImageUtils");return t=>{t.on("attribute:linkHref:imageBlock",((t,n,o)=>{if(!o.consumable.consume(n.item,t.name))return;const i=o.mapper.toViewElement(n.item),r=o.writer,s=Array.from(i.getChildren()).find((t=>"a"===t.name)),a=e.findViewImgElement(i),l=a.parent.is("element","picture")?a.parent:a;if(s)n.attributeNewValue?r.setAttribute("href",n.attributeNewValue,s):(r.move(r.createRangeOn(l),r.createPositionAt(i,0)),r.remove(s));else{const t=r.createContainerElement("a",{href:n.attributeNewValue});r.insert(r.createPositionAt(i,0),t),r.move(r.createRangeOn(l),r.createPositionAt(t,0))}}),{priority:"high"})}}(t)),this._enableAutomaticDecorators(),this._enableManualDecorators()}_enableAutomaticDecorators(){const t=this.editor,e=t.commands.get("link").automaticDecorators;e.length&&t.conversion.for("downcast").add(e.getDispatcherForLinkedImage())}_enableManualDecorators(){const t=this.editor,e=t.commands.get("link");for(const n of e.manualDecorators)t.plugins.has("ImageBlockEditing")&&t.model.schema.extend("imageBlock",{allowAttributes:n.id}),t.plugins.has("ImageInlineEditing")&&t.model.schema.extend("imageInline",{allowAttributes:n.id}),t.conversion.for("downcast").add(jA(n)),t.conversion.for("upcast").add(VA(t,n))}}function jA(t){return e=>{e.on(`attribute:${t.id}:imageBlock`,((e,n,o)=>{const i=o.mapper.toViewElement(n.item),r=Array.from(i.getChildren()).find((t=>"a"===t.name));if(r){for(const[e,n]of Mo(t.attributes))o.writer.setAttribute(e,n,r);t.classes&&o.writer.addClass(t.classes,r);for(const e in t.styles)o.writer.setStyle(e,t.styles[e],r)}}))}}function VA(t,e){const n=t.plugins.has("ImageInlineEditing"),o=t.plugins.get("ImageUtils");return t=>{t.on("element:a",((t,i,r)=>{const s=i.viewItem,a=o.findViewImgElement(s);if(!a)return;const l=a.findAncestor((t=>o.isBlockImageView(t)));if(n&&!l)return;const c=new Bo(e._createPattern()).match(s);if(!c)return;if(!r.consumable.consume(s,c.match))return;const d=i.modelCursor.nodeBefore||i.modelCursor.parent;r.writer.setAttribute(e.id,!0,d)}),{priority:"high"})}}class FA extends V{static get requires(){return[CA,NA,"ImageBlockEditing"]}static get pluginName(){return"LinkImageUI"}init(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",((e,n)=>{this._isSelectedLinkedImage(t.model.document.selection)&&(n.preventDefault(),e.stop())}),{priority:"high"}),this._createToolbarLinkImageButton()}_createToolbarLinkImageButton(){const t=this.editor,e=t.t;t.ui.componentFactory.add("linkImage",(n=>{const o=new Su(n),i=t.plugins.get("LinkUI"),r=t.commands.get("link");return o.set({isEnabled:!0,label:e("Link image"),icon:MA,keystroke:lA,tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(r,"isEnabled"),o.bind("isOn").to(r,"value",(t=>!!t)),this.listenTo(o,"execute",(()=>{this._isSelectedLinkedImage(t.model.document.selection)?i._addActionsView():i._showUI(!0)})),o}))}_isSelectedLinkedImage(t){const e=t.getSelectedElement();return this.editor.plugins.get("ImageUtils").isImage(e)&&e.hasAttribute("linkHref")}}var HA=n(3858),UA={attributes:{"data-cke":!0}};UA.setAttributes=is(),UA.insert=ns().bind(null,"head"),UA.domAPI=ts(),UA.insertStyleElement=ss();Jr()(HA.Z,UA);HA.Z&&HA.Z.locals&&HA.Z.locals;class qA extends H{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,n=e.document,o=Array.from(n.selection.getSelectedBlocks()).filter((t=>WA(t,e.schema))),i=void 0!==t.forceValue?!t.forceValue:this.value;e.change((t=>{if(i){let e=o[o.length-1].nextSibling,n=Number.POSITIVE_INFINITY,i=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t=n;)r>i.getAttribute("listIndent")&&(r=i.getAttribute("listIndent")),i.getAttribute("listIndent")==r&&t[e?"unshift":"push"](i),i=i[e?"previousSibling":"nextSibling"]}}function WA(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class ZA extends H{constructor(t,e){super(t),this._indentBy="forward"==e?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document;let n=Array.from(e.selection.getSelectedBlocks());t.change((t=>{const e=n[n.length-1];let o=e.nextSibling;for(;o&&"listItem"==o.name&&o.getAttribute("listIndent")>e.getAttribute("listIndent");)n.push(o),o=o.nextSibling;this._indentBy<0&&(n=n.reverse());for(const e of n){const n=e.getAttribute("listIndent")+this._indentBy;n<0?t.rename(e,"paragraph"):t.setAttribute("listIndent",n,e)}this.fire("_executeCleanup",n)}))}_checkEnabled(){const t=Ba(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),n=t.getAttribute("listType");let o=t.previousSibling;for(;o&&o.is("element","listItem")&&o.getAttribute("listIndent")>=e;){if(o.getAttribute("listIndent")==e)return o.getAttribute("listType")==n;o=o.previousSibling}return!1}return!0}}function YA(t,e){const n=e.mapper,o=e.writer,i="numbered"==t.getAttribute("listType")?"ol":"ul",r=function(t){const e=t.createContainerElement("li");return e.getFillerOffset=iC,e}(o),s=o.createContainerElement(i,null);return o.insert(o.createPositionAt(s,0),r),n.bindElements(t,r),r}function KA(t,e,n,o){const i=e.parent,r=n.mapper,s=n.writer;let a=r.toViewPosition(o.createPositionBefore(t));const l=JA(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),c=t.previousSibling;if(l&&l.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=r.toViewElement(l);a=s.breakContainer(s.createPositionAfter(t))}else if(c&&"listItem"==c.name){a=r.toViewPosition(o.createPositionAt(c,"end"));const t=r.findMappedViewAncestor(a),e=function(t){for(const e of t.getChildren())if("ul"==e.name||"ol"==e.name)return e;return null}(t);a=e?s.createPositionBefore(e):s.createPositionAt(t,"end")}else a=r.toViewPosition(o.createPositionBefore(t));if(a=QA(a),s.insert(a,i),c&&"listItem"==c.name){const t=r.toViewElement(c),n=s.createRange(s.createPositionAt(t,0),a).getWalker({ignoreElementEnd:!0});for(const t of n)if(t.item.is("element","li")){const o=s.breakContainer(s.createPositionBefore(t.item)),i=t.item.parent,r=s.createPositionAt(e,"end");$A(s,r.nodeBefore,r.nodeAfter),s.move(s.createRangeOn(i),r),n.position=o}}else{const n=i.nextSibling;if(n&&(n.is("element","ul")||n.is("element","ol"))){let o=null;for(const e of n.getChildren()){const n=r.toModelElement(e);if(!(n&&n.getAttribute("listIndent")>t.getAttribute("listIndent")))break;o=e}o&&(s.breakContainer(s.createPositionAfter(o)),s.move(s.createRangeOn(o.parent),s.createPositionAt(e,"end")))}}$A(s,i,i.nextSibling),$A(s,i.previousSibling,i)}function $A(t,e,n){return!e||!n||"ul"!=e.name&&"ol"!=e.name||e.name!=n.name||e.getAttribute("class")!==n.getAttribute("class")?null:t.mergeContainers(t.createPositionAfter(e))}function QA(t){return t.getLastMatchingPosition((t=>t.item.is("uiElement")))}function JA(t,e){const n=!!e.sameIndent,o=!!e.smallerIndent,i=e.listIndent;let r=t;for(;r&&"listItem"==r.name;){const t=r.getAttribute("listIndent");if(n&&i==t||o&&i>t)return r;r="forward"===e.direction?r.nextSibling:r.previousSibling}return null}function XA(t,e,n,o){t.ui.componentFactory.add(e,(i=>{const r=t.commands.get(e),s=new Su(i);return s.set({label:n,icon:o,tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),s.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),s}))}function tC(t,e){const n=[],o=t.parent,i={ignoreElementEnd:!0,startPosition:t,shallow:!0,direction:e},r=o.getAttribute("listIndent"),s=[...new Xa(i)].filter((t=>t.item.is("element"))).map((t=>t.item));for(const t of s){if(!t.is("element","listItem"))break;if(t.getAttribute("listIndent")r)){if(t.getAttribute("listType")!==o.getAttribute("listType"))break;if(t.getAttribute("listStyle")!==o.getAttribute("listStyle"))break;if(t.getAttribute("listReversed")!==o.getAttribute("listReversed"))break;if(t.getAttribute("listStart")!==o.getAttribute("listStart"))break;"backward"===e?n.unshift(t):n.push(t)}}return n}function eC(t){let e=[...t.document.selection.getSelectedBlocks()].filter((t=>t.is("element","listItem"))).map((e=>{const n=t.change((t=>t.createPositionAt(e,0)));return[...tC(n,"backward"),...tC(n,"forward")]})).flat();return e=[...new Set(e)],e}const nC=["disc","circle","square"],oC=["decimal","decimal-leading-zero","lower-roman","upper-roman","lower-latin","upper-latin"];function iC(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:zi.call(this)}function rC(t){return(e,n,o)=>{const i=o.consumable;if(!i.test(n.item,"insert")||!i.test(n.item,"attribute:listType")||!i.test(n.item,"attribute:listIndent"))return;i.consume(n.item,"insert"),i.consume(n.item,"attribute:listType"),i.consume(n.item,"attribute:listIndent");const r=n.item;KA(r,YA(r,o),o,t)}}function sC(t,e,n){if(!n.consumable.test(e.item,t.name))return;const o=n.mapper.toViewElement(e.item),i=n.writer;i.breakContainer(i.createPositionBefore(o)),i.breakContainer(i.createPositionAfter(o));const r=o.parent,s="numbered"==e.attributeNewValue?"ol":"ul";i.rename(s,r)}function aC(t,e,n){n.consumable.consume(e.item,t.name);const o=n.mapper.toViewElement(e.item).parent,i=n.writer;$A(i,o,o.nextSibling),$A(i,o.previousSibling,o)}function lC(t,e,n){if(n.consumable.test(e.item,t.name)&&"listItem"!=e.item.name){let t=n.mapper.toViewPosition(e.range.start);const o=n.writer,i=[];for(;("ul"==t.parent.name||"ol"==t.parent.name)&&(t=o.breakContainer(t),"li"==t.parent.name);){const e=t,n=o.createPositionAt(t.parent,"end");if(!e.isEqual(n)){const t=o.remove(o.createRange(e,n));i.push(t)}t=o.createPositionAfter(t.parent)}if(i.length>0){for(let e=0;e0){const e=$A(o,n,n.nextSibling);e&&e.parent==n&&t.offset--}}$A(o,t.nodeBefore,t.nodeAfter)}}}function cC(t,e,n){const o=n.mapper.toViewPosition(e.position),i=o.nodeBefore,r=o.nodeAfter;$A(n.writer,i,r)}function dC(t,e,n){if(n.consumable.consume(e.viewItem,{name:!0})){const t=n.writer,o=t.createElement("listItem"),i=function(t){let e=0,n=t.parent;for(;n;){if(n.is("element","li"))e++;else{const t=n.previousSibling;t&&t.is("element","li")&&e++}n=n.parent}return e}(e.viewItem);t.setAttribute("listIndent",i,o);const r=e.viewItem.parent&&"ol"==e.viewItem.parent.name?"numbered":"bulleted";if(t.setAttribute("listType",r,o),!n.safeInsert(o,e.modelCursor))return;const s=function(t,e,n){const{writer:o,schema:i}=n;let r=o.createPositionAfter(t);for(const s of e)if("ul"==s.name||"ol"==s.name)r=n.convertItem(s,r).modelCursor;else{const e=n.convertItem(s,o.createPositionAt(t,"end")),a=e.modelRange.start.nodeAfter;a&&a.is("element")&&!i.checkChild(t,a.name)&&(t=e.modelCursor.parent.is("element","listItem")?e.modelCursor.parent:pC(e.modelCursor),r=o.createPositionAfter(t))}return r}(o,e.viewItem.getChildren(),n);e.modelRange=t.createRange(e.modelCursor,s),n.updateConversionResult(o,e)}}function uC(t,e,n){if(n.consumable.test(e.viewItem,{name:!0})){const t=Array.from(e.viewItem.getChildren());for(const e of t){!(e.is("element","li")||bC(e))&&e._remove()}}}function hC(t,e,n){if(n.consumable.test(e.viewItem,{name:!0})){if(0===e.viewItem.childCount)return;const t=[...e.viewItem.getChildren()];let n=!1;for(const e of t)n&&!bC(e)&&e._remove(),bC(e)&&(n=!0)}}function mC(t){return(e,n)=>{if(n.isPhantom)return;const o=n.modelPosition.nodeBefore;if(o&&o.is("element","listItem")){const e=n.mapper.toViewElement(o),i=e.getAncestors().find(bC),r=t.createPositionAt(e,0).getWalker();for(const t of r){if("elementStart"==t.type&&t.item.is("element","li")){n.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==i){n.viewPosition=t.nextPosition;break}}}}}function gC(t,[e,n]){let o,i=e.is("documentFragment")?e.getChild(0):e;if(o=n?this.createSelection(n):this.document.selection,i&&i.is("element","listItem")){const t=o.getFirstPosition();let e=null;if(t.parent.is("element","listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("element","listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;i&&i.is("element","listItem");)i._setAttribute("listIndent",i.getAttribute("listIndent")+t),i=i.nextSibling}}}function pC(t){const e=new Xa({startPosition:t});let n;do{n=e.next()}while(!n.value.item.is("element","listItem"));return n.value.item}function fC(t,e,n,o,i,r){const s=JA(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t,foo:"b"}),a=i.mapper,l=i.writer,c=s?s.getAttribute("listIndent"):null;let d;if(s)if(c==t){const t=a.toViewElement(s).parent;d=l.createPositionAfter(t)}else{const t=r.createPositionAt(s,"end");d=a.toViewPosition(t)}else d=n;d=QA(d);for(const t of[...o.getChildren()])bC(t)&&(d=l.move(l.createRangeOn(t),d).end,$A(l,t,t.nextSibling),$A(l,t.previousSibling,t))}function bC(t){return t.is("element","ol")||t.is("element","ul")}class kC extends V{static get pluginName(){return"ListEditing"}static get requires(){return[yp,Kg]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data,n=t.editing;var o;t.model.document.registerPostFixer((e=>function(t,e){const n=t.document.differ.getChanges(),o=new Map;let i=!1;for(const o of n)if("insert"==o.type&&"listItem"==o.name)r(o.position);else if("insert"==o.type&&"listItem"!=o.name){if("$text"!=o.name){const n=o.position.nodeAfter;n.hasAttribute("listIndent")&&(e.removeAttribute("listIndent",n),i=!0),n.hasAttribute("listType")&&(e.removeAttribute("listType",n),i=!0),n.hasAttribute("listStyle")&&(e.removeAttribute("listStyle",n),i=!0),n.hasAttribute("listReversed")&&(e.removeAttribute("listReversed",n),i=!0),n.hasAttribute("listStart")&&(e.removeAttribute("listStart",n),i=!0);for(const e of Array.from(t.createRangeIn(n)).filter((t=>t.item.is("element","listItem"))))r(e.previousPosition)}r(o.position.getShiftedBy(o.length))}else"remove"==o.type&&"listItem"==o.name?r(o.position):("attribute"==o.type&&"listIndent"==o.attributeKey||"attribute"==o.type&&"listType"==o.attributeKey)&&r(o.range.start);for(const t of o.values())s(t),a(t);return i;function r(t){const e=t.nodeBefore;if(e&&e.is("element","listItem")){let t=e;if(o.has(t))return;for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling)if(t=e,o.has(t))return;o.set(e,t)}else{const e=t.nodeAfter;e&&e.is("element","listItem")&&o.set(e,e)}}function s(t){let n=0,o=null;for(;t&&t.is("element","listItem");){const r=t.getAttribute("listIndent");if(r>n){let s;null===o?(o=r-n,s=n):(o>r&&(o=r),s=r-o),e.setAttribute("listIndent",s,t),i=!0}else o=null,n=t.getAttribute("listIndent")+1;t=t.nextSibling}}function a(t){let n=[],o=null;for(;t&&t.is("element","listItem");){const r=t.getAttribute("listIndent");if(o&&o.getAttribute("listIndent")>r&&(n=n.slice(0,r+1)),0!=r)if(n[r]){const o=n[r];t.getAttribute("listType")!=o&&(e.setAttribute("listType",o,t),i=!0)}else n[r]=t.getAttribute("listType");o=t,t=t.nextSibling}}}(t.model,e))),n.mapper.registerViewToModelLength("li",wC),e.mapper.registerViewToModelLength("li",wC),n.mapper.on("modelToViewPosition",mC(n.view)),n.mapper.on("viewToModelPosition",(o=t.model,(t,e)=>{const n=e.viewPosition,i=n.parent,r=e.mapper;if("ul"==i.name||"ol"==i.name){if(n.isAtEnd){const t=r.toModelElement(n.nodeBefore),i=r.getModelLength(n.nodeBefore);e.modelPosition=o.createPositionBefore(t).getShiftedBy(i)}else{const t=r.toModelElement(n.nodeAfter);e.modelPosition=o.createPositionBefore(t)}t.stop()}else if("li"==i.name&&n.nodeBefore&&("ul"==n.nodeBefore.name||"ol"==n.nodeBefore.name)){const s=r.toModelElement(i);let a=1,l=n.nodeBefore;for(;l&&bC(l);)a+=r.getModelLength(l),l=l.previousSibling;e.modelPosition=o.createPositionBefore(s).getShiftedBy(a),t.stop()}})),e.mapper.on("modelToViewPosition",mC(n.view)),t.conversion.for("editingDowncast").add((e=>{e.on("insert",lC,{priority:"high"}),e.on("insert:listItem",rC(t.model)),e.on("attribute:listType:listItem",sC,{priority:"high"}),e.on("attribute:listType:listItem",aC,{priority:"low"}),e.on("attribute:listIndent:listItem",function(t){return(e,n,o)=>{if(!o.consumable.consume(n.item,"attribute:listIndent"))return;const i=o.mapper.toViewElement(n.item),r=o.writer;r.breakContainer(r.createPositionBefore(i)),r.breakContainer(r.createPositionAfter(i));const s=i.parent,a=s.previousSibling,l=r.createRangeOn(s);r.remove(l),a&&a.nextSibling&&$A(r,a,a.nextSibling),fC(n.attributeOldValue+1,n.range.start,l.start,i,o,t),KA(n.item,i,o,t);for(const t of n.item.getChildren())o.consumable.consume(t,"insert")}}(t.model)),e.on("remove:listItem",function(t){return(e,n,o)=>{const i=o.mapper.toViewPosition(n.position).getLastMatchingPosition((t=>!t.item.is("element","li"))).nodeAfter,r=o.writer;r.breakContainer(r.createPositionBefore(i)),r.breakContainer(r.createPositionAfter(i));const s=i.parent,a=s.previousSibling,l=r.createRangeOn(s),c=r.remove(l);a&&a.nextSibling&&$A(r,a,a.nextSibling),fC(o.mapper.toModelElement(i).getAttribute("listIndent")+1,n.position,l.start,i,o,t);for(const t of r.createRangeIn(c).getItems())o.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",cC,{priority:"low"})})),t.conversion.for("dataDowncast").add((e=>{e.on("insert",lC,{priority:"high"}),e.on("insert:listItem",rC(t.model))})),t.conversion.for("upcast").add((t=>{t.on("element:ul",uC,{priority:"high"}),t.on("element:ol",uC,{priority:"high"}),t.on("element:li",hC,{priority:"high"}),t.on("element:li",dC)})),t.model.on("insertContent",gC,{priority:"high"}),t.commands.add("numberedList",new qA(t,"numbered")),t.commands.add("bulletedList",new qA(t,"bulleted")),t.commands.add("indentList",new ZA(t,"forward")),t.commands.add("outdentList",new ZA(t,"backward"));const i=n.view.document;this.listenTo(i,"enter",((t,e)=>{const n=this.editor.model.document,o=n.selection.getLastPosition().parent;n.selection.isCollapsed&&"listItem"==o.name&&o.isEmpty&&(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(i,"delete",((t,e)=>{if("backward"!==e.direction)return;const n=this.editor.model.document.selection;if(!n.isCollapsed)return;const o=n.getFirstPosition();if(!o.isAtStart)return;const i=o.parent;if("listItem"!==i.name)return;i.previousSibling&&"listItem"===i.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(t.editing.view.document,"tab",((e,n)=>{const o=n.shiftKey?"outdentList":"indentList";this.editor.commands.get(o).isEnabled&&(t.execute(o),n.stopPropagation(),n.preventDefault(),e.stop())}),{context:"li"})}afterInit(){const t=this.editor.commands,e=t.get("indent"),n=t.get("outdent");e&&e.registerChildCommand(t.get("indentList")),n&&n.registerChildCommand(t.get("outdentList"))}}function wC(t){let e=1;for(const n of t.getChildren())if("ul"==n.name||"ol"==n.name)for(const t of n.getChildren())e+=wC(t);return e}const AC='',CC='';class _C extends V{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;XA(this.editor,"numberedList",t("Numbered List"),AC),XA(this.editor,"bulletedList",t("Bulleted List"),CC)}}class vC extends H{constructor(t,e){super(t),this._defaultType=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){this._tryToConvertItemsToList(t);const e=this.editor.model,n=eC(e);n.length&&e.change((e=>{for(const o of n)e.setAttribute("listStyle",t.type||this._defaultType,o)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")?t.getAttribute("listStyle"):null}_checkEnabled(){const t=this.editor,e=t.commands.get("numberedList"),n=t.commands.get("bulletedList");return e.isEnabled||n.isEnabled}_tryToConvertItemsToList(t){if(!t.type)return;const e=(n=t.type,nC.includes(n)?"bulleted":oC.includes(n)?"numbered":null);var n;if(!e)return;const o=this.editor,i=e+"List";o.commands.get(i).value||o.execute(i)}}class yC extends H{refresh(){const t=this._getValue();this.value=t,this.isEnabled=null!=t}execute(t={}){const e=this.editor.model,n=eC(e).filter((t=>"numbered"==t.getAttribute("listType")));e.change((e=>{for(const o of n)e.setAttribute("listReversed",!!t.reversed,o)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")&&"numbered"==t.getAttribute("listType")?t.getAttribute("listReversed"):null}}class xC extends H{refresh(){const t=this._getValue();this.value=t,this.isEnabled=null!=t}execute(t={}){const e=this.editor.model,n=eC(e).filter((t=>"numbered"==t.getAttribute("listType")));e.change((e=>{for(const o of n)e.setAttribute("listStart",t.startIndex||1,o)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")&&"numbered"==t.getAttribute("listType")?t.getAttribute("listStart"):null}}const EC="default";class DC extends V{static get requires(){return[kC]}static get pluginName(){return"ListPropertiesEditing"}constructor(t){super(t),t.config.define("list",{properties:{styles:!0,startIndex:!1,reversed:!1}})}init(){const t=this.editor,e=t.model,n=function(t){const e=[];t.styles&&e.push({attributeName:"listStyle",defaultValue:EC,addCommand(t){t.commands.add("listStyle",new vC(t,EC))},appliesToListItem:()=>!0,setAttributeOnDowncast(t,e,n){e&&e!==EC?t.setStyle("list-style-type",e,n):t.removeStyle("list-style-type",n)},getAttributeOnUpcast:t=>t.getStyle("list-style-type")||EC});t.reversed&&e.push({attributeName:"listReversed",defaultValue:!1,addCommand(t){t.commands.add("listReversed",new yC(t))},appliesToListItem:t=>"numbered"==t.getAttribute("listType"),setAttributeOnDowncast(t,e,n){e?t.setAttribute("reversed","reversed",n):t.removeAttribute("reversed",n)},getAttributeOnUpcast:t=>t.hasAttribute("reversed")});t.startIndex&&e.push({attributeName:"listStart",defaultValue:1,addCommand(t){t.commands.add("listStart",new xC(t))},appliesToListItem:t=>"numbered"==t.getAttribute("listType"),setAttributeOnDowncast(t,e,n){1!=e?t.setAttribute("start",e,n):t.removeAttribute("start",n)},getAttributeOnUpcast:t=>t.getAttribute("start")||1});return e}(t.config.get("list.properties"));e.schema.extend("listItem",{allowAttributes:n.map((t=>t.attributeName))});for(const e of n)e.addCommand(t);var o;this.listenTo(t.commands.get("indentList"),"_executeCleanup",function(t,e){return(n,o)=>{const i=o[0],r=i.getAttribute("listIndent"),s=o.filter((t=>t.getAttribute("listIndent")===r));let a=null;i.previousSibling.getAttribute("listIndent")+1!==r&&(a=JA(i.previousSibling,{sameIndent:!0,direction:"backward",listIndent:r})),t.model.change((t=>{for(const n of s)for(const o of e)if(o.appliesToListItem(n)){const e=null==a?o.defaultValue:a.getAttribute(o.attributeName);t.setAttribute(o.attributeName,e,n)}}))}}(t,n)),this.listenTo(t.commands.get("outdentList"),"_executeCleanup",function(t,e){return(n,o)=>{if(!(o=o.reverse().filter((t=>t.is("element","listItem")))).length)return;const i=o[0].getAttribute("listIndent"),r=o[0].getAttribute("listType");let s=o[0].previousSibling;if(s.is("element","listItem"))for(;s.getAttribute("listIndent")!==i;)s=s.previousSibling;else s=null;s||(s=o[o.length-1].nextSibling),s&&s.is("element","listItem")&&s.getAttribute("listType")===r&&t.model.change((t=>{const n=o.filter((t=>t.getAttribute("listIndent")===i));for(const o of n)for(const n of e)if(n.appliesToListItem(o)){const e=n.attributeName,i=s.getAttribute(e);t.setAttribute(e,i,o)}}))}}(t,n)),this.listenTo(t.commands.get("bulletedList"),"_executeCleanup",TC(t)),this.listenTo(t.commands.get("numberedList"),"_executeCleanup",TC(t)),e.document.registerPostFixer(function(t,e){return n=>{let o=!1;const i=MC(t.model.document.differ.getChanges()).filter((t=>"todo"!==t.getAttribute("listType")));if(!i.length)return o;let r=i[i.length-1].nextSibling;if((!r||!r.is("element","listItem"))&&(r=i[0].previousSibling,r)){const t=i[0].getAttribute("listIndent");for(;r.is("element","listItem")&&r.getAttribute("listIndent")!==t&&(r=r.previousSibling,r););}for(const t of e){const e=t.attributeName;for(const s of i)if(t.appliesToListItem(s))if(s.hasAttribute(e)){const i=s.previousSibling;IC(i,s,t.attributeName)&&(n.setAttribute(e,i.getAttribute(e),s),o=!0)}else SC(r,s,t)?n.setAttribute(e,r.getAttribute(e),s):n.setAttribute(e,t.defaultValue,s),o=!0;else n.removeAttribute(e,s)}return o}}(t,n)),t.conversion.for("upcast").add((o=n,t=>{t.on("element:li",((t,e,n)=>{const i=e.viewItem.parent;if(!i)return;const r=e.modelRange.start.nodeAfter||e.modelRange.end.nodeBefore;for(const t of o)if(t.appliesToListItem(r)){const e=t.getAttributeOnUpcast(i);n.writer.setAttribute(t.attributeName,e,r)}}),{priority:"low"})})),t.conversion.for("downcast").add(function(t){return n=>{for(const o of t)n.on(`attribute:${o.attributeName}:listItem`,((t,n,i)=>{const r=i.writer,s=n.item,a=JA(s.previousSibling,{sameIndent:!0,listIndent:s.getAttribute("listIndent"),direction:"backward"}),l=i.mapper.toViewElement(s);e(s,a)||r.breakContainer(r.createPositionBefore(l)),o.setAttributeOnDowncast(r,n.attributeNewValue,l.parent)}),{priority:"low"})};function e(t,e){return e&&t.getAttribute("listType")===e.getAttribute("listType")&&t.getAttribute("listIndent")===e.getAttribute("listIndent")&&t.getAttribute("listStyle")===e.getAttribute("listStyle")&&t.getAttribute("listReversed")===e.getAttribute("listReversed")&&t.getAttribute("listStart")===e.getAttribute("listStart")}}(n)),this._mergeListAttributesWhileMergingLists(n)}afterInit(){const t=this.editor;t.commands.get("todoList")&&t.model.document.registerPostFixer(function(t){return e=>{const n=MC(t.model.document.differ.getChanges()).filter((t=>"todo"===t.getAttribute("listType")&&(t.hasAttribute("listStyle")||t.hasAttribute("listReversed")||t.hasAttribute("listStart"))));if(!n.length)return!1;for(const t of n)e.removeAttribute("listStyle",t),e.removeAttribute("listReversed",t),e.removeAttribute("listStart",t);return!0}}(t))}_mergeListAttributesWhileMergingLists(t){const e=this.editor.model;let n;this.listenTo(e,"deleteContent",((t,[e])=>{const o=e.getFirstPosition(),i=e.getLastPosition();if(o.parent===i.parent)return;if(!o.parent.is("element","listItem"))return;const r=i.parent.nextSibling;if(!r||!r.is("element","listItem"))return;const s=JA(o.parent,{sameIndent:!0,listIndent:r.getAttribute("listIndent")});s&&s.getAttribute("listType")===r.getAttribute("listType")&&(n=s)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{n&&(e.change((e=>{const o=JA(n.nextSibling,{sameIndent:!0,listIndent:n.getAttribute("listIndent"),direction:"forward"});if(!o)return void(n=null);const i=[o,...tC(e.createPositionAt(o,0),"forward")];for(const o of i)for(const i of t)if(i.appliesToListItem(o)){const t=i.attributeName,r=n.getAttribute(t);e.setAttribute(t,r,o)}})),n=null)}),{priority:"low"})}}function SC(t,e,n){if(!t)return!1;const o=t.getAttribute(n.attributeName);return!!o&&(o!=n.defaultValue&&t.getAttribute("listType")===e.getAttribute("listType"))}function IC(t,e,n){if(!t||!t.is("element","listItem"))return!1;if(e.getAttribute("listType")!==t.getAttribute("listType"))return!1;const o=t.getAttribute("listIndent");if(o<1||o!==e.getAttribute("listIndent"))return!1;const i=t.getAttribute(n);return!(!i||i===e.getAttribute(n))}function TC(t){return(e,n)=>{n=n.filter((t=>t.is("element","listItem"))),t.model.change((t=>{for(const e of n)t.removeAttribute("listStyle",e)}))}}function MC(t){const e=[];for(const n of t){const t=BC(n);t&&t.is("element","listItem")&&e.push(t)}return e}function BC(t){return"attribute"===t.type?t.range.start.nodeAfter:"insert"===t.type?t.position.nodeAfter:null}var NC=n(3195),zC={attributes:{"data-cke":!0}};zC.setAttributes=is(),zC.insert=ns().bind(null,"head"),zC.domAPI=ts(),zC.insertStyleElement=ss();Jr()(NC.Z,zC);NC.Z&&NC.Z.locals&&NC.Z.locals;class PC extends Jd{constructor(t,e){super(t);const n=this.bindTemplate;this.set("isCollapsed",!1),this.set("label",""),this.buttonView=this._createButtonView(),this.children=this.createCollection(),this.set("_collapsibleAriaLabelUid"),e&&this.children.addMany(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-collapsible",n.if("isCollapsed","ck-collapsible_collapsed")]},children:[this.buttonView,{tag:"div",attributes:{class:["ck","ck-collapsible__children"],role:"region",hidden:n.if("isCollapsed","hidden"),"aria-labelledby":n.to("_collapsibleAriaLabelUid")},children:this.children}]})}render(){super.render(),this._collapsibleAriaLabelUid=this.buttonView.labelView.element.id}_createButtonView(){const t=new Su(this.locale),e=t.bindTemplate;return t.set({withText:!0,icon:Hu}),t.extendTemplate({attributes:{"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("label").to(this),t.bind("isOn").to(this,"isCollapsed",(t=>!t)),t.on("execute",(()=>{this.isCollapsed=!this.isCollapsed})),t}}var LC=n(7133),OC={attributes:{"data-cke":!0}};OC.setAttributes=is(),OC.insert=ns().bind(null,"head"),OC.domAPI=ts(),OC.insertStyleElement=ss();Jr()(LC.Z,OC);LC.Z&&LC.Z.locals&&LC.Z.locals;class RC extends Jd{constructor(t,{enabledProperties:e,styleButtonViews:n,styleGridAriaLabel:o}){super(t);const i=["ck","ck-list-properties"];this.children=this.createCollection(),this.stylesView=null,this.additionalPropertiesCollapsibleView=null,this.startIndexFieldView=null,this.reversedSwitchButtonView=null,this.focusTracker=new za,this.keystrokes=new Pa,this.focusables=new Kd,this.focusCycler=new Ou({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),e.styles?(this.stylesView=this._createStylesView(n,o),this.children.add(this.stylesView)):i.push("ck-list-properties_without-styles"),(e.startIndex||e.reversed)&&(this._addNumberedListPropertyViews(e,n),i.push("ck-list-properties_with-numbered-properties")),this.setTemplate({tag:"div",attributes:{class:i},children:this.children})}render(){if(super.render(),this.stylesView){for(const t of this.stylesView.children)this.focusables.add(t),this.focusTracker.add(t.element);(this.startIndexFieldView||this.reversedSwitchButtonView)&&(this.focusables.add(this.children.last.buttonView),this.focusTracker.add(this.children.last.buttonView.element))}if(this.startIndexFieldView){this.focusables.add(this.startIndexFieldView),this.focusTracker.add(this.startIndexFieldView.element),this.listenTo(this.startIndexFieldView.element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"});const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t)}this.reversedSwitchButtonView&&(this.focusables.add(this.reversedSwitchButtonView),this.focusTracker.add(this.reversedSwitchButtonView.element)),this.keystrokes.listenTo(this.element)}focus(){this.focusCycler.focusFirst()}focusLast(){this.focusCycler.focusLast()}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createStylesView(t,e){const n=new Jd(this.locale);return n.children=n.createCollection(this.locale),n.children.addMany(t),n.setTemplate({tag:"div",attributes:{"aria-label":e,class:["ck","ck-list-styles-list"]},children:n.children}),n.children.delegate("execute").to(this),n}_addNumberedListPropertyViews(t){const e=this.locale.t,n=[];t.startIndex&&(this.startIndexFieldView=this._createStartIndexField(),n.push(this.startIndexFieldView)),t.reversed&&(this.reversedSwitchButtonView=this._createReversedSwitchButton(),n.push(this.reversedSwitchButtonView)),t.styles?(this.additionalPropertiesCollapsibleView=new PC(this.locale,n),this.additionalPropertiesCollapsibleView.set({label:e("List properties"),isCollapsed:!0}),this.additionalPropertiesCollapsibleView.buttonView.bind("isEnabled").toMany(n,"isEnabled",((...t)=>t.some((t=>t)))),this.additionalPropertiesCollapsibleView.buttonView.on("change:isEnabled",((t,e,n)=>{n||(this.additionalPropertiesCollapsibleView.isCollapsed=!0)})),this.children.add(this.additionalPropertiesCollapsibleView)):this.children.addMany(n)}_createStartIndexField(){const t=this.locale.t,e=new Fh(this.locale,Uh);return e.set({label:t("Start at"),class:"ck-numbered-list-properties__start-index"}),e.fieldView.set({min:1,step:1,value:1,inputMode:"numeric"}),e.fieldView.on("input",(()=>{const n=e.fieldView.element,o=n.valueAsNumber;Number.isNaN(o)||(n.checkValidity()?this.fire("listStart",{startIndex:o}):e.errorText=t("Start index must be greater than 0."))})),e}_createReversedSwitchButton(){const t=this.locale.t,e=new Mu(this.locale);return e.set({withText:!0,label:t("Reversed order"),class:"ck-numbered-list-properties__reversed-order"}),e.delegate("execute").to(this,"listReversed"),e}}var jC=n(4553),VC={attributes:{"data-cke":!0}};VC.setAttributes=is(),VC.insert=ns().bind(null,"head"),VC.domAPI=ts(),VC.insertStyleElement=ss();Jr()(jC.Z,VC);jC.Z&&jC.Z.locals&&jC.Z.locals;class FC extends V{static get pluginName(){return"ListPropertiesUI"}init(){const t=this.editor,e=t.locale.t,n=t.config.get("list.properties");n.styles&&t.ui.componentFactory.add("bulletedList",HC({editor:t,parentCommandName:"bulletedList",buttonLabel:e("Bulleted List"),buttonIcon:CC,styleGridAriaLabel:e("Bulleted list styles toolbar"),styleDefinitions:[{label:e("Toggle the disc list style"),tooltip:e("Disc"),type:"disc",icon:''},{label:e("Toggle the circle list style"),tooltip:e("Circle"),type:"circle",icon:''},{label:e("Toggle the square list style"),tooltip:e("Square"),type:"square",icon:''}]})),(n.styles||n.startIndex||n.reversed)&&t.ui.componentFactory.add("numberedList",HC({editor:t,parentCommandName:"numberedList",buttonLabel:e("Numbered List"),buttonIcon:AC,styleGridAriaLabel:e("Numbered list styles toolbar"),styleDefinitions:[{label:e("Toggle the decimal list style"),tooltip:e("Decimal"),type:"decimal",icon:''},{label:e("Toggle the decimal with leading zero list style"),tooltip:e("Decimal with leading zero"),type:"decimal-leading-zero",icon:''},{label:e("Toggle the lower–roman list style"),tooltip:e("Lower–roman"),type:"lower-roman",icon:''},{label:e("Toggle the upper–roman list style"),tooltip:e("Upper-roman"),type:"upper-roman",icon:''},{label:e("Toggle the lower–latin list style"),tooltip:e("Lower-latin"),type:"lower-latin",icon:''},{label:e("Toggle the upper–latin list style"),tooltip:e("Upper-latin"),type:"upper-latin",icon:''}]}))}}function HC({editor:t,parentCommandName:e,buttonLabel:n,buttonIcon:o,styleGridAriaLabel:i,styleDefinitions:r}){const s=t.commands.get(e);return a=>{const l=kh(a,Wu),c=l.buttonView;l.bind("isEnabled").to(s),l.class="ck-list-styles-dropdown",c.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),c.set({label:n,icon:o,tooltip:!0,isToggleable:!0}),c.bind("isOn").to(s,"value",(t=>!!t));const d=function({editor:t,dropdownView:e,parentCommandName:n,styleDefinitions:o,styleGridAriaLabel:i}){const r=t.locale,s=t.config.get("list.properties");let a;"numberedList"!=n&&(s.startIndex=!1,s.reversed=!1);if(s.styles){const e=t.commands.get("listStyle"),i=function({editor:t,listStyleCommand:e,parentCommandName:n}){const o=t.locale,i=t.commands.get(n);return({label:n,type:r,icon:s,tooltip:a})=>{const l=new Su(o);return l.set({label:n,icon:s,tooltip:a}),e.on("change:value",(()=>{l.isOn=e.value===r})),l.on("execute",(()=>{i.value?e.value!==r?t.execute("listStyle",{type:r}):t.execute("listStyle",{type:e._defaultType}):t.model.change((()=>{t.execute("listStyle",{type:r})}))})),l}}({editor:t,parentCommandName:n,listStyleCommand:e}),r="function"==typeof e.isStyleTypeSupported?t=>e.isStyleTypeSupported(t.type):()=>!0;a=o.filter(r).map(i)}const l=new RC(r,{styleGridAriaLabel:i,enabledProperties:s,styleButtonViews:a});if(s.startIndex){const e=t.commands.get("listStart");l.startIndexFieldView.bind("isEnabled").to(e),l.startIndexFieldView.fieldView.bind("value").to(e),l.on("listStart",((e,n)=>t.execute("listStart",n)))}if(s.reversed){const e=t.commands.get("listReversed");l.reversedSwitchButtonView.bind("isEnabled").to(e),l.reversedSwitchButtonView.bind("isOn").to(e,"value"),l.on("listReversed",(()=>{const n=e.value;t.execute("listReversed",{reversed:!n})}))}return l.delegate("execute").to(e),l}({editor:t,dropdownView:l,parentCommandName:e,styleGridAriaLabel:i,styleDefinitions:r});return l.panelView.children.add(d),Ch(l,(()=>d.stylesView.children.find((t=>t.isOn)))),l.on("execute",(()=>{t.editing.view.focus()})),l}}function UC(t,e){return t=>{t.on("attribute:url:media",n)};function n(n,o,i){if(!i.consumable.consume(o.item,n.name))return;const r=o.attributeNewValue,s=i.writer,a=i.mapper.toViewElement(o.item),l=[...a.getChildren()].find((t=>t.getCustomProperty("media-content")));s.remove(l);const c=t.getMediaViewElement(s,r,e);s.insert(s.createPositionAt(a,0),c)}}function qC(t,e,n,o){return t.createContainerElement("figure",{class:"media"},[e.getMediaViewElement(t,n,o),t.createSlot()])}function GC(t){const e=t.getSelectedElement();return e&&e.is("element","media")?e:null}function WC(t,e,n,o){t.change((i=>{const r=i.createElement("media",{url:e});t.insertObject(r,n,null,{setSelection:"on",findOptimalPosition:o})}))}class ZC extends H{refresh(){const t=this.editor.model,e=t.document.selection,n=GC(e);this.value=n?n.getAttribute("url"):null,this.isEnabled=function(t){const e=t.getSelectedElement();return!!e&&"media"===e.name}(e)||function(t,e){let n=af(t,e).start.parent;n.isEmpty&&!e.schema.isLimit(n)&&(n=n.parent);return e.schema.checkChild(n,"media")}(e,t)}execute(t){const e=this.editor.model,n=e.document.selection,o=GC(n);o?e.change((e=>{e.setAttribute("url",t,o)})):WC(e,t,n,!0)}}class YC{constructor(t,e){const n=e.providers,o=e.extraProviders||[],i=new Set(e.removeProviders),r=n.concat(o).filter((t=>{const e=t.name;return e?!i.has(e):(c("media-embed-no-provider-name",{provider:t}),!1)}));this.locale=t,this.providerDefinitions=r}hasMedia(t){return!!this._getMedia(t)}getMediaViewElement(t,e,n){return this._getMedia(e).getViewElement(t,n)}_getMedia(t){if(!t)return new KC(this.locale);t=t.trim();for(const e of this.providerDefinitions){const n=e.html,o=wo(e.url);for(const e of o){const o=this._getUrlMatches(t,e);if(o)return new KC(this.locale,t,o,n)}}return null}_getUrlMatches(t,e){let n=t.match(e);if(n)return n;let o=t.replace(/^https?:\/\//,"");return n=o.match(e),n||(o=o.replace(/^www\./,""),n=o.match(e),n||null)}}class KC{constructor(t,e,n,o){this.url=this._getValidUrl(e),this._t=t.t,this._match=n,this._previewRenderer=o}getViewElement(t,e){const n={};let o;if(e.renderForEditingView||e.renderMediaPreview&&this.url&&this._previewRenderer){this.url&&(n["data-oembed-url"]=this.url),e.renderForEditingView&&(n.class="ck-media__wrapper");const i=this._getPreviewHtml(e);o=t.createRawElement("div",n,((t,e)=>{e.setContentOf(t,i)}))}else this.url&&(n.url=this.url),o=t.createEmptyElement(e.elementName,n);return t.setCustomProperty("media-content",!0,o),o}_getPreviewHtml(t){return this._previewRenderer?this._previewRenderer(this._match):this.url&&t.renderForEditingView?this._getPlaceholderHtml():""}_getPlaceholderHtml(){const t=new xu,e=new _u;t.text=this._t("Open media in new tab"),e.content='',e.viewBox="0 0 64 42";return new Xd({tag:"div",attributes:{class:"ck ck-reset_all ck-media__placeholder"},children:[{tag:"div",attributes:{class:"ck-media__placeholder__icon"},children:[e]},{tag:"a",attributes:{class:"ck-media__placeholder__url",target:"_blank",rel:"noopener noreferrer",href:this.url},children:[{tag:"span",attributes:{class:"ck-media__placeholder__url__text"},children:[this.url]},t]}]}).render().outerHTML}_getValidUrl(t){return t?t.match(/^https?/)?t:"https://"+t:null}}var $C=n(952),QC={attributes:{"data-cke":!0}};QC.setAttributes=is(),QC.insert=ns().bind(null,"head"),QC.domAPI=ts(),QC.insertStyleElement=ss();Jr()($C.Z,QC);$C.Z&&$C.Z.locals&&$C.Z.locals;class JC extends V{static get pluginName(){return"MediaEmbedEditing"}constructor(t){super(t),t.config.define("mediaEmbed",{elementName:"oembed",providers:[{name:"dailymotion",url:/^dailymotion\.com\/video\/(\w+)/,html:t=>`
    `},{name:"spotify",url:[/^open\.spotify\.com\/(artist\/\w+)/,/^open\.spotify\.com\/(album\/\w+)/,/^open\.spotify\.com\/(track\/\w+)/],html:t=>`
    `},{name:"youtube",url:[/^(?:m\.)?youtube\.com\/watch\?v=([\w-]+)(?:&t=(\d+))?/,/^(?:m\.)?youtube\.com\/v\/([\w-]+)(?:\?t=(\d+))?/,/^youtube\.com\/embed\/([\w-]+)(?:\?start=(\d+))?/,/^youtu\.be\/([\w-]+)(?:\?t=(\d+))?/],html:t=>{const e=t[1],n=t[2];return`
    `}},{name:"vimeo",url:[/^vimeo\.com\/(\d+)/,/^vimeo\.com\/[^/]+\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/album\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/channels\/[^/]+\/(\d+)/,/^vimeo\.com\/groups\/[^/]+\/videos\/(\d+)/,/^vimeo\.com\/ondemand\/[^/]+\/(\d+)/,/^player\.vimeo\.com\/video\/(\d+)/],html:t=>`
    `},{name:"instagram",url:/^instagram\.com\/p\/(\w+)/},{name:"twitter",url:/^twitter\.com/},{name:"googleMaps",url:[/^google\.com\/maps/,/^goo\.gl\/maps/,/^maps\.google\.com/,/^maps\.app\.goo\.gl/]},{name:"flickr",url:/^flickr\.com/},{name:"facebook",url:/^facebook\.com/}]}),this.registry=new YC(t.locale,t.config.get("mediaEmbed"))}init(){const t=this.editor,e=t.model.schema,n=t.t,o=t.conversion,i=t.config.get("mediaEmbed.previewsInData"),r=t.config.get("mediaEmbed.elementName"),s=this.registry;t.commands.add("mediaEmbed",new ZC(t)),e.register("media",{inheritAllFrom:"$blockObject",allowAttributes:["url"]}),o.for("dataDowncast").elementToStructure({model:"media",view:(t,{writer:e})=>{const n=t.getAttribute("url");return qC(e,s,n,{elementName:r,renderMediaPreview:n&&i})}}),o.for("dataDowncast").add(UC(s,{elementName:r,renderMediaPreview:i})),o.for("editingDowncast").elementToStructure({model:"media",view:(t,{writer:e})=>{const o=t.getAttribute("url");return function(t,e,n){return e.setCustomProperty("media",!0,t),tf(t,e,{label:n})}(qC(e,s,o,{elementName:r,renderForEditingView:!0}),e,n("media widget"))}}),o.for("editingDowncast").add(UC(s,{elementName:r,renderForEditingView:!0})),o.for("upcast").elementToElement({view:t=>["oembed",r].includes(t.name)&&t.getAttribute("url")?{name:!0}:null,model:(t,{writer:e})=>{const n=t.getAttribute("url");if(s.hasMedia(n))return e.createElement("media",{url:n})}}).elementToElement({view:{name:"div",attributes:{"data-oembed-url":!0}},model:(t,{writer:e})=>{const n=t.getAttribute("data-oembed-url");if(s.hasMedia(n))return e.createElement("media",{url:n})}}).add((t=>{t.on("element:figure",(function(t,e,n){if(!n.consumable.consume(e.viewItem,{name:!0,classes:"media"}))return;const{modelRange:o,modelCursor:i}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=o,e.modelCursor=i;Ba(o.getItems())||n.consumable.revert(e.viewItem,{name:!0,classes:"media"})}))}))}}const XC=/^(?:http(s)?:\/\/)?[\w-]+\.[\w-.~:/?#[\]@!$&'()*+,;=%]+$/;class t_ extends V{static get requires(){return[zf,Kg,$f]}static get pluginName(){return"AutoMediaEmbed"}constructor(t){super(t),this._timeoutId=null,this._positionToInsert=null}init(){const t=this.editor,e=t.model.document;this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",(()=>{const t=e.selection.getFirstRange(),n=dd.fromPosition(t.start);n.stickiness="toPrevious";const o=dd.fromPosition(t.end);o.stickiness="toNext",e.once("change:data",(()=>{this._embedMediaBetweenPositions(n,o),n.detach(),o.detach()}),{priority:"high"})})),t.commands.get("undo").on("execute",(()=>{this._timeoutId&&(ms.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)}),{priority:"high"})}_embedMediaBetweenPositions(t,e){const n=this.editor,o=n.plugins.get(JC).registry,i=new bl(t,e),r=i.getWalker({ignoreElementEnd:!0});let s="";for(const t of r)t.item.is("$textProxy")&&(s+=t.item.data);if(s=s.trim(),!s.match(XC))return void i.detach();if(!o.hasMedia(s))return void i.detach();n.commands.get("mediaEmbed").isEnabled?(this._positionToInsert=dd.fromPosition(t),this._timeoutId=ms.window.setTimeout((()=>{n.model.change((t=>{let e;this._timeoutId=null,t.remove(i),i.detach(),"$graveyard"!==this._positionToInsert.root.rootName&&(e=this._positionToInsert),WC(n.model,s,e,!1),this._positionToInsert.detach(),this._positionToInsert=null})),n.plugins.get("Delete").requestUndoOnBackspace()}),100)):i.detach()}}var e_=n(3525),n_={attributes:{"data-cke":!0}};n_.setAttributes=is(),n_.insert=ns().bind(null,"head"),n_.domAPI=ts(),n_.insertStyleElement=ss();Jr()(e_.Z,n_);e_.Z&&e_.Z.locals&&e_.Z.locals;class o_ extends Jd{constructor(t,e){super(e);const n=e.t;this.focusTracker=new za,this.keystrokes=new Pa,this.set("mediaURLInputValue",""),this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(n("Save"),Gd.check,"ck-button-save"),this.saveButtonView.type="submit",this.saveButtonView.bind("isEnabled").to(this,"mediaURLInputValue",(t=>!!t)),this.cancelButtonView=this._createButton(n("Cancel"),Gd.cancel,"ck-button-cancel","cancel"),this._focusables=new Kd,this._focusCycler=new Ou({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this._validators=t,this.setTemplate({tag:"form",attributes:{class:["ck","ck-media-form","ck-responsive-form"],tabindex:"-1"},children:[this.urlInputView,this.saveButtonView,this.cancelButtonView]}),Zd(this)}render(){super.render(),Yd({view:this});[this.urlInputView,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element);const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(this.urlInputView.element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"})}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}get url(){return this.urlInputView.fieldView.element.value.trim()}set url(t){this.urlInputView.fieldView.element.value=t.trim()}isValid(){this.resetFormStatus();for(const t of this._validators){const e=t(this);if(e)return this.urlInputView.errorText=e,!1}return!0}resetFormStatus(){this.urlInputView.errorText=null,this.urlInputView.infoText=this._urlInputViewInfoDefault}_createUrlInput(){const t=this.locale.t,e=new Fh(this.locale,Hh),n=e.fieldView;return this._urlInputViewInfoDefault=t("Paste the media URL in the input."),this._urlInputViewInfoTip=t("Tip: Paste the URL into the content to embed faster."),e.label=t("Media URL"),e.infoText=this._urlInputViewInfoDefault,n.on("input",(()=>{e.infoText=n.element.value?this._urlInputViewInfoTip:this._urlInputViewInfoDefault,this.mediaURLInputValue=n.element.value.trim()})),e}_createButton(t,e,n,o){const i=new Su(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}}class i_ extends V{static get requires(){return[JC]}static get pluginName(){return"MediaEmbedUI"}init(){const t=this.editor,e=t.commands.get("mediaEmbed"),n=t.plugins.get(JC).registry;t.ui.componentFactory.add("mediaEmbed",(o=>{const i=kh(o),r=new o_(function(t,e){return[e=>{if(!e.url.length)return t("The URL must not be empty.")},n=>{if(!e.hasMedia(n.url))return t("This media URL is not supported.")}]}(t.t,n),t.locale);return this._setUpDropdown(i,r,e,t),this._setUpForm(i,r,e),i}))}_setUpDropdown(t,e,n){const o=this.editor,i=o.t,r=t.buttonView;function s(){o.editing.view.focus(),t.isOpen=!1}t.bind("isEnabled").to(n),t.panelView.children.add(e),r.set({label:i("Insert media"),icon:'',tooltip:!0}),r.on("open",(()=>{e.disableCssTransitions(),e.url=n.value||"",e.urlInputView.fieldView.select(),e.enableCssTransitions()}),{priority:"low"}),t.on("submit",(()=>{e.isValid()&&(o.execute("mediaEmbed",e.url),s())})),t.on("change:isOpen",(()=>e.resetFormStatus())),t.on("cancel",(()=>s()))}_setUpForm(t,e,n){e.delegate("submit","cancel").to(t),e.urlInputView.bind("value").to(n,"value"),e.urlInputView.bind("isReadOnly").to(n,"isEnabled",(t=>!t))}}var r_=n(5777),s_={attributes:{"data-cke":!0}};s_.setAttributes=is(),s_.insert=ns().bind(null,"head"),s_.domAPI=ts(),s_.insertStyleElement=ss();Jr()(r_.Z,s_);r_.Z&&r_.Z.locals&&r_.Z.locals;function a_(t,e){if(!t.childCount)return;const n=new Pm(t.document),o=function(t,e){const n=e.createRangeIn(t),o=new Bo({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),i=[];for(const t of n)if("elementStart"===t.type&&o.match(t.item)){const e=d_(t.item);i.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}return i}(t,n);if(!o.length)return;let i=null,r=1;o.forEach(((t,s)=>{const a=function(t,e){if(!t)return!0;if(t.id!==e.id)return e.indent-t.indent!=1;const n=e.element.previousSibling;if(!n)return!0;return o=n,!(o.is("element","ol")||o.is("element","ul"));var o}(o[s-1],t),l=a?null:o[s-1],c=(u=t,(d=l)?u.indent-d.indent:u.indent-1);var d,u;if(a&&(i=null,r=1),!i||0!==c){const o=function(t,e){const n=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi"),o=/mso-level-number-format:([^;]{0,100});/gi,i=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,r=n.exec(e);let s="decimal",a="ol",l=null;if(r&&r[1]){const e=o.exec(r[1]);if(e&&e[1]&&(s=e[1].trim(),a="bullet"!==s&&"image"!==s?"ol":"ul"),"bullet"===s){const e=function(t){const e=function(t){if(t.getChild(0).is("$text"))return null;for(const e of t.getChildren()){if(!e.is("element","span"))continue;const t=e.getChild(0);return t.is("$text")?t:t.getChild(0)}}(t);if(!e)return null;const n=e._data;if("o"===n)return"circle";if("·"===n)return"disc";if("§"===n)return"square";return null}(t.element);e&&(s=e)}else{const t=i.exec(r[1]);t&&t[1]&&(l=parseInt(t[1]))}}return{type:a,startIndex:l,style:l_(s)}}(t,e);if(i){if(t.indent>r){const t=i.getChild(i.childCount-1),e=t.getChild(t.childCount-1);i=c_(o,e,n),r+=1}else if(t.indent1&&n.setAttribute("start",t.startIndex,i),i}function d_(t){const e={},n=t.getStyle("mso-list");if(n){const t=n.match(/(^|\s{1,100})l(\d+)/i),o=n.match(/\s{0,100}lfo(\d+)/i),i=n.match(/\s{0,100}level(\d+)/i);t&&o&&i&&(e.id=t[2],e.order=o[1],e.indent=i[1])}return e}const u_=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class h_{constructor(t){this.document=t}isActive(t){return u_.test(t)}execute(t){const e=new Pm(this.document),{body:n}=t._parsedData;!function(t,e){for(const n of t.getChildren())if(n.is("element","b")&&"normal"===n.getStyle("font-weight")){const o=t.getChildIndex(n);e.remove(n),e.insertChild(o,n.getChildren(),t)}}(n,e),function(t,e){for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","li")){const n=t.getChild(0);n&&n.is("element","p")&&e.unwrapElement(n)}}}(n,e),t.content=n}}function m_(t,e){if(!t.childCount)return;const n=new Pm,o=function(t,e){const n=e.createRangeIn(t),o=new Bo({name:/v:(.+)/}),i=[];for(const t of n){if("elementStart"!=t.type)continue;const e=t.item,n=e.previousSibling&&e.previousSibling.name||null;o.match(e)&&e.getAttribute("o:gfxdata")&&"v:shapetype"!==n&&i.push(t.item.getAttribute("id"))}return i}(t,n);!function(t,e,n){const o=n.createRangeIn(e),i=new Bo({name:"img"}),r=[];for(const e of o)if(i.match(e.item)){const n=e.item,o=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];o.length&&o.every((e=>t.indexOf(e)>-1))?r.push(n):n.getAttribute("src")||r.push(n)}for(const t of r)n.remove(t)}(o,t,n),function(t,e){const n=e.createRangeIn(t),o=new Bo({name:/v:(.+)/}),i=[];for(const t of n)"elementStart"==t.type&&o.match(t.item)&&i.push(t.item);for(const t of i)e.remove(t)}(t,n);const i=function(t,e){const n=e.createRangeIn(t),o=new Bo({name:"img"}),i=[];for(const t of n)o.match(t.item)&&t.item.getAttribute("src").startsWith("file://")&&i.push(t.item);return i}(t,n);i.length&&function(t,e,n){if(t.length===e.length)for(let o=0;oString.fromCharCode(parseInt(t,16)))).join(""))}const p_=//i,f_=/xmlns:o="urn:schemas-microsoft-com/i;class b_{constructor(t){this.document=t}isActive(t){return p_.test(t)||f_.test(t)}execute(t){const{body:e,stylesString:n}=t._parsedData;a_(e,n),m_(e,t.dataTransfer.getData("text/rtf")),t.content=e}}function k_(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1===e.length?" ":Array(e.length+1).join("  ").substr(0,e.length)))}function w_(t,e){const n=new DOMParser,o=function(t){return k_(k_(t)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(t){const e="",n="",o=t.indexOf(e);if(o<0)return t;const i=t.indexOf(n,o+e.length);return t.substring(0,o+e.length)+(i>=0?t.substring(i):"")}(t=t.replace(//g,"")}(n.getData("text/html")):n.getData("text/plain")&&(((o=(o=n.getData("text/plain")).replace(//g,">").replace(/\r?\n\r?\n/g,"

    ").replace(/\r?\n/g,"
    ").replace(/\t/g,"    ").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g,"  ")).includes("

    ")||o.includes("
    "))&&(o=`

    ${o}

    `),t=o),s=this.editor.data.htmlProcessor.toView(t)}var o;const r=new m(this,"inputTransformation");this.fire(r,{content:s,dataTransfer:n,targetRanges:e.targetRanges,method:e.method}),r.stop.called&&t.stop(),i.scrollToTheSelection()}),{priority:"low"}),this.listenTo(this,"inputTransformation",((t,i)=>{if(i.content.isEmpty)return;const n=this.editor.data.toModel(i.content,"$clipboardHolder");0!=n.childCount&&(t.stop(),e.change((()=>{this.fire("contentInsertion",{content:n,method:i.method,dataTransfer:i.dataTransfer,targetRanges:i.targetRanges})})))}),{priority:"low"}),this.listenTo(this,"contentInsertion",((t,i)=>{i.resultRange=e.insertContent(i.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor,e=t.model.document,i=t.editing.view.document,n=(n,s)=>{const o=s.dataTransfer;s.preventDefault();const r=t.data.toView(t.model.getSelectedContent(e.selection));i.fire("clipboardOutput",{dataTransfer:o,content:r,method:n.name})};this.listenTo(i,"copy",n,{priority:"low"}),this.listenTo(i,"cut",((e,i)=>{t.isReadOnly?i.preventDefault():n(e,i)}),{priority:"low"}),this.listenTo(i,"clipboardOutput",((i,n)=>{n.content.isEmpty||(n.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(n.content)),n.dataTransfer.setData("text/plain",Ig(n.content))),"cut"==n.method&&t.model.deleteContent(e.selection)}),{priority:"low"})}}class Mg extends(R()){constructor(){super(),this._stack=[]}add(t,e){const i=this._stack,n=i[0];this._insertDescriptor(t);const s=i[0];n===s||Ng(n,s)||this.fire("change:top",{oldDescriptor:n,newDescriptor:s,writer:e})}remove(t,e){const i=this._stack,n=i[0];this._removeDescriptor(t);const s=i[0];n===s||Ng(n,s)||this.fire("change:top",{oldDescriptor:n,newDescriptor:s,writer:e})}_insertDescriptor(t){const e=this._stack,i=e.findIndex((e=>e.id===t.id));if(Ng(t,e[i]))return;i>-1&&e.splice(i,1);let n=0;for(;e[n]&&Bg(e[n],t);)n++;e.splice(n,0,t)}_removeDescriptor(t){const e=this._stack,i=e.findIndex((e=>e.id===t));i>-1&&e.splice(i,1)}}function Ng(t,e){return t&&e&&t.priority==e.priority&&Dg(t.classes)==Dg(e.classes)}function Bg(t,e){return t.priority>e.priority||!(t.priorityDg(e.classes)}function Dg(t){return Array.isArray(t)?t.sort().join(","):t}const Fg='',Lg="ck-widget",zg="ck-widget_selected";function Hg(t){return!!t.is("element")&&!!t.getCustomProperty("widget")}function jg(t,e,i={}){if(!t.is("containerElement"))throw new v("widget-to-widget-wrong-element-type",null,{element:t});return e.setAttribute("contenteditable","false",t),e.addClass(Lg,t),e.setCustomProperty("widget",!0,t),t.getFillerOffset=Ug,e.setCustomProperty("widgetLabel",[],t),i.label&&function(t,e){const i=t.getCustomProperty("widgetLabel");i.push(e)}(t,i.label),i.hasSelectionHandle&&function(t,e){const i=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t),i=new Wo;return i.set("content",Fg),i.render(),e.appendChild(i.element),e}));e.insert(e.createPositionAt(t,0),i),e.addClass(["ck-widget_with-selection-handle"],t)}(t,e),qg(t,e),t}function $g(t,e,i){if(e.classes&&i.addClass(so(e.classes),t),e.attributes)for(const n in e.attributes)i.setAttribute(n,e.attributes[n],t)}function Wg(t,e,i){if(e.classes&&i.removeClass(so(e.classes),t),e.attributes)for(const n in e.attributes)i.removeAttribute(n,t)}function qg(t,e,i=$g,n=Wg){const s=new Mg;s.on("change:top",((e,s)=>{s.oldDescriptor&&n(t,s.oldDescriptor,s.writer),s.newDescriptor&&i(t,s.newDescriptor,s.writer)}));e.setCustomProperty("addHighlight",((t,e,i)=>s.add(e,i)),t),e.setCustomProperty("removeHighlight",((t,e,i)=>s.remove(e,i)),t)}function Ug(){return null}const Kg="widget-type-around";function Gg(t,e,i){return!!t&&Hg(t)&&!i.isInline(e)}function Jg(t){return t.getAttribute(Kg)}const Qg=["before","after"],Yg=(new DOMParser).parseFromString('',"image/svg+xml").firstChild,Zg="ck-widget__type-around_disabled";class Xg extends lr{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[mg,Fm]}constructor(t){super(t),this._currentFakeCaretModelElement=null}init(){const t=this.editor,e=t.editing.view;this.on("change:isEnabled",((i,n,s)=>{e.change((t=>{for(const i of e.document.roots)s?t.removeClass(Zg,i):t.addClass(Zg,i)})),s||t.model.change((t=>{t.removeSelectionAttribute(Kg)}))})),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableInsertObjectIntegration(),this._enableDeleteContentIntegration()}destroy(){super.destroy(),this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const i=this.editor,n=i.editing.view,s=i.model.schema.getAttributesWithProperty(t,"copyOnReplace",!0);i.execute("insertParagraph",{position:i.model.createPositionAt(t,e),attributes:s}),n.focus(),n.scrollToTheSelection()}_listenToIfEnabled(t,e,i,n){this.listenTo(t,e,((...t)=>{this.isEnabled&&i(...t)}),n)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor.model.document.selection,e=Jg(t);if(!e)return!1;const i=t.getSelectedElement();return this._insertParagraph(i,e),!0}_enableTypeAroundUIInjection(){const t=this.editor,e=t.model.schema,i=t.locale.t,n={before:i("Insert paragraph before block"),after:i("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,s,o)=>{const r=o.mapper.toViewElement(s.item);if(r&&Gg(r,s.item,e)){!function(t,e,i){const n=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const i=this.toDomElement(t);return function(t,e){for(const i of Qg){const n=new ko({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${i}`],title:e[i],"aria-hidden":"true"},children:[t.ownerDocument.importNode(Yg,!0)]});t.appendChild(n.render())}}(i,e),function(t){const e=new ko({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}(i),i}));t.insert(t.createPositionAt(i,"end"),n)}(o.writer,n,r);r.getCustomProperty("widgetLabel").push((()=>this.isEnabled?i("Press Enter to type after or press Shift + Enter to type before the widget"):""))}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor,e=t.model,i=e.document.selection,n=e.schema,s=t.editing.view;function o(t){return`ck-widget_type-around_show-fake-caret_${t}`}this._listenToIfEnabled(s.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[Hg,"$text"],priority:"high"}),this._listenToIfEnabled(i,"change:range",((e,i)=>{i.directChange&&t.model.change((t=>{t.removeSelectionAttribute(Kg)}))})),this._listenToIfEnabled(e.document,"change:data",(()=>{const e=i.getSelectedElement();if(e){if(Gg(t.editing.mapper.toViewElement(e),e,n))return}t.model.change((t=>{t.removeSelectionAttribute(Kg)}))})),this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,i)=>{const s=i.writer;if(this._currentFakeCaretModelElement){const t=i.mapper.toViewElement(this._currentFakeCaretModelElement);t&&(s.removeClass(Qg.map(o),t),this._currentFakeCaretModelElement=null)}const r=e.selection.getSelectedElement();if(!r)return;const a=i.mapper.toViewElement(r);if(!Gg(a,r,n))return;const l=Jg(e.selection);l&&(s.addClass(o(l),a),this._currentFakeCaretModelElement=r)})),this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,i,n)=>{n||t.model.change((t=>{t.removeSelectionAttribute(Kg)}))}))}_handleArrowKeyPress(t,e){const i=this.editor,n=i.model,s=n.document.selection,o=n.schema,r=i.editing.view,a=function(t,e){const i=no(t,e);return"down"===i||"right"===i}(e.keyCode,i.locale.contentLanguageDirection),l=r.document.selection.getSelectedElement();let c;Gg(l,i.editing.mapper.toModelElement(l),o)?c=this._handleArrowKeyPressOnSelectedWidget(a):s.isCollapsed?c=this._handleArrowKeyPressWhenSelectionNextToAWidget(a):e.shiftKey||(c=this._handleArrowKeyPressWhenNonCollapsedSelection(a)),c&&(e.preventDefault(),t.stop())}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor.model,i=Jg(e.document.selection);return e.change((e=>{if(!i)return e.setSelectionAttribute(Kg,t?"after":"before"),!0;if(!(i===(t?"after":"before")))return e.removeSelectionAttribute(Kg),!0;return!1}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor,i=e.model,n=i.schema,s=e.plugins.get("Widget"),o=s._getObjectElementNextToSelection(t);return!!Gg(e.editing.mapper.toViewElement(o),o,n)&&(i.change((e=>{s._setSelectionOverElement(o),e.setSelectionAttribute(Kg,t?"before":"after")})),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(t){const e=this.editor,i=e.model,n=i.schema,s=e.editing.mapper,o=i.document.selection,r=t?o.getLastPosition().nodeBefore:o.getFirstPosition().nodeAfter;return!!Gg(s.toViewElement(r),r,n)&&(i.change((e=>{e.setSelection(r,"on"),e.setSelectionAttribute(Kg,t?"after":"before")})),!0)}_enableInsertingParagraphsOnButtonClick(){const t=this.editor,e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((i,n)=>{const s=n.domTarget.closest(".ck-widget__type-around__button");if(!s)return;const o=function(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}(s),r=function(t,e){const i=t.closest(".ck-widget");return e.mapDomToView(i)}(s,e.domConverter),a=t.editing.mapper.toModelElement(r);this._insertParagraph(a,o),n.preventDefault(),i.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor,e=t.model.document.selection,i=t.editing.view;this._listenToIfEnabled(i.document,"enter",((i,n)=>{if("atTarget"!=i.eventPhase)return;const s=e.getSelectedElement(),o=t.editing.mapper.toViewElement(s),r=t.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:Gg(o,s,r)&&(this._insertParagraph(s,n.isSoft?"before":"after"),a=!0),a&&(n.preventDefault(),i.stop())}),{context:Hg})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor.editing.view.document;this._listenToIfEnabled(t,"insertText",((e,i)=>{this._insertParagraphAccordingToFakeCaretPosition()&&(i.selection=t.selection)}),{priority:"high"}),r.isAndroid?this._listenToIfEnabled(t,"keydown",((t,e)=>{229==e.keyCode&&this._insertParagraphAccordingToFakeCaretPosition()})):this._listenToIfEnabled(t,"compositionstart",(()=>{this._insertParagraphAccordingToFakeCaretPosition()}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor,e=t.editing.view,i=t.model,n=i.schema;this._listenToIfEnabled(e.document,"delete",((e,s)=>{if("atTarget"!=e.eventPhase)return;const o=Jg(i.document.selection);if(!o)return;const r=s.direction,a=i.document.selection.getSelectedElement(),l="forward"==r;if("before"===o===l)t.execute("delete",{selection:i.createSelection(a,"on")});else{const e=n.getNearestSelectionRange(i.createPositionAt(a,o),r);if(e)if(e.isCollapsed){const s=i.createSelection(e.start);if(i.modifySelection(s,{direction:r}),s.focus.isEqual(e.start)){const t=function(t,e){let i=e;for(const n of e.getAncestors({parentFirst:!0})){if(n.childCount>1||t.isLimit(n))break;i=n}return i}(n,e.start.parent);i.deleteContent(i.createSelection(t,"on"),{doNotAutoparagraph:!0})}else i.change((i=>{i.setSelection(e),t.execute(l?"deleteForward":"delete")}))}else i.change((i=>{i.setSelection(e),t.execute(l?"deleteForward":"delete")}))}s.preventDefault(),e.stop()}),{context:Hg})}_enableInsertContentIntegration(){const t=this.editor,e=this.editor.model,i=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[n,s])=>{if(s&&!s.is("documentSelection"))return;const o=Jg(i);return o?(t.stop(),e.change((t=>{const s=i.getSelectedElement(),r=e.createPositionAt(s,o),a=t.createSelection(r),l=e.insertContent(n,a);return t.setSelection(a),l}))):void 0}),{priority:"high"})}_enableInsertObjectIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"insertObject",((t,i)=>{const[,n,,s={}]=i;if(n&&!n.is("documentSelection"))return;const o=Jg(e);o&&(s.findOptimalPosition=o,i[3]=s)}),{priority:"high"})}_enableDeleteContentIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"deleteContent",((t,[i])=>{if(i&&!i.is("documentSelection"))return;Jg(e)&&t.stop()}),{priority:"high"})}}function tp(t){const e=t.model;return(i,n)=>{const s=n.keyCode==Zs.arrowup,o=n.keyCode==Zs.arrowdown,r=n.shiftKey,a=e.document.selection;if(!s&&!o)return;const l=o;if(r&&function(t,e){return!t.isCollapsed&&t.isBackward==e}(a,l))return;const c=function(t,e,i){const n=t.model;if(i){const t=e.isCollapsed?e.focus:e.getLastPosition(),i=ep(n,t,"forward");if(!i)return null;const s=n.createRange(t,i),o=ip(n.schema,s,"backward");return o?n.createRange(t,o):null}{const t=e.isCollapsed?e.focus:e.getFirstPosition(),i=ep(n,t,"backward");if(!i)return null;const s=n.createRange(i,t),o=ip(n.schema,s,"forward");return o?n.createRange(o,t):null}}(t,a,l);if(c){if(c.isCollapsed){if(a.isCollapsed)return;if(r)return}(c.isCollapsed||function(t,e,i){const n=t.model,s=t.view.domConverter;if(i){const t=n.createSelection(e.start);n.modifySelection(t),t.focus.isAtEnd||e.start.isEqual(t.focus)||(e=n.createRange(t.focus,e.end))}const o=t.mapper.toViewRange(e),r=s.viewRangeToDom(o),a=Ps.getDomRangeRects(r);let l;for(const t of a)if(void 0!==l){if(Math.round(t.top)>=l)return!1;l=Math.max(l,Math.round(t.bottom))}else l=Math.round(t.bottom);return!0}(t,c,l))&&(e.change((t=>{const i=l?c.end:c.start;if(r){const n=e.createSelection(a.anchor);n.setFocus(i),t.setSelection(n)}else t.setSelection(i)})),i.stop(),n.preventDefault(),n.stopPropagation())}}}function ep(t,e,i){const n=t.schema,s=t.createRangeIn(e.root),o="forward"==i?"elementStart":"elementEnd";for(const{previousPosition:t,item:r,type:a}of s.getWalker({startPosition:e,direction:i})){if(n.isLimit(r)&&!n.isInline(r))return t;if(a==o&&n.isBlock(r))return null}return null}function ip(t,e,i){const n="backward"==i?e.end:e.start;if(t.checkChild(n,"$text"))return n;for(const{nextPosition:n}of e.getWalker({direction:i}))if(t.checkChild(n,"$text"))return n;return null}class np extends lr{static get pluginName(){return"Widget"}static get requires(){return[Xg,Fm]}init(){const t=this.editor,e=t.editing.view,i=e.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",((e,i,n)=>{const s=n.writer,o=i.selection;if(o.isCollapsed)return;const r=o.getSelectedElement();if(!r)return;const a=t.editing.mapper.toViewElement(r);var l;Hg(a)&&(n.consumable.consume(o,"selection")&&s.setSelection(s.createRangeOn(a),{fake:!0,label:(l=a,l.getCustomProperty("widgetLabel").reduce(((t,e)=>"function"==typeof e?t?t+". "+e():e():t?t+". "+e:e),""))}))})),this.editor.editing.downcastDispatcher.on("selection",((t,e,i)=>{this._clearPreviouslySelectedWidgets(i.writer);const n=i.writer,s=n.document.selection;let o=null;for(const t of s.getRanges())for(const e of t){const t=e.item;Hg(t)&&!sp(t,o)&&(n.addClass(zg,t),this._previouslySelected.add(t),o=t)}}),{priority:"low"}),e.addObserver(lf),this.listenTo(i,"mousedown",((...t)=>this._onMousedown(...t))),this.listenTo(i,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[Hg,"$text"]}),this.listenTo(i,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"}),this.listenTo(i,"arrowKey",tp(this.editor.editing),{context:"$text"}),this.listenTo(i,"delete",((t,e)=>{this._handleDelete("forward"==e.direction)&&(e.preventDefault(),t.stop())}),{context:"$root"})}_onMousedown(t,e){const i=this.editor,n=i.editing.view,s=n.document;let o=e.target;if(function(t){let e=t;for(;e;){if(e.is("editableElement")&&!e.is("rootElement"))return!0;if(Hg(e))return!1;e=e.parent}return!1}(o)){if((r.isSafari||r.isGecko)&&e.domEvent.detail>=3){const t=i.editing.mapper,n=o.is("attributeElement")?o.findAncestor((t=>!t.is("attributeElement"))):o,s=t.toModelElement(n);e.preventDefault(),this.editor.model.change((t=>{t.setSelection(s,"in")}))}return}if(!Hg(o)&&(o=o.findAncestor(Hg),!o))return;r.isAndroid&&e.preventDefault(),s.isFocused||n.focus();const a=i.editing.mapper.toModelElement(o);this._setSelectionOverElement(a)}_handleSelectionChangeOnArrowKeyPress(t,e){const i=e.keyCode,n=this.editor.model,s=n.schema,o=n.document.selection,r=o.getSelectedElement(),a=no(i,this.editor.locale.contentLanguageDirection),l="down"==a||"right"==a,c="up"==a||"down"==a;if(r&&s.isObject(r)){const i=l?o.getLastPosition():o.getFirstPosition(),r=s.getNearestSelectionRange(i,l?"forward":"backward");return void(r&&(n.change((t=>{t.setSelection(r)})),e.preventDefault(),t.stop()))}if(!o.isCollapsed&&!e.shiftKey){const i=o.getFirstPosition(),r=o.getLastPosition(),a=i.nodeAfter,c=r.nodeBefore;return void((a&&s.isObject(a)||c&&s.isObject(c))&&(n.change((t=>{t.setSelection(l?r:i)})),e.preventDefault(),t.stop()))}if(!o.isCollapsed)return;const h=this._getObjectElementNextToSelection(l);if(h&&s.isObject(h)){if(s.isInline(h)&&c)return;this._setSelectionOverElement(h),e.preventDefault(),t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const i=this.editor.model,n=i.schema,s=i.document.selection.getSelectedElement();s&&n.isObject(s)&&(e.preventDefault(),t.stop())}_handleDelete(t){if(this.editor.isReadOnly)return;const e=this.editor.model.document.selection;if(!e.isCollapsed)return;const i=this._getObjectElementNextToSelection(t);return i?(this.editor.model.change((t=>{let n=e.anchor.parent;for(;n.isEmpty;){const e=n;n=e.parent,t.remove(e)}this._setSelectionOverElement(i)})),!0):void 0}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model,i=e.schema,n=e.document.selection,s=e.createSelection(n);if(e.modifySelection(s,{direction:t?"forward":"backward"}),s.isEqual(n))return null;const o=t?s.focus.nodeBefore:s.focus.nodeAfter;return o&&i.isObject(o)?o:null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected)t.removeClass(zg,e);this._previouslySelected.clear()}}function sp(t,e){return!!e&&Array.from(t.getAncestors()).includes(e)}class op extends(q()){constructor(t){super(),this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=t,this._referenceCoordinates=null}get originalWidth(){return this._originalWidth}get originalHeight(){return this._originalHeight}get originalWidthPercents(){return this._originalWidthPercents}get aspectRatio(){return this._aspectRatio}begin(t,e,i){const n=new Rect(e);this.activeHandlePosition=function(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const i of e)if(t.classList.contains(getResizerHandleClass(i)))return i}(t),this._referenceCoordinates=function(t,e){const i=new Rect(t),n=e.split("-"),s={x:"right"==n[1]?i.right:i.left,y:"bottom"==n[0]?i.bottom:i.top};return s.x+=t.ownerDocument.defaultView.scrollX,s.y+=t.ownerDocument.defaultView.scrollY,s}(e,function(t){const e=t.split("-"),i={top:"bottom",bottom:"top",left:"right",right:"left"};return`${i[e[0]]}-${i[e[1]]}`}(this.activeHandlePosition)),this._originalWidth=n.width,this._originalHeight=n.height,this._aspectRatio=n.width/n.height;const s=i.style.width;s&&s.match(/^\d+(\.\d*)?%$/)?this._originalWidthPercents=parseFloat(s):this._originalWidthPercents=function(t,e){const i=t.parentElement,n=parseFloat(i.ownerDocument.defaultView.getComputedStyle(i).width);return e.width/n*100}(i,n)}update(t){this.proposedWidth=t.width,this.proposedHeight=t.height,this.proposedWidthPercents=t.widthPercents,this.proposedHandleHostWidth=t.handleHostWidth,this.proposedHandleHostHeight=t.handleHostHeight}}class rp extends(q()){constructor(t){super(),this._options=t,this._viewResizerWrapper=null,this.set("isEnabled",!0),this.set("isSelected",!1),this.bind("isVisible").to(this,"isEnabled",this,"isSelected",((t,e)=>t&&e)),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",(t=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),t.stop())}),{priority:"high"})}get state(){return this._state}show(){this._options.editor.editing.view.change((t=>{t.removeClass("ck-hidden",this._viewResizerWrapper)}))}hide(){this._options.editor.editing.view.change((t=>{t.addClass("ck-hidden",this._viewResizerWrapper)}))}attach(){const t=this,e=this._options.viewElement;this._options.editor.editing.view.change((i=>{const n=i.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(e){const i=this.toDomElement(e);return t._appendHandles(i),t._appendSizeUI(i),i}));i.insert(i.createPositionAt(e,"end"),n),i.addClass("ck-widget_with-resizer",e),this._viewResizerWrapper=n,this.isVisible||this.hide()})),this.on("change:isVisible",(()=>{this.isVisible?(this.show(),this.redraw()):this.hide()}))}begin(t){this._state=new ResizeState(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(t,this._getHandleHost(),this._getResizeHost())}updateSize(t){const e=this._proposeNewSize(t);this._options.editor.editing.view.change((t=>{const i=this._options.unit||"%",n=("%"===i?e.widthPercents:e.width)+i;t.setStyle("width",n,this._options.viewElement)}));const i=this._getHandleHost(),n=new Rect(i),s=Math.round(n.width),o=Math.round(n.height),r=new Rect(i);e.width=Math.round(r.width),e.height=Math.round(r.height),this.redraw(n),this.state.update({...e,handleHostWidth:s,handleHostHeight:o})}commit(){const t=this._options.unit||"%",e=("%"===t?this.state.proposedWidthPercents:this.state.proposedWidth)+t;this._options.editor.editing.view.change((()=>{this._cleanup(),this._options.onCommit(e)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(t){const e=this._domResizerWrapper;if(!(e&&i.ownerDocument&&i.ownerDocument.contains(i)))return;var i;const n=e.parentElement,s=this._getHandleHost(),o=this._viewResizerWrapper,r=[o.getStyle("width"),o.getStyle("height"),o.getStyle("left"),o.getStyle("top")];let a;if(n.isSameNode(s)){const e=t||new Rect(s);[e.width+"px",e.height+"px",void 0,void 0]}else[s.offsetWidth+"px",s.offsetHeight+"px",s.offsetLeft+"px",s.offsetTop+"px"];"same"!==compareArrays(r,a)&&this._options.editor.editing.view.change((t=>{t.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},o)}))}containsHandle(t){return this._domResizerWrapper.contains(t)}static isResizeHandle(t){return t.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change((t=>{t.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(t){const e=this.state,i={x:t.pageX,y:n.pageY};var n;const s=!this._options.isCentered||this._options.isCentered(this),o={x:e._referenceCoordinates.x-(i.x+e.originalWidth),y:i.y-e.originalHeight-e._referenceCoordinates.y};s&&e.activeHandlePosition.endsWith("-right")&&(o.x=i.x-(e._referenceCoordinates.x+e.originalWidth)),s&&(o.x*=2);let r=Math.abs(e.originalWidth+o.x),a=Math.abs(e.originalHeight+o.y);return"width"==(r/e.aspectRatio>a?"width":"height")?r/e.aspectRatio:a*e.aspectRatio,{width:Math.round(r),height:Math.round(a),widthPercents:Math.min(Math.round(e.originalWidthPercents/e.originalWidth*r*100)/100,100)}}_getResizeHost(){const t=this._domResizerWrapper.parentElement;return this._options.getResizeHost(t)}_getHandleHost(){const t=this._domResizerWrapper.parentElement;return this._options.getHandleHost(t)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e)t.appendChild(new Template({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(n,`ck-widget__resizer__handle-${i}`)}}).render());var i}_appendSizeUI(t){this._sizeView=new SizeView,this._sizeView.render(),t.appendChild(this._sizeView.element)}}var ap="Expected a function";const lp=function(t,e,i){var n=!0,s=!0;if("function"!=typeof t)throw new TypeError(ap);return F(i)&&(n="leading"in i?!!i.leading:n,s="trailing"in i?!!i.trailing:s),dc(t,e,{leading:n,maxWait:e,trailing:s})};class cp extends lr{static get pluginName(){return"DragDrop"}static get requires(){return[Vg,np]}init(){const t=this.editor,e=t.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,this._updateDropMarkerThrottled=lp((t=>this._updateDropMarker(t)),40),this._removeDropMarkerDelayed=up((()=>this._removeDropMarker()),40),this._clearDraggableAttributesDelayed=up((()=>this._clearDraggableAttributes()),40),e.addObserver(Rg),e.addObserver(lf),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDropMarker(),this._setupDraggableAttributeHandling(),this.listenTo(t,"change:isReadOnly",((t,e,i)=>{i?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})),this.on("change:isEnabled",((t,e,i)=>{i||this._finalizeDragging(!1)})),r.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._updateDropMarkerThrottled.cancel(),this._removeDropMarkerDelayed.cancel(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const t=this.editor,e=t.model,i=e.document,n=t.editing.view,s=n.document;this.listenTo(s,"dragstart",((n,o)=>{const r=i.selection;if(o.target&&o.target.is("editableElement"))return void o.preventDefault();const a=o.target?fp(o.target):null;if(a){const i=t.editing.mapper.toModelElement(a);this._draggedRange=Mh.fromRange(e.createRangeOn(i)),t.plugins.has("WidgetToolbarRepository")&&t.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}else if(!s.selection.isCollapsed){const t=s.selection.getSelectedElement();t&&Hg(t)||(this._draggedRange=Mh.fromRange(r.getFirstRange()))}if(!this._draggedRange)return void o.preventDefault();this._draggingUid=p(),o.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",o.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const l=e.createSelection(this._draggedRange.toRange()),c=t.data.toView(e.getSelectedContent(l));s.fire("clipboardOutput",{dataTransfer:o.dataTransfer,content:c,method:"dragstart"}),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")}),{priority:"low"}),this.listenTo(s,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&"move"==e.dataTransfer.dropEffect)}),{priority:"low"}),this.listenTo(s,"dragenter",(()=>{this.isEnabled&&n.focus()})),this.listenTo(s,"dragleave",(()=>{this._removeDropMarkerDelayed()})),this.listenTo(s,"dragging",((e,i)=>{if(!this.isEnabled)return void(i.dataTransfer.dropEffect="none");this._removeDropMarkerDelayed.cancel();const n=hp(t,i.targetRanges,i.target);this._draggedRange||(i.dataTransfer.dropEffect="copy"),r.isGecko||("copy"==i.dataTransfer.effectAllowed?i.dataTransfer.dropEffect="copy":["all","copyMove"].includes(i.dataTransfer.effectAllowed)&&(i.dataTransfer.dropEffect="move")),n&&this._updateDropMarkerThrottled(n)}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"clipboardInput",((e,i)=>{if("drop"!=i.method)return;const n=hp(t,i.targetRanges,i.target);if(this._removeDropMarker(),!n)return this._finalizeDragging(!1),void e.stop();this._draggedRange&&this._draggingUid!=i.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==dp(i.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(n,!0))return this._finalizeDragging(!1),void e.stop();i.targetRanges=[t.editing.mapper.toViewRange(n)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get(Vg);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const i=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(i)))}),{priority:"high"}),t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const i="move"==dp(e.dataTransfer),n=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(n&&i)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor,e=t.editing.view,i=e.document;this.listenTo(i,"mousedown",((n,s)=>{if(r.isAndroid||!s)return;this._clearDraggableAttributesDelayed.cancel();let o=fp(s.target);if(r.isBlink&&!t.isReadOnly&&!o&&!i.selection.isCollapsed){const t=i.selection.getSelectedElement();t&&Hg(t)||(o=i.selection.editableElement)}o&&(e.change((t=>{t.setAttribute("draggable","true",o)})),this._draggableElement=t.editing.mapper.toModelElement(o))})),this.listenTo(i,"mouseup",(()=>{r.isAndroid||this._clearDraggableAttributesDelayed()}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement)),this._draggableElement=null}))}_setupDropMarker(){const t=this.editor;t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:i})=>{if(t.model.schema.checkChild(e.markerRange.start,"$text"))return i.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);return e.append("⁠",t.createElement("span"),"⁠"),e}))}})}_updateDropMarker(t){const e=this.editor,i=e.model.markers;e.model.change((e=>{i.has("drop-target")?i.get("drop-target").getRange().isEqual(t)||e.updateMarker("drop-target",{range:t}):e.addMarker("drop-target",{range:t,usingOperation:!1,affectsData:!1})}))}_removeDropMarker(){const t=this.editor.model;this._removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),t.markers.has("drop-target")&&t.change((t=>{t.removeMarker("drop-target")}))}_finalizeDragging(t){const e=this.editor,i=e.model;this._removeDropMarker(),this._clearDraggableAttributes(),e.plugins.has("WidgetToolbarRepository")&&e.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop"),this._draggingUid="",this._draggedRange&&(t&&this.isEnabled&&i.deleteContent(i.createSelection(this._draggedRange),{doNotAutoparagraph:!0}),this._draggedRange.detach(),this._draggedRange=null)}}function hp(t,e,i){const n=t.model,s=t.editing.mapper;let o=null;const a=e?e[0].start:null;if(i.is("uiElement")&&(i=i.parent),o=function(t,e){const i=t.model,n=t.editing.mapper;if(Hg(e))return i.createRangeOn(n.toModelElement(e));if(!e.is("editableElement")){const t=e.findAncestor((t=>Hg(t)||t.is("editableElement")));if(Hg(t))return i.createRangeOn(n.toModelElement(t))}return null}(t,i),o)return o;const l=function(t,e){const i=t.editing.mapper,n=t.editing.view,s=i.toModelElement(e);if(s)return s;const o=n.createPositionBefore(e),r=i.findMappedViewAncestor(o);return i.toModelElement(r)}(t,i),c=a?s.toModelPosition(a):null;return c?(o=function(t,e,i){const n=t.model;if(!n.schema.checkChild(i,"$block"))return null;const s=n.createPositionAt(i,0),o=e.path.slice(0,s.path.length),r=n.createPositionFromPath(e.root,o),a=r.nodeAfter;if(a&&n.schema.isObject(a))return n.createRangeOn(a);return null}(t,c,l),o||(o=n.schema.getNearestSelectionRange(c,r.isGecko?"forward":"backward"),o||function(t,e){const i=t.model;let n=e;for(;n;){if(i.schema.isObject(n))return i.createRangeOn(n);n=n.parent}return null}(t,c.parent))):function(t,e){const i=t.model,n=i.schema,s=i.createPositionAt(e,0);return n.getNearestSelectionRange(s,"forward")}(t,l)}function dp(t){return r.isGecko?t.dropEffect:["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function up(t,e){let i;function n(...s){n.cancel(),i=setTimeout((()=>t(...s)),e)}return n.cancel=()=>{clearTimeout(i)},n}function fp(t){if(t.is("editableElement"))return null;if(t.hasClass("ck-widget__selection-handle"))return t.findAncestor(Hg);if(Hg(t))return t;const e=t.findAncestor((t=>Hg(t)||t.is("editableElement")));return Hg(e)?e:null}class mp extends lr{static get pluginName(){return"PastePlainText"}static get requires(){return[Vg]}init(){const t=this.editor,e=t.model,i=t.editing.view,n=i.document,s=e.document.selection;let o=!1;i.addObserver(Rg),this.listenTo(n,"keydown",((t,e)=>{o=e.shiftKey})),t.plugins.get(Vg).on("contentInsertion",((t,i)=>{(o||function(t,e){if(t.childCount>1)return!1;const i=t.getChild(0);if(e.isObject(i))return!1;return 0==Array.from(i.getAttributeKeys()).length}(i.content,e.schema))&&e.change((t=>{const n=Array.from(s.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));s.isCollapsed||e.deleteContent(s,{doNotAutoparagraph:!0}),n.push(...s.getAttributes());const o=t.createRangeIn(i.content);for(const e of o.getItems())e.is("$textProxy")&&t.setAttributes(n,e)}))}))}}class gp extends lr{static get pluginName(){return"Clipboard"}static get requires(){return[Vg,cp,mp]}}class pp extends hr{constructor(t){super(t),this.affectsData=!1}execute(){const t=this.editor.model,e=t.document.selection;let i=t.schema.getLimitElement(e);if(e.containsEntireContent(i)||!wp(t.schema,i))do{if(i=i.parent,!i)return}while(!wp(t.schema,i));t.change((t=>{t.setSelection(i,"in")}))}}function wp(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const bp=eo("Ctrl+A");class _p extends lr{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor,e=t.editing.view.document;t.commands.add("selectAll",new pp(t)),this.listenTo(e,"keydown",((e,i)=>{to(i)===bp&&(t.execute("selectAll"),i.preventDefault())}))}}class vp extends lr{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(e=>{const i=t.commands.get("selectAll"),n=new qo(e),s=e.t;return n.set({label:s("Select all"),icon:'',keystroke:"Ctrl+A",tooltip:!0}),n.bind("isEnabled").to(i,"isEnabled"),this.listenTo(n,"execute",(()=>{t.execute("selectAll"),t.editing.view.focus()})),n}))}}class yp extends lr{static get requires(){return[_p,vp]}static get pluginName(){return"SelectAll"}}class kp extends hr{constructor(t){super(t),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this.listenTo(t.data,"set",((t,e)=>{e[1]={...e[1]};const i=e[1];i.batchType||(i.batchType={isUndoable:!1})}),{priority:"high"}),this.listenTo(t.data,"set",((t,e)=>{e[1].batchType.isUndoable||this.clearStack()}))}refresh(){this.isEnabled=this._stack.length>0}addBatch(t){const e=this.editor.model.document.selection,i={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:i}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(t,e,i){const n=this.editor.model,s=n.document,o=[],r=t.map((t=>t.getTransformedByOperations(i))),a=r.flat();for(const t of r){const e=t.filter((t=>t.root!=s.graveyard)).filter((t=>!xp(t,a)));e.length&&(Ap(e),o.push(e[0]))}o.length&&n.change((t=>{t.setSelection(o,{backward:e})}))}_undo(t,e){const i=this.editor.model,n=i.document;this._createdBatches.add(e);const s=t.operations.slice().filter((t=>t.isDocumentOperation));s.reverse();for(const t of s){const s=t.baseVersion+1,o=Array.from(n.history.getOperations(s)),r=hu([t.getReversed()],o,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const s of r)e.addOperation(s),i.applyOperation(s),n.history.setOperationAsUndone(t,s)}}}function Ap(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;ee!==t&&e.containsRange(t,!0)))}class Cp extends kp{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1,i=this._stack.splice(e,1)[0],n=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(n,(()=>{this._undo(i.batch,n);const t=this.editor.model.document.history.getOperations(i.batch.baseVersion);this._restoreSelection(i.selection.ranges,i.selection.isBackward,t),this.fire("revert",i.batch,n)})),this.refresh()}}class Pp extends kp{execute(){const t=this._stack.pop(),e=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(e,(()=>{const i=t.batch.operations[t.batch.operations.length-1].baseVersion+1,n=this.editor.model.document.history.getOperations(i);this._restoreSelection(t.selection.ranges,t.selection.isBackward,n),this._undo(t.batch,e)})),this.refresh()}}class Tp extends lr{static get pluginName(){return"UndoEditing"}constructor(t){super(t),this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new Cp(t),this._redoCommand=new Pp(t),t.commands.add("undo",this._undoCommand),t.commands.add("redo",this._redoCommand),this.listenTo(t.model,"applyOperation",((t,e)=>{const i=e[0];if(!i.isDocumentOperation)return;const n=i.batch,s=this._redoCommand._createdBatches.has(n),o=this._undoCommand._createdBatches.has(n);this._batchRegistry.has(n)||(this._batchRegistry.add(n),n.isUndoable&&(s?this._undoCommand.addBatch(n):o||(this._undoCommand.addBatch(n),this._redoCommand.clearStack())))}),{priority:"highest"}),this.listenTo(this._undoCommand,"revert",((t,e,i)=>{this._redoCommand.addBatch(i)})),t.keystrokes.set("CTRL+Z","undo"),t.keystrokes.set("CTRL+Y","redo"),t.keystrokes.set("CTRL+SHIFT+Z","redo")}}const Ep='',Sp='';class Rp extends lr{static get pluginName(){return"UndoUI"}init(){const t=this.editor,e=t.locale,i=t.t,n="ltr"==e.uiLanguageDirection?Ep:Sp,s="ltr"==e.uiLanguageDirection?Sp:Ep;this._addButton("undo",i("Undo"),"CTRL+Z",n),this._addButton("redo",i("Redo"),"CTRL+Y",s)}_addButton(t,e,i,n){const s=this.editor;s.ui.componentFactory.add(t,(o=>{const r=s.commands.get(t),a=new qo(o);return a.set({label:e,icon:n,keystroke:i,tooltip:!0}),a.bind("isEnabled").to(r,"isEnabled"),this.listenTo(a,"execute",(()=>{s.execute(t),s.editing.view.focus()})),a}))}}class Op extends lr{static get requires(){return[Tp,Rp]}static get pluginName(){return"Undo"}}class Ip extends hr{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=e.selection.getAttribute(this.attributeKey),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=t.value;e.change((t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,n):t.removeSelectionAttribute(this.attributeKey);else{const s=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of s)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}}))}}class Vp extends co{constructor(t){super(t),this.set("isEmpty",!0),this.on("change",(()=>{this.set("isEmpty",0===this.length)}))}add(t,e){this.find((e=>e.color===t.color))||super.add(t,e)}hasColor(t){return!!this.find((e=>e.color===t))}}u(Vp,q);class Mp extends yo{constructor(t,{colors:e,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o}){super(t),this.items=this.createCollection(),this.colorDefinitions=e,this.focusTracker=new uo,this.keystrokes=new fo,this.set("selectedColor"),this.removeButtonLabel=n,this.columns=i,this.documentColors=new Vp,this.documentColorsCount=o,this._focusables=new vo,this._focusCycler=new nr({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this._documentColorsLabel=s,this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-table"]},children:this.items}),this.items.add(this._createRemoveColorButton())}updateDocumentColors(t,e){const i=t.document,n=this.documentColorsCount;this.documentColors.clear();for(const s of i.getRootNames()){const o=i.getRoot(s),r=t.createRangeIn(o);for(const t of r.getItems())if(t.is("$textProxy")&&t.hasAttribute(e)&&(this._addColorToDocumentColors(t.getAttribute(e)),this.documentColors.length>=n))return}}updateSelectedColors(){const t=this.documentColorsGrid,e=this.staticColorsGrid,i=this.selectedColor;e.selectedColor=i,t&&(t.selectedColor=i)}render(){super.render(),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}appendGrids(){if(!this.staticColorsGrid&&(this.staticColorsGrid=this._createStaticColorsGrid(),this.items.add(this.staticColorsGrid),this.focusTracker.add(this.staticColorsGrid.element),this._focusables.add(this.staticColorsGrid),this.documentColorsCount)){const t=ko.bind(this.documentColors,this.documentColors),e=new Gf(this.locale);e.text=this._documentColorsLabel,e.extendTemplate({attributes:{class:["ck","ck-color-grid__label",t.if("isEmpty","ck-hidden")]}}),this.items.add(e),this.documentColorsGrid=this._createDocumentColorsGrid(),this.items.add(this.documentColorsGrid),this.focusTracker.add(this.documentColorsGrid.element),this._focusables.add(this.documentColorsGrid)}}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}_createRemoveColorButton(){const t=new qo;return t.set({withText:!0,icon:yf.eraser,label:this.removeButtonLabel}),t.class="ck-color-table__remove-color",t.on("execute",(()=>{this.fire("execute",{value:null})})),t.render(),this.focusTracker.add(t.element),this._focusables.add(t),t}_createStaticColorsGrid(){const t=new Jo(this.locale,{colorDefinitions:this.colorDefinitions,columns:this.columns});return t.delegate("execute").to(this),t}_createDocumentColorsGrid(){const t=ko.bind(this.documentColors,this.documentColors),e=new Jo(this.locale,{columns:this.columns});return e.delegate("execute").to(this),e.extendTemplate({attributes:{class:t.if("isEmpty","ck-hidden")}}),e.items.bindTo(this.documentColors).using((t=>{const e=new Go;return e.set({color:t.color,hasBorder:t.options&&t.options.hasBorder}),t.label&&e.set({label:t.label,tooltip:!0}),e.on("execute",(()=>{this.fire("execute",{value:t.color})})),e})),this.documentColors.on("change:isEmpty",((t,i,n)=>{n&&(e.selectedColor=null)})),e}_addColorToDocumentColors(t){const e=this.colorDefinitions.find((e=>e.color===t));e?this.documentColors.add(Object.assign({},e)):this.documentColors.add({color:t,label:t,options:{hasBorder:!1}})}}const Np="fontSize",Bp="fontFamily",Dp="fontColor";function Fp(t,e){const i={model:{key:t,values:[]},view:{},upcastAlso:{}};for(const t of e)i.model.values.push(t.model),i.view[t.model]=t.view,t.upcastAlso&&(i.upcastAlso[t.model]=t.upcastAlso);return i}function Lp(t){return(e,{writer:i})=>i.createAttributeElement("span",{style:`${t}:${e}`},{priority:7})}class zp extends Ip{constructor(t){super(t,Dp)}}class Hp extends lr{static get pluginName(){return"FontColorEditing"}constructor(t){var e;super(t),t.config.define(Dp,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5}),t.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{color:/[\s\S]+/}},model:{key:Dp,value:(e="color",t=>t.getStyle(e).replace(/\s/g,""))}}),t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{color:/^#?\w+$/}},model:{key:Dp,value:t=>t.getAttribute("color")}}),t.conversion.for("downcast").attributeToElement({model:Dp,view:Lp("color")}),t.commands.add(Dp,new zp(t)),t.model.schema.extend("$text",{allowAttributes:Dp}),t.model.schema.setAttributeProperties(Dp,{isFormatting:!0,copyOnEnter:!0})}}class jp extends lr{constructor(t,{commandName:e,icon:i,componentName:n,dropdownLabel:s}){super(t),this.commandName=e,this.componentName=n,this.icon=i,this.dropdownLabel=s,this.columns=t.config.get(`${this.componentName}.columns`),this.colorTableView=void 0}init(){const t=this.editor,e=t.locale,i=e.t,n=t.commands.get(this.commandName);const s=function(t,e){const i=t.t,n={Black:i("Black"),"Dim grey":i("Dim grey"),Grey:i("Grey"),"Light grey":i("Light grey"),White:i("White"),Red:i("Red"),Orange:i("Orange"),Yellow:i("Yellow"),"Light green":i("Light green"),Green:i("Green"),Aquamarine:i("Aquamarine"),Turquoise:i("Turquoise"),"Light blue":i("Light blue"),Blue:i("Blue"),Purple:i("Purple")};return e.map((t=>{const e=n[t.label];return e&&e!=t.label&&(t.label=e),t}))}(e,t.config.get(this.componentName).colors.map(Ko).filter((t=>!!t))),o=t.config.get(`${this.componentName}.documentColors`);t.ui.componentFactory.add(this.componentName,(e=>{const r=Of(e);return this.colorTableView=function({dropdownView:t,colors:e,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o}){const r=t.locale,a=new Mp(r,{colors:e,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o});return t.colorTableView=a,t.panelView.children.add(a),a.delegate("execute").to(t,"execute"),a}({dropdownView:r,colors:s.map((t=>({label:t.label,color:t.model,options:{hasBorder:t.hasBorder}}))),columns:this.columns,removeButtonLabel:i("Remove color"),documentColorsLabel:0!==o?i("Document colors"):void 0,documentColorsCount:void 0===o?this.columns:o}),this.colorTableView.bind("selectedColor").to(n,"value"),r.buttonView.set({label:this.dropdownLabel,icon:this.icon,tooltip:!0}),r.extendTemplate({attributes:{class:"ck-color-ui-dropdown"}}),r.bind("isEnabled").to(n),r.on("execute",((e,i)=>{t.execute(this.commandName,i),t.editing.view.focus()})),r.on("change:isOpen",((e,i,n)=>{r.colorTableView.appendGrids(),n&&(0!==o&&this.colorTableView.updateDocumentColors(t.model,this.componentName),this.colorTableView.updateSelectedColors())})),Bf(r,(()=>r.colorTableView.staticColorsGrid.items.find((t=>t.isOn)))),r}))}}class $p extends jp{constructor(t){const e=t.locale.t;super(t,{commandName:Dp,componentName:Dp,icon:'',dropdownLabel:e("Font Color")})}static get pluginName(){return"FontColorUI"}}class Wp extends Ip{constructor(t){super(t,Bp)}}function qp(t){return t.map(Up).filter((t=>!!t))}function Up(t){return"object"==typeof t?t:"default"===t?{title:"Default",model:void 0}:"string"==typeof t?function(t){const e=t.replace(/"|'/g,"").split(","),i=e[0],n=e.map(Kp).join(", ");return{title:i,model:n,view:{name:"span",styles:{"font-family":n},priority:7}}}(t):void 0}function Kp(t){return(t=t.trim()).indexOf(" ")>0&&(t=`'${t}'`),t}class Gp extends lr{static get pluginName(){return"FontFamilyEditing"}constructor(t){super(t),t.config.define(Bp,{options:["default","Arial, Helvetica, sans-serif","Courier New, Courier, monospace","Georgia, serif","Lucida Sans Unicode, Lucida Grande, sans-serif","Tahoma, Geneva, sans-serif","Times New Roman, Times, serif","Trebuchet MS, Helvetica, sans-serif","Verdana, Geneva, sans-serif"],supportAllValues:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Bp}),t.model.schema.setAttributeProperties(Bp,{isFormatting:!0,copyOnEnter:!0});const e=qp(t.config.get("fontFamily.options")).filter((t=>t.model)),i=Fp(Bp,e);t.config.get("fontFamily.supportAllValues")?(this._prepareAnyValueConverters(),this._prepareCompatibilityConverter()):t.conversion.attributeToElement(i),t.commands.add(Bp,new Wp(t))}_prepareAnyValueConverters(){const t=this.editor;t.conversion.for("downcast").attributeToElement({model:Bp,view:(t,{writer:e})=>e.createAttributeElement("span",{style:"font-family:"+t},{priority:7})}),t.conversion.for("upcast").elementToAttribute({model:{key:Bp,value:t=>t.getStyle("font-family")},view:{name:"span",styles:{"font-family":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{face:/.*/}},model:{key:Bp,value:t=>t.getAttribute("face")}})}}class Jp extends lr{static get pluginName(){return"FontFamilyUI"}init(){const t=this.editor,e=t.t,i=this._getLocalizedOptions(),n=t.commands.get(Bp);t.ui.componentFactory.add(Bp,(s=>{const o=Of(s);return Mf(o,(()=>function(t,e){const i=new co;for(const n of t){const t={type:"button",model:new sm({commandName:Bp,commandParam:n.model,label:n.title,withText:!0})};t.model.bind("isOn").to(e,"value",(t=>t===n.model||!(!t||!n.model)&&t.split(",")[0].replace(/'/g,"").toLowerCase()===n.model.toLowerCase())),n.view&&n.view.styles&&t.model.set("labelStyle",`font-family: ${n.view.styles["font-family"]}`),i.add(t)}return i}(i,n))),o.buttonView.set({label:e("Font Family"),icon:'',tooltip:!0}),o.extendTemplate({attributes:{class:"ck-font-family-dropdown"}}),o.bind("isEnabled").to(n),this.listenTo(o,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam}),t.editing.view.focus()})),o}))}_getLocalizedOptions(){const t=this.editor,e=t.t;return qp(t.config.get(Bp).options).map((t=>("Default"===t.title&&(t.title=e("Default")),t)))}}class Qp extends Ip{constructor(t){super(t,Np)}}function Yp(t){return t.map((t=>function(t){if(e=t,"object"==typeof e&&e.title&&e.model&&e.view)return Xp(t);var e;const i=function(t){return Zp[t]||Zp[t.model]}(t);if(i)return Xp(i);if("default"===t)return{model:void 0,title:"Default"};if(function(t){let e;if("object"==typeof t){if(!t.model)throw new v("font-size-invalid-definition",null,t);e=parseFloat(t.model)}else e=parseFloat(t);return isNaN(e)}(t))return;return function(t){"number"!=typeof t&&"string"!=typeof t||(t={title:String(t),model:`${parseFloat(t)}px`});return t.view={name:"span",styles:{"font-size":t.model}},Xp(t)}(t)}(t))).filter((t=>!!t))}const Zp={get tiny(){return{title:"Tiny",model:"tiny",view:{name:"span",classes:"text-tiny",priority:7}}},get small(){return{title:"Small",model:"small",view:{name:"span",classes:"text-small",priority:7}}},get big(){return{title:"Big",model:"big",view:{name:"span",classes:"text-big",priority:7}}},get huge(){return{title:"Huge",model:"huge",view:{name:"span",classes:"text-huge",priority:7}}}};function Xp(t){return t.view.priority||(t.view.priority=7),t}const tw=["x-small","x-small","small","medium","large","x-large","xx-large","xxx-large"];class ew extends lr{static get pluginName(){return"FontSizeEditing"}constructor(t){super(t),t.config.define(Np,{options:["tiny","small","default","big","huge"],supportAllValues:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Np}),t.model.schema.setAttributeProperties(Np,{isFormatting:!0,copyOnEnter:!0});const e=t.config.get("fontSize.supportAllValues"),i=Yp(this.editor.config.get("fontSize.options")).filter((t=>t.model)),n=Fp(Np,i);e?(this._prepareAnyValueConverters(n),this._prepareCompatibilityConverter()):t.conversion.attributeToElement(n),t.commands.add(Np,new Qp(t))}_prepareAnyValueConverters(t){const e=this.editor,i=t.model.values.filter((t=>{return!(e=String(t),hf.test(e)||function(t){return df.test(t)}(String(t)));var e}));if(i.length)throw new v("font-size-invalid-use-of-named-presets",null,{presets:i});e.conversion.for("downcast").attributeToElement({model:Np,view:(t,{writer:e})=>{if(t)return e.createAttributeElement("span",{style:"font-size:"+t},{priority:7})}}),e.conversion.for("upcast").elementToAttribute({model:{key:Np,value:t=>t.getStyle("font-size")},view:{name:"span",styles:{"font-size":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{size:/^[+-]?\d{1,3}$/}},model:{key:Np,value:t=>{const e=t.getAttribute("size"),i="-"===e[0]||"+"===e[0];let n=parseInt(e,10);i&&(n=3+n);const s=tw.length-1,o=Math.min(Math.max(n,0),s);return tw[o]}}})}}class iw extends lr{static get pluginName(){return"FontSizeUI"}init(){const t=this.editor,e=t.t,i=this._getLocalizedOptions(),n=t.commands.get(Np);t.ui.componentFactory.add(Np,(s=>{const o=Of(s);return Mf(o,(()=>function(t,e){const i=new co;for(const n of t){const t={type:"button",model:new sm({commandName:Np,commandParam:n.model,label:n.title,class:"ck-fontsize-option",withText:!0})};n.view&&n.view.styles&&t.model.set("labelStyle",`font-size:${n.view.styles["font-size"]}`),n.view&&n.view.classes&&t.model.set("class",`${t.model.class} ${n.view.classes}`),t.model.bind("isOn").to(e,"value",(t=>t===n.model)),i.add(t)}return i}(i,n))),o.buttonView.set({label:e("Font Size"),icon:'',tooltip:!0}),o.extendTemplate({attributes:{class:["ck-font-size-dropdown"]}}),o.bind("isEnabled").to(n),this.listenTo(o,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam}),t.editing.view.focus()})),o}))}_getLocalizedOptions(){const t=this.editor,e=t.t,i={Default:e("Default"),Tiny:e("Tiny"),Small:e("Small"),Big:e("Big"),Huge:e("Huge")};return Yp(t.config.get(Np).options).map((t=>{const e=i[t.title];return e&&e!=t.title&&(t=Object.assign({},t,{title:e})),t}))}}class nw extends hr{refresh(){const t=this.editor.model,e=ho(t.document.selection.getSelectedBlocks());this.value=!!e&&e.is("element","paragraph"),this.isEnabled=!!e&&sw(e,t.schema)}execute(t={}){const e=this.editor.model,i=e.document;e.change((n=>{const s=(t.selection||i.selection).getSelectedBlocks();for(const t of s)!t.is("element","paragraph")&&sw(t,e.schema)&&n.rename(t,"paragraph")}))}}function sw(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class ow extends hr{execute(t){const e=this.editor.model,i=t.attributes;let n=t.position;e.change((t=>{const s=t.createElement("paragraph");if(i&&e.schema.setAllowedAttributes(s,i,t),!e.schema.checkChild(n.parent,s)){const i=e.schema.findAllowedParent(n,s);if(!i)return;n=t.split(n,i).position}e.insertContent(s,n),t.setSelection(s,"in")}))}}class rw extends lr{static get pluginName(){return"Paragraph"}init(){const t=this.editor,e=t.model;t.commands.add("paragraph",new nw(t)),t.commands.add("insertParagraph",new ow(t)),e.schema.register("paragraph",{inheritAllFrom:"$block"}),t.conversion.elementToElement({model:"paragraph",view:"p"}),t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>rw.paragraphLikeElements.has(t.name)?t.isEmpty?null:e.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}rw.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);class aw extends hr{constructor(t,e){super(t),this.modelElements=e}refresh(){const t=ho(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name,this.isEnabled=!!t&&this.modelElements.some((e=>lw(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model,i=e.document,n=t.value;e.change((t=>{const s=Array.from(i.selection.getSelectedBlocks()).filter((t=>lw(t,n,e.schema)));for(const e of s)e.is("element",n)||t.rename(e,n)}))}}function lw(t,e,i){return i.checkChild(t.parent,e)&&!i.isObject(t)}const cw="paragraph";class hw extends lr{static get pluginName(){return"HeadingEditing"}constructor(t){super(t),t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[rw]}init(){const t=this.editor,e=t.config.get("heading.options"),i=[];for(const n of e)"paragraph"!==n.model&&(t.model.schema.register(n.model,{inheritAllFrom:"$block"}),t.conversion.elementToElement(n),i.push(n.model));this._addDefaultH1Conversion(t),t.commands.add("heading",new aw(t,i))}afterInit(){const t=this.editor,e=t.commands.get("enter"),i=t.config.get("heading.options");e&&this.listenTo(e,"afterExecute",((e,n)=>{const s=t.model.document.selection.getFirstPosition().parent;i.some((t=>s.is("element",t.model)))&&!s.is("element",cw)&&0===s.childCount&&n.writer.rename(s,cw)}))}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:w.get("low")+1})}}class dw extends lr{static get pluginName(){return"HeadingUI"}init(){const t=this.editor,e=t.t,i=function(t){const e=t.t,i={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=i[t.title];return e&&e!=t.title&&(t.title=e),t}))}(t),n=e("Choose heading"),s=e("Heading");t.ui.componentFactory.add("heading",(e=>{const o={},r=new co,a=t.commands.get("heading"),l=t.commands.get("paragraph"),c=[a];for(const t of i){const e={type:"button",model:new sm({label:t.title,class:t.class,withText:!0})};"paragraph"===t.model?(e.model.bind("isOn").to(l,"value"),e.model.set("commandName","paragraph"),c.push(l)):(e.model.bind("isOn").to(a,"value",(e=>e===t.model)),e.model.set({commandName:"heading",commandValue:t.model})),r.add(e),o[t.model]=t.title}const h=Of(e);return Mf(h,r),h.buttonView.set({isOn:!1,withText:!0,tooltip:s}),h.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),h.bind("isEnabled").toMany(c,"isEnabled",((...t)=>t.some((t=>t)))),h.buttonView.bind("label").to(a,"value",l,"value",((t,e)=>{const i=t||e&&"paragraph";return"boolean"==typeof i?n:o[i]?o[i]:n})),this.listenTo(h,"execute",(e=>{const{commandName:i,commandValue:n}=e.source;t.execute(i,n?{value:n}:void 0),t.editing.view.focus()})),h}))}}class uw extends hr{refresh(){const t=this.editor.model,e=t.schema,i=t.document.selection;this.isEnabled=function(t,e,i){const n=function(t,e){const i=function(t,e){const i=t.getSelectedElement();if(i){const n=Jg(t);if(n)return e.createRange(e.createPositionAt(i,n))}return Zu(t,e)}(t,e),n=i.start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(t,i);return e.checkChild(n,"horizontalLine")}(i,e,t)}execute(){const t=this.editor.model;t.change((e=>{const i=e.createElement("horizontalLine");t.insertObject(i,null,null,{setSelection:"after"})}))}}class fw extends lr{static get pluginName(){return"HorizontalLineEditing"}init(){const t=this.editor,e=t.model.schema,i=t.t,n=t.conversion;e.register("horizontalLine",{inheritAllFrom:"$blockObject"}),n.for("dataDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>e.createEmptyElement("hr")}),n.for("editingDowncast").elementToStructure({model:"horizontalLine",view:(t,{writer:e})=>{const n=i("Horizontal line"),s=e.createContainerElement("div",null,e.createEmptyElement("hr"));return e.addClass("ck-horizontal-line",s),e.setCustomProperty("hr",!0,s),function(t,e,i){return e.setCustomProperty("horizontalLine",!0,t),jg(t,e,{label:i})}(s,e,n)}}),n.for("upcast").elementToElement({view:"hr",model:"horizontalLine"}),t.commands.add("horizontalLine",new uw(t))}}class mw extends lr{static get pluginName(){return"HorizontalLineUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("horizontalLine",(i=>{const n=t.commands.get("horizontalLine"),s=new qo(i);return s.set({label:e("Horizontal line"),icon:'',tooltip:!0}),s.bind("isEnabled").to(n,"isEnabled"),this.listenTo(s,"execute",(()=>{t.execute("horizontalLine"),t.editing.view.focus()})),s}))}}class gw extends lr{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new ur(t)),t.commands.add("outdent",new ur(t))}}const pw='',ww='';class bw extends lr{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,i=t.t,n="ltr"==e.uiLanguageDirection?pw:ww,s="ltr"==e.uiLanguageDirection?ww:pw;this._defineButton("indent",i("Increase indent"),n),this._defineButton("outdent",i("Decrease indent"),s)}_defineButton(t,e,i){const n=this.editor;n.ui.componentFactory.add(t,(s=>{const o=n.commands.get(t),r=new qo(s);return r.set({label:e,icon:i,tooltip:!0}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(r,"execute",(()=>{n.execute(t),n.editing.view.focus()})),r}))}}class _w extends hr{constructor(t,e){super(t),this._indentBehavior=e}refresh(){const t=this.editor.model,e=ho(t.document.selection.getSelectedBlocks());e&&t.schema.checkAttribute(e,"blockIndent")?this.isEnabled=this._indentBehavior.checkEnabled(e.getAttribute("blockIndent")):this.isEnabled=!1}execute(){const t=this.editor.model,e=function(t){const e=t.document.selection,i=t.schema;return Array.from(e.getSelectedBlocks()).filter((t=>i.checkAttribute(t,"blockIndent")))}(t);t.change((t=>{for(const i of e){const e=i.getAttribute("blockIndent"),n=this._indentBehavior.getNextIndent(e);n?t.setAttribute("blockIndent",n,i):t.removeAttribute("blockIndent",i)}}))}}class vw{constructor(t){this.isForward="forward"===t.direction,this.offset=t.offset,this.unit=t.unit}checkEnabled(t){const e=parseFloat(t||0);return this.isForward||e>0}getNextIndent(t){const e=parseFloat(t||0);if(!(!t||t.endsWith(this.unit)))return this.isForward?this.offset+this.unit:void 0;const i=e+(this.isForward?this.offset:-this.offset);return i>0?i+this.unit:void 0}}class yw{constructor(t){this.isForward="forward"===t.direction,this.classes=t.classes}checkEnabled(t){const e=this.classes.indexOf(t);return this.isForward?e=0}getNextIndent(t){const e=this.classes.indexOf(t),i=this.isForward?1:-1;return this.classes[e+i]}}const kw=["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"];const Aw="italic";class xw extends lr{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Aw}),t.model.schema.setAttributeProperties(Aw,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:Aw,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(Aw,new Cg(t,Aw)),t.keystrokes.set("CTRL+I",Aw)}}const Cw="italic";class Pw extends lr{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Cw,(i=>{const n=t.commands.get(Cw),s=new qo(i);return s.set({label:e("Italic"),icon:'',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(Cw),t.editing.view.focus()})),s}))}}class Tw{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){Array.isArray(t)?t.forEach((t=>this._definitions.add(t))):this._definitions.add(t)}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,i)=>{if(!i.consumable.test(e.item,"attribute:linkHref"))return;if(!e.item.is("selection")&&!i.schema.isInline(e.item))return;const n=i.writer,s=n.document.selection;for(const t of this._definitions){const o=n.createAttributeElement("a",t.attributes,{priority:5});t.classes&&n.addClass(t.classes,o);for(const e in t.styles)n.setStyle(e,t.styles[e],o);n.setCustomProperty("link",!0,o),t.callback(e.attributeNewValue)?e.item.is("selection")?n.wrap(s.getFirstRange(),o):n.wrap(i.mapper.toViewRange(e.range),o):n.unwrap(i.mapper.toViewRange(e.range),o)}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:imageBlock",((t,e,{writer:i,mapper:n})=>{const s=n.toViewElement(e.item),o=Array.from(s.getChildren()).find((t=>"a"===t.name));for(const t of this._definitions){const n=mo(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of n)"class"===t?i.addClass(e,o):i.setAttribute(t,e,o);t.classes&&i.addClass(t.classes,o);for(const e in t.styles)i.setStyle(e,t.styles[e],o)}else{for(const[t,e]of n)"class"===t?i.removeClass(e,o):i.removeAttribute(t,o);t.classes&&i.removeClass(t.classes,o);for(const e in t.styles)i.removeStyle(e,o)}}}))}}}const Ew=function(t,e,i){var n=t.length;return i=void 0===i?n:i,!e&&i>=n?t:ta(t,e,i)};var Sw=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const Rw=function(t){return Sw.test(t)};const Ow=function(t){return t.split("")};var Iw="\\ud800-\\udfff",Vw="["+Iw+"]",Mw="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Nw="\\ud83c[\\udffb-\\udfff]",Bw="[^"+Iw+"]",Dw="(?:\\ud83c[\\udde6-\\uddff]){2}",Fw="[\\ud800-\\udbff][\\udc00-\\udfff]",Lw="(?:"+Mw+"|"+Nw+")"+"?",zw="[\\ufe0e\\ufe0f]?",Hw=zw+Lw+("(?:\\u200d(?:"+[Bw,Dw,Fw].join("|")+")"+zw+Lw+")*"),jw="(?:"+[Bw+Mw+"?",Mw,Dw,Fw,Vw].join("|")+")",$w=RegExp(Nw+"(?="+Nw+")|"+jw+Hw,"g");const Ww=function(t){return t.match($w)||[]};const qw=function(t){return Rw(t)?Ww(t):Ow(t)};const Uw=function(t){return function(e){e=Gr(e);var i=Rw(e)?qw(e):void 0,n=i?i[0]:e.charAt(0),s=i?Ew(i,1).join(""):e.slice(1);return n[t]()+s}}("toUpperCase"),Kw=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,Gw=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i,Jw=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,Qw=/^((\w+:(\/{2,})?)|(\W))/i,Yw="Ctrl+K";function Zw(t,{writer:e}){const i=e.createAttributeElement("a",{href:t},{priority:5});return e.setCustomProperty("link",!0,i),i}function Xw(t){return function(t){const e=t.replace(Kw,"");return e.match(Gw)}(t=String(t))?t:"#"}function tb(t,e){return!!t&&e.checkAttribute(t.name,"linkHref")}function eb(t,e){const i=(n=t,Jw.test(n)?"mailto:":e);var n;const s=!!i&&!ib(t);return t&&s?i+t:t}function ib(t){return Qw.test(t)}function nb(t){window.open(t,"_blank","noopener")}class sb extends hr{constructor(t){super(t),this.manualDecorators=new co,this.automaticDecorators=new Tw}restoreManualDecoratorStates(){for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}refresh(){const t=this.editor.model,e=t.document.selection,i=e.getSelectedElement()||ho(e.getSelectedBlocks());tb(i,t.schema)?(this.value=i.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttribute(i,"linkHref")):(this.value=e.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref"));for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}execute(t,e={}){const i=this.editor.model,n=i.document.selection,s=[],o=[];for(const t in e)e[t]?s.push(t):o.push(t);i.change((e=>{if(n.isCollapsed){const r=n.getFirstPosition();if(n.hasAttribute("linkHref")){const a=ng(r,"linkHref",n.getAttribute("linkHref"),i);e.setAttribute("linkHref",t,a),s.forEach((t=>{e.setAttribute(t,!0,a)})),o.forEach((t=>{e.removeAttribute(t,a)})),e.setSelection(e.createPositionAfter(a.end.nodeBefore))}else if(""!==t){const o=mo(n.getAttributes());o.set("linkHref",t),s.forEach((t=>{o.set(t,!0)}));const{end:a}=i.insertContent(e.createText(t,o),r);e.setSelection(a)}["linkHref",...s,...o].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const r=i.schema.getValidRanges(n.getRanges(),"linkHref"),a=[];for(const t of n.getSelectedBlocks())i.schema.checkAttribute(t,"linkHref")&&a.push(e.createRangeOn(t));const l=a.slice();for(const t of r)this._isRangeToUpdate(t,a)&&l.push(t);for(const i of l)e.setAttribute("linkHref",t,i),s.forEach((t=>{e.setAttribute(t,!0,i)})),o.forEach((t=>{e.removeAttribute(t,i)}))}}))}_getDecoratorStateFromModel(t){const e=this.editor.model,i=e.document.selection,n=i.getSelectedElement();return tb(n,e.schema)?n.getAttribute(t):i.getAttribute(t)}_isRangeToUpdate(t,e){for(const i of e)if(i.containsRange(t))return!1;return!0}}class ob extends hr{refresh(){const t=this.editor.model,e=t.document.selection,i=e.getSelectedElement();tb(i,t.schema)?this.isEnabled=t.schema.checkAttribute(i,"linkHref"):this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref")}execute(){const t=this.editor,e=this.editor.model,i=e.document.selection,n=t.commands.get("link");e.change((t=>{const s=i.isCollapsed?[ng(i.getFirstPosition(),"linkHref",i.getAttribute("linkHref"),e)]:e.schema.getValidRanges(i.getRanges(),"linkHref");for(const e of s)if(t.removeAttribute("linkHref",e),n)for(const i of n.manualDecorators)t.removeAttribute(i.id,e)}))}}class rb{constructor({id:t,label:e,attributes:i,classes:n,styles:s,defaultValue:o}){this.id=t,this.set("value"),this.defaultValue=o,this.label=e,this.attributes=i,this.classes=n,this.styles=s}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}u(rb,q);const ab="automatic",lb=/^(https?:)?\/\//;class cb extends lr{static get pluginName(){return"LinkEditing"}static get requires(){return[jm,Sm,Vg]}constructor(t){super(t),t.config.define("link",{addTargetToExternalLinks:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"linkHref"}),t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:Zw}),t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>Zw(Xw(t),e)}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:t=>t.getAttribute("href")}}),t.commands.add("link",new sb(t)),t.commands.add("unlink",new ob(t));const e=function(t,e){const i={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};return e.forEach((t=>(t.label&&i[t.label]&&(t.label=i[t.label]),t))),e}(t.t,function(t){const e=[];if(t)for(const[i,n]of Object.entries(t)){const t=Object.assign({},n,{id:`link${Uw(i)}`});e.push(t)}return e}(t.config.get("link.decorators")));this._enableAutomaticDecorators(e.filter((t=>t.mode===ab))),this._enableManualDecorators(e.filter((t=>"manual"===t.mode)));t.plugins.get(jm).registerAttribute("linkHref"),function(t,e,i,n){const s=t.editing.view,o=new Set;s.document.registerPostFixer((s=>{const r=t.model.document.selection;let a=!1;if(r.hasAttribute(e)){const l=ng(r.getFirstPosition(),e,r.getAttribute(e),t.model),c=t.editing.mapper.toViewRange(l);for(const t of c.getItems())t.is("element",i)&&!t.hasClass(n)&&(s.addClass(n,t),o.add(t),a=!0)}return a})),t.conversion.for("editingDowncast").add((t=>{function e(){s.change((t=>{for(const e of o.values())t.removeClass(n,e),o.delete(e)}))}t.on("insert",e,{priority:"highest"}),t.on("remove",e,{priority:"highest"}),t.on("attribute",e,{priority:"highest"}),t.on("selection",e,{priority:"highest"})}))}(t,"linkHref","a","ck-link_selected"),this._enableLinkOpen(),this._enableInsertContentSelectionAttributesFixer(),this._enableClickingAfterLink(),this._enableTypingOverLink(),this._handleDeleteContentAfterLink(),this._enableClipboardIntegration()}_enableAutomaticDecorators(t){const e=this.editor,i=e.commands.get("link").automaticDecorators;e.config.get("link.addTargetToExternalLinks")&&i.add({id:"linkIsExternal",mode:ab,callback:t=>lb.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}}),i.add(t),i.length&&e.conversion.for("downcast").add(i.getDispatcher())}_enableManualDecorators(t){if(!t.length)return;const e=this.editor,i=e.commands.get("link").manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id}),t=new rb(t),i.add(t),e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,{writer:i,schema:n},{item:s})=>{if((s.is("selection")||n.isInline(s))&&e){const e=i.createAttributeElement("a",t.attributes,{priority:5});t.classes&&i.addClass(t.classes,e);for(const n in t.styles)i.setStyle(n,t.styles[n],e);return i.setCustomProperty("link",!0,e),e}}}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",...t._createPattern()},model:{key:t.id}})}))}_enableLinkOpen(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",((t,e)=>{if(!(r.isMac?e.domEvent.metaKey:e.domEvent.ctrlKey))return;let i=e.domTarget;if("a"!=i.tagName.toLowerCase()&&(i=i.closest("a")),!i)return;const n=i.getAttribute("href");n&&(t.stop(),e.preventDefault(),nb(n))}),{context:"$capture"}),this.listenTo(e,"keydown",((e,i)=>{const n=t.commands.get("link").value;n&&i.keyCode===Zs.enter&&i.altKey&&(e.stop(),nb(n))}))}_enableInsertContentSelectionAttributesFixer(){const t=this.editor.model,e=t.document.selection;this.listenTo(t,"insertContent",(()=>{const i=e.anchor.nodeBefore,n=e.anchor.nodeAfter;e.hasAttribute("linkHref")&&i&&i.hasAttribute("linkHref")&&(n&&n.hasAttribute("linkHref")||t.change((e=>{hb(e,ub(t.schema))})))}),{priority:"low"})}_enableClickingAfterLink(){const t=this.editor,e=t.model;t.editing.view.addObserver(lf);let i=!1;this.listenTo(t.editing.view.document,"mousedown",(()=>{i=!0})),this.listenTo(t.editing.view.document,"selectionChange",(()=>{if(!i)return;i=!1;const t=e.document.selection;if(!t.isCollapsed)return;if(!t.hasAttribute("linkHref"))return;const n=t.getFirstPosition(),s=ng(n,"linkHref",t.getAttribute("linkHref"),e);(n.isTouching(s.start)||n.isTouching(s.end))&&e.change((t=>{hb(t,ub(e.schema))}))}))}_enableTypingOverLink(){const t=this.editor,e=t.editing.view;let i,n;this.listenTo(e.document,"delete",(()=>{n=!0}),{priority:"high"}),this.listenTo(t.model,"deleteContent",(()=>{const e=t.model.document.selection;e.isCollapsed||(n?n=!1:db(t)&&function(t){const e=t.document.selection,i=e.getFirstPosition(),n=e.getLastPosition(),s=i.nodeAfter;if(!s)return!1;if(!s.is("$text"))return!1;if(!s.hasAttribute("linkHref"))return!1;const o=n.textNode||n.nodeBefore;if(s===o)return!0;return ng(i,"linkHref",s.getAttribute("linkHref"),t).containsRange(t.createRange(i,n),!0)}(t.model)&&(i=e.getAttributes()))}),{priority:"high"}),this.listenTo(t.model,"insertContent",((e,[s])=>{n=!1,db(t)&&i&&(t.model.change((t=>{for(const[e,n]of i)t.setAttribute(e,n,s)})),i=null)}),{priority:"high"})}_handleDeleteContentAfterLink(){const t=this.editor,e=t.model,i=e.document.selection,n=t.editing.view;let s=!1,o=!1;this.listenTo(n.document,"delete",((t,e)=>{o="backward"===e.direction}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{s=!1;const t=i.getFirstPosition(),n=i.getAttribute("linkHref");if(!n)return;const o=ng(t,"linkHref",n,e);s=o.containsPosition(t)||o.end.isEqual(t)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{o&&(o=!1,s||t.model.enqueueChange((t=>{hb(t,ub(e.schema))})))}),{priority:"low"})}_enableClipboardIntegration(){const t=this.editor,e=t.model,i=this.editor.config.get("link.defaultProtocol");i&&this.listenTo(t.plugins.get("ClipboardPipeline"),"contentInsertion",((t,n)=>{e.change((t=>{const e=t.createRangeIn(n.content);for(const n of e.getItems())if(n.hasAttribute("linkHref")){const e=eb(n.getAttribute("linkHref"),i);t.setAttribute("linkHref",e,n)}}))}))}}function hb(t,e){t.removeSelectionAttribute("linkHref");for(const i of e)t.removeSelectionAttribute(i)}function db(t){return t.model.change((t=>t.batch)).isTyping}function ub(t){return t.getDefinition("$text").allowAttributes.filter((t=>t.startsWith("link")))}class fb extends yo{constructor(t,e){super(t);const i=t.t;this.focusTracker=new uo,this.keystrokes=new fo,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("Save"),yf.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),yf.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e),this.children=this._createFormChildren(e.manualDecorators),this._focusables=new vo,this._focusCycler=new nr({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const n=["ck","ck-link-form","ck-responsive-form"];e.manualDecorators.length&&n.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:n,tabindex:"-1"},children:this.children}),function(t){const e=t;e.set("_isCssTransitionsDisabled",!1),e.disableCssTransitions=()=>{e._isCssTransitionsDisabled=!0},e.enableCssTransitions=()=>{e._isCssTransitionsDisabled=!1},e.extendTemplate({attributes:{class:[e.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>(t[e.name]=e.isOn,t)),{})}render(){super.render(),function({view:t}){t.listenTo(t.element,"submit",((e,i)=>{i.preventDefault(),t.fire("submit")}),{useCapture:!0})}({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t,e=new em(this.locale,im);return e.label=t("Link URL"),e}_createButton(t,e,i,n){const s=new qo(this.locale);return s.set({label:t,icon:e,tooltip:!0}),s.extendTemplate({attributes:{class:i}}),n&&s.delegate("execute").to(this,n),s}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const i of t.manualDecorators){const n=new Uo(this.locale);n.set({name:i.id,label:i.label,withText:!0}),n.bind("isOn").toMany([i,t],"value",((t,e)=>void 0===e&&void 0===t?i.defaultValue:t)),n.on("execute",(()=>{i.set("value",!n.isOn)})),e.add(n)}return e}_createFormChildren(t){const e=this.createCollection();if(e.add(this.urlInputView),t.length){const t=new yo;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}}),e.add(t)}return e.add(this.saveButtonView),e.add(this.cancelButtonView),e}}class mb extends yo{constructor(t){super(t);const e=t.t;this.focusTracker=new uo,this.keystrokes=new fo,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(e("Unlink"),'',"unlink"),this.editButtonView=this._createButton(e("Edit link"),yf.pencil,"edit"),this.set("href"),this._focusables=new vo,this._focusCycler=new nr({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createButton(t,e,i){const n=new qo(this.locale);return n.set({label:t,icon:e,tooltip:!0}),n.delegate("execute").to(this,i),n}_createPreviewButton(){const t=new qo(this.locale),e=this.bindTemplate,i=this.t;return t.set({withText:!0,tooltip:i("Open link in new tab")}),t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&Xw(t))),target:"_blank",rel:"noopener noreferrer"}}),t.bind("label").to(this,"href",(t=>t||i("This link has no URL"))),t.bind("isEnabled").to(this,"href",(t=>!!t)),t.template.tag="a",t.template.eventListeners={},t}}const gb="link-ui";class pb extends lr{static get requires(){return[rm]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(af),this.actionsView=null,this.formView=null,this._balloon=t.plugins.get(rm),this._createToolbarLinkButton(),this._enableBalloonActivators(),t.conversion.for("editingDowncast").markerToHighlight({model:gb,view:{classes:["ck-fake-link-selection"]}}),t.conversion.for("editingDowncast").markerToElement({model:gb,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy(),this.formView&&this.formView.destroy(),this.actionsView&&this.actionsView.destroy()}_createViews(){this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._enableUserBalloonInteractions()}_createActionsView(){const t=this.editor,e=new mb(t.locale),i=t.commands.get("link"),n=t.commands.get("unlink");return e.bind("href").to(i,"value"),e.editButtonView.bind("isEnabled").to(i),e.unlinkButtonView.bind("isEnabled").to(n),this.listenTo(e,"edit",(()=>{this._addFormView()})),this.listenTo(e,"unlink",(()=>{t.execute("unlink"),this._hideUI()})),e.keystrokes.set("Esc",((t,e)=>{this._hideUI(),e()})),e.keystrokes.set(Yw,((t,e)=>{this._addFormView(),e()})),e}_createFormView(){const t=this.editor,e=t.commands.get("link"),i=t.config.get("link.defaultProtocol"),n=new fb(t.locale,e);return n.urlInputView.fieldView.bind("value").to(e,"value"),n.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t)),n.saveButtonView.bind("isEnabled").to(e),this.listenTo(n,"submit",(()=>{const{value:e}=n.urlInputView.fieldView.element,s=eb(e,i);t.execute("link",s,n.getDecoratorSwitchesState()),this._closeFormView()})),this.listenTo(n,"cancel",(()=>{this._closeFormView()})),n.keystrokes.set("Esc",((t,e)=>{this._closeFormView(),e()})),n}_createToolbarLinkButton(){const t=this.editor,e=t.commands.get("link"),i=t.t;t.ui.componentFactory.add("link",(t=>{const n=new qo(t);return n.isEnabled=!0,n.label=i("Link"),n.icon='',n.keystroke=Yw,n.tooltip=!0,n.isToggleable=!0,n.bind("isEnabled").to(e,"isEnabled"),n.bind("isOn").to(e,"value",(t=>!!t)),this.listenTo(n,"execute",(()=>this._showUI(!0))),n}))}_enableBalloonActivators(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",(()=>{this._getSelectedLinkElement()&&this._showUI()})),t.keystrokes.set(Yw,((e,i)=>{i(),t.commands.get("link").isEnabled&&this._showUI(!0)}))}_enableUserBalloonInteractions(){this.editor.keystrokes.set("Tab",((t,e)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),e())}),{priority:"high"}),this.editor.keystrokes.set("Esc",((t,e)=>{this._isUIVisible&&(this._hideUI(),e())})),i({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this.actionsView||this._createViews(),this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this.formView||this._createViews(),this._isFormInPanel)return;const t=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions(),this.formView.urlInputView.fieldView.element.value=t.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates(),void 0!==t.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(t=!1){this.formView||this._createViews(),this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),t&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),t&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const t=this.editor;this.stopListening(t.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),t.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor,e=t.editing.view.document;let i=this._getSelectedLinkElement(),n=o();const s=()=>{const t=this._getSelectedLinkElement(),e=o();i&&!t||!i&&e!==n?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),i=t,n=e};function o(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",s),this.listenTo(this._balloon,"change:visibleView",s)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){return this._balloon.visibleView==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view,e=this.editor.model,i=t.document;let n=null;if(e.markers.has(gb)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(gb)),i=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));n=t.domConverter.viewRangeToDom(i)}else n=()=>{const e=this._getSelectedLinkElement();return e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(i.selection.getFirstRange())};return{target:n}}_getSelectedLinkElement(){const t=this.editor.editing.view,e=t.document.selection,i=e.getSelectedElement();if(e.isCollapsed||i&&Hg(i))return wb(e.getFirstPosition());{const i=e.getFirstRange().getTrimmed(),n=wb(i.start),s=wb(i.end);return n&&n==s&&t.createRangeIn(n).getTrimmed().isEqual(i)?n:null}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const i=t.document.selection.getFirstRange();if(t.markers.has(gb))e.updateMarker(gb,{range:i});else if(i.start.isAtEnd){const n=i.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:i});e.addMarker(gb,{usingOperation:!1,affectsData:!1,range:e.createRange(n,i.end)})}else e.addMarker(gb,{usingOperation:!1,affectsData:!1,range:i})}))}_hideFakeVisualSelection(){const t=this.editor.model;t.markers.has(gb)&&t.change((t=>{t.removeMarker(gb)}))}}function wb(t){return t.getAncestors().find((t=>{return(e=t).is("attributeElement")&&!!e.getCustomProperty("link");var e}))}const bb=4,_b=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i"),vb=2;class yb extends lr{static get requires(){return[Fm]}static get pluginName(){return"AutoLink"}init(){const t=this.editor.model.document.selection;t.on("change:range",(()=>{this.isEnabled=!t.anchor.parent.is("element","codeBlock")})),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling()}_enableTypingHandling(){const t=this.editor,e=new Hm(t.model,(t=>{if(!function(t){return t.length>bb&&" "===t[t.length-1]&&" "!==t[t.length-2]}(t))return;const e=kb(t.substr(0,t.length-1));return e?{url:e}:void 0}));e.on("matched:data",((e,i)=>{const{batch:n,range:s,url:o}=i;if(!n.isTyping)return;const r=s.end.getShiftedBy(-1),a=r.getShiftedBy(-o.length),l=t.model.createRange(a,r);this._applyAutoLink(o,l)})),e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor,e=t.model,i=t.commands.get("enter");i&&i.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling)return;const i=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(i)}))}_enableShiftEnterHandling(){const t=this.editor,e=t.model,i=t.commands.get("shiftEnter");i&&i.on("execute",(()=>{const t=e.document.selection.getFirstPosition(),i=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(i)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model,{text:i,range:n}=zm(t,e),s=kb(i);if(s){const t=e.createRange(n.end.getShiftedBy(-s.length),n.end);this._applyAutoLink(s,t)}}_applyAutoLink(t,e){const i=this.editor.model,n=eb(t,this.editor.config.get("link.defaultProtocol"));this.isEnabled&&function(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}(e,i)&&ib(n)&&!function(t){const e=t.start.nodeAfter;return e&&e.hasAttribute("linkHref")}(e)&&this._persistAutoLink(n,e)}_persistAutoLink(t,e){const i=this.editor.model,n=this.editor.plugins.get("Delete");i.enqueueChange((s=>{s.setAttribute("linkHref",t,e),i.enqueueChange((()=>{n.requestUndoOnBackspace()}))}))}}function kb(t){const e=_b.exec(t);return e?e[vb]:null}class Ab extends hr{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,i=e.document,n=Array.from(i.selection.getSelectedBlocks()).filter((t=>Cb(t,e.schema))),s=void 0!==t.forceValue?!t.forceValue:this.value;e.change((t=>{if(s){let e=n[n.length-1].nextSibling,i=Number.POSITIVE_INFINITY,s=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t=i;)o>s.getAttribute("listIndent")&&(o=s.getAttribute("listIndent")),s.getAttribute("listIndent")==o&&t[e?"unshift":"push"](s),s=s[e?"previousSibling":"nextSibling"]}}function Cb(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class Pb extends hr{constructor(t,e){super(t),this._indentBy="forward"==e?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document;let i=Array.from(e.selection.getSelectedBlocks());t.change((t=>{const e=i[i.length-1];let n=e.nextSibling;for(;n&&"listItem"==n.name&&n.getAttribute("listIndent")>e.getAttribute("listIndent");)i.push(n),n=n.nextSibling;this._indentBy<0&&(i=i.reverse());for(const e of i){const i=e.getAttribute("listIndent")+this._indentBy;i<0?t.rename(e,"paragraph"):t.setAttribute("listIndent",i,e)}this.fire("_executeCleanup",i)}))}_checkEnabled(){const t=ho(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),i=t.getAttribute("listType");let n=t.previousSibling;for(;n&&n.is("element","listItem")&&n.getAttribute("listIndent")>=e;){if(n.getAttribute("listIndent")==e)return n.getAttribute("listType")==i;n=n.previousSibling}return!1}return!0}}function Tb(t,e){const i=e.mapper,n=e.writer,s="numbered"==t.getAttribute("listType")?"ol":"ul",o=function(t){const e=t.createContainerElement("li");return e.getFillerOffset=Fb,e}(n),r=n.createContainerElement(s,null);return n.insert(n.createPositionAt(r,0),o),i.bindElements(t,o),o}function Eb(t,e,i,n){const s=e.parent,o=i.mapper,r=i.writer;let a=o.toViewPosition(n.createPositionBefore(t));const l=Ob(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),c=t.previousSibling;if(l&&l.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=o.toViewElement(l);a=r.breakContainer(r.createPositionAfter(t))}else if(c&&"listItem"==c.name){a=o.toViewPosition(n.createPositionAt(c,"end"));const t=o.findMappedViewAncestor(a),e=function(t){for(const e of t.getChildren())if("ul"==e.name||"ol"==e.name)return e;return null}(t);a=e?r.createPositionBefore(e):r.createPositionAt(t,"end")}else a=o.toViewPosition(n.createPositionBefore(t));if(a=Rb(a),r.insert(a,s),c&&"listItem"==c.name){const t=o.toViewElement(c),i=r.createRange(r.createPositionAt(t,0),a).getWalker({ignoreElementEnd:!0});for(const t of i)if(t.item.is("element","li")){const n=r.breakContainer(r.createPositionBefore(t.item)),s=t.item.parent,o=r.createPositionAt(e,"end");Sb(r,o.nodeBefore,o.nodeAfter),r.move(r.createRangeOn(s),o),i.position=n}}else{const i=s.nextSibling;if(i&&(i.is("element","ul")||i.is("element","ol"))){let n=null;for(const e of i.getChildren()){const i=o.toModelElement(e);if(!(i&&i.getAttribute("listIndent")>t.getAttribute("listIndent")))break;n=e}n&&(r.breakContainer(r.createPositionAfter(n)),r.move(r.createRangeOn(n.parent),r.createPositionAt(e,"end")))}}Sb(r,s,s.nextSibling),Sb(r,s.previousSibling,s)}function Sb(t,e,i){return!e||!i||"ul"!=e.name&&"ol"!=e.name||e.name!=i.name||e.getAttribute("class")!==i.getAttribute("class")?null:t.mergeContainers(t.createPositionAfter(e))}function Rb(t){return t.getLastMatchingPosition((t=>t.item.is("uiElement")))}function Ob(t,e){const i=!!e.sameIndent,n=!!e.smallerIndent,s=e.listIndent;let o=t;for(;o&&"listItem"==o.name;){const t=o.getAttribute("listIndent");if(i&&s==t||n&&s>t)return o;o="forward"===e.direction?o.nextSibling:o.previousSibling}return null}function Ib(t,e,i,n){t.ui.componentFactory.add(e,(s=>{const o=t.commands.get(e),r=new qo(s);return r.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),r.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),r}))}function Vb(t,e){const i=[],n=t.parent,s={ignoreElementEnd:!1,startPosition:t,shallow:!0,direction:e},o=n.getAttribute("listIndent"),r=[...new mh(s)].filter((t=>t.item.is("element"))).map((t=>t.item));for(const t of r){if(!t.is("element","listItem"))break;if(t.getAttribute("listIndent")o)){if(t.getAttribute("listType")!==n.getAttribute("listType"))break;if(t.getAttribute("listStyle")!==n.getAttribute("listStyle"))break;if(t.getAttribute("listReversed")!==n.getAttribute("listReversed"))break;if(t.getAttribute("listStart")!==n.getAttribute("listStart"))break;"backward"===e?i.unshift(t):i.push(t)}}return i}function Mb(t){let e=[...t.document.selection.getSelectedBlocks()].filter((t=>t.is("element","listItem"))).map((e=>{const i=t.change((t=>t.createPositionAt(e,0)));return[...Vb(i,"backward"),...Vb(i,"forward")]})).flat();return e=[...new Set(e)],e}const Nb=["disc","circle","square"],Bb=["decimal","decimal-leading-zero","lower-roman","upper-roman","lower-latin","upper-latin"];function Db(t){return Nb.includes(t)?"bulleted":Bb.includes(t)?"numbered":null}function Fb(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:Ba.call(this)}class Lb extends lr{static get pluginName(){return"ListUtils"}getListTypeFromListStyleType(t){return Db(t)}getSelectedListItems(t){return Mb(t)}getSiblingNodes(t,e){return Vb(t,e)}}function zb(t){return(e,i,n)=>{const s=n.consumable;if(!s.test(i.item,"insert")||!s.test(i.item,"attribute:listType")||!s.test(i.item,"attribute:listIndent"))return;s.consume(i.item,"insert"),s.consume(i.item,"attribute:listType"),s.consume(i.item,"attribute:listIndent");const o=i.item;Eb(o,Tb(o,n),n,t)}}const Hb=(t,e,i)=>{if(!i.consumable.test(e.item,t.name))return;const n=i.mapper.toViewElement(e.item),s=i.writer;s.breakContainer(s.createPositionBefore(n)),s.breakContainer(s.createPositionAfter(n));const o=n.parent,r="numbered"==e.attributeNewValue?"ol":"ul";s.rename(r,o)},jb=(t,e,i)=>{i.consumable.consume(e.item,t.name);const n=i.mapper.toViewElement(e.item).parent,s=i.writer;Sb(s,n,n.nextSibling),Sb(s,n.previousSibling,n)};const $b=(t,e,i)=>{if(i.consumable.test(e.item,t.name)&&"listItem"!=e.item.name){let t=i.mapper.toViewPosition(e.range.start);const n=i.writer,s=[];for(;("ul"==t.parent.name||"ol"==t.parent.name)&&(t=n.breakContainer(t),"li"==t.parent.name);){const e=t,i=n.createPositionAt(t.parent,"end");if(!e.isEqual(i)){const t=n.remove(n.createRange(e,i));s.push(t)}t=n.createPositionAfter(t.parent)}if(s.length>0){for(let e=0;e0){const e=Sb(n,i,i.nextSibling);e&&e.parent==i&&t.offset--}}Sb(n,t.nodeBefore,t.nodeAfter)}}},Wb=(t,e,i)=>{const n=i.mapper.toViewPosition(e.position),s=n.nodeBefore,o=n.nodeAfter;Sb(i.writer,s,o)},qb=(t,e,i)=>{if(i.consumable.consume(e.viewItem,{name:!0})){const t=i.writer,n=t.createElement("listItem"),s=function(t){let e=0,i=t.parent;for(;i;){if(i.is("element","li"))e++;else{const t=i.previousSibling;t&&t.is("element","li")&&e++}i=i.parent}return e}(e.viewItem);t.setAttribute("listIndent",s,n);const o=e.viewItem.parent&&"ol"==e.viewItem.parent.name?"numbered":"bulleted";if(t.setAttribute("listType",o,n),!i.safeInsert(n,e.modelCursor))return;const r=function(t,e,i){const{writer:n,schema:s}=i;let o=n.createPositionAfter(t);for(const r of e)if("ul"==r.name||"ol"==r.name)o=i.convertItem(r,o).modelCursor;else{const e=i.convertItem(r,n.createPositionAt(t,"end")),a=e.modelRange.start.nodeAfter;a&&a.is("element")&&!s.checkChild(t,a.name)&&(t=e.modelCursor.parent.is("element","listItem")?e.modelCursor.parent:Qb(e.modelCursor),o=n.createPositionAfter(t))}return o}(n,e.viewItem.getChildren(),i);e.modelRange=t.createRange(e.modelCursor,r),i.updateConversionResult(n,e)}},Ub=(t,e,i)=>{if(i.consumable.test(e.viewItem,{name:!0})){const t=Array.from(e.viewItem.getChildren());for(const e of t){!(e.is("element","li")||Zb(e))&&e._remove()}}},Kb=(t,e,i)=>{if(i.consumable.test(e.viewItem,{name:!0})){if(0===e.viewItem.childCount)return;const t=[...e.viewItem.getChildren()];let i=!1;for(const e of t)i&&!Zb(e)&&e._remove(),Zb(e)&&(i=!0)}};function Gb(t){return(e,i)=>{if(i.isPhantom)return;const n=i.modelPosition.nodeBefore;if(n&&n.is("element","listItem")){const e=i.mapper.toViewElement(n),s=e.getAncestors().find(Zb),o=t.createPositionAt(e,0).getWalker();for(const t of o){if("elementStart"==t.type&&t.item.is("element","li")){i.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==s){i.viewPosition=t.nextPosition;break}}}}}const Jb=function(t,[e,i,n]){const s=this;let o,r=e.is("documentFragment")?e.getChild(0):e;if(o=i?s.createSelection(i,n):s.document.selection,r&&r.is("element","listItem")){const t=o.getFirstPosition();let e=null;if(t.parent.is("element","listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("element","listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;r&&r.is("element","listItem");)r._setAttribute("listIndent",r.getAttribute("listIndent")+t),r=r.nextSibling}}};function Qb(t){const e=new mh({startPosition:t});let i;do{i=e.next()}while(!i.value.item.is("element","listItem"));return i.value.item}function Yb(t,e,i,n,s,o){const r=Ob(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t}),a=s.mapper,l=s.writer,c=r?r.getAttribute("listIndent"):null;let h;if(r)if(c==t){const t=a.toViewElement(r).parent;h=l.createPositionAfter(t)}else{const t=o.createPositionAt(r,"end");h=a.toViewPosition(t)}else h=i;h=Rb(h);for(const t of[...n.getChildren()])Zb(t)&&(h=l.move(l.createRangeOn(t),h).end,Sb(l,t,t.nextSibling),Sb(l,t.previousSibling,t))}function Zb(t){return t.is("element","ol")||t.is("element","ul")}class Xb extends lr{static get pluginName(){return"ListEditing"}static get requires(){return[mg,Fm,Lb]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data,i=t.editing;var n;t.model.document.registerPostFixer((e=>function(t,e){const i=t.document.differ.getChanges(),n=new Map;let s=!1;for(const n of i)if("insert"==n.type&&"listItem"==n.name)o(n.position);else if("insert"==n.type&&"listItem"!=n.name){if("$text"!=n.name){const i=n.position.nodeAfter;i.hasAttribute("listIndent")&&(e.removeAttribute("listIndent",i),s=!0),i.hasAttribute("listType")&&(e.removeAttribute("listType",i),s=!0),i.hasAttribute("listStyle")&&(e.removeAttribute("listStyle",i),s=!0),i.hasAttribute("listReversed")&&(e.removeAttribute("listReversed",i),s=!0),i.hasAttribute("listStart")&&(e.removeAttribute("listStart",i),s=!0);for(const e of Array.from(t.createRangeIn(i)).filter((t=>t.item.is("element","listItem"))))o(e.previousPosition)}o(n.position.getShiftedBy(n.length))}else"remove"==n.type&&"listItem"==n.name?o(n.position):("attribute"==n.type&&"listIndent"==n.attributeKey||"attribute"==n.type&&"listType"==n.attributeKey)&&o(n.range.start);for(const t of n.values())r(t),a(t);return s;function o(t){const e=t.nodeBefore;if(e&&e.is("element","listItem")){let t=e;if(n.has(t))return;for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling)if(t=e,n.has(t))return;n.set(e,t)}else{const e=t.nodeAfter;e&&e.is("element","listItem")&&n.set(e,e)}}function r(t){let i=0,n=null;for(;t&&t.is("element","listItem");){const o=t.getAttribute("listIndent");if(o>i){let r;null===n?(n=o-i,r=i):(n>o&&(n=o),r=o-n),e.setAttribute("listIndent",r,t),s=!0}else n=null,i=t.getAttribute("listIndent")+1;t=t.nextSibling}}function a(t){let i=[],n=null;for(;t&&t.is("element","listItem");){const o=t.getAttribute("listIndent");if(n&&n.getAttribute("listIndent")>o&&(i=i.slice(0,o+1)),0!=o)if(i[o]){const n=i[o];t.getAttribute("listType")!=n&&(e.setAttribute("listType",n,t),s=!0)}else i[o]=t.getAttribute("listType");n=t,t=t.nextSibling}}}(t.model,e))),i.mapper.registerViewToModelLength("li",t_),e.mapper.registerViewToModelLength("li",t_),i.mapper.on("modelToViewPosition",Gb(i.view)),i.mapper.on("viewToModelPosition",(n=t.model,(t,e)=>{const i=e.viewPosition,s=i.parent,o=e.mapper;if("ul"==s.name||"ol"==s.name){if(i.isAtEnd){const t=o.toModelElement(i.nodeBefore),s=o.getModelLength(i.nodeBefore);e.modelPosition=n.createPositionBefore(t).getShiftedBy(s)}else{const t=o.toModelElement(i.nodeAfter);e.modelPosition=n.createPositionBefore(t)}t.stop()}else if("li"==s.name&&i.nodeBefore&&("ul"==i.nodeBefore.name||"ol"==i.nodeBefore.name)){const r=o.toModelElement(s);let a=1,l=i.nodeBefore;for(;l&&Zb(l);)a+=o.getModelLength(l),l=l.previousSibling;e.modelPosition=n.createPositionBefore(r).getShiftedBy(a),t.stop()}})),e.mapper.on("modelToViewPosition",Gb(i.view)),t.conversion.for("editingDowncast").add((e=>{e.on("insert",$b,{priority:"high"}),e.on("insert:listItem",zb(t.model)),e.on("attribute:listType:listItem",Hb,{priority:"high"}),e.on("attribute:listType:listItem",jb,{priority:"low"}),e.on("attribute:listIndent:listItem",function(t){return(e,i,n)=>{if(!n.consumable.consume(i.item,"attribute:listIndent"))return;const s=n.mapper.toViewElement(i.item),o=n.writer;o.breakContainer(o.createPositionBefore(s)),o.breakContainer(o.createPositionAfter(s));const r=s.parent,a=r.previousSibling,l=o.createRangeOn(r);o.remove(l),a&&a.nextSibling&&Sb(o,a,a.nextSibling),Yb(i.attributeOldValue+1,i.range.start,l.start,s,n,t),Eb(i.item,s,n,t);for(const t of i.item.getChildren())n.consumable.consume(t,"insert")}}(t.model)),e.on("remove:listItem",function(t){return(e,i,n)=>{const s=n.mapper.toViewPosition(i.position).getLastMatchingPosition((t=>!t.item.is("element","li"))).nodeAfter,o=n.writer;o.breakContainer(o.createPositionBefore(s)),o.breakContainer(o.createPositionAfter(s));const r=s.parent,a=r.previousSibling,l=o.createRangeOn(r),c=o.remove(l);a&&a.nextSibling&&Sb(o,a,a.nextSibling),Yb(n.mapper.toModelElement(s).getAttribute("listIndent")+1,i.position,l.start,s,n,t);for(const t of o.createRangeIn(c).getItems())n.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",Wb,{priority:"low"})})),t.conversion.for("dataDowncast").add((e=>{e.on("insert",$b,{priority:"high"}),e.on("insert:listItem",zb(t.model))})),t.conversion.for("upcast").add((t=>{t.on("element:ul",Ub,{priority:"high"}),t.on("element:ol",Ub,{priority:"high"}),t.on("element:li",Kb,{priority:"high"}),t.on("element:li",qb)})),t.model.on("insertContent",Jb,{priority:"high"}),t.commands.add("numberedList",new Ab(t,"numbered")),t.commands.add("bulletedList",new Ab(t,"bulleted")),t.commands.add("indentList",new Pb(t,"forward")),t.commands.add("outdentList",new Pb(t,"backward"));const s=i.view.document;this.listenTo(s,"enter",((t,e)=>{const i=this.editor.model.document,n=i.selection.getLastPosition().parent;i.selection.isCollapsed&&"listItem"==n.name&&n.isEmpty&&(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(s,"delete",((t,e)=>{if("backward"!==e.direction)return;const i=this.editor.model.document.selection;if(!i.isCollapsed)return;const n=i.getFirstPosition();if(!n.isAtStart)return;const s=n.parent;if("listItem"!==s.name)return;s.previousSibling&&"listItem"===s.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(t.editing.view.document,"tab",((e,i)=>{const n=i.shiftKey?"outdentList":"indentList";this.editor.commands.get(n).isEnabled&&(t.execute(n),i.stopPropagation(),i.preventDefault(),e.stop())}),{context:"li"})}afterInit(){const t=this.editor.commands,e=t.get("indent"),i=t.get("outdent");e&&e.registerChildCommand(t.get("indentList")),i&&i.registerChildCommand(t.get("outdentList"))}}function t_(t){let e=1;for(const i of t.getChildren())if("ul"==i.name||"ol"==i.name)for(const t of i.getChildren())e+=t_(t);return e}const e_='',i_='';class n_ extends lr{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;Ib(this.editor,"numberedList",t("Numbered List"),e_),Ib(this.editor,"bulletedList",t("Bulleted List"),i_)}}class s_ extends hr{constructor(t,e){super(t),this.defaultType=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){this._tryToConvertItemsToList(t);const e=this.editor.model,i=Mb(e);i.length&&e.change((e=>{for(const n of i)e.setAttribute("listStyle",t.type||this.defaultType,n)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")?t.getAttribute("listStyle"):null}_checkEnabled(){const t=this.editor,e=t.commands.get("numberedList"),i=t.commands.get("bulletedList");return e.isEnabled||i.isEnabled}_tryToConvertItemsToList(t){if(!t.type)return;const e=Db(t.type);if(!e)return;const i=this.editor,n=`${e}List`;i.commands.get(n).value||i.execute(n)}}class o_ extends hr{refresh(){const t=this._getValue();this.value=t,this.isEnabled=null!=t}execute(t={}){const e=this.editor.model,i=Mb(e).filter((t=>"numbered"==t.getAttribute("listType")));e.change((e=>{for(const n of i)e.setAttribute("listReversed",!!t.reversed,n)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")&&"numbered"==t.getAttribute("listType")?t.getAttribute("listReversed"):null}}class r_ extends hr{refresh(){const t=this._getValue();this.value=t,this.isEnabled=null!=t}execute({startIndex:t=1}={}){const e=this.editor.model,i=Mb(e).filter((t=>"numbered"==t.getAttribute("listType")));e.change((e=>{for(const n of i)e.setAttribute("listStart",t>=0?t:1,n)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")&&"numbered"==t.getAttribute("listType")?t.getAttribute("listStart"):null}}const a_="default";class l_ extends lr{static get requires(){return[Xb]}static get pluginName(){return"ListPropertiesEditing"}constructor(t){super(t),t.config.define("list",{properties:{styles:!0,startIndex:!1,reversed:!1}})}init(){const t=this.editor,e=t.model,i=function(t){const e=[];t.styles&&e.push({attributeName:"listStyle",defaultValue:a_,addCommand(t){t.commands.add("listStyle",new s_(t,a_))},appliesToListItem:()=>!0,setAttributeOnDowncast(t,e,i){e&&e!==a_?t.setStyle("list-style-type",e,i):t.removeStyle("list-style-type",i)},getAttributeOnUpcast:t=>t.getStyle("list-style-type")||a_});t.reversed&&e.push({attributeName:"listReversed",defaultValue:!1,addCommand(t){t.commands.add("listReversed",new o_(t))},appliesToListItem:t=>"numbered"==t.getAttribute("listType"),setAttributeOnDowncast(t,e,i){e?t.setAttribute("reversed","reversed",i):t.removeAttribute("reversed",i)},getAttributeOnUpcast:t=>t.hasAttribute("reversed")});t.startIndex&&e.push({attributeName:"listStart",defaultValue:1,addCommand(t){t.commands.add("listStart",new r_(t))},appliesToListItem:t=>"numbered"==t.getAttribute("listType"),setAttributeOnDowncast(t,e,i){0==e||e>1?t.setAttribute("start",e,i):t.removeAttribute("start",i)},getAttributeOnUpcast(t){const e=t.getAttribute("start");return e>=0?e:1}});return e}(t.config.get("list.properties"));e.schema.extend("listItem",{allowAttributes:i.map((t=>t.attributeName))});for(const e of i)e.addCommand(t);var n;this.listenTo(t.commands.get("indentList"),"_executeCleanup",function(t,e){return(i,n)=>{const s=n[0],o=s.getAttribute("listIndent"),r=n.filter((t=>t.getAttribute("listIndent")===o));let a=null;s.previousSibling.getAttribute("listIndent")+1!==o&&(a=Ob(s.previousSibling,{sameIndent:!0,direction:"backward",listIndent:o})),t.model.change((t=>{for(const i of r)for(const n of e)if(n.appliesToListItem(i)){const e=null==a?n.defaultValue:a.getAttribute(n.attributeName);t.setAttribute(n.attributeName,e,i)}}))}}(t,i)),this.listenTo(t.commands.get("outdentList"),"_executeCleanup",function(t,e){return(i,n)=>{if(!(n=n.reverse().filter((t=>t.is("element","listItem")))).length)return;const s=n[0].getAttribute("listIndent"),o=n[0].getAttribute("listType");let r=n[0].previousSibling;if(r.is("element","listItem"))for(;r.getAttribute("listIndent")!==s;)r=r.previousSibling;else r=null;r||(r=n[n.length-1].nextSibling),r&&r.is("element","listItem")&&r.getAttribute("listType")===o&&t.model.change((t=>{const i=n.filter((t=>t.getAttribute("listIndent")===s));for(const n of i)for(const i of e)if(i.appliesToListItem(n)){const e=i.attributeName,s=r.getAttribute(e);t.setAttribute(e,s,n)}}))}}(t,i)),this.listenTo(t.commands.get("bulletedList"),"_executeCleanup",d_(t)),this.listenTo(t.commands.get("numberedList"),"_executeCleanup",d_(t)),e.document.registerPostFixer(function(t,e){return i=>{let n=!1;const s=u_(t.model.document.differ.getChanges()).filter((t=>"todo"!==t.getAttribute("listType")));if(!s.length)return n;let o=s[s.length-1].nextSibling;if((!o||!o.is("element","listItem"))&&(o=s[0].previousSibling,o)){const t=s[0].getAttribute("listIndent");for(;o.is("element","listItem")&&o.getAttribute("listIndent")!==t&&(o=o.previousSibling,o););}for(const t of e){const e=t.attributeName;for(const r of s)if(t.appliesToListItem(r))if(r.hasAttribute(e)){const s=r.previousSibling;h_(s,r,t.attributeName)&&(i.setAttribute(e,s.getAttribute(e),r),n=!0)}else c_(o,r,t)?i.setAttribute(e,o.getAttribute(e),r):i.setAttribute(e,t.defaultValue,r),n=!0;else i.removeAttribute(e,r)}return n}}(t,i)),t.conversion.for("upcast").add((n=i,t=>{t.on("element:li",((t,e,i)=>{const s=e.viewItem.parent,o=e.modelRange.start.nodeAfter||e.modelRange.end.nodeBefore;for(const t of n)if(t.appliesToListItem(o)){const e=t.getAttributeOnUpcast(s);i.writer.setAttribute(t.attributeName,e,o)}}),{priority:"low"})})),t.conversion.for("downcast").add(function(t){return i=>{for(const n of t)i.on(`attribute:${n.attributeName}:listItem`,((t,i,s)=>{const o=s.writer,r=i.item,a=Ob(r.previousSibling,{sameIndent:!0,listIndent:r.getAttribute("listIndent"),direction:"backward"}),l=s.mapper.toViewElement(r);e(r,a)||o.breakContainer(o.createPositionBefore(l)),n.setAttributeOnDowncast(o,i.attributeNewValue,l.parent)}),{priority:"low"})};function e(t,e){return e&&t.getAttribute("listType")===e.getAttribute("listType")&&t.getAttribute("listIndent")===e.getAttribute("listIndent")&&t.getAttribute("listStyle")===e.getAttribute("listStyle")&&t.getAttribute("listReversed")===e.getAttribute("listReversed")&&t.getAttribute("listStart")===e.getAttribute("listStart")}}(i)),this._mergeListAttributesWhileMergingLists(i)}afterInit(){const t=this.editor;t.commands.get("todoList")&&t.model.document.registerPostFixer(function(t){return e=>{const i=u_(t.model.document.differ.getChanges()).filter((t=>"todo"===t.getAttribute("listType")&&(t.hasAttribute("listStyle")||t.hasAttribute("listReversed")||t.hasAttribute("listStart"))));if(!i.length)return!1;for(const t of i)e.removeAttribute("listStyle",t),e.removeAttribute("listReversed",t),e.removeAttribute("listStart",t);return!0}}(t))}_mergeListAttributesWhileMergingLists(t){const e=this.editor.model;let i;this.listenTo(e,"deleteContent",((t,[e])=>{const n=e.getFirstPosition(),s=e.getLastPosition();if(n.parent===s.parent)return;if(!n.parent.is("element","listItem"))return;const o=s.parent.nextSibling;if(!o||!o.is("element","listItem"))return;const r=Ob(n.parent,{sameIndent:!0,listIndent:o.getAttribute("listIndent")});r&&r.getAttribute("listType")===o.getAttribute("listType")&&(i=r)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{i&&(e.change((e=>{const n=Ob(i.nextSibling,{sameIndent:!0,listIndent:i.getAttribute("listIndent"),direction:"forward"});if(!n)return void(i=null);const s=[n,...Vb(e.createPositionAt(n,0),"forward")];for(const n of s)for(const s of t)if(s.appliesToListItem(n)){const t=s.attributeName,o=i.getAttribute(t);e.setAttribute(t,o,n)}})),i=null)}),{priority:"low"})}}function c_(t,e,i){if(!t)return!1;const n=t.getAttribute(i.attributeName);return!!n&&(n!=i.defaultValue&&t.getAttribute("listType")===e.getAttribute("listType"))}function h_(t,e,i){if(!t||!t.is("element","listItem"))return!1;if(e.getAttribute("listType")!==t.getAttribute("listType"))return!1;const n=t.getAttribute("listIndent");if(n<1||n!==e.getAttribute("listIndent"))return!1;const s=t.getAttribute(i);return!(!s||s===e.getAttribute(i))}function d_(t){return(e,i)=>{i=i.filter((t=>t.is("element","listItem"))),t.model.change((t=>{for(const e of i)t.removeAttribute("listStyle",e)}))}}function u_(t){const e=[];for(const i of t){const t=f_(i);t&&t.is("element","listItem")&&e.push(t)}return e}function f_(t){return"attribute"===t.type?t.range.start.nodeAfter:"insert"===t.type?t.position.nodeAfter:null}class m_ extends yo{constructor(t,e){super(t);const i=this.bindTemplate;this.set("isCollapsed",!1),this.set("label",""),this.buttonView=this._createButtonView(),this.children=this.createCollection(),this.set("_collapsibleAriaLabelUid",void 0),e&&this.children.addMany(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-collapsible",i.if("isCollapsed","ck-collapsible_collapsed")]},children:[this.buttonView,{tag:"div",attributes:{class:["ck","ck-collapsible__children"],role:"region",hidden:i.if("isCollapsed","hidden"),"aria-labelledby":i.to("_collapsibleAriaLabelUid")},children:this.children}]})}render(){super.render(),this._collapsibleAriaLabelUid=this.buttonView.labelView.element.id}_createButtonView(){const t=new qo(this.locale),e=t.bindTemplate;return t.set({withText:!0,icon:Xo}),t.extendTemplate({attributes:{"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("label").to(this),t.bind("isOn").to(this,"isCollapsed",(t=>!t)),t.on("execute",(()=>{this.isCollapsed=!this.isCollapsed})),t}}class g_ extends yo{constructor(t,{enabledProperties:e,styleButtonViews:i,styleGridAriaLabel:n}){super(t),this.stylesView=null,this.additionalPropertiesCollapsibleView=null,this.startIndexFieldView=null,this.reversedSwitchButtonView=null,this.focusTracker=new uo,this.keystrokes=new fo,this.focusables=new vo;const s=["ck","ck-list-properties"];this.children=this.createCollection(),this.focusCycler=new nr({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),e.styles?(this.stylesView=this._createStylesView(i,n),this.children.add(this.stylesView)):s.push("ck-list-properties_without-styles"),(e.startIndex||e.reversed)&&(this._addNumberedListPropertyViews(e),s.push("ck-list-properties_with-numbered-properties")),this.setTemplate({tag:"div",attributes:{class:s},children:this.children})}render(){if(super.render(),this.stylesView){this.focusables.add(this.stylesView),this.focusTracker.add(this.stylesView.element),(this.startIndexFieldView||this.reversedSwitchButtonView)&&(this.focusables.add(this.children.last.buttonView),this.focusTracker.add(this.children.last.buttonView.element));for(const t of this.stylesView.children)this.stylesView.focusTracker.add(t.element);n({keystrokeHandler:this.stylesView.keystrokes,focusTracker:this.stylesView.focusTracker,gridItems:this.stylesView.children,numberOfColumns:()=>vs.window.getComputedStyle(this.stylesView.element).getPropertyValue("grid-template-columns").split(" ").length,uiLanguageDirection:this.locale&&this.locale.uiLanguageDirection})}if(this.startIndexFieldView){this.focusables.add(this.startIndexFieldView),this.focusTracker.add(this.startIndexFieldView.element),this.listenTo(this.startIndexFieldView.element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"});const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t)}this.reversedSwitchButtonView&&(this.focusables.add(this.reversedSwitchButtonView),this.focusTracker.add(this.reversedSwitchButtonView.element)),this.keystrokes.listenTo(this.element)}focus(){this.focusCycler.focusFirst()}focusLast(){this.focusCycler.focusLast()}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createStylesView(t,e){const i=new yo(this.locale);return i.children=i.createCollection(),i.children.addMany(t),i.setTemplate({tag:"div",attributes:{"aria-label":e,class:["ck","ck-list-styles-list"]},children:i.children}),i.children.delegate("execute").to(this),i.focus=function(){this.children.first.focus()},i.focusTracker=new uo,i.keystrokes=new fo,i.render(),i.keystrokes.listenTo(i.element),i}_addNumberedListPropertyViews(t){const e=this.locale.t,i=[];t.startIndex&&(this.startIndexFieldView=this._createStartIndexField(),i.push(this.startIndexFieldView)),t.reversed&&(this.reversedSwitchButtonView=this._createReversedSwitchButton(),i.push(this.reversedSwitchButtonView)),t.styles?(this.additionalPropertiesCollapsibleView=new m_(this.locale,i),this.additionalPropertiesCollapsibleView.set({label:e("List properties"),isCollapsed:!0}),this.additionalPropertiesCollapsibleView.buttonView.bind("isEnabled").toMany(i,"isEnabled",((...t)=>t.some((t=>t)))),this.additionalPropertiesCollapsibleView.buttonView.on("change:isEnabled",((t,e,i)=>{i||(this.additionalPropertiesCollapsibleView.isCollapsed=!0)})),this.children.add(this.additionalPropertiesCollapsibleView)):this.children.addMany(i)}_createStartIndexField(){const t=this.locale.t,e=new em(this.locale,nm);return e.set({label:t("Start at"),class:"ck-numbered-list-properties__start-index"}),e.fieldView.set({min:0,step:1,value:1,inputMode:"numeric"}),e.fieldView.on("input",(()=>{const i=e.fieldView.element,n=i.valueAsNumber;Number.isNaN(n)||(i.checkValidity()?this.fire("listStart",{startIndex:n}):e.errorText=t("Start index must be greater than 0."))})),e}_createReversedSwitchButton(){const t=this.locale.t,e=new Uo(this.locale);return e.set({withText:!0,label:t("Reversed order"),class:"ck-numbered-list-properties__reversed-order"}),e.delegate("execute").to(this,"listReversed"),e}}class p_ extends lr{static get pluginName(){return"ListPropertiesUI"}init(){const t=this.editor,e=t.locale.t,i=t.config.get("list.properties");i.styles&&t.ui.componentFactory.add("bulletedList",w_({editor:t,parentCommandName:"bulletedList",buttonLabel:e("Bulleted List"),buttonIcon:i_,styleGridAriaLabel:e("Bulleted list styles toolbar"),styleDefinitions:[{label:e("Toggle the disc list style"),tooltip:e("Disc"),type:"disc",icon:''},{label:e("Toggle the circle list style"),tooltip:e("Circle"),type:"circle",icon:''},{label:e("Toggle the square list style"),tooltip:e("Square"),type:"square",icon:''}]})),(i.styles||i.startIndex||i.reversed)&&t.ui.componentFactory.add("numberedList",w_({editor:t,parentCommandName:"numberedList",buttonLabel:e("Numbered List"),buttonIcon:e_,styleGridAriaLabel:e("Numbered list styles toolbar"),styleDefinitions:[{label:e("Toggle the decimal list style"),tooltip:e("Decimal"),type:"decimal",icon:''},{label:e("Toggle the decimal with leading zero list style"),tooltip:e("Decimal with leading zero"),type:"decimal-leading-zero",icon:''},{label:e("Toggle the lower–roman list style"),tooltip:e("Lower–roman"),type:"lower-roman",icon:''},{label:e("Toggle the upper–roman list style"),tooltip:e("Upper-roman"),type:"upper-roman",icon:''},{label:e("Toggle the lower–latin list style"),tooltip:e("Lower-latin"),type:"lower-latin",icon:''},{label:e("Toggle the upper–latin list style"),tooltip:e("Upper-latin"),type:"upper-latin",icon:''}]}))}}function w_({editor:t,parentCommandName:e,buttonLabel:i,buttonIcon:n,styleGridAriaLabel:s,styleDefinitions:o}){const r=t.commands.get(e);return a=>{const l=Of(a,er),c=l.buttonView;return l.bind("isEnabled").to(r),l.class="ck-list-styles-dropdown",c.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),c.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),c.bind("isOn").to(r,"value",(t=>!!t)),l.once("change:isOpen",(()=>{const i=function({editor:t,dropdownView:e,parentCommandName:i,styleDefinitions:n,styleGridAriaLabel:s}){const o=t.locale,r=t.config.get("list.properties");let a=null;"numberedList"!=i&&(r.startIndex=!1,r.reversed=!1);if(r.styles){const e=t.commands.get("listStyle"),s=function({editor:t,listStyleCommand:e,parentCommandName:i}){const n=t.locale,s=t.commands.get(i);return({label:i,type:o,icon:r,tooltip:a})=>{const l=new qo(n);return l.set({label:i,icon:r,tooltip:a}),e.on("change:value",(()=>{l.isOn=e.value===o})),l.on("execute",(()=>{s.value?e.value!==o?t.execute("listStyle",{type:o}):t.execute("listStyle",{type:e.defaultType}):t.model.change((()=>{t.execute("listStyle",{type:o})}))})),l}}({editor:t,parentCommandName:i,listStyleCommand:e}),o="function"==typeof e.isStyleTypeSupported?t=>e.isStyleTypeSupported(t.type):()=>!0;a=n.filter(o).map(s)}const l=new g_(o,{styleGridAriaLabel:s,enabledProperties:r,styleButtonViews:a});r.styles&&Bf(e,(()=>l.stylesView.children.find((t=>t.isOn))));if(r.startIndex){const e=t.commands.get("listStart");l.startIndexFieldView.bind("isEnabled").to(e),l.startIndexFieldView.fieldView.bind("value").to(e),l.on("listStart",((e,i)=>t.execute("listStart",i)))}if(r.reversed){const e=t.commands.get("listReversed");l.reversedSwitchButtonView.bind("isEnabled").to(e),l.reversedSwitchButtonView.bind("isOn").to(e,"value",(t=>!!t)),l.on("listReversed",(()=>{const i=e.value;t.execute("listReversed",{reversed:!i})}))}return l.delegate("execute").to(e),l}({editor:t,dropdownView:l,parentCommandName:e,styleGridAriaLabel:s,styleDefinitions:o});l.panelView.children.add(i)})),l.on("execute",(()=>{t.editing.view.focus()})),l}}function b_(t,e,i,{blockElements:n,inlineObjectElements:s}){let o=i.createPositionAt(t,"forward"==e?"after":"before");return o=o.getLastMatchingPosition((({item:t})=>t.is("element")&&!n.includes(t.name)&&!s.includes(t.name)),{direction:e}),"forward"==e?o.nodeAfter:o.nodeBefore}function __(t,e){return!!t&&t.is("element")&&e.includes(t.name)}function v_(t,e){if(!t.childCount)return;const i=new cf(t.document),n=function(t,e){const i=e.createRangeIn(t),n=new Tr({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),s=[];for(const t of i)if("elementStart"===t.type&&n.match(t.item)){const e=A_(t.item);s.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}return s}(t,i);if(!n.length)return;let s=null,o=1;n.forEach(((t,r)=>{const a=function(t,e){if(!t)return!0;if(t.id!==e.id)return e.indent-t.indent!=1;const i=e.element.previousSibling;if(!i)return!0;return n=i,!(n.is("element","ol")||n.is("element","ul"));var n}(n[r-1],t),l=a?null:n[r-1],c=(d=t,(h=l)?d.indent-h.indent:d.indent-1);var h,d;if(a&&(s=null,o=1),!s||0!==c){const n=function(t,e){const i=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi"),n=/mso-level-number-format:([^;]{0,100});/gi,s=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,o=i.exec(e);let r="decimal",a="ol",l=null;if(o&&o[1]){const e=n.exec(o[1]);if(e&&e[1]&&(r=e[1].trim(),a="bullet"!==r&&"image"!==r?"ol":"ul"),"bullet"===r){const e=function(t){const e=function(t){if(t.getChild(0).is("$text"))return null;for(const e of t.getChildren()){if(!e.is("element","span"))continue;const t=e.getChild(0);return t.is("$text")?t:t.getChild(0)}return null}(t);if(!e)return null;const i=e._data;if("o"===i)return"circle";if("·"===i)return"disc";if("§"===i)return"square";return null}(t.element);e&&(r=e)}else{const t=s.exec(o[1]);t&&t[1]&&(l=parseInt(t[1]))}}return{type:a,startIndex:l,style:y_(r)}}(t,e);if(s){if(t.indent>o){const t=s.getChild(s.childCount-1),e=t.getChild(t.childCount-1);s=k_(n,e,i),o+=1}else if(t.indent1&&i.setAttribute("start",t.startIndex,s),s}function A_(t){const e={},i=t.getStyle("mso-list");if(i){const t=i.match(/(^|\s{1,100})l(\d+)/i),n=i.match(/\s{0,100}lfo(\d+)/i),s=i.match(/\s{0,100}level(\d+)/i);t&&n&&s&&(e.id=t[2],e.order=n[1],e.indent=parseInt(s[1]))}return e}const x_=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class C_{constructor(t){this.document=t}isActive(t){return x_.test(t)}execute(t){const e=new cf(this.document),{body:i}=t._parsedData;!function(t,e){for(const i of t.getChildren())if(i.is("element","b")&&"normal"===i.getStyle("font-weight")){const n=t.getChildIndex(i);e.remove(i),e.insertChild(n,i.getChildren(),t)}}(i,e),function(t,e){for(const i of e.createRangeIn(t)){const t=i.item;if(t.is("element","li")){const i=t.getChild(0);i&&i.is("element","p")&&e.unwrapElement(i)}}}(i,e),function(t,e){const i=new Xa(e.document.stylesProcessor),n=new jl(i,{renderingMode:"data"}),s=n.blockElements,o=n.inlineObjectElements,r=[];for(const i of e.createRangeIn(t)){const t=i.item;if(t.is("element","br")){const i=b_(t,"forward",e,{blockElements:s,inlineObjectElements:o}),n=b_(t,"backward",e,{blockElements:s,inlineObjectElements:o}),a=__(i,s);(__(n,s)||a)&&r.push(t)}}for(const t of r)t.hasClass("Apple-interchange-newline")?e.remove(t):e.replace(t,e.createElement("p"))}(i,e),t.content=i}}function P_(t,e){if(!t.childCount)return;const i=new cf(t.document),n=function(t,e){const i=e.createRangeIn(t),n=new Tr({name:/v:(.+)/}),s=[];for(const t of i){if("elementStart"!=t.type)continue;const e=t.item,i=e.previousSibling,o=i&&i.is("element")?i.name:null;n.match(e)&&e.getAttribute("o:gfxdata")&&"v:shapetype"!==o&&s.push(t.item.getAttribute("id"))}return s}(t,i);!function(t,e,i){const n=i.createRangeIn(e),s=new Tr({name:"img"}),o=[];for(const e of n)if(e.item.is("element")&&s.match(e.item)){const i=e.item,n=i.getAttribute("v:shapes")?i.getAttribute("v:shapes").split(" "):[];n.length&&n.every((e=>t.indexOf(e)>-1))?o.push(i):i.getAttribute("src")||o.push(i)}for(const t of o)i.remove(t)}(n,t,i),function(t,e,i){const n=i.createRangeIn(e),s=[];for(const e of n)if("elementStart"==e.type&&e.item.is("element","v:shape")){const i=e.item.getAttribute("id");if(t.includes(i))continue;o(e.item.parent.getChildren(),i)||s.push(e.item)}for(const t of s){const e={src:r(t)};t.hasAttribute("alt")&&(e.alt=t.getAttribute("alt"));const n=i.createElement("img",e);i.insertChild(t.index+1,n,t.parent)}function o(t,e){for(const i of t)if(i.is("element")){if("img"==i.name&&i.getAttribute("v:shapes")==e)return!0;if(o(i.getChildren(),e))return!0}return!1}function r(t){for(const e of t.getChildren())if(e.is("element")&&e.getAttribute("src"))return e.getAttribute("src")}}(n,t,i),function(t,e){const i=e.createRangeIn(t),n=new Tr({name:/v:(.+)/}),s=[];for(const t of i)"elementStart"==t.type&&n.match(t.item)&&s.push(t.item);for(const t of s)e.remove(t)}(t,i);const s=function(t,e){const i=e.createRangeIn(t),n=new Tr({name:"img"}),s=[];for(const t of i)t.item.is("element")&&n.match(t.item)&&t.item.getAttribute("src").startsWith("file://")&&s.push(t.item);return s}(t,i);s.length&&function(t,e,i){if(t.length===e.length)for(let n=0;nString.fromCharCode(parseInt(t,16)))).join(""))}const E_=//i,S_=/xmlns:o="urn:schemas-microsoft-com/i;class R_{constructor(t){this.document=t}isActive(t){return E_.test(t)||S_.test(t)}execute(t){const{body:e,stylesString:i}=t._parsedData;v_(e,i),P_(e,t.dataTransfer.getData("text/rtf")),t.content=e}}function O_(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1===e.length?" ":Array(e.length+1).join("  ").substr(0,e.length)))}function I_(t,e){const i=new DOMParser,n=function(t){return O_(O_(t)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(t){const e="",i="",n=t.indexOf(e);if(n<0)return t;const s=t.indexOf(i,n+e.length);return t.substring(0,n+e.length)+(s>=0?t.substring(s):"")}(t=t.replace(/

    abc

    \n\t\t\t//\n\t\t\tif ( isAttribute && this._wrapAttributeElement( wrapElement, child ) ) {\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// Wrap the child if it is not an attribute element or if it is an attribute element that should be inside\n\t\t\t// `wrapElement` (due to priority).\n\t\t\t//\n\t\t\t//

    abc

    -->

    abc

    \n\t\t\t//

    abc

    -->

    abc

    \n\t\t\telse if ( isText || !isAttribute || shouldABeOutsideB( wrapElement, child ) ) {\n\t\t\t\t// Clone attribute.\n\t\t\t\tconst newAttribute = wrapElement._clone();\n\n\t\t\t\t// Wrap current node with new attribute.\n\t\t\t\tchild._remove();\n\t\t\t\tnewAttribute._appendChild( child );\n\n\t\t\t\tparent._insertChild( i, newAttribute );\n\t\t\t\tthis._addToClonedElementsGroup( newAttribute );\n\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// If other nested attribute is found and it wasn't wrapped (see above), continue wrapping inside it.\n\t\t\t//\n\t\t\t//

    abc

    -->

    abc

    \n\t\t\t//\n\t\t\telse /* if ( isAttribute ) */ {\n\t\t\t\tthis._wrapChildren( child, 0, child.childCount, wrapElement );\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each wrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of wrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Unwraps children from provided `unwrapElement`. Only children contained in `parent` element between\n\t * `startOffset` and `endOffset` will be unwrapped.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} parent\n\t * @param {Number} startOffset\n\t * @param {Number} endOffset\n\t * @param {module:engine/view/element~Element} unwrapElement\n\t */\n\t_unwrapChildren( parent, startOffset, endOffset, unwrapElement ) {\n\t\tlet i = startOffset;\n\t\tconst unwrapPositions = [];\n\n\t\t// Iterate over each element between provided offsets inside parent.\n\t\t// We don't use tree walker or range iterator because we will be removing and merging potentially multiple nodes,\n\t\t// so it could get messy. It is safer to it manually in this case.\n\t\twhile ( i < endOffset ) {\n\t\t\tconst child = parent.getChild( i );\n\n\t\t\t// Skip all text nodes. There should be no container element's here either.\n\t\t\tif ( !child.is( 'attributeElement' ) ) {\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// (In all examples, assume that `unwrapElement` is `` element.)\n\t\t\t//\n\t\t\t// If the child is similar to the given attribute element, unwrap it - it will be completely removed.\n\t\t\t//\n\t\t\t//

    abcxyz

    -->

    abcxyz

    \n\t\t\t//\n\t\t\tif ( child.isSimilar( unwrapElement ) ) {\n\t\t\t\tconst unwrapped = child.getChildren();\n\t\t\t\tconst count = child.childCount;\n\n\t\t\t\t// Replace wrapper element with its children\n\t\t\t\tchild._remove();\n\t\t\t\tparent._insertChild( i, unwrapped );\n\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\n\t\t\t\t// Save start and end position of moved items.\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + count )\n\t\t\t\t);\n\n\t\t\t\t// Skip elements that were unwrapped. Assuming there won't be another element to unwrap in child elements.\n\t\t\t\ti += count;\n\t\t\t\tendOffset += count - 1;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If the child is not similar but is an attribute element, try partial unwrapping - remove the same attributes/styles/classes.\n\t\t\t// Partial unwrapping will happen only if the elements have the same name.\n\t\t\t//\n\t\t\t//

    abcxyz

    -->

    abcxyz

    \n\t\t\t//

    abcxyz

    -->

    abcxyz

    \n\t\t\t//\n\t\t\tif ( this._unwrapAttributeElement( unwrapElement, child ) ) {\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + 1 )\n\t\t\t\t);\n\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If other nested attribute is found, look through it's children for elements to unwrap.\n\t\t\t//\n\t\t\t//

    abc

    -->

    abc

    \n\t\t\t//\n\t\t\tthis._unwrapChildren( child, 0, child.childCount, unwrapElement );\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each unwrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of unwrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset || position.offset == endOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Helper function for `view.writer.wrap`. Wraps range with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/range~Range} range\n\t * @param {module:engine/view/attributeelement~AttributeElement} attribute\n\t * @returns {module:engine/view/range~Range} New range after wrapping, spanning over wrapping attribute element.\n\t */\n\t_wrapRange( range, attribute ) {\n\t\t// Break attributes at range start and end.\n\t\tconst { start: breakStart, end: breakEnd } = this._breakAttributesRange( range, true );\n\t\tconst parentContainer = breakStart.parent;\n\n\t\t// Wrap all children with attribute.\n\t\tconst newRange = this._wrapChildren( parentContainer, breakStart.offset, breakEnd.offset, attribute );\n\n\t\t// Merge attributes at the both ends and return a new range.\n\t\tconst start = this.mergeAttributes( newRange.start );\n\n\t\t// If start position was merged - move end position back.\n\t\tif ( !start.isEqual( newRange.start ) ) {\n\t\t\tnewRange.end.offset--;\n\t\t}\n\t\tconst end = this.mergeAttributes( newRange.end );\n\n\t\treturn new Range( start, end );\n\t}\n\n\t/**\n\t * Helper function for {@link #wrap}. Wraps position with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/position~Position} position\n\t * @param {module:engine/view/attributeelement~AttributeElement} attribute\n\t * @returns {module:engine/view/position~Position} New position after wrapping.\n\t */\n\t_wrapPosition( position, attribute ) {\n\t\t// Return same position when trying to wrap with attribute similar to position parent.\n\t\tif ( attribute.isSimilar( position.parent ) ) {\n\t\t\treturn movePositionToTextNode( position.clone() );\n\t\t}\n\n\t\t// When position is inside text node - break it and place new position between two text nodes.\n\t\tif ( position.parent.is( '$text' ) ) {\n\t\t\tposition = breakTextNode( position );\n\t\t}\n\n\t\t// Create fake element that will represent position, and will not be merged with other attributes.\n\t\tconst fakePosition = this.createAttributeElement();\n\t\tfakePosition._priority = Number.POSITIVE_INFINITY;\n\t\tfakePosition.isSimilar = () => false;\n\n\t\t// Insert fake element in position location.\n\t\tposition.parent._insertChild( position.offset, fakePosition );\n\n\t\t// Range around inserted fake attribute element.\n\t\tconst wrapRange = new Range( position, position.getShiftedBy( 1 ) );\n\n\t\t// Wrap fake element with attribute (it will also merge if possible).\n\t\tthis.wrap( wrapRange, attribute );\n\n\t\t// Remove fake element and place new position there.\n\t\tconst newPosition = new Position( fakePosition.parent, fakePosition.index );\n\t\tfakePosition._remove();\n\n\t\t// If position is placed between text nodes - merge them and return position inside.\n\t\tconst nodeBefore = newPosition.nodeBefore;\n\t\tconst nodeAfter = newPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof Text && nodeAfter instanceof Text ) {\n\t\t\treturn mergeTextNodes( nodeBefore, nodeAfter );\n\t\t}\n\n\t\t// If position is next to text node - move position inside.\n\t\treturn movePositionToTextNode( newPosition );\n\t}\n\n\t/**\n\t * \tWraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by\n\t * \tmerging them if possible. When merging is possible - all attributes, styles and classes are moved from wrapper\n\t * \telement to element being wrapped.\n\t *\n\t * \t@private\n\t * \t@param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n\t * \t@param {module:engine/view/attributeelement~AttributeElement} toWrap AttributeElement to wrap using wrapper element.\n\t * \t@returns {Boolean} Returns `true` if elements are merged.\n\t */\n\t_wrapAttributeElement( wrapper, toWrap ) {\n\t\tif ( !canBeJoined( wrapper, toWrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't merge if name or priority differs.\n\t\tif ( wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if attributes can be merged.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are different we cannot wrap.\n\t\t\tif ( toWrap.hasAttribute( key ) && toWrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if styles can be merged.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( toWrap.hasStyle( key ) && toWrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Move all attributes/classes/styles from wrapper to wrapped AttributeElement.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Move only these attributes that are not present - other are similar.\n\t\t\tif ( !toWrap.hasAttribute( key ) ) {\n\t\t\t\tthis.setAttribute( key, wrapper.getAttribute( key ), toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( !toWrap.hasStyle( key ) ) {\n\t\t\t\tthis.setStyle( key, wrapper.getStyle( key ), toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getClassNames() ) {\n\t\t\tif ( !toWrap.hasClass( key ) ) {\n\t\t\t\tthis.addClass( key, toWrap );\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing\n\t * corresponding attributes, classes and styles. All attributes, classes and styles from wrapper should be present\n\t * inside element being unwrapped.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n\t * @param {module:engine/view/attributeelement~AttributeElement} toUnwrap AttributeElement to unwrap using wrapper element.\n\t * @returns {Boolean} Returns `true` if elements are unwrapped.\n\t **/\n\t_unwrapAttributeElement( wrapper, toUnwrap ) {\n\t\tif ( !canBeJoined( wrapper, toUnwrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't unwrap if name or priority differs.\n\t\tif ( wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper attributes.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasAttribute( key ) || toUnwrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper classes.\n\t\tif ( !toUnwrap.hasClass( ...wrapper.getClassNames() ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper styles.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\t// If some styles are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasStyle( key ) || toUnwrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Remove all wrapper's attributes from unwrapped element.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.removeAttribute( key, toUnwrap );\n\t\t}\n\n\t\t// Remove all wrapper's classes from unwrapped element.\n\t\tthis.removeClass( Array.from( wrapper.getClassNames() ), toUnwrap );\n\n\t\t// Remove all wrapper's styles from unwrapped element.\n\t\tthis.removeStyle( Array.from( wrapper.getStyleNames() ), toUnwrap );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at the boundaries of given range.\n\t *\n\t * @private\n\t * @param {module:engine/view/range~Range} range Range which `start` and `end` positions will be used to break attributes.\n\t * @param {Boolean} [forceSplitText=false] If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns {module:engine/view/range~Range} New range with located at break positions.\n\t */\n\t_breakAttributesRange( range, forceSplitText = false ) {\n\t\tconst rangeStart = range.start;\n\t\tconst rangeEnd = range.end;\n\n\t\tvalidateRangeContainer( range, this.document );\n\n\t\t// Break at the collapsed position. Return new collapsed range.\n\t\tif ( range.isCollapsed ) {\n\t\t\tconst position = this._breakAttributes( range.start, forceSplitText );\n\n\t\t\treturn new Range( position, position );\n\t\t}\n\n\t\tconst breakEnd = this._breakAttributes( rangeEnd, forceSplitText );\n\t\tconst count = breakEnd.parent.childCount;\n\t\tconst breakStart = this._breakAttributes( rangeStart, forceSplitText );\n\n\t\t// Calculate new break end offset.\n\t\tbreakEnd.offset += breakEnd.parent.childCount - count;\n\n\t\treturn new Range( breakStart, breakEnd );\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at given position.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position\n\t * is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position\n\t * is placed inside {@link module:engine/view/uielement~UIElement UIElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/position~Position} position Position where to break attributes.\n\t * @param {Boolean} [forceSplitText=false] If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns {module:engine/view/position~Position} New position after breaking the attributes.\n\t */\n\t_breakAttributes( position, forceSplitText = false ) {\n\t\tconst positionOffset = position.offset;\n\t\tconst positionParent = position.parent;\n\n\t\t// If position is placed inside EmptyElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'emptyElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break an `EmptyElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-empty-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-empty-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside UIElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'uiElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break a `UIElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-ui-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-ui-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside RawElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'rawElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break a `RawElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-raw-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-raw-element', this.document );\n\t\t}\n\n\t\t// There are no attributes to break and text nodes breaking is not forced.\n\t\tif ( !forceSplitText && positionParent.is( '$text' ) && isContainerOrFragment( positionParent.parent ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Position's parent is container, so no attributes to break.\n\t\tif ( isContainerOrFragment( positionParent ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Break text and start again in new position.\n\t\tif ( positionParent.is( '$text' ) ) {\n\t\t\treturn this._breakAttributes( breakTextNode( position ), forceSplitText );\n\t\t}\n\n\t\tconst length = positionParent.childCount;\n\n\t\t//

    foobar{}

    \n\t\t//

    foobar[]

    \n\t\t//

    foobar[]

    \n\t\tif ( positionOffset == length ) {\n\t\t\tconst newPosition = new Position( positionParent.parent, positionParent.index + 1 );\n\n\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t} else {\n\t\t\t//

    foo{}bar

    \n\t\t\t//

    foo[]bar

    \n\t\t\t//

    foo{}bar

    \n\t\t\tif ( positionOffset === 0 ) {\n\t\t\t\tconst newPosition = new Position( positionParent.parent, positionParent.index );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t\t//

    foob{}ar

    \n\t\t\t//

    foob[]ar

    \n\t\t\t//

    foob[]ar

    \n\t\t\t//

    foob[]ar

    \n\t\t\telse {\n\t\t\t\tconst offsetAfter = positionParent.index + 1;\n\n\t\t\t\t// Break element.\n\t\t\t\tconst clonedNode = positionParent._clone();\n\n\t\t\t\t// Insert cloned node to position's parent node.\n\t\t\t\tpositionParent.parent._insertChild( offsetAfter, clonedNode );\n\t\t\t\tthis._addToClonedElementsGroup( clonedNode );\n\n\t\t\t\t// Get nodes to move.\n\t\t\t\tconst count = positionParent.childCount - positionOffset;\n\t\t\t\tconst nodesToMove = positionParent._removeChildren( positionOffset, count );\n\n\t\t\t\t// Move nodes to cloned node.\n\t\t\t\tclonedNode._appendChild( nodesToMove );\n\n\t\t\t\t// Create new position to work on.\n\t\t\t\tconst newPosition = new Position( positionParent.parent, offsetAfter );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Stores the information that an {@link module:engine/view/attributeelement~AttributeElement attribute element} was\n\t * added to the tree. Saves the reference to the group in the given element and updates the group, so other elements\n\t * from the group now keep a reference to the given attribute element.\n\t *\n\t * The clones group can be obtained using {@link module:engine/view/attributeelement~AttributeElement#getElementsWithSameId}.\n\t *\n\t * Does nothing if added element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} element Attribute element to save.\n\t */\n\t_addToClonedElementsGroup( element ) {\n\t\t// Add only if the element is in document tree.\n\t\tif ( !element.root.is( 'rootElement' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Traverse the element's children recursively to find other attribute elements that also might got inserted.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._addToClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = element.id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\tgroup = new Set();\n\t\t\tthis._cloneGroups.set( id, group );\n\t\t}\n\n\t\tgroup.add( element );\n\t\telement._clonesGroup = group;\n\t}\n\n\t/**\n\t * Removes all the information about the given {@link module:engine/view/attributeelement~AttributeElement attribute element}\n\t * from its clones group.\n\t *\n\t * Keep in mind, that the element will still keep a reference to the group (but the group will not keep a reference to it).\n\t * This allows to reference the whole group even if the element was already removed from the tree.\n\t *\n\t * Does nothing if the element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} element Attribute element to remove.\n\t */\n\t_removeFromClonedElementsGroup( element ) {\n\t\t// Traverse the element's children recursively to find other attribute elements that also got removed.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = element.id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\treturn;\n\t\t}\n\n\t\tgroup.delete( element );\n\t\t// Not removing group from element on purpose!\n\t\t// If other parts of code have reference to this element, they will be able to get references to other elements from the group.\n\t}\n}\n\n// Helper function for `view.writer.wrap`. Checks if given element has any children that are not ui elements.\nfunction _hasNonUiChildren( parent ) {\n\treturn Array.from( parent.getChildren() ).some( child => !child.is( 'uiElement' ) );\n}\n\n/**\n * The `attribute` passed to {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`}\n * must be an instance of {@link module:engine/view/attributeelement~AttributeElement `AttributeElement`}.\n *\n * @error view-writer-wrap-invalid-attribute\n */\n\n// Returns first parent container of specified {@link module:engine/view/position~Position Position}.\n// Position's parent node is checked as first, then next parents are checked.\n// Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\n//\n// @param {module:engine/view/position~Position} position Position used as a start point to locate parent container.\n// @returns {module:engine/view/containerelement~ContainerElement|module:engine/view/documentfragment~DocumentFragment|undefined}\n// Parent container element or `undefined` if container is not found.\nfunction getParentContainer( position ) {\n\tlet parent = position.parent;\n\n\twhile ( !isContainerOrFragment( parent ) ) {\n\t\tif ( !parent ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tparent = parent.parent;\n\t}\n\n\treturn parent;\n}\n\n// Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function\n// can be wrapped outside second element. It is done by comparing elements'\n// {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority\n// {@link module:engine/view/element~Element#getIdentity identities} are compared.\n//\n// @param {module:engine/view/attributeelement~AttributeElement} a\n// @param {module:engine/view/attributeelement~AttributeElement} b\n// @returns {Boolean}\nfunction shouldABeOutsideB( a, b ) {\n\tif ( a.priority < b.priority ) {\n\t\treturn true;\n\t} else if ( a.priority > b.priority ) {\n\t\treturn false;\n\t}\n\n\t// When priorities are equal and names are different - use identities.\n\treturn a.getIdentity() < b.getIdentity();\n}\n\n// Returns new position that is moved to near text node. Returns same position if there is no text node before of after\n// specified position.\n//\n//\t\t

    foo[]

    ->

    foo{}

    \n//\t\t

    []foo

    ->

    {}foo

    \n//\n// @param {module:engine/view/position~Position} position\n// @returns {module:engine/view/position~Position} Position located inside text node or same position if there is no text nodes\n// before or after position location.\nfunction movePositionToTextNode( position ) {\n\tconst nodeBefore = position.nodeBefore;\n\n\tif ( nodeBefore && nodeBefore.is( '$text' ) ) {\n\t\treturn new Position( nodeBefore, nodeBefore.data.length );\n\t}\n\n\tconst nodeAfter = position.nodeAfter;\n\n\tif ( nodeAfter && nodeAfter.is( '$text' ) ) {\n\t\treturn new Position( nodeAfter, 0 );\n\t}\n\n\treturn position;\n}\n\n// Breaks text node into two text nodes when possible.\n//\n//\t\t

    foo{}bar

    ->

    foo[]bar

    \n//\t\t

    {}foobar

    ->

    []foobar

    \n//\t\t

    foobar{}

    ->

    foobar[]

    \n//\n// @param {module:engine/view/position~Position} position Position that need to be placed inside text node.\n// @returns {module:engine/view/position~Position} New position after breaking text node.\nfunction breakTextNode( position ) {\n\tif ( position.offset == position.parent.data.length ) {\n\t\treturn new Position( position.parent.parent, position.parent.index + 1 );\n\t}\n\n\tif ( position.offset === 0 ) {\n\t\treturn new Position( position.parent.parent, position.parent.index );\n\t}\n\n\t// Get part of the text that need to be moved.\n\tconst textToMove = position.parent.data.slice( position.offset );\n\n\t// Leave rest of the text in position's parent.\n\tposition.parent._data = position.parent.data.slice( 0, position.offset );\n\n\t// Insert new text node after position's parent text node.\n\tposition.parent.parent._insertChild( position.parent.index + 1, new Text( position.root.document, textToMove ) );\n\n\t// Return new position between two newly created text nodes.\n\treturn new Position( position.parent.parent, position.parent.index + 1 );\n}\n\n// Merges two text nodes into first node. Removes second node and returns merge position.\n//\n// @param {module:engine/view/text~Text} t1 First text node to merge. Data from second text node will be moved at the end of\n// this text node.\n// @param {module:engine/view/text~Text} t2 Second text node to merge. This node will be removed after merging.\n// @returns {module:engine/view/position~Position} Position after merging text nodes.\nfunction mergeTextNodes( t1, t2 ) {\n\t// Merge text data into first text node and remove second one.\n\tconst nodeBeforeLength = t1.data.length;\n\tt1._data += t2.data;\n\tt2._remove();\n\n\treturn new Position( t1, nodeBeforeLength );\n}\n\n// Checks if provided nodes are valid to insert.\n//\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\n// contains instances that are not supported ones (see error description for valid ones.\n//\n// @param Iterable. nodes\n// @param {Object} errorContext\nfunction validateNodesToInsert( nodes, errorContext ) {\n\tfor ( const node of nodes ) {\n\t\tif ( !validNodesToInsert.some( ( validNode => node instanceof validNode ) ) ) { // eslint-disable-line no-use-before-define\n\t\t\t/**\n\t\t\t * One of the nodes to be inserted is of an invalid type.\n\t\t\t *\n\t\t\t * Nodes to be inserted with {@link module:engine/view/downcastwriter~DowncastWriter#insert `DowncastWriter#insert()`} should be\n\t\t\t * of the following types:\n\t\t\t *\n\t\t\t * * {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n\t\t\t * * {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n\t\t\t * * {@link module:engine/view/emptyelement~EmptyElement EmptyElement},\n\t\t\t * * {@link module:engine/view/uielement~UIElement UIElement},\n\t\t\t * * {@link module:engine/view/rawelement~RawElement RawElement},\n\t\t\t * * {@link module:engine/view/text~Text Text}.\n\t\t\t *\n\t\t\t * @error view-writer-insert-invalid-node-type\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-insert-invalid-node-type', errorContext );\n\t\t}\n\n\t\tif ( !node.is( '$text' ) ) {\n\t\t\tvalidateNodesToInsert( node.getChildren(), errorContext );\n\t\t}\n\t}\n}\n\nconst validNodesToInsert = [ Text, AttributeElement, ContainerElement, EmptyElement, RawElement, UIElement ];\n\n// Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way.\n//\n// @param {module:engine/view/node~Node} node\n// @returns {Boolean} Returns `true` if node is instance of ContainerElement or DocumentFragment.\nfunction isContainerOrFragment( node ) {\n\treturn node && ( node.is( 'containerElement' ) || node.is( 'documentFragment' ) );\n}\n\n// Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed\n// inside same {@link module:engine/view/containerelement~ContainerElement container element}.\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.\n//\n// @param {module:engine/view/range~Range} range\n// @param {Object} errorContext\nfunction validateRangeContainer( range, errorContext ) {\n\tconst startContainer = getParentContainer( range.start );\n\tconst endContainer = getParentContainer( range.end );\n\n\tif ( !startContainer || !endContainer || startContainer !== endContainer ) {\n\t\t/**\n\t\t * The container of the given range is invalid.\n\t\t *\n\t\t * This may happen if {@link module:engine/view/range~Range#start range start} and\n\t\t * {@link module:engine/view/range~Range#end range end} positions are not placed inside the same container element or\n\t\t * a parent container for these positions cannot be found.\n\t\t *\n\t\t * Methods like {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#remove()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#clean()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#unwrap()`} need to be called\n\t\t * on a range that has its start and end positions located in the same container element. Both positions can be\n\t\t * nested within other elements (e.g. an attribute element) but the closest container ancestor must be the same.\n\t\t *\n\t\t * @error view-writer-invalid-range-container\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-invalid-range-container', errorContext );\n\t}\n}\n\n// Checks if two attribute elements can be joined together. Elements can be joined together if, and only if\n// they do not have ids specified.\n//\n// @private\n// @param {module:engine/view/element~Element} a\n// @param {module:engine/view/element~Element} b\n// @returns {Boolean}\nfunction canBeJoined( a, b ) {\n\treturn a.id === null && b.id === null;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module utils/dom/istext\n */\n/**\n * Checks if the object is a native DOM Text node.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isText(obj) {\n return Object.prototype.toString.call(obj) == '[object Text]';\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';\nimport isText from '@ckeditor/ckeditor5-utils/src/dom/istext';\n\n/**\n * Set of utilities related to handling block and inline fillers.\n *\n * Browsers do not allow to put caret in elements which does not have height. Because of it, we need to fill all\n * empty elements which should be selectable with elements or characters called \"fillers\". Unfortunately there is no one\n * universal filler, this is why two types are uses:\n *\n * * Block filler is an element which fill block elements, like `

    `. CKEditor uses `
    ` as a block filler during the editing,\n * as browsers do natively. So instead of an empty `

    ` there will be `


    `. The advantage of block filler is that\n * it is transparent for the selection, so when the caret is before the `
    ` and user presses right arrow he will be\n * moved to the next paragraph, not after the `
    `. The disadvantage is that it breaks a block, so it can not be used\n * in the middle of a line of text. The {@link module:engine/view/filler~BR_FILLER `
    ` filler} can be replaced with any other\n * character in the data output, for instance {@link module:engine/view/filler~NBSP_FILLER non-breaking space} or\n * {@link module:engine/view/filler~MARKED_NBSP_FILLER marked non-breaking space}.\n *\n * * Inline filler is a filler which does not break a line of text, so it can be used inside the text, for instance in the empty\n * `` surrendered by text: `foobar`, if we want to put the caret there. CKEditor uses a sequence of the zero-width\n * spaces as an {@link module:engine/view/filler~INLINE_FILLER inline filler} having the predetermined\n * {@link module:engine/view/filler~INLINE_FILLER_LENGTH length}. A sequence is used, instead of a single character to\n * avoid treating random zero-width spaces as the inline filler. Disadvantage of the inline filler is that it is not\n * transparent for the selection. The arrow key moves the caret between zero-width spaces characters, so the additional\n * code is needed to handle the caret.\n *\n * Both inline and block fillers are handled by the {@link module:engine/view/renderer~Renderer renderer} and are not present in the\n * view.\n *\n * @module engine/view/filler\n */\n\n/**\n * Non-breaking space filler creator. This function creates the ` ` text node.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\n * @see module:engine/view/filler~BR_FILLER\n * @function\n */\nexport const NBSP_FILLER = domDocument => domDocument.createTextNode( '\\u00A0' );\n\n/**\n * Marked non-breaking space filler creator. This function creates the ` ` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @see module:engine/view/filler~BR_FILLER\n * @function\n */\nexport const MARKED_NBSP_FILLER = domDocument => {\n\tconst span = domDocument.createElement( 'span' );\n\tspan.dataset.ckeFiller = true;\n\tspan.innerText = '\\u00A0';\n\n\treturn span;\n};\n\n/**\n * `
    ` filler creator. This function creates the `
    ` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\n * @function\n */\nexport const BR_FILLER = domDocument => {\n\tconst fillerBr = domDocument.createElement( 'br' );\n\tfillerBr.dataset.ckeFiller = true;\n\n\treturn fillerBr;\n};\n\n/**\n * Length of the {@link module:engine/view/filler~INLINE_FILLER INLINE_FILLER}.\n */\nexport const INLINE_FILLER_LENGTH = 7;\n\n/**\n * Inline filler which is a sequence of the word joiners.\n *\n * @type {String}\n */\nexport const INLINE_FILLER = '\\u2060'.repeat( INLINE_FILLER_LENGTH );\n\n/**\n * Checks if the node is a text node which starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n *\t\tstartsWithFiller( document.createTextNode( INLINE_FILLER ) ); // true\n *\t\tstartsWithFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // true\n *\t\tstartsWithFiller( document.createTextNode( 'foo' ) ); // false\n *\t\tstartsWithFiller( document.createElement( 'p' ) ); // false\n *\n * @param {Node} domNode DOM node.\n * @returns {Boolean} True if the text node starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function startsWithFiller( domNode ) {\n\treturn isText( domNode ) && ( domNode.data.substr( 0, INLINE_FILLER_LENGTH ) === INLINE_FILLER );\n}\n\n/**\n * Checks if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n *\t\tisInlineFiller( document.createTextNode( INLINE_FILLER ) ); // true\n *\t\tisInlineFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // false\n *\n * @param {Text} domText DOM text node.\n * @returns {Boolean} True if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function isInlineFiller( domText ) {\n\treturn domText.data.length == INLINE_FILLER_LENGTH && startsWithFiller( domText );\n}\n\n/**\n * Get string data from the text node, removing an {@link module:engine/view/filler~INLINE_FILLER inline filler} from it,\n * if text node contains it.\n *\n *\t\tgetDataWithoutFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ) == 'foo' // true\n *\t\tgetDataWithoutFiller( document.createTextNode( 'foo' ) ) == 'foo' // true\n *\n * @param {Text} domText DOM text node, possible with inline filler.\n * @returns {String} Data without filler.\n */\nexport function getDataWithoutFiller( domText ) {\n\tif ( startsWithFiller( domText ) ) {\n\t\treturn domText.data.slice( INLINE_FILLER_LENGTH );\n\t} else {\n\t\treturn domText.data;\n\t}\n}\n\n/**\n * Assign key observer which move cursor from the end of the inline filler to the beginning of it when\n * the left arrow is pressed, so the filler does not break navigation.\n *\n * @param {module:engine/view/view~View} view View controller instance we should inject quirks handling on.\n */\nexport function injectQuirksHandling( view ) {\n\tview.document.on( 'arrowKey', jumpOverInlineFiller, { priority: 'low' } );\n}\n\n// Move cursor from the end of the inline filler to the beginning of it when, so the filler does not break navigation.\nfunction jumpOverInlineFiller( evt, data ) {\n\tif ( data.keyCode == keyCodes.arrowleft ) {\n\t\tconst domSelection = data.domTarget.ownerDocument.defaultView.getSelection();\n\n\t\tif ( domSelection.rangeCount == 1 && domSelection.getRangeAt( 0 ).collapsed ) {\n\t\t\tconst domParent = domSelection.getRangeAt( 0 ).startContainer;\n\t\t\tconst domOffset = domSelection.getRangeAt( 0 ).startOffset;\n\n\t\t\tif ( startsWithFiller( domParent ) && domOffset <= INLINE_FILLER_LENGTH ) {\n\t\t\t\tdomSelection.collapse( domParent, 0 );\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * Finds positions of the first and last change in the given string/array and generates a set of changes:\n *\n *\t\tfastDiff( '12a', '12xyza' );\n *\t\t// [ { index: 2, type: 'insert', values: [ 'x', 'y', 'z' ] } ]\n *\n *\t\tfastDiff( '12a', '12aa' );\n *\t\t// [ { index: 3, type: 'insert', values: [ 'a' ] } ]\n *\n *\t\tfastDiff( '12xyza', '12a' );\n *\t\t// [ { index: 2, type: 'delete', howMany: 3 } ]\n *\n *\t\tfastDiff( [ '1', '2', 'a', 'a' ], [ '1', '2', 'a' ] );\n *\t\t// [ { index: 3, type: 'delete', howMany: 1 } ]\n *\n *\t\tfastDiff( [ '1', '2', 'a', 'b', 'c', '3' ], [ '2', 'a', 'b' ] );\n *\t\t// [ { index: 0, type: 'insert', values: [ '2', 'a', 'b' ] }, { index: 3, type: 'delete', howMany: 6 } ]\n *\n * Passed arrays can contain any type of data, however to compare them correctly custom comparator function\n * should be passed as a third parameter:\n *\n *\t\tfastDiff( [ { value: 1 }, { value: 2 } ], [ { value: 1 }, { value: 3 } ], ( a, b ) => {\n *\t\t\treturn a.value === b.value;\n *\t\t} );\n *\t\t// [ { index: 1, type: 'insert', values: [ { value: 3 } ] }, { index: 2, type: 'delete', howMany: 1 } ]\n *\n * The resulted set of changes can be applied to the input in order to transform it into the output, for example:\n *\n *\t\tlet input = '12abc3';\n *\t\tconst output = '2ab';\n *\t\tconst changes = fastDiff( input, output );\n *\n *\t\tchanges.forEach( change => {\n *\t\t\tif ( change.type == 'insert' ) {\n *\t\t\t\tinput = input.substring( 0, change.index ) + change.values.join( '' ) + input.substring( change.index );\n *\t\t\t} else if ( change.type == 'delete' ) {\n *\t\t\t\tinput = input.substring( 0, change.index ) + input.substring( change.index + change.howMany );\n *\t\t\t}\n *\t\t} );\n *\n *\t\t// input equals output now\n *\n * or in case of arrays:\n *\n *\t\tlet input = [ '1', '2', 'a', 'b', 'c', '3' ];\n *\t\tconst output = [ '2', 'a', 'b' ];\n *\t\tconst changes = fastDiff( input, output );\n *\n *\t\tchanges.forEach( change => {\n *\t\t\tif ( change.type == 'insert' ) {\n *\t\t\t\tinput = input.slice( 0, change.index ).concat( change.values, input.slice( change.index ) );\n *\t\t\t} else if ( change.type == 'delete' ) {\n *\t\t\t\tinput = input.slice( 0, change.index ).concat( input.slice( change.index + change.howMany ) );\n *\t\t\t}\n *\t\t} );\n *\n *\t\t// input equals output now\n *\n * By passing `true` as the fourth parameter (`atomicChanges`) the output of this function will become compatible with\n * the {@link module:utils/diff~diff `diff()`} function:\n *\n *\t\tfastDiff( '12a', '12xyza' );\n *\t\t// [ 'equal', 'equal', 'insert', 'insert', 'insert', 'equal' ]\n *\n * The default output format of this function is compatible with the output format of\n * {@link module:utils/difftochanges~diffToChanges `diffToChanges()`}. The `diffToChanges()` input format is, in turn,\n * compatible with the output of {@link module:utils/diff~diff `diff()`}:\n *\n *\t\tconst a = '1234';\n *\t\tconst b = '12xyz34';\n *\n *\t\t// Both calls will return the same results (grouped changes format).\n *\t\tfastDiff( a, b );\n *\t\tdiffToChanges( diff( a, b ) );\n *\n *\t\t// Again, both calls will return the same results (atomic changes format).\n *\t\tfastDiff( a, b, null, true );\n *\t\tdiff( a, b );\n *\n *\n * @param {Array|String} a Input array or string.\n * @param {Array|String} b Input array or string.\n * @param {Function} [cmp] Optional function used to compare array values, by default `===` (strict equal operator) is used.\n * @param {Boolean} [atomicChanges=false] Whether an array of `inset|delete|equal` operations should\n * be returned instead of changes set. This makes this function compatible with {@link module:utils/diff~diff `diff()`}.\n * @returns {Array} Array of changes.\n */\nexport default function fastDiff(a, b, cmp, atomicChanges = false) {\n // Set the comparator function.\n cmp = cmp || function (a, b) {\n return a === b;\n };\n // Convert the string (or any array-like object - eg. NodeList) to an array by using the slice() method because,\n // unlike Array.from(), it returns array of UTF-16 code units instead of the code points of a string.\n // One code point might be a surrogate pair of two code units. All text offsets are expected to be in code units.\n // See ckeditor/ckeditor5#3147.\n //\n // We need to make sure here that fastDiff() works identical to diff().\n const arrayA = Array.isArray(a) ? a : Array.prototype.slice.call(a);\n const arrayB = Array.isArray(b) ? b : Array.prototype.slice.call(b);\n // Find first and last change.\n const changeIndexes = findChangeBoundaryIndexes(arrayA, arrayB, cmp);\n // Transform into changes array.\n return atomicChanges ? changeIndexesToAtomicChanges(changeIndexes, arrayB.length) : changeIndexesToChanges(arrayB, changeIndexes);\n}\n// Finds position of the first and last change in the given arrays. For example:\n//\n//\t\tconst indexes = findChangeBoundaryIndexes( [ '1', '2', '3', '4' ], [ '1', '3', '4', '2', '4' ] );\n//\t\tconsole.log( indexes ); // { firstIndex: 1, lastIndexOld: 3, lastIndexNew: 4 }\n//\n// The above indexes means that in the first array the modified part is `1[23]4` and in the second array it is `1[342]4`.\n// Based on such indexes, array with `insert`/`delete` operations which allows transforming first value into the second one\n// can be generated.\n//\n// @param {Array} arr1\n// @param {Array} arr2\n// @param {Function} cmp Comparator function.\n// @returns {Object}\n// @returns {Number} return.firstIndex Index of the first change in both values (always the same for both).\n// @returns {Number} result.lastIndexOld Index of the last common value in `arr1`.\n// @returns {Number} result.lastIndexNew Index of the last common value in `arr2`.\nfunction findChangeBoundaryIndexes(arr1, arr2, cmp) {\n // Find the first difference between passed values.\n const firstIndex = findFirstDifferenceIndex(arr1, arr2, cmp);\n // If arrays are equal return -1 indexes object.\n if (firstIndex === -1) {\n return { firstIndex: -1, lastIndexOld: -1, lastIndexNew: -1 };\n }\n // Remove the common part of each value and reverse them to make it simpler to find the last difference between them.\n const oldArrayReversed = cutAndReverse(arr1, firstIndex);\n const newArrayReversed = cutAndReverse(arr2, firstIndex);\n // Find the first difference between reversed values.\n // It should be treated as \"how many elements from the end the last difference occurred\".\n //\n // For example:\n //\n // \t\t\t\tinitial\t->\tafter cut\t-> reversed:\n // oldValue:\t'321ba'\t->\t'21ba'\t\t-> 'ab12'\n // newValue:\t'31xba'\t->\t'1xba'\t\t-> 'abx1'\n // lastIndex:\t\t\t\t\t\t\t-> 2\n //\n // So the last change occurred two characters from the end of the arrays.\n const lastIndex = findFirstDifferenceIndex(oldArrayReversed, newArrayReversed, cmp);\n // Use `lastIndex` to calculate proper offset, starting from the beginning (`lastIndex` kind of starts from the end).\n const lastIndexOld = arr1.length - lastIndex;\n const lastIndexNew = arr2.length - lastIndex;\n return { firstIndex, lastIndexOld, lastIndexNew };\n}\n// Returns a first index on which given arrays differ. If both arrays are the same, -1 is returned.\n//\n// @param {Array} arr1\n// @param {Array} arr2\n// @param {Function} cmp Comparator function.\n// @returns {Number}\nfunction findFirstDifferenceIndex(arr1, arr2, cmp) {\n for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {\n if (arr1[i] === undefined || arr2[i] === undefined || !cmp(arr1[i], arr2[i])) {\n return i;\n }\n }\n return -1; // Return -1 if arrays are equal.\n}\n// Returns a copy of the given array with `howMany` elements removed starting from the beginning and in reversed order.\n//\n// @param {Array} arr Array to be processed.\n// @param {Number} howMany How many elements from array beginning to remove.\n// @returns {Array} Shortened and reversed array.\nfunction cutAndReverse(arr, howMany) {\n return arr.slice(howMany).reverse();\n}\n// Generates changes array based on change indexes from `findChangeBoundaryIndexes` function. This function will\n// generate array with 0 (no changes), 1 (deletion or insertion) or 2 records (insertion and deletion).\n//\n// @param {Array} newArray New array for which change indexes were calculated.\n// @param {Object} changeIndexes Change indexes object from `findChangeBoundaryIndexes` function.\n// @returns {Array.} Array of changes compatible with\n// {@link module:utils/difftochanges~diffToChanges} format.\nfunction changeIndexesToChanges(newArray, changeIndexes) {\n const result = [];\n const { firstIndex, lastIndexOld, lastIndexNew } = changeIndexes;\n // Order operations as 'insert', 'delete' array to keep compatibility with {@link module:utils/difftochanges~diffToChanges}\n // in most cases. However, 'diffToChanges' does not stick to any order so in some cases\n // (for example replacing '12345' with 'abcd') it will generate 'delete', 'insert' order.\n if (lastIndexNew - firstIndex > 0) {\n result.push({\n index: firstIndex,\n type: 'insert',\n values: newArray.slice(firstIndex, lastIndexNew)\n });\n }\n if (lastIndexOld - firstIndex > 0) {\n result.push({\n index: firstIndex + (lastIndexNew - firstIndex),\n type: 'delete',\n howMany: lastIndexOld - firstIndex\n });\n }\n return result;\n}\n// Generates array with set `equal|insert|delete` operations based on change indexes from `findChangeBoundaryIndexes` function.\n//\n// @param {Object} changeIndexes Change indexes object from `findChangeBoundaryIndexes` function.\n// @param {Number} newLength Length of the new array on which `findChangeBoundaryIndexes` calculated change indexes.\n// @returns {Array.} Array of changes compatible with {@link module:utils/diff~diff} format.\nfunction changeIndexesToAtomicChanges(changeIndexes, newLength) {\n const { firstIndex, lastIndexOld, lastIndexNew } = changeIndexes;\n // No changes.\n if (firstIndex === -1) {\n return Array(newLength).fill('equal');\n }\n let result = [];\n if (firstIndex > 0) {\n result = result.concat(Array(firstIndex).fill('equal'));\n }\n if (lastIndexNew - firstIndex > 0) {\n result = result.concat(Array(lastIndexNew - firstIndex).fill('insert'));\n }\n if (lastIndexOld - firstIndex > 0) {\n result = result.concat(Array(lastIndexOld - firstIndex).fill('delete'));\n }\n if (lastIndexNew < newLength) {\n result = result.concat(Array(newLength - lastIndexNew).fill('equal'));\n }\n return result;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module utils/diff\n */\nimport fastDiff from './fastdiff';\n// The following code is based on the \"O(NP) Sequence Comparison Algorithm\"\n// by Sun Wu, Udi Manber, Gene Myers, Webb Miller.\n/**\n * Calculates the difference between two arrays or strings producing an array containing a list of changes\n * necessary to transform input into output.\n *\n *\t\tdiff( 'aba', 'acca' ); // [ 'equal', 'insert', 'insert', 'delete', 'equal' ]\n *\n * This function is based on the \"O(NP) Sequence Comparison Algorithm\" by Sun Wu, Udi Manber, Gene Myers, Webb Miller.\n * Unfortunately, while it gives the most precise results, its to complex for longer strings/arrow (above 200 items).\n * Therefore, `diff()` automatically switches to {@link module:utils/fastdiff~fastDiff `fastDiff()`} when detecting\n * such a scenario. The return formats of both functions are identical.\n *\n * @param {Array|String} a Input array or string.\n * @param {Array|String} b Output array or string.\n * @param {Function} [cmp] Optional function used to compare array values, by default === is used.\n * @returns {Array.} Array of changes.\n */\nexport default function diff(a, b, cmp) {\n // Set the comparator function.\n cmp = cmp || function (a, b) {\n return a === b;\n };\n const aLength = a.length;\n const bLength = b.length;\n // Perform `fastDiff` for longer strings/arrays (see #269).\n if (aLength > 200 || bLength > 200 || aLength + bLength > 300) {\n return diff.fastDiff(a, b, cmp, true);\n }\n // Temporary action type statics.\n let _insert, _delete;\n // Swapped the arrays to use the shorter one as the first one.\n if (bLength < aLength) {\n const tmp = a;\n a = b;\n b = tmp;\n // We swap the action types as well.\n _insert = 'delete';\n _delete = 'insert';\n }\n else {\n _insert = 'insert';\n _delete = 'delete';\n }\n const m = a.length;\n const n = b.length;\n const delta = n - m;\n // Edit scripts, for each diagonal.\n const es = {};\n // Furthest points, the furthest y we can get on each diagonal.\n const fp = {};\n function snake(k) {\n // We use -1 as an alternative below to handle initial values ( instead of filling the fp with -1 first ).\n // Furthest points (y) on the diagonal below k.\n const y1 = (fp[k - 1] !== undefined ? fp[k - 1] : -1) + 1;\n // Furthest points (y) on the diagonal above k.\n const y2 = fp[k + 1] !== undefined ? fp[k + 1] : -1;\n // The way we should go to get further.\n const dir = y1 > y2 ? -1 : 1;\n // Clone previous changes array (if any).\n if (es[k + dir]) {\n es[k] = es[k + dir].slice(0);\n }\n // Create changes array.\n if (!es[k]) {\n es[k] = [];\n }\n // Push the action.\n es[k].push(y1 > y2 ? _insert : _delete);\n // Set the beginning coordinates.\n let y = Math.max(y1, y2);\n let x = y - k;\n // Traverse the diagonal as long as the values match.\n while (x < m && y < n && cmp(a[x], b[y])) {\n x++;\n y++;\n // Push no change action.\n es[k].push('equal');\n }\n return y;\n }\n let p = 0;\n let k;\n // Traverse the graph until we reach the end of the longer string.\n do {\n // Updates furthest points and edit scripts for diagonals below delta.\n for (k = -p; k < delta; k++) {\n fp[k] = snake(k);\n }\n // Updates furthest points and edit scripts for diagonals above delta.\n for (k = delta + p; k > delta; k--) {\n fp[k] = snake(k);\n }\n // Updates furthest point and edit script for the delta diagonal.\n // note that the delta diagonal is the one which goes through the sink (m, n).\n fp[delta] = snake(delta);\n p++;\n } while (fp[delta] !== n);\n // Return the final list of edit changes.\n // We remove the first item that represents the action for the injected nulls.\n return es[delta].slice(1);\n}\n// Store the API in static property to easily overwrite it in tests.\n// Too bad dependency injection does not work in Webpack + ES 6 (const) + Babel.\ndiff.fastDiff = fastDiff;\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module utils/dom/insertat\n */\n/**\n * Inserts node to the parent at given index.\n *\n * @param {Element} parentElement Parent element.\n * @param {Number} index Insertions index.\n * @param {Node} nodeToInsert Node to insert.\n */\nexport default function insertAt(parentElement, index, nodeToInsert) {\n parentElement.insertBefore(nodeToInsert, parentElement.childNodes[index] || null);\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module utils/dom/remove\n */\n/**\n * Removes given node from parent.\n *\n * @param {Node} node Node to remove.\n */\nexport default function remove(node) {\n const parent = node.parentNode;\n if (parent) {\n parent.removeChild(node);\n }\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/* globals Node */\n/**\n * @module utils/dom/iscomment\n */\n/**\n * Checks whether the object is a native DOM Comment node.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isComment(obj) {\n return obj && obj.nodeType === Node.COMMENT_NODE;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module utils/dom/isnode\n */\n/**\n * Checks if the object is a native DOM Node.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isNode(obj) {\n if (obj) {\n if (obj.defaultView) {\n return obj instanceof obj.defaultView.Document;\n }\n else if (obj.ownerDocument && obj.ownerDocument.defaultView) {\n return obj instanceof obj.ownerDocument.defaultView.Node;\n }\n }\n return false;\n}\n","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/singletonStyleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithAttributesAndNonce.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n \n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./renderer.css\";\n \n \n\nvar options = {\"attributes\":{\"data-cke\":true}};\n\n;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./renderer.css\";\n export default content && content.locals ? content.locals : undefined;\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* globals Node */\n\n/**\n * @module engine/view/renderer\n */\n\nimport ViewText from './text';\nimport ViewPosition from './position';\nimport { INLINE_FILLER, INLINE_FILLER_LENGTH, startsWithFiller, isInlineFiller } from './filler';\n\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\nimport diff from '@ckeditor/ckeditor5-utils/src/diff';\nimport insertAt from '@ckeditor/ckeditor5-utils/src/dom/insertat';\nimport remove from '@ckeditor/ckeditor5-utils/src/dom/remove';\nimport ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport isText from '@ckeditor/ckeditor5-utils/src/dom/istext';\nimport isComment from '@ckeditor/ckeditor5-utils/src/dom/iscomment';\nimport isNode from '@ckeditor/ckeditor5-utils/src/dom/isnode';\nimport fastDiff from '@ckeditor/ckeditor5-utils/src/fastdiff';\nimport env from '@ckeditor/ckeditor5-utils/src/env';\n\nimport '../../theme/renderer.css';\n\n/**\n * Renderer is responsible for updating the DOM structure and the DOM selection based on\n * the {@link module:engine/view/renderer~Renderer#markToSync information about updated view nodes}.\n * In other words, it renders the view to the DOM.\n *\n * Its main responsibility is to make only the necessary, minimal changes to the DOM. However, unlike in many\n * virtual DOM implementations, the primary reason for doing minimal changes is not the performance but ensuring\n * that native editing features such as text composition, autocompletion, spell checking, selection's x-index are\n * affected as little as possible.\n *\n * Renderer uses {@link module:engine/view/domconverter~DomConverter} to transform view nodes and positions\n * to and from the DOM.\n */\nexport default class Renderer {\n\t/**\n\t * Creates a renderer instance.\n\t *\n\t * @param {module:engine/view/domconverter~DomConverter} domConverter Converter instance.\n\t * @param {module:engine/view/documentselection~DocumentSelection} selection View selection.\n\t */\n\tconstructor( domConverter, selection ) {\n\t\t/**\n\t\t * Set of DOM Documents instances.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.domDocuments = new Set();\n\n\t\t/**\n\t\t * Converter instance.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/domconverter~DomConverter}\n\t\t */\n\t\tthis.domConverter = domConverter;\n\n\t\t/**\n\t\t * Set of nodes which attributes changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedAttributes = new Set();\n\n\t\t/**\n\t\t * Set of elements which child lists changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedChildren = new Set();\n\n\t\t/**\n\t\t * Set of text nodes which text data changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedTexts = new Set();\n\n\t\t/**\n\t\t * View selection. Renderer updates DOM selection based on the view selection.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/documentselection~DocumentSelection}\n\t\t */\n\t\tthis.selection = selection;\n\n\t\t/**\n\t\t * Indicates if the view document is focused and selection can be rendered. Selection will not be rendered if\n\t\t * this is set to `false`.\n\t\t *\n\t\t * @member {Boolean}\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'isFocused', false );\n\n\t\t/**\n\t\t * Indicates whether the user is making a selection in the document (e.g. holding the mouse button and moving the cursor).\n\t\t * When they stop selecting, the property goes back to `false`.\n\t\t *\n\t\t * Note: In some browsers, the renderer will stop rendering the selection and inline fillers while the user is making\n\t\t * a selection to avoid glitches in DOM selection\n\t\t * (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\t *\n\t\t * @member {Boolean}\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'isSelecting', false );\n\n\t\t// Rendering the selection and inline filler manipulation should be postponed in (non-Android) Blink until the user finishes\n\t\t// creating the selection in DOM to avoid accidental selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\t// When the user stops selecting, all pending changes should be rendered ASAP, though.\n\t\tif ( env.isBlink && !env.isAndroid ) {\n\t\t\tthis.on( 'change:isSelecting', () => {\n\t\t\t\tif ( !this.isSelecting ) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t/**\n\t\t * The text node in which the inline filler was rendered.\n\t\t *\n\t\t * @private\n\t\t * @member {Text}\n\t\t */\n\t\tthis._inlineFiller = null;\n\n\t\t/**\n\t\t * DOM element containing fake selection.\n\t\t *\n\t\t * @private\n\t\t * @type {null|HTMLElement}\n\t\t */\n\t\tthis._fakeSelectionContainer = null;\n\t}\n\n\t/**\n\t * Marks a view node to be updated in the DOM by {@link #render `render()`}.\n\t *\n\t * Note that only view nodes whose parents have corresponding DOM elements need to be marked to be synchronized.\n\t *\n\t * @see #markedAttributes\n\t * @see #markedChildren\n\t * @see #markedTexts\n\t *\n\t * @param {module:engine/view/document~ChangeType} type Type of the change.\n\t * @param {module:engine/view/node~Node} node Node to be marked.\n\t */\n\tmarkToSync( type, node ) {\n\t\tif ( type === 'text' ) {\n\t\t\tif ( this.domConverter.mapViewToDom( node.parent ) ) {\n\t\t\t\tthis.markedTexts.add( node );\n\t\t\t}\n\t\t} else {\n\t\t\t// If the node has no DOM element it is not rendered yet,\n\t\t\t// its children/attributes do not need to be marked to be sync.\n\t\t\tif ( !this.domConverter.mapViewToDom( node ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( type === 'attributes' ) {\n\t\t\t\tthis.markedAttributes.add( node );\n\t\t\t} else if ( type === 'children' ) {\n\t\t\t\tthis.markedChildren.add( node );\n\t\t\t} else {\n\t\t\t\t/**\n\t\t\t\t * Unknown type passed to Renderer.markToSync.\n\t\t\t\t *\n\t\t\t\t * @error view-renderer-unknown-type\n\t\t\t\t */\n\t\t\t\tthrow new CKEditorError( 'view-renderer-unknown-type', this );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Renders all buffered changes ({@link #markedAttributes}, {@link #markedChildren} and {@link #markedTexts}) and\n\t * the current view selection (if needed) to the DOM by applying a minimal set of changes to it.\n\t *\n\t * Renderer tries not to break the text composition (e.g. IME) and x-index of the selection,\n\t * so it does as little as it is needed to update the DOM.\n\t *\n\t * Renderer also handles {@link module:engine/view/filler fillers}. Especially, it checks if the inline filler is needed\n\t * at the selection position and adds or removes it. To prevent breaking text composition inline filler will not be\n\t * removed as long as the selection is in the text node which needed it at first.\n\t */\n\trender() {\n\t\tlet inlineFillerPosition;\n\t\tconst isInlineFillerRenderingPossible = env.isBlink && !env.isAndroid ? !this.isSelecting : true;\n\n\t\t// Refresh mappings.\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildrenMappings( element );\n\t\t}\n\n\t\t// Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\n\t\t// DOM selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\tif ( isInlineFillerRenderingPossible ) {\n\t\t\t// There was inline filler rendered in the DOM but it's not\n\t\t\t// at the selection position any more, so we can remove it\n\t\t\t// (cause even if it's needed, it must be placed in another location).\n\t\t\tif ( this._inlineFiller && !this._isSelectionInInlineFiller() ) {\n\t\t\t\tthis._removeInlineFiller();\n\t\t\t}\n\n\t\t\t// If we've got the filler, let's try to guess its position in the view.\n\t\t\tif ( this._inlineFiller ) {\n\t\t\t\tinlineFillerPosition = this._getInlineFillerPosition();\n\t\t\t}\n\t\t\t// Otherwise, if it's needed, create it at the selection position.\n\t\t\telse if ( this._needsInlineFillerAtSelection() ) {\n\t\t\t\tinlineFillerPosition = this.selection.getFirstPosition();\n\n\t\t\t\t// Do not use `markToSync` so it will be added even if the parent is already added.\n\t\t\t\tthis.markedChildren.add( inlineFillerPosition.parent );\n\t\t\t}\n\t\t}\n\t\t// Make sure the inline filler has any parent, so it can be mapped to view position by DomConverter.\n\t\telse if ( this._inlineFiller && this._inlineFiller.parentNode ) {\n\t\t\t// While the user is making selection, preserve the inline filler at its original position.\n\t\t\tinlineFillerPosition = this.domConverter.domPositionToView( this._inlineFiller );\n\n\t\t\t// While down-casting the document selection attributes, all existing empty\n\t\t\t// attribute elements (for selection position) are removed from the view and DOM,\n\t\t\t// so make sure that we were able to map filler position.\n\t\t\t// https://github.com/ckeditor/ckeditor5/issues/12026\n\t\t\tif ( inlineFillerPosition && inlineFillerPosition.parent.is( '$text' ) ) {\n\t\t\t\t// The inline filler position is expected to be before the text node.\n\t\t\t\tinlineFillerPosition = ViewPosition._createBefore( inlineFillerPosition.parent );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const element of this.markedAttributes ) {\n\t\t\tthis._updateAttrs( element );\n\t\t}\n\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildren( element, { inlineFillerPosition } );\n\t\t}\n\n\t\tfor ( const node of this.markedTexts ) {\n\t\t\tif ( !this.markedChildren.has( node.parent ) && this.domConverter.mapViewToDom( node.parent ) ) {\n\t\t\t\tthis._updateText( node, { inlineFillerPosition } );\n\t\t\t}\n\t\t}\n\n\t\t// * Check whether the inline filler is required and where it really is in the DOM.\n\t\t// At this point in most cases it will be in the DOM, but there are exceptions.\n\t\t// For example, if the inline filler was deep in the created DOM structure, it will not be created.\n\t\t// Similarly, if it was removed at the beginning of this function and then neither text nor children were updated,\n\t\t// it will not be present. Fix those and similar scenarios.\n\t\t// * Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\n\t\t// DOM selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\tif ( isInlineFillerRenderingPossible ) {\n\t\t\tif ( inlineFillerPosition ) {\n\t\t\t\tconst fillerDomPosition = this.domConverter.viewPositionToDom( inlineFillerPosition );\n\t\t\t\tconst domDocument = fillerDomPosition.parent.ownerDocument;\n\n\t\t\t\tif ( !startsWithFiller( fillerDomPosition.parent ) ) {\n\t\t\t\t\t// Filler has not been created at filler position. Create it now.\n\t\t\t\t\tthis._inlineFiller = addInlineFiller( domDocument, fillerDomPosition.parent, fillerDomPosition.offset );\n\t\t\t\t} else {\n\t\t\t\t\t// Filler has been found, save it.\n\t\t\t\t\tthis._inlineFiller = fillerDomPosition.parent;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// There is no filler needed.\n\t\t\t\tthis._inlineFiller = null;\n\t\t\t}\n\t\t}\n\n\t\t// First focus the new editing host, then update the selection.\n\t\t// Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721).\n\t\tthis._updateFocus();\n\t\tthis._updateSelection();\n\n\t\tthis.markedTexts.clear();\n\t\tthis.markedAttributes.clear();\n\t\tthis.markedChildren.clear();\n\t}\n\n\t/**\n\t * Updates mappings of view element's children.\n\t *\n\t * Children that were replaced in the view structure by similar elements (same tag name) are treated as 'replaced'.\n\t * This means that their mappings can be updated so the new view elements are mapped to the existing DOM elements.\n\t * Thanks to that these elements do not need to be re-rendered completely.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~Node} viewElement The view element whose children mappings will be updated.\n\t */\n\t_updateChildrenMappings( viewElement ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM and there is no need to process it.\n\t\t\treturn;\n\t\t}\n\n\t\t// Removing nodes from the DOM as we iterate can cause `actualDomChildren`\n\t\t// (which is a live-updating `NodeList`) to get out of sync with the\n\t\t// indices that we compute as we iterate over `actions`.\n\t\t// This would produce incorrect element mappings.\n\t\t//\n\t\t// Converting live list to an array to make the list static.\n\t\tconst actualDomChildren = Array.from(\n\t\t\tthis.domConverter.mapViewToDom( viewElement ).childNodes\n\t\t);\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, { withChildren: false } )\n\t\t);\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\t\tconst actions = this._findReplaceActions( diff, actualDomChildren, expectedDomChildren );\n\n\t\tif ( actions.indexOf( 'replace' ) !== -1 ) {\n\t\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\t\tfor ( const action of actions ) {\n\t\t\t\tif ( action === 'replace' ) {\n\t\t\t\t\tconst insertIndex = counter.equal + counter.insert;\n\t\t\t\t\tconst deleteIndex = counter.equal + counter.delete;\n\t\t\t\t\tconst viewChild = viewElement.getChild( insertIndex );\n\n\t\t\t\t\t// UIElement and RawElement are special cases. Their children are not stored in a view (#799)\n\t\t\t\t\t// so we cannot use them with replacing flow (since they use view children during rendering\n\t\t\t\t\t// which will always result in rendering empty elements).\n\t\t\t\t\tif ( viewChild && !( viewChild.is( 'uiElement' ) || viewChild.is( 'rawElement' ) ) ) {\n\t\t\t\t\t\tthis._updateElementMappings( viewChild, actualDomChildren[ deleteIndex ] );\n\t\t\t\t\t}\n\n\t\t\t\t\tremove( expectedDomChildren[ insertIndex ] );\n\t\t\t\t\tcounter.equal++;\n\t\t\t\t} else {\n\t\t\t\t\tcounter[ action ]++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates mappings of a given view element.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~Node} viewElement The view element whose mappings will be updated.\n\t * @param {Node} domElement The DOM element representing the given view element.\n\t */\n\t_updateElementMappings( viewElement, domElement ) {\n\t\t// Remap 'DomConverter' bindings.\n\t\tthis.domConverter.unbindDomElement( domElement );\n\t\tthis.domConverter.bindElements( domElement, viewElement );\n\n\t\t// View element may have children which needs to be updated, but are not marked, mark them to update.\n\t\tthis.markedChildren.add( viewElement );\n\n\t\t// Because we replace new view element mapping with the existing one, the corresponding DOM element\n\t\t// will not be rerendered. The new view element may have different attributes than the previous one.\n\t\t// Since its corresponding DOM element will not be rerendered, new attributes will not be added\n\t\t// to the DOM, so we need to mark it here to make sure its attributes gets updated. See #1427 for more\n\t\t// detailed case study.\n\t\t// Also there are cases where replaced element is removed from the view structure and then has\n\t\t// its attributes changed or removed. In such cases the element will not be present in `markedAttributes`\n\t\t// and also may be the same (`element.isSimilar()`) as the reused element not having its attributes updated.\n\t\t// To prevent such situations we always mark reused element to have its attributes rerenderd (#1560).\n\t\tthis.markedAttributes.add( viewElement );\n\t}\n\n\t/**\n\t * Gets the position of the inline filler based on the current selection.\n\t * Here, we assume that we know that the filler is needed and\n\t * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it is needed,\n\t * it is somewhere at the selection position.\n\t *\n\t * Note: The filler position cannot be restored based on the filler's DOM text node, because\n\t * when this method is called (before rendering), the bindings will often be broken. View-to-DOM\n\t * bindings are only dependable after rendering.\n\t *\n\t * @private\n\t * @returns {module:engine/view/position~Position}\n\t */\n\t_getInlineFillerPosition() {\n\t\tconst firstPos = this.selection.getFirstPosition();\n\n\t\tif ( firstPos.parent.is( '$text' ) ) {\n\t\t\treturn ViewPosition._createBefore( this.selection.getFirstPosition().parent );\n\t\t} else {\n\t\t\treturn firstPos;\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if the selection has not left the inline filler's text node.\n\t * If it is `true`, it means that the filler had been added for a reason and the selection did not\n\t * leave the filler's text node. For example, the user can be in the middle of a composition so it should not be touched.\n\t *\n\t * @private\n\t * @returns {Boolean} `true` if the inline filler and selection are in the same place.\n\t */\n\t_isSelectionInInlineFiller() {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Note, we can't check if selection's position equals position of the\n\t\t// this._inlineFiller node, because of #663. We may not be able to calculate\n\t\t// the filler's position in the view at this stage.\n\t\t// Instead, we check it the other way – whether selection is anchored in\n\t\t// that text node or next to it.\n\n\t\t// Possible options are:\n\t\t// \"FILLER{}\"\n\t\t// \"FILLERadded-text{}\"\n\t\tconst selectionPosition = this.selection.getFirstPosition();\n\t\tconst position = this.domConverter.viewPositionToDom( selectionPosition );\n\n\t\tif ( position && isText( position.parent ) && startsWithFiller( position.parent ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Removes the inline filler.\n\t *\n\t * @private\n\t */\n\t_removeInlineFiller() {\n\t\tconst domFillerNode = this._inlineFiller;\n\n\t\t// Something weird happened and the stored node doesn't contain the filler's text.\n\t\tif ( !startsWithFiller( domFillerNode ) ) {\n\t\t\t/**\n\t\t\t * The inline filler node was lost. Most likely, something overwrote the filler text node\n\t\t\t * in the DOM.\n\t\t\t *\n\t\t\t * @error view-renderer-filler-was-lost\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-renderer-filler-was-lost', this );\n\t\t}\n\n\t\tif ( isInlineFiller( domFillerNode ) ) {\n\t\t\tdomFillerNode.remove();\n\t\t} else {\n\t\t\tdomFillerNode.data = domFillerNode.data.substr( INLINE_FILLER_LENGTH );\n\t\t}\n\n\t\tthis._inlineFiller = null;\n\t}\n\n\t/**\n\t * Checks if the inline {@link module:engine/view/filler filler} should be added.\n\t *\n\t * @private\n\t * @returns {Boolean} `true` if the inline filler should be added.\n\t */\n\t_needsInlineFillerAtSelection() {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst selectionPosition = this.selection.getFirstPosition();\n\t\tconst selectionParent = selectionPosition.parent;\n\t\tconst selectionOffset = selectionPosition.offset;\n\n\t\t// If there is no DOM root we do not care about fillers.\n\t\tif ( !this.domConverter.mapViewToDom( selectionParent.root ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !( selectionParent.is( 'element' ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Prevent adding inline filler inside elements with contenteditable=false.\n\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/1170\n\t\tif ( !isEditable( selectionParent ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We have block filler, we do not need inline one.\n\t\tif ( selectionOffset === selectionParent.getFillerOffset() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst nodeBefore = selectionPosition.nodeBefore;\n\t\tconst nodeAfter = selectionPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof ViewText || nodeAfter instanceof ViewText ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks if text needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/text~Text} viewText View text to update.\n\t * @param {Object} options\n\t * @param {module:engine/view/position~Position} options.inlineFillerPosition The position where the inline\n\t * filler should be rendered.\n\t */\n\t_updateText( viewText, options ) {\n\t\tconst domText = this.domConverter.findCorrespondingDomText( viewText );\n\t\tconst newDomText = this.domConverter.viewToDom( viewText );\n\n\t\tconst actualText = domText.data;\n\t\tlet expectedText = newDomText.data;\n\n\t\tconst filler = options.inlineFillerPosition;\n\n\t\tif ( filler && filler.parent == viewText.parent && filler.offset == viewText.index ) {\n\t\t\texpectedText = INLINE_FILLER + expectedText;\n\t\t}\n\n\t\tif ( actualText != expectedText ) {\n\t\t\tconst actions = fastDiff( actualText, expectedText );\n\n\t\t\tfor ( const action of actions ) {\n\t\t\t\tif ( action.type === 'insert' ) {\n\t\t\t\t\tdomText.insertData( action.index, action.values.join( '' ) );\n\t\t\t\t} else { // 'delete'\n\t\t\t\t\tdomText.deleteData( action.index, action.howMany );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if attribute list needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} viewElement The view element to update.\n\t */\n\t_updateAttrs( viewElement ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that 'viewElement' is outdated as its mapping was updated\n\t\t\t// in 'this._updateChildrenMappings()'. There is no need to process it as new view element which\n\t\t\t// replaced old 'viewElement' mapping was also added to 'this.markedAttributes'\n\t\t\t// in 'this._updateChildrenMappings()' so it will be processed separately.\n\t\t\treturn;\n\t\t}\n\n\t\tconst domAttrKeys = Array.from( domElement.attributes ).map( attr => attr.name );\n\t\tconst viewAttrKeys = viewElement.getAttributeKeys();\n\n\t\t// Add or overwrite attributes.\n\t\tfor ( const key of viewAttrKeys ) {\n\t\t\tthis.domConverter.setDomElementAttribute( domElement, key, viewElement.getAttribute( key ), viewElement );\n\t\t}\n\n\t\t// Remove from DOM attributes which do not exists in the view.\n\t\tfor ( const key of domAttrKeys ) {\n\t\t\t// All other attributes not present in the DOM should be removed.\n\t\t\tif ( !viewElement.hasAttribute( key ) ) {\n\t\t\t\tthis.domConverter.removeDomElementAttribute( domElement, key );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if elements child list needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} viewElement View element to update.\n\t * @param {Object} options\n\t * @param {module:engine/view/position~Position} options.inlineFillerPosition The position where the inline\n\t * filler should be rendered.\n\t */\n\t_updateChildren( viewElement, options ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM.\n\t\t\t// There is no need to process it. It will be processed when re-inserted.\n\t\t\treturn;\n\t\t}\n\n\t\tconst inlineFillerPosition = options.inlineFillerPosition;\n\t\tconst actualDomChildren = this.domConverter.mapViewToDom( viewElement ).childNodes;\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, { bind: true } )\n\t\t);\n\n\t\t// Inline filler element has to be created as it is present in the DOM, but not in the view. It is required\n\t\t// during diffing so text nodes could be compared correctly and also during rendering to maintain\n\t\t// proper order and indexes while updating the DOM.\n\t\tif ( inlineFillerPosition && inlineFillerPosition.parent === viewElement ) {\n\t\t\taddInlineFiller( domElement.ownerDocument, expectedDomChildren, inlineFillerPosition.offset );\n\t\t}\n\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\n\t\tlet i = 0;\n\t\tconst nodesToUnbind = new Set();\n\n\t\t// Handle deletions first.\n\t\t// This is to prevent a situation where an element that already exists in `actualDomChildren` is inserted at a different\n\t\t// index in `actualDomChildren`. Since `actualDomChildren` is a `NodeList`, this works like move, not like an insert,\n\t\t// and it disrupts the whole algorithm. See https://github.com/ckeditor/ckeditor5/issues/6367.\n\t\t//\n\t\t// It doesn't matter in what order we remove or add nodes, as long as we remove and add correct nodes at correct indexes.\n\t\tfor ( const action of diff ) {\n\t\t\tif ( action === 'delete' ) {\n\t\t\t\tnodesToUnbind.add( actualDomChildren[ i ] );\n\t\t\t\tremove( actualDomChildren[ i ] );\n\t\t\t} else if ( action === 'equal' ) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\ti = 0;\n\n\t\tfor ( const action of diff ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\tinsertAt( domElement, i, expectedDomChildren[ i ] );\n\t\t\t\ti++;\n\t\t\t} else if ( action === 'equal' ) {\n\t\t\t\t// Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125).\n\t\t\t\t// Do it here (not in the loop above) because only after insertions the `i` index is correct.\n\t\t\t\tthis._markDescendantTextToSync( this.domConverter.domToView( expectedDomChildren[ i ] ) );\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\t// Unbind removed nodes. When node does not have a parent it means that it was removed from DOM tree during\n\t\t// comparison with the expected DOM. We don't need to check child nodes, because if child node was reinserted,\n\t\t// it was moved to DOM tree out of the removed node.\n\t\tfor ( const node of nodesToUnbind ) {\n\t\t\tif ( !node.parentNode ) {\n\t\t\t\tthis.domConverter.unbindDomElement( node );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shorthand for diffing two arrays or node lists of DOM nodes.\n\t *\n\t * @private\n\t * @param {Array.|NodeList} actualDomChildren Actual DOM children\n\t * @param {Array.|NodeList} expectedDomChildren Expected DOM children.\n\t * @returns {Array.} The list of actions based on the {@link module:utils/diff~diff} function.\n\t */\n\t_diffNodeLists( actualDomChildren, expectedDomChildren ) {\n\t\tactualDomChildren = filterOutFakeSelectionContainer( actualDomChildren, this._fakeSelectionContainer );\n\n\t\treturn diff( actualDomChildren, expectedDomChildren, sameNodes.bind( null, this.domConverter ) );\n\t}\n\n\t/**\n\t * Finds DOM nodes that were replaced with the similar nodes (same tag name) in the view. All nodes are compared\n\t * within one `insert`/`delete` action group, for example:\n\t *\n\t * \t\tActual DOM:\t\t

    FooBarBazBax

    \n\t * \t\tExpected DOM:\t

    Bar123Baz456

    \n\t * \t\tInput actions:\t[ insert, insert, delete, delete, equal, insert, delete ]\n\t * \t\tOutput actions:\t[ insert, replace, delete, equal, replace ]\n\t *\n\t * @private\n\t * @param {Array.} actions Actions array which is a result of the {@link module:utils/diff~diff} function.\n\t * @param {Array.|NodeList} actualDom Actual DOM children\n\t * @param {Array.} expectedDom Expected DOM children.\n\t * @returns {Array.} Actions array modified with the `replace` actions.\n\t */\n\t_findReplaceActions( actions, actualDom, expectedDom ) {\n\t\t// If there is no both 'insert' and 'delete' actions, no need to check for replaced elements.\n\t\tif ( actions.indexOf( 'insert' ) === -1 || actions.indexOf( 'delete' ) === -1 ) {\n\t\t\treturn actions;\n\t\t}\n\n\t\tlet newActions = [];\n\t\tlet actualSlice = [];\n\t\tlet expectedSlice = [];\n\n\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\texpectedSlice.push( expectedDom[ counter.equal + counter.insert ] );\n\t\t\t} else if ( action === 'delete' ) {\n\t\t\t\tactualSlice.push( actualDom[ counter.equal + counter.delete ] );\n\t\t\t} else { // equal\n\t\t\t\tnewActions = newActions.concat( diff( actualSlice, expectedSlice, areSimilar ).map( x => x === 'equal' ? 'replace' : x ) );\n\t\t\t\tnewActions.push( 'equal' );\n\t\t\t\t// Reset stored elements on 'equal'.\n\t\t\t\tactualSlice = [];\n\t\t\t\texpectedSlice = [];\n\t\t\t}\n\t\t\tcounter[ action ]++;\n\t\t}\n\n\t\treturn newActions.concat( diff( actualSlice, expectedSlice, areSimilar ).map( x => x === 'equal' ? 'replace' : x ) );\n\t}\n\n\t/**\n\t * Marks text nodes to be synchronized.\n\t *\n\t * If a text node is passed, it will be marked. If an element is passed, all descendant text nodes inside it will be marked.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~Node} viewNode View node to sync.\n\t */\n\t_markDescendantTextToSync( viewNode ) {\n\t\tif ( !viewNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( viewNode.is( '$text' ) ) {\n\t\t\tthis.markedTexts.add( viewNode );\n\t\t} else if ( viewNode.is( 'element' ) ) {\n\t\t\tfor ( const child of viewNode.getChildren() ) {\n\t\t\t\tthis._markDescendantTextToSync( child );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the selection needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t */\n\t_updateSelection() {\n\t\t// Block updating DOM selection in (non-Android) Blink while the user is selecting to prevent accidental selection collapsing.\n\t\t// Note: Structural changes in DOM must trigger selection rendering, though. Nodes the selection was anchored\n\t\t// to, may disappear in DOM which would break the selection (e.g. in real-time collaboration scenarios).\n\t\t// https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723\n\t\tif ( env.isBlink && !env.isAndroid && this.isSelecting && !this.markedChildren.size ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there is no selection - remove DOM and fake selections.\n\t\tif ( this.selection.rangeCount === 0 ) {\n\t\t\tthis._removeDomSelection();\n\t\t\tthis._removeFakeSelection();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst domRoot = this.domConverter.mapViewToDom( this.selection.editableElement );\n\n\t\t// Do nothing if there is no focus, or there is no DOM element corresponding to selection's editable element.\n\t\tif ( !this.isFocused || !domRoot ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Render selection.\n\t\tif ( this.selection.isFake ) {\n\t\t\tthis._updateFakeSelection( domRoot );\n\t\t} else {\n\t\t\tthis._removeFakeSelection();\n\t\t\tthis._updateDomSelection( domRoot );\n\t\t}\n\t}\n\n\t/**\n\t * Updates the fake selection.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where the fake selection container should be added.\n\t */\n\t_updateFakeSelection( domRoot ) {\n\t\tconst domDocument = domRoot.ownerDocument;\n\n\t\tif ( !this._fakeSelectionContainer ) {\n\t\t\tthis._fakeSelectionContainer = createFakeSelectionContainer( domDocument );\n\t\t}\n\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\t// Bind fake selection container with the current selection *position*.\n\t\tthis.domConverter.bindFakeSelection( container, this.selection );\n\n\t\tif ( !this._fakeSelectionNeedsUpdate( domRoot ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !container.parentElement || container.parentElement != domRoot ) {\n\t\t\tdomRoot.appendChild( container );\n\t\t}\n\n\t\tcontainer.textContent = this.selection.fakeSelectionLabel || '\\u00A0';\n\n\t\tconst domSelection = domDocument.getSelection();\n\t\tconst domRange = domDocument.createRange();\n\n\t\tdomSelection.removeAllRanges();\n\t\tdomRange.selectNodeContents( container );\n\t\tdomSelection.addRange( domRange );\n\t}\n\n\t/**\n\t * Updates the DOM selection.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where the DOM selection should be rendered.\n\t */\n\t_updateDomSelection( domRoot ) {\n\t\tconst domSelection = domRoot.ownerDocument.defaultView.getSelection();\n\n\t\t// Let's check whether DOM selection needs updating at all.\n\t\tif ( !this._domSelectionNeedsUpdate( domSelection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Multi-range selection is not available in most browsers, and, at least in Chrome, trying to\n\t\t// set such selection, that is not continuous, throws an error. Because of that, we will just use anchor\n\t\t// and focus of view selection.\n\t\t// Since we are not supporting multi-range selection, we also do not need to check if proper editable is\n\t\t// selected. If there is any editable selected, it is okay (editable is taken from selection anchor).\n\t\tconst anchor = this.domConverter.viewPositionToDom( this.selection.anchor );\n\t\tconst focus = this.domConverter.viewPositionToDom( this.selection.focus );\n\n\t\tdomSelection.collapse( anchor.parent, anchor.offset );\n\t\tdomSelection.extend( focus.parent, focus.offset );\n\n\t\t// Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n\t\tif ( env.isGecko ) {\n\t\t\tfixGeckoSelectionAfterBr( focus, domSelection );\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether a given DOM selection needs to be updated.\n\t *\n\t * @private\n\t * @param {Selection} domSelection The DOM selection to check.\n\t * @returns {Boolean}\n\t */\n\t_domSelectionNeedsUpdate( domSelection ) {\n\t\tif ( !this.domConverter.isDomSelectionCorrect( domSelection ) ) {\n\t\t\t// Current DOM selection is in incorrect position. We need to update it.\n\t\t\treturn true;\n\t\t}\n\n\t\tconst oldViewSelection = domSelection && this.domConverter.domSelectionToView( domSelection );\n\n\t\tif ( oldViewSelection && this.selection.isEqual( oldViewSelection ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If selection is not collapsed, it does not need to be updated if it is similar.\n\t\tif ( !this.selection.isCollapsed && this.selection.isSimilar( oldViewSelection ) ) {\n\t\t\t// Selection did not changed and is correct, do not update.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Selections are not similar.\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks whether the fake selection needs to be updated.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where a new fake selection container should be added.\n\t * @returns {Boolean}\n\t */\n\t_fakeSelectionNeedsUpdate( domRoot ) {\n\t\tconst container = this._fakeSelectionContainer;\n\t\tconst domSelection = domRoot.ownerDocument.getSelection();\n\n\t\t// Fake selection needs to be updated if there's no fake selection container, or the container currently sits\n\t\t// in a different root.\n\t\tif ( !container || container.parentElement !== domRoot ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Make sure that the selection actually is within the fake selection.\n\t\tif ( domSelection.anchorNode !== container && !container.contains( domSelection.anchorNode ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn container.textContent !== this.selection.fakeSelectionLabel;\n\t}\n\n\t/**\n\t * Removes the DOM selection.\n\t *\n\t * @private\n\t */\n\t_removeDomSelection() {\n\t\tfor ( const doc of this.domDocuments ) {\n\t\t\tconst domSelection = doc.getSelection();\n\n\t\t\tif ( domSelection.rangeCount ) {\n\t\t\t\tconst activeDomElement = doc.activeElement;\n\t\t\t\tconst viewElement = this.domConverter.mapDomToView( activeDomElement );\n\n\t\t\t\tif ( activeDomElement && viewElement ) {\n\t\t\t\t\tdoc.getSelection().removeAllRanges();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes the fake selection.\n\t *\n\t * @private\n\t */\n\t_removeFakeSelection() {\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\tif ( container ) {\n\t\t\tcontainer.remove();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if focus needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t */\n\t_updateFocus() {\n\t\tif ( this.isFocused ) {\n\t\t\tconst editable = this.selection.editableElement;\n\n\t\t\tif ( editable ) {\n\t\t\t\tthis.domConverter.focus( editable );\n\t\t\t}\n\t\t}\n\t}\n}\n\nmix( Renderer, ObservableMixin );\n\n// Checks if provided element is editable.\n//\n// @private\n// @param {module:engine/view/element~Element} element\n// @returns {Boolean}\nfunction isEditable( element ) {\n\tif ( element.getAttribute( 'contenteditable' ) == 'false' ) {\n\t\treturn false;\n\t}\n\n\tconst parent = element.findAncestor( element => element.hasAttribute( 'contenteditable' ) );\n\n\treturn !parent || parent.getAttribute( 'contenteditable' ) == 'true';\n}\n\n// Adds inline filler at a given position.\n//\n// The position can be given as an array of DOM nodes and an offset in that array,\n// or a DOM parent element and an offset in that element.\n//\n// @private\n// @param {Document} domDocument\n// @param {Element|Array.} domParentOrArray\n// @param {Number} offset\n// @returns {Text} The DOM text node that contains an inline filler.\nfunction addInlineFiller( domDocument, domParentOrArray, offset ) {\n\tconst childNodes = domParentOrArray instanceof Array ? domParentOrArray : domParentOrArray.childNodes;\n\tconst nodeAfterFiller = childNodes[ offset ];\n\n\tif ( isText( nodeAfterFiller ) ) {\n\t\tnodeAfterFiller.data = INLINE_FILLER + nodeAfterFiller.data;\n\n\t\treturn nodeAfterFiller;\n\t} else {\n\t\tconst fillerNode = domDocument.createTextNode( INLINE_FILLER );\n\n\t\tif ( Array.isArray( domParentOrArray ) ) {\n\t\t\tchildNodes.splice( offset, 0, fillerNode );\n\t\t} else {\n\t\t\tinsertAt( domParentOrArray, offset, fillerNode );\n\t\t}\n\n\t\treturn fillerNode;\n\t}\n}\n\n// Whether two DOM nodes should be considered as similar.\n// Nodes are considered similar if they have the same tag name.\n//\n// @private\n// @param {Node} node1\n// @param {Node} node2\n// @returns {Boolean}\nfunction areSimilar( node1, node2 ) {\n\treturn isNode( node1 ) && isNode( node2 ) &&\n\t\t!isText( node1 ) && !isText( node2 ) &&\n\t\t!isComment( node1 ) && !isComment( node2 ) &&\n\t\tnode1.tagName.toLowerCase() === node2.tagName.toLowerCase();\n}\n\n// Whether two dom nodes should be considered as the same.\n// Two nodes which are considered the same are:\n//\n//\t\t* Text nodes with the same text.\n//\t\t* Element nodes represented by the same object.\n//\t\t* Two block filler elements.\n//\n// @private\n// @param {String} blockFillerMode Block filler mode, see {@link module:engine/view/domconverter~DomConverter#blockFillerMode}.\n// @param {Node} node1\n// @param {Node} node2\n// @returns {Boolean}\nfunction sameNodes( domConverter, actualDomChild, expectedDomChild ) {\n\t// Elements.\n\tif ( actualDomChild === expectedDomChild ) {\n\t\treturn true;\n\t}\n\t// Texts.\n\telse if ( isText( actualDomChild ) && isText( expectedDomChild ) ) {\n\t\treturn actualDomChild.data === expectedDomChild.data;\n\t}\n\t// Block fillers.\n\telse if ( domConverter.isBlockFiller( actualDomChild ) &&\n\t\tdomConverter.isBlockFiller( expectedDomChild ) ) {\n\t\treturn true;\n\t}\n\n\t// Not matching types.\n\treturn false;\n}\n\n// The following is a Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n// When the native DOM selection is at the end of the block and preceded by
    e.g.\n//\n//\t\t

    foo
    []

    \n//\n// which happens a lot when using the soft line break, the browser fails to (visually) move the\n// caret to the new line. A quick fix is as simple as force–refreshing the selection with the same range.\nfunction fixGeckoSelectionAfterBr( focus, domSelection ) {\n\tconst parent = focus.parent;\n\n\t// This fix works only when the focus point is at the very end of an element.\n\t// There is no point in running it in cases unrelated to the browser bug.\n\tif ( parent.nodeType != Node.ELEMENT_NODE || focus.offset != parent.childNodes.length - 1 ) {\n\t\treturn;\n\t}\n\n\tconst childAtOffset = parent.childNodes[ focus.offset ];\n\n\t// To stay on the safe side, the fix being as specific as possible, it targets only the\n\t// selection which is at the very end of the element and preceded by
    .\n\tif ( childAtOffset && childAtOffset.tagName == 'BR' ) {\n\t\tdomSelection.addRange( domSelection.getRangeAt( 0 ) );\n\t}\n}\n\nfunction filterOutFakeSelectionContainer( domChildList, fakeSelectionContainer ) {\n\tconst childList = Array.from( domChildList );\n\n\tif ( childList.length == 0 || !fakeSelectionContainer ) {\n\t\treturn childList;\n\t}\n\n\tconst last = childList[ childList.length - 1 ];\n\n\tif ( last == fakeSelectionContainer ) {\n\t\tchildList.pop();\n\t}\n\n\treturn childList;\n}\n\n// Creates a fake selection container for a given document.\n//\n// @private\n// @param {Document} domDocument\n// @returns {HTMLElement}\nfunction createFakeSelectionContainer( domDocument ) {\n\tconst container = domDocument.createElement( 'div' );\n\n\tcontainer.className = 'ck-fake-selection-container';\n\n\tObject.assign( container.style, {\n\t\tposition: 'fixed',\n\t\ttop: 0,\n\t\tleft: '-9999px',\n\t\t// See https://github.com/ckeditor/ckeditor5/issues/752.\n\t\twidth: '42px'\n\t} );\n\n\t// Fill it with a text node so we can update it later.\n\tcontainer.textContent = '\\u00A0';\n\n\treturn container;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/* globals window, document */\n/**\n * @module utils/dom/global\n */\n/**\n * A helper (module) giving an access to the global DOM objects such as `window` and\n * `document`. Accessing these objects using this helper allows easy and bulletproof\n * testing, i.e. stubbing native properties:\n *\n *\t\timport global from 'ckeditor5/utils/dom/global.js';\n *\n *\t\t// This stub will work for any code using global module.\n *\t\ttestUtils.sinon.stub( global, 'window', {\n *\t\t\tinnerWidth: 10000\n *\t\t} );\n *\n *\t\tconsole.log( global.window.innerWidth );\n */\nexport default { window, document };\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module utils/dom/indexof\n */\n/**\n * Returns index of the node in the parent element.\n *\n * @param {Node} node Node which index is tested.\n * @returns {Number} Index of the node in the parent element. Returns 0 if node has no parent.\n */\nexport default function indexOf(node) {\n let index = 0;\n while (node.previousSibling) {\n node = node.previousSibling;\n index++;\n }\n return index;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/* globals Node */\n/**\n * @module utils/dom/getancestors\n */\n/**\n * Returns all ancestors of given DOM node, starting from the top-most (root). Includes the given node itself. If the\n * node is a part of `DocumentFragment` that `DocumentFragment` will be returned. In contrary, if the node is\n * appended to a `Document`, that `Document` will not be returned (algorithms operating on DOM tree care for `Document#documentElement`\n * at most, which will be returned).\n *\n * @param {Node} node DOM node.\n * @returns {Array.} Array of given `node` parents.\n */\nexport default function getAncestors(node) {\n const nodes = [];\n let currentNode = node;\n // We are interested in `Node`s `DocumentFragment`s only.\n while (currentNode && currentNode.nodeType != Node.DOCUMENT_NODE) {\n nodes.unshift(currentNode);\n currentNode = currentNode.parentNode;\n }\n return nodes;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/domconverter\n */\n\n/* globals Node, NodeFilter, DOMParser, Text */\n\nimport ViewText from './text';\nimport ViewElement from './element';\nimport ViewUIElement from './uielement';\nimport ViewPosition from './position';\nimport ViewRange from './range';\nimport ViewSelection from './selection';\nimport ViewDocumentFragment from './documentfragment';\nimport ViewTreeWalker from './treewalker';\nimport Matcher from './matcher';\nimport {\n\tBR_FILLER, INLINE_FILLER_LENGTH, NBSP_FILLER, MARKED_NBSP_FILLER,\n\tgetDataWithoutFiller, isInlineFiller, startsWithFiller\n} from './filler';\n\nimport global from '@ckeditor/ckeditor5-utils/src/dom/global';\nimport { logWarning } from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport indexOf from '@ckeditor/ckeditor5-utils/src/dom/indexof';\nimport getAncestors from '@ckeditor/ckeditor5-utils/src/dom/getancestors';\nimport isText from '@ckeditor/ckeditor5-utils/src/dom/istext';\nimport isComment from '@ckeditor/ckeditor5-utils/src/dom/iscomment';\n\nconst BR_FILLER_REF = BR_FILLER( global.document ); // eslint-disable-line new-cap\nconst NBSP_FILLER_REF = NBSP_FILLER( global.document ); // eslint-disable-line new-cap\nconst MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER( global.document ); // eslint-disable-line new-cap\nconst UNSAFE_ATTRIBUTE_NAME_PREFIX = 'data-ck-unsafe-attribute-';\nconst UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE = 'data-ck-unsafe-element';\n\n/**\n * `DomConverter` is a set of tools to do transformations between DOM nodes and view nodes. It also handles\n * {@link module:engine/view/domconverter~DomConverter#bindElements bindings} between these nodes.\n *\n * An instance of the DOM converter is available under\n * {@link module:engine/view/view~View#domConverter `editor.editing.view.domConverter`}.\n *\n * The DOM converter does not check which nodes should be rendered (use {@link module:engine/view/renderer~Renderer}), does not keep the\n * state of a tree nor keeps the synchronization between the tree view and the DOM tree (use {@link module:engine/view/document~Document}).\n *\n * The DOM converter keeps DOM elements to view element bindings, so when the converter gets destroyed, the bindings are lost.\n * Two converters will keep separate binding maps, so one tree view can be bound with two DOM trees.\n */\nexport default class DomConverter {\n\t/**\n\t * Creates a DOM converter.\n\t *\n\t * @param {module:engine/view/document~Document} document The view document instance.\n\t * @param {Object} options An object with configuration options.\n\t * @param {module:engine/view/filler~BlockFillerMode} [options.blockFillerMode] The type of the block filler to use.\n\t * Default value depends on the options.renderingMode:\n\t * 'nbsp' when options.renderingMode == 'data',\n\t * 'br' when options.renderingMode == 'editing'.\n\t * @param {'data'|'editing'} [options.renderingMode='editing'] Whether to leave the View-to-DOM conversion result unchanged\n\t * or improve editing experience by filtering out interactive data.\n\t */\n\tconstructor( document, options = {} ) {\n\t\t/**\n\t\t * @readonly\n\t\t * @type {module:engine/view/document~Document}\n\t\t */\n\t\tthis.document = document;\n\n\t\t/**\n\t\t * Whether to leave the View-to-DOM conversion result unchanged or improve editing experience by filtering out interactive data.\n\t\t *\n\t\t * @member {'data'|'editing'} module:engine/view/domconverter~DomConverter#renderingMode\n\t\t */\n\t\tthis.renderingMode = options.renderingMode || 'editing';\n\n\t\t/**\n\t\t * The mode of a block filler used by the DOM converter.\n\t\t *\n\t\t * @member {'br'|'nbsp'|'markedNbsp'} module:engine/view/domconverter~DomConverter#blockFillerMode\n\t\t */\n\t\tthis.blockFillerMode = options.blockFillerMode || ( this.renderingMode === 'editing' ? 'br' : 'nbsp' );\n\n\t\t/**\n\t\t * Elements which are considered pre-formatted elements.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/view/domconverter~DomConverter#preElements\n\t\t */\n\t\tthis.preElements = [ 'pre' ];\n\n\t\t/**\n\t\t * Elements which are considered block elements (and hence should be filled with a\n\t\t * {@link #isBlockFiller block filler}).\n\t\t *\n\t\t * Whether an element is considered a block element also affects handling of trailing whitespaces.\n\t\t *\n\t\t * You can extend this array if you introduce support for block elements which are not yet recognized here.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/view/domconverter~DomConverter#blockElements\n\t\t */\n\t\tthis.blockElements = [\n\t\t\t'address', 'article', 'aside', 'blockquote', 'caption', 'center', 'dd', 'details', 'dir', 'div',\n\t\t\t'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',\n\t\t\t'hgroup', 'legend', 'li', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'tbody',\n\t\t\t'td', 'tfoot', 'th', 'thead', 'tr', 'ul'\n\t\t];\n\n\t\t/**\n\t\t * A list of elements that exist inline (in text) but their inner structure cannot be edited because\n\t\t * of the way they are rendered by the browser. They are mostly HTML form elements but there are other\n\t\t * elements such as `` or `' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'spotify',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(artist\\/\\w+)/,\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(album\\/\\w+)/,\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(track\\/\\w+)/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'youtube',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^(?:m\\.)?youtube\\.com\\/watch\\?v=([\\w-]+)(?:&t=(\\d+))?/,\n\t\t\t\t\t\t/^(?:m\\.)?youtube\\.com\\/v\\/([\\w-]+)(?:\\?t=(\\d+))?/,\n\t\t\t\t\t\t/^youtube\\.com\\/embed\\/([\\w-]+)(?:\\?start=(\\d+))?/,\n\t\t\t\t\t\t/^youtu\\.be\\/([\\w-]+)(?:\\?t=(\\d+))?/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\t\t\t\t\t\tconst time = match[ 2 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'vimeo',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^vimeo\\.com\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/[^/]+\\/[^/]+\\/video\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/album\\/[^/]+\\/video\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/channels\\/[^/]+\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/groups\\/[^/]+\\/videos\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/ondemand\\/[^/]+\\/(\\d+)/,\n\t\t\t\t\t\t/^player\\.vimeo\\.com\\/video\\/(\\d+)/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'instagram',\n\t\t\t\t\turl: /^instagram\\.com\\/p\\/(\\w+)/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'twitter',\n\t\t\t\t\turl: /^twitter\\.com/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'googleMaps',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^google\\.com\\/maps/,\n\t\t\t\t\t\t/^goo\\.gl\\/maps/,\n\t\t\t\t\t\t/^maps\\.google\\.com/,\n\t\t\t\t\t\t/^maps\\.app\\.goo\\.gl/\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'flickr',\n\t\t\t\t\turl: /^flickr\\.com/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'facebook',\n\t\t\t\t\turl: /^facebook\\.com/\n\t\t\t\t}\n\t\t\t]\n\t\t} );\n\n\t\t/**\n\t\t * The media registry managing the media providers in the editor.\n\t\t *\n\t\t * @member {module:media-embed/mediaregistry~MediaRegistry} #registry\n\t\t */\n\t\tthis.registry = new MediaRegistry( editor.locale, editor.config.get( 'mediaEmbed' ) );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\t\tconst t = editor.t;\n\t\tconst conversion = editor.conversion;\n\t\tconst renderMediaPreview = editor.config.get( 'mediaEmbed.previewsInData' );\n\t\tconst elementName = editor.config.get( 'mediaEmbed.elementName' );\n\n\t\tconst registry = this.registry;\n\n\t\teditor.commands.add( 'mediaEmbed', new MediaEmbedCommand( editor ) );\n\n\t\t// Configure the schema.\n\t\tschema.register( 'media', {\n\t\t\tinheritAllFrom: '$blockObject',\n\t\t\tallowAttributes: [ 'url' ]\n\t\t} );\n\n\t\t// Model -> Data\n\t\tconversion.for( 'dataDowncast' ).elementToStructure( {\n\t\t\tmodel: 'media',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tconst url = modelElement.getAttribute( 'url' );\n\n\t\t\t\treturn createMediaFigureElement( writer, registry, url, {\n\t\t\t\t\telementName,\n\t\t\t\t\trenderMediaPreview: url && renderMediaPreview\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> Data (url -> data-oembed-url)\n\t\tconversion.for( 'dataDowncast' ).add(\n\t\t\tmodelToViewUrlAttributeConverter( registry, {\n\t\t\t\telementName,\n\t\t\t\trenderMediaPreview\n\t\t\t} ) );\n\n\t\t// Model -> View (element)\n\t\tconversion.for( 'editingDowncast' ).elementToStructure( {\n\t\t\tmodel: 'media',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tconst url = modelElement.getAttribute( 'url' );\n\t\t\t\tconst figure = createMediaFigureElement( writer, registry, url, {\n\t\t\t\t\telementName,\n\t\t\t\t\trenderForEditingView: true\n\t\t\t\t} );\n\n\t\t\t\treturn toMediaWidget( figure, writer, t( 'media widget' ) );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> View (url -> data-oembed-url)\n\t\tconversion.for( 'editingDowncast' ).add(\n\t\t\tmodelToViewUrlAttributeConverter( registry, {\n\t\t\t\telementName,\n\t\t\t\trenderForEditingView: true\n\t\t\t} ) );\n\n\t\t// View -> Model (data-oembed-url -> url)\n\t\tconversion.for( 'upcast' )\n\t\t\t// Upcast semantic media.\n\t\t\t.elementToElement( {\n\t\t\t\tview: element => [ 'oembed', elementName ].includes( element.name ) && element.getAttribute( 'url' ) ?\n\t\t\t\t\t{ name: true } :\n\t\t\t\t\tnull,\n\t\t\t\tmodel: ( viewMedia, { writer } ) => {\n\t\t\t\t\tconst url = viewMedia.getAttribute( 'url' );\n\n\t\t\t\t\tif ( registry.hasMedia( url ) ) {\n\t\t\t\t\t\treturn writer.createElement( 'media', { url } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// Upcast non-semantic media.\n\t\t\t.elementToElement( {\n\t\t\t\tview: {\n\t\t\t\t\tname: 'div',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-oembed-url': true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodel: ( viewMedia, { writer } ) => {\n\t\t\t\t\tconst url = viewMedia.getAttribute( 'data-oembed-url' );\n\n\t\t\t\t\tif ( registry.hasMedia( url ) ) {\n\t\t\t\t\t\treturn writer.createElement( 'media', { url } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// Consume `
    ` elements, that were left after upcast.\n\t\t\t.add( dispatcher => {\n\t\t\t\tdispatcher.on( 'element:figure', converter );\n\n\t\t\t\tfunction converter( evt, data, conversionApi ) {\n\t\t\t\t\tif ( !conversionApi.consumable.consume( data.viewItem, { name: true, classes: 'media' } ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { modelRange, modelCursor } = conversionApi.convertChildren( data.viewItem, data.modelCursor );\n\n\t\t\t\t\tdata.modelRange = modelRange;\n\t\t\t\t\tdata.modelCursor = modelCursor;\n\n\t\t\t\t\tconst modelElement = first( modelRange.getItems() );\n\n\t\t\t\t\tif ( !modelElement ) {\n\t\t\t\t\t\t// Revert consumed figure so other features can convert it.\n\t\t\t\t\t\tconversionApi.consumable.revert( data.viewItem, { name: true, classes: 'media' } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/automediaembed\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { LiveRange, LivePosition } from 'ckeditor5/src/engine';\nimport { Clipboard } from 'ckeditor5/src/clipboard';\nimport { Delete } from 'ckeditor5/src/typing';\nimport { Undo } from 'ckeditor5/src/undo';\nimport { global } from 'ckeditor5/src/utils';\n\nimport MediaEmbedEditing from './mediaembedediting';\nimport { insertMedia } from './utils';\n\nconst URL_REGEXP = /^(?:http(s)?:\\/\\/)?[\\w-]+\\.[\\w-.~:/?#[\\]@!$&'()*+,;=%]+$/;\n\n/**\n * The auto-media embed plugin. It recognizes media links in the pasted content and embeds\n * them shortly after they are injected into the document.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class AutoMediaEmbed extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ Clipboard, Delete, Undo ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'AutoMediaEmbed';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * The paste–to–embed `setTimeout` ID. Stored as a property to allow\n\t\t * cleaning of the timeout.\n\t\t *\n\t\t * @private\n\t\t * @member {Number} #_timeoutId\n\t\t */\n\t\tthis._timeoutId = null;\n\n\t\t/**\n\t\t * The position where the `` element will be inserted after the timeout,\n\t\t * determined each time the new content is pasted into the document.\n\t\t *\n\t\t * @private\n\t\t * @member {module:engine/model/liveposition~LivePosition} #_positionToInsert\n\t\t */\n\t\tthis._positionToInsert = null;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst modelDocument = editor.model.document;\n\n\t\t// We need to listen on `Clipboard#inputTransformation` because we need to save positions of selection.\n\t\t// After pasting, the content between those positions will be checked for a URL that could be transformed\n\t\t// into media.\n\t\tthis.listenTo( editor.plugins.get( 'ClipboardPipeline' ), 'inputTransformation', () => {\n\t\t\tconst firstRange = modelDocument.selection.getFirstRange();\n\n\t\t\tconst leftLivePosition = LivePosition.fromPosition( firstRange.start );\n\t\t\tleftLivePosition.stickiness = 'toPrevious';\n\n\t\t\tconst rightLivePosition = LivePosition.fromPosition( firstRange.end );\n\t\t\trightLivePosition.stickiness = 'toNext';\n\n\t\t\tmodelDocument.once( 'change:data', () => {\n\t\t\t\tthis._embedMediaBetweenPositions( leftLivePosition, rightLivePosition );\n\n\t\t\t\tleftLivePosition.detach();\n\t\t\t\trightLivePosition.detach();\n\t\t\t}, { priority: 'high' } );\n\t\t} );\n\n\t\teditor.commands.get( 'undo' ).on( 'execute', () => {\n\t\t\tif ( this._timeoutId ) {\n\t\t\t\tglobal.window.clearTimeout( this._timeoutId );\n\t\t\t\tthis._positionToInsert.detach();\n\n\t\t\t\tthis._timeoutId = null;\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t}\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * Analyzes the part of the document between provided positions in search for a URL representing media.\n\t * When the URL is found, it is automatically converted into media.\n\t *\n\t * @protected\n\t * @param {module:engine/model/liveposition~LivePosition} leftPosition Left position of the selection.\n\t * @param {module:engine/model/liveposition~LivePosition} rightPosition Right position of the selection.\n\t */\n\t_embedMediaBetweenPositions( leftPosition, rightPosition ) {\n\t\tconst editor = this.editor;\n\t\tconst mediaRegistry = editor.plugins.get( MediaEmbedEditing ).registry;\n\t\t// TODO: Use marker instead of LiveRange & LivePositions.\n\t\tconst urlRange = new LiveRange( leftPosition, rightPosition );\n\t\tconst walker = urlRange.getWalker( { ignoreElementEnd: true } );\n\n\t\tlet url = '';\n\n\t\tfor ( const node of walker ) {\n\t\t\tif ( node.item.is( '$textProxy' ) ) {\n\t\t\t\turl += node.item.data;\n\t\t\t}\n\t\t}\n\n\t\turl = url.trim();\n\n\t\t// If the URL does not match to universal URL regexp, let's skip that.\n\t\tif ( !url.match( URL_REGEXP ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// If the URL represents a media, let's use it.\n\t\tif ( !mediaRegistry.hasMedia( url ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst mediaEmbedCommand = editor.commands.get( 'mediaEmbed' );\n\n\t\t// Do not anything if media element cannot be inserted at the current position (#47).\n\t\tif ( !mediaEmbedCommand.isEnabled ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Position won't be available in the `setTimeout` function so let's clone it.\n\t\tthis._positionToInsert = LivePosition.fromPosition( leftPosition );\n\n\t\t// This action mustn't be executed if undo was called between pasting and auto-embedding.\n\t\tthis._timeoutId = global.window.setTimeout( () => {\n\t\t\teditor.model.change( writer => {\n\t\t\t\tthis._timeoutId = null;\n\n\t\t\t\twriter.remove( urlRange );\n\t\t\t\turlRange.detach();\n\n\t\t\t\tlet insertionPosition;\n\n\t\t\t\t// Check if position where the media element should be inserted is still valid.\n\t\t\t\t// Otherwise leave it as undefined to use document.selection - default behavior of model.insertContent().\n\t\t\t\tif ( this._positionToInsert.root.rootName !== '$graveyard' ) {\n\t\t\t\t\tinsertionPosition = this._positionToInsert;\n\t\t\t\t}\n\n\t\t\t\tinsertMedia( editor.model, url, insertionPosition, false );\n\n\t\t\t\tthis._positionToInsert.detach();\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t} );\n\n\t\t\teditor.plugins.get( 'Delete' ).requestUndoOnBackspace();\n\t\t}, 100 );\n\t}\n}\n","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/singletonStyleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithAttributesAndNonce.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n \n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaform.css\";\n \n \n\nvar options = {\"attributes\":{\"data-cke\":true}};\n\n;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaform.css\";\n export default content && content.locals ? content.locals : undefined;\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/ui/mediaformview\n */\n\nimport {\n\tButtonView,\n\tFocusCycler,\n\tLabeledFieldView,\n\tView,\n\tViewCollection,\n\tcreateLabeledInputText,\n\tinjectCssTransitionDisabler,\n\tsubmitHandler\n} from 'ckeditor5/src/ui';\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\nimport { icons } from 'ckeditor5/src/core';\n\n// See: #8833.\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\nimport '../../theme/mediaform.css';\n\n/**\n * The media form view controller class.\n *\n * See {@link module:media-embed/ui/mediaformview~MediaFormView}.\n *\n * @extends module:ui/view~View\n */\nexport default class MediaFormView extends View {\n\t/**\n\t * @param {Array.} validators Form validators used by {@link #isValid}.\n\t * @param {module:utils/locale~Locale} [locale] The localization services instance.\n\t */\n\tconstructor( validators, locale ) {\n\t\tsuper( locale );\n\n\t\tconst t = locale.t;\n\n\t\t/**\n\t\t * Tracks information about the DOM focus in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/focustracker~FocusTracker}\n\t\t */\n\t\tthis.focusTracker = new FocusTracker();\n\n\t\t/**\n\t\t * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/keystrokehandler~KeystrokeHandler}\n\t\t */\n\t\tthis.keystrokes = new KeystrokeHandler();\n\n\t\t/**\n\t\t * The value of the URL input.\n\t\t *\n\t\t * @member {String} #mediaURLInputValue\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'mediaURLInputValue', '' );\n\n\t\t/**\n\t\t * The URL input view.\n\t\t *\n\t\t * @member {module:ui/labeledfield/labeledfieldview~LabeledFieldView}\n\t\t */\n\t\tthis.urlInputView = this._createUrlInput();\n\n\t\t/**\n\t\t * The Save button view.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView}\n\t\t */\n\t\tthis.saveButtonView = this._createButton( t( 'Save' ), icons.check, 'ck-button-save' );\n\t\tthis.saveButtonView.type = 'submit';\n\t\tthis.saveButtonView.bind( 'isEnabled' ).to( this, 'mediaURLInputValue', value => !!value );\n\n\t\t/**\n\t\t * The Cancel button view.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView}\n\t\t */\n\t\tthis.cancelButtonView = this._createButton( t( 'Cancel' ), icons.cancel, 'ck-button-cancel', 'cancel' );\n\n\t\t/**\n\t\t * A collection of views that can be focused in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/viewcollection~ViewCollection}\n\t\t */\n\t\tthis._focusables = new ViewCollection();\n\n\t\t/**\n\t\t * Helps cycling over {@link #_focusables} in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/focuscycler~FocusCycler}\n\t\t */\n\t\tthis._focusCycler = new FocusCycler( {\n\t\t\tfocusables: this._focusables,\n\t\t\tfocusTracker: this.focusTracker,\n\t\t\tkeystrokeHandler: this.keystrokes,\n\t\t\tactions: {\n\t\t\t\t// Navigate form fields backwards using the Shift + Tab keystroke.\n\t\t\t\tfocusPrevious: 'shift + tab',\n\n\t\t\t\t// Navigate form fields forwards using the Tab key.\n\t\t\t\tfocusNext: 'tab'\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * An array of form validators used by {@link #isValid}.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {Array.}\n\t\t */\n\t\tthis._validators = validators;\n\n\t\tthis.setTemplate( {\n\t\t\ttag: 'form',\n\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck',\n\t\t\t\t\t'ck-media-form',\n\t\t\t\t\t'ck-responsive-form'\n\t\t\t\t],\n\n\t\t\t\ttabindex: '-1'\n\t\t\t},\n\n\t\t\tchildren: [\n\t\t\t\tthis.urlInputView,\n\t\t\t\tthis.saveButtonView,\n\t\t\t\tthis.cancelButtonView\n\t\t\t]\n\t\t} );\n\n\t\tinjectCssTransitionDisabler( this );\n\n\t\t/**\n\t\t * The default info text for the {@link #urlInputView}.\n\t\t *\n\t\t * @private\n\t\t * @member {String} #_urlInputViewInfoDefault\n\t\t */\n\n\t\t/**\n\t\t * The info text with an additional tip for the {@link #urlInputView},\n\t\t * displayed when the input has some value.\n\t\t *\n\t\t * @private\n\t\t * @member {String} #_urlInputViewInfoTip\n\t\t */\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trender() {\n\t\tsuper.render();\n\n\t\tsubmitHandler( {\n\t\t\tview: this\n\t\t} );\n\n\t\tconst childViews = [\n\t\t\tthis.urlInputView,\n\t\t\tthis.saveButtonView,\n\t\t\tthis.cancelButtonView\n\t\t];\n\n\t\tchildViews.forEach( v => {\n\t\t\t// Register the view as focusable.\n\t\t\tthis._focusables.add( v );\n\n\t\t\t// Register the view in the focus tracker.\n\t\t\tthis.focusTracker.add( v.element );\n\t\t} );\n\n\t\t// Start listening for the keystrokes coming from #element.\n\t\tthis.keystrokes.listenTo( this.element );\n\n\t\tconst stopPropagation = data => data.stopPropagation();\n\n\t\t// Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\n\t\t// keystroke handler would take over the key management in the URL input. We need to prevent\n\t\t// this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\n\t\tthis.keystrokes.set( 'arrowright', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowleft', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowup', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowdown', stopPropagation );\n\n\t\t// Intercept the `selectstart` event, which is blocked by default because of the default behavior\n\t\t// of the DropdownView#panelView.\n\t\t// TODO: blocking `selectstart` in the #panelView should be configurable per–drop–down instance.\n\t\tthis.listenTo( this.urlInputView.element, 'selectstart', ( evt, domEvt ) => {\n\t\t\tdomEvt.stopPropagation();\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tthis.focusTracker.destroy();\n\t\tthis.keystrokes.destroy();\n\t}\n\n\t/**\n\t * Focuses the fist {@link #_focusables} in the form.\n\t */\n\tfocus() {\n\t\tthis._focusCycler.focusFirst();\n\t}\n\n\t/**\n\t * The native DOM `value` of the {@link #urlInputView} element.\n\t *\n\t * **Note**: Do not confuse it with the {@link module:ui/inputtext/inputtextview~InputTextView#value}\n\t * which works one way only and may not represent the actual state of the component in the DOM.\n\t *\n\t * @type {String}\n\t */\n\tget url() {\n\t\treturn this.urlInputView.fieldView.element.value.trim();\n\t}\n\n\tset url( url ) {\n\t\tthis.urlInputView.fieldView.element.value = url.trim();\n\t}\n\n\t/**\n\t * Validates the form and returns `false` when some fields are invalid.\n\t *\n\t * @returns {Boolean}\n\t */\n\tisValid() {\n\t\tthis.resetFormStatus();\n\n\t\tfor ( const validator of this._validators ) {\n\t\t\tconst errorText = validator( this );\n\n\t\t\t// One error per field is enough.\n\t\t\tif ( errorText ) {\n\t\t\t\t// Apply updated error.\n\t\t\t\tthis.urlInputView.errorText = errorText;\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Cleans up the supplementary error and information text of the {@link #urlInputView}\n\t * bringing them back to the state when the form has been displayed for the first time.\n\t *\n\t * See {@link #isValid}.\n\t */\n\tresetFormStatus() {\n\t\tthis.urlInputView.errorText = null;\n\t\tthis.urlInputView.infoText = this._urlInputViewInfoDefault;\n\t}\n\n\t/**\n\t * Creates a labeled input view.\n\t *\n\t * @private\n\t * @returns {module:ui/labeledfield/labeledfieldview~LabeledFieldView} Labeled input view instance.\n\t */\n\t_createUrlInput() {\n\t\tconst t = this.locale.t;\n\n\t\tconst labeledInput = new LabeledFieldView( this.locale, createLabeledInputText );\n\t\tconst inputField = labeledInput.fieldView;\n\n\t\tthis._urlInputViewInfoDefault = t( 'Paste the media URL in the input.' );\n\t\tthis._urlInputViewInfoTip = t( 'Tip: Paste the URL into the content to embed faster.' );\n\n\t\tlabeledInput.label = t( 'Media URL' );\n\t\tlabeledInput.infoText = this._urlInputViewInfoDefault;\n\n\t\tinputField.on( 'input', () => {\n\t\t\t// Display the tip text only when there is some value. Otherwise fall back to the default info text.\n\t\t\tlabeledInput.infoText = inputField.element.value ? this._urlInputViewInfoTip : this._urlInputViewInfoDefault;\n\t\t\tthis.mediaURLInputValue = inputField.element.value.trim();\n\t\t} );\n\n\t\treturn labeledInput;\n\t}\n\n\t/**\n\t * Creates a button view.\n\t *\n\t * @private\n\t * @param {String} label The button label.\n\t * @param {String} icon The button icon.\n\t * @param {String} className The additional button CSS class name.\n\t * @param {String} [eventName] An event name that the `ButtonView#execute` event will be delegated to.\n\t * @returns {module:ui/button/buttonview~ButtonView} The button view instance.\n\t */\n\t_createButton( label, icon, className, eventName ) {\n\t\tconst button = new ButtonView( this.locale );\n\n\t\tbutton.set( {\n\t\t\tlabel,\n\t\t\ticon,\n\t\t\ttooltip: true\n\t\t} );\n\n\t\tbutton.extendTemplate( {\n\t\t\tattributes: {\n\t\t\t\tclass: className\n\t\t\t}\n\t\t} );\n\n\t\tif ( eventName ) {\n\t\t\tbutton.delegate( 'execute' ).to( this, eventName );\n\t\t}\n\n\t\treturn button;\n\t}\n}\n\n/**\n * Fired when the form view is submitted (when one of the children triggered the submit event),\n * e.g. click on {@link #saveButtonView}.\n *\n * @event submit\n */\n\n/**\n * Fired when the form view is canceled, e.g. by a click on {@link #cancelButtonView}.\n *\n * @event cancel\n */\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/mediaembedui\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { createDropdown } from 'ckeditor5/src/ui';\n\nimport MediaFormView from './ui/mediaformview';\nimport MediaEmbedEditing from './mediaembedediting';\nimport mediaIcon from '../theme/icons/media.svg';\n\n/**\n * The media embed UI plugin.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class MediaEmbedUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ MediaEmbedEditing ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'MediaEmbedUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst command = editor.commands.get( 'mediaEmbed' );\n\t\tconst registry = editor.plugins.get( MediaEmbedEditing ).registry;\n\n\t\teditor.ui.componentFactory.add( 'mediaEmbed', locale => {\n\t\t\tconst dropdown = createDropdown( locale );\n\n\t\t\tconst mediaForm = new MediaFormView( getFormValidators( editor.t, registry ), editor.locale );\n\n\t\t\tthis._setUpDropdown( dropdown, mediaForm, command, editor );\n\t\t\tthis._setUpForm( dropdown, mediaForm, command );\n\n\t\t\treturn dropdown;\n\t\t} );\n\t}\n\n\t/**\n\t * @private\n\t * @param {module:ui/dropdown/dropdownview~DropdownView} dropdown\n\t * @param {module:ui/view~View} form\n\t * @param {module:media-embed/mediaembedcommand~MediaEmbedCommand} command\n\t */\n\t_setUpDropdown( dropdown, form, command ) {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst button = dropdown.buttonView;\n\n\t\tdropdown.bind( 'isEnabled' ).to( command );\n\t\tdropdown.panelView.children.add( form );\n\n\t\tbutton.set( {\n\t\t\tlabel: t( 'Insert media' ),\n\t\t\ticon: mediaIcon,\n\t\t\ttooltip: true\n\t\t} );\n\n\t\t// Note: Use the low priority to make sure the following listener starts working after the\n\t\t// default action of the drop-down is executed (i.e. the panel showed up). Otherwise, the\n\t\t// invisible form/input cannot be focused/selected.\n\t\tbutton.on( 'open', () => {\n\t\t\tform.disableCssTransitions();\n\n\t\t\t// Make sure that each time the panel shows up, the URL field remains in sync with the value of\n\t\t\t// the command. If the user typed in the input, then canceled (`urlInputView#fieldView#value` stays\n\t\t\t// unaltered) and re-opened it without changing the value of the media command (e.g. because they\n\t\t\t// didn't change the selection), they would see the old value instead of the actual value of the\n\t\t\t// command.\n\t\t\tform.url = command.value || '';\n\t\t\tform.urlInputView.fieldView.select();\n\t\t\tform.enableCssTransitions();\n\t\t}, { priority: 'low' } );\n\n\t\tdropdown.on( 'submit', () => {\n\t\t\tif ( form.isValid() ) {\n\t\t\t\teditor.execute( 'mediaEmbed', form.url );\n\t\t\t\tcloseUI();\n\t\t\t}\n\t\t} );\n\n\t\tdropdown.on( 'change:isOpen', () => form.resetFormStatus() );\n\t\tdropdown.on( 'cancel', () => closeUI() );\n\n\t\tfunction closeUI() {\n\t\t\teditor.editing.view.focus();\n\t\t\tdropdown.isOpen = false;\n\t\t}\n\t}\n\n\t/**\n\t * @private\n\t * @param {module:ui/dropdown/dropdownview~DropdownView} dropdown\n\t * @param {module:ui/view~View} form\n\t * @param {module:media-embed/mediaembedcommand~MediaEmbedCommand} command\n\t */\n\t_setUpForm( dropdown, form, command ) {\n\t\tform.delegate( 'submit', 'cancel' ).to( dropdown );\n\t\tform.urlInputView.bind( 'value' ).to( command, 'value' );\n\n\t\t// Form elements should be read-only when corresponding commands are disabled.\n\t\tform.urlInputView.bind( 'isReadOnly' ).to( command, 'isEnabled', value => !value );\n\t}\n}\n\nfunction getFormValidators( t, registry ) {\n\treturn [\n\t\tform => {\n\t\t\tif ( !form.url.length ) {\n\t\t\t\treturn t( 'The URL must not be empty.' );\n\t\t\t}\n\t\t},\n\t\tform => {\n\t\t\tif ( !registry.hasMedia( form.url ) ) {\n\t\t\t\treturn t( 'This media URL is not supported.' );\n\t\t\t}\n\t\t}\n\t];\n}\n","export default \"\";","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/singletonStyleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithAttributesAndNonce.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n \n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaembed.css\";\n \n \n\nvar options = {\"attributes\":{\"data-cke\":true}};\n\n;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaembed.css\";\n export default content && content.locals ? content.locals : undefined;\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/list\n */\n\nimport { Matcher, UpcastWriter } from 'ckeditor5/src/engine';\n\n/**\n * Transforms Word specific list-like elements to the semantic HTML lists.\n *\n * Lists in Word are represented by block elements with special attributes like:\n *\n *\t\t

    ...

    // Paragraph based list.\n *\t\t

    ...

    // Heading 1 based list.\n *\n * @param {module:engine/view/documentfragment~DocumentFragment} documentFragment The view structure to be transformed.\n * @param {String} stylesString Styles from which list-like elements styling will be extracted.\n */\nexport function transformListItemLikeElementsIntoLists( documentFragment, stylesString ) {\n\tif ( !documentFragment.childCount ) {\n\t\treturn;\n\t}\n\n\tconst writer = new UpcastWriter( documentFragment.document );\n\tconst itemLikeElements = findAllItemLikeElements( documentFragment, writer );\n\n\tif ( !itemLikeElements.length ) {\n\t\treturn;\n\t}\n\n\tlet currentList = null;\n\tlet currentIndentation = 1;\n\n\titemLikeElements.forEach( ( itemLikeElement, i ) => {\n\t\tconst isDifferentList = isNewListNeeded( itemLikeElements[ i - 1 ], itemLikeElement );\n\t\tconst previousItemLikeElement = isDifferentList ? null : itemLikeElements[ i - 1 ];\n\t\tconst indentationDifference = getIndentationDifference( previousItemLikeElement, itemLikeElement );\n\n\t\tif ( isDifferentList ) {\n\t\t\tcurrentList = null;\n\t\t\tcurrentIndentation = 1;\n\t\t}\n\n\t\tif ( !currentList || indentationDifference !== 0 ) {\n\t\t\tconst listStyle = detectListStyle( itemLikeElement, stylesString );\n\n\t\t\tif ( !currentList ) {\n\t\t\t\tcurrentList = insertNewEmptyList( listStyle, itemLikeElement.element, writer );\n\t\t\t} else if ( itemLikeElement.indent > currentIndentation ) {\n\t\t\t\tconst lastListItem = currentList.getChild( currentList.childCount - 1 );\n\t\t\t\tconst lastListItemChild = lastListItem.getChild( lastListItem.childCount - 1 );\n\n\t\t\t\tcurrentList = insertNewEmptyList( listStyle, lastListItemChild, writer );\n\t\t\t\tcurrentIndentation += 1;\n\t\t\t} else if ( itemLikeElement.indent < currentIndentation ) {\n\t\t\t\tconst differentIndentation = currentIndentation - itemLikeElement.indent;\n\n\t\t\t\tcurrentList = findParentListAtLevel( currentList, differentIndentation );\n\t\t\t\tcurrentIndentation = parseInt( itemLikeElement.indent );\n\t\t\t}\n\n\t\t\tif ( itemLikeElement.indent <= currentIndentation ) {\n\t\t\t\tif ( !currentList.is( 'element', listStyle.type ) ) {\n\t\t\t\t\tcurrentList = writer.rename( listStyle.type, currentList );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst listItem = transformElementIntoListItem( itemLikeElement.element, writer );\n\n\t\twriter.appendChild( listItem, currentList );\n\t} );\n}\n\n/**\n * Removes paragraph wrapping content inside a list item.\n *\n * @param {module:engine/view/documentfragment~DocumentFragment} documentFragment\n * @param {module:engine/view/upcastwriter~UpcastWriter} writer\n */\nexport function unwrapParagraphInListItem( documentFragment, writer ) {\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\n\t\tconst element = value.item;\n\n\t\tif ( element.is( 'element', 'li' ) ) {\n\t\t\t// Google Docs allows for single paragraph inside LI.\n\t\t\tconst firstChild = element.getChild( 0 );\n\n\t\t\tif ( firstChild && firstChild.is( 'element', 'p' ) ) {\n\t\t\t\twriter.unwrapElement( firstChild );\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Finds all list-like elements in a given document fragment.\n//\n// @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment\n// in which to look for list-like nodes.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\n// @returns {Array.} Array of found list-like items. Each item is an object containing:\n//\n//\t\t* {module:engine/src/view/element~Element} element List-like element.\n//\t\t* {Number} id List item id parsed from `mso-list` style (see `getListItemData()` function).\n//\t\t* {Number} order List item creation order parsed from `mso-list` style (see `getListItemData()` function).\n//\t\t* {Number} indent List item indentation level parsed from `mso-list` style (see `getListItemData()` function).\nfunction findAllItemLikeElements( documentFragment, writer ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\t// Matcher for finding list-like elements.\n\tconst itemLikeElementsMatcher = new Matcher( {\n\t\tname: /^p|h\\d+$/,\n\t\tstyles: {\n\t\t\t'mso-list': /.*/\n\t\t}\n\t} );\n\n\tconst itemLikeElements = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type === 'elementStart' && itemLikeElementsMatcher.match( value.item ) ) {\n\t\t\tconst itemData = getListItemData( value.item );\n\n\t\t\titemLikeElements.push( {\n\t\t\t\telement: value.item,\n\t\t\t\tid: itemData.id,\n\t\t\t\torder: itemData.order,\n\t\t\t\tindent: itemData.indent\n\t\t\t} );\n\t\t}\n\t}\n\n\treturn itemLikeElements;\n}\n\n// Extracts list item style from the provided CSS.\n//\n// List item style is extracted from the CSS stylesheet. Each list with its specific style attribute\n// value (`mso-list:l1 level1 lfo1`) has its dedicated properties in a CSS stylesheet defined with a selector like:\n//\n// \t\t@list l1:level1 { ... }\n//\n// It contains `mso-level-number-format` property which defines list numbering/bullet style. If this property\n// is not defined it means default `decimal` numbering.\n//\n// Here CSS string representation is used as `mso-level-number-format` property is an invalid CSS property\n// and will be removed during CSS parsing.\n//\n// @param {Object} listLikeItem List-like item for which list style will be searched for. Usually\n// a result of `findAllItemLikeElements()` function.\n// @param {String} stylesString CSS stylesheet.\n// @returns {Object} result\n// @returns {String} result.type List type, could be `ul` or `ol`.\n// @returns {Number} result.startIndex List start index, valid only for ordered lists.\n// @returns {String|null} result.style List style, for example: `decimal`, `lower-roman`, etc. It is extracted\n// directly from Word stylesheet and adjusted to represent proper values for the CSS `list-style-type` property.\n// If it cannot be adjusted, the `null` value is returned.\nfunction detectListStyle( listLikeItem, stylesString ) {\n\tconst listStyleRegexp = new RegExp( `@list l${ listLikeItem.id }:level${ listLikeItem.indent }\\\\s*({[^}]*)`, 'gi' );\n\tconst listStyleTypeRegex = /mso-level-number-format:([^;]{0,100});/gi;\n\tconst listStartIndexRegex = /mso-level-start-at:\\s{0,100}([0-9]{0,10})\\s{0,100};/gi;\n\n\tconst listStyleMatch = listStyleRegexp.exec( stylesString );\n\n\tlet listStyleType = 'decimal'; // Decimal is default one.\n\tlet type = 'ol'; //
      is default list.\n\tlet startIndex = null;\n\n\tif ( listStyleMatch && listStyleMatch[ 1 ] ) {\n\t\tconst listStyleTypeMatch = listStyleTypeRegex.exec( listStyleMatch[ 1 ] );\n\n\t\tif ( listStyleTypeMatch && listStyleTypeMatch[ 1 ] ) {\n\t\t\tlistStyleType = listStyleTypeMatch[ 1 ].trim();\n\t\t\ttype = listStyleType !== 'bullet' && listStyleType !== 'image' ? 'ol' : 'ul';\n\t\t}\n\n\t\t// Styles for the numbered lists are always defined in the Word CSS stylesheet.\n\t\t// Unordered lists MAY contain a value for the Word CSS definition `mso-level-text` but sometimes\n\t\t// this tag is missing. And because of that, we cannot depend on that. We need to predict the list style value\n\t\t// based on the list style marker element.\n\t\tif ( listStyleType === 'bullet' ) {\n\t\t\tconst bulletedStyle = findBulletedListStyle( listLikeItem.element );\n\n\t\t\tif ( bulletedStyle ) {\n\t\t\t\tlistStyleType = bulletedStyle;\n\t\t\t}\n\t\t} else {\n\t\t\tconst listStartIndexMatch = listStartIndexRegex.exec( listStyleMatch[ 1 ] );\n\n\t\t\tif ( listStartIndexMatch && listStartIndexMatch[ 1 ] ) {\n\t\t\t\tstartIndex = parseInt( listStartIndexMatch[ 1 ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\ttype,\n\t\tstartIndex,\n\t\tstyle: mapListStyleDefinition( listStyleType )\n\t};\n}\n\n// Tries to extract the `list-style-type` value based on the marker element for bulleted list.\n//\n// @param {module:engine/view/element~Element} element\n// @returns {String|null}\nfunction findBulletedListStyle( element ) {\n\tconst listMarkerElement = findListMarkerNode( element );\n\n\tif ( !listMarkerElement ) {\n\t\treturn null;\n\t}\n\n\tconst listMarker = listMarkerElement._data;\n\n\tif ( listMarker === 'o' ) {\n\t\treturn 'circle';\n\t} else if ( listMarker === '·' ) {\n\t\treturn 'disc';\n\t}\n\t// Word returns '§' instead of '■' for the square list style.\n\telse if ( listMarker === '§' ) {\n\t\treturn 'square';\n\t}\n\n\treturn null;\n}\n\n// Tries to find a text node that represents the marker element (list-style-type).\n//\n// @param {module:engine/view/element~Element} element\n// @returns {module:engine/view/text~Text|null}\nfunction findListMarkerNode( element ) {\n\t// If the first child is a text node, it is the data for the element.\n\t// The list-style marker is not present here.\n\tif ( element.getChild( 0 ).is( '$text' ) ) {\n\t\treturn null;\n\t}\n\n\tfor ( const childNode of element.getChildren() ) {\n\t\t// The list-style marker will be inside the `` element. Let's ignore all non-span elements.\n\t\t// It may happen that the `` element is added as the first child. Most probably, it's an anchor element.\n\t\tif ( !childNode.is( 'element', 'span' ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst textNodeOrElement = childNode.getChild( 0 );\n\n\t\t// If already found the marker element, use it.\n\t\tif ( textNodeOrElement.is( '$text' ) ) {\n\t\t\treturn textNodeOrElement;\n\t\t}\n\n\t\treturn textNodeOrElement.getChild( 0 );\n\t}\n}\n\n// Parses the `list-style-type` value extracted directly from the Word CSS stylesheet and returns proper CSS definition.\n//\n// @param {String|null} value\n// @returns {String|null}\nfunction mapListStyleDefinition( value ) {\n\tif ( value.startsWith( 'arabic-leading-zero' ) ) {\n\t\treturn 'decimal-leading-zero';\n\t}\n\n\tswitch ( value ) {\n\t\tcase 'alpha-upper':\n\t\t\treturn 'upper-alpha';\n\t\tcase 'alpha-lower':\n\t\t\treturn 'lower-alpha';\n\t\tcase 'roman-upper':\n\t\t\treturn 'upper-roman';\n\t\tcase 'roman-lower':\n\t\t\treturn 'lower-roman';\n\t\tcase 'circle':\n\t\tcase 'disc':\n\t\tcase 'square':\n\t\t\treturn value;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n// Creates an empty list of a given type and inserts it after a specified element.\n//\n// @param {Object} listStyle List style object which determines the type of newly created list.\n// Usually a result of `detectListStyle()` function.\n// @param {module:engine/view/element~Element} element Element after which list is inserted.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\n// @returns {module:engine/view/element~Element} Newly created list element.\n\nfunction insertNewEmptyList( listStyle, element, writer ) {\n\tconst parent = element.parent;\n\tconst list = writer.createElement( listStyle.type );\n\tconst position = parent.getChildIndex( element ) + 1;\n\n\twriter.insertChild( position, list, parent );\n\n\t// We do not support modifying the marker for a particular list item.\n\t// Set the value for the `list-style-type` property directly to the list container.\n\tif ( listStyle.style ) {\n\t\twriter.setStyle( 'list-style-type', listStyle.style, list );\n\t}\n\n\tif ( listStyle.startIndex && listStyle.startIndex > 1 ) {\n\t\twriter.setAttribute( 'start', listStyle.startIndex, list );\n\t}\n\n\treturn list;\n}\n\n// Transforms a given element into a semantic list item. As the function operates on a provided\n// {module:engine/src/view/element~Element element} it will modify the view structure to which this element belongs.\n//\n// @param {module:engine/view/element~Element} element Element which will be transformed into a list item.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\n// @returns {module:engine/view/element~Element} New element to which the given one was transformed. It is\n// inserted in place of the old element (the reference to the old element is lost due to renaming).\nfunction transformElementIntoListItem( element, writer ) {\n\tremoveBulletElement( element, writer );\n\n\treturn writer.rename( 'li', element );\n}\n\n// Extracts list item information from Word specific list-like element style:\n//\n//\t\t`style=\"mso-list:l1 level1 lfo1\"`\n//\n// where:\n//\n//\t\t* `l1` is a list id (however it does not mean this is a continuous list - see #43),\n//\t\t* `level1` is a list item indentation level,\n//\t\t* `lfo1` is a list insertion order in a document.\n//\n// @param {module:engine/view/element~Element} element Element from which style data is extracted.\n// @returns {Object} result\n// @returns {Number} result.id Parent list id.\n// @returns {Number} result.order List item creation order.\n// @returns {Number} result.indent List item indentation level.\nfunction getListItemData( element ) {\n\tconst data = {};\n\tconst listStyle = element.getStyle( 'mso-list' );\n\n\tif ( listStyle ) {\n\t\tconst idMatch = listStyle.match( /(^|\\s{1,100})l(\\d+)/i );\n\t\tconst orderMatch = listStyle.match( /\\s{0,100}lfo(\\d+)/i );\n\t\tconst indentMatch = listStyle.match( /\\s{0,100}level(\\d+)/i );\n\n\t\tif ( idMatch && orderMatch && indentMatch ) {\n\t\t\tdata.id = idMatch[ 2 ];\n\t\t\tdata.order = orderMatch[ 1 ];\n\t\t\tdata.indent = indentMatch[ 1 ];\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// Removes span with a numbering/bullet from a given element.\n//\n// @param {module:engine/view/element~Element} element\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\nfunction removeBulletElement( element, writer ) {\n\t// Matcher for finding `span` elements holding lists numbering/bullets.\n\tconst bulletMatcher = new Matcher( {\n\t\tname: 'span',\n\t\tstyles: {\n\t\t\t'mso-list': 'Ignore'\n\t\t}\n\t} );\n\n\tconst range = writer.createRangeIn( element );\n\n\tfor ( const value of range ) {\n\t\tif ( value.type === 'elementStart' && bulletMatcher.match( value.item ) ) {\n\t\t\twriter.remove( value.item );\n\t\t}\n\t}\n}\n\n// Whether the previous and current items belong to the same list. It is determined based on `item.id`\n// (extracted from `mso-list` style, see #getListItemData) and a previous sibling of the current item.\n//\n// However, it's quite easy to change the `id` attribute for nested lists in Word. It will break the list feature while pasting.\n// Let's check also the `indent` attribute. If the difference between those two elements is equal to 1, we can assume that\n// the `currentItem` is a beginning of the nested list because lists in CKEditor 5 always start with the `indent=0` attribute.\n// See: https://github.com/ckeditor/ckeditor5/issues/7805.\n//\n// @param {Object} previousItem\n// @param {Object} currentItem\n// @returns {Boolean}\nfunction isNewListNeeded( previousItem, currentItem ) {\n\tif ( !previousItem ) {\n\t\treturn true;\n\t}\n\n\tif ( previousItem.id !== currentItem.id ) {\n\t\t// See: https://github.com/ckeditor/ckeditor5/issues/7805.\n\t\t//\n\t\t// * List item 1.\n\t\t// - Nested list item 1.\n\t\tif ( currentItem.indent - previousItem.indent === 1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tconst previousSibling = currentItem.element.previousSibling;\n\n\tif ( !previousSibling ) {\n\t\treturn true;\n\t}\n\n\t// Even with the same id the list does not have to be continuous (#43).\n\treturn !isList( previousSibling );\n}\n\nfunction isList( element ) {\n\treturn element.is( 'element', 'ol' ) || element.is( 'element', 'ul' );\n}\n\n// Calculates the indentation difference between two given list items (based on the indent attribute\n// extracted from the `mso-list` style, see #getListItemData).\n//\n// @param {Object} previousItem\n// @param {Object} currentItem\n// @returns {Number}\nfunction getIndentationDifference( previousItem, currentItem ) {\n\treturn previousItem ? currentItem.indent - previousItem.indent : currentItem.indent - 1;\n}\n\n// Finds the parent list element (ul/ol) of a given list element with indentation level lower by a given value.\n//\n// @param {module:engine/view/element~Element} listElement List element from which to start looking for a parent list.\n// @param {Number} indentationDifference Indentation difference between lists.\n// @returns {module:engine/view/element~Element} Found list element with indentation level lower by a given value.\nfunction findParentListAtLevel( listElement, indentationDifference ) {\n\tconst ancestors = listElement.getAncestors( { parentFirst: true } );\n\n\tlet parentList = null;\n\tlet levelChange = 0;\n\n\tfor ( const ancestor of ancestors ) {\n\t\tif ( ancestor.name === 'ul' || ancestor.name === 'ol' ) {\n\t\t\tlevelChange++;\n\t\t}\n\n\t\tif ( levelChange === indentationDifference ) {\n\t\t\tparentList = ancestor;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn parentList;\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/googledocsnormalizer\n */\n\nimport { UpcastWriter } from 'ckeditor5/src/engine';\n\nimport removeBoldWrapper from '../filters/removeboldwrapper';\nimport { unwrapParagraphInListItem } from '../filters/list';\n\nconst googleDocsMatch = /id=(\"|')docs-internal-guid-[-0-9a-f]+(\"|')/i;\n\n/**\n * Normalizer for the content pasted from Google Docs.\n *\n * @implements module:paste-from-office/normalizer~Normalizer\n */\nexport default class GoogleDocsNormalizer {\n\t/**\n\t * Creates a new `GoogleDocsNormalizer` instance.\n\t *\n\t * @param {module:engine/view/document~Document} document View document.\n\t */\n\tconstructor( document ) {\n\t\t/**\n\t\t * @readonly\n\t\t * @type {module:engine/view/document~Document}\n\t\t */\n\t\tthis.document = document;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisActive( htmlString ) {\n\t\treturn googleDocsMatch.test( htmlString );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\texecute( data ) {\n\t\tconst writer = new UpcastWriter( this.document );\n\t\tconst { body: documentFragment } = data._parsedData;\n\n\t\tremoveBoldWrapper( documentFragment, writer );\n\t\tunwrapParagraphInListItem( documentFragment, writer );\n\n\t\tdata.content = documentFragment;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removeboldwrapper\n */\n\n/**\n * Removes `` tag wrapper added by Google Docs to a copied content.\n *\n * @param {module:engine/view/documentfragment~DocumentFragment} documentFragment element `data.content` obtained from clipboard\n * @param {module:engine/view/upcastwriter~UpcastWriter} writer\n */\nexport default function removeBoldWrapper( documentFragment, writer ) {\n\tfor ( const child of documentFragment.getChildren() ) {\n\t\tif ( child.is( 'element', 'b' ) && child.getStyle( 'font-weight' ) === 'normal' ) {\n\t\t\tconst childIndex = documentFragment.getChildIndex( child );\n\n\t\t\twriter.remove( child );\n\t\t\twriter.insertChild( childIndex, child.getChildren(), documentFragment );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/image\n */\n\n/* globals btoa */\n\nimport { Matcher, UpcastWriter } from 'ckeditor5/src/engine';\n\n/**\n * Replaces source attribute of all `` elements representing regular\n * images (not the Word shapes) with inlined base64 image representation extracted from RTF or Blob data.\n *\n * @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment on which transform images.\n * @param {String} rtfData The RTF data from which images representation will be used.\n */\nexport function replaceImagesSourceWithBase64( documentFragment, rtfData ) {\n\tif ( !documentFragment.childCount ) {\n\t\treturn;\n\t}\n\n\tconst upcastWriter = new UpcastWriter();\n\tconst shapesIds = findAllShapesIds( documentFragment, upcastWriter );\n\n\tremoveAllImgElementsRepresentingShapes( shapesIds, documentFragment, upcastWriter );\n\tremoveAllShapeElements( documentFragment, upcastWriter );\n\n\tconst images = findAllImageElementsWithLocalSource( documentFragment, upcastWriter );\n\n\tif ( images.length ) {\n\t\treplaceImagesFileSourceWithInlineRepresentation( images, extractImageDataFromRtf( rtfData ), upcastWriter );\n\t}\n}\n\n/**\n * Converts given HEX string to base64 representation.\n *\n * @protected\n * @param {String} hexString The HEX string to be converted.\n * @returns {String} Base64 representation of a given HEX string.\n */\nexport function _convertHexToBase64( hexString ) {\n\treturn btoa( hexString.match( /\\w{2}/g ).map( char => {\n\t\treturn String.fromCharCode( parseInt( char, 16 ) );\n\t} ).join( '' ) );\n}\n\n// Finds all shapes (`...`) ids. Shapes can represent images (canvas)\n// or Word shapes (which does not have RTF or Blob representation).\n//\n// @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment\n// from which to extract shape ids.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\n// @returns {Array.} Array of shape ids.\nfunction findAllShapesIds( documentFragment, writer ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapeElementsMatcher = new Matcher( {\n\t\tname: /v:(.+)/\n\t} );\n\n\tconst shapesIds = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type != 'elementStart' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst el = value.item;\n\t\tconst prevSiblingName = el.previousSibling && el.previousSibling.name || null;\n\n\t\t// If shape element have 'o:gfxdata' attribute and is not directly before `` element it means it represent Word shape.\n\t\tif ( shapeElementsMatcher.match( el ) && el.getAttribute( 'o:gfxdata' ) && prevSiblingName !== 'v:shapetype' ) {\n\t\t\tshapesIds.push( value.item.getAttribute( 'id' ) );\n\t\t}\n\t}\n\n\treturn shapesIds;\n}\n\n// Removes all `` elements which represents Word shapes and not regular images.\n//\n// @param {Array.} shapesIds Shape ids which will be checked against `` elements.\n// @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment from which to remove `` elements.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\nfunction removeAllImgElementsRepresentingShapes( shapesIds, documentFragment, writer ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst imageElementsMatcher = new Matcher( {\n\t\tname: 'img'\n\t} );\n\n\tconst imgs = [];\n\n\tfor ( const value of range ) {\n\t\tif ( imageElementsMatcher.match( value.item ) ) {\n\t\t\tconst el = value.item;\n\t\t\tconst shapes = el.getAttribute( 'v:shapes' ) ? el.getAttribute( 'v:shapes' ).split( ' ' ) : [];\n\n\t\t\tif ( shapes.length && shapes.every( shape => shapesIds.indexOf( shape ) > -1 ) ) {\n\t\t\t\timgs.push( el );\n\t\t\t// Shapes may also have empty source while content is paste in some browsers (Safari).\n\t\t\t} else if ( !el.getAttribute( 'src' ) ) {\n\t\t\t\timgs.push( el );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const img of imgs ) {\n\t\twriter.remove( img );\n\t}\n}\n\n// Removes all shape elements (`...`) so they do not pollute the output structure.\n//\n// @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment from which to remove shape elements.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\nfunction removeAllShapeElements( documentFragment, writer ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapeElementsMatcher = new Matcher( {\n\t\tname: /v:(.+)/\n\t} );\n\n\tconst shapes = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type == 'elementStart' && shapeElementsMatcher.match( value.item ) ) {\n\t\t\tshapes.push( value.item );\n\t\t}\n\t}\n\n\tfor ( const shape of shapes ) {\n\t\twriter.remove( shape );\n\t}\n}\n\n// Finds all `` elements in a given document fragment which have source pointing to local `file://` resource.\n//\n// @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment in which to look for `` elements.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\n// @returns {Object} result All found images grouped by source type.\n// @returns {Array.} result.file Array of found `` elements with `file://` source.\n// @returns {Array.} result.blob Array of found `` elements with `blob:` source.\nfunction findAllImageElementsWithLocalSource( documentFragment, writer ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst imageElementsMatcher = new Matcher( {\n\t\tname: 'img'\n\t} );\n\n\tconst imgs = [];\n\n\tfor ( const value of range ) {\n\t\tif ( imageElementsMatcher.match( value.item ) ) {\n\t\t\tif ( value.item.getAttribute( 'src' ).startsWith( 'file://' ) ) {\n\t\t\t\timgs.push( value.item );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn imgs;\n}\n\n// Extracts all images HEX representations from a given RTF data.\n//\n// @param {String} rtfData The RTF data from which to extract images HEX representation.\n// @returns {Array.} Array of found HEX representations. Each array item is an object containing:\n//\n// \t\t* {String} hex Image representation in HEX format.\n// \t\t* {string} type Type of image, `image/png` or `image/jpeg`.\nfunction extractImageDataFromRtf( rtfData ) {\n\tif ( !rtfData ) {\n\t\treturn [];\n\t}\n\n\tconst regexPictureHeader = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/;\n\tconst regexPicture = new RegExp( '(?:(' + regexPictureHeader.source + '))([\\\\da-fA-F\\\\s]+)\\\\}', 'g' );\n\tconst images = rtfData.match( regexPicture );\n\tconst result = [];\n\n\tif ( images ) {\n\t\tfor ( const image of images ) {\n\t\t\tlet imageType = false;\n\n\t\t\tif ( image.includes( '\\\\pngblip' ) ) {\n\t\t\t\timageType = 'image/png';\n\t\t\t} else if ( image.includes( '\\\\jpegblip' ) ) {\n\t\t\t\timageType = 'image/jpeg';\n\t\t\t}\n\n\t\t\tif ( imageType ) {\n\t\t\t\tresult.push( {\n\t\t\t\t\thex: image.replace( regexPictureHeader, '' ).replace( /[^\\da-fA-F]/g, '' ),\n\t\t\t\t\ttype: imageType\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n// Replaces `src` attribute value of all given images with the corresponding base64 image representation.\n//\n// @param {Array.} imageElements Array of image elements which will have its source replaced.\n// @param {Array.} imagesHexSources Array of images hex sources (usually the result of `extractImageDataFromRtf()` function).\n// The array should be the same length as `imageElements` parameter.\n// @param {module:engine/view/upcastwriter~UpcastWriter} writer\nfunction replaceImagesFileSourceWithInlineRepresentation( imageElements, imagesHexSources, writer ) {\n\t// Assume there is an equal amount of image elements and images HEX sources so they can be matched accordingly based on existing order.\n\tif ( imageElements.length === imagesHexSources.length ) {\n\t\tfor ( let i = 0; i < imageElements.length; i++ ) {\n\t\t\tconst newSrc = `data:${ imagesHexSources[ i ].type };base64,${ _convertHexToBase64( imagesHexSources[ i ].hex ) }`;\n\t\t\twriter.setAttribute( 'src', newSrc, imageElements[ i ] );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/mswordnormalizer\n */\n\nimport { transformListItemLikeElementsIntoLists } from '../filters/list';\nimport { replaceImagesSourceWithBase64 } from '../filters/image';\n\nconst msWordMatch1 = //i;\nconst msWordMatch2 = /xmlns:o=\"urn:schemas-microsoft-com/i;\n\n/**\n * Normalizer for the content pasted from Microsoft Word.\n *\n * @implements module:paste-from-office/normalizer~Normalizer\n */\nexport default class MSWordNormalizer {\n\t/**\n\t * Creates a new `MSWordNormalizer` instance.\n\t *\n\t * @param {module:engine/view/document~Document} document View document.\n\t */\n\tconstructor( document ) {\n\t\t/**\n\t\t * @readonly\n\t\t * @type {module:engine/view/document~Document}\n\t\t */\n\t\tthis.document = document;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisActive( htmlString ) {\n\t\treturn msWordMatch1.test( htmlString ) || msWordMatch2.test( htmlString );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\texecute( data ) {\n\t\tconst { body: documentFragment, stylesString } = data._parsedData;\n\n\t\ttransformListItemLikeElementsIntoLists( documentFragment, stylesString );\n\t\treplaceImagesSourceWithBase64( documentFragment, data.dataTransfer.getData( 'text/rtf' ) );\n\n\t\tdata.content = documentFragment;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/space\n */\n\n/**\n * Replaces last space preceding elements closing tag with ` `. Such operation prevents spaces from being removed\n * during further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\n * This method also takes into account Word specific `` empty tags.\n * Additionally multiline sequences of spaces and new lines between tags are removed (see #39 and #40).\n *\n * @param {String} htmlString HTML string in which spacing should be normalized.\n * @returns {String} Input HTML with spaces normalized.\n */\nexport function normalizeSpacing( htmlString ) {\n\t// Run normalizeSafariSpaceSpans() two times to cover nested spans.\n\treturn normalizeSafariSpaceSpans( normalizeSafariSpaceSpans( htmlString ) )\n\t\t// Remove all \\r\\n from \"spacerun spans\" so the last replace line doesn't strip all whitespaces.\n\t\t.replace( /([^\\S\\r\\n]*?)[\\r\\n]+([^\\S\\r\\n]*<\\/span>)/g, '$1$2' )\n\t\t.replace( /<\\/span>/g, '' )\n\t\t.replace( / <\\//g, '\\u00A0<\\/o:p>/g, '\\u00A0' )\n\t\t// Remove block filler from empty paragraph. Safari uses \\u00A0 instead of  .\n\t\t.replace( /( |\\u00A0)<\\/o:p>/g, '' )\n\t\t// Remove all whitespaces when they contain any \\r or \\n.\n\t\t.replace( />([^\\S\\r\\n]*[\\r\\n]\\s*)<' );\n}\n\n/**\n * Normalizes spacing in special Word `spacerun spans` (`\\s+`) by replacing\n * all spaces with `  ` pairs. This prevents spaces from being removed during further DOM/View processing\n * (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\n *\n * @param {Document} htmlDocument Native `Document` object in which spacing should be normalized.\n */\nexport function normalizeSpacerunSpans( htmlDocument ) {\n\thtmlDocument.querySelectorAll( 'span[style*=spacerun]' ).forEach( el => {\n\t\tconst innerTextLength = el.innerText.length || 0;\n\n\t\tel.innerHTML = Array( innerTextLength + 1 ).join( '\\u00A0 ' ).substr( 0, innerTextLength );\n\t} );\n}\n\n// Normalizes specific spacing generated by Safari when content pasted from Word (` `)\n// by replacing all spaces sequences longer than 1 space with `  ` pairs. This prevents spaces from being removed during\n// further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\n//\n// This function is similar to {@link module:clipboard/utils/normalizeclipboarddata normalizeClipboardData util} but uses\n// regular spaces /   sequence for replacement.\n//\n// @param {String} htmlString HTML string in which spacing should be normalized\n// @returns {String} Input HTML with spaces normalized.\nfunction normalizeSafariSpaceSpans( htmlString ) {\n\treturn htmlString.replace( /(\\s+)<\\/span>/g, ( fullMatch, spaces ) => {\n\t\treturn spaces.length === 1 ? ' ' : Array( spaces.length + 1 ).join( '\\u00A0 ' ).substr( 0, spaces.length );\n\t} );\n}\n","/**\n * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/parse\n */\n\n/* globals DOMParser */\n\nimport { DomConverter, ViewDocument } from 'ckeditor5/src/engine';\n\nimport { normalizeSpacing, normalizeSpacerunSpans } from './space';\n\n/**\n * Parses provided HTML extracting contents of `` and ` diff --git a/resources/ts/bo/components/CkEditorComponent.vue b/resources/ts/bo/components/CkEditorComponent.vue new file mode 100644 index 0000000..363232c --- /dev/null +++ b/resources/ts/bo/components/CkEditorComponent.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/resources/ts/bo/components/ImageInputComponent.vue b/resources/ts/bo/components/ImageInputComponent.vue new file mode 100644 index 0000000..a9398fd --- /dev/null +++ b/resources/ts/bo/components/ImageInputComponent.vue @@ -0,0 +1,962 @@ + + + + + diff --git a/resources/ts/bo/components/InputTextAutoComponent.vue b/resources/ts/bo/components/InputTextAutoComponent.vue new file mode 100644 index 0000000..92deebb --- /dev/null +++ b/resources/ts/bo/components/InputTextAutoComponent.vue @@ -0,0 +1,108 @@ + diff --git a/resources/views/bo/instant-win/index.blade.php b/resources/views/bo/instant-win/index.blade.php index dfe98db..e8c7557 100644 --- a/resources/views/bo/instant-win/index.blade.php +++ b/resources/views/bo/instant-win/index.blade.php @@ -7,5 +7,5 @@ 'instantwin' => $instant_win ] @endphp -
      +
      @endsection diff --git a/resources/views/bo/layouts/nav-menu.blade.php b/resources/views/bo/layouts/nav-menu.blade.php index 7a023ec..d07c47b 100644 --- a/resources/views/bo/layouts/nav-menu.blade.php +++ b/resources/views/bo/layouts/nav-menu.blade.php @@ -10,11 +10,11 @@ @superadmin @endsuperadmin - @endsuperadmin - @endauth - - {{-- FIXME A REMOVE ? --}} - {{-- {{ __('Social share') }} --}} diff --git a/resources/views/bo/pages/settings/edit.blade.php b/resources/views/bo/pages/settings/edit.blade.php new file mode 100644 index 0000000..1ea32e7 --- /dev/null +++ b/resources/views/bo/pages/settings/edit.blade.php @@ -0,0 +1,48 @@ +@extends('bo.layout', ['brParam' => $settingsModel]) + +@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.settings'))])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.settings'))])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
      +
      + @include('breadcrumbs.breadcrumb-body', ['brParam' => $settingsModel]) +
      +
      +
      + @csrf + @method('PUT') +
      + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('bo.pages.settings.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/settings/form-inputs.blade.php b/resources/views/bo/pages/settings/form-inputs.blade.php new file mode 100644 index 0000000..620b289 --- /dev/null +++ b/resources/views/bo/pages/settings/form-inputs.blade.php @@ -0,0 +1,538 @@ +
      + {{ __('Général') }}
      + {{ __('Paramètres généraux du jeu') }} +
      + +
      + {{-- NAME --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.name')) }} +
      +
      + @include('bo.partials.inputs.varchar', [ + 'id' => 'settingsName', + 'label' => Str::ucfirst(__('validation.attributes.name')), + 'hasWordCounter' => true, + 'name' => 'name', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __(':field du jeu', [ + 'field' => Str::ucfirst(__('validation.attributes.name')), + ]), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __(':field du jeu', [ + 'field' => Str::ucfirst(__('validation.attributes.name')), + ]), + ]) +
      +
      +
      +
      + {{-- START_DATE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.start_date')) }} +
      +
      + @include('bo.partials.inputs.timestamp-datetime', [ + 'id' => 'settingsStartDate', + 'label' => Str::ucfirst(__('validation.attributes.start_date')), + 'name' => 'start_date', + 'defaultValue' => true, + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('La date doit être supérieure ou égale à aujourd\'hui.'), + ]) +
      +
      +
      +
      + {{-- END_DATE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.end_date')) }} +
      +
      + @include('bo.partials.inputs.timestamp-datetime', [ + 'id' => 'settingsEndDate', + 'label' => Str::ucfirst(__('validation.attributes.end_date')), + 'name' => 'end_date', + 'defaultValue' => true, + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('La date doit être supérieure ou égale à aujourd\'hui.'), + ]) +
      +
      +
      +
      + {{-- NB_PARTICIPATION_PLAYER --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.nb_participation_player')) }} +
      +
      + @include('bo.partials.inputs.int-number', [ + 'id' => 'settingsNbParticipationPlayer', + 'label' => Str::ucfirst(__('validation.attributes.nb_participation_player')), + 'name' => 'nb_participation_player', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.min.numeric', [ + 'attribute' => Str::ucfirst(__('validation.attributes.nb_participation_player')), + 'min' => 0 + ]), + 'min' => 0 + ]) +
      +
      +
      +
      + {{-- NB_PARTICIPATION_IP --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.nb_participation_ip')) }} +
      +
      + @include('bo.partials.inputs.int-number', [ + 'id' => 'settingsNbParticipationIp', + 'label' => Str::ucfirst(__('validation.attributes.nb_participation_ip')), + 'name' => 'nb_participation_ip', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.min.numeric', [ + 'attribute' => Str::ucfirst(__('validation.attributes.nb_participation_ip')), + 'min' => 0 + ]), + 'min' => 0 + ]) +
      +
      +
      +
      + {{-- NB_UNIQUE_CODE_USE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.nb_unique_code_use')) }} +
      +
      + @include('bo.partials.inputs.int-number', [ + 'id' => 'settingsNbUniqueCodeUse', + 'label' => Str::ucfirst(__('validation.attributes.nb_unique_code_use')), + 'name' => 'nb_unique_code_use', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.min.numeric', [ + 'attribute' => Str::ucfirst(__('validation.attributes.nb_unique_code_use')), + 'min' => 0 + ]), + 'min' => 0 + ]) +
      +
      +
      +
      + {{-- CODE_LENGTH --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.code_length')) }} +
      +
      + @include('bo.partials.inputs.int-number', [ + 'id' => 'settingsCodeLength', + 'label' => Str::ucfirst(__('validation.attributes.code_length')), + 'name' => 'code_length', + 'required' => false, + 'disabled' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('Cette valeur ne doit pas varier en cours de jeu.'), + 'min' => 0 + ]) +
      +
      +
      +
      + {{-- USE_EAN_CODES --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.use_ean_codes')) }} +
      +
      + @include('bo.partials.inputs.tinyint-boolean', [ + 'id' => 'settingsUseEANCodes', + 'label' => Str::ucfirst(__('validation.attributes.use_ean_codes')), + 'name' => 'use_ean_codes', + 'required' => false, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.boolean', [ + 'attribute' => Str::ucfirst(__('validation.attributes.use_ean_codes')), + ]), + ]) +
      +
      +
      +
      + {{-- ACTIVATED_TEASER --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.activated_teaser')) }} +
      +
      + @include('bo.partials.inputs.tinyint-boolean', [ + 'id' => 'settingsActivatedTeaser', + 'label' => Str::ucfirst(__('validation.attributes.activated_teaser')), + 'name' => 'activated_teaser', + 'required' => false, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.boolean', [ + 'attribute' => Str::ucfirst(__('validation.attributes.activated_teaser')), + ]), + ]) +
      +
      +
      +
      + {{-- TEASER_END_ACTIVITY --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.teaser_end_activity')) }} +
      +
      + @include('bo.partials.inputs.timestamp-datetime', [ + 'id' => 'settingsTeaserEndActivity', + 'label' => Str::ucfirst(__('validation.attributes.teaser_end_activity')), + 'name' => 'teaser_end_activity', + 'defaultValue' => false, + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('La date doit être supérieure ou égale à aujourd\'hui.'), + ]) +
      +
      +
      +
      + {{-- ACTIVATED_CLOSE_PAGE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.activated_close_page')) }} +
      +
      + @include('bo.partials.inputs.tinyint-boolean', [ + 'id' => 'settingsActivatedClosePage', + 'label' => Str::ucfirst(__('validation.attributes.activated_close_page')), + 'name' => 'activated_close_page', + 'required' => false, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.boolean', [ + 'attribute' => Str::ucfirst(__('validation.attributes.activated_close_page')), + ]), + ]) +
      +
      +
      +
      + {{-- CLOSE_PAGE_ACTIVE_DATE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.close_page_active_date')) }} +
      +
      + @include('bo.partials.inputs.timestamp-datetime', [ + 'id' => 'settingsClosePageActiveDate', + 'label' => __('Page active jusqu\'au'), + 'name' => 'close_page_active_date', + 'defaultValue' => false, + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('La date doit être supérieure ou égale à aujourd\'hui.'), + ]) +
      +
      +
      +
      + {{-- REDIRECT_CLOSE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.redirect_close')) }} +
      +
      + @include('bo.partials.inputs.varchar', [ + 'id' => 'settingsRedirectClose', + 'label' => __('URL de redirection après la date de fin du jeu'), + 'hasWordCounter' => true, + 'name' => 'redirect_close', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('crud.minicrud.url'), + 'placeholder' => 'https://example.test', + ]) +
      +
      +
      +
      + {{-- WINNING_PROOF --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.winning_proof')) }} +
      +
      + @include('bo.partials.inputs.tinyint-boolean', [ + 'id' => 'settingsReductionsActivated', + 'label' => Str::ucfirst(__('validation.attributes.winning_proof')), + 'name' => 'winning_proof', + 'required' => false, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.boolean', [ + 'attribute' => Str::ucfirst(__('validation.attributes.winning_proof')), + ]), + ]) +
      +
      +
      +
      + {{-- COMPANY --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.company')) }} +
      +
      + @include('bo.partials.inputs.varchar', [ + 'id' => 'settingsCompany', + 'label' => __('Nom de la :field', [ + 'field' => Str::ucfirst(__('validation.attributes.company')), + ]), + 'hasWordCounter' => true, + 'name' => 'company', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('Nom de la :field', [ + 'field' => Str::ucfirst(__('validation.attributes.company')), + ]), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.company')), + ]), + ]) +
      +
      +
      +
      +
      + +
      +
      + {{ __('Les réductions') }}
      + {{ __('Paramétrages des bons de réduction MLDC') }} +
      + +
      + {{-- REDUCTIONS_ACTIVATED --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.reductions_activated')) }} +
      +
      + @include('bo.partials.inputs.tinyint-boolean', [ + 'id' => 'settingsReductionsActivated', + 'label' => Str::ucfirst(__('validation.attributes.reductions_activated')), + 'name' => 'reductions_activated', + 'required' => false, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.boolean', [ + 'attribute' => Str::ucfirst(__('validation.attributes.reductions_activated')), + ]), + ]) +
      +
      +
      +
      + {{-- REDUCTIONS_SITE --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.reductions_site')) }} +
      +
      + @include('bo.partials.inputs.varchar', [ + 'id' => 'settingsReductionsSite', + 'label' => __('validation.attributes.reductions_site'), + 'hasWordCounter' => true, + 'name' => 'reductions_site', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('validation.attributes.reductions_site'), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __('validation.attributes.reductions_site'), + ]) +
      +
      +
      +
      + {{-- REDUCTIONS_CAMPAIGN --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.reductions_campaign')) }} +
      +
      + @include('bo.partials.inputs.varchar', [ + 'id' => 'settingsReductionsCampaign', + 'label' => __('validation.attributes.reductions_campaign'), + 'hasWordCounter' => true, + 'name' => 'reductions_campaign', + 'required' => true, + 'model' => $settingsModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('validation.attributes.reductions_campaign'), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __('validation.attributes.reductions_campaign'), + ]) +
      +
      +
      +
      + {{-- WEB_COUPONS --}} + @php + $data = [ + 'dbdatas' => $settingsModel->web_coupons, + 'name' => 'web_coupons' + ] + @endphp +
      +
      + +
      +
      + {{ __('Destinataires des notifications de gain') }}
      + {{ __('Ces mails recevront toutes les notifications de gain.') }} +
      + +
      + {{-- NOTIFICATION_EMAILS --}} + @php + $data = [ + 'dbdatas' => $settingsModel->notification_emails, + 'name' => 'notification_emails' + ] + @endphp +
      +
      + +
      +
      + {{ __('Analytics') }}
      + {{ __('Saississez les informations permettant d\'établir des statistiques pour le jeu.') }} +
      + +
      + {{-- ANALYTICS --}} +
      +
      + {{ Str::ucfirst(__('validation.attributes.analytics')) }} +
      +
      + @include('bo.partials.inputs.int-number', [ + 'id' => 'settingsanalytics', + 'label' => Str::ucfirst(__('Site ID')), + 'name' => 'analytics', + 'required' => false, + 'model' => $settingsModel ?? null, + 'helper' => __('Insérer ici l\'id du site pour Matomo'), + 'min' => 0 + ]) +
      +
      +
      +
      +
      + +@push('scripts') + +@endpush diff --git a/resources/views/bo/pages/settings/manage.blade.php b/resources/views/bo/pages/settings/manage.blade.php new file mode 100644 index 0000000..67d6f81 --- /dev/null +++ b/resources/views/bo/pages/settings/manage.blade.php @@ -0,0 +1,350 @@ +@extends('bo.layout') + +@section('content') +
      +
      + Règlages du jeu +
      + +
      + @method('PUT') + @csrf +
      +
      +
      +
      + + +
      +
      +
      + Générale
      + Paramétres généraux du jeu +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + + + +
      + + + +
      + + + +
      + + + +
      + + + +
      + + +
      + @if ($settings->use_ean_codes === 1) + + @else + + @endif + +
      +
      + + +
      + @if ($settings->activated_teaser === 1) + + @else + + @endif + +
      +
      + + + +
      + + +
      + @if ($settings->activated_close_page === 1) + + @else + + @endif + +
      +
      + + + +
      + + + +
      + + +
      + @if ($settings->winning_proof === 1) + + @else + + @endif + +
      +
      + + + +
      +
      +
      + Les réductions
      + Paramétrages des bons de réduction MLDC +
      +
      + + + + + + + + + + + + + + + + + + +
      + + +
      + @if ($settings->reductions_activated === 1) + + @else + + @endif + +
      +
      + + + +
      + + + +
      + +
      +
      +
      + Destinataires des notifications de gain
      + Ces mails recevront toutes les notifications de gain. +
      +
      + +
      +
      + Google analytics
      + Insérer ici la clé analytics pour le jeu. +
      + + + + + +
      Clé analytics (eg: UA-XX196604-1)
      +
      +
      +
      + +
      +
      +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/bo/pages/winners-list/index.blade.php b/resources/views/bo/pages/winners-list/index.blade.php new file mode 100644 index 0000000..3b2b745 --- /dev/null +++ b/resources/views/bo/pages/winners-list/index.blade.php @@ -0,0 +1,72 @@ +@extends('bo.layout') + +@section('title', __('models.classes.winners')) +@section('description', __('Liste de tous les :model', ['model' => __('models.classes.winners')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') +
      + + @if (count($participationModels) > 0) + + @php + $cols = [ + 'created_at' => __('Date participation'), + 'prize' => __('Lot'), + 'email' => __('Email') + ]; + if ($settings->use_ean_codes === 1) { + $cols['code_ean_id'] = __('Code EAN'); + } + $cols['code_unique_id'] = __('Code unique'); + if ($settings->winning_proof === 1) { + $cols['sticker'] = __('Sticker'); + $cols['barcode'] = __('Code barre'); + $cols['ticket'] = __('Ticket'); + } + @endphp + @include('bo.modules.table-col-sorter', [ + 'cols' => $cols, + 'ignore' => ['sticker', 'barcode', 'ticket'] + ]) + + + @foreach ($participationModels as $participationModel) + + + + + @if ($settings->use_ean_codes) + + @endif + + @if ($settings->winning_proof === 1) + @if ($participationModel->sticker !== null) + + @else + + @endif + @if ($participationModel->barcode !== null) + + @else + + @endif + @if ($participationModel->ticket !== null) + + @else + + @endif + @endif + + + @endforeach + + @else + + + + @endif +
      {{ \Carbon\Carbon::parse($participationModel->created_at)->format('d/m/Y à H:i') }}{{$participationModel->instantWin()->first()->prize->label_one}}{{$participationModel->user->email}}{{$participationModel->codeEan->code}}{{$participationModel->code->code_unique}}Voir-Voir-Voir-
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.winners'))]) }}
      +{!! $participationModels->links() !!} +@endsection diff --git a/resources/views/bo/partials/inputs/int-number.blade.php b/resources/views/bo/partials/inputs/int-number.blade.php index cd2236b..efd20bd 100644 --- a/resources/views/bo/partials/inputs/int-number.blade.php +++ b/resources/views/bo/partials/inputs/int-number.blade.php @@ -32,6 +32,9 @@ @endif @if(!empty($required)) required + @endif + @if(!empty($disabled)) + disabled @endif> @if(isset($appendText)) diff --git a/resources/views/bo/winners-list/arcadia.blade.php b/resources/views/bo/winners-list/arcadia.blade.php deleted file mode 100644 index 4e73077..0000000 --- a/resources/views/bo/winners-list/arcadia.blade.php +++ /dev/null @@ -1,31 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - Envoyer le courrier à Arcadia pour {{ $participation->user->lastname }} {{ $participation->user->firstname }} - Retour -
      - -
      -
      - @csrf -
      -
      - ID CRM de l'utilisateur : {{ $crmId }} - -
      -
      -
      - - -
      - - -
      -
      -
      -@endsection diff --git a/resources/views/bo/winners-list/index.blade.php b/resources/views/bo/winners-list/index.blade.php deleted file mode 100644 index 610daa8..0000000 --- a/resources/views/bo/winners-list/index.blade.php +++ /dev/null @@ -1,60 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - Liste des gagnants -
      - -
      - - - - - - @if ($settings->use_ean_codes === 1) - - @endif - - @if ($settings->winning_proof === 1) - - - - @endif - - - - @foreach($winnersList as $winner) - - - - - @if ($settings->use_ean_codes) - - @endif - - @if ($settings->winning_proof === 1) - @if ($winner->sticker !== null) - - @else - - @endif - @if ($winner->barcode !== null) - - @else - - @endif - @if ($winner->ticket !== null) - - @else - - @endif - @endif - - - @endforeach - -
      Date participationLotEmailCode EANCode uniqueStickerCode barreTicketArcadia
      {{ \Carbon\Carbon::parse($winner->created_at)->format('d/m/Y à H:i') }}{{$winner->instantWin()->first()->prize->label_one}}{{$winner->user->email}}{{$winner->codeEan->code}}{{$winner->code->code_unique}}Voir-Voir-Voir-Envoyer
      -
      -
      -@endsection diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index 9e538b4..638ac4f 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -124,3 +124,13 @@ Breadcrumbs::for('bo.products.edit', function (Generator $trail, Product $produc $trail->parent('bo.products.index'); $trail->push(__('crud.actions.edit'), route('bo.products.edit', $product->id)); }); + +// * SETTINGS +Breadcrumbs::for('bo.settings.edit', function (Generator $trail) { + $trail->push(__('models.classes.settings'), route('bo.products.index')); +}); + +// * WINNERS LIST +Breadcrumbs::for('bo.winners-list', function (Generator $trail) { + $trail->push(__('models.classes.winners'), route('bo.winners-list')); +}); diff --git a/routes/web-bo.php b/routes/web-bo.php index 86abfcb..8697449 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -66,6 +66,11 @@ Route::prefix('bo') Route::resource('products', ProductsController::class) ->except('show') ->withoutMiddleware('is-super-admin'); + // * SETTINGS. + Route::resource('/settings', SettingsController::class) + ->only(['edit', 'update']); + // * WINNERS LIST + Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); // TODO RESTE A FAIRE :. Route::get('/', [DashboardController::class, 'index']) @@ -81,11 +86,5 @@ Route::prefix('bo') Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); - // Liste des gagnants. - Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); - Route::get('/winners-list/arcadia/{id}', [WinnersListController::class, 'courrierArcadia']) - ->name('winners-arcadia'); - Route::post('/winners-list/arcadia/{id}/send', [WinnersListController::class, 'createCourrierArcadia']) - ->name('courrier-arcadia'); }); }); From 82df7497ee5cdcbefe068fb7dc27e4a8011bafbc Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Wed, 23 Aug 2023 13:29:54 +0000 Subject: [PATCH 012/145] Fixed Dashboard --- .../Controllers/Bo/DashboardController.php | 17 ++++-- .../bo/components/DashboardChartComponent.vue | 58 +++++++++++++++++++ resources/views/bo/dashboard/index.blade.php | 51 ++++------------ 3 files changed, 82 insertions(+), 44 deletions(-) create mode 100644 resources/ts/bo/components/DashboardChartComponent.vue diff --git a/app/Http/Controllers/Bo/DashboardController.php b/app/Http/Controllers/Bo/DashboardController.php index 9e0d5c0..c68c025 100644 --- a/app/Http/Controllers/Bo/DashboardController.php +++ b/app/Http/Controllers/Bo/DashboardController.php @@ -10,6 +10,11 @@ use Illuminate\Support\Facades\DB; class DashboardController extends Controller { + /** + * Dashboard Page + * + * @return \Illuminate\Contracts\View\View + */ public function index() { // Pour les stats. @@ -20,7 +25,7 @@ class DashboardController extends Controller ->groupByRaw("DATE(created_at), user")->get(); $statsUnique = []; foreach ($participationsUniquePerDay as $participationPerDay) { - $dateUnique = Carbon::parse($participationPerDay->date)->format('d/m/Y'); + $dateUnique = $participationPerDay->date->format('d/m/Y'); $statsUnique[$dateUnique] = isset($statsUnique[$dateUnique]) ? $statsUnique[$dateUnique] + 1 : 1; } $participationsUnique = Participation::selectRaw("DISTINCT user_id AS user, COUNT(*) AS count") @@ -36,18 +41,20 @@ class DashboardController extends Controller // Tableau des dates comprises dans la table participation. foreach ($participations as $participation) { - $datesParticipations[Carbon::parse($participation->date)->format('d/m/Y')] = $participation->count; + $datesParticipations[$participation->date->format('d/m/Y')] = $participation->count; } // Création des tableaux avec toutes les dates depuis le début du jeu et le nombre de participations associées. - $date = Carbon::parse($settings->start_date); - $dateFin = now() < $settings->end_date ? Carbon::now() : Carbon::parse($settings->end_date); + $date = $settings->start_date; + $dateFin = now() < $settings->end_date ? Carbon::now() : $settings->end_date; // Récupération des 3 codes EAN les plus utilisés. $codesEan = Participation::select( DB::raw('COUNT(code_ean_id) AS nb_usage, code_ean_id') )->groupBy('code_ean_id')->orderByDesc('nb_usage')->limit(3)->get(); + + // TODO : Carbon Interval. // Génération des tableaux de date depuis le début du jeu. $dates = []; $count = []; @@ -55,7 +62,7 @@ class DashboardController extends Controller while ($dateFin > $date) { $dates[] = $date->format('d/m/Y'); $count[] = isset($datesParticipations[$date->format('d/m/Y')]) ? - $datesParticipations[$date->format('d/m/Y')] : 0; + $datesParticipations[$date->format('d/m/Y')] : 0; $countUnique[] = isset($statsUnique[$date->format('d/m/Y')]) ? $statsUnique[$date->format('d/m/Y')] : 0; $date->addDay(); } diff --git a/resources/ts/bo/components/DashboardChartComponent.vue b/resources/ts/bo/components/DashboardChartComponent.vue new file mode 100644 index 0000000..7875003 --- /dev/null +++ b/resources/ts/bo/components/DashboardChartComponent.vue @@ -0,0 +1,58 @@ + + + diff --git a/resources/views/bo/dashboard/index.blade.php b/resources/views/bo/dashboard/index.blade.php index c79a87a..ac7d31a 100644 --- a/resources/views/bo/dashboard/index.blade.php +++ b/resources/views/bo/dashboard/index.blade.php @@ -2,17 +2,17 @@ @section('content')
      -

      Tableau de bord

      +

      {{ __('Dashboard') }}

      {{ __('Accéder au jeu')}}

      - Nombre de participations total : {{ $totalParticipation }}
      - Nombre de participations moyenne par joueur : {{ $avgParticipUser }}
      + {{ __('Nombre de participations total') }} : {{ $totalParticipation }}
      + {{ __('Nombre de participations moyenne par joueur') }} : {{ $avgParticipUser }}
      @if ($settings->use_ean_codes === 1) - Top 3 des codes EAN les plus utilisés : + {{ __('Top 3 des codes EAN les plus utilisés') }} :

        @foreach ($codesEan as $codeEan)
      • {{ $codeEan->code_ean_value }} : {{ $codeEan->nb_usage }}
      • @@ -21,39 +21,12 @@ @endif


        - + @php + $data = [ + 'dates' => $dates, + 'count' => $count, + 'countUnique' => $countUnique + ] + @endphp +
        @endsection - -@push('scripts') - -@endpush From bc477627b38b1162defc1db690cd31aeb63f4385 Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Wed, 23 Aug 2023 13:48:25 +0000 Subject: [PATCH 013/145] Updated InstantWin Component/Controller --- .../Controllers/Bo/InstantWinController.php | 39 +++- package.json | 1 - .../ts/bo/components/InstantWinComponent.vue | 194 ++++++++---------- resources/ts/utilities/fontawesome.ts | 7 +- 4 files changed, 122 insertions(+), 119 deletions(-) diff --git a/app/Http/Controllers/Bo/InstantWinController.php b/app/Http/Controllers/Bo/InstantWinController.php index 16b00ae..c77f986 100644 --- a/app/Http/Controllers/Bo/InstantWinController.php +++ b/app/Http/Controllers/Bo/InstantWinController.php @@ -9,7 +9,12 @@ use App\Models\Settings; class InstantWinController extends Controller { - public function index() + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\View\View + */ + public function index(): \Illuminate\Contracts\View\View { $nbInstantWin = InstantWin::count(); $canGenerate = 0; @@ -33,14 +38,17 @@ class InstantWinController extends Controller ]); } + /** + * Returns generated instant win. + * + * @return string|false + */ public function instantWinGenerate() { $start_date = Settings::latest()->value("start_date"); $end_date = Settings::latest()->value("end_date"); $lots = Prize::all(); - - $begin = new \DateTime($start_date); $end = new \DateTime($end_date); $interval = new \DateInterval('P1D'); @@ -48,8 +56,6 @@ class InstantWinController extends Controller $dateGlobal = []; $lotsGlobal = []; - - foreach ($lots as $k => $lot) { for ($i = 0; $i < $lot->quantity; $i++) { $lotsGlobal[] = [ @@ -80,9 +86,15 @@ class InstantWinController extends Controller return json_encode($instantWins); } - - - private function generate($lotsGlobal, $dateGlobal, $lotsDone) + /** + * Generate instant win. + * + * @param array $lotsGlobal + * @param array $dateGlobal + * @param integer $lotsDone + * @return array + */ + private function generate(array $lotsGlobal, array $dateGlobal, int $lotsDone): array { $rKey = array_rand($dateGlobal, 1); if ($lotsDone < count($dateGlobal)) { @@ -100,9 +112,14 @@ class InstantWinController extends Controller return $dateGlobal; } - - - private function sortFunction($a, $b) + /** + * Callback to sort 2 items by their hour. + * + * @param array $a + * @param array $b + * @return integer|float + */ + private function sortFunction(array $a, array $b): int|float { return strtotime($a["hour"]) - strtotime($b["hour"]); } diff --git a/package.json b/package.json index 6e70de4..99185ab 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "ts-loader": "^9.3.1", "typescript": "^4.9.5", "typescript-eslint": "^0.0.1-alpha.0", - "v-clipboard": "^3.0.0-next.1", "vite": "^4.0.0", "vite-plugin-checker": "^0.5.6", "vite-plugin-eslint": "^1.8.1", diff --git a/resources/ts/bo/components/InstantWinComponent.vue b/resources/ts/bo/components/InstantWinComponent.vue index 50c4d76..76fa2ff 100644 --- a/resources/ts/bo/components/InstantWinComponent.vue +++ b/resources/ts/bo/components/InstantWinComponent.vue @@ -1,136 +1,113 @@ -@endpush diff --git a/resources/views/bo/codes/search.blade.php b/resources/views/bo/codes/search.blade.php deleted file mode 100644 index 72c3836..0000000 --- a/resources/views/bo/codes/search.blade.php +++ /dev/null @@ -1,22 +0,0 @@ -@extends('bo.layout') - -@section('content') -
        -
        - {{ __('Gestion des codes uniques') }} - {{ __('Recherche de code unique') }} - @include('bo.codes.search-form') -
        -
        - @if(!$code) - {{ __('Veuillez entrer un code ci-dessus pour en obtenir les informations.') }} - @else -

        {{ __('Voici l\'état du code trouvé') }}

        -

        {{ __('Code : :code', ['code' => request()->code]) }}

        -

        {{ __('ID : :id', ['id' => $code->id]) }}

        -

        {{ __('Utilisé ? : :used', ['used' => $code->code_used ? 'OUI' : 'NON']) }}

        -

        {{ __('Exporté ? : :exported', ['exported' => $code->code_exported ? 'OUI' : 'NON']) }}

        -

        {{ __('Créé le : :date_creation', ['date_creation' => $code->date_creation]) }}

        - @endif -
        -
        -@endsection diff --git a/resources/views/bo/pages/codes/form-inputs.blade.php b/resources/views/bo/pages/codes/form-inputs.blade.php new file mode 100644 index 0000000..126ed45 --- /dev/null +++ b/resources/views/bo/pages/codes/form-inputs.blade.php @@ -0,0 +1,56 @@ +
        + {{-- QUANTITY --}} +
        +
        + {{ __('Nombre de codes à générer') }} +
        +
        + @include('bo.partials.inputs.int-number', [ + 'id' => 'codeGenerationQuantity', + 'label' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.quantity')), + ]), + 'name' => 'quantity', + 'required' => true, + 'model' => null, + 'helper' => __('validation.min.numeric', [ + 'attribute' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.quantity')), + ]), + 'min' => 1 + ]), + 'min' => 1 + ]) +
        +
        +
        +
        + {{-- CODE_LENGTH --}} +
        +
        + {{ __('Longueur des codes') }} +
        +
        + @include('bo.partials.inputs.int-number', [ + 'id' => 'codeGenerationLength', + 'label' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.code_length')), + ]), + 'name' => 'code_length', + 'required' => true, + 'readonly' => true, + 'value' => $settings->code_length ?? config('codes.codeLength'), + 'model' => null, + 'helper' => __('validation.min.numeric', [ + 'attribute' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.code_length')), + ]), + 'min' => 1 + ]), + 'min' => 1 + ]) +
        +
        +
        +
        +
        diff --git a/resources/views/bo/pages/codes/index.blade.php b/resources/views/bo/pages/codes/index.blade.php new file mode 100644 index 0000000..540db4a --- /dev/null +++ b/resources/views/bo/pages/codes/index.blade.php @@ -0,0 +1,100 @@ +@extends('bo.layout') + +@section('content') +@section('content') +
        + @include('breadcrumbs.breadcrumb-body') + +
        +@include('bo.pages.codes.search-form') +
        +
        + @csrf +
        +

        {{__('Nombre de code(s)') }}

        +
          +
        • {{ __('en base') }} : {{$nbCodeBase}}
        • +
        • {{ __('utilisé(s)') }} : {{$nbCodeUsed}}
        • +
        • {{ __('déjà exporté(s)') }} : {{ $nbCodeExported }}
        • +
        • {{ __('restant à exporté(s)') }} : {{$nbCodeRemainingToExport}}
        • +
        +
        + @include('bo.pages.codes.form-inputs') + {{ __('Il est possible de générer') }} 0 {{ __('codes uniques.') }}
        + {{ __('!! Si la longueur des codes est changé l\'export pourra prendre plus de temps. !!') }} +
        + +
        + + + +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/bo/codes/search-form.blade.php b/resources/views/bo/pages/codes/search-form.blade.php similarity index 100% rename from resources/views/bo/codes/search-form.blade.php rename to resources/views/bo/pages/codes/search-form.blade.php diff --git a/resources/views/bo/pages/codes/search.blade.php b/resources/views/bo/pages/codes/search.blade.php new file mode 100644 index 0000000..92919e0 --- /dev/null +++ b/resources/views/bo/pages/codes/search.blade.php @@ -0,0 +1,19 @@ +@extends('bo.layout') + +@section('content') +
        + @include('breadcrumbs.breadcrumb-body') +
        +@include('bo.pages.codes.search-form') +
        +@if(!$code) +{{ __('Veuillez entrer un code ci-dessus pour en obtenir les informations.') }} +@else +

        {{ __('Voici l\'état du code trouvé') }}

        +

        {{ __('Code : :code', ['code' => request()->code]) }}

        +

        {{ __('ID : :id', ['id' => $code->id]) }}

        +

        {{ __('Utilisé ? : :used', ['used' => $code->code_used ? 'OUI' : 'NON']) }}

        +

        {{ __('Exporté ? : :exported', ['exported' => $code->code_exported ? 'OUI' : 'NON']) }}

        +

        {{ __('Créé le : :date_creation', ['date_creation' => $code->date_creation]) }}

        +@endif +@endsection diff --git a/resources/views/bo/partials/inputs/int-number.blade.php b/resources/views/bo/partials/inputs/int-number.blade.php index efd20bd..b2781b7 100644 --- a/resources/views/bo/partials/inputs/int-number.blade.php +++ b/resources/views/bo/partials/inputs/int-number.blade.php @@ -35,6 +35,9 @@ @endif @if(!empty($disabled)) disabled + @endif + @if(!empty($readonly)) + readonly @endif> @if(isset($appendText)) diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index 638ac4f..8237f44 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -134,3 +134,12 @@ Breadcrumbs::for('bo.settings.edit', function (Generator $trail) { Breadcrumbs::for('bo.winners-list', function (Generator $trail) { $trail->push(__('models.classes.winners'), route('bo.winners-list')); }); + +// * UNIQUES CODES +Breadcrumbs::for('bo.codes', function (Generator $trail) { + $trail->push(__('models.classes.codes'), route('bo.codes')); +}); +Breadcrumbs::for('bo.codes.search', function (Generator $trail) { + $trail->parent('bo.codes'); + $trail->push(__('crud.actions.show'), route('bo.codes')); +}); diff --git a/routes/web-bo.php b/routes/web-bo.php index 8697449..27468dd 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -36,6 +36,8 @@ Route::prefix('bo') }); Route::middleware(['auth:backend', 'is-admin', 'is-super-admin']) ->group(function () { + Route::get('/', [DashboardController::class, 'index']) + ->name('dashboard')->withoutMiddleware('is-super-admin'); // * BANNED IPS Route::resource('/bannedips', BannedIpController::class)->except('show'); // * CODES EAN @@ -71,17 +73,10 @@ Route::prefix('bo') ->only(['edit', 'update']); // * WINNERS LIST Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); - - // TODO RESTE A FAIRE :. - Route::get('/', [DashboardController::class, 'index']) - ->name('dashboard')->withoutMiddleware('is-super-admin'); - // Réglages. - Route::match(['get', 'put'], '/settings', [SettingsController::class, 'manage']) - ->name('settings'); - // Instants gagnants. + // * INSTANT WIN Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); - // Codes uniques. + // * UNIQUES CODES. Route::get('/codes', [CodesController::class, 'index'])->name('codes'); Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); From 4113e2254a51e73a8fe1e761a8cfb914bd68dce1 Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Thu, 24 Aug 2023 13:00:43 +0200 Subject: [PATCH 015/145] Some fixes, docblocks, style, cleaning ... Added a footer --- app/Console/Commands/ExportCodesUniques.php | 3 +- app/Console/Commands/UserCreate.php | 12 +- app/Http/Controllers/Bo/CodesController.php | 12 +- .../Controllers/Bo/CodesEANController.php | 159 ------- app/Http/Controllers/Bo/ContentController.php | 9 +- .../Controllers/Bo/DashboardController.php | 16 +- .../Controllers/Bo/FaqThemesController.php | 9 +- .../Controllers/Bo/InstantWinController.php | 2 +- app/Http/Controllers/EnterCodeController.php | 2 +- .../Bo/CodesEan/StoreCodeEanRequest.php | 49 --- .../Bo/CodesEan/UpdateCodeEanRequest.php | 23 - app/Http/Requests/ParticipateRequest.php | 11 +- app/Models/BannedIp.php | 5 + app/Models/Code.php | 20 +- app/Models/CodeEan.php | 31 -- app/Models/Content.php | 8 + app/Models/Customer.php | 27 ++ app/Models/FaqQuestion.php | 10 + app/Models/FaqTheme.php | 11 + app/Models/GainView.php | 17 +- app/Models/InstantWin.php | 9 + app/Models/Participation.php | 37 +- app/Models/Prize.php | 35 +- app/Models/Product.php | 27 ++ app/Models/Range.php | 14 + app/Models/Reduction.php | 11 + app/Models/Settings.php | 27 ++ app/Models/User.php | 30 +- config/google.php | 5 - .../2014_10_12_000000_create_users_table.php | 3 - .../2020_10_20_171937_create_code_eans.php | 33 -- ...23_08_22_091935_create_participations.php} | 2 +- ...2023_08_22_120243_create_instant_wins.php} | 0 database/seeders/SettingsSeeder.php | 1 - resources/lang/fr/models.php | 1 - resources/sass/bo/base/_common.scss | 4 + resources/views/bo/layout.blade.php | 5 +- resources/views/bo/layouts/footer.blade.php | 8 + resources/views/bo/layouts/nav-menu.blade.php | 78 ++-- .../views/bo/modules/search-bar.blade.php | 2 +- .../views/bo/pages/codes-ean/create.blade.php | 46 -- .../views/bo/pages/codes-ean/edit.blade.php | 62 --- .../bo/pages/codes-ean/form-inputs.blade.php | 76 ---- .../views/bo/pages/codes-ean/index.blade.php | 66 --- .../bo/{ => pages}/dashboard/index.blade.php | 2 +- .../{ => pages}/instant-win/index.blade.php | 0 .../views/bo/pages/prizes/index.blade.php | 6 +- .../bo/pages/ranges/form-inputs.blade.php | 1 - .../views/bo/pages/settings/manage.blade.php | 350 --------------- .../bo/pages/winners-list/index.blade.php | 4 +- resources/views/bo/products/create.blade.php | 27 -- resources/views/bo/products/edit.blade.php | 30 -- resources/views/bo/products/index.blade.php | 66 --- .../views/bo/products/input-forms.blade.php | 38 -- resources/views/bo/ranges/create.blade.php | 27 -- resources/views/bo/ranges/edit.blade.php | 30 -- resources/views/bo/ranges/index.blade.php | 52 --- .../views/bo/ranges/input-forms.blade.php | 15 - resources/views/bo/settings/manage.blade.php | 401 ------------------ .../breadcrumbs/breadcrumb-body.blade.php | 4 +- .../breadcrumbs/breadcrumb-head.blade.php | 9 +- .../breadcrumbs/breadcrumb-layout.blade.php | 30 +- .../views/front/basic_example/gain1.blade.php | 2 +- .../notif-win-admin-email.blade.php | 4 +- resources/views/re7.blade.php | 2 +- routes/breadcrumbs-bo.php | 14 - routes/web-bo.php | 5 - routes/web-fo.php | 3 +- 68 files changed, 382 insertions(+), 1758 deletions(-) delete mode 100644 app/Http/Controllers/Bo/CodesEANController.php delete mode 100644 app/Http/Requests/Bo/CodesEan/StoreCodeEanRequest.php delete mode 100644 app/Http/Requests/Bo/CodesEan/UpdateCodeEanRequest.php delete mode 100644 app/Models/CodeEan.php delete mode 100644 config/google.php delete mode 100644 database/migrations/2020_10_20_171937_create_code_eans.php rename database/migrations/{2020_10_28_091935_create_participations.php => 2023_08_22_091935_create_participations.php} (92%) rename database/migrations/{2020_10_29_120243_create_instant_wins.php => 2023_08_22_120243_create_instant_wins.php} (100%) create mode 100644 resources/views/bo/layouts/footer.blade.php delete mode 100644 resources/views/bo/pages/codes-ean/create.blade.php delete mode 100644 resources/views/bo/pages/codes-ean/edit.blade.php delete mode 100644 resources/views/bo/pages/codes-ean/form-inputs.blade.php delete mode 100644 resources/views/bo/pages/codes-ean/index.blade.php rename resources/views/bo/{ => pages}/dashboard/index.blade.php (95%) rename resources/views/bo/{ => pages}/instant-win/index.blade.php (100%) delete mode 100644 resources/views/bo/pages/settings/manage.blade.php delete mode 100644 resources/views/bo/products/create.blade.php delete mode 100644 resources/views/bo/products/edit.blade.php delete mode 100644 resources/views/bo/products/index.blade.php delete mode 100644 resources/views/bo/products/input-forms.blade.php delete mode 100644 resources/views/bo/ranges/create.blade.php delete mode 100644 resources/views/bo/ranges/edit.blade.php delete mode 100644 resources/views/bo/ranges/index.blade.php delete mode 100644 resources/views/bo/ranges/input-forms.blade.php delete mode 100644 resources/views/bo/settings/manage.blade.php diff --git a/app/Console/Commands/ExportCodesUniques.php b/app/Console/Commands/ExportCodesUniques.php index b9024b5..bb4056d 100644 --- a/app/Console/Commands/ExportCodesUniques.php +++ b/app/Console/Commands/ExportCodesUniques.php @@ -4,7 +4,6 @@ namespace App\Console\Commands; use App\Mail\ExportCodesUniques as MailExportCodesUniques; use App\Models\Code; -use App\Models\Settings; use Illuminate\Console\Command; use Illuminate\Support\Facades\Mail; @@ -109,7 +108,7 @@ class ExportCodesUniques extends Command // Envoi de mail à MAIL_ADMIN avec le nom du ZIP "CodesUniques_". date('dmY') .".zip" . Mail::to(config('mail.MAIL_ADMIN')) - ->send(new MailExportCodesUniques(app(Settings::class)->name, $nbCodeFic, $nbCodeTot, $nbCodeLigne)); + ->send(new MailExportCodesUniques($nbCodeFic, $nbCodeTot, $nbCodeLigne)); return 0; } diff --git a/app/Console/Commands/UserCreate.php b/app/Console/Commands/UserCreate.php index ce74442..b14d954 100644 --- a/app/Console/Commands/UserCreate.php +++ b/app/Console/Commands/UserCreate.php @@ -200,16 +200,16 @@ class UserCreate extends Command try { $tmp = $this->choice( 'Select his role', - [RoleEnum::conceptor()->label, RoleEnum::admin()->label], - RoleEnum::admin()->label, + [RoleEnum::conceptor->label(), RoleEnum::admin->label()], + RoleEnum::admin->label(), $maxAttempts = null, $allowMultipleSelections = false ); - if ($tmp === RoleEnum::conceptor()->label) { - $tmp = RoleEnum::conceptor(); + if ($tmp === RoleEnum::conceptor->label()) { + $tmp = RoleEnum::conceptor; } - if ($tmp === RoleEnum::admin()->label) { - $tmp = RoleEnum::admin(); + if ($tmp === RoleEnum::admin->label()) { + $tmp = RoleEnum::admin; } $validator = Validator::make(['role' => $tmp], [ 'role' => 'required' diff --git a/app/Http/Controllers/Bo/CodesController.php b/app/Http/Controllers/Bo/CodesController.php index a0c8608..1a2a4b7 100644 --- a/app/Http/Controllers/Bo/CodesController.php +++ b/app/Http/Controllers/Bo/CodesController.php @@ -17,9 +17,9 @@ class CodesController extends Controller /** * Show code form to generate and export * - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return \Illuminate\Contracts\View\View */ - public function index() + public function index(): \Illuminate\Contracts\View\View { $settings = Settings::first(); $nbCodeBase = Code::count(); @@ -41,7 +41,7 @@ class CodesController extends Controller * @param GenerateCodesRequest $request * @return \Illuminate\Http\RedirectResponse */ - public function generate(GenerateCodesRequest $request) + public function generate(GenerateCodesRequest $request): \Illuminate\Http\RedirectResponse { ProcessUniqueCode::dispatch( $request->quantity, @@ -61,7 +61,7 @@ class CodesController extends Controller * @param ExportCodesRequest $request * @return \Illuminate\Http\RedirectResponse */ - public function export(ExportCodesRequest $request) + public function export(ExportCodesRequest $request): \Illuminate\Http\RedirectResponse { ProcessExportCodesUniques::dispatch( intval($request->nb_code_fic), @@ -80,9 +80,9 @@ class CodesController extends Controller * Search for a specific code. * * @param CodeSearchRequest $request - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return \Illuminate\Contracts\View\View */ - public function search(CodeSearchRequest $request) + public function search(CodeSearchRequest $request): \Illuminate\Contracts\View\View { $code = null; try { diff --git a/app/Http/Controllers/Bo/CodesEANController.php b/app/Http/Controllers/Bo/CodesEANController.php deleted file mode 100644 index 11c14cd..0000000 --- a/app/Http/Controllers/Bo/CodesEANController.php +++ /dev/null @@ -1,159 +0,0 @@ -search; - if ($search) { - $this->searchQuery( - $codeEanModels, - $search, - null, - 'code', - 'product' - ); - } - $searchFields = \sprintf( - '%s, %s', - Str::ucfirst(__('validation.attributes.code')), - Str::ucfirst(__('validation.attributes.product')) - ); - - /** Sort columns with a query */ - $this->sortQuery($codeEanModels); - - /** Custom pagination */ - $codeEanModels = $this->customPaginate($codeEanModels, $request->pagination); - - return view('bo.pages.codes-ean.index', compact('codeEanModels', 'search', 'searchFields')); - } - - /** - * Show the form for creating a new resource. - * - * @param \App\Models\CodeEan $codeEan - * @return \Illuminate\Contracts\View\View - */ - public function create(CodeEan $codeEan): \Illuminate\Contracts\View\View - { - return view('bo.pages.codes-ean.create', [ - 'codeEanModel' => $codeEan, - ]); - } - - /** - * Store a newly created resource in storage. - * - * @param \App\Http\Requests\Bo\CodesEan\StoreCodeEanRequest $request - * @return \Illuminate\Http\RedirectResponse - */ - public function store(StoreCodeEanRequest $request): \Illuminate\Http\RedirectResponse - { - return DB::transaction(function () use ($request) { - $codeEan = new CodeEan(); - $codeEan->fill($request->validated()); - if ($codeEan->saveOrFail()) { - return redirect() - ->route('bo.code-eans.edit', $codeEan) - ->with('success', trans( - 'crud.messages.has_been_created', - ['model' => \trans_choice('models.classes.codes-ean', 1)] - )); - } - return redirect() - ->back() - ->with('error', trans( - 'crud.messages.cannot_be_created', - ['model' => \trans_choice('models.classes.codes-ean', 1)] - )); - }); - } - - /** - * Show the form for editing the specified resource. - * - * @param \App\Models\CodeEan $codeEan - * @return \Illuminate\Contracts\View\View - */ - public function edit(CodeEan $codeEan): \Illuminate\Contracts\View\View - { - return view('bo.pages.codes-ean.edit', [ - 'codeEanModel' => $codeEan, - ]); - } - - /** - * Update the specified resource in storage. - * - * @param \App\Http\Requests\Bo\CodesEan\UpdateCodeEanRequest $request - * @param \App\Models\CodeEan $codeEan - * @return \Illuminate\Http\RedirectResponse - */ - public function update(UpdateCodeEanRequest $request, CodeEan $codeEan): \Illuminate\Http\RedirectResponse - { - return DB::transaction(function () use ($request, $codeEan) { - $codeEan->fill($request->validated()); - if ($codeEan->saveOrFail()) { - return redirect() - ->route('bo.code-eans.edit', $codeEan) - ->with('success', trans( - 'crud.messages.has_been_updated', - ['model' => trans_choice('models.classes.codes-ean', 1)] - )); - } - return redirect() - ->back() - ->with('error', trans( - 'crud.messages.cannot_be_updated', - ['model' => trans_choice('models.classes.codes-ean', 1)] - )); - }); - } - - /** - * Remove the specified resource from storage. - * - * @param \App\Models\CodeEan $codeEan - * @return \Illuminate\Http\RedirectResponse - */ - public function destroy(CodeEan $codeEan): \Illuminate\Http\RedirectResponse - { - return DB::transaction(function () use ($codeEan) { - if ($codeEan->deleteOrFail()) { - return redirect() - ->route('bo.code-eans.index') - ->with('success', __( - 'crud.messages.has_been_deleted', - ['model' => trans_choice('models.classes.codes-ean', 1)] - )); - } - return redirect() - ->back() - ->with('error', __( - ':crud.messages.cannot_be_deleted', - ['model' => trans_choice('models.classes.codes-ean', 1)] - )); - }); - } -} diff --git a/app/Http/Controllers/Bo/ContentController.php b/app/Http/Controllers/Bo/ContentController.php index 4f1c03e..1453ffd 100644 --- a/app/Http/Controllers/Bo/ContentController.php +++ b/app/Http/Controllers/Bo/ContentController.php @@ -29,10 +29,15 @@ class ContentController extends Controller $contentModels, $search, null, - 'ip', + 'key', + 'value' ); } - $searchFields = trans('validation.attributes.ip'); + $searchFields = \sprintf( + '%s, %s', + trans('validation.attributes.name'), + trans('validation.attributes.value'), + ); /** Sort columns with a query */ $this->sortQuery($contentModels); diff --git a/app/Http/Controllers/Bo/DashboardController.php b/app/Http/Controllers/Bo/DashboardController.php index c68c025..bd40941 100644 --- a/app/Http/Controllers/Bo/DashboardController.php +++ b/app/Http/Controllers/Bo/DashboardController.php @@ -15,20 +15,20 @@ class DashboardController extends Controller * * @return \Illuminate\Contracts\View\View */ - public function index() + public function index(): \Illuminate\Contracts\View\View { // Pour les stats. $settings = app(Settings::class); $participations = Participation::selectRaw("COUNT(*) AS count, DATE(created_at) AS date") ->groupByRaw("DATE(created_at)")->get(); - $participationsUniquePerDay = Participation::selectRaw("DISTINCT user_id AS user, COUNT(*) AS count, DATE(created_at) AS date") + $participationsUniquePerDay = Participation::selectRaw("DISTINCT customer_id AS user, COUNT(*) AS count, DATE(created_at) AS date") ->groupByRaw("DATE(created_at), user")->get(); $statsUnique = []; foreach ($participationsUniquePerDay as $participationPerDay) { - $dateUnique = $participationPerDay->date->format('d/m/Y'); + $dateUnique = Carbon::parse($participationPerDay->date)->format('d/m/Y'); $statsUnique[$dateUnique] = isset($statsUnique[$dateUnique]) ? $statsUnique[$dateUnique] + 1 : 1; } - $participationsUnique = Participation::selectRaw("DISTINCT user_id AS user, COUNT(*) AS count") + $participationsUnique = Participation::selectRaw("DISTINCT customer_id AS user, COUNT(*) AS count") ->groupBy("user")->orderBy("user")->get(); // Données calculées à afficher. @@ -41,7 +41,7 @@ class DashboardController extends Controller // Tableau des dates comprises dans la table participation. foreach ($participations as $participation) { - $datesParticipations[$participation->date->format('d/m/Y')] = $participation->count; + $datesParticipations[Carbon::parse($participation->date)->format('d/m/Y')] = $participation->count; } // Création des tableaux avec toutes les dates depuis le début du jeu et le nombre de participations associées. @@ -50,8 +50,8 @@ class DashboardController extends Controller // Récupération des 3 codes EAN les plus utilisés. $codesEan = Participation::select( - DB::raw('COUNT(code_ean_id) AS nb_usage, code_ean_id') - )->groupBy('code_ean_id')->orderByDesc('nb_usage')->limit(3)->get(); + DB::raw('COUNT(product_id) AS nb_usage, product_id') + )->groupBy('product_id')->orderByDesc('nb_usage')->limit(3)->get(); // TODO : Carbon Interval. @@ -67,7 +67,7 @@ class DashboardController extends Controller $date->addDay(); } - return view('bo.dashboard.index', compact( + return view('bo.pages.dashboard.index', compact( 'dates', 'count', 'countUnique', diff --git a/app/Http/Controllers/Bo/FaqThemesController.php b/app/Http/Controllers/Bo/FaqThemesController.php index 162f9f0..8c9da64 100644 --- a/app/Http/Controllers/Bo/FaqThemesController.php +++ b/app/Http/Controllers/Bo/FaqThemesController.php @@ -30,15 +30,10 @@ class FaqThemesController extends Controller $faqThemeModels, $search, null, - 'question', - 'answer' + 'name', ); } - $searchFields = \sprintf( - '%s, %s ...', - Str::ucfirst(__('validation.attributes.question')), - __('validation.attributes.answer'), - ); + $searchFields = Str::ucfirst(__('validation.attributes.name')); /** Sort columns with a query */ $this->sortQuery($faqThemeModels); diff --git a/app/Http/Controllers/Bo/InstantWinController.php b/app/Http/Controllers/Bo/InstantWinController.php index c77f986..361a7dc 100644 --- a/app/Http/Controllers/Bo/InstantWinController.php +++ b/app/Http/Controllers/Bo/InstantWinController.php @@ -32,7 +32,7 @@ class InstantWinController extends Controller $instantWin = InstantWin::orderBy('appear_date')->get(); - return view('bo.instant-win.index', [ + return view('bo.pages.instant-win.index', [ 'can_generate' => $canGenerate, 'instant_win' => $instantWin ]); diff --git a/app/Http/Controllers/EnterCodeController.php b/app/Http/Controllers/EnterCodeController.php index 4567845..fe5f0d0 100644 --- a/app/Http/Controllers/EnterCodeController.php +++ b/app/Http/Controllers/EnterCodeController.php @@ -178,7 +178,7 @@ class EnterCodeController extends Controller Mail::to($mail->email)->send(new NotifWinAdmin($settings, $participation)); } $participation->save(); - return view("front.basic." . $instantWin->prize->gain_view->file_name, compact('settings')) + return view("front.basic." . $instantWin->prize->gainView->file_name, compact('settings')) ->with('prize', $instantWin->prize); } diff --git a/app/Http/Requests/Bo/CodesEan/StoreCodeEanRequest.php b/app/Http/Requests/Bo/CodesEan/StoreCodeEanRequest.php deleted file mode 100644 index c34e88d..0000000 --- a/app/Http/Requests/Bo/CodesEan/StoreCodeEanRequest.php +++ /dev/null @@ -1,49 +0,0 @@ -check(); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'code' => [ - 'required', - 'numeric', - 'unique:code_eans,code', - 'regex:/^[0-9]{7}$|^[0-9]{8}$|^[0-9]{13}$/', - ], - 'product' => 'required|string|min:3|max:255', - ]; - } - - /** - * Get custom attributes for validator errors. - * - * @return array - */ - public function attributes(): array - { - return [ - 'code' => trans('Code EAN'), - 'product' => trans('Produit'), - ]; - } -} diff --git a/app/Http/Requests/Bo/CodesEan/UpdateCodeEanRequest.php b/app/Http/Requests/Bo/CodesEan/UpdateCodeEanRequest.php deleted file mode 100644 index 7ef29d4..0000000 --- a/app/Http/Requests/Bo/CodesEan/UpdateCodeEanRequest.php +++ /dev/null @@ -1,23 +0,0 @@ - [ - 'required', - 'numeric', - 'unique:code_eans,code,' . $this->route('code_ean')->id . ',id', - 'regex:/^[0-9]{7}$|^[0-9]{8}$|^[0-9]{13}$/', - ], - ]); - } -} diff --git a/app/Http/Requests/ParticipateRequest.php b/app/Http/Requests/ParticipateRequest.php index d65a3c1..e9d24b3 100644 --- a/app/Http/Requests/ParticipateRequest.php +++ b/app/Http/Requests/ParticipateRequest.php @@ -5,6 +5,7 @@ namespace App\Http\Requests; use App\Models\Code; use App\Models\CodeEan; use App\Models\Participation; +use App\Models\Product; use App\Models\Settings; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Validator; @@ -50,10 +51,10 @@ class ParticipateRequest extends FormRequest ], $this->attributes()); // * Union pour faire des recherches séparée en une seule requête. - /** @var \App\Models\CodeEan|null */ - $codeEan = CodeEan::where('code', $this->code_ean) - ->union(CodeEan::where('code', Str::limit($this->code_ean, 8, ''))) - ->union(CodeEan::where('code', Str::limit($this->code_ean, 7, ''))) + /** @var \App\Models\Product|null */ + $codeEan = Product::where('code_ean', $this->code_ean) + ->union(Product::where('code_ean', Str::limit($this->code_ean, 8, ''))) + ->union(Product::where('code_ean', Str::limit($this->code_ean, 7, ''))) ->first() ?? false; $this->merge(['code_ean' => $codeEan]); @@ -135,7 +136,7 @@ class ParticipateRequest extends FormRequest 'required', // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed function ($attribute, $value, $fail) { - if (!\is_object($value) or \get_class($value) !== CodeEan::class) { + if (!\is_object($value) or \get_class($value) !== Product::class) { $fail('Le code barre entré est incorrect, veuillez réessayer.'); } } diff --git a/app/Models/BannedIp.php b/app/Models/BannedIp.php index 150b0a3..7bf6e05 100644 --- a/app/Models/BannedIp.php +++ b/app/Models/BannedIp.php @@ -4,6 +4,11 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * BannedIp. + * + * @property integer $ip IP. + */ class BannedIp extends Model { /** diff --git a/app/Models/Code.php b/app/Models/Code.php index 4f79b45..deb2a58 100644 --- a/app/Models/Code.php +++ b/app/Models/Code.php @@ -5,6 +5,21 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Kwaadpepper\Serial\SerialCaster; +/** + * Code. + * + * @property boolean $code_used Is the code used ? + * @property boolean $code_exported Is the code exported ? + * @property \Illuminate\Support\Carbon $date_creation Date of creation. + * + * @property-read string|null $code_unique The unique code + * + * @method public static function intToSerial($int) Generate a serial from an int. + * @method public static function serialToInt($serial) Get an int from a serial. + * + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Participation[] $participations + * Associated participations. + */ class Code extends Model { /** @@ -13,7 +28,8 @@ class Code extends Model * @var array */ protected $fillable = [ - 'code_used', 'code_exported', + 'code_used', + 'code_exported', 'date_creation' ]; @@ -68,7 +84,7 @@ class Code extends Model } /** - * Generate a serial from an int. + * Get an int from a serial. * * @param string $serial * @return integer The ID represented diff --git a/app/Models/CodeEan.php b/app/Models/CodeEan.php deleted file mode 100644 index dc07b29..0000000 --- a/app/Models/CodeEan.php +++ /dev/null @@ -1,31 +0,0 @@ -hasMany(Participation::class); - } -} diff --git a/app/Models/Content.php b/app/Models/Content.php index 38d1cf1..05074e7 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -4,6 +4,14 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * Content. + * + * @property-read string $key Content key. + * @property string $value Content text + * @property-read \Illuminate\Support\Carbon $created_at Created date. + * @property-read \Illuminate\Support\Carbon $updated_at Updated date. + */ class Content extends Model { /** diff --git a/app/Models/Customer.php b/app/Models/Customer.php index d338ca5..974aebd 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -6,6 +6,33 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Hash; +/** + * Customer. + * + * @property integer $crm_id CRM ID + * @property string $firstname Firstname + * @property string $lastname Lastname + * @property \Illuminate\Support\Carbon $birth_date Birth date. + * @property string $email Email + * @property string $password Password + * @property string $address Address + * @property string $address2 Second address + * @property string $town Town + * @property string $postal_code Postal code + * @property string $country Country + * @property string $phone Phone number + * @property-read string $email_verify_token Token for email verification + * @property-read boolean $email_verified Is the email verified ? + * @property-read string $password_token Password token + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @method protected static function booted() The "booted" method of the model. + * @method private static function updatePassword($model) Update the password if needed. + * + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Participation[] $participations + * Associated participations. + */ class Customer extends Authenticatable { use Notifiable; diff --git a/app/Models/FaqQuestion.php b/app/Models/FaqQuestion.php index 592fc68..901d326 100644 --- a/app/Models/FaqQuestion.php +++ b/app/Models/FaqQuestion.php @@ -4,6 +4,16 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * FaqQuestion. + * + * @property string $question Question + * @property string $answer Answer + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @property-read \App\Models\FaqTheme $theme Associated theme. + */ class FaqQuestion extends Model { /** diff --git a/app/Models/FaqTheme.php b/app/Models/FaqTheme.php index 176ec57..9c6fe19 100644 --- a/app/Models/FaqTheme.php +++ b/app/Models/FaqTheme.php @@ -4,6 +4,17 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * FaqTheme. + * + * @property string $question Question + * @property string $answer Answer + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\FaqQuestion[] $questions + * Associated questions. + */ class FaqTheme extends Model { /** diff --git a/app/Models/GainView.php b/app/Models/GainView.php index 3e8600d..31e5fae 100644 --- a/app/Models/GainView.php +++ b/app/Models/GainView.php @@ -4,6 +4,17 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * GainView. + * + * @property string $name Name + * @property string $file_name Name of the view file. + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Prizes[] $prizes + * Associated prizes. + */ class GainView extends Model { /** @@ -11,10 +22,14 @@ class GainView extends Model * * @var array */ - protected $fillable = ['name', 'file_name']; + protected $fillable = [ + 'name', + 'file_name' + ]; /** * Prize relation + * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function prizes() diff --git a/app/Models/InstantWin.php b/app/Models/InstantWin.php index 4c58117..2435abf 100644 --- a/app/Models/InstantWin.php +++ b/app/Models/InstantWin.php @@ -4,6 +4,15 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * InstantWin. + * + * @property-read \Illuminate\Support\Carbon $appear_date Appear date + * @property-read boolean $won Is the prize won ? + * + * @property-read \App\Models\Prizes $prize Associated prize. + * @property-read \App\Models\Participation $participation Associated participation. + */ class InstantWin extends Model { /** diff --git a/app/Models/Participation.php b/app/Models/Participation.php index 074a1b2..bb98746 100644 --- a/app/Models/Participation.php +++ b/app/Models/Participation.php @@ -2,8 +2,27 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; +/** + * Participation. + * + * @property string $ip IP + * @property string $sticker Path of the sticker file + * @property string $ticket Path of the ticket file + * @property string $barcode Path of the barcode file + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @property-read string|null $code_ean Accessor for code_ean, from product table. + * + * @property-read \App\Models\Customer $customer Associated customer. + * @property-read \App\Models\Code $code Associated code. + * @property-read \App\Models\Product $product Associated product. + * @property-read \App\Models\InstantWin $instantWin Associated instantWin. + * @property-read \App\Models\Reduction $reduction Associated reduction. + */ class Participation extends Model { /** @@ -11,7 +30,7 @@ class Participation extends Model * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function user() + public function customer() { return $this->belongsTo(Customer::class); } @@ -27,13 +46,13 @@ class Participation extends Model } /** - * BelongsTo CodesEAN relation + * BelongsTo Product relation * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function codeEan() + public function product() { - return $this->belongsTo(CodeEan::class); + return $this->belongsTo(Product::class); } /** @@ -57,12 +76,14 @@ class Participation extends Model } /** - * ean_code_value accessor + * Accessor for code_ean, from product table. * - * @return integer|null + * @return \Illuminate\Database\Eloquent\Casts\Attribute; */ - public function getCodeEanValueAttribute() + public function codeEan(): Attribute { - return optional($this->codeEan)->code; + return Attribute::make( + get: fn () => optional($this->product)->code_ean, + ); } } diff --git a/app/Models/Prize.php b/app/Models/Prize.php index 1f5c52b..8965904 100644 --- a/app/Models/Prize.php +++ b/app/Models/Prize.php @@ -5,6 +5,27 @@ namespace App\Models; use App\Lib\Helpers\FileStorageHelper; use Illuminate\Database\Eloquent\Model; +/** + * Prize. + * + * @property string $label_one Singular label + * @property string $label_many Plural label + * @property string $arg_title Description title + * @property string $arg_subtitle Description subtitle + * @property string $arg_content Description content + * @property integer $quantity Quantity + * @property string $pdf_winning_proof Path of the winning proof file + * @property boolean $need_proof Does the prize need a winning proof ? + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @method protected static function booted() The "booted" method of the model. + * @method private static function manageFields($model) Manage model fields. + * + * @property-read \App\Models\GainView[] $gainView Associated gainViews. + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\InstantWin[] $instantWins + * Associated instantWins. + */ class Prize extends Model { /** @@ -58,12 +79,22 @@ class Prize extends Model $model->pdf_winning_proof = FileStorageHelper::storeFile($model, $model->pdf_winning_proof, true); } - public function gain_view() + /** + * BelongsTo GainView relation + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function gainView() { return $this->belongsTo(GainView::class, 'gain_view_id'); } - public function instant_wins() + /** + * HasMany InstantWin relation + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function instantWins() { return $this->hasMany(InstantWin::class, 'prize_id'); } diff --git a/app/Models/Product.php b/app/Models/Product.php index e0a7d92..0b5d1d5 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -5,6 +5,23 @@ namespace App\Models; use App\Lib\Helpers\FileStorageHelper; use Illuminate\Database\Eloquent\Model; +/** + * Product. + * + * @property string $name Name + * @property integer $no_art Number of this article + * @property string $picture Path of the picture + * @property integer $code_ean Ean code + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @method protected static function booted() The "booted" method of the model. + * @method private static function manageFields($model) Manage model fields. + * + * @property-read \App\Models\Range[] $range Associated range. + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Participation[] $participations + * Associated participations. + */ class Product extends Model { /** @@ -65,4 +82,14 @@ class Product extends Model { return $this->belongsTo(Range::class); } + + /** + * Participations relation + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function participations() + { + return $this->hasMany(Participation::class); + } } diff --git a/app/Models/Range.php b/app/Models/Range.php index 6392e4f..8716f31 100644 --- a/app/Models/Range.php +++ b/app/Models/Range.php @@ -5,6 +5,20 @@ namespace App\Models; use App\Lib\Helpers\FileStorageHelper; use Illuminate\Database\Eloquent\Model; +/** + * Range. + * + * @property string $name Name + * @property string $picture Path of the picture + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @method protected static function booted() The "booted" method of the model. + * @method private static function manageFields($model) Manage model fields. + * + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Product[] $products + * Associated products. + */ class Range extends Model { /** diff --git a/app/Models/Reduction.php b/app/Models/Reduction.php index 7323441..7f009e9 100644 --- a/app/Models/Reduction.php +++ b/app/Models/Reduction.php @@ -4,6 +4,17 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * Reduction. + * + * @property string $link Link + * @property string $basket_id Basket id + * @property string $verification Verification + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @property-read \App\Models\Participation $participation Associated participation. + */ class Reduction extends Model { /** diff --git a/app/Models/Settings.php b/app/Models/Settings.php index de0e8bd..64f15b1 100644 --- a/app/Models/Settings.php +++ b/app/Models/Settings.php @@ -4,6 +4,33 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * Settings. + * + * @property integer $name Name + * @property \Illuminate\Support\Carbon $start_date Start date of the game + * @property \Illuminate\Support\Carbon $end_date End date of the game + * @property int $nb_participation_player Max paticipation per player + * @property int $nb_participation_ip Max paticipation per ip + * @property int $nb_unique_code_use Max unique code use + * @property-read int $code_length Code length + * @property boolean $use_ean_codes Should the game use ean codes ? + * @property boolean $activated_teaser Is the teaser active ? + * @property \Illuminate\Support\Carbon $teaser_end_activity End date of the teaser + * @property boolean $activated_close_page Is the close page active ? + * @property \Illuminate\Support\Carbon $close_page_active_date End date of the close page + * @property string $redirect_close Link to redirect when the game is ended + * @property boolean $reductions_activated Are the reductions active ? + * @property string $reductions_site Reduction site + * @property string $reductions_campaign Reduction campaign + * @property string $web_coupons Array of web coupons + * @property string $notification_emails Array of email to notify when there's a winnner + * @property boolean $winning_proof Is the winning proof needed + * @property string $company Name of the company + * @property string $analytics Matomo siteId + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + */ class Settings extends Model { /** diff --git a/app/Models/User.php b/app/Models/User.php index a4c8761..8684263 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,6 +8,22 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Hash; +/** + * User. + * + * @property string $firstname Firstname + * @property string $lastname Lastname + * @property string $email Email + * @property-read \Illuminate\Support\Carbon $email_verified_at Date of email verification. + * @property string $password Password + * @property-read string $remember_token Remember token + * @property \App\Enums\Users\RoleEnum $role Role of the user + * @property-read \Illuminate\Support\Carbon $created_at Creation Date. + * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. + * + * @method protected static function booted() The "booted" method of the model. + * @method private static function updatePassword($model) Update the password if needed. + */ class User extends Authenticatable { use HasFactory; @@ -24,9 +40,6 @@ class User extends Authenticatable 'email', 'password', 'role', - 'published', - 'published_at', - 'order', ]; /** @@ -68,17 +81,6 @@ class User extends Authenticatable // * METHODS - /** - * Set order after the last element of the list. - * - * @param self $model - * @return void - */ - private static function setOrder(self $model): void - { - $model->order = \intval(self::query()->max('order')) + 1; - } - /** * Update password. * diff --git a/config/google.php b/config/google.php deleted file mode 100644 index 7575aec..0000000 --- a/config/google.php +++ /dev/null @@ -1,5 +0,0 @@ - env('ANALYTICS_GOOGLE_ID') -]; diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 8222263..e3d921b 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -22,9 +22,6 @@ return new class extends Migration $table->string('password')->comment('Password of the user account.'); $table->rememberToken(); $table->boolean('role')->comment('Role of the user who defines the rights/access.'); - $table->boolean('published')->comment('The user is published or not.'); - $table->timestamp('published_at')->nullable()->comment('The date on which the user was published.'); - $table->integer('order')->comment('Order of this user.'); $table->timestamps(); }); } diff --git a/database/migrations/2020_10_20_171937_create_code_eans.php b/database/migrations/2020_10_20_171937_create_code_eans.php deleted file mode 100644 index 0890e95..0000000 --- a/database/migrations/2020_10_20_171937_create_code_eans.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->unsignedBigInteger('code'); - $table->string('product'); - $table->unique('code'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('code_eans'); - } -} diff --git a/database/migrations/2020_10_28_091935_create_participations.php b/database/migrations/2023_08_22_091935_create_participations.php similarity index 92% rename from database/migrations/2020_10_28_091935_create_participations.php rename to database/migrations/2023_08_22_091935_create_participations.php index fd83496..8f8ba16 100644 --- a/database/migrations/2020_10_28_091935_create_participations.php +++ b/database/migrations/2023_08_22_091935_create_participations.php @@ -21,7 +21,7 @@ class CreateParticipations extends Migration $table->string('barcode')->nullable(); $table->foreignId('customer_id')->constrained('customers'); $table->foreignId('code_unique_id')->constrained('codes'); - $table->foreignId('code_ean_id')->nullable()->constrained('code_eans'); + $table->foreignId('product_id')->nullable()->constrained('products'); $table->foreignId('reduction_id')->nullable()->constrained('reductions'); $table->timestamps(); }); diff --git a/database/migrations/2020_10_29_120243_create_instant_wins.php b/database/migrations/2023_08_22_120243_create_instant_wins.php similarity index 100% rename from database/migrations/2020_10_29_120243_create_instant_wins.php rename to database/migrations/2023_08_22_120243_create_instant_wins.php diff --git a/database/seeders/SettingsSeeder.php b/database/seeders/SettingsSeeder.php index 420f9f6..4d0fb44 100644 --- a/database/seeders/SettingsSeeder.php +++ b/database/seeders/SettingsSeeder.php @@ -27,7 +27,6 @@ class SettingsSeeder extends Seeder $settings->activated_close_page = false; $settings->redirect_close = "https://example.test"; $settings->reductions_activated = false; - $settings->facebook_activated = false; $settings->notification_emails = "[]"; $settings->winning_proof = 0; $settings->company = "Société"; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index b91d01b..3d01b35 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -3,7 +3,6 @@ return [ 'classes' => [ 'bannedips' => 'IP bannies', - 'codes-ean' => 'Code EAN|Codes EAN', 'contents' => 'Contenus', 'faq-questions' => 'Question pour la FAQ|Questions pour la FAQ', 'faq-themes' => 'Thème pour la FAQ|Thèmes pour la FAQ', diff --git a/resources/sass/bo/base/_common.scss b/resources/sass/bo/base/_common.scss index c481a71..659127d 100644 --- a/resources/sass/bo/base/_common.scss +++ b/resources/sass/bo/base/_common.scss @@ -113,3 +113,7 @@ font-size: large; text-align: center; } + +.btn-md { + height: 38px; +} diff --git a/resources/views/bo/layout.blade.php b/resources/views/bo/layout.blade.php index c3d8ab9..aa66d98 100644 --- a/resources/views/bo/layout.blade.php +++ b/resources/views/bo/layout.blade.php @@ -5,7 +5,7 @@ @include('bo.layouts.head') - + -
        +
        @include('modules.flash-messages') @@ -67,6 +67,7 @@
        + @include('bo.layouts.footer') @stack('scripts-constants') @include('modules.script-constants') @vite(['resources/ts/bo.ts']) diff --git a/resources/views/bo/layouts/footer.blade.php b/resources/views/bo/layouts/footer.blade.php new file mode 100644 index 0000000..34e895d --- /dev/null +++ b/resources/views/bo/layouts/footer.blade.php @@ -0,0 +1,8 @@ +
        +
        + {{ $name }} - {{ $version }} + - + UWIL + © {{ date('Y') }} +
        +
        diff --git a/resources/views/bo/layouts/nav-menu.blade.php b/resources/views/bo/layouts/nav-menu.blade.php index d07c47b..6f73fd0 100644 --- a/resources/views/bo/layouts/nav-menu.blade.php +++ b/resources/views/bo/layouts/nav-menu.blade.php @@ -17,6 +17,26 @@ {{ __('models.classes.settings') }}
        +
      @endsuperadmin - - @superadmin - - @endsuperadmin @endauth diff --git a/resources/views/bo/modules/search-bar.blade.php b/resources/views/bo/modules/search-bar.blade.php index 1717cb7..8cb21e1 100644 --- a/resources/views/bo/modules/search-bar.blade.php +++ b/resources/views/bo/modules/search-bar.blade.php @@ -8,7 +8,7 @@ $iArgs['search'] = request()->sort_way; } @endphp -
      +
      diff --git a/resources/views/bo/pages/codes-ean/create.blade.php b/resources/views/bo/pages/codes-ean/create.blade.php deleted file mode 100644 index 627f07b..0000000 --- a/resources/views/bo/pages/codes-ean/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $codeEanModel]) - -@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.codes-ean', 1)])) -@section('description', __('Création d\'un tout nouveau :model', ['model' => trans_choice('models.classes.codes-ean', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $codeEanModel]) -
      -
      - -
      -
      - - @csrf - @include('bo.pages.codes-ean.form-inputs') -
      -
      - -
      -
      - -@endsection diff --git a/resources/views/bo/pages/codes-ean/edit.blade.php b/resources/views/bo/pages/codes-ean/edit.blade.php deleted file mode 100644 index 5c6b661..0000000 --- a/resources/views/bo/pages/codes-ean/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $codeEanModel]) - -@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.codes-ean', 1)])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.codes-ean', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $codeEanModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.codes-ean.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/codes-ean/form-inputs.blade.php b/resources/views/bo/pages/codes-ean/form-inputs.blade.php deleted file mode 100644 index 09673b0..0000000 --- a/resources/views/bo/pages/codes-ean/form-inputs.blade.php +++ /dev/null @@ -1,76 +0,0 @@ -
      - {{-- CODE --}} -
      -
      - {{ Str::ucfirst(__('validation.attributes.code')) }} -
      -
      - @include('bo.partials.inputs.int-number', [ - 'id' => 'codeEanCode', - 'label' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.code')), - ]), - 'name' => 'code', - 'required' => true, - 'model' => $codeEanModel ?? null, - 'helper' => __('validation.ean', [ - 'attribute' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.code')), - ]), - ]), - 'placeholder' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.code')), - ]), - // Unsigned between 7 and 13 digits - 'min' => 1000000, - 'max' => 9999999999999 - ]) -
      -
      -
      -
      - {{-- PRODUCT --}} -
      -
      - {{ Str::ucfirst(__('validation.attributes.product')) }} -
      -
      - @include('bo.partials.inputs.varchar', [ - 'id' => 'codeEanProduct', - 'label' => __('Nom du :field', [ - 'field' => Str::ucfirst(__('validation.attributes.product')), - ]), - 'hasWordCounter' => true, - 'name' => 'product', - 'required' => true, - 'model' => $codeEanModel ?? null, - 'helper' => __('validation.between.string', [ - 'attribute' => __('Nom du :field', [ - 'field' => Str::ucfirst(__('validation.attributes.product')), - ]), - 'min' => 3, - 'max' => 255 - ]), - 'placeholder' => __('Nom du :field', [ - 'field' => Str::ucfirst(__('validation.attributes.product')), - ]), - ]) -
      -
      -
      -
      -
      - -@push('scripts') - -@endpush diff --git a/resources/views/bo/pages/codes-ean/index.blade.php b/resources/views/bo/pages/codes-ean/index.blade.php deleted file mode 100644 index f969478..0000000 --- a/resources/views/bo/pages/codes-ean/index.blade.php +++ /dev/null @@ -1,66 +0,0 @@ -@extends('bo.layout') - -@section('title', trans_choice('models.classes.codes-ean', 2)) -@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.codes-ean', 2)])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($codeEanModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'code' => Str::ucfirst(__('validation.attributes.code')), - 'product' => Str::ucfirst(__('validation.attributes.product')), - ], - ]) - - - @foreach ($codeEanModels as $codeEanModel) - - - - - - @endforeach - - @else - - - - @endif -
      {{ $codeEanModel->code }}{{ $codeEanModel->product }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.codes-ean', 1)]) }}
      -{!! $codeEanModels->links() !!} -@endsection diff --git a/resources/views/bo/dashboard/index.blade.php b/resources/views/bo/pages/dashboard/index.blade.php similarity index 95% rename from resources/views/bo/dashboard/index.blade.php rename to resources/views/bo/pages/dashboard/index.blade.php index ac7d31a..a1ee799 100644 --- a/resources/views/bo/dashboard/index.blade.php +++ b/resources/views/bo/pages/dashboard/index.blade.php @@ -15,7 +15,7 @@ {{ __('Top 3 des codes EAN les plus utilisés') }} :
        @foreach ($codesEan as $codeEan) -
      • {{ $codeEan->code_ean_value }} : {{ $codeEan->nb_usage }}
      • +
      • {{ $codeEan->code_ean }} : {{ $codeEan->nb_usage }}
      • @endforeach
      @endif diff --git a/resources/views/bo/instant-win/index.blade.php b/resources/views/bo/pages/instant-win/index.blade.php similarity index 100% rename from resources/views/bo/instant-win/index.blade.php rename to resources/views/bo/pages/instant-win/index.blade.php diff --git a/resources/views/bo/pages/prizes/index.blade.php b/resources/views/bo/pages/prizes/index.blade.php index edc4c1c..e7a95dd 100644 --- a/resources/views/bo/pages/prizes/index.blade.php +++ b/resources/views/bo/pages/prizes/index.blade.php @@ -41,12 +41,12 @@ - {{ $prizeModel->gain_view->name }} + {{ $prizeModel->gainView->name }} diff --git a/resources/views/bo/pages/ranges/form-inputs.blade.php b/resources/views/bo/pages/ranges/form-inputs.blade.php index d99f4b9..e253b1f 100644 --- a/resources/views/bo/pages/ranges/form-inputs.blade.php +++ b/resources/views/bo/pages/ranges/form-inputs.blade.php @@ -50,7 +50,6 @@ 'preview' => true, ])
      -
      diff --git a/resources/views/bo/pages/settings/manage.blade.php b/resources/views/bo/pages/settings/manage.blade.php deleted file mode 100644 index 67d6f81..0000000 --- a/resources/views/bo/pages/settings/manage.blade.php +++ /dev/null @@ -1,350 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - Règlages du jeu -
      - -
      - @method('PUT') - @csrf -
      -
      -
      -
      - - -
      -
      -
      - Générale
      - Paramétres généraux du jeu -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - -
      - - - -
      - - - -
      - - - -
      - - - -
      - - -
      - @if ($settings->use_ean_codes === 1) - - @else - - @endif - -
      -
      - - -
      - @if ($settings->activated_teaser === 1) - - @else - - @endif - -
      -
      - - - -
      - - -
      - @if ($settings->activated_close_page === 1) - - @else - - @endif - -
      -
      - - - -
      - - - -
      - - -
      - @if ($settings->winning_proof === 1) - - @else - - @endif - -
      -
      - - - -
      -
      -
      - Les réductions
      - Paramétrages des bons de réduction MLDC -
      -
      - - - - - - - - - - - - - - - - - - -
      - - -
      - @if ($settings->reductions_activated === 1) - - @else - - @endif - -
      -
      - - - -
      - - - -
      - -
      -
      -
      - Destinataires des notifications de gain
      - Ces mails recevront toutes les notifications de gain. -
      -
      - -
      -
      - Google analytics
      - Insérer ici la clé analytics pour le jeu. -
      - - - - - -
      Clé analytics (eg: UA-XX196604-1)
      -
      -
      -
      - -
      -
      -@endsection - -@push('scripts') - -@endpush diff --git a/resources/views/bo/pages/winners-list/index.blade.php b/resources/views/bo/pages/winners-list/index.blade.php index 3b2b745..50d1e52 100644 --- a/resources/views/bo/pages/winners-list/index.blade.php +++ b/resources/views/bo/pages/winners-list/index.blade.php @@ -36,9 +36,9 @@ {{ \Carbon\Carbon::parse($participationModel->created_at)->format('d/m/Y à H:i') }} {{$participationModel->instantWin()->first()->prize->label_one}} - {{$participationModel->user->email}} + {{$participationModel->customer->email}} @if ($settings->use_ean_codes) - {{$participationModel->codeEan->code}} + {{$participationModel->codeEan}} @endif {{$participationModel->code->code_unique}} @if ($settings->winning_proof === 1) diff --git a/resources/views/bo/products/create.blade.php b/resources/views/bo/products/create.blade.php deleted file mode 100644 index f2eb397..0000000 --- a/resources/views/bo/products/create.blade.php +++ /dev/null @@ -1,27 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - @csrf -
      -
      -
      - < Produit Porteur - Ajout -
      -
      - -
      -
      - -
      -
      -
      -
      - @include('bo.products.input-forms') -
      -
      -
      -@endsection diff --git a/resources/views/bo/products/edit.blade.php b/resources/views/bo/products/edit.blade.php deleted file mode 100644 index d4d9ce8..0000000 --- a/resources/views/bo/products/edit.blade.php +++ /dev/null @@ -1,30 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - @method('PUT') - @csrf -
      -
      -
      - < Produit Porteur - Modification -
      -
      - @if (session('success')) - {{ session('success') }} - @endif -
      -
      - -
      -
      -
      -
      - @include('bo.products.input-forms') -
      -
      -
      -@endsection diff --git a/resources/views/bo/products/index.blade.php b/resources/views/bo/products/index.blade.php deleted file mode 100644 index 426ea34..0000000 --- a/resources/views/bo/products/index.blade.php +++ /dev/null @@ -1,66 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      -
      -
      - Produits Porteur -
      -
      - -
      - -
      -
      -
      - @if ($errors->any()) -
      -
        - @foreach ($errors->all() as $error) -
      • {{ $error }}
      • - @endforeach -
      -
      - @endif - - - - - - - - - - @foreach($products as $product) - - - - - - - - @endforeach - -
      N° ArticleLibelléEANImage
      {{$product->no_art}}{{$product->name}}{{$product->code_ean}} - @if($product->picture) - - {{$product->name}} - - @endif - - Modifier -
      - @method('DELETE') - @csrf - -
      -
      -
      -
      -@endsection diff --git a/resources/views/bo/products/input-forms.blade.php b/resources/views/bo/products/input-forms.blade.php deleted file mode 100644 index 97db738..0000000 --- a/resources/views/bo/products/input-forms.blade.php +++ /dev/null @@ -1,38 +0,0 @@ -
      - - -
      -
      - - -
      -
      - - -
      -
      -
      - - @if (isset($product->picture) and $product->picture !== null) -
      -
      - - {{$product->name}} - - @endif -
      -
      -
      -
      - -
      - -
      -
      diff --git a/resources/views/bo/ranges/create.blade.php b/resources/views/bo/ranges/create.blade.php deleted file mode 100644 index 032f8b5..0000000 --- a/resources/views/bo/ranges/create.blade.php +++ /dev/null @@ -1,27 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - @csrf -
      -
      -
      - <{{ __('Gammes - Ajout') }} -
      -
      - -
      -
      - -
      -
      -
      -
      - @include('bo.ranges.input-forms') -
      -
      -
      -@endsection diff --git a/resources/views/bo/ranges/edit.blade.php b/resources/views/bo/ranges/edit.blade.php deleted file mode 100644 index ec3a032..0000000 --- a/resources/views/bo/ranges/edit.blade.php +++ /dev/null @@ -1,30 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - @method('PUT') - @csrf -
      -
      -
      - <{{ __('Gammes - Modification') }} -
      -
      - @if (session('success')) - {{ session('success') }} - @endif -
      -
      - -
      -
      -
      -
      - @include('bo.ranges.input-forms') -
      -
      -
      -@endsection diff --git a/resources/views/bo/ranges/index.blade.php b/resources/views/bo/ranges/index.blade.php deleted file mode 100644 index f8a8103..0000000 --- a/resources/views/bo/ranges/index.blade.php +++ /dev/null @@ -1,52 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      -
      -
      - {{ __('Gammes') }} -
      -
      - -
      - -
      -
      -
      - - - - - - - - @foreach($ranges as $range) - - - - - - @endforeach - -
      {{ __('Nom') }}Image
      {{$range->name}} - @if($range->picture) - - {{$range->name}} - - @endif - - {{ __('Modifier') }} -
      - @method('DELETE') - @csrf - -
      -
      -
      -
      -@endsection diff --git a/resources/views/bo/ranges/input-forms.blade.php b/resources/views/bo/ranges/input-forms.blade.php deleted file mode 100644 index 3cce4bd..0000000 --- a/resources/views/bo/ranges/input-forms.blade.php +++ /dev/null @@ -1,15 +0,0 @@ -
      - - -
      -
      -
      - - @if (isset($range->picture) and $range->picture !== null) -
      -
      - - {{$range->name}} - - @endif -
      diff --git a/resources/views/bo/settings/manage.blade.php b/resources/views/bo/settings/manage.blade.php deleted file mode 100644 index 2e10335..0000000 --- a/resources/views/bo/settings/manage.blade.php +++ /dev/null @@ -1,401 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      -
      - Règlages du jeu -
      - -
      - @method('PUT') - @csrf -
      -
      -
      -
      - - -
      -
      -
      - Générale
      - Paramétres généraux du jeu -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - -
      - - - -
      - - - -
      - - - -
      - - - -
      - - -
      - @if ($settings->use_ean_codes === 1) - - @else - - @endif - -
      -
      - - -
      - @if ($settings->activated_teaser === 1) - - @else - - @endif - -
      -
      - - - -
      - - -
      - @if ($settings->activated_close_page === 1) - - @else - - @endif - -
      -
      - - - -
      - - - -
      - - -
      - @if ($settings->winning_proof === 1) - - @else - - @endif - -
      -
      - - - -
      -
      -
      - Les réductions
      - Paramétrages des bons de réduction MLDC -
      -
      - - - - - - - - - - - - - - - - - - -
      - - -
      - @if ($settings->reductions_activated === 1) - - @else - - @endif - -
      -
      - - - -
      - - - -
      - -
      -
      -
      - Facebook Connect
      - Paramétrage du Facebook Connect -
      -
      - - - - - - - - - - - - - - - -
      - - -
      - @if ($settings->facebook_activated === 1) - - @else - - @endif - -
      -
      - - - -
      - - - -
      -
      -
      - Destinataires des notifications de gain
      - Ces mails recevront toutes les notifications de gain. -
      -
      - -
      -
      - Google analytics
      - Insérer ici la clé analytics pour le jeu. -
      - - - - - -
      Clé analytics (eg: UA-XX196604-1)
      -
      -
      -
      - -
      -
      -@endsection - -@push('scripts') - -@endpush diff --git a/resources/views/breadcrumbs/breadcrumb-body.blade.php b/resources/views/breadcrumbs/breadcrumb-body.blade.php index 365b15f..2f17974 100644 --- a/resources/views/breadcrumbs/breadcrumb-body.blade.php +++ b/resources/views/breadcrumbs/breadcrumb-body.blade.php @@ -5,6 +5,8 @@ !empty($brParam) ? (is_array($brParam) ? $brParam : [$brParam]) : [] )) }} @endif -@elseif(Breadcrumbs::exists(request()->route()->getName())) +@elseif(request()->route() != null) +@if(Breadcrumbs::exists(request()->route()->getName())) {{ Breadcrumbs::render(request()->route()->getName()) }} @endif +@endif diff --git a/resources/views/breadcrumbs/breadcrumb-head.blade.php b/resources/views/breadcrumbs/breadcrumb-head.blade.php index 51ea9c5..b2d8502 100644 --- a/resources/views/breadcrumbs/breadcrumb-head.blade.php +++ b/resources/views/breadcrumbs/breadcrumb-head.blade.php @@ -1,10 +1,9 @@ @hasSection('breadcrumb') @if(Breadcrumbs::exists(app()->view->getSections()['breadcrumb'])) -{{ call_user_func_array('Breadcrumbs::view', array_merge( - ['breadcrumbs::json-ld', app()->view->getSections()['breadcrumb']], - !empty($brParam) ? (is_array($brParam) ? $brParam : [$brParam]) : [] -)) }} +{{ Breadcrumbs::view('breadcrumbs::json-ld', app()->view->getSections()['breadcrumb'], $brParam ?? null) }} @endif -@elseif(Breadcrumbs::exists(request()->route()->getName())) +@elseif(request()->route() != null) +@if (Breadcrumbs::exists(request()->route()->getName())) {{ Breadcrumbs::view('breadcrumbs::json-ld', request()->route()->getName()) }} @endif +@endif diff --git a/resources/views/breadcrumbs/breadcrumb-layout.blade.php b/resources/views/breadcrumbs/breadcrumb-layout.blade.php index 09528c9..e9ff09d 100644 --- a/resources/views/breadcrumbs/breadcrumb-layout.blade.php +++ b/resources/views/breadcrumbs/breadcrumb-layout.blade.php @@ -1,15 +1,17 @@ -@if (isset($breadcrumbs)) -@unless ($breadcrumbs->isEmpty()) - -@endunless +@if (count($breadcrumbs)) + @endif diff --git a/resources/views/front/basic_example/gain1.blade.php b/resources/views/front/basic_example/gain1.blade.php index bdd2317..f022445 100644 --- a/resources/views/front/basic_example/gain1.blade.php +++ b/resources/views/front/basic_example/gain1.blade.php @@ -1,7 +1,7 @@ @extends('front.basic.layout') @section('title') - {{$prize->gain_view->name}} + {{$prize->gainView->name}} @endsection @section('content') diff --git a/resources/views/front/basic_example/notif-win-admin-email.blade.php b/resources/views/front/basic_example/notif-win-admin-email.blade.php index c44e8f5..1d52172 100644 --- a/resources/views/front/basic_example/notif-win-admin-email.blade.php +++ b/resources/views/front/basic_example/notif-win-admin-email.blade.php @@ -13,9 +13,9 @@

      {{ $participation->user->email }}


      Codes utilisé@if ($settings->use_ean_codes)s @endif :

      @if ($settings->use_ean_codes) -

      - Code On Pack : {{ $participation->codeEan->code }}

      +

      - Code On Pack : {{ $participation->codeEan }}

      @endif

      - Code Unique : {{ $participation->code->code_unique }}

      - \ No newline at end of file + diff --git a/resources/views/re7.blade.php b/resources/views/re7.blade.php index ce164c1..6a3609d 100644 --- a/resources/views/re7.blade.php +++ b/resources/views/re7.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.app') +@extends('bo.layout') @section('content')
      diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index 8237f44..d183029 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -1,7 +1,6 @@ push(__('crud.actions.edit'), route('bo.bannedips.edit', $bannedip->id)); }); -// * CODES EAN -Breadcrumbs::for('bo.code-eans.index', function (Generator $trail) { - $trail->push(trans_choice('models.classes.codes-ean', 2), route('bo.code-eans.index')); -}); -Breadcrumbs::for('bo.code-eans.create', function (Generator $trail) { - $trail->parent('bo.code-eans.index'); - $trail->push(__('crud.actions.create'), route('bo.code-eans.create')); -}); -Breadcrumbs::for('bo.code-eans.edit', function (Generator $trail, CodeEan $codeEan) { - $trail->parent('bo.code-eans.index'); - $trail->push(__('crud.actions.edit'), route('bo.code-eans.edit', $codeEan->id)); -}); - // * CONTENTS Breadcrumbs::for('bo.contents.index', function (Generator $trail) { $trail->push(__('models.classes.contents'), route('bo.contents.index')); diff --git a/routes/web-bo.php b/routes/web-bo.php index 27468dd..3e9d752 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -2,7 +2,6 @@ use App\Http\Controllers\Bo\BannedIpController; use App\Http\Controllers\Bo\CodesController; -use App\Http\Controllers\Bo\CodesEANController; use App\Http\Controllers\Bo\ContentController; use App\Http\Controllers\Bo\DashboardController; use App\Http\Controllers\Bo\FaqQuestionsController; @@ -40,10 +39,6 @@ Route::prefix('bo') ->name('dashboard')->withoutMiddleware('is-super-admin'); // * BANNED IPS Route::resource('/bannedips', BannedIpController::class)->except('show'); - // * CODES EAN - Route::resource('/code-eans', CodesEANController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); // * CONTENTS Route::resource('/contents', ContentController::class) ->only(['index', 'edit', 'update']) diff --git a/routes/web-fo.php b/routes/web-fo.php index a7a4d96..ae10084 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -27,8 +27,7 @@ Route::namespace('\App\Http\Controllers\Fo')->middleware(['throttle:credentials' Route::put('/rejouer', [WinningProofController::class, 'sendWinningProof']) ->name('send-winning-proof'); }); - Route::get('/', [HomeController::class, 'index'])->name('home'); - // Route::get('/', [HomeController::class, 'home'])->name('home'); + Route::get('/', [HomeController::class, 'home'])->name('home'); Route::get('/reglement', [ViewContentController::class, 'reglement'])->name('reglement'); Route::get('/charte', [ViewContentController::class, 'charte'])->name('charte'); From 949b7ca13e28b88dc6e3dade55322489f7621f05 Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Thu, 24 Aug 2023 12:59:51 +0000 Subject: [PATCH 016/145] phpcs --- app/Console/Commands/ExportCodesUniques.php | 28 +++++++- .../Controllers/Bo/DashboardController.php | 5 +- app/Http/Controllers/EndPageController.php | 1 + app/Http/Controllers/EnterCodeController.php | 2 +- app/Http/Controllers/FAQController.php | 1 + app/Http/Controllers/GainsController.php | 1 + app/Http/Controllers/HomeController.php | 1 + app/Http/Controllers/HowToPlayController.php | 1 + app/Http/Controllers/LoginController.php | 27 ++++++- app/Http/Controllers/ProduitsController.php | 1 + .../{re7Controller.php => Re7Controller.php} | 10 ++- app/Http/Controllers/RegisterController.php | 71 +++++++++++++++---- app/Http/Controllers/TeaserController.php | 5 ++ .../Controllers/ViewContentController.php | 15 ++++ .../Controllers/WinningProofController.php | 14 +++- app/Http/Kernel.php | 6 +- .../Middleware/{isAdmin.php => IsAdmin.php} | 2 +- .../{isSuperAdmin.php => IsSuperAdmin.php} | 5 +- .../{re7Middleware.php => Re7Middleware.php} | 5 +- .../Bo/Settings/UpdateSettingsRequest.php | 2 + app/Http/Requests/ParticipateRequest.php | 1 - app/Jobs/ProcessExportCodesUniques.php | 3 + app/Jobs/ProcessUniqueCode.php | 2 + app/Mail/ExportCodesUniques.php | 1 + app/Mail/JobFailed.php | 6 +- app/Mail/NotifAdmin.php | 4 +- app/Mail/NotifWinAdmin.php | 12 +++- app/Mail/PasswordReset.php | 17 ++++- app/Mail/PrizeWon.php | 24 ++++++- app/Mail/ReductionWon.php | 35 +++++++-- app/Mail/WinningProof.php | 37 +++++++++- app/Models/Customer.php | 2 +- app/Models/InstantWin.php | 2 +- routes/web-re7.php | 16 ++--- 34 files changed, 306 insertions(+), 59 deletions(-) rename app/Http/Controllers/{re7Controller.php => Re7Controller.php} (95%) rename app/Http/Middleware/{isAdmin.php => IsAdmin.php} (97%) rename app/Http/Middleware/{isSuperAdmin.php => IsSuperAdmin.php} (80%) rename app/Http/Middleware/{re7Middleware.php => Re7Middleware.php} (77%) diff --git a/app/Console/Commands/ExportCodesUniques.php b/app/Console/Commands/ExportCodesUniques.php index bb4056d..2aa2e4a 100644 --- a/app/Console/Commands/ExportCodesUniques.php +++ b/app/Console/Commands/ExportCodesUniques.php @@ -27,9 +27,11 @@ class ExportCodesUniques extends Command * Execute the console command. * * @return integer + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh */ public function handle() { + // phpcs:enable // Nombre total de code à exporter. $nbCodeTot = $this->ask("Combien de code doivent être exporté ?"); while (empty(intval($nbCodeTot)) || !is_int(intval($nbCodeTot))) { @@ -113,8 +115,30 @@ class ExportCodesUniques extends Command return 0; } - private function process($nbCodeFic, $nbCodeTot, $nbCodeLigne, $totalExportedCodes, $currentFilename, $currentExportedCodes, $currentLineCodes, $lastExportedCodeId = null) - { + /** + * + * @param integer $nbCodeFic + * @param integer $nbCodeTot + * @param integer $nbCodeLigne + * @param integer $totalExportedCodes + * @param string $currentFilename + * @param integer $currentExportedCodes + * @param integer $currentLineCodes + * @param integer $lastExportedCodeId + * @return mixed + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh + */ + private function process( + int $nbCodeFic, + int $nbCodeTot, + int $nbCodeLigne, + int $totalExportedCodes, + string $currentFilename, + int $currentExportedCodes, + int $currentLineCodes, + int $lastExportedCodeId = null + ) { + // phpcs:enable $paginate = config('codes.paginate'); if ($nbCodeTot < $paginate) { diff --git a/app/Http/Controllers/Bo/DashboardController.php b/app/Http/Controllers/Bo/DashboardController.php index bd40941..3acb76f 100644 --- a/app/Http/Controllers/Bo/DashboardController.php +++ b/app/Http/Controllers/Bo/DashboardController.php @@ -21,8 +21,9 @@ class DashboardController extends Controller $settings = app(Settings::class); $participations = Participation::selectRaw("COUNT(*) AS count, DATE(created_at) AS date") ->groupByRaw("DATE(created_at)")->get(); - $participationsUniquePerDay = Participation::selectRaw("DISTINCT customer_id AS user, COUNT(*) AS count, DATE(created_at) AS date") - ->groupByRaw("DATE(created_at), user")->get(); + $participationsUniquePerDay = Participation::selectRaw( + "DISTINCT customer_id AS user, COUNT(*) AS count, DATE(created_at) AS date" + )->groupByRaw("DATE(created_at), user")->get(); $statsUnique = []; foreach ($participationsUniquePerDay as $participationPerDay) { $dateUnique = Carbon::parse($participationPerDay->date)->format('d/m/Y'); diff --git a/app/Http/Controllers/EndPageController.php b/app/Http/Controllers/EndPageController.php index de8ed2f..b97c30f 100644 --- a/app/Http/Controllers/EndPageController.php +++ b/app/Http/Controllers/EndPageController.php @@ -8,6 +8,7 @@ class EndPageController extends Controller { /** * index + * * @return \Illuminate\View\View|Illuminate\Http\RedirectResponse */ public function index() diff --git a/app/Http/Controllers/EnterCodeController.php b/app/Http/Controllers/EnterCodeController.php index fe5f0d0..b275c2c 100644 --- a/app/Http/Controllers/EnterCodeController.php +++ b/app/Http/Controllers/EnterCodeController.php @@ -241,7 +241,7 @@ class EnterCodeController extends Controller * @param Participation $participation * @return \App\Models\Reduction|null */ - private function updateCoupon(Settings $settings, $coupon, Participation $participation) + private function updateCoupon(Settings $settings, mixed $coupon, Participation $participation) { $reduction = null; $mesBR = new MesBR(config('mesbr.endpoint'), $settings->reductions_site, $settings->reductions_campaign); diff --git a/app/Http/Controllers/FAQController.php b/app/Http/Controllers/FAQController.php index 8f26f78..553c861 100644 --- a/app/Http/Controllers/FAQController.php +++ b/app/Http/Controllers/FAQController.php @@ -9,6 +9,7 @@ class FAQController extends Controller { /** * index + * * @return \Illuminate\View\View */ public function index() diff --git a/app/Http/Controllers/GainsController.php b/app/Http/Controllers/GainsController.php index fd192a4..1fec5e0 100644 --- a/app/Http/Controllers/GainsController.php +++ b/app/Http/Controllers/GainsController.php @@ -6,6 +6,7 @@ class GainsController extends Controller { /** * index + * * @return \Illuminate\View\View */ public function index() diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 989c9e2..908ce5c 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -6,6 +6,7 @@ class HomeController extends Controller { /** * home + * * @return \Illuminate\View\View */ public function home() diff --git a/app/Http/Controllers/HowToPlayController.php b/app/Http/Controllers/HowToPlayController.php index 52b35d0..1e1ab63 100644 --- a/app/Http/Controllers/HowToPlayController.php +++ b/app/Http/Controllers/HowToPlayController.php @@ -6,6 +6,7 @@ class HowToPlayController extends Controller { /** * index + * * @return \Illuminate\View\View|Illuminate\Http\RedirectResponse */ public function index() diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php index a697b9c..6e3e0b7 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/LoginController.php @@ -185,6 +185,12 @@ class LoginController extends Controller return view('front.basic.confirm-email', compact('result')); } + /** + * Display the view to request a password reset link + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ public function forgotPassword(Request $request) { if ($request->tokenValid && $request->token) { @@ -195,7 +201,14 @@ class LoginController extends Controller return view('front.basic.forgot-password'); } - public function forgotPasswordReset(Request $request, $token) + /** + * Display the view to reset a password + * + * @param \Illuminate\Http\Request $request + * @param string $token + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ + public function forgotPasswordReset(Request $request, string $token) { if (!$request->hasValidSignature(false)) { return redirect()->route('login') @@ -211,6 +224,12 @@ class LoginController extends Controller return redirect()->route('forgot-password', compact('tokenValid', 'token')); } + /** + * Send the reset password mail + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ public function mailPassword(Request $request) { $email = filter_var($request->email, FILTER_SANITIZE_STRING); @@ -265,6 +284,12 @@ class LoginController extends Controller ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); } + /** + * Change the password + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ public function changePassword(Request $request) { $request->validate([ diff --git a/app/Http/Controllers/ProduitsController.php b/app/Http/Controllers/ProduitsController.php index 7ff48d2..b38f080 100644 --- a/app/Http/Controllers/ProduitsController.php +++ b/app/Http/Controllers/ProduitsController.php @@ -8,6 +8,7 @@ class ProduitsController extends Controller { /** * index + * * @return \Illuminate\View\View|Illuminate\Http\RedirectResponse */ public function index() diff --git a/app/Http/Controllers/re7Controller.php b/app/Http/Controllers/Re7Controller.php similarity index 95% rename from app/Http/Controllers/re7Controller.php rename to app/Http/Controllers/Re7Controller.php index f176c46..0283436 100644 --- a/app/Http/Controllers/re7Controller.php +++ b/app/Http/Controllers/Re7Controller.php @@ -5,10 +5,11 @@ namespace App\Http\Controllers; use App\Models\Settings; use App\Models\Reduction; -class re7Controller extends Controller +class Re7Controller extends Controller { /** * index + * * @return \Illuminate\View\View */ public function index() @@ -18,6 +19,7 @@ class re7Controller extends Controller /** * teaser + * * @return \Illuminate\View\View */ public function teaser() @@ -29,6 +31,7 @@ class re7Controller extends Controller /** * prizeMail + * * @return \Illuminate\View\View */ public function prizeMail() @@ -38,6 +41,7 @@ class re7Controller extends Controller /** * reductionMail + * * @return \Illuminate\View\View */ public function reductionMail() @@ -47,6 +51,7 @@ class re7Controller extends Controller /** * br + * * @return \Illuminate\View\View */ public function br() @@ -59,6 +64,7 @@ class re7Controller extends Controller /** * gain 1 + * * @return \Illuminate\View\View */ public function gain1() @@ -68,6 +74,7 @@ class re7Controller extends Controller /** * gain 2 + * * @return \Illuminate\View\View */ public function gain2() @@ -76,6 +83,7 @@ class re7Controller extends Controller } /** * getRandomCoupon + * * @param App\Models\Settings $settings * @return string */ diff --git a/app/Http/Controllers/RegisterController.php b/app/Http/Controllers/RegisterController.php index 1e9f0c3..8ef0055 100644 --- a/app/Http/Controllers/RegisterController.php +++ b/app/Http/Controllers/RegisterController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers; use App\Mail\VerifyEmail; use App\Models\Customer; -use App\Providers\RouteServiceProvider; use Carbon\Carbon; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Http\Request; @@ -16,22 +15,36 @@ class RegisterController extends Controller { use RegistersUsers; - // TODO : Utilité ?? - protected $redirectTo = RouteServiceProvider::HOME; - + /** @var \LDCCRM\ApiV1 */ private $apiCrm; + /** + * Create a new controller instance. + * + * @return void + */ public function __construct() { $this->middleware('guest'); $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } + /** + * Index + * + * @return \Illuminate\Contracts\View\View + */ public function index() { return view('front.basic.register-crm'); } + /** + * Register a user from a form + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ public function register(Request $request) { @@ -64,7 +77,7 @@ class RegisterController extends Controller $MJ = Carbon::now()->subYears(18); - if ($this->isSQLDate($birthdate)) { + if ($this->isSqlDate($birthdate)) { $d = Carbon::createFromFormat('Y-m-d', $birthdate); if (!$d->lessThanOrEqualTo($MJ)) { return back() @@ -84,9 +97,22 @@ class RegisterController extends Controller return back() ->withInput($request->except('password')) ->withErrors("Erreur sur le champs : date de naissance."); - }//end if + } //end if - $crmUser = $this->apiCrm->createCustomer($email, $password, $firstname, $lastname, $optin, $birthdate, null, $address, $address2, $town, $postcode, ucfirst($country)); + $crmUser = $this->apiCrm->createCustomer( + $email, + $password, + $firstname, + $lastname, + $optin, + $birthdate, + null, + $address, + $address2, + $town, + $postcode, + ucfirst($country) + ); if ($crmUser->status === 'OK') { $user = Customer::create([ @@ -96,7 +122,6 @@ class RegisterController extends Controller 'birth_date' => $birthdate, 'email' => $email, 'password' => Hash::make("MOTDEPASSE"), - // TODO : ??? 'address' => $address, 'address2' => $address2, 'town' => $town, @@ -108,11 +133,15 @@ class RegisterController extends Controller Mail::to($email)->send(new VerifyEmail($user)); return redirect()->route('login') - ->with('success', "Pour finaliser votre inscription, merci de cliquer sur le lien qui vient de vous être envoyé par email
      " . - "Informations complémentaires :
      " . - "- Vérifiez vos spams : l'email de confirmation s'y trouve peut-être
      " . - "- Attention : le mail peut parfois mettre quelques minutes à vous parvenir
      " . - "- L'activation de votre compte doit se faire dans les 24 heures qui suivent la demande de création."); + ->with( + 'success', + "Pour finaliser votre inscription, + merci de cliquer sur le lien qui vient de vous être envoyé par email
      + Informations complémentaires :
      + - Vérifiez vos spams : l'email de confirmation s'y trouve peut-être
      + - Attention : le mail peut parfois mettre quelques minutes à vous parvenir
      + - L'activation de votre compte doit se faire dans les 24 heures qui suivent la demande de création." + ); } else { if ($crmUser->code === 103) { return back() @@ -126,7 +155,13 @@ class RegisterController extends Controller }//end if } - private function isSQLDate($date) + /** + * Check if $date is a sql date + * + * @param string $date + * @return boolean + */ + private function isSqlDate(string $date) { if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date)) { return true; @@ -134,7 +169,13 @@ class RegisterController extends Controller return false; } - private function isFormDate($date) + /** + * Check if $date is a form date + * + * @param string $date + * @return boolean + */ + private function isFormDate(string $date) { if (preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}$/", $date)) { return true; diff --git a/app/Http/Controllers/TeaserController.php b/app/Http/Controllers/TeaserController.php index c096177..33ff028 100644 --- a/app/Http/Controllers/TeaserController.php +++ b/app/Http/Controllers/TeaserController.php @@ -6,6 +6,11 @@ use App\Models\Settings; class TeaserController extends Controller { + /** + * Show the teaser page if it is activated + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse + */ public function index() { $settings = app(Settings::class) diff --git a/app/Http/Controllers/ViewContentController.php b/app/Http/Controllers/ViewContentController.php index 0252344..8b7342e 100644 --- a/app/Http/Controllers/ViewContentController.php +++ b/app/Http/Controllers/ViewContentController.php @@ -6,18 +6,33 @@ use App\Models\Content; class ViewContentController extends Controller { + /** + * Show the rules view + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ public function reglement() { $content = Content::find(3); return view('front.basic.reglement', compact('content')); } + /** + * Show the privacy view + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ public function charte() { $content = Content::find(2); return view('front.basic.charte', compact('content')); } + /** + * Show the legals view + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ public function legals() { $content = Content::find(1); diff --git a/app/Http/Controllers/WinningProofController.php b/app/Http/Controllers/WinningProofController.php index ec300df..0f41d76 100644 --- a/app/Http/Controllers/WinningProofController.php +++ b/app/Http/Controllers/WinningProofController.php @@ -14,16 +14,28 @@ use Illuminate\Support\Facades\Mail; class WinningProofController extends Controller { + /** @var \LDCCRM\ApiV1 */ private $apiCrm; + /** + * Create a controller instance + * + * @return void + */ public function __construct() { $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } + /** + * Send winning proof to the mail specified in settings + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse + */ public function sendWinningProof(Request $request) { - // On récupère la participation gagnante en attente des infos + // On récupère la participation gagnante en attente des infos. $participation = Participation::where([ ['user_id', Auth::user()->id], ['sticker', null], diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 9b3090c..a2ab0d0 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -62,9 +62,9 @@ class Kernel extends HttpKernel 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'game-date' => \App\Http\Middleware\GameCheckDate::class, - 'is-admin' => \App\Http\Middleware\isAdmin::class, - 'is-super-admin' => \App\Http\Middleware\isSuperAdmin::class, - 're7' => \App\Http\Middleware\re7Middleware::class, + 'is-admin' => \App\Http\Middleware\IsAdmin::class, + 'is-super-admin' => \App\Http\Middleware\IsSuperAdmin::class, + 're7' => \App\Http\Middleware\Re7Middleware::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, diff --git a/app/Http/Middleware/isAdmin.php b/app/Http/Middleware/IsAdmin.php similarity index 97% rename from app/Http/Middleware/isAdmin.php rename to app/Http/Middleware/IsAdmin.php index 3786da6..8bece33 100644 --- a/app/Http/Middleware/isAdmin.php +++ b/app/Http/Middleware/IsAdmin.php @@ -6,7 +6,7 @@ use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -class isAdmin +class IsAdmin { /** * Handle an incoming request. diff --git a/app/Http/Middleware/isSuperAdmin.php b/app/Http/Middleware/IsSuperAdmin.php similarity index 80% rename from app/Http/Middleware/isSuperAdmin.php rename to app/Http/Middleware/IsSuperAdmin.php index 5817937..1c252b2 100644 --- a/app/Http/Middleware/isSuperAdmin.php +++ b/app/Http/Middleware/IsSuperAdmin.php @@ -3,9 +3,10 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -class isSuperAdmin +class IsSuperAdmin { /** * Handle an incoming request. @@ -14,7 +15,7 @@ class isSuperAdmin * @param \Closure $next * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { $role = Auth::user()->role; if ($role === 1) { diff --git a/app/Http/Middleware/re7Middleware.php b/app/Http/Middleware/Re7Middleware.php similarity index 77% rename from app/Http/Middleware/re7Middleware.php rename to app/Http/Middleware/Re7Middleware.php index eca5ed3..67a8999 100644 --- a/app/Http/Middleware/re7Middleware.php +++ b/app/Http/Middleware/Re7Middleware.php @@ -3,8 +3,9 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Http\Request; -class re7Middleware +class Re7Middleware { /** * Handle an incoming request. @@ -13,7 +14,7 @@ class re7Middleware * @param \Closure $next * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { if (config('app.env') === 'production') { return redirect()->route('home'); diff --git a/app/Http/Requests/Bo/Settings/UpdateSettingsRequest.php b/app/Http/Requests/Bo/Settings/UpdateSettingsRequest.php index c5c4521..e101c37 100644 --- a/app/Http/Requests/Bo/Settings/UpdateSettingsRequest.php +++ b/app/Http/Requests/Bo/Settings/UpdateSettingsRequest.php @@ -20,9 +20,11 @@ class UpdateSettingsRequest extends FormRequest * Prepare the data for validation. * * @return void + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh */ protected function prepareForValidation() { + // phpcs:enable $this->merge([ // Checkboxes. 'use_ean_codes' => $this->use_ean_codes ? true : false, diff --git a/app/Http/Requests/ParticipateRequest.php b/app/Http/Requests/ParticipateRequest.php index e9d24b3..8f2c89a 100644 --- a/app/Http/Requests/ParticipateRequest.php +++ b/app/Http/Requests/ParticipateRequest.php @@ -3,7 +3,6 @@ namespace App\Http\Requests; use App\Models\Code; -use App\Models\CodeEan; use App\Models\Participation; use App\Models\Product; use App\Models\Settings; diff --git a/app/Jobs/ProcessExportCodesUniques.php b/app/Jobs/ProcessExportCodesUniques.php index d302359..3e07314 100644 --- a/app/Jobs/ProcessExportCodesUniques.php +++ b/app/Jobs/ProcessExportCodesUniques.php @@ -32,6 +32,7 @@ class ProcessExportCodesUniques implements ShouldQueue /** * Nombre de codes par fichiers. + * * @var integer */ private $nbCodeFic; @@ -127,9 +128,11 @@ class ProcessExportCodesUniques implements ShouldQueue * * @param integer|null $lastExportedCodeId * @return array Array of temp files + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh */ private function generateCsvFiles($lastExportedCodeId = null): array { + // phpcs:enable $outPaths = []; $totalExportedCodes = 0; $currentFilename = 1; diff --git a/app/Jobs/ProcessUniqueCode.php b/app/Jobs/ProcessUniqueCode.php index bbf4eeb..e8c99d0 100644 --- a/app/Jobs/ProcessUniqueCode.php +++ b/app/Jobs/ProcessUniqueCode.php @@ -80,12 +80,14 @@ class ProcessUniqueCode implements ShouldQueue /** * Nombre d'insertions max sur un seule requète + * * @var integer $perPage */ $perPage = $maxSQLPlaceholders / $insertColumns; /** * Nombre de page totale à insérer. + * * @var integer $totalPages */ $totalPages = \ceil($this->quantity / $perPage); diff --git a/app/Mail/ExportCodesUniques.php b/app/Mail/ExportCodesUniques.php index 255eb10..a498d12 100644 --- a/app/Mail/ExportCodesUniques.php +++ b/app/Mail/ExportCodesUniques.php @@ -15,6 +15,7 @@ class ExportCodesUniques extends Mailable implements ShouldQueue /** * Nombre de codes par fichiers. + * * @var integer */ private $nbCodeFic; diff --git a/app/Mail/JobFailed.php b/app/Mail/JobFailed.php index ac15b7c..2d8efaf 100644 --- a/app/Mail/JobFailed.php +++ b/app/Mail/JobFailed.php @@ -11,16 +11,20 @@ class JobFailed extends Mailable use Queueable; use SerializesModels; + /** @var string */ public $job; + /** @var array */ public $exception; /** * Create a new message instance. * + * @param string $job + * @param array $exception * @return void */ - public function __construct($job, $exception) + public function __construct(string $job, array $exception) { $this->job = $job; $this->exception = $exception; diff --git a/app/Mail/NotifAdmin.php b/app/Mail/NotifAdmin.php index 8fdb222..aa2d7d8 100644 --- a/app/Mail/NotifAdmin.php +++ b/app/Mail/NotifAdmin.php @@ -12,14 +12,16 @@ class NotifAdmin extends Mailable implements ShouldQueue use Queueable; use SerializesModels; + /** @var string */ private $msg; /** * Create a new message instance. * + * @param string $msg * @return void */ - public function __construct($msg) + public function __construct(string $msg) { $this->msg = $msg; } diff --git a/app/Mail/NotifWinAdmin.php b/app/Mail/NotifWinAdmin.php index 93df26e..fcf9a01 100644 --- a/app/Mail/NotifWinAdmin.php +++ b/app/Mail/NotifWinAdmin.php @@ -2,6 +2,8 @@ namespace App\Mail; +use App\Models\Participation; +use App\Models\Settings; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; @@ -12,14 +14,20 @@ class NotifWinAdmin extends Mailable implements ShouldQueue use Queueable; use SerializesModels; - private $settings, $participation; + /** @var \App\Models\Settings */ + private $settings; + + /** @var \App\Models\Participation */ + private $participation; /** * Create a new message instance. * + * @param \App\Models\Settings $settings + * @param \App\Models\Participation $participation * @return void */ - public function __construct($settings, $participation) + public function __construct(Settings $settings, Participation $participation) { $this->settings = $settings; $this->participation = $participation; diff --git a/app/Mail/PasswordReset.php b/app/Mail/PasswordReset.php index 459b85c..2d17898 100644 --- a/app/Mail/PasswordReset.php +++ b/app/Mail/PasswordReset.php @@ -2,6 +2,8 @@ namespace App\Mail; +use App\Models\Settings; +use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; @@ -12,14 +14,21 @@ class PasswordReset extends Mailable implements ShouldQueue use Queueable; use SerializesModels; - protected $user, $settings; + /** @var \App\Models\User */ + protected $user; + + /** @var \App\Models\Settings */ + protected $settings; /** * Create a new message instance. * + * @param \App\Models\User $user + * @param \App\Models\Settings $settings + * * @return void */ - public function __construct($user, $settings) + public function __construct(User $user, Settings $settings) { $this->user = $user; $this->settings = $settings; @@ -32,6 +41,8 @@ class PasswordReset extends Mailable implements ShouldQueue */ public function build() { - return $this->subject('Changement de votre mot de passe')->view('front.basic.password-email')->with(['user' => $this->user, 'settings' => $this->settings]); + return $this->subject('Changement de votre mot de passe') + ->view('front.basic.password-email') + ->with(['user' => $this->user, 'settings' => $this->settings]); } } diff --git a/app/Mail/PrizeWon.php b/app/Mail/PrizeWon.php index 1b07c70..0a3da33 100644 --- a/app/Mail/PrizeWon.php +++ b/app/Mail/PrizeWon.php @@ -2,6 +2,9 @@ namespace App\Mail; +use App\Models\Prize; +use App\Models\Settings; +use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; @@ -12,14 +15,24 @@ class PrizeWon extends Mailable implements ShouldQueue use Queueable; use SerializesModels; - private $user, $prize, $settings; + /** @var \App\Models\User */ + private $user; + + /** @var \App\Models\Prize */ + private $prize; + + /** @var \App\Models\Settings */ + private $settings; /** * Create a new message instance. * + * @param \App\Models\User $user + * @param \App\Models\Prize $prize + * @param \App\Models\Settings $settings * @return void */ - public function __construct($user, $prize, $settings) + public function __construct(User $user, Prize $prize, Settings $settings) { $this->user = $user; $this->prize = $prize; @@ -33,7 +46,12 @@ class PrizeWon extends Mailable implements ShouldQueue */ public function build() { - return $this->subject("Félicitations " . $this->user->firstname . ", vous avez remporté 1 " . $this->prize->label_one . " !")->view('front.basic.prize-mail') + return $this->subject(sprintf( + 'Félicitations %s, vous avez remporté 1 %s !', + $this->user->firstname, + $this->prize->label_one + )) + ->view('front.basic.prize-mail') ->with(['user' => $this->user, 'prize' => $this->prize, 'settings' => $this->settings]); } } diff --git a/app/Mail/ReductionWon.php b/app/Mail/ReductionWon.php index f2a5935..4416353 100644 --- a/app/Mail/ReductionWon.php +++ b/app/Mail/ReductionWon.php @@ -2,6 +2,9 @@ namespace App\Mail; +use App\Models\Reduction; +use App\Models\Settings; +use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; @@ -12,14 +15,28 @@ class ReductionWon extends Mailable implements ShouldQueue use Queueable; use SerializesModels; - private $user, $coupon, $settings, $crmCoupon; + /** @var \App\Models\Customer */ + private $user; + + /** @var mixed */ + private $coupon; + + /** @var \App\Models\Settings */ + private $settings; + + /** @var \App\Models\Reduction */ + private $crmCoupon; /** * Create a new message instance. * + * @param \App\Models\User $user + * @param mixed $coupon + * @param \App\Models\Settings $settings + * @param \App\Models\Reduction $crmCoupon * @return void */ - public function __construct($user, $coupon, $settings, $crmCoupon) + public function __construct(User $user, mixed $coupon, Settings $settings, Reduction $crmCoupon) { $this->user = $user; $this->coupon = $coupon; @@ -34,7 +51,17 @@ class ReductionWon extends Mailable implements ShouldQueue */ public function build() { - return $this->subject($this->user->firstname . ", n'attendez plus pour imprimer votre bon d'achat " . $this->settings->name . " !")->view('front.basic.reduction-mail') - ->with(['user' => $this->user, 'coupon' => $this->coupon, 'settings' => $this->settings, 'crmCoupon' => $this->crmCoupon]); + return $this->subject(sprintf( + '%s, n\'attendez plus pour imprimer votre bon d\'achat %s !', + $this->user->firstname, + $this->settings->name + )) + ->view('front.basic.reduction-mail') + ->with([ + 'user' => $this->user, + 'coupon' => $this->coupon, + 'settings' => $this->settings, + 'crmCoupon' => $this->crmCoupon + ]); } } diff --git a/app/Mail/WinningProof.php b/app/Mail/WinningProof.php index 318834c..989a656 100644 --- a/app/Mail/WinningProof.php +++ b/app/Mail/WinningProof.php @@ -2,6 +2,9 @@ namespace App\Mail; +use App\Models\Participation; +use App\Models\Settings; +use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; @@ -12,15 +15,43 @@ class WinningProof extends Mailable implements ShouldQueue use Queueable; use SerializesModels; - private $sticker, $ticket, $barcode, $participation, $user, $settings; + /** @var string */ + private $sticker; + + /** @var string */ + private $ticket; + + /** @var string */ + private $barcode; + + /** @var \App\Models\Participation */ + private $participation; + + /** @var \App\Models\User */ + private $user; + + /** @var \App\Models\Settings */ + private $settings; /** * Create a new message instance. * + * @param string $sticker + * @param string $ticket + * @param string $barcode + * @param \App\Models\Participation $participation + * @param \App\Models\User $user + * @param \Models\Settings $settings * @return void */ - public function __construct($sticker, $ticket, $barcode, $participation, $user, $settings) - { + public function __construct( + string $sticker, + string $ticket, + string $barcode, + Participation $participation, + User $user, + Settings $settings + ) { $this->sticker = $sticker; $this->ticket = $ticket; $this->barcode = $barcode; diff --git a/app/Models/Customer.php b/app/Models/Customer.php index 974aebd..1dd554f 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -21,7 +21,7 @@ use Illuminate\Support\Facades\Hash; * @property string $postal_code Postal code * @property string $country Country * @property string $phone Phone number - * @property-read string $email_verify_token Token for email verification + * @property string $email_verify_token Token for email verification * @property-read boolean $email_verified Is the email verified ? * @property-read string $password_token Password token * @property-read \Illuminate\Support\Carbon $created_at Creation Date. diff --git a/app/Models/InstantWin.php b/app/Models/InstantWin.php index 2435abf..f61d074 100644 --- a/app/Models/InstantWin.php +++ b/app/Models/InstantWin.php @@ -8,7 +8,7 @@ use Illuminate\Database\Eloquent\Model; * InstantWin. * * @property-read \Illuminate\Support\Carbon $appear_date Appear date - * @property-read boolean $won Is the prize won ? + * @property boolean $won Is the prize won ? * * @property-read \App\Models\Prizes $prize Associated prize. * @property-read \App\Models\Participation $participation Associated participation. diff --git a/routes/web-re7.php b/routes/web-re7.php index 9e70d24..63e3298 100644 --- a/routes/web-re7.php +++ b/routes/web-re7.php @@ -1,18 +1,18 @@ middleware(['re7']) ->group(function () { - Route::get('/', [re7Controller::class, 'index']); - Route::get('/teaser', [re7Controller::class, 'teaser']); - Route::get('/mail-gain', [re7Controller::class, 'prizeMail']); - Route::get('/mail-reduction', [re7Controller::class, 'reductionMail']); - Route::get('/br', [re7Controller::class, 'br']); + Route::get('/', [Re7Controller::class, 'index']); + Route::get('/teaser', [Re7Controller::class, 'teaser']); + Route::get('/mail-gain', [Re7Controller::class, 'prizeMail']); + Route::get('/mail-reduction', [Re7Controller::class, 'reductionMail']); + Route::get('/br', [Re7Controller::class, 'br']); // phpcs:ignore // TODO : Rendre dynamique la partie gain par rapport au BO. - Route::get('/gain1', [re7Controller::class, 'gain1']); - Route::get('/gain2', [re7Controller::class, 'gain2']); + Route::get('/gain1', [Re7Controller::class, 'gain1']); + Route::get('/gain2', [Re7Controller::class, 'gain2']); }); From 247952ae5fadc77441653bd506816ed34d13f273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 11:18:05 +0100 Subject: [PATCH 017/145] composer update (audit fix) --- composer.lock | 1915 +++++++++++++++---------------------------------- 1 file changed, 564 insertions(+), 1351 deletions(-) diff --git a/composer.lock b/composer.lock index bf50212..0b65462 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "aba18a51281f2bde53e2123d600cfbbb", + "content-hash": "a9954eb63d103d31c2588aa402de2005", "packages": [ { "name": "brick/math", @@ -61,72 +61,6 @@ ], "time": "2023-01-15T23:15:59+00:00" }, - { - "name": "clue/stream-filter", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "Clue\\StreamFilter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", - "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" - ], - "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-21T13:15:14+00:00" - }, { "name": "dflydev/dot-access-data", "version": "v3.0.2", @@ -504,16 +438,16 @@ }, { "name": "egulias/email-validator", - "version": "4.0.1", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", - "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", "shasum": "" }, "require": { @@ -522,8 +456,8 @@ "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^4.30" + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -559,7 +493,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" }, "funding": [ { @@ -567,24 +501,24 @@ "type": "github" } ], - "time": "2023-01-14T14:17:03+00:00" + "time": "2023-10-06T06:47:41+00:00" }, { "name": "ezyang/htmlpurifier", - "version": "v4.16.0", + "version": "v4.17.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", - "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", "shasum": "" }, "require": { - "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" }, "require-dev": { "cerdic/css-tidy": "^1.7 || ^2.0", @@ -626,9 +560,9 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" }, - "time": "2022-09-18T07:06:19+00:00" + "time": "2023-11-17T15:01:25+00:00" }, { "name": "facade/ignition-contracts", @@ -685,21 +619,21 @@ }, { "name": "fruitcake/php-cors", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/fruitcake/php-cors.git", - "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", - "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "symfony/http-foundation": "^4.4|^5.4|^6" + "symfony/http-foundation": "^4.4|^5.4|^6|^7" }, "require-dev": { "phpstan/phpstan": "^1.4", @@ -709,7 +643,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.1-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -740,7 +674,7 @@ ], "support": { "issues": "https://github.com/fruitcake/php-cors/issues", - "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" }, "funding": [ { @@ -752,28 +686,28 @@ "type": "github" } ], - "time": "2022-02-20T15:07:15+00:00" + "time": "2023-10-12T05:21:21+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.1.1", + "version": "v1.1.2", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.1" + "phpoption/phpoption": "^1.9.2" }, "require-dev": { - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "autoload": { @@ -802,7 +736,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" }, "funding": [ { @@ -814,26 +748,26 @@ "type": "tidelift" } ], - "time": "2023-02-25T20:23:15+00:00" + "time": "2023-11-12T22:16:48+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -924,7 +858,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -940,7 +874,7 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", @@ -1027,16 +961,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -1123,7 +1057,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -1139,20 +1073,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:06:02+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.1", + "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", - "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/61bf437fc2197f587f6857d3ff903a24f1731b5d", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d", "shasum": "" }, "require": { @@ -1160,15 +1094,11 @@ "symfony/polyfill-php80": "^1.17" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", "phpunit/phpunit": "^8.5.19 || ^9.5.8", "uri-template/tests": "1.0.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "GuzzleHttp\\UriTemplate\\": "src" @@ -1207,7 +1137,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.2" }, "funding": [ { @@ -1223,65 +1153,7 @@ "type": "tidelift" } ], - "time": "2021-10-07T12:57:01+00:00" - }, - { - "name": "http-interop/http-factory-guzzle", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^1.7||^2.0", - "php": ">=7.3", - "psr/http-factory": "^1.0" - }, - "provide": { - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^9.5" - }, - "suggest": { - "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Factory\\Guzzle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "An HTTP Factory using Guzzle PSR7", - "keywords": [ - "factory", - "http", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" - }, - "time": "2021-07-21T13:50:14+00:00" + "time": "2023-08-27T10:19:19+00:00" }, { "name": "jean85/pretty-package-versions", @@ -1402,65 +1274,6 @@ }, "time": "2022-07-28T15:18:54+00:00" }, - { - "name": "kwaadpepper/exception-handler", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/Kwaadpepper/exception-handler.git", - "reference": "7a70b7093155f3e709d218a79cba3aae7db71edb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Kwaadpepper/exception-handler/zipball/7a70b7093155f3e709d218a79cba3aae7db71edb", - "reference": "7a70b7093155f3e709d218a79cba3aae7db71edb", - "shasum": "" - }, - "require": { - "illuminate/support": "~10", - "laravel/framework": "~10" - }, - "require-dev": { - "slevomat/coding-standard": "^8.10" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Kwaadpepper\\ExceptionHandler\\ExceptionHandlerServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Kwaadpepper\\ExceptionHandler\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jérémy Munsch", - "email": "github@jeremydev.ovh", - "homepage": "https://jeremydev.ovh" - } - ], - "description": "Send emails when exceptions occurs", - "homepage": "https://github.com/kwaadpepper/exception-handler", - "keywords": [ - "email", - "exception", - "laravel", - "policies" - ], - "support": { - "issues": "https://github.com/Kwaadpepper/exception-handler/issues", - "source": "https://github.com/Kwaadpepper/exception-handler/tree/2.0.0" - }, - "time": "2023-05-23T17:48:40+00:00" - }, { "name": "kwaadpepper/serial-int-caster", "version": "1.1.0", @@ -1509,16 +1322,16 @@ }, { "name": "laravel/framework", - "version": "v10.19.0", + "version": "v10.32.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb" + "reference": "b30e44f20d244f7ba125283e14a8bbac167f4e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", - "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", + "url": "https://api.github.com/repos/laravel/framework/zipball/b30e44f20d244f7ba125283e14a8bbac167f4e5b", + "reference": "b30e44f20d244f7ba125283e14a8bbac167f4e5b", "shasum": "" }, "require": { @@ -1536,7 +1349,7 @@ "ext-tokenizer": "*", "fruitcake/php-cors": "^1.2", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1", + "laravel/prompts": "^0.1.9", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", @@ -1551,7 +1364,7 @@ "symfony/console": "^6.2", "symfony/error-handler": "^6.2", "symfony/finder": "^6.2", - "symfony/http-foundation": "^6.2", + "symfony/http-foundation": "^6.3", "symfony/http-kernel": "^6.2", "symfony/mailer": "^6.2", "symfony/mime": "^6.2", @@ -1618,13 +1431,15 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^8.4", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.15.1", "pda/pheanstalk": "^4.0", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", "predis/predis": "^2.0.2", "symfony/cache": "^6.2", - "symfony/http-client": "^6.2.4" + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -1705,27 +1520,31 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-08-15T13:42:57+00:00" + "time": "2023-11-14T22:57:08+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.5", + "version": "v0.1.13", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc" + "reference": "e1379d8ead15edd6cc4369c22274345982edc95a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/d880a909df144a4bf5760ebd09aba114f79d9adc", - "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc", + "url": "https://api.github.com/repos/laravel/prompts/zipball/e1379d8ead15edd6cc4369c22274345982edc95a", + "reference": "e1379d8ead15edd6cc4369c22274345982edc95a", "shasum": "" }, "require": { "ext-mbstring": "*", "illuminate/collections": "^10.0|^11.0", "php": "^8.1", - "symfony/console": "^6.2" + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" }, "require-dev": { "mockery/mockery": "^1.5", @@ -1737,6 +1556,11 @@ "ext-pcntl": "Required for the spinner to be animated." }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, "autoload": { "files": [ "src/helpers.php" @@ -1751,22 +1575,22 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.5" + "source": "https://github.com/laravel/prompts/tree/v0.1.13" }, - "time": "2023-08-15T14:29:44+00:00" + "time": "2023-10-27T13:53:59+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.3.1", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", - "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", "shasum": "" }, "require": { @@ -1813,20 +1637,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-07-14T13:56:28+00:00" + "time": "2023-11-08T14:08:06+00:00" }, { "name": "laravel/tinker", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10" + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", - "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "url": "https://api.github.com/repos/laravel/tinker/zipball/b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3", "shasum": "" }, "require": { @@ -1839,6 +1663,7 @@ }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { @@ -1879,9 +1704,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.8.1" + "source": "https://github.com/laravel/tinker/tree/v2.8.2" }, - "time": "2023-02-15T16:40:09+00:00" + "time": "2023-08-15T14:27:00+00:00" }, { "name": "laravel/ui", @@ -1947,16 +1772,16 @@ }, { "name": "league/commonmark", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", "shasum": "" }, "require": { @@ -2049,7 +1874,7 @@ "type": "tidelift" } ], - "time": "2023-03-24T15:16:10+00:00" + "time": "2023-08-30T16:55:00+00:00" }, { "name": "league/config", @@ -2135,16 +1960,16 @@ }, { "name": "league/flysystem", - "version": "3.15.1", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a141d430414fcb8bf797a18716b09f759a385bed" + "reference": "a326d8a2d007e4ca327a57470846e34363789258" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a141d430414fcb8bf797a18716b09f759a385bed", - "reference": "a141d430414fcb8bf797a18716b09f759a385bed", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a326d8a2d007e4ca327a57470846e34363789258", + "reference": "a326d8a2d007e4ca327a57470846e34363789258", "shasum": "" }, "require": { @@ -2153,6 +1978,8 @@ "php": "^8.0.2" }, "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", @@ -2160,8 +1987,8 @@ "symfony/http-client": "<5.2" }, "require-dev": { - "async-aws/s3": "^1.5", - "async-aws/simple-s3": "^1.1", + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", "aws/aws-sdk-php": "^3.220.0", "composer/semver": "^3.0", "ext-fileinfo": "*", @@ -2171,8 +1998,8 @@ "google/cloud-storage": "^1.23", "microsoft/azure-storage-blob": "^1.1", "phpseclib/phpseclib": "^3.0.14", - "phpstan/phpstan": "^0.12.26", - "phpunit/phpunit": "^9.5.11", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", "sabre/dav": "^4.3.1" }, "type": "library", @@ -2207,7 +2034,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.15.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.21.0" }, "funding": [ { @@ -2219,20 +2046,20 @@ "type": "github" } ], - "time": "2023-05-04T09:04:26+00:00" + "time": "2023-11-18T13:59:15+00:00" }, { "name": "league/flysystem-local", - "version": "3.15.0", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", - "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", "shasum": "" }, "require": { @@ -2267,7 +2094,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.21.0" }, "funding": [ { @@ -2279,20 +2106,20 @@ "type": "github" } ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2023-11-18T13:41:42+00:00" }, { "name": "league/mime-type-detection", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", - "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", "shasum": "" }, "require": { @@ -2323,7 +2150,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" }, "funding": [ { @@ -2335,7 +2162,7 @@ "type": "tidelift" } ], - "time": "2023-08-05T12:09:49+00:00" + "time": "2023-10-17T14:13:20+00:00" }, { "name": "mews/purifier", @@ -2417,16 +2244,16 @@ }, { "name": "monolog/monolog", - "version": "3.4.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "e2392369686d420ca32df3803de28b5d6f76867d" + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d", - "reference": "e2392369686d420ca32df3803de28b5d6f76867d", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", "shasum": "" }, "require": { @@ -2502,7 +2329,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.4.0" + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" }, "funding": [ { @@ -2514,20 +2341,20 @@ "type": "tidelift" } ], - "time": "2023-06-21T08:46:11+00:00" + "time": "2023-10-27T15:32:31+00:00" }, { "name": "nesbot/carbon", - "version": "2.69.0", + "version": "2.71.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c" + "reference": "98276233188583f2ff845a0f992a235472d9466a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4308217830e4ca445583a37d1bf4aff4153fa81c", - "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", "shasum": "" }, "require": { @@ -2620,20 +2447,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T09:00:52+00:00" + "time": "2023-09-25T11:31:05+00:00" }, { "name": "nette/schema", - "version": "v1.2.4", + "version": "v1.2.5", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab" + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/c9ff517a53903b3d4e29ec547fb20feecb05b8ab", - "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", "shasum": "" }, "require": { @@ -2680,22 +2507,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.4" + "source": "https://github.com/nette/schema/tree/v1.2.5" }, - "time": "2023-08-05T18:56:25+00:00" + "time": "2023-10-05T20:37:59+00:00" }, { "name": "nette/utils", - "version": "v4.0.1", + "version": "v4.0.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e" + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/9124157137da01b1f5a5a22d6486cb975f26db7e", - "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e", + "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", "shasum": "" }, "require": { @@ -2717,8 +2544,7 @@ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { @@ -2767,9 +2593,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.1" + "source": "https://github.com/nette/utils/tree/v4.0.3" }, - "time": "2023-07-30T15:42:21+00:00" + "time": "2023-10-29T21:02:13+00:00" }, { "name": "nikic/php-parser", @@ -2915,16 +2741,16 @@ }, { "name": "nyholm/psr7", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", "shasum": "" }, "require": { @@ -2977,7 +2803,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + "source": "https://github.com/Nyholm/psr7/tree/1.8.1" }, "funding": [ { @@ -2989,405 +2815,20 @@ "type": "github" } ], - "time": "2023-05-02T11:26:24+00:00" - }, - { - "name": "php-http/client-common", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.17" - }, - "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\Common\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "common", - "http", - "httplug" - ], - "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.0" - }, - "time": "2023-05-17T06:46:59+00:00" - }, - { - "name": "php-http/discovery", - "version": "1.19.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e", - "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true - }, - "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", - "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" - ], - "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.1" - }, - "time": "2023-07-11T07:02:26+00:00" - }, - { - "name": "php-http/httplug", - "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", - "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "http" - ], - "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" - }, - "time": "2023-04-14T15:10:03+00:00" - }, - { - "name": "php-http/message", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "shasum": "" - }, - "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" - }, - "type": "library", - "autoload": { - "files": [ - "src/filters.php" - ], - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", - "keywords": [ - "http", - "message", - "psr-7" - ], - "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" - }, - "time": "2023-05-17T06:43:38+00:00" - }, - { - "name": "php-http/message-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", - "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", - "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" - ], - "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/1.1.0" - }, - "abandoned": "psr/http-factory", - "time": "2023-04-14T14:16:17+00:00" - }, - { - "name": "php-http/promise", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" - }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2023-11-13T09:31:12+00:00" }, { "name": "phpoption/phpoption", - "version": "1.9.1", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", "shasum": "" }, "require": { @@ -3395,7 +2836,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "extra": { @@ -3437,7 +2878,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" }, "funding": [ { @@ -3449,7 +2890,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T19:38:58+00:00" + "time": "2023-11-12T21:59:55+00:00" }, { "name": "psr/clock", @@ -3604,16 +3045,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -3650,9 +3091,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -3865,16 +3306,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.20", + "version": "v0.11.22", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "0fa27040553d1d280a67a4393194df5228afea5b" + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0fa27040553d1d280a67a4393194df5228afea5b", - "reference": "0fa27040553d1d280a67a4393194df5228afea5b", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", "shasum": "" }, "require": { @@ -3903,7 +3344,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.11.x-dev" + "dev-0.11": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -3935,9 +3380,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.20" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" }, - "time": "2023-07-31T14:32:22+00:00" + "time": "2023-10-14T21:56:36+00:00" }, { "name": "ralouphie/getallheaders", @@ -4074,16 +3519,16 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", "shasum": "" }, "require": { @@ -4150,7 +3595,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.5" }, "funding": [ { @@ -4162,7 +3607,7 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" + "time": "2023-11-08T05:53:05+00:00" }, { "name": "ruafozy/mersenne-twister", @@ -4207,110 +3652,40 @@ }, "time": "2015-02-21T10:26:45+00:00" }, - { - "name": "sentry/sdk", - "version": "3.5.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "cd91b752f07c4bab9fb3b173f81af68a78a78d6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/cd91b752f07c4bab9fb3b173f81af68a78a78d6d", - "reference": "cd91b752f07c4bab9fb3b173f81af68a78a78d6d", - "shasum": "" - }, - "require": { - "http-interop/http-factory-guzzle": "^1.0", - "sentry/sentry": "^3.19", - "symfony/http-client": "^4.3|^5.0|^6.0" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "sentry" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-php-sdk/issues", - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.5.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2023-06-12T17:50:36+00:00" - }, { "name": "sentry/sentry", - "version": "3.21.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f" + "reference": "fa41522f1fe5ff77a33a9db749c0ca7ec332f50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/624aafc22b84b089ffa43b71fb01e0096505ec4f", - "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/fa41522f1fe5ff77a33a9db749c0ca7ec332f50a", + "reference": "fa41522f1fe5ff77a33a9db749c0ca7ec332f50a", "shasum": "" }, "require": { + "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/promises": "^1.5.3|^2.0", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", "jean85/pretty-package-versions": "^1.5|^2.0.4", "php": "^7.2|^8.0", - "php-http/async-client-implementation": "^1.0", - "php-http/client-common": "^1.5|^2.0", - "php-http/discovery": "^1.15", - "php-http/httplug": "^1.1|^2.0", - "php-http/message": "^1.5", - "php-http/message-factory": "^1.1", - "psr/http-factory": "^1.0", - "psr/http-factory-implementation": "^1.0", "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", - "symfony/polyfill-php80": "^1.17" + "symfony/options-resolver": "^4.4.30|^5.0.11|^6.0|^7.0" }, "conflict": { - "php-http/client-common": "1.8.0", "raven/raven": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "friendsofphp/php-cs-fixer": "^3.4", + "guzzlehttp/promises": "^1.0|^2.0", "guzzlehttp/psr7": "^1.8.4|^2.1.1", - "http-interop/http-factory-guzzle": "^1.0", "monolog/monolog": "^1.6|^2.0|^3.0", - "nikic/php-parser": "^4.10.3", - "php-http/mock-client": "^1.3", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.3", - "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^8.5.14|^9.4", "symfony/phpunit-bridge": "^5.2|^6.0", "vimeo/psalm": "^4.17" @@ -4350,7 +3725,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.21.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.0.1" }, "funding": [ { @@ -4362,46 +3737,42 @@ "type": "custom" } ], - "time": "2023-07-31T15:31:24+00:00" + "time": "2023-11-13T13:00:41+00:00" }, { "name": "sentry/sentry-laravel", - "version": "3.7.3", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf" + "reference": "b6fbabbcb6623fc37a0bb373c4883dabfdda8026" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", - "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/b6fbabbcb6623fc37a0bb373c4883dabfdda8026", + "reference": "b6fbabbcb6623fc37a0bb373c4883dabfdda8026", "shasum": "" }, "require": { "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", - "sentry/sdk": "^3.4", - "sentry/sentry": "^3.20.1", + "sentry/sentry": "^4.0", "symfony/psr-http-message-bridge": "^1.0 | ^2.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.11", + "guzzlehttp/guzzle": "^7.2", + "laravel/folio": "^1.0", "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", + "livewire/livewire": "^2.0 | ^3.0", "mockery/mockery": "^1.3", "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.4 | ^9.3" + "phpunit/phpunit": "^8.4 | ^9.3 | ^10.4" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev", - "dev-0.x": "0.x-dev" - }, "laravel": { "providers": [ "Sentry\\Laravel\\ServiceProvider", @@ -4437,11 +3808,13 @@ "laravel", "log", "logging", - "sentry" + "profiling", + "sentry", + "tracing" ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/3.7.3" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.0.0" }, "funding": [ { @@ -4453,20 +3826,20 @@ "type": "custom" } ], - "time": "2023-08-03T10:10:23+00:00" + "time": "2023-11-16T12:33:52+00:00" }, { "name": "symfony/console", - "version": "v6.3.2", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898" + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/aa5d64ad3f63f2e48964fc81ee45cb318a723898", - "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898", + "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92", + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92", "shasum": "" }, "require": { @@ -4527,7 +3900,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.2" + "source": "https://github.com/symfony/console/tree/v6.3.8" }, "funding": [ { @@ -4543,7 +3916,7 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:28+00:00" + "time": "2023-10-31T08:09:35+00:00" }, { "name": "symfony/css-selector", @@ -4612,7 +3985,7 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -4659,7 +4032,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -4679,16 +4052,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.3.2", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a" + "reference": "1f69476b64fb47105c06beef757766c376b548c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a", - "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4", + "reference": "1f69476b64fb47105c06beef757766c376b548c4", "shasum": "" }, "require": { @@ -4733,7 +4106,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.3.2" + "source": "https://github.com/symfony/error-handler/tree/v6.3.5" }, "funding": [ { @@ -4749,7 +4122,7 @@ "type": "tidelift" } ], - "time": "2023-07-16T17:05:46+00:00" + "time": "2023-09-12T06:57:20+00:00" }, { "name": "symfony/event-dispatcher", @@ -4833,7 +4206,7 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -4889,7 +4262,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -4909,16 +4282,16 @@ }, { "name": "symfony/finder", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", "shasum": "" }, "require": { @@ -4953,7 +4326,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.3" + "source": "https://github.com/symfony/finder/tree/v6.3.5" }, "funding": [ { @@ -4969,190 +4342,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:31:44+00:00" - }, - { - "name": "symfony/http-client", - "version": "v6.3.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", - "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.3" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" - }, - "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", - "keywords": [ - "http" - ], - "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-07-05T08:41:27+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v3.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3b66325d0176b4ec826bffab57c9037d759c31fb", - "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-09-26T12:56:25+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.3.2", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3" + "reference": "ce332676de1912c4389222987193c3ef38033df6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", - "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6", + "reference": "ce332676de1912c4389222987193c3ef38033df6", "shasum": "" }, "require": { @@ -5162,12 +4365,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.3" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^5.4|^6.0", + "symfony/cache": "^6.3", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", @@ -5200,7 +4403,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.8" }, "funding": [ { @@ -5216,20 +4419,20 @@ "type": "tidelift" } ], - "time": "2023-07-23T21:58:39+00:00" + "time": "2023-11-07T10:17:15+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.3", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee" + "reference": "929202375ccf44a309c34aeca8305408442ebcc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d3b567f0addf695e10b0c6d57564a9bea2e058ee", - "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/929202375ccf44a309c34aeca8305408442ebcc1", + "reference": "929202375ccf44a309c34aeca8305408442ebcc1", "shasum": "" }, "require": { @@ -5238,7 +4441,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.3", "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^6.2.7", + "symfony/http-foundation": "^6.3.4", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -5246,7 +4449,7 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.3", + "symfony/dependency-injection": "<6.3.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", @@ -5270,7 +4473,7 @@ "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.3", + "symfony/dependency-injection": "^6.3.4", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", @@ -5313,7 +4516,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.3" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.8" }, "funding": [ { @@ -5329,20 +4532,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T10:33:00+00:00" + "time": "2023-11-10T13:47:32+00:00" }, { "name": "symfony/mailer", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435" + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435", - "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", "shasum": "" }, "require": { @@ -5393,7 +4596,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.3.0" + "source": "https://github.com/symfony/mailer/tree/v6.3.5" }, "funding": [ { @@ -5409,20 +4612,20 @@ "type": "tidelift" } ], - "time": "2023-05-29T12:49:39+00:00" + "time": "2023-09-06T09:47:15+00:00" }, { "name": "symfony/mime", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", - "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", "shasum": "" }, "require": { @@ -5477,7 +4680,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.3" + "source": "https://github.com/symfony/mime/tree/v6.3.5" }, "funding": [ { @@ -5493,7 +4696,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-09-29T06:59:36+00:00" }, { "name": "symfony/options-resolver", @@ -5564,16 +4767,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -5588,7 +4791,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5626,7 +4829,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -5642,20 +4845,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -5667,7 +4870,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5707,7 +4910,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -5723,20 +4926,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -5750,7 +4953,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5794,7 +4997,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -5810,20 +5013,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -5835,7 +5038,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5878,7 +5081,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -5894,20 +5097,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -5922,7 +5125,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5961,7 +5164,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -5977,20 +5180,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -5999,7 +5202,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6037,7 +5240,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -6053,20 +5256,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -6075,7 +5278,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6120,7 +5323,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -6136,20 +5339,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { @@ -6159,7 +5362,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6172,7 +5375,10 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - } + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6197,7 +5403,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -6213,20 +5419,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", "shasum": "" }, "require": { @@ -6241,7 +5447,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6279,7 +5485,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0" }, "funding": [ { @@ -6295,20 +5501,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/process", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", - "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { @@ -6340,7 +5546,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.2" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -6356,7 +5562,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6449,16 +5655,16 @@ }, { "name": "symfony/routing", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a" + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a", - "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a", + "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31", + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31", "shasum": "" }, "require": { @@ -6512,7 +5718,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.3.3" + "source": "https://github.com/symfony/routing/tree/v6.3.5" }, "funding": [ { @@ -6528,20 +5734,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-09-20T16:05:51+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", "shasum": "" }, "require": { @@ -6594,7 +5800,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" }, "funding": [ { @@ -6610,20 +5816,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/string", - "version": "v6.3.2", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "53d1a83225002635bca3482fcbf963001313fb68" + "reference": "13880a87790c76ef994c91e87efb96134522577a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", - "reference": "53d1a83225002635bca3482fcbf963001313fb68", + "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", + "reference": "13880a87790c76ef994c91e87efb96134522577a", "shasum": "" }, "require": { @@ -6680,7 +5886,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.2" + "source": "https://github.com/symfony/string/tree/v6.3.8" }, "funding": [ { @@ -6696,20 +5902,20 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-11-09T08:28:21+00:00" }, { "name": "symfony/translation", - "version": "v6.3.3", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" + "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "url": "https://api.github.com/repos/symfony/translation/zipball/30212e7c87dcb79c83f6362b00bde0e0b1213499", + "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499", "shasum": "" }, "require": { @@ -6775,7 +5981,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.3" + "source": "https://github.com/symfony/translation/tree/v6.3.7" }, "funding": [ { @@ -6791,20 +5997,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dee0c6e5b4c07ce851b462530088e64b255ac9c5", + "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5", "shasum": "" }, "require": { @@ -6853,7 +6059,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.0" }, "funding": [ { @@ -6869,20 +6075,20 @@ "type": "tidelift" } ], - "time": "2023-05-30T17:17:10+00:00" + "time": "2023-07-25T15:08:44+00:00" }, { "name": "symfony/uid", - "version": "v6.3.0", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384" + "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/01b0f20b1351d997711c56f1638f7a8c3061e384", - "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384", + "url": "https://api.github.com/repos/symfony/uid/zipball/819fa5ac210fb7ddda4752b91a82f50be7493dd9", + "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9", "shasum": "" }, "require": { @@ -6927,7 +6133,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.3.0" + "source": "https://github.com/symfony/uid/tree/v6.3.8" }, "funding": [ { @@ -6943,20 +6149,20 @@ "type": "tidelift" } ], - "time": "2023-04-08T07:25:02+00:00" + "time": "2023-10-31T08:07:48+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.3", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "77fb4f2927f6991a9843633925d111147449ee7a" + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/77fb4f2927f6991a9843633925d111147449ee7a", - "reference": "77fb4f2927f6991a9843633925d111147449ee7a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a", + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a", "shasum": "" }, "require": { @@ -7011,7 +6217,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.8" }, "funding": [ { @@ -7027,7 +6233,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-11-08T10:42:36+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7084,31 +6290,31 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.5.0", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -7120,7 +6326,7 @@ "forward-command": true }, "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -7152,7 +6358,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" }, "funding": [ { @@ -7164,7 +6370,7 @@ "type": "tidelift" } ], - "time": "2022-10-16T01:01:54+00:00" + "time": "2023-11-12T22:43:29+00:00" }, { "name": "voku/portable-ascii", @@ -7473,16 +6679,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.6", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "63646ffd71d1676d2f747f871be31b7e921c7864" + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/63646ffd71d1676d2f747f871be31b7e921c7864", - "reference": "63646ffd71d1676d2f747f871be31b7e921c7864", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2", + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2", "shasum": "" }, "require": { @@ -7498,9 +6704,9 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.29", + "phpstan/phpstan": "1.10.42", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.9", + "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", @@ -7566,7 +6772,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.6" + "source": "https://github.com/doctrine/dbal/tree/3.7.2" }, "funding": [ { @@ -7582,20 +6788,20 @@ "type": "tidelift" } ], - "time": "2023-08-17T05:38:17+00:00" + "time": "2023-11-19T08:06:58+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { @@ -7627,9 +6833,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2023-06-03T09:27:29+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/event-manager", @@ -7792,16 +6998,16 @@ }, { "name": "filp/whoops", - "version": "2.15.3", + "version": "2.15.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "c83e88a30524f9360b11f585f71e6b17313b7187" + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187", - "reference": "c83e88a30524f9360b11f585f71e6b17313b7187", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", "shasum": "" }, "require": { @@ -7851,7 +7057,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.3" + "source": "https://github.com/filp/whoops/tree/2.15.4" }, "funding": [ { @@ -7859,7 +7065,7 @@ "type": "github" } ], - "time": "2023-07-13T12:00:00+00:00" + "time": "2023-11-03T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -7914,16 +7120,16 @@ }, { "name": "kitloong/laravel-migrations-generator", - "version": "v6.10.0", + "version": "v6.11.0", "source": { "type": "git", "url": "https://github.com/kitloong/laravel-migrations-generator.git", - "reference": "116f50fab918b7f1363a40ebd954ce250f6aedcd" + "reference": "220b5f17fcb16610a3e9757d68c197319c0f7444" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kitloong/laravel-migrations-generator/zipball/116f50fab918b7f1363a40ebd954ce250f6aedcd", - "reference": "116f50fab918b7f1363a40ebd954ce250f6aedcd", + "url": "https://api.github.com/repos/kitloong/laravel-migrations-generator/zipball/220b5f17fcb16610a3e9757d68c197319c0f7444", + "reference": "220b5f17fcb16610a3e9757d68c197319c0f7444", "shasum": "" }, "require": { @@ -7977,7 +7183,7 @@ ], "support": { "issues": "https://github.com/kitloong/laravel-migrations-generator/issues", - "source": "https://github.com/kitloong/laravel-migrations-generator/tree/v6.10.0" + "source": "https://github.com/kitloong/laravel-migrations-generator/tree/v6.11.0" }, "funding": [ { @@ -7985,7 +7191,7 @@ "type": "custom" } ], - "time": "2023-03-26T07:37:00+00:00" + "time": "2023-10-10T13:55:26+00:00" }, { "name": "krlove/code-generator", @@ -8073,16 +7279,16 @@ }, { "name": "laravel/pint", - "version": "v1.11.0", + "version": "v1.13.6", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "88e835bf922b94017778bde89ef8f215e1ea40db" + "reference": "3e3d2ab01c7d8b484c18e6100ecf53639c744fa7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/88e835bf922b94017778bde89ef8f215e1ea40db", - "reference": "88e835bf922b94017778bde89ef8f215e1ea40db", + "url": "https://api.github.com/repos/laravel/pint/zipball/3e3d2ab01c7d8b484c18e6100ecf53639c744fa7", + "reference": "3e3d2ab01c7d8b484c18e6100ecf53639c744fa7", "shasum": "" }, "require": { @@ -8093,13 +7299,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.21.1", - "illuminate/view": "^10.5.1", - "laravel-zero/framework": "^10.1.1", - "mockery/mockery": "^1.5.1", - "nunomaduro/larastan": "^2.5.1", + "friendsofphp/php-cs-fixer": "^3.38.0", + "illuminate/view": "^10.30.1", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.6", + "nunomaduro/larastan": "^2.6.4", "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.4.0" + "pestphp/pest": "^2.24.2" }, "bin": [ "builds/pint" @@ -8135,31 +7341,31 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2023-08-15T15:30:00+00:00" + "time": "2023-11-07T17:59:57+00:00" }, { "name": "laravel/sail", - "version": "v1.23.4", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "cfa1ad579349110a87f9412eb65ecba94d682ac2" + "reference": "c60fe037004e272efd0d81f416ed2bfc623d70b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/cfa1ad579349110a87f9412eb65ecba94d682ac2", - "reference": "cfa1ad579349110a87f9412eb65ecba94d682ac2", + "url": "https://api.github.com/repos/laravel/sail/zipball/c60fe037004e272efd0d81f416ed2bfc623d70b4", + "reference": "c60fe037004e272efd0d81f416ed2bfc623d70b4", "shasum": "" }, "require": { - "illuminate/console": "^8.0|^9.0|^10.0", - "illuminate/contracts": "^8.0|^9.0|^10.0", - "illuminate/support": "^8.0|^9.0|^10.0", + "illuminate/console": "^9.0|^10.0|^11.0", + "illuminate/contracts": "^9.0|^10.0|^11.0", + "illuminate/support": "^9.0|^10.0|^11.0", "php": "^8.0", - "symfony/yaml": "^6.0" + "symfony/yaml": "^6.0|^7.0" }, "require-dev": { - "orchestra/testbench": "^6.0|^7.0|^8.0", + "orchestra/testbench": "^7.0|^8.0|^9.0", "phpstan/phpstan": "^1.10" }, "bin": [ @@ -8200,7 +7406,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2023-08-17T12:49:32+00:00" + "time": "2023-10-18T13:57:15+00:00" }, { "name": "mockery/mockery", @@ -8411,37 +7617,40 @@ }, { "name": "nunomaduro/collision", - "version": "v7.8.1", + "version": "v7.10.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "61553ad3260845d7e3e49121b7074619233d361b" + "reference": "49ec67fa7b002712da8526678abd651c09f375b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/61553ad3260845d7e3e49121b7074619233d361b", - "reference": "61553ad3260845d7e3e49121b7074619233d361b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2", "shasum": "" }, "require": { "filp/whoops": "^2.15.3", "nunomaduro/termwind": "^1.15.1", "php": "^8.1.0", - "symfony/console": "^6.3.2" + "symfony/console": "^6.3.4" + }, + "conflict": { + "laravel/framework": ">=11.0.0" }, "require-dev": { - "brianium/paratest": "^7.2.4", - "laravel/framework": "^10.17.1", - "laravel/pint": "^1.10.5", - "laravel/sail": "^1.23.1", - "laravel/sanctum": "^3.2.5", - "laravel/tinker": "^2.8.1", + "brianium/paratest": "^7.3.0", + "laravel/framework": "^10.28.0", + "laravel/pint": "^1.13.3", + "laravel/sail": "^1.25.0", + "laravel/sanctum": "^3.3.1", + "laravel/tinker": "^2.8.2", "nunomaduro/larastan": "^2.6.4", - "orchestra/testbench-core": "^8.5.9", - "pestphp/pest": "^2.12.1", - "phpunit/phpunit": "^10.3.1", + "orchestra/testbench-core": "^8.13.0", + "pestphp/pest": "^2.23.2", + "phpunit/phpunit": "^10.4.1", "sebastian/environment": "^6.0.1", - "spatie/laravel-ignition": "^2.2.0" + "spatie/laravel-ignition": "^2.3.1" }, "type": "library", "extra": { @@ -8500,7 +7709,7 @@ "type": "patreon" } ], - "time": "2023-08-07T08:03:21+00:00" + "time": "2023-10-11T15:45:01+00:00" }, { "name": "phar-io/manifest", @@ -8615,16 +7824,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.23.1", + "version": "1.24.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" + "reference": "12f01d214f1c73b9c91fdb3b1c415e4c70652083" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/12f01d214f1c73b9c91fdb3b1c415e4c70652083", + "reference": "12f01d214f1c73b9c91fdb3b1c415e4c70652083", "shasum": "" }, "require": { @@ -8656,22 +7865,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.3" }, - "time": "2023-08-03T16:32:59+00:00" + "time": "2023-11-18T20:15:32+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.3", + "version": "10.1.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" + "reference": "84838eed9ded511f61dc3e8b5944a52d9017b297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/84838eed9ded511f61dc3e8b5944a52d9017b297", + "reference": "84838eed9ded511f61dc3e8b5944a52d9017b297", "shasum": "" }, "require": { @@ -8728,7 +7937,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.8" }, "funding": [ { @@ -8736,20 +7945,20 @@ "type": "github" } ], - "time": "2023-07-26T13:45:28+00:00" + "time": "2023-11-15T13:31:15+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.0.2", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "5647d65443818959172645e7ed999217360654b6" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", - "reference": "5647d65443818959172645e7ed999217360654b6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { @@ -8789,7 +7998,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -8797,7 +8006,7 @@ "type": "github" } ], - "time": "2023-05-07T09:13:23+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", @@ -8864,16 +8073,16 @@ }, { "name": "phpunit/php-text-template", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { @@ -8911,7 +8120,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -8919,7 +8129,7 @@ "type": "github" } ], - "time": "2023-02-03T06:56:46+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", @@ -8982,16 +8192,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.2", + "version": "10.4.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" + "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", "shasum": "" }, "require": { @@ -9005,7 +8215,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-code-coverage": "^10.1.5", "phpunit/php-file-iterator": "^4.0", "phpunit/php-invoker": "^4.0", "phpunit/php-text-template": "^3.0", @@ -9015,7 +8225,7 @@ "sebastian/comparator": "^5.0", "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", + "sebastian/exporter": "^5.1", "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", @@ -9031,7 +8241,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.3-dev" + "dev-main": "10.4-dev" } }, "autoload": { @@ -9063,7 +8273,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" }, "funding": [ { @@ -9079,7 +8289,7 @@ "type": "tidelift" } ], - "time": "2023-08-15T05:34:23+00:00" + "time": "2023-10-26T07:21:45+00:00" }, { "name": "psr/cache", @@ -9376,16 +8586,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", "shasum": "" }, "require": { @@ -9398,7 +8608,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.1-dev" } }, "autoload": { @@ -9421,7 +8631,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" }, "funding": [ { @@ -9429,7 +8640,7 @@ "type": "github" } ], - "time": "2023-02-03T06:59:47+00:00" + "time": "2023-09-28T11:50:59+00:00" }, { "name": "sebastian/diff", @@ -9564,16 +8775,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { @@ -9587,7 +8798,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -9629,7 +8840,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -9637,7 +8849,7 @@ "type": "github" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", @@ -9703,16 +8915,16 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { @@ -9748,7 +8960,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -9756,7 +8969,7 @@ "type": "github" } ], - "time": "2023-02-03T07:08:02+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", @@ -10044,32 +9257,32 @@ }, { "name": "slevomat/coding-standard", - "version": "8.13.4", + "version": "8.14.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322" + "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4b2af2fb17773656d02fbfb5d18024ebd19fe322", - "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/fea1fd6f137cc84f9cba0ae30d549615dbc6a926", + "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": "^1.23.0", + "phpstan/phpdoc-parser": "^1.23.1", "squizlabs/php_codesniffer": "^3.7.1" }, "require-dev": { "phing/phing": "2.17.4", "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.10.26", - "phpstan/phpstan-deprecation-rules": "1.1.3", - "phpstan/phpstan-phpunit": "1.3.13", + "phpstan/phpstan": "1.10.37", + "phpstan/phpstan-deprecation-rules": "1.1.4", + "phpstan/phpstan-phpunit": "1.3.14", "phpstan/phpstan-strict-rules": "1.5.1", - "phpunit/phpunit": "7.5.20|8.5.21|9.6.8|10.2.6" + "phpunit/phpunit": "8.5.21|9.6.8|10.3.5" }, "type": "phpcodesniffer-standard", "extra": { @@ -10093,7 +9306,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.13.4" + "source": "https://github.com/slevomat/coding-standard/tree/8.14.1" }, "funding": [ { @@ -10105,7 +9318,7 @@ "type": "tidelift" } ], - "time": "2023-07-25T10:28:55+00:00" + "time": "2023-10-08T07:28:08+00:00" }, { "name": "spatie/backtrace", @@ -10171,35 +9384,35 @@ }, { "name": "spatie/flare-client-php", - "version": "1.4.2", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544" + "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5f2c6a7a0d2c1d90c12559dc7828fd942911a544", - "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", + "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0", + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", "nesbot/carbon": "^2.62.1", "php": "^8.0", "spatie/backtrace": "^1.5.2", - "symfony/http-foundation": "^5.0|^6.0", - "symfony/mime": "^5.2|^6.0", - "symfony/process": "^5.2|^6.0", - "symfony/var-dumper": "^5.2|^6.0" + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" }, "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.3.0", - "pestphp/pest": "^1.20", + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0" + "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" }, "type": "library", "extra": { @@ -10229,7 +9442,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.4.2" + "source": "https://github.com/spatie/flare-client-php/tree/1.4.3" }, "funding": [ { @@ -10237,20 +9450,20 @@ "type": "github" } ], - "time": "2023-07-28T08:07:24+00:00" + "time": "2023-10-17T15:54:07+00:00" }, { "name": "spatie/ignition", - "version": "1.9.0", + "version": "1.11.3", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "de24ff1e01814d5043bd6eb4ab36a5a852a04973" + "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/de24ff1e01814d5043bd6eb4ab36a5a852a04973", - "reference": "de24ff1e01814d5043bd6eb4ab36a5a852a04973", + "url": "https://api.github.com/repos/spatie/ignition/zipball/3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", + "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", "shasum": "" }, "require": { @@ -10259,19 +9472,19 @@ "php": "^8.0", "spatie/backtrace": "^1.5.3", "spatie/flare-client-php": "^1.4.0", - "symfony/console": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "require-dev": { - "illuminate/cache": "^9.52", + "illuminate/cache": "^9.52|^10.0|^11.0", "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20", + "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "psr/simple-cache-implementation": "*", - "symfony/cache": "^6.0", - "symfony/process": "^5.4|^6.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", "vlucas/phpdotenv": "^5.5" }, "suggest": { @@ -10320,20 +9533,20 @@ "type": "github" } ], - "time": "2023-06-28T13:24:59+00:00" + "time": "2023-10-18T14:09:40+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.2.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "dd15fbe82ef5392798941efae93c49395a87d943" + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/dd15fbe82ef5392798941efae93c49395a87d943", - "reference": "dd15fbe82ef5392798941efae93c49395a87d943", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/bf21cd15aa47fa4ec5d73bbc932005c70261efc8", + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8", "shasum": "" }, "require": { @@ -10412,7 +9625,7 @@ "type": "github" } ], - "time": "2023-06-28T13:51:52+00:00" + "time": "2023-10-09T12:55:26+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -10473,16 +9686,16 @@ }, { "name": "symfony/yaml", - "version": "v6.3.3", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92", + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92", "shasum": "" }, "require": { @@ -10525,7 +9738,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.3" + "source": "https://github.com/symfony/yaml/tree/v6.3.8" }, "funding": [ { @@ -10541,7 +9754,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-11-06T10:58:05+00:00" }, { "name": "thedoctor0/laravel-factory-generator", @@ -10607,16 +9820,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -10645,7 +9858,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -10653,7 +9866,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], From 05fa20765af8cdf1bb7a7cf9340772266f6495b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 11:19:30 +0100 Subject: [PATCH 018/145] PSR-4 fix --- app/Lib/Helpers/CollectionHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Lib/Helpers/CollectionHelper.php b/app/Lib/Helpers/CollectionHelper.php index a665a2f..b9e9ecd 100644 --- a/app/Lib/Helpers/CollectionHelper.php +++ b/app/Lib/Helpers/CollectionHelper.php @@ -1,6 +1,6 @@ Date: Mon, 20 Nov 2023 11:20:09 +0100 Subject: [PATCH 019/145] phpcs file rule fix --- phpcs.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/phpcs.xml b/phpcs.xml index 3e28d83..c00d4c3 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -6,7 +6,6 @@ app/ config/ - database/factories routes/ From 0fe116851a2c1965f4fbcd340ecc5630b8db9ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 11:30:22 +0100 Subject: [PATCH 020/145] npm audit fix force --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99185ab..ca2c6cd 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "scratchcard-js": "^1.5.0", "slugify": "^1.6.5", "stylelint": "^14.16.1", - "stylelint-config-idiomatic-order": "^8.1.0", + "stylelint-config-idiomatic-order": "^9.0.0", "stylelint-config-sass-guidelines": "^9.0.1", "stylelint-config-standard-scss": "^6.1.0", "stylelint-scss": "^4.4.0", From 90113782329337f81022707ad4f61b0a79d7fab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 12:20:13 +0100 Subject: [PATCH 021/145] Add theme-merger as submodule --- .gitmodules | 3 +++ resources/theme | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 resources/theme diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..988fea8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "resources/theme"] + path = resources/theme + url = ../gen-game-web-themes/theme-merger.git diff --git a/resources/theme b/resources/theme new file mode 160000 index 0000000..8f5a9df --- /dev/null +++ b/resources/theme @@ -0,0 +1 @@ +Subproject commit 8f5a9df62d44d9b60fa07da8cf4bf04a85d5694b From 6a5468df53472e1bb91c9fd072cbaa622fb37709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 15:42:16 +0100 Subject: [PATCH 022/145] Add theme switch command --- app/Console/Commands/Theme/SwitchCommand.php | 77 ++++++++++++++++++++ app/Lib/Helpers/ToolboxHelper.php | 38 +++++++++- resources/theme | 2 +- 3 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 app/Console/Commands/Theme/SwitchCommand.php diff --git a/app/Console/Commands/Theme/SwitchCommand.php b/app/Console/Commands/Theme/SwitchCommand.php new file mode 100644 index 0000000..fe5c12c --- /dev/null +++ b/app/Console/Commands/Theme/SwitchCommand.php @@ -0,0 +1,77 @@ + fn () => search( + label: 'Search for a theme:', + placeholder: 'default-theme', + options: fn (string $value): array => \collect(File::directories(\resource_path('theme'))) + ->map(fn (string $dir_path) => \pathinfo($dir_path, \PATHINFO_BASENAME)) + ->filter(fn (string $dir_path) => $value ? Str::of($dir_path)->contains($value) : true) + ->filter(fn (string $dir_path) => $dir_path !== 'mounted') + ->all() + ) + ]; + } + + /** + * Execute the console command. + * + * @return void + */ + public function handle(): void + { + $mount_path = \resource_path('theme/mounted'); + + /** @var string */ + $theme = $this->argument('theme'); + + if (File::exists($mount_path)) { + \throw_if( + empty(ToolboxHelper::runConsoleCommand("readlink {$mount_path}", false)), + "{$mount_path} is not a link, cannot remove it" + ); + \throw_if( + !File::delete($mount_path), + "{$mount_path} Failed to remove file" + ); + } + + File::link(\resource_path("theme/{$theme}"), $mount_path); + + Artisan::call('optimize:clear'); + } +} diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php index 6a9b932..d6b6fff 100644 --- a/app/Lib/Helpers/ToolboxHelper.php +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -20,6 +20,36 @@ use Symfony\Component\Finder\SplFileInfo; class ToolboxHelper { + /** + * Run a terminal command and gives the output + * + * @param array|string $command The command to execute on terminal. + * @param boolean $throw Wether to throw en esception on failure or not. + * @return string|false Return false on failure only if $throw is false. + * @phpcs:disable Squiz.Commenting.FunctionComment.EmptyThrows + * @phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber + * @throws \Illuminate\Process\Exceptions\ProcessTimedOutException + * @throws \Symfony\Component\Process\Exception\LogicException + * @throws \Symfony\Component\Process\Exception\InvalidArgumentException + * @throws \Symfony\Component\Process\Exception\RuntimeException + * @throws \LogicException + * @throws \RuntimeException If the command fails. + */ + public static function runConsoleCommand(array|string $command, bool $throw = true): string | false + { + // phpcs:enable + $process = \Illuminate\Support\Facades\Process::command($command)->run(); + if ($process->failed()) { + $code = $process->exitCode(); + $ouput = $process->errorOutput(); + if ($throw) { + throw new \RuntimeException("Failed to run command exit code {$code} with output \n{$ouput}"); + } + return false; + } + return $process->output(); + } + /** * @param array $array1 * @param array $array2 @@ -314,7 +344,7 @@ class ToolboxHelper ): Builder { $currentLocale = app()->currentLocale(); $locales = collect(config('app.locales')) - ->mapWithKeys(fn (string $locale) => [$locale => $locale]); + ->mapWithKeys(fn (string $locale) => [$locale => $locale]); if (!$locales->has($defaultLocale)) { // * Remove default locale. $locales->pull($defaultLocale); @@ -496,9 +526,9 @@ class ToolboxHelper public static function getClassesUsingNamespace(string $namespace): array { return collect(File::files(\app_path(Str::of($namespace)->replaceFirst('\App', '')))) - ->filter(fn (SplFileInfo $splFileInfo) => $splFileInfo->getExtension() === 'php') - ->map(fn (SplFileInfo $splFileInfo) => Str::of($splFileInfo->getBasename()) - ->replace('.' . $splFileInfo->getExtension(), '')->prepend("{$namespace}\\"))->all(); + ->filter(fn (SplFileInfo $splFileInfo) => $splFileInfo->getExtension() === 'php') + ->map(fn (SplFileInfo $splFileInfo) => Str::of($splFileInfo->getBasename()) + ->replace('.' . $splFileInfo->getExtension(), '')->prepend("{$namespace}\\"))->all(); } /** diff --git a/resources/theme b/resources/theme index 8f5a9df..dfaf7e3 160000 --- a/resources/theme +++ b/resources/theme @@ -1 +1 @@ -Subproject commit 8f5a9df62d44d9b60fa07da8cf4bf04a85d5694b +Subproject commit dfaf7e3bbb4758a6207543d42fa91ea62bca3da6 From 80cf81bc4b31adfd8c9b6155a08dad1c07d6a635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 16:03:55 +0100 Subject: [PATCH 023/145] Fix Bo compile --- .dockerignore | 2 + .eslintrc.json | 24 +- .gitignore | 46 +- .stylelintrc.json | 7 +- README.txt | 4 + package-lock.json | 9874 ++ package.json | 95 +- .../js/vendor/ckeditor/build/ckeditor.js | 119818 ++++++++++++++- .../ckeditor/build/ckeditor.js.LICENSE.txt | 23 + .../js/vendor/ckeditor/build/ckeditor.js.map | 1 - resources/js/vendor/ckeditor/build/styles.css | 7857 +- .../js/vendor/ckeditor/build/styles.css.map | 1 - .../vendor/ckeditor/build/translations/af.js | 2 +- .../vendor/ckeditor/build/translations/ar.js | 2 +- .../vendor/ckeditor/build/translations/ast.js | 2 +- .../vendor/ckeditor/build/translations/az.js | 2 +- .../vendor/ckeditor/build/translations/bg.js | 2 +- .../vendor/ckeditor/build/translations/bn.js | 2 +- .../vendor/ckeditor/build/translations/bs.js | 2 +- .../vendor/ckeditor/build/translations/ca.js | 2 +- .../vendor/ckeditor/build/translations/cs.js | 2 +- .../vendor/ckeditor/build/translations/da.js | 2 +- .../ckeditor/build/translations/de-ch.js | 2 +- .../vendor/ckeditor/build/translations/de.js | 2 +- .../vendor/ckeditor/build/translations/el.js | 2 +- .../ckeditor/build/translations/en-au.js | 2 +- .../ckeditor/build/translations/en-gb.js | 2 +- .../vendor/ckeditor/build/translations/en.js | 2 +- .../vendor/ckeditor/build/translations/eo.js | 2 +- .../ckeditor/build/translations/es-co.js | 2 +- .../vendor/ckeditor/build/translations/es.js | 2 +- .../vendor/ckeditor/build/translations/et.js | 2 +- .../vendor/ckeditor/build/translations/eu.js | 2 +- .../vendor/ckeditor/build/translations/fa.js | 2 +- .../vendor/ckeditor/build/translations/fi.js | 2 +- .../vendor/ckeditor/build/translations/gl.js | 2 +- .../vendor/ckeditor/build/translations/gu.js | 2 +- .../vendor/ckeditor/build/translations/he.js | 2 +- .../vendor/ckeditor/build/translations/hi.js | 2 +- .../vendor/ckeditor/build/translations/hr.js | 2 +- .../vendor/ckeditor/build/translations/hu.js | 2 +- .../vendor/ckeditor/build/translations/id.js | 2 +- .../vendor/ckeditor/build/translations/it.js | 2 +- .../vendor/ckeditor/build/translations/ja.js | 2 +- .../vendor/ckeditor/build/translations/jv.js | 2 +- .../vendor/ckeditor/build/translations/kk.js | 2 +- .../vendor/ckeditor/build/translations/km.js | 2 +- .../vendor/ckeditor/build/translations/kn.js | 2 +- .../vendor/ckeditor/build/translations/ko.js | 2 +- .../vendor/ckeditor/build/translations/ku.js | 2 +- .../vendor/ckeditor/build/translations/lt.js | 2 +- .../vendor/ckeditor/build/translations/lv.js | 2 +- .../vendor/ckeditor/build/translations/ms.js | 2 +- .../vendor/ckeditor/build/translations/nb.js | 2 +- .../vendor/ckeditor/build/translations/ne.js | 2 +- .../vendor/ckeditor/build/translations/nl.js | 2 +- .../vendor/ckeditor/build/translations/no.js | 2 +- .../vendor/ckeditor/build/translations/oc.js | 2 +- .../vendor/ckeditor/build/translations/pl.js | 2 +- .../ckeditor/build/translations/pt-br.js | 2 +- .../vendor/ckeditor/build/translations/pt.js | 2 +- .../vendor/ckeditor/build/translations/ro.js | 2 +- .../vendor/ckeditor/build/translations/ru.js | 2 +- .../vendor/ckeditor/build/translations/si.js | 2 +- .../vendor/ckeditor/build/translations/sk.js | 2 +- .../vendor/ckeditor/build/translations/sl.js | 2 +- .../vendor/ckeditor/build/translations/sq.js | 2 +- .../ckeditor/build/translations/sr-latn.js | 2 +- .../vendor/ckeditor/build/translations/sr.js | 2 +- .../vendor/ckeditor/build/translations/sv.js | 2 +- .../vendor/ckeditor/build/translations/th.js | 2 +- .../vendor/ckeditor/build/translations/tk.js | 2 +- .../vendor/ckeditor/build/translations/tr.js | 2 +- .../vendor/ckeditor/build/translations/tt.js | 2 +- .../vendor/ckeditor/build/translations/ug.js | 2 +- .../vendor/ckeditor/build/translations/uk.js | 2 +- .../vendor/ckeditor/build/translations/ur.js | 2 +- .../vendor/ckeditor/build/translations/uz.js | 2 +- .../vendor/ckeditor/build/translations/vi.js | 2 +- .../ckeditor/build/translations/zh-cn.js | 2 +- .../vendor/ckeditor/build/translations/zh.js | 2 +- .../js/vendor/ckeditor/package-lock.json | 8332 + resources/js/vendor/ckeditor/package.json | 67 +- resources/js/vendor/ckeditor/src/ckeditor.js | 206 +- .../js/vendor/ckeditor/webpack.config.js | 42 +- resources/sass/bo/base/_common.scss | 137 +- resources/sass/bo/base/_fonts.scss | 3 +- resources/sass/bo/bo.scss | 3 - .../sass/bo/utilities/_bootstrap-custom.scss | 16 +- resources/sass/bo/utilities/_variables.scss | 4 + resources/sass/bo/vendor/_bootstrap.scss | 77 +- resources/sass/bo/vendor/_fancybox.scss | 3 - resources/theme | 2 +- resources/ts/bo/{ => base}/common.ts | 4 +- resources/ts/{ => bo}/bo.ts | 9 +- resources/ts/bo/utilities/bootstrap.ts | 21 + resources/ts/bo/utilities/fontawesome.ts | 94 + resources/ts/bo/{ => utilities}/vue-bo.ts | 6 +- resources/ts/env.d.ts | 8 + resources/ts/index.d.ts | 4 +- resources/ts/modules/sweetalert.ts | 2 +- resources/ts/modules/sweetalertConfirm.ts | 16 +- resources/ts/modules/toast.ts | 15 +- resources/views/bo/layout.blade.php | 56 +- tsconfig.json | 31 +- vite.config.ts | 144 + webpack.mix.js | 40 - 107 files changed, 146638 insertions(+), 594 deletions(-) create mode 100644 .dockerignore create mode 100644 README.txt create mode 100644 package-lock.json create mode 100644 resources/js/vendor/ckeditor/build/ckeditor.js.LICENSE.txt delete mode 100644 resources/js/vendor/ckeditor/build/ckeditor.js.map delete mode 100644 resources/js/vendor/ckeditor/build/styles.css.map create mode 100644 resources/js/vendor/ckeditor/package-lock.json delete mode 100644 resources/sass/bo/vendor/_fancybox.scss mode change 160000 => 120000 resources/theme rename resources/ts/bo/{ => base}/common.ts (90%) rename resources/ts/{ => bo}/bo.ts (55%) create mode 100644 resources/ts/bo/utilities/bootstrap.ts create mode 100644 resources/ts/bo/utilities/fontawesome.ts rename resources/ts/bo/{ => utilities}/vue-bo.ts (90%) create mode 100644 resources/ts/env.d.ts create mode 100644 vite.config.ts delete mode 100644 webpack.mix.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..fac5ce7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +*.md diff --git a/.eslintrc.json b/.eslintrc.json index ecd6075..4acf8d1 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -10,16 +10,16 @@ ], "overrides": [ { - "files": ["*.ts", "*.vue"], - "rules": { - "no-undef": "off" - } + "files": ["*.ts", "*.vue"], + "rules": { + "no-undef": "off" + } }, { - "files": ["*.vue"], - "rules": { - "indent": "off" - } + "files": ["*.vue"], + "rules": { + "indent": "off" + } } ], "parser": "vue-eslint-parser", @@ -29,7 +29,13 @@ "sourceType": "module" }, "plugins": ["vue", "@typescript-eslint"], - "ignorePatterns": ["webpack.mix.js", "**/vendor/*.js", "**/vendor/**/*.js"], + "ignorePatterns": [ + "**/*.php", + "**/*.svg", + "**/vendor/*.js", + "**/vendor/**/*.js", + "**/vendor/**/*.scss" + ], "rules": { "indent": ["error", 4, { "SwitchCase": 1 }], "linebreak-style": ["error", "unix"], diff --git a/.gitignore b/.gitignore index b3a1c35..2174639 100644 --- a/.gitignore +++ b/.gitignore @@ -1,41 +1,29 @@ -public/front/* -/node_modules -/public/hot -/public/storage -/public/fichiers -/public/images/produits -/public/images/ranges -/public/css/* -/public/js/* -resources/views/errors/* -resources/views/front/basic/* -mix-manifest.json -/storage/*.key -/vendor -/resources/views/front/basic .env -.env.dev -.env.production .env.backup +.env.production .phpunit.result.cache -Homestead.json -Homestead.yaml -npm-debug.log -yarn-error.log -package-lock.json -composer.lock -resources/front -resources/js/basic.js -/.vscode -storage -README.txt -vite.config.ts .stylelintcache /.fleet /.idea /.phpunit.cache +/.vscode +/node_modules +/bootstrap /public/build /public/cache +/public/hot /public/sitemap.xml +/public/storage +/storage/*.key +/vendor auth.json docker-compose.override.yml +Homestead.json +Homestead.yaml +npm-debug.log +yarn-error.log +.npmrc +/resources/theme +# https://lab.s-web.fr/ldc-web/projets/gen-game-web/-/issues/17 +public/fichiers +storage diff --git a/.stylelintrc.json b/.stylelintrc.json index 99a7c07..94702b9 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -23,15 +23,12 @@ ], "customSyntax": "postcss-scss", "rules": { - "indentation": 4, - "string-quotes": "double", + "declaration-property-value-no-unknown": true, "selector-max-id": null, "color-no-invalid-hex": true, "order/properties-alphabetical-order": null, "max-nesting-depth": 5, "selector-max-compound-selectors": 5, - "declaration-colon-space-after": "always-single-line", - "function-parentheses-space-inside": "never-single-line", "declaration-colon-newline-after": null, "value-list-comma-newline-after": null, "scss/double-slash-comment-empty-line-before": [ @@ -45,4 +42,4 @@ } ] } -} +} \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..b4a8c3a --- /dev/null +++ b/README.txt @@ -0,0 +1,4 @@ +git checkout --orphan master +git add . +git commit -m "Initial commit" +git push \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7d0dfe5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9874 @@ +{ + "name": "srcs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "srcs", + "devDependencies": { + "@babel/core": "^7.22.11", + "@babel/types": "^7.21.2", + "@fortawesome/fontawesome-svg-core": "latest", + "@fortawesome/free-brands-svg-icons": "latest", + "@fortawesome/free-regular-svg-icons": "latest", + "@fortawesome/free-solid-svg-icons": "latest", + "@fortawesome/vue-fontawesome": "^3.0.3", + "@sipec/vue3-tags-input": "^3.0.4", + "@types/bootstrap": "^5.2.7", + "@types/node": "^20.8.2", + "@types/toastify-js": "^1.12.1", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.36.2", + "@vitejs/plugin-basic-ssl": "^1.0.1", + "@vitejs/plugin-legacy": "latest", + "@vitejs/plugin-vue": "latest", + "@vue/compiler-sfc": "latest", + "@vue/eslint-config-typescript": "latest", + "@vue/tsconfig": "latest", + "axios": "^1.5.1", + "bootstrap": "^5.3.2", + "chart.js": "^4.4.0", + "cropperjs": "^1.6.1", + "eslint": "latest", + "eslint-import-resolver-alias": "^1.1.2", + "eslint-plugin-vue": "latest", + "laravel-vite-plugin": "latest", + "postcss-discard-comments": "^6.0.0", + "prettier": "latest", + "print-js": "^1.6.0", + "resolve-url-loader": "^5.0.0", + "sass": "latest", + "slugify": "^1.6.6", + "stylelint": "latest", + "stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order", + "stylelint-config-sass-guidelines": "latest", + "stylelint-config-standard-scss": "latest", + "stylelint-scss": "latest", + "sweetalert2": "^11.7.31", + "terser": "latest", + "toastify-js": "^1.12.0", + "ts-loader": "^9.3.1", + "typescript": "latest", + "typescript-eslint": "latest", + "vite": "^4.0.0", + "vite-plugin-babel": "latest", + "vite-plugin-checker": "latest", + "vite-plugin-eslint": "latest", + "vite-plugin-stylelint": "latest", + "vue": "latest", + "vue-eslint-parser": "^9.1.0", + "vue-loader": "^16.8.3", + "vue-tsc": "1.6.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", + "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.2.1" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", + "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", + "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", + "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", + "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz", + "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz", + "integrity": "sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz", + "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/vue-fontawesome": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz", + "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==", + "dev": true, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "vue": ">= 3.0.0 < 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sipec/vue3-tags-input": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@sipec/vue3-tags-input/-/vue3-tags-input-3.0.4.tgz", + "integrity": "sha512-zE4OiFkWvlvvGT3FZQ9hRrvJW935VPW0fe4K03SxM5Q/UQZMqph763UHXTuyK1orWNQMTbDx9tKPLIMZTiDXLA==", + "dev": true, + "dependencies": { + "vue": "^3.0.0-beta.1" + }, + "peerDependencies": { + "vue": "3.x" + } + }, + "node_modules/@types/bootstrap": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.8.tgz", + "integrity": "sha512-14do+aWZPc1w3G+YevSsy8eas1XEPhTOUNBhQX/r12YKn7ySssATJusBQ/HCQAd2nq54U8vvrftHSb1YpeJUXg==", + "dev": true, + "dependencies": { + "@popperjs/core": "^2.9.2" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", + "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/minimist": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", + "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", + "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "dev": true + }, + "node_modules/@types/toastify-js": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@types/toastify-js/-/toastify-js-1.12.2.tgz", + "integrity": "sha512-wA0+1kG5Td0O7B/+ahHJgz5ZRFTYGNp8DmZ2z9LPm56+OrSikcfdqggtIlmbWKAssGgSR5sdyQaDyMoprvfNdA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-4.1.1.tgz", + "integrity": "sha512-um3gbVouD2Q/g19C0qpDfHwveXDCAHzs8OC3e9g6aXpKoD1H14himgs7wkMnhAynBJy7QqUoZNAXDuqN8zLR2g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "browserslist": "^4.21.9", + "core-js": "^3.31.1", + "magic-string": "^0.30.1", + "regenerator-runtime": "^0.13.11", + "systemjs": "^6.14.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^4.0.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", + "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.1.tgz", + "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.4.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.4.1.tgz", + "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", + "dev": true, + "dependencies": { + "muggle-string": "^0.2.2" + } + }, + "node_modules/@volar/typescript": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.4.1.tgz", + "integrity": "sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.4.1" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/vue-language-core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.6.0.tgz", + "integrity": "sha512-oyX+A4vclBlDB7UQtfAPraD6tt3nE+y9YNXdH+xjDi//Cokdx65PZnwLaiG+hURI6WgDn1ZQffTE1OeJtr786A==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.4.1", + "@volar/source-map": "1.4.1", + "@vue/compiler-dom": "^3.2.0", + "@vue/compiler-sfc": "^3.2.0", + "@vue/reactivity": "^3.2.0", + "@vue/shared": "^3.2.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + } + }, + "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@volar/vue-language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@volar/vue-typescript": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.6.0.tgz", + "integrity": "sha512-Ob5X/XICtwCFwHDo9zUhQuCIH4QmiDWX7DgQkuPBZkO18mirp27ymRJk2Q5EtHKedGQnTce/NRsoqjn8DnyLKw==", + "deprecated": "WARNING: This project has been renamed to @vue/typescript. Install using @vue/typescript instead.", + "dev": true, + "dependencies": { + "@volar/typescript": "1.4.1", + "@volar/vue-language-core": "1.6.0" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", + "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/shared": "3.3.7", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", + "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.3.7", + "@vue/shared": "3.3.7" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", + "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.7", + "@vue/compiler-dom": "3.3.7", + "@vue/compiler-ssr": "3.3.7", + "@vue/reactivity-transform": "3.3.7", + "@vue/shared": "3.3.7", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", + "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.3.7", + "@vue/shared": "3.3.7" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", + "integrity": "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/parser": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/scope-manager": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/type-utils": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/types": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", + "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.3.7" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", + "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.7", + "@vue/shared": "3.3.7", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", + "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.3.7", + "@vue/shared": "3.3.7" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", + "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.3.7", + "@vue/shared": "3.3.7", + "csstype": "^3.1.2" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", + "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.3.7", + "@vue/shared": "3.3.7" + }, + "peerDependencies": { + "vue": "3.3.7" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", + "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==", + "dev": true + }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001554", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz", + "integrity": "sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chart.js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.0.tgz", + "integrity": "sha512-vQEj6d+z0dcsKLlQvbKIMYFHd3t8W/7L2vfJIbYcfyPcRx92CsHqECpueN8qVGNlKyDcr5wBrYAYKnfu/9Q1hQ==", + "dev": true, + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", + "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", + "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cropperjs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.1.tgz", + "integrity": "sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "dev": true, + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.568", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.568.tgz", + "integrity": "sha512-3TCOv8+BY6Ltpt1/CmGBMups2IdKOyfEmz4J8yIS4xLSeMm0Rf+psSaxLuswG9qMKt+XbNbmADybtXGpTFlbDg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true, + "peer": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-alias": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz", + "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==", + "dev": true, + "engines": { + "node": ">= 4" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dev": true, + "peer": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz", + "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "node_modules/laravel-vite-plugin": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.1.tgz", + "integrity": "sha512-fxzUDjOA37kOsYq8dP+3oPIlw8/kJVXwu0hOXLun82R1LpV02shGeWGYKx2lbpKffL5I0sfPPjfqbYxuqBluAA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.0.5" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", + "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sorting": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", + "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "dev": true, + "peerDependencies": { + "postcss": "^8.4.20" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/print-js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz", + "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylelint": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", + "dev": true, + "dependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", + "@csstools/selector-specificity": "^3.0.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.2.1", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^7.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.29.0", + "mathml-tag-names": "^2.1.3", + "meow": "^10.1.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.28", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^3.0.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-idiomatic-order": { + "version": "10.0.0", + "resolved": "git+ssh://git@github.com/ream88/stylelint-config-idiomatic-order.git#2b456525ef46ed343959a664adbff608899f70de", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-order": "^6.0.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "stylelint": ">=11" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", + "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", + "dev": true, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "stylelint": "^15.10.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.0.0.tgz", + "integrity": "sha512-7AmMIsHTsuwUQm7I+DD5BGeIgCvqYZ4BpeYJJpb1cUXQwrJAKjA+GBotFZgUEGP8lAM+wmd91ovzOi8xfAyWEw==", + "dev": true, + "dependencies": { + "postcss-scss": "^4.0.7", + "stylelint-config-recommended": "^13.0.0", + "stylelint-scss": "^5.1.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^15.10.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-sass-guidelines": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-10.0.0.tgz", + "integrity": "sha512-+Rr2Dd4b72CWA4qoj1Kk+y449nP/WJsrD0nzQAWkmPPIuyVcy2GMIcfNr0Z8JJOLjRvtlkKxa49FCNXMePBikQ==", + "dev": true, + "dependencies": { + "postcss-scss": "^4.0.6", + "stylelint-scss": "^4.4.0" + }, + "engines": { + "node": "^14.13.1 || >=16.13.0 || >=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.21", + "stylelint": "^15.2.0" + } + }, + "node_modules/stylelint-config-sass-guidelines/node_modules/stylelint-scss": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", + "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", + "dev": true, + "dependencies": { + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.5.1 || ^15.0.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "34.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz", + "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^13.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "stylelint": "^15.10.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.0.0.tgz", + "integrity": "sha512-fGE79NBOLg09a9afqGH/guJulRULCaQWWv4cv1v2bMX92B+fGb0y56WqIguwvFcliPmmUXiAhKrrnXilIeXoHA==", + "dev": true, + "dependencies": { + "stylelint-config-recommended-scss": "^13.0.0", + "stylelint-config-standard": "^34.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^15.10.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-order": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz", + "integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==", + "dev": true, + "dependencies": { + "postcss": "^8.4.21", + "postcss-sorting": "^8.0.2" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0" + } + }, + "node_modules/stylelint-scss": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.2.1.tgz", + "integrity": "sha512-ZoTJUM85/qqpQHfEppjW/St//8s6p9Qsg8deWlYlr56F9iUgC9vXeIDQvH4odkRRJLTLFQzYMALSOFCQ3MDkgw==", + "dev": true, + "dependencies": { + "known-css-properties": "^0.28.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.5.1 || ^15.0.0" + } + }, + "node_modules/stylelint-scss/node_modules/known-css-properties": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", + "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", + "dev": true + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", + "dev": true, + "dependencies": { + "flat-cache": "^3.1.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stylelint/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/sweetalert2": { + "version": "11.7.32", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.32.tgz", + "integrity": "sha512-44tNNe2oLe7T94mT6dus4hc9G7qg6jZU/K5qZzpNS6e5HGPrSF6Kie6oZ7B5puIJydB34V2h/8f5EhIFivYo4A==", + "dev": true, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, + "node_modules/systemjs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.2.tgz", + "integrity": "sha512-1TlOwvKWdXxAY9vba+huLu99zrQURDWA8pUTYsRIYDZYQbGyK+pyEP4h4dlySsqo7ozyJBmYD20F+iUHhAltEg==", + "dev": true + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toastify-js": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", + "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", + "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "0.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-0.0.1-alpha.0.tgz", + "integrity": "sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-babel": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vite-plugin-babel/-/vite-plugin-babel-1.1.3.tgz", + "integrity": "sha512-WE8ORQm8530kj0geiDL1r/+P2MaU0b+5wL5E8Jq07aounFwRIUeJXziGiMr2DFQs78vaefB5GRKh257M8Z6gFQ==", + "dev": true, + "peerDependencies": { + "@babel/core": "^7.0.0", + "vite": "^2.7.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.2.tgz", + "integrity": "sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "semver": "^7.5.0", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": ">=1.3.9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vite-plugin-checker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/vite-plugin-checker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-checker/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-checker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vite-plugin-eslint": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", + "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.1", + "@types/eslint": "^8.4.5", + "rollup": "^2.77.2" + }, + "peerDependencies": { + "eslint": ">=7", + "vite": ">=2" + } + }, + "node_modules/vite-plugin-eslint/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz", + "integrity": "sha512-kVZFDFWr0DxiHn6MuDVTQf7gnWIdETGlZh0hvTiMXzRN80vgF4PKbONSq8U1d0WtHsKaFODTQgJeakLacoPZEQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "vite": "^2 || ^3 || ^4" + } + }, + "node_modules/vite-plugin-stylelint": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-stylelint/-/vite-plugin-stylelint-5.2.0.tgz", + "integrity": "sha512-Qv5i7v3DqtICuAGApkHAjf0KfUESp6U47W8LcMVZLywiaE4iT9bH8SMdzhaklJ21ejKl8satnj6znbvr8xJ23Q==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.5", + "chokidar": "^3.5.3", + "debug": "^4.3.4" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "@types/stylelint": "^13.0.0", + "postcss": "^7.0.0 || ^8.0.0", + "rollup": "^2.0.0 || ^3.0.0 || ^4.0.0", + "stylelint": "^13.0.0 || ^14.0.0 || ^15.0.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || 5.0.0-0" + }, + "peerDependenciesMeta": { + "@types/stylelint": { + "optional": true + }, + "postcss": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/vite-plugin-stylelint/node_modules/@rollup/pluginutils": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", + "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.3.7", + "@vue/compiler-sfc": "3.3.7", + "@vue/runtime-dom": "3.3.7", + "@vue/server-renderer": "3.3.7", + "@vue/shared": "3.3.7" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vue-loader": { + "version": "16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + } + }, + "node_modules/vue-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vue-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vue-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vue-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vue-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", + "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.6.0.tgz", + "integrity": "sha512-JO8Hmc/ZL8pEXtYsUuMFHIvpu5zqtBLtKBp6CRq2O0JVgrRGqYmVIq9v2R7LMVhMo1LhJEvPBWcE24w30mUvXQ==", + "dev": true, + "dependencies": { + "@volar/vue-language-core": "1.6.0", + "@volar/vue-typescript": "1.6.0", + "semver": "^7.3.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-tsc/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "peer": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index ca2c6cd..30ba274 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,8 @@ { "private": true, + "name": "srcs", "scripts": { + "vite": "vite --clearScreen false", "prod": "vite build --mode production", "dev": "NODE_ENV=development vite build -d --mode development", "watch": "NODE_ENV=development vite build --mode development --watch", @@ -12,63 +14,58 @@ "stylelint-ci": "node ./node_modules/.bin/stylelint --config './.stylelintrc.json' --max-warnings 0 '**/resources/**/*.scss' -f json" }, "devDependencies": { + "@babel/core": "^7.22.11", "@babel/types": "^7.21.2", - "@fancyapps/fancybox": "^3.5.7", - "@fortawesome/fontawesome-svg-core": "^6.1.2", - "@fortawesome/free-brands-svg-icons": "^6.1.2", - "@fortawesome/free-regular-svg-icons": "^6.1.2", - "@fortawesome/free-solid-svg-icons": "^6.1.2", - "@fortawesome/vue-fontawesome": "^3.0.1", - "@rushstack/eslint-patch": "^1.1.4", + "@fortawesome/fontawesome-svg-core": "latest", + "@fortawesome/free-brands-svg-icons": "latest", + "@fortawesome/free-regular-svg-icons": "latest", + "@fortawesome/free-solid-svg-icons": "latest", + "@fortawesome/vue-fontawesome": "^3.0.3", "@sipec/vue3-tags-input": "^3.0.4", - "@types/bootstrap": "^5.2.6", - "@types/toastify-js": "^1.11.1", - "@types/webpack-env": "^1.18.0", - "@typescript-eslint/eslint-plugin": "^5.36.2", + "@types/bootstrap": "^5.2.7", + "@types/node": "^20.8.2", + "@types/toastify-js": "^1.12.1", + "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.36.2", - "@vitejs/plugin-legacy": "^4.0.1", - "@vitejs/plugin-vue": "^4.0.0", - "@vue/eslint-config-typescript": "^11.0.0", - "axios": "^1.1.2", - "bootstrap": "^5.3.1", - "chart.js": "^4.3.3", - "cropperjs": "^1.5.12", - "cross-env": "^7.0", - "cssnano": "^5.0.2", - "eslint": "^8.35.0", + "@vitejs/plugin-basic-ssl": "^1.0.1", + "@vitejs/plugin-legacy": "latest", + "@vitejs/plugin-vue": "latest", + "@vue/compiler-sfc": "latest", + "@vue/eslint-config-typescript": "latest", + "@vue/tsconfig": "latest", + "axios": "^1.5.1", + "bootstrap": "^5.3.2", + "chart.js": "^4.4.0", + "cropperjs": "^1.6.1", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-vue": "^9.4.0", - "laravel-vite-plugin": "^0.7.2", - "postcss": "^8.4.21", - "postcss-discard-comments": "^5.1.2", - "postcss-html": "^1.5.0", - "postcss-scss": "^4.0.6", - "prettier": "^2.7.1", + "eslint-plugin-vue": "latest", + "eslint": "latest", + "laravel-vite-plugin": "latest", + "postcss-discard-comments": "^6.0.0", + "prettier": "latest", + "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", - "sass": "^1.58.3", - "sass-loader": "^12.6.0", - "scratchcard-js": "^1.5.0", - "slugify": "^1.6.5", - "stylelint": "^14.16.1", - "stylelint-config-idiomatic-order": "^9.0.0", - "stylelint-config-sass-guidelines": "^9.0.1", - "stylelint-config-standard-scss": "^6.1.0", - "stylelint-scss": "^4.4.0", - "stylelint-webpack-plugin": "^3.3.0", - "sweetalert2": "^11.4.8", - "swiper": "^10.2.0", + "sass": "latest", + "slugify": "^1.6.6", + "stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order", + "stylelint-config-sass-guidelines": "latest", + "stylelint-config-standard-scss": "latest", + "stylelint-scss": "latest", + "stylelint": "latest", + "sweetalert2": "^11.7.31", + "terser": "latest", "toastify-js": "^1.12.0", "ts-loader": "^9.3.1", - "typescript": "^4.9.5", - "typescript-eslint": "^0.0.1-alpha.0", + "typescript-eslint": "latest", + "typescript": "latest", + "vite-plugin-babel": "latest", + "vite-plugin-checker": "latest", + "vite-plugin-eslint": "latest", + "vite-plugin-stylelint": "latest", "vite": "^4.0.0", - "vite-plugin-checker": "^0.5.6", - "vite-plugin-eslint": "^1.8.1", - "vite-plugin-stylelint": "^4.2.0", - "vue": "^3.2.38", "vue-eslint-parser": "^9.1.0", "vue-loader": "^16.8.3", - "vue-tsc": "^1.2.0", - "vue3-nestable": "^3.0.3" + "vue": "latest", + "vue-tsc": "1.6.0" } -} +} \ No newline at end of file diff --git a/resources/js/vendor/ckeditor/build/ckeditor.js b/resources/js/vendor/ckeditor/build/ckeditor.js index 58d2359..c0a6792 100644 --- a/resources/js/vendor/ckeditor/build/ckeditor.js +++ b/resources/js/vendor/ckeditor/build/ckeditor.js @@ -1,7 +1,119819 @@ -!function(t){const e=t.fr=t.fr||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 sur %1","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite",Aquamarine:"Bleu vert",Big:"Grand",Black:"Noir","Block quote":"Citation",Blue:"Bleu",Bold:"Gras","Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Cancel:"Annuler","Characters: %0":"Caractères : %0","Choose heading":"Choisir l'en-tête",Circle:"Cercle",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire","Decrease indent":"Diminuer le retrait",Default:"Par défaut","Dim grey":"Gris pâle",Disc:"Disque","Document colors":"Couleurs du document",Downloadable:"Fichier téléchargeable","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Editor block content toolbar":"Barre d'outils du contenu du bloc éditeur","Editor contextual toolbar":"Barre d'outils contextuelle de l'éditeur","Editor editing area: %0":"Zone d'édition de l'éditeur : %0","Editor toolbar":"Barre d'outils de l'éditeur","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police",Green:"Vert",Grey:"Gris",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6","Horizontal line":"Ligne horizontale",Huge:"Enorme","Increase indent":"Augmenter le retrait","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc",Italic:"Italique",Justify:"Justifier","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Link:"Lien","Link URL":"URL du lien","List properties":"Liste des propriétés","Lower-latin":"Lettres minuscules","Lower–roman":"Chiffres romains en minuscules",Next:"Suivant","Numbered List":"Liste numérotée","Numbered list styles toolbar":"Barre d'outils des styles de liste numérotée","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet",Orange:"Orange",Paragraph:"Paragraphe","Press Enter to type after or press Shift + Enter to type before the widget":"Appuyez sur la touche Entrée pour taper après ou sur Maj + Entrée pour taper avant le widget.",Previous:"Précedent",Purple:"Violet",Red:"Rouge",Redo:"Restaurer","Remove color":"Enlever la couleur","Remove Format":"Enlever le format","Reversed order":"Ordre inversé","Rich Text Editor":"Éditeur de texte enrichi",Save:"Enregistrer","Select all":"Sélectionner tout","Show more items":"Montrer plus d'éléments",Small:"Petit",Source:"Source",Square:"Carré","Start at":"Commencer à","Start index must be greater than 0.":"L'indice de départ doit être supérieur à 0.","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte","This link has no URL":"Ce lien n'a pas d'URL",Tiny:"Minuscule","Toggle the circle list style":'Activer / désactiver le style de liste "cercle"',"Toggle the decimal list style":'Activer / désactiver le style de liste "chiffres"',"Toggle the decimal with leading zero list style":'Activer / désactiver le style de liste "chiffres de mêmes longueurs"',"Toggle the disc list style":'Activer / désactiver le style de liste "disque"',"Toggle the lower–latin list style":'Activer / désactiver le style de liste "lettres minuscules"',"Toggle the lower–roman list style":'Activer / désactiver le style de liste "chiffres romains en minuscules"',"Toggle the square list style":'Activer / désactiver le style de liste "carré"',"Toggle the upper–latin list style":'Activer / désactiver le style de liste "lettres majuscules"',"Toggle the upper–roman list style":'Activer / désactiver le style de liste "chiffres romains en majuscules"',Turquoise:"Turquoise",Underline:"Souligné",Undo:"Annuler",Unlink:"Supprimer le lien","Upper-latin":"Lettres majuscules","Upper-roman":"Chiffres romains en majuscules",White:"Blanc","Widget toolbar":"Barre d'outils du widget","Words: %0":"Mots : %0",Yellow:"Jaune"}),e.getPluralForm=function(t){return 0==t||1==t?0:0!=t&&t%1e6==0?1:2}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +(function(d){ const l = d['fr'] = d['fr'] || {}; l.dictionary=Object.assign( l.dictionary||{}, {"%0 of %1":"%0 sur %1",Accept:"","Align cell text to the bottom":"Aligner le texte en bas","Align cell text to the center":"Aligner la cellule au centre","Align cell text to the left":"Aligner la cellule à gauche","Align cell text to the middle":"Aligner le texte au milieu","Align cell text to the right":"Aligner la cellule à droite","Align cell text to the top":"Aligner le texte en haut","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",All:"Tous","Almost equal to":"Presque égal à",Angle:"Angle","Approximately equal to":"Environ égal à",Aquamarine:"Bleu vert",Arrows:"Flèches","Asterisk operator":"Astérisque","Austral sign":"Austral","back with leftwards arrow above":"Précédent avec flèche vers la gauche",Background:"Fond",Big:"Grand","Bitcoin sign":"Bitcoin",Black:"Noir","Block quote":"Citation","Block styles":"Styles de bloc",Blue:"Bleu","Blue marker":"Marqueur bleu",Bold:"Gras",Border:"Bordure","Break text":"Saut de ligne","Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Cancel:"Annuler","Caption for image: %0":"Légende de l'image : %0","Caption for the image":"Légende de l'image","Cedi sign":"Cédi","Cell properties":"Propriétés de la cellule","Cent sign":"Centime","Center table":"Centrer le tableau ","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Character categories":"Catégories de caractères","Characters: %0":"Caractères : %0","Choose heading":"Choisir l'en-tête",Circle:"Cercle",Code:"Code","Colon sign":"Deux points",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne","Contains as member":"Contient","Copyright sign":"Copyright","Cruzeiro sign":"Cruzeiro",Currency:"Devise","Currency sign":"Symbole monétaire",Dashed:"Tirets",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire","Decrease indent":"Diminuer le retrait",Default:"Par défaut","Degree sign":"Degré","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne","Dim grey":"Gris pâle",Dimensions:"Dimensions",Disc:"Disque","Division sign":"Division","Document colors":"Couleurs du document","Dollar sign":"Dollar","Dong sign":"Dong",Dotted:"Pointillés",Double:"Double","Double dagger":"Croix de Lorraine","Double exclamation mark":"Double point d'exclamation","Double low-9 quotation mark":"Guillemet-virgule double inférieur","Double question mark":"Double point d'interrogation",Downloadable:"Fichier téléchargeable","downwards arrow to bar":"Flèche vers le bas avec barre de fin","downwards dashed arrow":"Flèche en pointillés vers le bas","downwards double arrow":"Double flèche vers le bas","downwards simple arrow":"flèche simple vers le bas","Drachma sign":"Drachme","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Editor block content toolbar":"Barre d'outils du contenu du bloc éditeur","Editor contextual toolbar":"Barre d'outils contextuelle de l'éditeur","Editor editing area: %0":"Zone d'édition de l'éditeur : %0","Editor toolbar":"Barre d'outils de l'éditeur","Element of":"Appartient à","Em dash":"Tiret long","Empty set":"Élément vide","En dash":"Tiret","end with leftwards arrow above":"Fin avec flèche vers la gauche","Enter image caption":"Saisir la légende de l’image","Enter table caption":"Saisir la légende du tableau","Euro sign":"Euro","Euro-currency sign":"Symbole monétaire de l'euro","Exclamation question mark":"Point exclamation et question",Find:"Rechercher","Find and replace":"Rechercher et remplacer","Find in text…":"Rechercher dans le texte...","Font Background Color":"Couleur d'arrière-plan","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police","For all":"Pour tout","Fraction slash":"Fraction","French franc sign":"Franc français","Full size image":"Image taille réelle","German penny sign":"Pfennig","Greater-than or equal to":"Signe supérieur ou égal","Greater-than sign":"Signe supérieur",Green:"Vert","Green marker":"Marqueur vert","Green pen":"Crayon vert",Grey:"Gris",Groove:"Rainuré","Guarani sign":"Guarani","Header column":"Colonne d'entête","Header row":"Ligne d'entête",Heading:"En-tête","Heading 1":"Titre 1","Heading 2":"Titre 2","Heading 3":"Titre 3","Heading 4":"Titre 4","Heading 5":"Titre 5","Heading 6":"Titre 6",Height:"Hauteur",HEX:"",Highlight:"Surlignage","Horizontal ellipsis":"Trois points","Horizontal line":"Ligne horizontale","Horizontal text alignment toolbar":"Barre d'outils pour modifier l'alignement horizontal du texte","Hryvnia sign":"Hryvnia","HTML object":"Objet HTML",Huge:"Enorme","Identical to":"Identique à","Image resize list":"Liste des tailles d'images","Image toolbar":"Barre d'outils des images","image widget":"Objet image","In line":"Aligné","Increase indent":"Augmenter le retrait","Indian rupee sign":"Roupie indienne",Infinity:"Infini",Insert:"Insérer","Insert code block":"Insérer un bloc de code","Insert column left":"Insérer une colonne à gauche","Insert column right":"Insérer une colonne à droite","Insert image":"Insérer une image","Insert image via URL":"Insérer une image à partir d'une URL","Insert media":"Insérer un média","Insert paragraph after block":"Insérer du texte après ce bloc","Insert paragraph before block":"Insérer du texte avant ce bloc","Insert row above":"Insérer une ligne au-dessus","Insert row below":"Insérer une ligne en-dessous","Insert table":"Insérer un tableau",Inset:"Relief intérieur",Integral:"Intégrale",Intersection:"Intersection","Inverted exclamation mark":"Point d'exclamation inversé","Inverted question mark":"Point d'interrogation inversé",Italic:"Italique",Justify:"Justifier","Justify cell text":"Justifier le contenu de la cellule","Kip sign":"Kip",Latin:"Latin","Latin capital letter a with breve":"A bref majuscule","Latin capital letter a with macron":"A barre majuscule","Latin capital letter a with ogonek":"A ogonek majuscule","Latin capital letter c with acute":"C accent aigu majuscule","Latin capital letter c with caron":"C caron majuscule","Latin capital letter c with circumflex":"C circonflexe majuscule","Latin capital letter c with dot above":"C point suscrit majuscule","Latin capital letter d with caron":"D caron majuscule","Latin capital letter d with stroke":"D barré majuscule","Latin capital letter e with breve":"E bref majuscule","Latin capital letter e with caron":"E caron majuscule","Latin capital letter e with dot above":"E point suscrit majuscule","Latin capital letter e with macron":"E macron majuscule","Latin capital letter e with ogonek":"E ogonek majuscule","Latin capital letter eng":"Eng majuscule","Latin capital letter g with breve":"G bref majuscule","Latin capital letter g with cedilla":"G cédille majuscule","Latin capital letter g with circumflex":"G accent circonflexe majuscule","Latin capital letter g with dot above":"G point suscrit majuscule","Latin capital letter h with circumflex":"H accent circonflexe majuscule","Latin capital letter h with stroke":"H barré majuscule","Latin capital letter i with breve":"I bref majuscule","Latin capital letter i with dot above":"I point suscrit majuscule","Latin capital letter i with macron":"I macron majuscule","Latin capital letter i with ogonek":"I ogonek majuscule","Latin capital letter i with tilde":"I tilde majuscule","Latin capital letter j with circumflex":"J accent circonflexe majuscule","Latin capital letter k with cedilla":"K cédille majuscule","Latin capital letter l with acute":"L accent aigu majuscule","Latin capital letter l with caron":"L caron majuscule","Latin capital letter l with cedilla":"L cédille majuscule","Latin capital letter l with middle dot":"L point médian majuscule","Latin capital letter l with stroke":"L barré majuscule","Latin capital letter n with acute":"N accent aigu majuscule","Latin capital letter n with caron":"N caron majuscule","Latin capital letter n with cedilla":"N cédille majuscule","Latin capital letter o with breve":"O bref majuscule","Latin capital letter o with double acute":"O double accent aigu majuscule","Latin capital letter o with macron":"O macron majuscule","Latin capital letter r with acute":"R accent aigu majuscule","Latin capital letter r with caron":"R caron majuscule","Latin capital letter r with cedilla":"R cédille majuscule","Latin capital letter s with acute":"S accent aigu majuscule","Latin capital letter s with caron":"S caron majuscule","Latin capital letter s with cedilla":"S cédille majuscule","Latin capital letter s with circumflex":"S circonflexe majuscule","Latin capital letter t with caron":"T caron majuscule","Latin capital letter t with cedilla":"T cédille majuscule","Latin capital letter t with stroke":"T barré majuscule","Latin capital letter u with breve":"U bref majuscule","Latin capital letter u with double acute":"U double accent aigu majuscule","Latin capital letter u with macron":"U macron majuscule","Latin capital letter u with ogonek":"U ogonek majuscule","Latin capital letter u with ring above":"U rond en chef majuscule","Latin capital letter u with tilde":"U tilde majuscule","Latin capital letter w with circumflex":"W circonflexe majuscule","Latin capital letter y with circumflex":"Y circonflexe majuscule","Latin capital letter y with diaeresis":"Y tréma majuscule","Latin capital letter z with acute":"Z accent circonflexe majuscule","Latin capital letter z with caron":"Z caron majuscule","Latin capital letter z with dot above":"Z point suscrit majuscule","Latin capital ligature ij":"Digramme soudé IJ majuscule","Latin capital ligature oe":"O-E entrelacé majuscule","Latin small letter a with breve":"A bref minuscule","Latin small letter a with macron":"A barre minuscule","Latin small letter a with ogonek":"A ogonek minuscule","Latin small letter c with acute":"C accent aigu minuscule","Latin small letter c with caron":"C caron minuscule","Latin small letter c with circumflex":"C circonflexe minuscule","Latin small letter c with dot above":"C point suscrit minuscule","Latin small letter d with caron":"C caron minuscule","Latin small letter d with stroke":"D barré minuscule","Latin small letter dotless i":"I sans point minuscule","Latin small letter e with breve":"E bref minuscule","Latin small letter e with caron":"E caron minuscule","Latin small letter e with dot above":"E point suscrit minuscule","Latin small letter e with macron":"E macron minuscule","Latin small letter e with ogonek":"E ogonek minuscule","Latin small letter eng":"Eng minuscule","Latin small letter f with hook":"Fonction","Latin small letter g with breve":"G bref minuscule","Latin small letter g with cedilla":"G cédille minuscule","Latin small letter g with circumflex":"G accent circonflexe minuscule","Latin small letter g with dot above":"G point suscrit minuscule","Latin small letter h with circumflex":"H accent circonflexe minuscule","Latin small letter h with stroke":"H barré minuscule","Latin small letter i with breve":"I bref minuscule","Latin small letter i with macron":"I macron minuscule","Latin small letter i with ogonek":"I ogonek minuscule","Latin small letter i with tilde":"I tilde minuscule","Latin small letter j with circumflex":"J accent circonflexe minuscule","Latin small letter k with cedilla":"K cédille minuscule","Latin small letter kra":"Kra minuscule","Latin small letter l with acute":"L accent aigu minuscule","Latin small letter l with caron":"L caron minuscule","Latin small letter l with cedilla":"L cédille minuscule","Latin small letter l with middle dot":"L point médian minuscule","Latin small letter l with stroke":"L barré minuscule","Latin small letter long s":"S long minuscule","Latin small letter n preceded by apostrophe":"Apostrophe N minuscule","Latin small letter n with acute":"N accent aigu minuscule","Latin small letter n with caron":"N caron minuscule","Latin small letter n with cedilla":"N cédille minuscule","Latin small letter o with breve":"O bref minuscule","Latin small letter o with double acute":"O double accent aigu minuscule","Latin small letter o with macron":"O macron minuscule","Latin small letter r with acute":"R accent aigu minuscule","Latin small letter r with caron":"R caron minuscule","Latin small letter r with cedilla":"R cédille minuscule","Latin small letter s with acute":"S accent aigu minuscule","Latin small letter s with caron":"S caron minuscule","Latin small letter s with cedilla":"S cédille minuscule","Latin small letter s with circumflex":"S circonflexe minuscule","Latin small letter t with caron":"T caron minuscule","Latin small letter t with cedilla":"T cédille minuscule","Latin small letter t with stroke":"T barré minuscule","Latin small letter u with breve":"U bref minuscule","Latin small letter u with double acute":"U double accent aigu minuscule","Latin small letter u with macron":"U macron minuscule","Latin small letter u with ogonek":"U ogonek minuscule","Latin small letter u with ring above":"U rond en chef minuscule","Latin small letter u with tilde":"U tilde minuscule","Latin small letter w with circumflex":"W circonflexe minuscule","Latin small letter y with circumflex":"Y circonflexe minuscule","Latin small letter z with acute":"Z accent circonflexe minuscule","Latin small letter z with caron":"Z caron minuscule","Latin small letter z with dot above":"Z point suscrit minuscule","Latin small ligature ij":"Digramme soudé IJ minuscule","Latin small ligature oe":"O-E entrelacé minuscule","Left aligned image":"Image alignée à gauche","Left double quotation mark":"Guillemet-apostrophe double culbuté","Left single quotation mark":"Guillemet-apostrophe culbuté","Left-pointing double angle quotation mark":"Guillemet double vers la gauche","leftwards arrow to bar":"Flèche vers la gauche avec barre de fin","leftwards dashed arrow":"Flèche en pointillés vers la gauche","leftwards double arrow":"Double flèche vers la gauche","leftwards simple arrow":"flèche simple vers la gauche","Less-than or equal to":"Signe inférieur ou égal","Less-than sign":"Signe inférieur","Light blue":"Bleu clair","Light green":"Vert clair","Light grey":"Gris clair",Link:"Lien","Link image":"Lien d'image","Link URL":"URL du lien","Lira sign":"Lire","List properties":"Liste des propriétés","Livre tournois sign":"Livre tournois","Logical and":"Et logique","Logical or":"Ou logique","Lower-latin":"Lettres minuscules","Lower–roman":"Chiffres romains en minuscules",Macron:"Macron","Manat sign":"Manat","Match case":"Sensible à la casse",Mathematical:"Mathématique","Media URL":"URL de média","media widget":"Widget média","Merge cell down":"Fusionner la cellule en-dessous","Merge cell left":"Fusionner la cellule à gauche","Merge cell right":"Fusionner la cellule à droite","Merge cell up":"Fusionner la cellule au-dessus","Merge cells":"Fusionner les cellules","Mill sign":"Moulin","Minus sign":"Moins","Multiple styles":"Styles multiples","Multiplication sign":"Multiplication","N-ary product":"Produit","N-ary summation":"Somme",Nabla:"Nabla","Naira sign":"Naira","New sheqel sign":"Shekel",Next:"Suivant","Next result":"Résultat suivant",None:"Aucun","Nordic mark sign":"Mark nordique","Not an element of":"N'appartient pas à","Not equal to":"Différent de","Not sign":"Négation logique","Numbered List":"Liste numérotée","Numbered list styles toolbar":"Barre d'outils des styles de liste numérotée","on with exclamation mark with left right arrow above":"Allumé avec flèches vers la gauche et la droite","Open in a new tab":"Ouvrir dans un nouvel onglet","Open link in new tab":"Ouvrir le lien dans un nouvel onglet","Open media in new tab":"Ouvrir le média dans un nouvel onglet",Orange:"Orange",Original:"Taille originale",Outset:"Relief extérieur",Overline:"Macron long",Padding:"Remplissage pour aérer le texte",Paragraph:"Paragraphe","Paragraph sign":"Fin de paragraphe","Partial differential":"Partiellement différent","Paste the media URL in the input.":"Coller l'URL du média","Per mille sign":"Pour mille","Per ten thousand sign":"Pour dix milles","Peseta sign":"Peseta","Peso sign":"Peso","Pink marker":"Marqueur rose","Plain text":"Texte brut","Plus-minus sign":"Plus ou moins","Pound sign":"Livre sterling","Press Enter to type after or press Shift + Enter to type before the widget":"Appuyez sur la touche Entrée pour taper après ou sur Maj + Entrée pour taper avant le widget.",Previous:"Précedent","Previous result":"Résultat précédent","Proportional to":"Proportionnel à",Purple:"Violet","Question exclamation mark":"Point d'interrogation et exclamation",Red:"Rouge","Red pen":"Crayon rouge",Redo:"Restaurer","Registered sign":"Registered","Remove color":"Enlever la couleur","Remove Format":"Enlever le format","Remove highlight":"Enlever le surlignage",Replace:"Remplacer","Replace all":"Remplacer tout","Replace with…":"Remplacer par ...","Resize image":"Redimensionner l'image","Resize image to %0":"Redimensionner à %0","Resize image to the original size":"Appliquer les dimensions d'origine","Restore default":"Restaurer par défaut","Reversed order":"Ordre inversé","Reversed paragraph sign":"Fin de paragraphe inversé","Rich Text Editor":"Éditeur de texte enrichi",Ridge:"Relief","Right aligned image":"Image alignée à droite","Right double quotation mark":"Guillemet-apostrophe double","Right single quotation mark":"Guillemet-apostrophe","Right-pointing double angle quotation mark":"Guillemet double vers la droite","rightwards arrow to bar":"Flèche vers la droite avec barre de fin","rightwards dashed arrow":"Flèche en pointillés vers la droite","rightwards double arrow":"Double flèche vers la droite","rightwards simple arrow":"flèche simple vers la droite",Row:"Ligne","Ruble sign":"Rouble","Rupee sign":"Roupie",Save:"Enregistrer","Section sign":"Paragraphe","Select all":"Sélectionner tout","Select column":"Sélectionner la colonne","Select row":"Sélectionner la ligne","Show more items":"Montrer plus d'éléments","Show options":"Afficher les options","Side image":"Image latérale","Single left-pointing angle quotation mark":"Guillemet simple vers la gauche","Single low-9 quotation mark":"Guillemet-virgule inférieur","Single right-pointing angle quotation mark":"Guillemet simple vers la droite",Small:"Petit",Solid:"Continu","soon with rightwards arrow above":"Bientôt avec flèche vers la droite",Source:"Source","Special characters":"Caractères spéciaux","Spesmilo sign":"Spesmilo","Split cell horizontally":"Scinder la cellule horizontalement","Split cell vertically":"Scinder la cellule verticalement",Square:"Carré","Square root":"Racine carrée","Start at":"Commencer à","Start index must be greater than 0.":"L'indice de départ doit être supérieur à 0.",Strikethrough:"Barré",Style:"Style",Styles:"Styles","Table alignment toolbar":"Barre d'outils pour modifier l'alignement du tableau","Table cell text alignment":"Alignement du texte de la cellule","Table properties":"Propriétés du tableau","Table toolbar":"Barre d'outils des tableaux","Tenge sign":"Tenge",Text:"Texte","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte","Text alternative":"Texte alternatif","Text highlight toolbar":"Barre d'outils du surlignage","Text styles":"Styles de texte","Text to find must not be empty.":"L'expression à rechercher ne doit pas être vide","The color is invalid. Try \"#FF0000\" or \"rgb(255,0,0)\" or \"red\".":"La couleur est invalide. Essayez \"#FF0000\" ou \"rgb(255,0,0)\" ou \"red\".","The URL must not be empty.":"L'URL ne doit pas être vide.","The value is invalid. Try \"10px\" or \"2em\" or simply \"2\".":"La valeur est invalide. Essayez \"10px\" ou \"2em\" ou simplement \"2\".","There exists":"Existe","This link has no URL":"Ce lien n'a pas d'URL","This media URL is not supported.":"Cette URL de média n'est pas supportée.","Tilde operator":"Tilde",Tiny:"Minuscule","Tip: Find some text first in order to replace it.":"Astuce : rechercher une expression afin de la remplacer","Tip: Paste the URL into the content to embed faster.":"Astuce : Copier l'URL du média dans le contenu pour l'insérer plus rapidement","Toggle caption off":"Désactiver la légende","Toggle caption on":"Activer la légende","Toggle the circle list style":"Activer / désactiver le style de liste \"cercle\"","Toggle the decimal list style":"Activer / désactiver le style de liste \"chiffres\"","Toggle the decimal with leading zero list style":"Activer / désactiver le style de liste \"chiffres de mêmes longueurs\"","Toggle the disc list style":"Activer / désactiver le style de liste \"disque\"","Toggle the lower–latin list style":"Activer / désactiver le style de liste \"lettres minuscules\"","Toggle the lower–roman list style":"Activer / désactiver le style de liste \"chiffres romains en minuscules\"","Toggle the square list style":"Activer / désactiver le style de liste \"carré\"","Toggle the upper–latin list style":"Activer / désactiver le style de liste \"lettres majuscules\"","Toggle the upper–roman list style":"Activer / désactiver le style de liste \"chiffres romains en majuscules\"","top with upwards arrow above":"Haut avec flèche vers le haut","Trade mark sign":"Marque déposée","Tugrik sign":"Tugrik","Turkish lira sign":"Lire turque",Turquoise:"Turquoise","Two dot leader":"Deux points",Underline:"Souligné",Undo:"Annuler",Union:"Union",Unlink:"Supprimer le lien","up down arrow with base":"Flèche haut et bas avec barre de fin",Update:"Modifier","Update image URL":"Modifier l'URL de l'image","Upload failed":"Échec de l'envoi","Upload in progress":"Téléchargement en cours","Upper-latin":"Lettres majuscules","Upper-roman":"Chiffres romains en majuscules","upwards arrow to bar":"Flèche vers le haut avec barre de fin","upwards dashed arrow":"Flèche en pointillés vers le haut","upwards double arrow":"Double flèche vers le haut","upwards simple arrow":"flèche simple vers le haut","Vertical text alignment toolbar":"Barre d'outils pour modifier l'alignement vertical du texte","Vulgar fraction one half":"Un demi","Vulgar fraction one quarter":"Un quart","Vulgar fraction three quarters":"Trois quarts",White:"Blanc","Whole words only":"Mots entiers uniquement","Widget toolbar":"Barre d'outils du widget",Width:"Largeur","Won sign":"Won","Words: %0":"Mots : %0","Wrap text":"Retour à la ligne",Yellow:"Jaune","Yellow marker":"Marqueur jaune","Yen sign":"Yen"} );l.getPluralForm=function(n){return (n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;;};})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); /*! * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md. */ -function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClassicEditor=e():t.ClassicEditor=e()}(self,(()=>(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var e={};function i({emitter:t,activator:e,callback:i,contextElements:n}){t.listenTo(document,"mousedown",((t,s)=>{if(!e())return;const o="function"==typeof s.composedPath?s.composedPath():[],r="function"==typeof n?n():n;for(const t of r)if(t.contains(s.target)||o.includes(t))return;i()}))}function n({keystrokeHandler:t,focusTracker:e,gridItems:i,numberOfColumns:n,uiLanguageDirection:s}){const o="number"==typeof n?()=>n:n;function r(t){return n=>{const s=i.find((t=>t.element===e.focusedElement)),o=i.getIndex(s),r=t(o,i);i.get(r).focus(),n.stopPropagation(),n.preventDefault()}}function a(t,e){return t===e-1?0:t+1}function l(t,e){return 0===t?e-1:t-1}t.set("arrowright",r(((t,e)=>"rtl"===s?l(t,e.length):a(t,e.length)))),t.set("arrowleft",r(((t,e)=>"rtl"===s?a(t,e.length):l(t,e.length)))),t.set("arrowup",r(((t,e)=>{let i=t-o();return i<0&&(i=t+o()*Math.floor(e.length/o()),i>e.length-1&&(i-=o())),i}))),t.set("arrowdown",r(((t,e)=>{let i=t+o();return i>e.length-1&&(i=t%o()),i})))}t.d(e,{default:()=>K_});const s=function(){try{return navigator.userAgent.toLowerCase()}catch(t){return""}}(),o={isMac:a(s),isWindows:function(t){return t.indexOf("windows")>-1}(s),isGecko:function(t){return!!t.match(/gecko\/\d+/)}(s),isSafari:function(t){return t.indexOf(" applewebkit/")>-1&&-1===t.indexOf("chrome")}(s),isiOS:function(t){return!!t.match(/iphone|ipad/i)||a(t)&&navigator.maxTouchPoints>0}(s),isAndroid:function(t){return t.indexOf("android")>-1}(s),isBlink:function(t){return t.indexOf("chrome/")>-1&&t.indexOf("edge/")<0}(s),features:{isRegExpUnicodePropertySupported:function(){let t=!1;try{t=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(t){}return t}()}},r=o;function a(t){return t.indexOf("macintosh")>-1}function l(t,e,i,n){i=i||function(t,e){return t===e};const s=Array.isArray(t)?t:Array.prototype.slice.call(t),o=Array.isArray(e)?e:Array.prototype.slice.call(e),r=function(t,e,i){const n=c(t,e,i);if(-1===n)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const s=h(t,n),o=h(e,n),r=c(s,o,i),a=t.length-r,l=e.length-r;return{firstIndex:n,lastIndexOld:a,lastIndexNew:l}}(s,o,i),a=n?function(t,e){const{firstIndex:i,lastIndexOld:n,lastIndexNew:s}=t;if(-1===i)return Array(e).fill("equal");let o=[];i>0&&(o=o.concat(Array(i).fill("equal")));s-i>0&&(o=o.concat(Array(s-i).fill("insert")));n-i>0&&(o=o.concat(Array(n-i).fill("delete")));s0&&i.push({index:n,type:"insert",values:t.slice(n,o)});s-n>0&&i.push({index:n+(o-n),type:"delete",howMany:s-n});return i}(o,r);return a}function c(t,e,i){for(let n=0;n200||s>200||n+s>300)return d.fastDiff(t,e,i,!0);let o,r;if(sc?-1:1;h[n+d]&&(h[n]=h[n+d].slice(0)),h[n]||(h[n]=[]),h[n].push(s>c?o:r);let f=Math.max(s,c),m=f-n;for(;mc;m--)u[m]=f(m);u[c]=f(c),g++}while(u[c]!==l);return h[c].slice(1)}function u(t,...e){e.forEach((e=>{const i=Object.getOwnPropertyNames(e),n=Object.getOwnPropertySymbols(e);i.concat(n).forEach((i=>{if(i in t.prototype)return;if("function"==typeof e&&("length"==i||"name"==i||"prototype"==i))return;const n=Object.getOwnPropertyDescriptor(e,i);n.enumerable=!1,Object.defineProperty(t.prototype,i,n)}))}))}d.fastDiff=l;const f=function(){return function t(){t.called=!0}};class m{constructor(t,e){this.source=t,this.name=e,this.path=[],this.stop=f(),this.off=f()}}const g=new Array(256).fill("").map(((t,e)=>("0"+e.toString(16)).slice(-2)));function p(){const t=4294967296*Math.random()>>>0,e=4294967296*Math.random()>>>0,i=4294967296*Math.random()>>>0,n=4294967296*Math.random()>>>0;return"e"+g[t>>0&255]+g[t>>8&255]+g[t>>16&255]+g[t>>24&255]+g[e>>0&255]+g[e>>8&255]+g[e>>16&255]+g[e>>24&255]+g[i>>0&255]+g[i>>8&255]+g[i>>16&255]+g[i>>24&255]+g[n>>0&255]+g[n>>8&255]+g[n>>16&255]+g[n>>24&255]}const w={get(t="normal"){return"number"!=typeof t?this[t]||this.normal:t},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};function b(t,e){const i=w.get(e.priority);for(let n=0;n{if("object"==typeof e&&null!==e){if(i.has(e))return`[object ${e.constructor.name}]`;i.add(e)}return e},s=e?` ${JSON.stringify(e,n)}`:"",o=k(t);return t+s+o}(t,i)),this.name="CKEditorError",this.context=e,this.data=i}is(t){return"CKEditorError"===t}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError"))throw t;const i=new v(t.message,e);throw i.stack=t.stack,i}}function y(t,e){console.warn(...A(t,e))}function k(t){return`\nRead more: ${_}#error-${t}`}function A(t,e){const i=k(t);return e?[t,e,i]:[t,i]}const x="36.0.0",C="object"==typeof window?window:t.g;if(C.CKEDITOR_VERSION)throw new v("ckeditor-duplicated-modules",null);C.CKEDITOR_VERSION=x;const P=Symbol("listeningTo"),T=Symbol("emitterId"),E=Symbol("delegations"),S=R(Object);function R(t){if(!t)return S;return class extends t{on(t,e,i){this.listenTo(this,t,e,i)}once(t,e,i){let n=!1;this.listenTo(this,t,((t,...i)=>{n||(n=!0,t.off(),e.call(this,t,...i))}),i)}off(t,e){this.stopListening(this,t,e)}listenTo(t,e,i,n={}){let s,o;this[P]||(this[P]={});const r=this[P];I(t)||O(t);const a=I(t);(s=r[a])||(s=r[a]={emitter:t,callbacks:{}}),(o=s.callbacks[e])||(o=s.callbacks[e]=[]),o.push(i),function(t,e,i,n,s){e._addEventListener?e._addEventListener(i,n,s):t._addEventListener.call(e,i,n,s)}(this,t,e,i,n)}stopListening(t,e,i){const n=this[P];let s=t&&I(t);const o=n&&s?n[s]:void 0,r=o&&e?o.callbacks[e]:void 0;if(!(!n||t&&!o||e&&!r))if(i){D(this,t,e,i);-1!==r.indexOf(i)&&(1===r.length?delete o.callbacks[e]:D(this,t,e,i))}else if(r){for(;i=r.pop();)D(this,t,e,i);delete o.callbacks[e]}else if(o){for(e in o.callbacks)this.stopListening(t,e);delete n[s]}else{for(s in n)this.stopListening(n[s].emitter);delete this[P]}}fire(t,...e){try{const i=t instanceof m?t:new m(this,t),n=i.name;let s=N(this,n);if(i.path.push(this),s){const t=[i,...e];s=Array.from(s);for(let e=0;e{this[E]||(this[E]=new Map),t.forEach((t=>{const n=this[E].get(t);n?n.set(e,i):this[E].set(t,new Map([[e,i]]))}))}}}stopDelegating(t,e){if(this[E])if(t)if(e){const i=this[E].get(t);i&&i.delete(e)}else this[E].delete(t);else this[E].clear()}_addEventListener(t,e,i){!function(t,e){const i=V(t);if(i[e])return;let n=e,s=null;const o=[];for(;""!==n&&!i[n];)i[n]={callbacks:[],childEvents:[]},o.push(i[n]),s&&i[n].childEvents.push(s),s=n,n=n.substr(0,n.lastIndexOf(":"));if(""!==n){for(const t of o)t.callbacks=i[n].callbacks.slice();i[n].childEvents.push(s)}}(this,t);const n=M(this,t),s={callback:e,priority:w.get(i.priority)};for(const t of n)b(t,s)}_removeEventListener(t,e){const i=M(this,t);for(const t of i)for(let i=0;i-1?N(t,e.substr(0,e.lastIndexOf(":"))):null}function B(t,e,i){for(let[n,s]of t){s?"function"==typeof s&&(s=s(e.name)):s=e.name;const t=new m(e.source,s);t.path=[...e.path],n.fire(t,...i)}}function D(t,e,i,n){e._removeEventListener?e._removeEventListener(i,n):t._removeEventListener.call(e,i,n)}["on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{R[t]=S.prototype[t]}));const F=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)},L=Symbol("observableProperties"),z=Symbol("boundObservables"),H=Symbol("boundProperties"),j=Symbol("decoratedMethods"),$=Symbol("decoratedOriginal"),W=q(R());function q(t){if(!t)return W;return class extends t{set(t,e){if(F(t))return void Object.keys(t).forEach((e=>{this.set(e,t[e])}),this);U(this);const i=this[L];if(t in this&&!i.has(t))throw new v("observable-set-cannot-override",this);Object.defineProperty(this,t,{enumerable:!0,configurable:!0,get:()=>i.get(t),set(e){const n=i.get(t);let s=this.fire(`set:${t}`,t,e,n);void 0===s&&(s=e),n===s&&i.has(t)||(i.set(t,s),this.fire(`change:${t}`,t,s,n))}}),this[t]=e}bind(...t){if(!t.length||!J(t))throw new v("observable-bind-wrong-properties",this);if(new Set(t).size!==t.length)throw new v("observable-bind-duplicate-properties",this);U(this);const e=this[H];t.forEach((t=>{if(e.has(t))throw new v("observable-bind-rebind",this)}));const i=new Map;return t.forEach((t=>{const n={property:t,to:[]};e.set(t,n),i.set(t,n)})),{to:K,toMany:G,_observable:this,_bindProperties:t,_to:[],_bindings:i}}unbind(...t){if(!this[L])return;const e=this[H],i=this[z];if(t.length){if(!J(t))throw new v("observable-unbind-wrong-properties",this);t.forEach((t=>{const n=e.get(t);n&&(n.to.forEach((([t,e])=>{const s=i.get(t),o=s[e];o.delete(n),o.size||delete s[e],Object.keys(s).length||(i.delete(t),this.stopListening(t,"change"))})),e.delete(t))}))}else i.forEach(((t,e)=>{this.stopListening(e,"change")})),i.clear(),e.clear()}decorate(t){U(this);const e=this[t];if(!e)throw new v("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:t});this.on(t,((t,i)=>{t.return=e.apply(this,i)})),this[t]=function(...e){return this.fire(t,e)},this[t][$]=e,this[j]||(this[j]=[]),this[j].push(t)}stopListening(t,e,i){if(!t&&this[j]){for(const t of this[j])this[t]=this[t][$];delete this[j]}super.stopListening(t,e,i)}}}function U(t){t[L]||(Object.defineProperty(t,L,{value:new Map}),Object.defineProperty(t,z,{value:new Map}),Object.defineProperty(t,H,{value:new Map}))}function K(...t){const e=function(...t){if(!t.length)throw new v("observable-bind-to-parse-error",null);const e={to:[]};let i;"function"==typeof t[t.length-1]&&(e.callback=t.pop());return t.forEach((t=>{if("string"==typeof t)i.properties.push(t);else{if("object"!=typeof t)throw new v("observable-bind-to-parse-error",null);i={observable:t,properties:[]},e.to.push(i)}})),e}(...t),i=Array.from(this._bindings.keys()),n=i.length;if(!e.callback&&e.to.length>1)throw new v("observable-bind-to-no-callback",this);if(n>1&&e.callback)throw new v("observable-bind-to-extra-callback",this);var s;e.to.forEach((t=>{if(t.properties.length&&t.properties.length!==n)throw new v("observable-bind-to-properties-length",this);t.properties.length||(t.properties=this._bindProperties)})),this._to=e.to,e.callback&&(this._bindings.get(i[0]).callback=e.callback),s=this._observable,this._to.forEach((t=>{const e=s[z];let i;e.get(t.observable)||s.listenTo(t.observable,"change",((n,o)=>{i=e.get(t.observable)[o],i&&i.forEach((t=>{Q(s,t.property)}))}))})),function(t){let e;t._bindings.forEach(((i,n)=>{t._to.forEach((s=>{e=s.properties[i.callback?0:t._bindProperties.indexOf(n)],i.to.push([s.observable,e]),function(t,e,i,n){const s=t[z],o=s.get(i),r=o||{};r[n]||(r[n]=new Set);r[n].add(e),o||s.set(i,r)}(t._observable,i,s.observable,e)}))}))}(this),this._bindProperties.forEach((t=>{Q(this._observable,t)}))}function G(t,e,i){if(this._bindings.size>1)throw new v("observable-bind-to-many-not-one-binding",this);this.to(...function(t,e){const i=t.map((t=>[t,e]));return Array.prototype.concat.apply([],i)}(t,e),i)}function J(t){return t.every((t=>"string"==typeof t))}function Q(t,e){const i=t[H].get(e);let n;i.callback?n=i.callback.apply(t,i.to.map((t=>t[0][t[1]]))):(n=i.to[0],n=n[0][n[1]]),Object.prototype.hasOwnProperty.call(t,e)?t[e]=n:t.set(e,n)}["set","bind","unbind","decorate","on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{q[t]=W.prototype[t]}));class Y{constructor(){this._replacedElements=[]}replace(t,e){this._replacedElements.push({element:t,newElement:e}),t.style.display="none",e&&t.parentNode.insertBefore(e,t.nextSibling)}restore(){this._replacedElements.forEach((({element:t,newElement:e})=>{t.style.display="",e&&e.remove()})),this._replacedElements=[]}}function Z(t){let e=0;for(const i of t)e++;return e}function X(t,e){const i=Math.min(t.length,e.length);for(let n=0;n-1};const Dt=function(t,e){var i=this.__data__,n=It(i,t);return n<0?(++this.size,i.push([t,e])):i[n][1]=e,this};function Ft(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t-1&&t%1==0&&t<=ii};var si={};si["[object Float32Array]"]=si["[object Float64Array]"]=si["[object Int8Array]"]=si["[object Int16Array]"]=si["[object Int32Array]"]=si["[object Uint8Array]"]=si["[object Uint8ClampedArray]"]=si["[object Uint16Array]"]=si["[object Uint32Array]"]=!0,si["[object Arguments]"]=si["[object Array]"]=si["[object ArrayBuffer]"]=si["[object Boolean]"]=si["[object DataView]"]=si["[object Date]"]=si["[object Error]"]=si["[object Function]"]=si["[object Map]"]=si["[object Number]"]=si["[object Object]"]=si["[object RegExp]"]=si["[object Set]"]=si["[object String]"]=si["[object WeakMap]"]=!1;const oi=function(t){return wt(t)&&ni(t.length)&&!!si[gt(t)]};const ri=function(t){return function(e){return t(e)}};var ai="object"==typeof exports&&exports&&!exports.nodeType&&exports,li=ai&&"object"==typeof module&&module&&!module.nodeType&&module,ci=li&&li.exports===ai&&et.process;const hi=function(){try{var t=li&&li.require&&li.require("util").types;return t||ci&&ci.binding&&ci.binding("util")}catch(t){}}();var di=hi&&hi.isTypedArray;const ui=di?ri(di):oi;var fi=Object.prototype.hasOwnProperty;const mi=function(t,e){var i=pt(t),n=!i&&Ke(t),s=!i&&!n&&Ze(t),o=!i&&!n&&!s&&ui(t),r=i||n||s||o,a=r?He(t.length,String):[],l=a.length;for(var c in t)!e&&!fi.call(t,c)||r&&("length"==c||s&&("offset"==c||"parent"==c)||o&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||ei(c,l))||a.push(c);return a};var gi=Object.prototype;const pi=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||gi)};const wi=yt(Object.keys,Object);var bi=Object.prototype.hasOwnProperty;const _i=function(t){if(!pi(t))return wi(t);var e=[];for(var i in Object(t))bi.call(t,i)&&"constructor"!=i&&e.push(i);return e};const vi=function(t){return null!=t&&ni(t.length)&&!Gt(t)};const yi=function(t){return vi(t)?mi(t):_i(t)};const ki=function(t,e){return t&&ze(e,yi(e),t)};const Ai=function(t){var e=[];if(null!=t)for(var i in Object(t))e.push(i);return e};var xi=Object.prototype.hasOwnProperty;const Ci=function(t){if(!F(t))return Ai(t);var e=pi(t),i=[];for(var n in t)("constructor"!=n||!e&&xi.call(t,n))&&i.push(n);return i};const Pi=function(t){return vi(t)?mi(t,!0):Ci(t)};const Ti=function(t,e){return t&&ze(e,Pi(e),t)};var Ei="object"==typeof exports&&exports&&!exports.nodeType&&exports,Si=Ei&&"object"==typeof module&&module&&!module.nodeType&&module,Ri=Si&&Si.exports===Ei?nt.Buffer:void 0,Oi=Ri?Ri.allocUnsafe:void 0;const Ii=function(t,e){if(e)return t.slice();var i=t.length,n=Oi?Oi(i):new t.constructor(i);return t.copy(n),n};const Vi=function(t,e){var i=-1,n=t.length;for(e||(e=Array(n));++i{this._setToTarget(t,n,e[n],i)}))}}function ds(t){return ls(t,us)}function us(t){return cs(t)?t:void 0}function fs(t){if(t){if(t.defaultView)return t instanceof t.defaultView.Document;if(t.ownerDocument&&t.ownerDocument.defaultView)return t instanceof t.ownerDocument.defaultView.Node}return!1}function ms(t){const e=Object.prototype.toString.apply(t);return"[object Window]"==e||"[object global]"==e}const gs=ps(R());function ps(t){if(!t)return gs;return class extends t{listenTo(t,e,i,n={}){if(fs(t)||ms(t)){const s={capture:!!n.useCapture,passive:!!n.usePassive},o=this._getProxyEmitter(t,s)||new ws(t,s);this.listenTo(o,e,i,n)}else super.listenTo(t,e,i,n)}stopListening(t,e,i){if(fs(t)||ms(t)){const n=this._getAllProxyEmitters(t);for(const t of n)this.stopListening(t,e,i)}else super.stopListening(t,e,i)}_getProxyEmitter(t,e){return function(t,e){const i=t[P];return i&&i[e]?i[e].emitter:null}(this,bs(t,e))}_getAllProxyEmitters(t){return[{capture:!1,passive:!1},{capture:!1,passive:!0},{capture:!0,passive:!1},{capture:!0,passive:!0}].map((e=>this._getProxyEmitter(t,e))).filter((t=>!!t))}}}["_getProxyEmitter","_getAllProxyEmitters","on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{ps[t]=gs.prototype[t]}));class ws extends(R()){constructor(t,e){super(),O(this,bs(t,e)),this._domNode=t,this._options=e}attach(t){if(this._domListeners&&this._domListeners[t])return;const e=this._createDomListener(t);this._domNode.addEventListener(t,e,this._options),this._domListeners||(this._domListeners={}),this._domListeners[t]=e}detach(t){let e;!this._domListeners[t]||(e=this._events[t])&&e.callbacks.length||this._domListeners[t].removeListener()}_addEventListener(t,e,i){this.attach(t),R().prototype._addEventListener.call(this,t,e,i)}_removeEventListener(t,e){R().prototype._removeEventListener.call(this,t,e),this.detach(t)}_createDomListener(t){const e=e=>{this.fire(t,e)};return e.removeListener=()=>{this._domNode.removeEventListener(t,e,this._options),delete this._domListeners[t]},e}}function bs(t,e){let i=function(t){return t["data-ck-expando"]||(t["data-ck-expando"]=p())}(t);for(const t of Object.keys(e).sort())e[t]&&(i+="-"+t);return i}let _s;try{_s={window,document}}catch(t){_s={window:{},document:{}}}const vs=_s;function ys(t){const e=[];let i=t;for(;i&&i.nodeType!=Node.DOCUMENT_NODE;)e.unshift(i),i=i.parentNode;return e}function ks(t){return"[object Text]"==Object.prototype.toString.call(t)}function As(t){return"[object Range]"==Object.prototype.toString.apply(t)}function xs(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}const Cs=["top","right","bottom","left","width","height"];class Ps{constructor(t){const e=As(t);if(Object.defineProperty(this,"_source",{value:t._source||t,writable:!0,enumerable:!1}),Ss(t)||e)if(e){const e=Ps.getDomRangeRects(t);Ts(this,Ps.getBoundingRect(e))}else Ts(this,t.getBoundingClientRect());else if(ms(t)){const{innerWidth:e,innerHeight:i}=t;Ts(this,{top:0,right:e,bottom:i,left:0,width:e,height:i})}else Ts(this,t)}clone(){return new Ps(this)}moveTo(t,e){return this.top=e,this.right=t+this.width,this.bottom=e+this.height,this.left=t,this}moveBy(t,e){return this.top+=e,this.right+=t,this.left+=t,this.bottom+=e,this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left),width:0,height:0};return e.width=e.right-e.left,e.height=e.bottom-e.top,e.width<0||e.height<0?null:new Ps(e)}getIntersectionArea(t){const e=this.getIntersection(t);return e?e.getArea():0}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(!Es(t)){let i=t.parentNode||t.commonAncestorContainer;for(;i&&!Es(i);){const t=new Ps(i),n=e.getIntersection(t);if(!n)return null;n.getArea(){for(const e of t){const t=Rs._getElementCallbacks(e.target);if(t)for(const i of t)i(e)}}))}}function Os(t,e){t instanceof HTMLTextAreaElement&&(t.value=e),t.innerHTML=e}function Is(t){return e=>e+t}function Vs(t){let e=0;for(;t.previousSibling;)t=t.previousSibling,e++;return e}function Ms(t,e,i){t.insertBefore(i,t.childNodes[e]||null)}function Ns(t){return t&&t.nodeType===Node.COMMENT_NODE}function Bs(t){return!!(t&&t.getClientRects&&t.getClientRects().length)}function Ds({element:t,target:e,positions:i,limiter:n,fitInViewport:s,viewportOffsetConfig:o}){Gt(e)&&(e=e()),Gt(n)&&(n=n());const r=function(t){return t&&t.parentNode?t.offsetParent===vs.document.body?null:t.offsetParent:null}(t),a=new Ps(t),l=new Ps(e);let c;const h=s&&function(t){t=Object.assign({top:0,bottom:0,left:0,right:0},t);const e=new Ps(vs.window);return e.top+=t.top,e.height-=t.top,e.bottom-=t.bottom,e.height-=t.bottom,e}(o)||null,d={targetRect:l,elementRect:a,positionedElementAncestor:r,viewportRect:h};if(n||s){const t=n&&new Ps(n).getVisible();Object.assign(d,{limiterRect:t,viewportRect:h}),c=function(t,e){const{elementRect:i}=e,n=i.getArea(),s=t.map((t=>new Ls(t,e))).filter((t=>!!t.name));let o=0,r=null;for(const t of s){const{limiterIntersectionArea:e,viewportIntersectionArea:i}=t;if(e===n)return t;const s=i**2+e**2;s>o&&(o=s,r=t)}return r}(i,d)||new Ls(i[0],d)}else c=new Ls(i[0],d);return c}function Fs(t){const{scrollX:e,scrollY:i}=vs.window;return t.clone().moveBy(e,i)}Rs._observerInstance=null,Rs._elementCallbacks=null;class Ls{constructor(t,e){const i=t(e.targetRect,e.elementRect,e.viewportRect);if(!i)return;const{left:n,top:s,name:o,config:r}=i;this.name=o,this.config=r,this._positioningFunctionCorrdinates={left:n,top:s},this._options=e}get left(){return this._absoluteRect.left}get top(){return this._absoluteRect.top}get limiterIntersectionArea(){const t=this._options.limiterRect;if(t){const e=this._options.viewportRect;if(!e)return t.getIntersectionArea(this._rect);{const i=t.getIntersection(e);if(i)return i.getIntersectionArea(this._rect)}}return 0}get viewportIntersectionArea(){const t=this._options.viewportRect;return t?t.getIntersectionArea(this._rect):0}get _rect(){return this._cachedRect||(this._cachedRect=this._options.elementRect.clone().moveTo(this._positioningFunctionCorrdinates.left,this._positioningFunctionCorrdinates.top)),this._cachedRect}get _absoluteRect(){return this._cachedAbsoluteRect||(this._cachedAbsoluteRect=Fs(this._rect),this._options.positionedElementAncestor&&function(t,e){const i=Fs(new Ps(e)),n=xs(e);let s=0,o=0;s-=i.left,o-=i.top,s+=e.scrollLeft,o+=e.scrollTop,s-=n.left,o-=n.top,t.moveBy(s,o)}(this._cachedAbsoluteRect,this._options.positionedElementAncestor)),this._cachedAbsoluteRect}}function zs(t){const e=t.parentNode;e&&e.removeChild(t)}function Hs(t,e,i){const n=e.clone().moveBy(0,i),s=e.clone().moveBy(0,-i),o=new Ps(t).excludeScrollbarsAndBorders();if(![s,n].every((t=>o.contains(t)))){let{scrollX:r,scrollY:a}=t;Ws(s,o)?a-=o.top-e.top+i:$s(n,o)&&(a+=e.bottom-o.bottom+i),qs(e,o)?r-=o.left-e.left+i:Us(e,o)&&(r+=e.right-o.right+i),t.scrollTo(r,a)}}function js(t,e){const i=Ks(t);let n,s;for(;t!=i.document.body;)s=e(),n=new Ps(t).excludeScrollbarsAndBorders(),n.contains(s)||(Ws(s,n)?t.scrollTop-=n.top-s.top:$s(s,n)&&(t.scrollTop+=s.bottom-n.bottom),qs(s,n)?t.scrollLeft-=n.left-s.left:Us(s,n)&&(t.scrollLeft+=s.right-n.right)),t=t.parentNode}function $s(t,e){return t.bottom>e.bottom}function Ws(t,e){return t.tope.right}function Ks(t){return As(t)?t.startContainer.ownerDocument.defaultView:t.ownerDocument.defaultView}function Gs(t){if(As(t)){let e=t.commonAncestorContainer;return ks(e)&&(e=e.parentNode),e}return t.parentNode}function Js(t,e){const i=Ks(t),n=new Ps(t);if(i===e)return n;{let t=i;for(;t!=e;){const e=t.frameElement,i=new Ps(e).excludeScrollbarsAndBorders();n.moveBy(i.left,i.top),t=t.parent}}return n}const Qs={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"},Ys={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"},Zs=function(){const t={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let e=65;e<=90;e++){t[String.fromCharCode(e).toLowerCase()]=e}for(let e=48;e<=57;e++)t[e-48]=e;for(let e=112;e<=123;e++)t["f"+(e-111)]=e;for(const e of"`-=[];',./\\")t[e]=e.charCodeAt(0);return t}(),Xs=Object.fromEntries(Object.entries(Zs).map((([t,e])=>[e,t.charAt(0).toUpperCase()+t.slice(1)])));function to(t){let e;if("string"==typeof t){if(e=Zs[t.toLowerCase()],!e)throw new v("keyboard-unknown-key",null,{key:t})}else e=t.keyCode+(t.altKey?Zs.alt:0)+(t.ctrlKey?Zs.ctrl:0)+(t.shiftKey?Zs.shift:0)+(t.metaKey?Zs.cmd:0);return e}function eo(t){return"string"==typeof t&&(t=function(t){return t.split("+").map((t=>t.trim()))}(t)),t.map((t=>"string"==typeof t?function(t){if(t.endsWith("!"))return to(t.slice(0,-1));const e=to(t);return r.isMac&&e==Zs.ctrl?Zs.cmd:e}(t):t)).reduce(((t,e)=>e+t),0)}function io(t){let e=eo(t);return Object.entries(r.isMac?Qs:Ys).reduce(((t,[i,n])=>(0!=(e&Zs[i])&&(e&=~Zs[i],t+=n),t)),"")+(e?Xs[e]:"")}function no(t,e){const i="ltr"===e;switch(t){case Zs.arrowleft:return i?"left":"right";case Zs.arrowright:return i?"right":"left";case Zs.arrowup:return"up";case Zs.arrowdown:return"down"}}function so(t){return Array.isArray(t)?t:[t]}function oo(t,e,i=1){if("number"!=typeof i)throw new v("translation-service-quantity-not-a-number",null,{quantity:i});const n=Object.keys(vs.window.CKEDITOR_TRANSLATIONS).length;1===n&&(t=Object.keys(vs.window.CKEDITOR_TRANSLATIONS)[0]);const s=e.id||e.string;if(0===n||!function(t,e){return!!vs.window.CKEDITOR_TRANSLATIONS[t]&&!!vs.window.CKEDITOR_TRANSLATIONS[t].dictionary[e]}(t,s))return 1!==i?e.plural:e.string;const o=vs.window.CKEDITOR_TRANSLATIONS[t].dictionary,r=vs.window.CKEDITOR_TRANSLATIONS[t].getPluralForm||(t=>1===t?0:1),a=o[s];if("string"==typeof a)return a;return a[Number(r(i))]}vs.window.CKEDITOR_TRANSLATIONS||(vs.window.CKEDITOR_TRANSLATIONS={});const ro=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function ao(t){return ro.includes(t)?"rtl":"ltr"}class lo{constructor({uiLanguage:t="en",contentLanguage:e}={}){this.uiLanguage=t,this.contentLanguage=e||this.uiLanguage,this.uiLanguageDirection=ao(this.uiLanguage),this.contentLanguageDirection=ao(this.contentLanguage),this.t=(t,e)=>this._t(t,e)}get language(){return console.warn("locale-deprecated-language-property: The Locale#language property has been deprecated and will be removed in the near future. Please use #uiLanguage and #contentLanguage properties instead."),this.uiLanguage}_t(t,e=[]){e=so(e),"string"==typeof t&&(t={string:t});const i=!!t.plural?e[0]:1;return function(t,e){return t.replace(/%(\d+)/g,((t,i)=>ithis._items.length||e<0)throw new v("collection-add-item-invalid-index",this);let i=0;for(const n of t){const t=this._getItemIdBeforeAdding(n),s=e+i;this._items.splice(s,0,n),this._itemMap.set(t,n),this.fire("add",n,s),i++}return this.fire("change",{added:t,removed:[],index:e}),this}get(t){let e;if("string"==typeof t)e=this._itemMap.get(t);else{if("number"!=typeof t)throw new v("collection-get-invalid-arg",this);e=this._items[t]}return e||null}has(t){if("string"==typeof t)return this._itemMap.has(t);{const e=t[this._idProperty];return e&&this._itemMap.has(e)}}getIndex(t){let e;return e="string"==typeof t?this._itemMap.get(t):t,e?this._items.indexOf(e):-1}remove(t){const[e,i]=this._remove(t);return this.fire("change",{added:[],removed:[e],index:i}),e}map(t,e){return this._items.map(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);const t=Array.from(this._items);for(;this.length;)this._remove(0);this.fire("change",{added:[],removed:t,index:0})}bindTo(t){if(this._bindToCollection)throw new v("collection-bind-to-rebind",this);return this._bindToCollection=t,{as:t=>{this._setUpBindToBinding((e=>new t(e)))},using:t=>{"function"==typeof t?this._setUpBindToBinding(t):this._setUpBindToBinding((e=>e[t]))}}}_setUpBindToBinding(t){const e=this._bindToCollection,i=(i,n,s)=>{const o=e._bindToCollection==this,r=e._bindToInternalToExternalMap.get(n);if(o&&r)this._bindToExternalToInternalMap.set(n,r),this._bindToInternalToExternalMap.set(r,n);else{const i=t(n);if(!i)return void this._skippedIndexesFromExternal.push(s);let o=s;for(const t of this._skippedIndexesFromExternal)s>t&&o--;for(const t of e._skippedIndexesFromExternal)o>=t&&o++;this._bindToExternalToInternalMap.set(n,i),this._bindToInternalToExternalMap.set(i,n),this.add(i,o);for(let t=0;t{const n=this._bindToExternalToInternalMap.get(e);n&&this.remove(n),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce(((t,e)=>(ie&&t.push(e),t)),[])}))}_getItemIdBeforeAdding(t){const e=this._idProperty;let i;if(e in t){if(i=t[e],"string"!=typeof i)throw new v("collection-add-invalid-id",this);if(this.get(i))throw new v("collection-add-item-already-exists",this)}else t[e]=i=p();return i}_remove(t){let e,i,n,s=!1;const o=this._idProperty;if("string"==typeof t?(i=t,n=this._itemMap.get(i),s=!n,n&&(e=this._items.indexOf(n))):"number"==typeof t?(e=t,n=this._items[e],s=!n,n&&(i=n[o])):(n=t,i=n[o],e=this._items.indexOf(n),s=-1==e||!this._itemMap.get(i)),s)throw new v("collection-remove-404",this);this._items.splice(e,1),this._itemMap.delete(i);const r=this._bindToInternalToExternalMap.get(n);return this._bindToInternalToExternalMap.delete(n),this._bindToExternalToInternalMap.delete(r),this.fire("remove",n,e),[n,e]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}function ho(t){const e=t.next();return e.done?null:e.value}class uo extends(ps(q())){constructor(){super(),this._elements=new Set,this._nextEventLoopTimeout=null,this.set("isFocused",!1),this.set("focusedElement",null)}add(t){if(this._elements.has(t))throw new v("focustracker-add-element-already-exist",this);this.listenTo(t,"focus",(()=>this._focus(t)),{useCapture:!0}),this.listenTo(t,"blur",(()=>this._blur()),{useCapture:!0}),this._elements.add(t)}remove(t){t===this.focusedElement&&this._blur(),this._elements.has(t)&&(this.stopListening(t),this._elements.delete(t))}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=t,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout((()=>{this.focusedElement=null,this.isFocused=!1}),0)}}class fo{constructor(){this._listener=new(ps())}listenTo(t){this._listener.listenTo(t,"keydown",((t,e)=>{this._listener.fire("_keydown:"+to(e),e)}))}set(t,e,i={}){const n=eo(t),s=i.priority;this._listener.listenTo(this._listener,"_keydown:"+n,((t,i)=>{e(i,(()=>{i.preventDefault(),i.stopPropagation(),t.stop()})),t.return=!0}),{priority:s})}press(t){return!!this._listener.fire("_keydown:"+to(t),t)}destroy(){this._listener.stopListening()}}function mo(t){return tt(t)?new Map(t):function(t){const e=new Map;for(const i in t)e.set(i,t[i]);return e}(t)}const go=1e4;function po(t,e){return!!(i=t.charAt(e-1))&&1==i.length&&/[\ud800-\udbff]/.test(i)&&function(t){return!!t&&1==t.length&&/[\udc00-\udfff]/.test(t)}(t.charAt(e));var i}function wo(t,e){return!!(i=t.charAt(e))&&1==i.length&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(i);var i}const bo=function(){const t=/\p{Regional_Indicator}{2}/u.source,e="(?:"+[/\p{Emoji}[\u{E0020}-\u{E007E}]+\u{E007F}/u,/\p{Emoji}\u{FE0F}?\u{20E3}/u,/\p{Emoji}\u{FE0F}/u,/(?=\p{General_Category=Other_Symbol})\p{Emoji}\p{Emoji_Modifier}*/u].map((t=>t.source)).join("|")+")";return new RegExp(`${t}|${e}(?:‍${e})*`,"ug")}();function _o(t,e){const i=String(t).matchAll(bo);return Array.from(i).some((t=>t.index{this._renderViewIntoCollectionParent(e,i)})),this.on("remove",((t,e)=>{e.element&&this._parentElement&&e.element.remove()})),this._parentElement=null}destroy(){this.map((t=>t.destroy()))}setParent(t){this._parentElement=t;for(const t of this)this._renderViewIntoCollectionParent(t)}delegate(...t){if(!t.length||!t.every((t=>"string"==typeof t)))throw new v("ui-viewcollection-delegate-wrong-events",this);return{to:e=>{for(const i of this)for(const n of t)i.delegate(n).to(e);this.on("add",((i,n)=>{for(const i of t)n.delegate(i).to(e)})),this.on("remove",((i,n)=>{for(const i of t)n.stopDelegating(i,e)}))}}}_renderViewIntoCollectionParent(t,e){t.isRendered||t.render(),t.element&&this._parentElement&&this._parentElement.insertBefore(t.element,this._parentElement.children[e])}}class yo extends(ps(q())){constructor(t){super(),this.element=null,this.isRendered=!1,this.locale=t,this.t=t&&t.t,this._viewCollections=new co,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",((e,i)=>{i.locale=t,i.t=t&&t.t})),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=ko.bind(this,this)}createCollection(t){const e=new vo(t);return this._viewCollections.add(e),e}registerChild(t){tt(t)||(t=[t]);for(const e of t)this._unboundChildren.add(e)}deregisterChild(t){tt(t)||(t=[t]);for(const e of t)this._unboundChildren.remove(e)}setTemplate(t){this.template=new ko(t)}extendTemplate(t){ko.extend(this.template,t)}render(){if(this.isRendered)throw new v("ui-view-render-already-rendered",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map((t=>t.destroy())),this.template&&this.template._revertData&&this.template.revert(this.element)}}class ko extends(R()){constructor(t){super(),Object.assign(this,Io(Oo(t))),this._isRendered=!1,this._revertData=null}render(){const t=this._renderNode({intoFragment:!0});return this._isRendered=!0,t}apply(t){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:t,intoFragment:!1,isApplying:!0,revertData:this._revertData}),t}revert(t){if(!this._revertData)throw new v("ui-template-revert-not-applied",[this,t]);this._revertTemplateFromNode(t,this._revertData)}*getViews(){yield*function*t(e){if(e.children)for(const i of e.children)Fo(i)?yield i:Lo(i)&&(yield*t(i))}(this)}static bind(t,e){return{to:(i,n)=>new xo({eventNameOrFunction:i,attribute:i,observable:t,emitter:e,callback:n}),if:(i,n,s)=>new Co({observable:t,emitter:e,attribute:i,valueIfTrue:n,callback:s})}}static extend(t,e){if(t._isRendered)throw new v("template-extend-render",[this,t]);Bo(t,Io(Oo(e)))}_renderNode(t){let e;if(e=t.node?this.tag&&this.text:this.tag?this.text:!this.text,e)throw new v("ui-template-wrong-syntax",this);return this.text?this._renderText(t):this._renderElement(t)}_renderElement(t){let e=t.node;return e||(e=t.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(t),this._renderElementChildren(t),this._setUpListeners(t),e}_renderText(t){let e=t.node;return e?t.revertData.text=e.textContent:e=t.node=document.createTextNode(""),Po(this.text)?this._bindToObservable({schema:this.text,updater:Eo(e),data:t}):e.textContent=this.text.join(""),e}_renderAttributes(t){if(!this.attributes)return;const e=t.node,i=t.revertData;for(const n in this.attributes){const s=e.getAttribute(n),o=this.attributes[n];i&&(i.attributes[n]=s);const r=Ho(o)?o[0].ns:null;if(Po(o)){const a=Ho(o)?o[0].value:o;i&&jo(n)&&a.unshift(s),this._bindToObservable({schema:a,updater:So(e,n,r),data:t})}else if("style"==n&&"string"!=typeof o[0])this._renderStyleAttribute(o[0],t);else{i&&s&&jo(n)&&o.unshift(s);const t=o.map((t=>t&&t.value||t)).reduce(((t,e)=>t.concat(e)),[]).reduce(Mo,"");Do(t)||e.setAttributeNS(r,n,t)}}}_renderStyleAttribute(t,e){const i=e.node;for(const n in t){const s=t[n];Po(s)?this._bindToObservable({schema:[s],updater:Ro(i,n),data:e}):i.style[n]=s}}_renderElementChildren(t){const e=t.node,i=t.intoFragment?document.createDocumentFragment():e,n=t.isApplying;let s=0;for(const o of this.children)if(zo(o)){if(!n){o.setParent(e);for(const t of o)i.appendChild(t.element)}}else if(Fo(o))n||(o.isRendered||o.render(),i.appendChild(o.element));else if(fs(o))i.appendChild(o);else if(n){const e={children:[],bindings:[],attributes:{}};t.revertData.children.push(e),o._renderNode({intoFragment:!1,node:i.childNodes[s++],isApplying:!0,revertData:e})}else i.appendChild(o.render());t.intoFragment&&e.appendChild(i)}_setUpListeners(t){if(this.eventListeners)for(const e in this.eventListeners){const i=this.eventListeners[e].map((i=>{const[n,s]=e.split("@");return i.activateDomEventListener(n,s,t)}));t.revertData&&t.revertData.bindings.push(i)}}_bindToObservable({schema:t,updater:e,data:i}){const n=i.revertData;To(t,e,i);const s=t.filter((t=>!Do(t))).filter((t=>t.observable)).map((n=>n.activateAttributeListener(t,e,i)));n&&n.bindings.push(s)}_revertTemplateFromNode(t,e){for(const t of e.bindings)for(const e of t)e();if(e.text)return void(t.textContent=e.text);const i=t;for(const t in e.attributes){const n=e.attributes[t];null===n?i.removeAttribute(t):i.setAttribute(t,n)}for(let t=0;tTo(t,e,i);return this.emitter.listenTo(this.observable,`change:${this.attribute}`,n),()=>{this.emitter.stopListening(this.observable,`change:${this.attribute}`,n)}}}class xo extends Ao{constructor(t){super(t),this.eventNameOrFunction=t.eventNameOrFunction}activateDomEventListener(t,e,i){const n=(t,i)=>{e&&!i.target.matches(e)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(i):this.observable.fire(this.eventNameOrFunction,i))};return this.emitter.listenTo(i.node,t,n),()=>{this.emitter.stopListening(i.node,t,n)}}}class Co extends Ao{constructor(t){super(t),this.valueIfTrue=t.valueIfTrue}getValue(t){return!Do(super.getValue(t))&&(this.valueIfTrue||!0)}}function Po(t){return!!t&&(t.value&&(t=t.value),Array.isArray(t)?t.some(Po):t instanceof Ao)}function To(t,e,{node:i}){const n=function(t,e){return t.map((t=>t instanceof Ao?t.getValue(e):t))}(t,i);let s;s=1==t.length&&t[0]instanceof Co?n[0]:n.reduce(Mo,""),Do(s)?e.remove():e.set(s)}function Eo(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function So(t,e,i){return{set(n){t.setAttributeNS(i,e,n)},remove(){t.removeAttributeNS(i,e)}}}function Ro(t,e){return{set(i){t.style[e]=i},remove(){t.style[e]=null}}}function Oo(t){return ls(t,(t=>{if(t&&(t instanceof Ao||Lo(t)||Fo(t)||zo(t)))return t}))}function Io(t){if("string"==typeof t?t=function(t){return{text:[t]}}(t):t.text&&function(t){t.text=so(t.text)}(t),t.on&&(t.eventListeners=function(t){for(const e in t)Vo(t,e);return t}(t.on),delete t.on),!t.text){t.attributes&&function(t){for(const e in t)t[e].value&&(t[e].value=so(t[e].value)),Vo(t,e)}(t.attributes);const e=[];if(t.children)if(zo(t.children))e.push(t.children);else for(const i of t.children)Lo(i)||Fo(i)||fs(i)?e.push(i):e.push(new ko(i));t.children=e}return t}function Vo(t,e){t[e]=so(t[e])}function Mo(t,e){return Do(e)?t:Do(t)?e:`${t} ${e}`}function No(t,e){for(const i in e)t[i]?t[i].push(...e[i]):t[i]=e[i]}function Bo(t,e){if(e.attributes&&(t.attributes||(t.attributes={}),No(t.attributes,e.attributes)),e.eventListeners&&(t.eventListeners||(t.eventListeners={}),No(t.eventListeners,e.eventListeners)),e.text&&t.text.push(...e.text),e.children&&e.children.length){if(t.children.length!=e.children.length)throw new v("ui-template-extend-children-mismatch",t);let i=0;for(const n of e.children)Bo(t.children[i++],n)}}function Do(t){return!t&&0!==t}function Fo(t){return t instanceof yo}function Lo(t){return t instanceof ko}function zo(t){return t instanceof vo}function Ho(t){return F(t[0])&&t[0].ns}function jo(t){return"class"==t||"style"==t}class $o extends vo{constructor(t,e=[]){super(e),this.locale=t}attachToDom(){this._bodyCollectionContainer=new ko({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");t||(t=vt(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(t)),t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const t=document.querySelector(".ck-body-wrapper");t&&0==t.childElementCount&&t.remove()}}class Wo extends yo{constructor(){super();const t=this.bindTemplate;this.set("content",""),this.set("viewBox","0 0 20 20"),this.set("fillColor",""),this.set("isColorInherited",!0),this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon","ck-reset_all-excluded",t.if("isColorInherited","ck-icon_inherit-color")],viewBox:t.to("viewBox")}})}render(){super.render(),this._updateXMLContent(),this._colorFillPaths(),this.on("change:content",(()=>{this._updateXMLContent(),this._colorFillPaths()})),this.on("change:fillColor",(()=>{this._colorFillPaths()}))}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),e=t.getAttribute("viewBox");e&&(this.viewBox=e);for(const{name:e,value:i}of Array.from(t.attributes))Wo.presentationalAttributeNames.includes(e)&&this.element.setAttribute(e,i);for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);for(;t.childNodes.length>0;)this.element.appendChild(t.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach((t=>{t.style.fill=this.fillColor}))}}Wo.presentationalAttributeNames=["alignment-baseline","baseline-shift","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-rendering","cursor","direction","display","dominant-baseline","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","image-rendering","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","mask","opacity","overflow","paint-order","pointer-events","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-overflow","text-rendering","transform","unicode-bidi","vector-effect","visibility","white-space","word-spacing","writing-mode"];class qo extends yo{constructor(t){super(t);const e=this.bindTemplate,i=p();this.set("class",void 0),this.set("labelStyle",void 0),this.set("icon",void 0),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isVisible",!0),this.set("isToggleable",!1),this.set("keystroke",void 0),this.set("label",void 0),this.set("tabindex",-1),this.set("tooltip",!1),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.set("withKeystroke",!1),this.children=this.createCollection(),this.labelView=this._createLabelView(i),this.iconView=new Wo,this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}}),this.keystrokeView=this._createKeystrokeView(),this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this));const n={tag:"button",attributes:{class:["ck","ck-button",e.to("class"),e.if("isEnabled","ck-disabled",(t=>!t)),e.if("isVisible","ck-hidden",(t=>!t)),e.to("isOn",(t=>t?"ck-on":"ck-off")),e.if("withText","ck-button_with-text"),e.if("withKeystroke","ck-button_with-keystroke")],type:e.to("type",(t=>t||"button")),tabindex:e.to("tabindex"),"aria-labelledby":`ck-editor__aria-label_${i}`,"aria-disabled":e.if("isEnabled",!0,(t=>!t)),"aria-pressed":e.to("isOn",(t=>!!this.isToggleable&&String(!!t))),"data-cke-tooltip-text":e.to("_tooltipString"),"data-cke-tooltip-position":e.to("tooltipPosition")},children:this.children,on:{click:e.to((t=>{this.isEnabled?this.fire("execute"):t.preventDefault()}))}};r.isSafari&&(n.on.mousedown=e.to((t=>{this.focus(),t.preventDefault()}))),this.setTemplate(n)}render(){super.render(),this.icon&&(this.iconView.bind("content").to(this,"icon"),this.children.add(this.iconView)),this.children.add(this.labelView),this.withKeystroke&&this.keystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}_createLabelView(t){const e=new yo,i=this.bindTemplate;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:i.to("labelStyle"),id:`ck-editor__aria-label_${t}`},children:[{text:this.bindTemplate.to("label")}]}),e}_createKeystrokeView(){const t=new yo;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",(t=>io(t)))}]}),t}_getTooltipString(t,e,i){return t?"string"==typeof t?t:(i&&(i=io(i)),t instanceof Function?t(e,i):`${e}${i?` (${i})`:""}`):""}}class Uo extends qo{constructor(t){super(t),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new yo;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),t}}function Ko(t){return"string"==typeof t?{model:t,label:t,hasBorder:!1,view:{name:"span",styles:{color:t}}}:{model:t.color,label:t.label||t.color,hasBorder:void 0!==t.hasBorder&&t.hasBorder,view:{name:"span",styles:{color:`${t.color}`}}}}class Go extends qo{constructor(t){super(t);const e=this.bindTemplate;this.set("color",void 0),this.set("hasBorder",!1),this.icon='',this.extendTemplate({attributes:{style:{backgroundColor:e.to("color")},class:["ck","ck-color-grid__tile",e.if("hasBorder","ck-color-table__color-tile_bordered")]}})}render(){super.render(),this.iconView.fillColor="hsl(0, 0%, 100%)"}}class Jo extends yo{constructor(t,e){super(t);const i=e&&e.colorDefinitions||[];this.columns=e&&e.columns?e.columns:5;const n={gridTemplateColumns:`repeat( ${this.columns}, 1fr)`};this.set("selectedColor",void 0),this.items=this.createCollection(),this.focusTracker=new uo,this.keystrokes=new fo,this.items.on("add",((t,e)=>{e.isOn=e.color===this.selectedColor})),i.forEach((t=>{const e=new Go;e.set({color:t.color,label:t.label,tooltip:!0,hasBorder:t.options.hasBorder}),e.on("execute",(()=>{this.fire("execute",{value:t.color,hasBorder:t.options.hasBorder,label:t.label})})),this.items.add(e)})),this.setTemplate({tag:"div",children:this.items,attributes:{class:["ck","ck-color-grid"],style:n}}),this.on("change:selectedColor",((t,e,i)=>{for(const t of this.items)t.isOn=t.color===i}))}focus(){this.items.length&&this.items.first.focus()}focusLast(){this.items.length&&this.items.last.focus()}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element),n({keystrokeHandler:this.keystrokes,focusTracker:this.focusTracker,gridItems:this.items,numberOfColumns:this.columns,uiLanguageDirection:this.locale&&this.locale.uiLanguageDirection})}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}}class Qo{constructor(t){this.editor=t,this._components=new Map}*names(){for(const t of this._components.values())yield t.originalName}add(t,e){this._components.set(Yo(t),{callback:e,originalName:t})}create(t){if(!this.has(t))throw new v("componentfactory-item-missing",this,{name:t});return this._components.get(Yo(t)).callback(this.editor.locale)}has(t){return this._components.has(Yo(t))}}function Yo(t){return String(t).toLowerCase()}class Zo extends yo{constructor(t,e,i){super(t);const n=this.bindTemplate;this.buttonView=e,this.panelView=i,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class",void 0),this.set("id",void 0),this.set("panelPosition","auto"),this.keystrokes=new fo,this.focusTracker=new uo,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",n.to("class"),n.if("isEnabled","ck-disabled",(t=>!t))],id:n.to("id"),"aria-describedby":n.to("ariaDescribedById")},children:[e,i]}),e.extendTemplate({attributes:{class:["ck-dropdown__button"],"data-cke-tooltip-disabled":n.to("isOpen")}})}render(){super.render(),this.focusTracker.add(this.buttonView.element),this.focusTracker.add(this.panelView.element),this.listenTo(this.buttonView,"open",(()=>{this.isOpen=!this.isOpen})),this.panelView.bind("isVisible").to(this,"isOpen"),this.on("change:isOpen",((t,e,i)=>{i&&("auto"===this.panelPosition?this.panelView.position=Zo._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions}).name:this.panelView.position=this.panelPosition)})),this.keystrokes.listenTo(this.element);const t=(t,e)=>{this.isOpen&&(this.isOpen=!1,e())};this.keystrokes.set("arrowdown",((t,e)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,e())})),this.keystrokes.set("arrowright",((t,e)=>{this.isOpen&&e()})),this.keystrokes.set("arrowleft",t),this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:t,north:e,southEast:i,southWest:n,northEast:s,northWest:o,southMiddleEast:r,southMiddleWest:a,northMiddleEast:l,northMiddleWest:c}=Zo.defaultPanelPositions;return"rtl"!==this.locale.uiLanguageDirection?[i,n,r,a,t,s,o,l,c,e]:[n,i,a,r,t,o,s,c,l,e]}}Zo.defaultPanelPositions={south:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/2,name:"s"}),southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),southMiddleEast:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/4,name:"sme"}),southMiddleWest:(t,e)=>({top:t.bottom,left:t.left-3*(e.width-t.width)/4,name:"smw"}),north:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/2,name:"n"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),northMiddleEast:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/4,name:"nme"}),northMiddleWest:(t,e)=>({top:t.top-e.height,left:t.left-3*(e.width-t.width)/4,name:"nmw"})},Zo._getOptimalPosition=Ds;const Xo='';class tr extends qo{constructor(t){super(t),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{"aria-haspopup":!0,"aria-expanded":this.bindTemplate.to("isOn",(t=>String(t)))}}),this.delegate("execute").to(this,"open")}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const t=new Wo;return t.content=Xo,t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),t}}class er extends yo{constructor(t){super(t);const e=this.bindTemplate;this.set("class",void 0),this.set("labelStyle",void 0),this.set("icon",void 0),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isToggleable",!1),this.set("isVisible",!0),this.set("keystroke",void 0),this.set("withKeystroke",!1),this.set("label",void 0),this.set("tabindex",-1),this.set("tooltip",!1),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.children=this.createCollection(),this.actionView=this._createActionView(),this.arrowView=this._createArrowView(),this.keystrokes=new fo,this.focusTracker=new uo,this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",e.to("class"),e.if("isVisible","ck-hidden",(t=>!t)),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render(),this.children.add(this.actionView),this.children.add(this.arrowView),this.focusTracker.add(this.actionView.element),this.focusTracker.add(this.arrowView.element),this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",((t,e)=>{this.focusTracker.focusedElement===this.actionView.element&&(this.arrowView.focus(),e())})),this.keystrokes.set("arrowleft",((t,e)=>{this.focusTracker.focusedElement===this.arrowView.element&&(this.actionView.focus(),e())}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this.actionView.focus()}_createActionView(){const t=new qo;return t.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this),t.extendTemplate({attributes:{class:"ck-splitbutton__action"}}),t.delegate("execute").to(this),t}_createArrowView(){const t=new qo,e=t.bindTemplate;return t.icon=Xo,t.extendTemplate({attributes:{class:["ck-splitbutton__arrow"],"data-cke-tooltip-disabled":e.to("isOn"),"aria-haspopup":!0,"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("isEnabled").to(this),t.bind("label").to(this),t.bind("tooltip").to(this),t.delegate("execute").to(this,"open"),t}}class ir extends yo{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",(t=>`ck-dropdown__panel_${t}`)),e.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:e.to((t=>t.preventDefault()))}})}focus(){if(this.children.length){const t=this.children.first;"function"==typeof t.focus?t.focus():y("ui-dropdown-panel-focus-child-missing-focus",{childView:this.children.first,dropdownPanel:this})}}focusLast(){if(this.children.length){const t=this.children.last;"function"==typeof t.focusLast?t.focusLast():t.focus()}}}class nr{constructor(t){if(this.focusables=t.focusables,this.focusTracker=t.focusTracker,this.keystrokeHandler=t.keystrokeHandler,this.actions=t.actions,t.actions&&t.keystrokeHandler)for(const e in t.actions){let i=t.actions[e];"string"==typeof i&&(i=[i]);for(const n of i)t.keystrokeHandler.set(n,((t,i)=>{this[e](),i()}))}}get first(){return this.focusables.find(sr)||null}get last(){return this.focusables.filter(sr).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let t=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find(((e,i)=>{const n=e.element===this.focusTracker.focusedElement;return n&&(t=i),n})),t)}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(t){t&&t.focus()}_getFocusableItem(t){const e=this.current,i=this.focusables.length;if(!i)return null;if(null===e)return this[1===t?"first":"last"];let n=(e+i+t)%i;do{const e=this.focusables.get(n);if(sr(e))return e;n=(n+i+t)%i}while(n!==e);return null}}function sr(t){return!(!t.focus||!Bs(t.element))}class or extends yo{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class rr extends yo{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}function ar(t){return Array.isArray(t)?{items:t,removeItems:[]}:t?Object.assign({items:[],removeItems:[]},t):{items:[],removeItems:[]}}class lr extends(q()){constructor(t){super(),this.editor=t,this.set("isEnabled",!0),this._disableStack=new Set}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",cr,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",cr),this.isEnabled=!0)}destroy(){this.stopListening()}static get isContextPlugin(){return!1}}function cr(t){t.return=!1,t.stop()}class hr extends(q()){constructor(t){super(),this.editor=t,this.set("value",void 0),this.set("isEnabled",!1),this._affectsData=!0,this._disableStack=new Set,this.decorate("execute"),this.listenTo(this.editor.model.document,"change",(()=>{this.refresh()})),this.on("execute",(t=>{this.isEnabled||t.stop()}),{priority:"high"}),this.listenTo(t,"change:isReadOnly",((t,e,i)=>{i&&this.affectsData?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")}))}get affectsData(){return this._affectsData}set affectsData(t){this._affectsData=t}refresh(){this.isEnabled=!0}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",dr,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",dr),this.refresh())}execute(...t){}destroy(){this.stopListening()}}function dr(t){t.return=!1,t.stop()}class ur extends hr{constructor(t){super(t),this._childCommandsDefinitions=[]}refresh(){}execute(...t){const e=this._getFirstEnabledCommand();return!!e&&e.execute(t)}registerChildCommand(t,e={}){b(this._childCommandsDefinitions,{command:t,priority:e.priority||"normal"}),t.on("change:isEnabled",(()=>this._checkEnabled())),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){const t=this._childCommandsDefinitions.find((({command:t})=>t.isEnabled));return t&&t.command}}class fr extends(R()){constructor(t,e=[],i=[]){super(),this._context=t,this._plugins=new Map,this._availablePlugins=new Map;for(const t of e)t.pluginName&&this._availablePlugins.set(t.pluginName,t);this._contextPlugins=new Map;for(const[t,e]of i)this._contextPlugins.set(t,e),this._contextPlugins.set(e,t),t.pluginName&&this._availablePlugins.set(t.pluginName,t)}*[Symbol.iterator](){for(const t of this._plugins)"function"==typeof t[0]&&(yield t)}get(t){const e=this._plugins.get(t);if(!e){let e=t;throw"function"==typeof t&&(e=t.pluginName||t.name),new v("plugincollection-plugin-not-loaded",this._context,{plugin:e})}return e}has(t){return this._plugins.has(t)}init(t,e=[],i=[]){const n=this,s=this._context;!function t(e,i=new Set){e.forEach((e=>{a(e)&&(i.has(e)||(i.add(e),e.pluginName&&!n._availablePlugins.has(e.pluginName)&&n._availablePlugins.set(e.pluginName,e),e.requires&&t(e.requires,i)))}))}(t),d(t);const o=[...function t(e,i=new Set){return e.map((t=>a(t)?t:n._availablePlugins.get(t))).reduce(((e,n)=>i.has(n)?e:(i.add(n),n.requires&&(d(n.requires,n),t(n.requires,i).forEach((t=>e.add(t)))),e.add(n))),new Set)}(t.filter((t=>!c(t,e))))];!function(t,e){for(const i of e){if("function"!=typeof i)throw new v("plugincollection-replace-plugin-invalid-type",null,{pluginItem:i});const e=i.pluginName;if(!e)throw new v("plugincollection-replace-plugin-missing-name",null,{pluginItem:i});if(i.requires&&i.requires.length)throw new v("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:e});const s=n._availablePlugins.get(e);if(!s)throw new v("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:e});const o=t.indexOf(s);if(-1===o){if(n._contextPlugins.has(s))return;throw new v("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:e})}if(s.requires&&s.requires.length)throw new v("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:e});t.splice(o,1,i),n._availablePlugins.set(e,i)}}(o,i);const r=function(t){return t.map((t=>{let e=n._contextPlugins.get(t);return e=e||new t(s),n._add(t,e),e}))}(o);return u(r,"init").then((()=>u(r,"afterInit"))).then((()=>r));function a(t){return"function"==typeof t}function l(t){return a(t)&&t.isContextPlugin}function c(t,e){return e.some((e=>e===t||(h(t)===e||h(e)===t)))}function h(t){return a(t)?t.pluginName||t.name:t}function d(t,i=null){t.map((t=>a(t)?t:n._availablePlugins.get(t)||t)).forEach((t=>{!function(t,e){if(a(t))return;if(e)throw new v("plugincollection-soft-required",s,{missingPlugin:t,requiredBy:h(e)});throw new v("plugincollection-plugin-not-found",s,{plugin:t})}(t,i),function(t,e){if(!l(e))return;if(l(t))return;throw new v("plugincollection-context-required",s,{plugin:h(t),requiredBy:h(e)})}(t,i),function(t,i){if(!i)return;if(!c(t,e))return;throw new v("plugincollection-required",s,{plugin:h(t),requiredBy:h(i)})}(t,i)}))}function u(t,e){return t.reduce(((t,i)=>i[e]?n._contextPlugins.has(i)?t:t.then(i[e].bind(i)):t),Promise.resolve())}}destroy(){const t=[];for(const[,e]of this)"function"!=typeof e.destroy||this._contextPlugins.has(e)||t.push(e.destroy());return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const i=t.pluginName;if(i){if(this._plugins.has(i))throw new v("plugincollection-plugin-name-conflict",null,{pluginName:i,plugin1:this._plugins.get(i).constructor,plugin2:t});this._plugins.set(i,e)}}}class mr{constructor(t){this.config=new hs(t,this.constructor.defaultConfig);const e=this.constructor.builtinPlugins;this.config.define("plugins",e),this.plugins=new fr(this,e);const i=this.config.get("language")||{};this.locale=new lo({uiLanguage:"string"==typeof i?i:i.ui,contentLanguage:this.config.get("language.content")}),this.t=this.locale.t,this.editors=new co,this._contextOwner=null}initPlugins(){const t=this.config.get("plugins")||[],e=this.config.get("substitutePlugins")||[];for(const i of t.concat(e)){if("function"!=typeof i)throw new v("context-initplugins-constructor-only",null,{Plugin:i});if(!0!==i.isContextPlugin)throw new v("context-initplugins-invalid-plugin",null,{Plugin:i})}return this.plugins.init(t,[],e)}destroy(){return Promise.all(Array.from(this.editors,(t=>t.destroy()))).then((()=>this.plugins.destroy()))}_addEditor(t,e){if(this._contextOwner)throw new v("context-addeditor-private-context");this.editors.add(t),e&&(this._contextOwner=t)}_removeEditor(t){return this.editors.has(t)&&this.editors.remove(t),this._contextOwner===t?this.destroy():Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names())["plugins","removePlugins","extraPlugins"].includes(e)||(t[e]=this.config.get(e));return t}static create(t){return new Promise((e=>{const i=new this(t);e(i.initPlugins().then((()=>i)))}))}}class gr extends(q()){constructor(t){super(),this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}const pr=new WeakMap;function wr(t,e){return!!e.hasClass("ck-placeholder")&&(t.removeClass("ck-placeholder",e),!0)}function br(t,e){const i=pr.get(t),n=[];let s=!1;for(const[t,o]of i)o.isDirectHost&&(n.push(t),_r(e,t,o)&&(s=!0));for(const[t,o]of i){if(o.isDirectHost)continue;const i=vr(t);i&&(n.includes(i)||(o.hostElement=i,_r(e,t,o)&&(s=!0)))}return s}function _r(t,e,i){const{text:n,isDirectHost:s,hostElement:o}=i;let r=!1;o.getAttribute("data-placeholder")!==n&&(t.setAttribute("data-placeholder",n,o),r=!0);return(s||1==e.childCount)&&function(t,e){if(!t.isAttached())return!1;const i=Array.from(t.getChildren()).some((t=>!t.is("uiElement")));if(i)return!1;const n=t.document,s=n.selection.anchor;return!(n.isComposing&&s&&s.parent===t||!e&&n.isFocused&&(!s||s.parent===t))}(o,i.keepOnFocus)?function(t,e){return!e.hasClass("ck-placeholder")&&(t.addClass("ck-placeholder",e),!0)}(t,o)&&(r=!0):wr(t,o)&&(r=!0),r}function vr(t){if(t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement")&&!e.is("attributeElement"))return e}return null}class yr{is(){throw new Error("is() method is abstract")}}var kr=4;const Ar=function(t){return os(t,kr)};class xr extends(R(yr)){constructor(t){super(),this.document=t,this.parent=null}get index(){let t;if(!this.parent)return null;if(-1==(t=this.parent.getChildIndex(this)))throw new v("view-node-not-found-in-parent",this);return t}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.index),e=e.parent;return t}getAncestors(t={}){const e=[];let i=t.includeSelf?this:this.parent;for(;i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}getCommonAncestor(t,e={}){const i=this.getAncestors(e),n=t.getAncestors(e);let s=0;for(;i[s]==n[s]&&i[s];)s++;return 0===s?null:i[s-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),i=t.getPath(),n=X(e,i);switch(n){case"prefix":return!0;case"extension":return!1;default:return e[n]t.data.length)throw new v("view-textproxy-wrong-offsetintext",this);if(i<0||e+i>t.data.length)throw new v("view-textproxy-wrong-length",this);this.data=t.data.substring(e,e+i),this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}getAncestors(t={}){const e=[];let i=t.includeSelf?this.textNode:this.parent;for(;null!==i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}}Pr.prototype.is=function(t){return"$textProxy"===t||"view:$textProxy"===t||"textProxy"===t||"view:textProxy"===t};class Tr{constructor(...t){this._patterns=[],this.add(...t)}add(...t){for(let e of t)("string"==typeof e||e instanceof RegExp)&&(e={name:e}),this._patterns.push(e)}match(...t){for(const e of t)for(const t of this._patterns){const i=Er(e,t);if(i)return{element:e,pattern:t,match:i}}return null}matchAll(...t){const e=[];for(const i of t)for(const t of this._patterns){const n=Er(i,t);n&&e.push({element:i,pattern:t,match:n})}return e.length>0?e:null}getElementName(){if(1!==this._patterns.length)return null;const t=this._patterns[0],e=t.name;return"function"==typeof t||!e||e instanceof RegExp?null:e}}function Er(t,e){if("function"==typeof e)return e(t);const i={};return e.name&&(i.name=function(t,e){if(t instanceof RegExp)return!!e.match(t);return t===e}(e.name,t.name),!i.name)||e.attributes&&(i.attributes=function(t,e){const i=new Set(e.getAttributeKeys());St(t)?(void 0!==t.style&&y("matcher-pattern-deprecated-attributes-style-key",t),void 0!==t.class&&y("matcher-pattern-deprecated-attributes-class-key",t)):(i.delete("style"),i.delete("class"));return Sr(t,i,(t=>e.getAttribute(t)))}(e.attributes,t),!i.attributes)||e.classes&&(i.classes=function(t,e){return Sr(t,e.getClassNames(),(()=>{}))}(e.classes,t),!i.classes)||e.styles&&(i.styles=function(t,e){return Sr(t,e.getStyleNames(!0),(t=>e.getStyle(t)))}(e.styles,t),!i.styles)?null:i}function Sr(t,e,i){const n=function(t){if(Array.isArray(t))return t.map((t=>St(t)?(void 0!==t.key&&void 0!==t.value||y("matcher-pattern-missing-key-or-value",t),[t.key,t.value]):[t,!0]));if(St(t))return Object.entries(t);return[[t,!0]]}(t),s=Array.from(e),o=[];if(n.forEach((([t,e])=>{s.forEach((n=>{(function(t,e){return!0===t||t===e||t instanceof RegExp&&e.match(t)})(t,n)&&function(t,e,i){if(!0===t)return!0;const n=i(e);return t===n||t instanceof RegExp&&!!String(n).match(t)}(e,n,i)&&o.push(n)}))})),n.length&&!(o.lengths?0:s+e),(i=i>s?s:i)<0&&(i+=s),s=e>i?0:i-e>>>0,e>>>=0;for(var o=Array(s);++n0){if(++e>=ba)return arguments[0]}else e=0;return t.apply(void 0,arguments)}};const ka=ya(wa);const Aa=function(t,e){return ka(ga(t,e,ua),t+"")};const xa=function(t,e,i){if(!F(i))return!1;var n=typeof e;return!!("number"==n?vi(i)&&ei(e,i.length):"string"==n&&e in i)&&Ot(i[e],t)};const Ca=function(t){return Aa((function(e,i){var n=-1,s=i.length,o=s>1?i[s-1]:void 0,r=s>2?i[2]:void 0;for(o=t.length>3&&"function"==typeof o?(s--,o):void 0,r&&xa(i[0],i[1],r)&&(o=s<3?void 0:o,s=1),e=Object(e);++ne===t));return Array.isArray(e)}set(t,e){if(F(t))for(const[e,i]of Object.entries(t))this._styleProcessor.toNormalizedForm(e,i,this._styles);else this._styleProcessor.toNormalizedForm(t,e,this._styles)}remove(t){const e=Oa(t);na(this._styles,e),delete this._styles[t],this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){return this.isEmpty?"":this._getStylesEntries().map((t=>t.join(":"))).sort().join(";")+";"}getAsString(t){if(this.isEmpty)return;if(this._styles[t]&&!F(this._styles[t]))return this._styles[t];const e=this._styleProcessor.getReducedForm(t,this._styles).find((([e])=>e===t));return Array.isArray(e)?e[1]:void 0}getStyleNames(t=!1){if(this.isEmpty)return[];if(t)return this._styleProcessor.getStyleNames(this._styles);return this._getStylesEntries().map((([t])=>t))}clear(){this._styles={}}_getStylesEntries(){const t=[],e=Object.keys(this._styles);for(const i of e)t.push(...this._styleProcessor.getReducedForm(i,this._styles));return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");if(!(e.length>1))return;const i=e.splice(0,e.length-1).join("."),n=sa(this._styles,i);if(!n)return;!Array.from(Object.keys(n)).length&&this.remove(i)}}class Ra{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(t,e,i){if(F(e))Ia(i,Oa(t),e);else if(this._normalizers.has(t)){const n=this._normalizers.get(t),{path:s,value:o}=n(e);Ia(i,s,o)}else Ia(i,t,e)}getNormalized(t,e){if(!t)return Pa({},e);if(void 0!==e[t])return e[t];if(this._extractors.has(t)){const i=this._extractors.get(t);if("string"==typeof i)return sa(e,i);const n=i(t,e);if(n)return n}return sa(e,Oa(t))}getReducedForm(t,e){const i=this.getNormalized(t,e);if(void 0===i)return[];if(this._reducers.has(t)){return this._reducers.get(t)(i)}return[[t,i]]}getStyleNames(t){const e=Array.from(this._consumables.keys()).filter((e=>{const i=this.getNormalized(e,t);return i&&"object"==typeof i?Object.keys(i).length:i})),i=new Set([...e,...Object.keys(t)]);return Array.from(i.values())}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const i of e)this._mapStyleNames(i,[t])}_mapStyleNames(t,e){this._consumables.has(t)||this._consumables.set(t,[]),this._consumables.get(t).push(...e)}}function Oa(t){return t.replace("-",".")}function Ia(t,e,i){let n=i;F(i)&&(n=Pa({},sa(t,e),i)),Ea(t,e,n)}class Va extends xr{constructor(t,e,i,n){if(super(t),this.name=e,this._attrs=function(t){const e=mo(t);for(const[t,i]of e)null===i?e.delete(t):"string"!=typeof i&&e.set(t,String(i));return e}(i),this._children=[],n&&this._insertChild(0,n),this._classes=new Set,this._attrs.has("class")){const t=this._attrs.get("class");Ma(this._classes,t),this._attrs.delete("class")}this._styles=new Sa(this.document.stylesProcessor),this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style")),this._customProperties=new Map,this._unsafeAttributesToRender=[]}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){this._classes.size>0&&(yield"class"),this._styles.isEmpty||(yield"style"),yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries(),this._classes.size>0&&(yield["class",this.getAttribute("class")]),this._styles.isEmpty||(yield["style",this.getAttribute("style")])}getAttribute(t){if("class"==t)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==t){const t=this._styles.toString();return""==t?void 0:t}return this._attrs.get(t)}hasAttribute(t){return"class"==t?this._classes.size>0:"style"==t?!this._styles.isEmpty:this._attrs.has(t)}isSimilar(t){if(!(t instanceof Va))return!1;if(this===t)return!0;if(this.name!=t.name)return!1;if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size)return!1;for(const[e,i]of this._attrs)if(!t._attrs.has(e)||t._attrs.get(e)!==i)return!1;for(const e of this._classes)if(!t._classes.has(e))return!1;for(const e of this._styles.getStyleNames())if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e))return!1;return!0}hasClass(...t){for(const e of t)if(!this._classes.has(e))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(t){return this._styles.getStyleNames(t)}hasStyle(...t){for(const e of t)if(!this._styles.has(e))return!1;return!0}findAncestor(...t){const e=new Tr(...t);let i=this.parent;for(;i&&!i.is("documentFragment");){if(e.match(i))return i;i=i.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(","),e=this._styles.toString(),i=Array.from(this._attrs).map((t=>`${t[0]}="${t[1]}"`)).sort().join(" ");return this.name+(""==t?"":` class="${t}"`)+(e?` style="${e}"`:"")+(""==i?"":` ${i}`)}shouldRenderUnsafeAttribute(t){return this._unsafeAttributesToRender.includes(t)}_clone(t=!1){const e=[];if(t)for(const i of this.getChildren())e.push(i._clone(t));const i=new this.constructor(this.document,this.name,this._attrs,e);return i._classes=new Set(this._classes),i._styles.set(this._styles.getNormalized()),i._customProperties=new Map(this._customProperties),i.getFillerOffset=this.getFillerOffset,i._unsafeAttributesToRender=this._unsafeAttributesToRender,i}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let i=0;const n=function(t,e){if("string"==typeof e)return[new Cr(t,e)];tt(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Cr(t,e):e instanceof Pr?new Cr(t,e.data):e))}(this.document,e);for(const e of n)null!==e.parent&&e._remove(),e.parent=this,e.document=this.document,this._children.splice(t,0,e),t++,i++;return i}_removeChildren(t,e=1){this._fireChange("children",this);for(let i=t;i0&&(this._classes.clear(),!0):"style"==t?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this);for(const e of so(t))this._classes.add(e)}_removeClass(t){this._fireChange("attributes",this);for(const e of so(t))this._classes.delete(e)}_setStyle(t,e){this._fireChange("attributes",this),St(t)?this._styles.set(t):this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this);for(const e of so(t))this._styles.remove(e)}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function Ma(t,e){const i=e.split(/\s+/);t.clear(),i.forEach((e=>t.add(e)))}Va.prototype.is=function(t,e){return e?e===this.name&&("element"===t||"view:element"===t):"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Na extends Va{constructor(...t){super(...t),this.getFillerOffset=Ba}}function Ba(){const t=[...this.getChildren()],e=t[this.childCount-1];if(e&&e.is("element","br"))return this.childCount;for(const e of t)if(!e.is("uiElement"))return null;return this.childCount}Na.prototype.is=function(t,e){return e?e===this.name&&("containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Da extends(q(Na)){constructor(...t){super(...t);const e=t[0];this.set("isReadOnly",!1),this.set("isFocused",!1),this.bind("isReadOnly").to(e),this.bind("isFocused").to(e,"isFocused",(t=>t&&e.selection.editableElement==this)),this.listenTo(e.selection,"change",(()=>{this.isFocused=e.isFocused&&e.selection.editableElement==this}))}destroy(){this.stopListening()}}Da.prototype.is=function(t,e){return e?e===this.name&&("editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};const Fa=Symbol("rootName");class La extends Da{constructor(t,e){super(t,e),this.rootName="main"}get rootName(){return this.getCustomProperty(Fa)}set rootName(t){this._setCustomProperty(Fa,t)}set _name(t){this.name=t}}La.prototype.is=function(t,e){return e?e===this.name&&("rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class za{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new v("view-tree-walker-no-start-position",null);if(t.direction&&"forward"!=t.direction&&"backward"!=t.direction)throw new v("view-tree-walker-unknown-direction",t.startPosition,{direction:t.direction});this.boundaries=t.boundaries||null,t.startPosition?this.position=Ha._createAt(t.startPosition):this.position=Ha._createAt(t.boundaries["backward"==t.direction?"end":"start"]),this.direction=t.direction||"forward",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(t){let e,i,n;do{n=this.position,({done:e,value:i}=this.next())}while(!e&&t(i));e||(this.position=n)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let t=this.position.clone();const e=this.position,i=t.parent;if(null===i.parent&&t.offset===i.childCount)return{done:!0,value:void 0};if(i===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0,value:void 0};let n;if(i instanceof Cr){if(t.isAtEnd)return this.position=Ha._createAfter(i),this._next();n=i.data[t.offset]}else n=i.getChild(t.offset);if(n instanceof Va)return this.shallow?t.offset++:t=new Ha(n,0),this.position=t,this._formatReturnValue("elementStart",n,e,t,1);if(n instanceof Cr){if(this.singleCharacters)return t=new Ha(n,0),this.position=t,this._next();{let i,s=n.data.length;return n==this._boundaryEndParent?(s=this.boundaries.end.offset,i=new Pr(n,0,s),t=Ha._createAfter(i)):(i=new Pr(n,0,n.data.length),t.offset++),this.position=t,this._formatReturnValue("text",i,e,t,s)}}if("string"==typeof n){let n;if(this.singleCharacters)n=1;else{n=(i===this._boundaryEndParent?this.boundaries.end.offset:i.data.length)-t.offset}const s=new Pr(i,t.offset,n);return t.offset+=n,this.position=t,this._formatReturnValue("text",s,e,t,n)}return t=Ha._createAfter(i),this.position=t,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",i,e,t)}_previous(){let t=this.position.clone();const e=this.position,i=t.parent;if(null===i.parent&&0===t.offset)return{done:!0,value:void 0};if(i==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0,value:void 0};let n;if(i instanceof Cr){if(t.isAtStart)return this.position=Ha._createBefore(i),this._previous();n=i.data[t.offset-1]}else n=i.getChild(t.offset-1);if(n instanceof Va)return this.shallow?(t.offset--,this.position=t,this._formatReturnValue("elementStart",n,e,t,1)):(t=new Ha(n,n.childCount),this.position=t,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",n,e,t));if(n instanceof Cr){if(this.singleCharacters)return t=new Ha(n,n.data.length),this.position=t,this._previous();{let i,s=n.data.length;if(n==this._boundaryStartParent){const e=this.boundaries.start.offset;i=new Pr(n,e,n.data.length-e),s=i.data.length,t=Ha._createBefore(i)}else i=new Pr(n,0,n.data.length),t.offset--;return this.position=t,this._formatReturnValue("text",i,e,t,s)}}if("string"==typeof n){let n;if(this.singleCharacters)n=1;else{const e=i===this._boundaryStartParent?this.boundaries.start.offset:0;n=t.offset-e}t.offset-=n;const s=new Pr(i,t.offset,n);return this.position=t,this._formatReturnValue("text",s,e,t,n)}return t=Ha._createBefore(i),this.position=t,this._formatReturnValue("elementStart",i,e,t,1)}_formatReturnValue(t,e,i,n,s){return e instanceof Pr&&(e.offsetInText+e.data.length==e.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?i=Ha._createAfter(e.textNode):(n=Ha._createAfter(e.textNode),this.position=n)),0===e.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?i=Ha._createBefore(e.textNode):(n=Ha._createBefore(e.textNode),this.position=n))),{done:!1,value:{type:t,item:e,previousPosition:i,nextPosition:n,length:s}}}}class Ha extends yr{constructor(t,e){super(),this.parent=t,this.offset=e}get nodeAfter(){return this.parent.is("$text")?null:this.parent.getChild(this.offset)||null}get nodeBefore(){return this.parent.is("$text")?null:this.parent.getChild(this.offset-1)||null}get isAtStart(){return 0===this.offset}get isAtEnd(){const t=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;for(;!(t instanceof Da);){if(!t.parent)return null;t=t.parent}return t}getShiftedBy(t){const e=Ha._createAt(this),i=e.offset+t;return e.offset=i<0?0:i,e}getLastMatchingPosition(t,e={}){e.startPosition=this;const i=new za(e);return i.skip(t),i.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(t){const e=this.getAncestors(),i=t.getAncestors();let n=0;for(;e[n]==i[n]&&e[n];)n++;return 0===n?null:e[n-1]}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return"before"==this.compareWith(t)}isAfter(t){return"after"==this.compareWith(t)}compareWith(t){if(this.root!==t.root)return"different";if(this.isEqual(t))return"same";const e=this.parent.is("node")?this.parent.getPath():[],i=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset),i.push(t.offset);const n=X(e,i);switch(n){case"prefix":return"before";case"extension":return"after";default:return e[n]0?new this(i,n):new this(n,i)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("$textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(Ha._createBefore(t),e)}}function $a(t){return!(!t.item.is("attributeElement")&&!t.item.is("uiElement"))}ja.prototype.is=function(t){return"range"===t||"view:range"===t};class Wa extends(R(yr)){constructor(...t){super(),this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",t.length&&this.setTo(...t)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.end:t.start).clone()}get focus(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.start:t.end).clone()}get isCollapsed(){return 1===this.rangeCount&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){return this.anchor?this.anchor.editableElement:null}*getRanges(){for(const t of this._ranges)yield t.clone()}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel)return!1;if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let i=!1;for(const n of t._ranges)if(e.isEqual(n)){i=!0;break}if(!i)return!1}return!0}isSimilar(t){if(this.isBackward!=t.isBackward)return!1;const e=Z(this.getRanges());if(e!=Z(t.getRanges()))return!1;if(0==e)return!0;for(let e of this.getRanges()){e=e.getTrimmed();let i=!1;for(let n of t.getRanges())if(n=n.getTrimmed(),e.start.isEqual(n.start)&&e.end.isEqual(n.end)){i=!0;break}if(!i)return!1}return!0}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}setTo(...t){let[e,i,n]=t;if("object"==typeof i&&(n=i,i=void 0),null===e)this._setRanges([]),this._setFakeOptions(n);else if(e instanceof Wa||e instanceof qa)this._setRanges(e.getRanges(),e.isBackward),this._setFakeOptions({fake:e.isFake,label:e.fakeSelectionLabel});else if(e instanceof ja)this._setRanges([e],n&&n.backward),this._setFakeOptions(n);else if(e instanceof Ha)this._setRanges([new ja(e)]),this._setFakeOptions(n);else if(e instanceof xr){const t=!!n&&!!n.backward;let s;if(void 0===i)throw new v("view-selection-setto-required-second-parameter",this);s="in"==i?ja._createIn(e):"on"==i?ja._createOn(e):new ja(Ha._createAt(e,i)),this._setRanges([s],t),this._setFakeOptions(n)}else{if(!tt(e))throw new v("view-selection-setto-not-selectable",this);this._setRanges(e,n&&n.backward),this._setFakeOptions(n)}this.fire("change")}setFocus(t,e){if(null===this.anchor)throw new v("view-selection-setfocus-no-ranges",this);const i=Ha._createAt(t,e);if("same"==i.compareWith(this.focus))return;const n=this.anchor;this._ranges.pop(),"before"==i.compareWith(n)?this._addRange(new ja(i,n),!0):this._addRange(new ja(n,i)),this.fire("change")}_setRanges(t,e=!1){t=Array.from(t),this._ranges=[];for(const e of t)this._addRange(e);this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake,this._fakeSelectionLabel=t.fake&&t.label||""}_addRange(t,e=!1){if(!(t instanceof ja))throw new v("view-selection-add-range-not-range",this);this._pushRange(t),this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges)if(t.isIntersecting(e))throw new v("view-selection-range-intersects",this,{addedRange:t,intersectingRange:e});this._ranges.push(new ja(t.start,t.end))}}Wa.prototype.is=function(t){return"selection"===t||"view:selection"===t};class qa extends(R(yr)){constructor(...t){super(),this._selection=new Wa,this._selection.delegate("change").to(this),t.length&&this._selection.setTo(...t)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}_setTo(...t){this._selection.setTo(...t)}_setFocus(t,e){this._selection.setFocus(t,e)}}qa.prototype.is=function(t){return"selection"===t||"documentSelection"==t||"view:selection"==t||"view:documentSelection"==t};class Ua extends m{constructor(t,e,i){super(t,e),this.startRange=i,this._eventPhase="none",this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}const Ka=Symbol("bubbling contexts");function Ga(t){return class extends t{fire(t,...e){try{const i=t instanceof m?t:new m(this,t),n=Za(this);if(!n.size)return;if(Ja(i,"capturing",this),Qa(n,"$capture",i,...e))return i.return;const s=i.startRange||this.selection.getFirstRange(),o=s?s.getContainedElement():null,r=!!o&&Boolean(Ya(n,o));let a=o||function(t){if(!t)return null;const e=t.start.parent,i=t.end.parent,n=e.getPath(),s=i.getPath();return n.length>s.length?e:i}(s);if(Ja(i,"atTarget",a),!r){if(Qa(n,"$text",i,...e))return i.return;Ja(i,"bubbling",a)}for(;a;){if(a.is("rootElement")){if(Qa(n,"$root",i,...e))return i.return}else if(a.is("element")&&Qa(n,a.name,i,...e))return i.return;if(Qa(n,a,i,...e))return i.return;a=a.parent,Ja(i,"bubbling",a)}return Ja(i,"bubbling",this),Qa(n,"$document",i,...e),i.return}catch(t){v.rethrowUnexpectedError(t,this)}}_addEventListener(t,e,i){const n=so(i.context||"$document"),s=Za(this);for(const o of n){let n=s.get(o);n||(n=new(R()),s.set(o,n)),this.listenTo(n,t,e,i)}}_removeEventListener(t,e){const i=Za(this);for(const n of i.values())this.stopListening(n,t,e)}}}{const t=Ga(Object);["fire","_addEventListener","_removeEventListener"].forEach((e=>{Ga[e]=t.prototype[e]}))}function Ja(t,e,i){t instanceof Ua&&(t._eventPhase=e,t._currentTarget=i)}function Qa(t,e,i,...n){const s="string"==typeof e?t.get(e):Ya(t,e);return!!s&&(s.fire(i,...n),i.stop.called)}function Ya(t,e){for(const[i,n]of t)if("function"==typeof i&&i(e))return n;return null}function Za(t){return t[Ka]||(t[Ka]=new Map),t[Ka]}class Xa extends(Ga(q())){constructor(t){super(),this.selection=new qa,this.roots=new co({idProperty:"rootName"}),this.stylesProcessor=t,this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isSelecting",!1),this.set("isComposing",!1),this._postFixers=new Set}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.map((t=>t.destroy())),this.stopListening()}_callPostFixers(t){let e=!1;do{for(const i of this._postFixers)if(e=i(t),e)break}while(e)}}class tl extends Va{constructor(...t){super(...t),this.getFillerOffset=el,this._priority=10,this._id=null,this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(null===this.id)throw new v("attribute-element-get-elements-with-same-id-no-id",this);return new Set(this._clonesGroup)}isSimilar(t){return null!==this.id||null!==t.id?this.id===t.id:super.isSimilar(t)&&this.priority==t.priority}_clone(t=!1){const e=super._clone(t);return e._priority=this._priority,e._id=this._id,e}}function el(){if(il(this))return null;let t=this.parent;for(;t&&t.is("attributeElement");){if(il(t)>1)return null;t=t.parent}return!t||il(t)>1?null:this.childCount}function il(t){return Array.from(t.getChildren()).filter((t=>!t.is("uiElement"))).length}tl.DEFAULT_PRIORITY=10,tl.prototype.is=function(t,e){return e?e===this.name&&("attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t):"attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class nl extends Va{constructor(t,e,i,n){super(t,e,i,n),this.getFillerOffset=sl}_insertChild(t,e){if(e&&(e instanceof xr||Array.from(e).length>0))throw new v("view-emptyelement-cannot-add",[this,e]);return 0}}function sl(){return null}nl.prototype.is=function(t,e){return e?e===this.name&&("emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t):"emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class ol extends Va{constructor(...t){super(...t),this.getFillerOffset=al}_insertChild(t,e){if(e&&(e instanceof xr||Array.from(e).length>0))throw new v("view-uielement-cannot-add",[this,e]);return 0}render(t,e){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys())e.setAttribute(t,this.getAttribute(t));return e}}function rl(t){t.document.on("arrowKey",((e,i)=>function(t,e,i){if(e.keyCode==Zs.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection(),n=1==t.rangeCount&&t.getRangeAt(0).collapsed;if(n||e.shiftKey){const e=t.focusNode,s=t.focusOffset,o=i.domPositionToView(e,s);if(null===o)return;let r=!1;const a=o.getLastMatchingPosition((t=>(t.item.is("uiElement")&&(r=!0),!(!t.item.is("uiElement")&&!t.item.is("attributeElement")))));if(r){const e=i.viewPositionToDom(a);n?t.collapse(e.parent,e.offset):t.extend(e.parent,e.offset)}}}}(0,i,t.domConverter)),{priority:"low"})}function al(){return null}ol.prototype.is=function(t,e){return e?e===this.name&&("uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t):"uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class ll extends Va{constructor(...t){super(...t),this.getFillerOffset=cl}_insertChild(t,e){if(e&&(e instanceof xr||Array.from(e).length>0))throw new v("view-rawelement-cannot-add",[this,e]);return 0}render(){}}function cl(){return null}ll.prototype.is=function(t,e){return e?e===this.name&&("rawElement"===t||"view:rawElement"===t||"element"===t||"view:element"===t):"rawElement"===t||"view:rawElement"===t||t===this.name||t==="view:"+this.name||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class hl extends(R(yr)){constructor(t,e){super(),this.document=t,this._children=[],e&&this._insertChild(0,e),this._customProperties=new Map}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let i=0;const n=function(t,e){if("string"==typeof e)return[new Cr(t,e)];tt(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Cr(t,e):e instanceof Pr?new Cr(t,e.data):e))}(this.document,e);for(const e of n)null!==e.parent&&e._remove(),e.parent=this,this._children.splice(t,0,e),t++,i++;return i}_removeChildren(t,e=1){this._fireChange("children",this);for(let i=t;i{const i=t[t.length-1],n=!e.is("uiElement");return i&&i.breakAttributes==n?i.nodes.push(e):t.push({breakAttributes:n,nodes:[e]}),t}),[]);let n=null,s=t;for(const{nodes:t,breakAttributes:e}of i){const i=this._insertNodes(s,t,e);n||(n=i.start),s=i.end}return n?new ja(n,s):new ja(t)}remove(t){const e=t instanceof ja?t:ja._createOn(t);if(vl(e,this.document),e.isCollapsed)return new hl(this.document);const{start:i,end:n}=this._breakAttributesRange(e,!0),s=i.parent,o=n.offset-i.offset,r=s._removeChildren(i.offset,o);for(const t of r)this._removeFromClonedElementsGroup(t);const a=this.mergeAttributes(i);return e.start=a,e.end=a.clone(),new hl(this.document,r)}clear(t,e){vl(t,this.document);const i=t.getWalker({direction:"backward",ignoreElementEnd:!0});for(const n of i){const i=n.item;let s;if(i.is("element")&&e.isSimilar(i))s=ja._createOn(i);else if(!n.nextPosition.isAfter(t.start)&&i.is("$textProxy")){const t=i.getAncestors().find((t=>t.is("element")&&e.isSimilar(t)));t&&(s=ja._createIn(t))}s&&(s.end.isAfter(t.end)&&(s.end=t.end),s.start.isBefore(t.start)&&(s.start=t.start),this.remove(s))}}move(t,e){let i;if(e.isAfter(t.end)){const n=(e=this._breakAttributes(e,!0)).parent,s=n.childCount;t=this._breakAttributesRange(t,!0),i=this.remove(t),e.offset+=n.childCount-s}else i=this.remove(t);return this.insert(e,i)}wrap(t,e){if(!(e instanceof tl))throw new v("view-writer-wrap-invalid-attribute",this.document);if(vl(t,this.document),t.isCollapsed){let n=t.start;n.parent.is("element")&&(i=n.parent,!Array.from(i.getChildren()).some((t=>!t.is("uiElement"))))&&(n=n.getLastMatchingPosition((t=>t.item.is("uiElement")))),n=this._wrapPosition(n,e);const s=this.document.selection;return s.isCollapsed&&s.getFirstPosition().isEqual(t.start)&&this.setSelection(n),new ja(n)}return this._wrapRange(t,e);var i}unwrap(t,e){if(!(e instanceof tl))throw new v("view-writer-unwrap-invalid-attribute",this.document);if(vl(t,this.document),t.isCollapsed)return t;const{start:i,end:n}=this._breakAttributesRange(t,!0),s=i.parent,o=this._unwrapChildren(s,i.offset,n.offset,e),r=this.mergeAttributes(o.start);r.isEqual(o.start)||o.end.offset--;const a=this.mergeAttributes(o.end);return new ja(r,a)}rename(t,e){const i=new Na(this.document,t,e.getAttributes());return this.insert(Ha._createAfter(e),i),this.move(ja._createIn(e),Ha._createAt(i,0)),this.remove(ja._createOn(e)),i}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return Ha._createAt(t,e)}createPositionAfter(t){return Ha._createAfter(t)}createPositionBefore(t){return Ha._createBefore(t)}createRange(...t){return new ja(...t)}createRangeOn(t){return ja._createOn(t)}createRangeIn(t){return ja._createIn(t)}createSelection(...t){return new Wa(...t)}createSlot(t){if(!this._slotFactory)throw new v("view-writer-invalid-create-slot-context",this.document);return this._slotFactory(this,t)}_registerSlotFactory(t){this._slotFactory=t}_clearSlotFactory(){this._slotFactory=null}_insertNodes(t,e,i){let n,s;if(n=i?ul(t):t.parent.is("$text")?t.parent.parent:t.parent,!n)throw new v("view-writer-invalid-position-container",this.document);s=i?this._breakAttributes(t,!0):t.parent.is("$text")?gl(t):t;const o=n._insertChild(s.offset,e);for(const t of e)this._addToClonedElementsGroup(t);const r=s.getShiftedBy(o),a=this.mergeAttributes(s);a.isEqual(s)||r.offset--;const l=this.mergeAttributes(r);return new ja(a,l)}_wrapChildren(t,e,i,n){let s=e;const o=[];for(;s!1,t.parent._insertChild(t.offset,i);const n=new ja(t,t.getShiftedBy(1));this.wrap(n,e);const s=new Ha(i.parent,i.index);i._remove();const o=s.nodeBefore,r=s.nodeAfter;return o instanceof Cr&&r instanceof Cr?pl(o,r):ml(s)}_wrapAttributeElement(t,e){if(!yl(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const i of t.getAttributeKeys())if("class"!==i&&"style"!==i&&e.hasAttribute(i)&&e.getAttribute(i)!==t.getAttribute(i))return!1;for(const i of t.getStyleNames())if(e.hasStyle(i)&&e.getStyle(i)!==t.getStyle(i))return!1;for(const i of t.getAttributeKeys())"class"!==i&&"style"!==i&&(e.hasAttribute(i)||this.setAttribute(i,t.getAttribute(i),e));for(const i of t.getStyleNames())e.hasStyle(i)||this.setStyle(i,t.getStyle(i),e);for(const i of t.getClassNames())e.hasClass(i)||this.addClass(i,e);return!0}_unwrapAttributeElement(t,e){if(!yl(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const i of t.getAttributeKeys())if("class"!==i&&"style"!==i&&(!e.hasAttribute(i)||e.getAttribute(i)!==t.getAttribute(i)))return!1;if(!e.hasClass(...t.getClassNames()))return!1;for(const i of t.getStyleNames())if(!e.hasStyle(i)||e.getStyle(i)!==t.getStyle(i))return!1;for(const i of t.getAttributeKeys())"class"!==i&&"style"!==i&&this.removeAttribute(i,e);return this.removeClass(Array.from(t.getClassNames()),e),this.removeStyle(Array.from(t.getStyleNames()),e),!0}_breakAttributesRange(t,e=!1){const i=t.start,n=t.end;if(vl(t,this.document),t.isCollapsed){const i=this._breakAttributes(t.start,e);return new ja(i,i)}const s=this._breakAttributes(n,e),o=s.parent.childCount,r=this._breakAttributes(i,e);return s.offset+=s.parent.childCount-o,new ja(r,s)}_breakAttributes(t,e=!1){const i=t.offset,n=t.parent;if(t.parent.is("emptyElement"))throw new v("view-writer-cannot-break-empty-element",this.document);if(t.parent.is("uiElement"))throw new v("view-writer-cannot-break-ui-element",this.document);if(t.parent.is("rawElement"))throw new v("view-writer-cannot-break-raw-element",this.document);if(!e&&n.is("$text")&&_l(n.parent))return t.clone();if(_l(n))return t.clone();if(n.is("$text"))return this._breakAttributes(gl(t),e);if(i==n.childCount){const t=new Ha(n.parent,n.index+1);return this._breakAttributes(t,e)}if(0===i){const t=new Ha(n.parent,n.index);return this._breakAttributes(t,e)}{const t=n.index+1,s=n._clone();n.parent._insertChild(t,s),this._addToClonedElementsGroup(s);const o=n.childCount-i,r=n._removeChildren(i,o);s._appendChild(r);const a=new Ha(n.parent,t);return this._breakAttributes(a,e)}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement"))return;if(t.is("element"))for(const e of t.getChildren())this._addToClonedElementsGroup(e);const e=t.id;if(!e)return;let i=this._cloneGroups.get(e);i||(i=new Set,this._cloneGroups.set(e,i)),i.add(t),t._clonesGroup=i}_removeFromClonedElementsGroup(t){if(t.is("element"))for(const e of t.getChildren())this._removeFromClonedElementsGroup(e);const e=t.id;if(!e)return;const i=this._cloneGroups.get(e);i&&i.delete(t)}}function ul(t){let e=t.parent;for(;!_l(e);){if(!e)return;e=e.parent}return e}function fl(t,e){return t.prioritye.priority)&&t.getIdentity()i instanceof t)))throw new v("view-writer-insert-invalid-node-type",e);i.is("$text")||bl(i.getChildren(),e)}}function _l(t){return t&&(t.is("containerElement")||t.is("documentFragment"))}function vl(t,e){const i=ul(t.start),n=ul(t.end);if(!i||!n||i!==n)throw new v("view-writer-invalid-range-container",e)}function yl(t,e){return null===t.id&&null===e.id}const kl=t=>t.createTextNode(" "),Al=t=>{const e=t.createElement("span");return e.dataset.ckeFiller="true",e.innerText=" ",e},xl=t=>{const e=t.createElement("br");return e.dataset.ckeFiller="true",e},Cl=7,Pl="⁠".repeat(Cl);function Tl(t){return ks(t)&&t.data.substr(0,Cl)===Pl}function El(t){return t.data.length==Cl&&Tl(t)}function Sl(t){return Tl(t)?t.data.slice(Cl):t.data}function Rl(t,e){if(e.keyCode==Zs.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(1==t.rangeCount&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer,i=t.getRangeAt(0).startOffset;Tl(e)&&i<=Cl&&t.collapse(e,0)}}}class Ol extends(q()){constructor(t,e){super(),this.domDocuments=new Set,this.domConverter=t,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this.selection=e,this.set("isFocused",!1),this.set("isSelecting",!1),r.isBlink&&!r.isAndroid&&this.on("change:isSelecting",(()=>{this.isSelecting||this.render()})),this.set("isComposing",!1),this.on("change:isComposing",(()=>{this.isComposing||this.render()})),this._inlineFiller=null,this._fakeSelectionContainer=null}markToSync(t,e){if("text"===t)this.domConverter.mapViewToDom(e.parent)&&this.markedTexts.add(e);else{if(!this.domConverter.mapViewToDom(e))return;if("attributes"===t)this.markedAttributes.add(e);else{if("children"!==t)throw new v("view-renderer-unknown-type",this);this.markedChildren.add(e)}}}render(){if(this.isComposing&&!r.isAndroid)return;let t=null;const e=!(r.isBlink&&!r.isAndroid)||!this.isSelecting;for(const t of this.markedChildren)this._updateChildrenMappings(t);e?(this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?t=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(t=this.selection.getFirstPosition(),this.markedChildren.add(t.parent))):this._inlineFiller&&this._inlineFiller.parentNode&&(t=this.domConverter.domPositionToView(this._inlineFiller),t&&t.parent.is("$text")&&(t=Ha._createBefore(t.parent)));for(const t of this.markedAttributes)this._updateAttrs(t);for(const e of this.markedChildren)this._updateChildren(e,{inlineFillerPosition:t});for(const e of this.markedTexts)!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)&&this._updateText(e,{inlineFillerPosition:t});if(e)if(t){const e=this.domConverter.viewPositionToDom(t),i=e.parent.ownerDocument;Tl(e.parent)?this._inlineFiller=e.parent:this._inlineFiller=Il(i,e.parent,e.offset)}else this._inlineFiller=null;this._updateFocus(),this._updateSelection(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(t){if(!this.domConverter.mapViewToDom(t))return;const e=Array.from(this.domConverter.mapViewToDom(t).childNodes),i=Array.from(this.domConverter.viewChildrenToDom(t,{withChildren:!1})),n=this._diffNodeLists(e,i),s=this._findReplaceActions(n,e,i);if(-1!==s.indexOf("replace")){const n={equal:0,insert:0,delete:0};for(const o of s)if("replace"===o){const s=n.equal+n.insert,o=n.equal+n.delete,r=t.getChild(s);!r||r.is("uiElement")||r.is("rawElement")||this._updateElementMappings(r,e[o]),zs(i[s]),n.equal++}else n[o]++}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e),this.domConverter.bindElements(e,t),this.markedChildren.add(t),this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();return t.parent.is("$text")?Ha._createBefore(t.parent):t}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=this.domConverter.viewPositionToDom(t);return!!(e&&ks(e.parent)&&Tl(e.parent))}_removeInlineFiller(){const t=this._inlineFiller;if(!Tl(t))throw new v("view-renderer-filler-was-lost",this);El(t)?t.remove():t.data=t.data.substr(Cl),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=t.parent,i=t.offset;if(!this.domConverter.mapViewToDom(e.root))return!1;if(!e.is("element"))return!1;if(!function(t){if("false"==t.getAttribute("contenteditable"))return!1;const e=t.findAncestor((t=>t.hasAttribute("contenteditable")));return!e||"true"==e.getAttribute("contenteditable")}(e))return!1;if(i===e.getFillerOffset())return!1;const n=t.nodeBefore,s=t.nodeAfter;return!(n instanceof Cr||s instanceof Cr)&&(!r.isAndroid||!n&&!s)}_updateText(t,e){const i=this.domConverter.findCorrespondingDomText(t);let n=this.domConverter.viewToDom(t).data;const s=e.inlineFillerPosition;s&&s.parent==t.parent&&s.offset==t.index&&(n=Pl+n),Bl(i,n)}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const i=Array.from(e.attributes).map((t=>t.name)),n=t.getAttributeKeys();for(const i of n)this.domConverter.setDomElementAttribute(e,i,t.getAttribute(i),t);for(const n of i)t.hasAttribute(n)||this.domConverter.removeDomElementAttribute(e,n)}_updateChildren(t,e){const i=this.domConverter.mapViewToDom(t);if(!i)return;if(r.isAndroid){let t=null;for(const e of Array.from(i.childNodes)){if(t&&ks(t)&&ks(e)){i.normalize();break}t=e}}const n=e.inlineFillerPosition,s=i.childNodes,o=Array.from(this.domConverter.viewChildrenToDom(t,{bind:!0}));n&&n.parent===t&&Il(i.ownerDocument,o,n.offset);const a=this._diffNodeLists(s,o),l=r.isAndroid?this._findReplaceActions(a,s,o,{replaceText:!0}):a;let c=0;const h=new Set;for(const t of l)"delete"===t?(h.add(s[c]),zs(s[c])):"equal"!==t&&"replace"!==t||c++;c=0;for(const t of l)"insert"===t?(Ms(i,c,o[c]),c++):"replace"===t?(Bl(s[c],o[c].data),c++):"equal"===t&&(this._markDescendantTextToSync(this.domConverter.domToView(o[c])),c++);for(const t of h)t.parentNode||this.domConverter.unbindDomElement(t)}_diffNodeLists(t,e){return t=function(t,e){const i=Array.from(t);if(0==i.length||!e)return i;const n=i[i.length-1];n==e&&i.pop();return i}(t,this._fakeSelectionContainer),d(t,e,Nl.bind(null,this.domConverter))}_findReplaceActions(t,e,i,n={}){if(-1===t.indexOf("insert")||-1===t.indexOf("delete"))return t;let s=[],o=[],r=[];const a={equal:0,insert:0,delete:0};for(const l of t)"insert"===l?r.push(i[a.equal+a.insert]):"delete"===l?o.push(e[a.equal+a.delete]):(s=s.concat(d(o,r,n.replaceText?Ml:Vl).map((t=>"equal"===t?"replace":t))),s.push("equal"),o=[],r=[]),a[l]++;return s.concat(d(o,r,n.replaceText?Ml:Vl).map((t=>"equal"===t?"replace":t)))}_markDescendantTextToSync(t){if(t)if(t.is("$text"))this.markedTexts.add(t);else if(t.is("element"))for(const e of t.getChildren())this._markDescendantTextToSync(e)}_updateSelection(){if(r.isBlink&&!r.isAndroid&&this.isSelecting&&!this.markedChildren.size)return;if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const t=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&t&&(this.selection.isFake?this._updateFakeSelection(t):this._fakeSelectionContainer&&this._fakeSelectionContainer.isConnected?(this._removeFakeSelection(),this._updateDomSelection(t)):this.isComposing&&r.isAndroid||this._updateDomSelection(t))}_updateFakeSelection(t){const e=t.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(t){const e=t.createElement("div");return e.className="ck-fake-selection-container",Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),e.textContent=" ",e}(e));const i=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(i,this.selection),!this._fakeSelectionNeedsUpdate(t))return;i.parentElement&&i.parentElement==t||t.appendChild(i),i.textContent=this.selection.fakeSelectionLabel||" ";const n=e.getSelection(),s=e.createRange();n.removeAllRanges(),s.selectNodeContents(i),n.addRange(s)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e))return;const i=this.domConverter.viewPositionToDom(this.selection.anchor),n=this.domConverter.viewPositionToDom(this.selection.focus);e.collapse(i.parent,i.offset),e.extend(n.parent,n.offset),r.isGecko&&function(t,e){const i=t.parent;if(i.nodeType!=Node.ELEMENT_NODE||t.offset!=i.childNodes.length-1)return;const n=i.childNodes[t.offset];n&&"BR"==n.tagName&&e.addRange(e.getRangeAt(0))}(n,e)}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t))return!0;const e=t&&this.domConverter.domSelectionToView(t);return(!e||!this.selection.isEqual(e))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(e))}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer,i=t.ownerDocument.getSelection();return!e||e.parentElement!==t||(i.anchorNode!==e&&!e.contains(i.anchorNode)||e.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const t of this.domDocuments){const e=t.getSelection();if(e.rangeCount){const i=t.activeElement,n=this.domConverter.mapDomToView(i);i&&n&&e.removeAllRanges()}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;t&&t.remove()}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;t&&this.domConverter.focus(t)}}}function Il(t,e,i){const n=e instanceof Array?e:e.childNodes,s=n[i];if(ks(s))return s.data=Pl+s.data,s;{const s=t.createTextNode(Pl);return Array.isArray(e)?n.splice(i,0,s):Ms(e,i,s),s}}function Vl(t,e){return fs(t)&&fs(e)&&!ks(t)&&!ks(e)&&!Ns(t)&&!Ns(e)&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function Ml(t,e){return fs(t)&&fs(e)&&ks(t)&&ks(e)}function Nl(t,e,i){return e===i||(ks(e)&&ks(i)?e.data===i.data:!(!t.isBlockFiller(e)||!t.isBlockFiller(i)))}function Bl(t,e){const i=t.data;if(i==e)return;const n=l(i,e);for(const e of n)"insert"===e.type?t.insertData(e.index,e.values.join("")):t.deleteData(e.index,e.howMany)}const Dl=xl(vs.document),Fl=kl(vs.document),Ll=Al(vs.document),zl="data-ck-unsafe-attribute-",Hl="data-ck-unsafe-element";class jl{constructor(t,e={}){this.document=t,this.renderingMode=e.renderingMode||"editing",this.blockFillerMode=e.blockFillerMode||("editing"===this.renderingMode?"br":"nbsp"),this.preElements=["pre"],this.blockElements=["address","article","aside","blockquote","caption","center","dd","details","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","legend","li","main","menu","nav","ol","p","pre","section","summary","table","tbody","td","tfoot","th","thead","tr","ul"],this.inlineObjectElements=["object","iframe","input","button","textarea","select","option","video","embed","audio","img","canvas"],this.unsafeElements=["script","style"],this._domDocument="editing"===this.renderingMode?vs.document:vs.document.implementation.createHTMLDocument(""),this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap,this._rawContentElementMatcher=new Tr,this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new Wa(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t),this._viewToDomMapping.delete(e);for(const e of Array.from(t.children))this.unbindDomElement(e)}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}shouldRenderAttribute(t,e,i){return"data"===this.renderingMode||!(t=t.toLowerCase()).startsWith("on")&&(("srcdoc"!==t||!e.match(/\bon\S+\s*=|javascript:|<\s*\/*script/i))&&("img"===i&&("src"===t||"srcset"===t)||("source"===i&&"srcset"===t||!e.match(/^\s*(javascript:|data:(image\/svg|text\/x?html))/i))))}setContentOf(t,e){if("data"===this.renderingMode)return void(t.innerHTML=e);const i=(new DOMParser).parseFromString(e,"text/html"),n=i.createDocumentFragment(),s=i.body.childNodes;for(;s.length>0;)n.appendChild(s[0]);const o=i.createTreeWalker(n,NodeFilter.SHOW_ELEMENT),r=[];let a;for(;a=o.nextNode();)r.push(a);for(const t of r){for(const e of t.getAttributeNames())this.setDomElementAttribute(t,e,t.getAttribute(e));const e=t.tagName.toLowerCase();this._shouldRenameElement(e)&&(ql(e),t.replaceWith(this._createReplacementDomElement(e,t)))}for(;t.firstChild;)t.firstChild.remove();t.append(n)}viewToDom(t,e={}){if(t.is("$text")){const e=this._processDataFromViewText(t);return this._domDocument.createTextNode(e)}{if(this.mapViewToDom(t))return this.mapViewToDom(t);let i;if(t.is("documentFragment"))i=this._domDocument.createDocumentFragment(),e.bind&&this.bindDocumentFragments(i,t);else{if(t.is("uiElement"))return i="$comment"===t.name?this._domDocument.createComment(t.getCustomProperty("$rawContent")):t.render(this._domDocument,this),e.bind&&this.bindElements(i,t),i;this._shouldRenameElement(t.name)?(ql(t.name),i=this._createReplacementDomElement(t.name)):i=t.hasAttribute("xmlns")?this._domDocument.createElementNS(t.getAttribute("xmlns"),t.name):this._domDocument.createElement(t.name),t.is("rawElement")&&t.render(i,this),e.bind&&this.bindElements(i,t);for(const e of t.getAttributeKeys())this.setDomElementAttribute(i,e,t.getAttribute(e),t)}if(!1!==e.withChildren)for(const n of this.viewChildrenToDom(t,e))i.appendChild(n);return i}}setDomElementAttribute(t,e,i,n){const s=this.shouldRenderAttribute(e,i,t.tagName.toLowerCase())||n&&n.shouldRenderUnsafeAttribute(e);s||y("domconverter-unsafe-attribute-detected",{domElement:t,key:e,value:i}),t.hasAttribute(e)&&!s?t.removeAttribute(e):t.hasAttribute(zl+e)&&s&&t.removeAttribute(zl+e),t.setAttribute(s?e:zl+e,i)}removeDomElementAttribute(t,e){e!=Hl&&(t.removeAttribute(e),t.removeAttribute(zl+e))}*viewChildrenToDom(t,e={}){const i=t.getFillerOffset&&t.getFillerOffset();let n=0;for(const s of t.getChildren()){i===n&&(yield this._getBlockFiller());const t=s.is("element")&&!!s.getCustomProperty("dataPipeline:transparentRendering")&&!ho(s.getAttributes());t&&"data"==this.renderingMode?yield*this.viewChildrenToDom(s,e):(t&&y("domconverter-transparent-rendering-unsupported-in-editing-pipeline",{viewElement:s}),yield this.viewToDom(s,e)),n++}i===n&&(yield this._getBlockFiller())}viewRangeToDom(t){const e=this.viewPositionToDom(t.start),i=this.viewPositionToDom(t.end),n=this._domDocument.createRange();return n.setStart(e.parent,e.offset),n.setEnd(i.parent,i.offset),n}viewPositionToDom(t){const e=t.parent;if(e.is("$text")){const i=this.findCorrespondingDomText(e);if(!i)return null;let n=t.offset;return Tl(i)&&(n+=Cl),{parent:i,offset:n}}{let i,n,s;if(0===t.offset){if(i=this.mapViewToDom(e),!i)return null;s=i.childNodes[0]}else{const e=t.nodeBefore;if(n=e.is("$text")?this.findCorrespondingDomText(e):this.mapViewToDom(e),!n)return null;i=n.parentNode,s=n.nextSibling}if(ks(s)&&Tl(s))return{parent:s,offset:Cl};return{parent:i,offset:n?Vs(n)+1:0}}}domToView(t,e={}){if(this.isBlockFiller(t))return null;const i=this.getHostViewElement(t);if(i)return i;if(Ns(t)&&e.skipComments)return null;if(ks(t)){if(El(t))return null;{const e=this._processDataFromDomText(t);return""===e?null:new Cr(this.document,e)}}{if(this.mapDomToView(t))return this.mapDomToView(t);let i;if(this.isDocumentFragment(t))i=new hl(this.document),e.bind&&this.bindDocumentFragments(t,i);else{i=this._createViewElement(t,e),e.bind&&this.bindElements(t,i);const n=t.attributes;if(n)for(let t=n.length,e=0;e{const{scrollLeft:e,scrollTop:i}=t;n.push([e,i])})),e.focus(),$l(e,(t=>{const[e,i]=n.shift();t.scrollLeft=e,t.scrollTop=i})),vs.window.scrollTo(t,i)}}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isBlockFiller(t){return"br"==this.blockFillerMode?t.isEqualNode(Dl):!("BR"!==t.tagName||!Wl(t,this.blockElements)||1!==t.parentNode.childNodes.length)||(t.isEqualNode(Ll)||function(t,e){const i=t.isEqualNode(Fl);return i&&Wl(t,e)&&1===t.parentNode.childNodes.length}(t,this.blockElements))}isDomSelectionBackward(t){if(t.isCollapsed)return!1;const e=this._domDocument.createRange();try{e.setStart(t.anchorNode,t.anchorOffset),e.setEnd(t.focusNode,t.focusOffset)}catch(t){return!1}const i=e.collapsed;return e.detach(),i}getHostViewElement(t){const e=ys(t);for(e.pop();e.length;){const t=e.pop(),i=this._domToViewMapping.get(t);if(i&&(i.is("uiElement")||i.is("rawElement")))return i}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}registerRawContentMatcher(t){this._rawContentElementMatcher.add(t)}_getBlockFiller(){switch(this.blockFillerMode){case"nbsp":return kl(this._domDocument);case"markedNbsp":return Al(this._domDocument);case"br":return xl(this._domDocument)}}_isDomSelectionPositionCorrect(t,e){if(ks(t)&&Tl(t)&&ethis.preElements.includes(t.name))))return e;if(" "==e.charAt(0)){const i=this._getTouchingInlineViewNode(t,!1);!(i&&i.is("$textProxy")&&this._nodeEndsWithSpace(i))&&i||(e=" "+e.substr(1))}if(" "==e.charAt(e.length-1)){const i=this._getTouchingInlineViewNode(t,!0),n=i&&i.is("$textProxy")&&" "==i.data.charAt(0);" "!=e.charAt(e.length-2)&&i&&!n||(e=e.substr(0,e.length-1)+" ")}return e.replace(/ {2}/g,"  ")}_nodeEndsWithSpace(t){if(t.getAncestors().some((t=>this.preElements.includes(t.name))))return!1;const e=this._processDataFromViewText(t);return" "==e.charAt(e.length-1)}_processDataFromDomText(t){let e=t.data;if(function(t,e){const i=ys(t);return i.some((t=>t.tagName&&e.includes(t.tagName.toLowerCase())))}(t,this.preElements))return Sl(t);e=e.replace(/[ \n\t\r]{1,}/g," ");const i=this._getTouchingInlineDomNode(t,!1),n=this._getTouchingInlineDomNode(t,!0),s=this._checkShouldLeftTrimDomText(t,i),o=this._checkShouldRightTrimDomText(t,n);s&&(e=e.replace(/^ /,"")),o&&(e=e.replace(/ $/,"")),e=Sl(new Text(e)),e=e.replace(/ \u00A0/g," ");const r=n&&this.isElement(n)&&"BR"!=n.tagName,a=n&&ks(n)&&" "==n.data.charAt(0);return(/( |\u00A0)\u00A0$/.test(e)||!n||r||a)&&(e=e.replace(/\u00A0$/," ")),(s||i&&this.isElement(i)&&"BR"!=i.tagName)&&(e=e.replace(/^\u00A0/," ")),e}_checkShouldLeftTrimDomText(t,e){return!e||(this.isElement(e)?"BR"===e.tagName:!this._encounteredRawContentDomNodes.has(t.previousSibling)&&/[^\S\u00A0]/.test(e.data.charAt(e.data.length-1)))}_checkShouldRightTrimDomText(t,e){return!e&&!Tl(t)}_getTouchingInlineViewNode(t,e){const i=new za({startPosition:e?Ha._createAfter(t):Ha._createBefore(t),direction:e?"forward":"backward"});for(const t of i){if(t.item.is("element")&&this.inlineObjectElements.includes(t.item.name))return t.item;if(t.item.is("containerElement"))return null;if(t.item.is("element","br"))return null;if(t.item.is("$textProxy"))return t.item}return null}_getTouchingInlineDomNode(t,e){if(!t.parentNode)return null;const i=e?"firstChild":"lastChild",n=e?"nextSibling":"previousSibling";let s=!0,o=t;do{if(!s&&o[i]?o=o[i]:o[n]?(o=o[n],s=!1):(o=o.parentNode,s=!0),!o||this._isBlockElement(o))return null}while(!ks(o)&&"BR"!=o.tagName&&!this._isInlineObjectElement(o));return o}_isBlockElement(t){return this.isElement(t)&&this.blockElements.includes(t.tagName.toLowerCase())}_isInlineObjectElement(t){return this.isElement(t)&&this.inlineObjectElements.includes(t.tagName.toLowerCase())}_createViewElement(t,e){if(Ns(t))return new ol(this.document,"$comment");const i=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();return new Va(this.document,i)}_isViewElementWithRawContent(t,e){return!1!==e.withChildren&&!!this._rawContentElementMatcher.match(t)}_shouldRenameElement(t){const e=t.toLowerCase();return"editing"===this.renderingMode&&this.unsafeElements.includes(e)}_createReplacementDomElement(t,e){const i=this._domDocument.createElement("span");if(i.setAttribute(Hl,t),e){for(;e.firstChild;)i.appendChild(e.firstChild);for(const t of e.getAttributeNames())i.setAttribute(t,e.getAttribute(t))}return i}}function $l(t,e){let i=t;for(;i;)e(i),i=i.parentElement}function Wl(t,e){const i=t.parentNode;return!!i&&!!i.tagName&&e.includes(i.tagName.toLowerCase())}function ql(t){"script"===t&&y("domconverter-unsafe-script-element-detected"),"style"===t&&y("domconverter-unsafe-style-element-detected")}class Ul extends(ps()){constructor(t){super(),this.view=t,this.document=t.document,this.isEnabled=!1}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}destroy(){this.disable(),this.stopListening()}checkShouldIgnoreEventFromTarget(t){return t&&3===t.nodeType&&(t=t.parentNode),!(!t||1!==t.nodeType)&&t.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}const Kl=Ca((function(t,e){ze(e,Pi(e),t)}));class Gl{constructor(t,e,i){this.view=t,this.document=t.document,this.domEvent=e,this.domTarget=e.target,Kl(this,i)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}class Jl extends Ul{constructor(t){super(t),this.useCapture=!1}observe(t){("string"==typeof this.domEventType?[this.domEventType]:this.domEventType).forEach((e=>{this.listenTo(t,e,((t,e)=>{this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(e.target)&&this.onDomEvent(e)}),{useCapture:this.useCapture})}))}fire(t,e,i){this.isEnabled&&this.document.fire(t,new Gl(this.view,e,i))}}class Ql extends Jl{constructor(t){super(t),this.domEventType=["keydown","keyup"]}onDomEvent(t){const e={keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,get keystroke(){return to(this)}};this.fire(t.type,t,e)}}const Yl=function(){return nt.Date.now()};var Zl=/\s/;const Xl=function(t){for(var e=t.length;e--&&Zl.test(t.charAt(e)););return e};var tc=/^\s+/;const ec=function(t){return t?t.slice(0,Xl(t)+1).replace(tc,""):t};var ic=NaN,nc=/^[-+]0x[0-9a-f]+$/i,sc=/^0b[01]+$/i,oc=/^0o[0-7]+$/i,rc=parseInt;const ac=function(t){if("number"==typeof t)return t;if(Or(t))return ic;if(F(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=F(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=ec(t);var i=sc.test(t);return i||oc.test(t)?rc(t.slice(2),i?2:8):nc.test(t)?ic:+t};var lc="Expected a function",cc=Math.max,hc=Math.min;const dc=function(t,e,i){var n,s,o,r,a,l,c=0,h=!1,d=!1,u=!0;if("function"!=typeof t)throw new TypeError(lc);function f(e){var i=n,o=s;return n=s=void 0,c=e,r=t.apply(o,i)}function m(t){var i=t-l;return void 0===l||i>=e||i<0||d&&t-c>=o}function g(){var t=Yl();if(m(t))return p(t);a=setTimeout(g,function(t){var i=e-(t-l);return d?hc(i,o-(t-c)):i}(t))}function p(t){return a=void 0,u&&n?f(t):(n=s=void 0,r)}function w(){var t=Yl(),i=m(t);if(n=arguments,s=this,l=t,i){if(void 0===a)return function(t){return c=t,a=setTimeout(g,e),h?f(t):r}(l);if(d)return clearTimeout(a),a=setTimeout(g,e),f(l)}return void 0===a&&(a=setTimeout(g,e)),r}return e=ac(e)||0,F(i)&&(h=!!i.leading,o=(d="maxWait"in i)?cc(ac(i.maxWait)||0,e):o,u="trailing"in i?!!i.trailing:u),w.cancel=function(){void 0!==a&&clearTimeout(a),c=0,n=l=s=a=void 0},w.flush=function(){return void 0===a?r:p(Yl())},w};class uc extends Ul{constructor(t){super(t),this._fireSelectionChangeDoneDebounced=dc((t=>{this.document.fire("selectionChangeDone",t)}),200)}observe(){const t=this.document;t.on("arrowKey",((e,i)=>{t.selection.isFake&&this.isEnabled&&i.preventDefault()}),{context:"$capture"}),t.on("arrowKey",((e,i)=>{t.selection.isFake&&this.isEnabled&&this._handleSelectionMove(i.keyCode)}),{priority:"lowest"})}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection,i=new Wa(e.getRanges(),{backward:e.isBackward,fake:!1});t!=Zs.arrowleft&&t!=Zs.arrowup||i.setTo(i.getFirstPosition()),t!=Zs.arrowright&&t!=Zs.arrowdown||i.setTo(i.getLastPosition());const n={oldSelection:e,newSelection:i,domSelection:null};this.document.fire("selectionChange",n),this._fireSelectionChangeDoneDebounced(n)}}var fc="__lodash_hash_undefined__";const mc=function(t){return this.__data__.set(t,fc),this};const gc=function(t){return this.__data__.has(t)};function pc(t){var e=-1,i=null==t?0:t.length;for(this.__data__=new Re;++ea))return!1;var c=o.get(t),h=o.get(e);if(c&&h)return c==e&&h==t;var d=-1,u=!0,f=i&yc?new wc:void 0;for(o.set(t,e),o.set(e,t);++d{this._isFocusChanging=!0,this._renderTimeoutId=setTimeout((()=>{this.flush(),t.change((()=>{}))}),50)})),e.on("blur",((i,n)=>{const s=e.selection.editableElement;null!==s&&s!==n.target||(e.isFocused=!1,this._isFocusChanging=!1,t.change((()=>{})))}))}flush(){this._isFocusChanging&&(this._isFocusChanging=!1,this.document.isFocused=!0)}onDomEvent(t){this.fire(t.type,t)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class eh extends Ul{constructor(t){super(t),this.mutationObserver=t.getObserver(Zc),this.focusObserver=t.getObserver(th),this.selection=this.document.selection,this.domConverter=t.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=dc((t=>{this.document.fire("selectionChangeDone",t)}),200),this._clearInfiniteLoopInterval=setInterval((()=>this._clearInfiniteLoop()),1e3),this._documentIsSelectingInactivityTimeoutDebounced=dc((()=>this.document.isSelecting=!1),5e3),this._loopbackCounter=0}observe(t){const e=t.ownerDocument,i=()=>{this.document.isSelecting&&(this._handleSelectionChange(null,e),this.document.isSelecting=!1,this._documentIsSelectingInactivityTimeoutDebounced.cancel())};this.listenTo(t,"selectstart",(()=>{this.document.isSelecting=!0,this._documentIsSelectingInactivityTimeoutDebounced()}),{priority:"highest"}),this.listenTo(t,"keydown",i,{priority:"highest",useCapture:!0}),this.listenTo(t,"keyup",i,{priority:"highest",useCapture:!0}),this._documents.has(e)||(this.listenTo(e,"mouseup",i,{priority:"highest",useCapture:!0}),this.listenTo(e,"selectionchange",((t,i)=>{this.document.isComposing&&!r.isAndroid||(this._handleSelectionChange(i,e),this._documentIsSelectingInactivityTimeoutDebounced())})),this._documents.add(e))}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel(),this._documentIsSelectingInactivityTimeoutDebounced.cancel()}_handleSelectionChange(t,e){if(!this.isEnabled)return;const i=e.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(i.anchorNode))return;this.mutationObserver.flush();const n=this.domConverter.domSelectionToView(i);if(0!=n.rangeCount){if(this.view.hasDomSelection=!0,!(this.selection.isEqual(n)&&this.domConverter.isDomSelectionCorrect(i)||++this._loopbackCounter>60))if(this.focusObserver.flush(),this.selection.isSimilar(n))this.view.forceRender();else{const t={oldSelection:this.selection,newSelection:n,domSelection:i};this.document.fire("selectionChange",t),this._fireSelectionChangeDoneDebounced(t)}}else this.view.hasDomSelection=!1}_clearInfiniteLoop(){this._loopbackCounter=0}}class ih extends Jl{constructor(t){super(t),this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",(()=>{e.isComposing=!0}),{priority:"low"}),e.on("compositionend",(()=>{e.isComposing=!1}),{priority:"low"})}onDomEvent(t){this.fire(t.type,t,{data:t.data})}}class nh{constructor(t){this.files=function(t){const e=Array.from(t.files||[]),i=Array.from(t.items||[]);if(e.length)return e;return i.filter((t=>"file"===t.kind)).map((t=>t.getAsFile()))}(t),this._native=t}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}set effectAllowed(t){this._native.effectAllowed=t}get effectAllowed(){return this._native.effectAllowed}set dropEffect(t){this._native.dropEffect=t}get dropEffect(){return this._native.dropEffect}get isCanceled(){return"none"==this._native.dropEffect||!!this._native.mozUserCancelled}}class sh extends Jl{constructor(t){super(t),this.domEventType=["beforeinput"]}onDomEvent(t){const e=t.getTargetRanges(),i=this.view,n=i.document;let s=null,o=null,a=[];if(t.dataTransfer&&(s=new nh(t.dataTransfer)),null!==t.data?o=t.data:s&&(o=s.getData("text/plain")),n.selection.isFake)a=Array.from(n.selection.getRanges());else if(e.length)a=e.map((t=>i.domConverter.domRangeToView(t)));else if(r.isAndroid){const e=t.target.ownerDocument.defaultView.getSelection();a=Array.from(i.domConverter.domSelectionToView(e).getRanges())}if(r.isAndroid&&"insertCompositionText"==t.inputType&&o&&o.endsWith("\n"))this.fire(t.type,t,{inputType:"insertParagraph",targetRanges:[i.createRange(a[0].end)]});else if("insertText"==t.inputType&&o&&o.includes("\n")){const e=o.split(/\n{1,2}/g);let i=a;for(let o=0;o{if(this.isEnabled&&((i=e.keyCode)==Zs.arrowright||i==Zs.arrowleft||i==Zs.arrowup||i==Zs.arrowdown)){const i=new Ua(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(i,e),i.stop.called&&t.stop()}var i}))}observe(){}}class rh extends Ul{constructor(t){super(t);const e=this.document;e.on("keydown",((t,i)=>{if(!this.isEnabled||i.keyCode!=Zs.tab||i.ctrlKey)return;const n=new Ua(e,"tab",e.selection.getFirstRange());e.fire(n,i),n.stop.called&&t.stop()}))}observe(){}}class ah extends(q()){constructor(t){super(),this.document=new Xa(t),this.domConverter=new jl(this.document),this.domRoots=new Map,this.set("isRenderingInProgress",!1),this.set("hasDomSelection",!1),this._renderer=new Ol(this.domConverter,this.document.selection),this._renderer.bind("isFocused","isSelecting","isComposing").to(this.document,"isFocused","isSelecting","isComposing"),this._initialDomRootAttributes=new WeakMap,this._observers=new Map,this._ongoingChange=!1,this._postFixersInProgress=!1,this._renderingDisabled=!1,this._hasChangedSinceTheLastRendering=!1,this._writer=new dl(this.document),this.addObserver(Zc),this.addObserver(th),this.addObserver(eh),this.addObserver(Ql),this.addObserver(uc),this.addObserver(ih),this.addObserver(oh),this.addObserver(sh),this.addObserver(rh),this.document.on("arrowKey",Rl,{priority:"low"}),rl(this),this.on("render",(()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1})),this.listenTo(this.document.selection,"change",(()=>{this._hasChangedSinceTheLastRendering=!0})),this.listenTo(this.document,"change:isFocused",(()=>{this._hasChangedSinceTheLastRendering=!0}))}attachDomRoot(t,e="main"){const i=this.document.getRoot(e);i._name=t.tagName.toLowerCase();const n={};for(const{name:e,value:s}of Array.from(t.attributes))n[e]=s,"class"===e?this._writer.addClass(s.split(" "),i):this._writer.setAttribute(e,s,i);this._initialDomRootAttributes.set(t,n);const s=()=>{this._writer.setAttribute("contenteditable",(!i.isReadOnly).toString(),i),i.isReadOnly?this._writer.addClass("ck-read-only",i):this._writer.removeClass("ck-read-only",i)};s(),this.domRoots.set(e,t),this.domConverter.bindElements(t,i),this._renderer.markToSync("children",i),this._renderer.markToSync("attributes",i),this._renderer.domDocuments.add(t.ownerDocument),i.on("change:children",((t,e)=>this._renderer.markToSync("children",e))),i.on("change:attributes",((t,e)=>this._renderer.markToSync("attributes",e))),i.on("change:text",((t,e)=>this._renderer.markToSync("text",e))),i.on("change:isReadOnly",(()=>this.change(s))),i.on("change",(()=>{this._hasChangedSinceTheLastRendering=!0}));for(const i of this._observers.values())i.observe(t,e)}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach((({name:t})=>e.removeAttribute(t)));const i=this._initialDomRootAttributes.get(e);for(const t in i)e.setAttribute(t,i[t]);this.domRoots.delete(t),this.domConverter.unbindDomElement(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e)return e;e=new t(this),this._observers.set(t,e);for(const[t,i]of this.domRoots)e.observe(i,t);return e.enable(),e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values())t.disable()}enableObservers(){for(const t of this._observers.values())t.enable()}scrollToTheSelection(){const t=this.document.selection.getFirstRange();t&&function({target:t,viewportOffset:e=0}){const i=Ks(t);let n=i,s=null;for(;n;){let o;o=Gs(n==i?t:s),js(o,(()=>Js(t,n)));const r=Js(t,n);if(Hs(n,r,e),n.parent!=n){if(s=n.frameElement,n=n.parent,!s)return}else n=null}}({target:this.domConverter.viewRangeToDom(t),viewportOffset:20})}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;t&&(this.domConverter.focus(t),this.forceRender())}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress)throw new v("cannot-change-view-tree",this);try{if(this._ongoingChange)return t(this._writer);this._ongoingChange=!0;const e=t(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),e}catch(t){v.rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.getObserver(th).flush(),this.change((()=>{}))}destroy(){for(const t of this._observers.values())t.destroy();this.document.destroy(),this.stopListening()}createPositionAt(t,e){return Ha._createAt(t,e)}createPositionAfter(t){return Ha._createAfter(t)}createPositionBefore(t){return Ha._createBefore(t)}createRange(...t){return new ja(...t)}createRangeOn(t){return ja._createOn(t)}createRangeIn(t){return ja._createIn(t)}createSelection(...t){return new Wa(...t)}_disableRendering(t){this._renderingDisabled=t,0==t&&this.change((()=>{}))}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}class lh{is(){throw new Error("is() method is abstract")}}class ch extends lh{constructor(t){super(),this.parent=null,this._attrs=mo(t)}get document(){return null}get index(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildIndex(this)))throw new v("model-node-not-found-in-parent",this);return t}get startOffset(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildStartOffset(this)))throw new v("model-node-not-found-in-parent",this);return t}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.startOffset),e=e.parent;return t}getAncestors(t={}){const e=[];let i=t.includeSelf?this:this.parent;for(;i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}getCommonAncestor(t,e={}){const i=this.getAncestors(e),n=t.getAncestors(e);let s=0;for(;i[s]==n[s]&&i[s];)s++;return 0===s?null:i[s-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),i=t.getPath(),n=X(e,i);switch(n){case"prefix":return!0;case"extension":return!1;default:return e[n](t[e[0]]=e[1],t)),{})),t}_clone(t){return new this.constructor(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=mo(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}ch.prototype.is=function(t){return"node"===t||"model:node"===t};class hh{constructor(t){this._nodes=[],t&&this._insertNodes(0,t)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce(((t,e)=>t+e.offsetSize),0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return-1==e?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return null===e?null:this._nodes.slice(0,e).reduce(((t,e)=>t+e.offsetSize),0)}indexToOffset(t){if(t==this._nodes.length)return this.maxOffset;const e=this._nodes[t];if(!e)throw new v("model-nodelist-index-out-of-bounds",this);return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const i of this._nodes){if(t>=e&&tgo)return t.slice(0,i).concat(e).concat(t.slice(i+n,t.length));{const s=Array.from(t);return s.splice(i,n,...e),s}}(this._nodes,Array.from(e),t,0)}_removeNodes(t,e=1){return this._nodes.splice(t,e)}toJSON(){return this._nodes.map((t=>t.toJSON()))}}class dh extends ch{constructor(t,e){super(e),this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}toJSON(){const t=super.toJSON();return t.data=this.data,t}_clone(){return new dh(this.data,this.getAttributes())}static fromJSON(t){return new dh(t.data,t.attributes)}}dh.prototype.is=function(t){return"$text"===t||"model:$text"===t||"text"===t||"model:text"===t||"node"===t||"model:node"===t};class uh extends lh{constructor(t,e,i){if(super(),this.textNode=t,e<0||e>t.offsetSize)throw new v("model-textproxy-wrong-offsetintext",this);if(i<0||e+i>t.offsetSize)throw new v("model-textproxy-wrong-length",this);this.data=t.data.substring(e,e+i),this.offsetInText=e}get startOffset(){return null!==this.textNode.startOffset?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return null!==this.startOffset?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}getPath(){const t=this.textNode.getPath();return t.length>0&&(t[t.length-1]+=this.offsetInText),t}getAncestors(t={}){const e=[];let i=t.includeSelf?this:this.parent;for(;i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}uh.prototype.is=function(t){return"$textProxy"===t||"model:$textProxy"===t||"textProxy"===t||"model:textProxy"===t};class fh extends ch{constructor(t,e,i){super(e),this._children=new hh,this.name=t,i&&this._insertChild(0,i)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const i of t)e=e.getChild(e.offsetToIndex(i));return e}findAncestor(t,e={}){let i=e.includeSelf?this:this.parent;for(;i;){if(i.name===t)return i;i=i.parent}return null}toJSON(){const t=super.toJSON();if(t.name=this.name,this._children.length>0){t.children=[];for(const e of this._children)t.children.push(e.toJSON())}return t}_clone(t=!1){const e=t?Array.from(this._children).map((t=>t._clone(!0))):void 0;return new fh(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const i=function(t){if("string"==typeof t)return[new dh(t)];tt(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new dh(t):t instanceof uh?new dh(t.data,t.getAttributes()):t))}(e);for(const t of i)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,i)}_removeChildren(t,e=1){const i=this._children._removeNodes(t,e);for(const t of i)t.parent=null;return i}static fromJSON(t){let e;if(t.children){e=[];for(const i of t.children)i.name?e.push(fh.fromJSON(i)):e.push(dh.fromJSON(i))}return new fh(t.name,t.attributes,e)}}fh.prototype.is=function(t,e){return e?e===this.name&&("element"===t||"model:element"===t):"element"===t||"model:element"===t||"node"===t||"model:node"===t};class mh{constructor(t){if(!t||!t.boundaries&&!t.startPosition)throw new v("model-tree-walker-no-start-position",null);const e=t.direction||"forward";if("forward"!=e&&"backward"!=e)throw new v("model-tree-walker-unknown-direction",t,{direction:e});this.direction=e,this.boundaries=t.boundaries||null,t.startPosition?this.position=t.startPosition.clone():this.position=ph._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null,this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(t){let e,i,n,s;do{n=this.position,s=this._visitedParent,({done:e,value:i}=this.next())}while(!e&&t(i));e||(this.position=n,this._visitedParent=s)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const t=this.position,e=this.position.clone(),i=this._visitedParent;if(null===i.parent&&e.offset===i.maxOffset)return{done:!0,value:void 0};if(i===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0,value:void 0};const n=wh(e,i),s=n||bh(e,i,n);if(s instanceof fh)return this.shallow?e.offset++:(e.path.push(0),this._visitedParent=s),this.position=e,gh("elementStart",s,t,e,1);if(s instanceof dh){let n;if(this.singleCharacters)n=1;else{let t=s.endOffset;this._boundaryEndParent==i&&this.boundaries.end.offsett&&(t=this.boundaries.start.offset),n=e.offset-t}const s=e.offset-o.startOffset,r=new uh(o,s-n,n);return e.offset-=n,this.position=e,gh("text",r,t,e,n)}return e.path.pop(),this.position=e,this._visitedParent=i.parent,gh("elementStart",i,t,e,1)}}function gh(t,e,i,n,s){return{done:!1,value:{type:t,item:e,previousPosition:i,nextPosition:n,length:s}}}class ph extends lh{constructor(t,e,i="toNone"){if(super(),!t.is("element")&&!t.is("documentFragment"))throw new v("model-position-root-invalid",t);if(!(e instanceof Array)||0===e.length)throw new v("model-position-path-incorrect-format",t,{path:e});t.is("rootElement")?e=e.slice():(e=[...t.getPath(),...e],t=t.root),this.root=t,this.path=e,this.stickiness=i}get offset(){return this.path[this.path.length-1]}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;e1)return!1;if(1===e)return vh(t,this,i);if(-1===e)return vh(this,t,i)}return this.path.length===t.path.length||(this.path.length>t.path.length?yh(this.path,e):yh(t.path,e))}hasSameParentAs(t){if(this.root!==t.root)return!1;return"same"==X(this.getParentPath(),t.getParentPath())}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=ph._createAt(this)}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;return e.containsPosition(this)||e.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(t.splitPosition,t.moveTargetPosition):t.graveyardPosition?this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1):this._getTransformedByInsertion(t.insertionPosition,1)}_getTransformedByMergeOperation(t){const e=t.movedRange;let i;return e.containsPosition(this)||e.start.isEqual(this)?(i=this._getCombined(t.sourcePosition,t.targetPosition),t.sourcePosition.isBefore(t.targetPosition)&&(i=i._getTransformedByDeletion(t.deletionPosition,1))):i=this.isEqual(t.deletionPosition)?ph._createAt(t.deletionPosition):this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1),i}_getTransformedByDeletion(t,e){const i=ph._createAt(this);if(this.root!=t.root)return i;if("same"==X(t.getParentPath(),this.getParentPath())){if(t.offsetthis.offset)return null;i.offset-=e}}else if("prefix"==X(t.getParentPath(),this.getParentPath())){const n=t.path.length-1;if(t.offset<=this.path[n]){if(t.offset+e>this.path[n])return null;i.path[n]-=e}}return i}_getTransformedByInsertion(t,e){const i=ph._createAt(this);if(this.root!=t.root)return i;if("same"==X(t.getParentPath(),this.getParentPath()))(t.offset=e;){if(t.path[n]+s!==i.maxOffset)return!1;s=1,n--,i=i.parent}return!0}(t,i+1))}function yh(t,e){for(;ee+1;){const e=n.maxOffset-i.offset;0!==e&&t.push(new kh(i,i.getShiftedBy(e))),i.path=i.path.slice(0,-1),i.offset++,n=n.parent}for(;i.path.length<=this.end.path.length;){const e=this.end.path[i.path.length-1],n=e-i.offset;0!==n&&t.push(new kh(i,i.getShiftedBy(n))),i.offset=e,i.path.push(0)}return t}getWalker(t={}){return t.boundaries=this,new mh(t)}*getItems(t={}){t.boundaries=this,t.ignoreElementEnd=!0;const e=new mh(t);for(const t of e)yield t.item}*getPositions(t={}){t.boundaries=this;const e=new mh(t);yield e.position;for(const t of e)yield t.nextPosition}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new kh(this.start,this.end)]}getTransformedByOperations(t){const e=[new kh(this.start,this.end)];for(const i of t)for(let t=0;t0?new this(i,n):new this(n,i)}static _createIn(t){return new this(ph._createAt(t,0),ph._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(ph._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(0===t.length)throw new v("range-create-from-ranges-empty-array",null);if(1==t.length)return t[0].clone();const e=t[0];t.sort(((t,e)=>t.start.isAfter(e.start)?1:-1));const i=t.indexOf(e),n=new this(e.start,e.end);if(i>0)for(let e=i-1;t[e].end.isEqual(n.start);e++)n.start=ph._createAt(t[e].start);for(let e=i+1;e{if(e.viewPosition)return;const i=this._modelToViewMapping.get(e.modelPosition.parent);if(!i)throw new v("mapping-model-position-view-parent-not-found",this,{modelPosition:e.modelPosition});e.viewPosition=this.findPositionIn(i,e.modelPosition.offset)}),{priority:"low"}),this.on("viewToModelPosition",((t,e)=>{if(e.modelPosition)return;const i=this.findMappedViewAncestor(e.viewPosition),n=this._viewToModelMapping.get(i),s=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,i);e.modelPosition=ph._createAt(n,s)}),{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e),this._viewToModelMapping.set(e,t)}unbindViewElement(t,e={}){const i=this.toModelElement(t);if(this._elementToMarkerNames.has(t))for(const e of this._elementToMarkerNames.get(t))this._unboundMarkerNames.add(e);e.defer?this._deferredBindingRemovals.set(t,t.root):(this._viewToModelMapping.delete(t),this._modelToViewMapping.get(i)==t&&this._modelToViewMapping.delete(i))}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t),this._viewToModelMapping.get(e)==t&&this._viewToModelMapping.delete(e)}bindElementToMarker(t,e){const i=this._markerNameToElements.get(e)||new Set;i.add(t);const n=this._elementToMarkerNames.get(t)||new Set;n.add(e),this._markerNameToElements.set(e,i),this._elementToMarkerNames.set(t,n)}unbindElementFromMarkerName(t,e){const i=this._markerNameToElements.get(e);i&&(i.delete(t),0==i.size&&this._markerNameToElements.delete(e));const n=this._elementToMarkerNames.get(t);n&&(n.delete(e),0==n.size&&this._elementToMarkerNames.delete(t))}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),t}flushDeferredBindings(){for(const[t,e]of this._deferredBindingRemovals)t.root==e&&this.unbindViewElement(t);this._deferredBindingRemovals=new Map}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set,this._deferredBindingRemovals=new Map}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new kh(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new ja(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};return this.fire("viewToModelPosition",e),e.modelPosition}toViewPosition(t,e={}){const i={modelPosition:t,mapper:this,isPhantom:e.isPhantom};return this.fire("modelToViewPosition",i),i.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e)return null;const i=new Set;for(const t of e)if(t.is("attributeElement"))for(const e of t.getElementsWithSameId())i.add(e);else i.add(t);return i}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;for(;!this._viewToModelMapping.has(e);)e=e.parent;return e}_toModelOffset(t,e,i){if(i!=t){return this._toModelOffset(t.parent,t.index,i)+this._toModelOffset(t,e,t)}if(t.is("$text"))return e;let n=0;for(let i=0;i1?e[0]+":"+e[1]:e[0]}class Ph extends(R()){constructor(t){super(),this._conversionApi={dispatcher:this,...t},this._firedEventsMap=new WeakMap}convertChanges(t,e,i){const n=this._createConversionApi(i,t.getRefreshedItems());for(const e of t.getMarkersToRemove())this._convertMarkerRemove(e.name,e.range,n);const s=this._reduceChanges(t.getChanges());for(const t of s)"insert"===t.type?this._convertInsert(kh._createFromPositionAndShift(t.position,t.length),n):"reinsert"===t.type?this._convertReinsert(kh._createFromPositionAndShift(t.position,t.length),n):"remove"===t.type?this._convertRemove(t.position,t.length,t.name,n):this._convertAttribute(t.range,t.attributeKey,t.attributeOldValue,t.attributeNewValue,n);for(const t of n.mapper.flushUnboundMarkerNames()){const i=e.get(t).getRange();this._convertMarkerRemove(t,i,n),this._convertMarkerAdd(t,i,n)}for(const e of t.getMarkersToAdd())this._convertMarkerAdd(e.name,e.range,n);n.mapper.flushDeferredBindings(),n.consumable.verifyAllConsumed("insert")}convert(t,e,i,n={}){const s=this._createConversionApi(i,void 0,n);this._convertInsert(t,s);for(const[t,i]of e)this._convertMarkerAdd(t,i,s);s.consumable.verifyAllConsumed("insert")}convertSelection(t,e,i){const n=Array.from(e.getMarkersAtPosition(t.getFirstPosition())),s=this._createConversionApi(i);if(this._addConsumablesForSelection(s.consumable,t,n),this.fire("selection",{selection:t},s),t.isCollapsed){for(const e of n){const i=e.getRange();if(!Th(t.getFirstPosition(),e,s.mapper))continue;const n={item:t,markerName:e.name,markerRange:i};s.consumable.test(t,"addMarker:"+e.name)&&this.fire(`addMarker:${e.name}`,n,s)}for(const e of t.getAttributeKeys()){const i={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};s.consumable.test(t,"attribute:"+i.attributeKey)&&this.fire(`attribute:${i.attributeKey}:$text`,i,s)}}}_convertInsert(t,e,i={}){i.doNotAddConsumables||this._addConsumablesForInsert(e.consumable,Array.from(t));for(const i of Array.from(t.getWalker({shallow:!0})).map(Eh))this._testAndFire("insert",i,e)}_convertRemove(t,e,i,n){this.fire(`remove:${i}`,{position:t,length:e},n)}_convertAttribute(t,e,i,n,s){this._addConsumablesForRange(s.consumable,t,`attribute:${e}`);for(const o of t){const t={item:o.item,range:kh._createFromPositionAndShift(o.previousPosition,o.length),attributeKey:e,attributeOldValue:i,attributeNewValue:n};this._testAndFire(`attribute:${e}`,t,s)}}_convertReinsert(t,e){const i=Array.from(t.getWalker({shallow:!0}));this._addConsumablesForInsert(e.consumable,i);for(const t of i.map(Eh))this._testAndFire("insert",{...t,reconversion:!0},e)}_convertMarkerAdd(t,e,i){if("$graveyard"==e.root.rootName)return;const n=`addMarker:${t}`;if(i.consumable.add(e,n),this.fire(n,{markerName:t,markerRange:e},i),i.consumable.consume(e,n)){this._addConsumablesForRange(i.consumable,e,n);for(const s of e.getItems()){if(!i.consumable.test(s,n))continue;const o={item:s,range:kh._createOn(s),markerName:t,markerRange:e};this.fire(n,o,i)}}}_convertMarkerRemove(t,e,i){"$graveyard"!=e.root.rootName&&this.fire(`removeMarker:${t}`,{markerName:t,markerRange:e},i)}_reduceChanges(t){const e={changes:t};return this.fire("reduceChanges",e),e.changes}_addConsumablesForInsert(t,e){for(const i of e){const e=i.item;if(null===t.test(e,"insert")){t.add(e,"insert");for(const i of e.getAttributeKeys())t.add(e,"attribute:"+i)}}return t}_addConsumablesForRange(t,e,i){for(const n of e.getItems())t.add(n,i);return t}_addConsumablesForSelection(t,e,i){t.add(e,"selection");for(const n of i)t.add(e,"addMarker:"+n.name);for(const i of e.getAttributeKeys())t.add(e,"attribute:"+i);return t}_testAndFire(t,e,i){const n=function(t,e){const i=e.item.is("element")?e.item.name:"$text";return`${t}:${i}`}(t,e),s=e.item.is("$textProxy")?i.consumable._getSymbolForTextProxy(e.item):e.item,o=this._firedEventsMap.get(i),r=o.get(s);if(r){if(r.has(n))return;r.add(n)}else o.set(s,new Set([n]));this.fire(n,e,i)}_testAndFireAddAttributes(t,e){const i={item:t,range:kh._createOn(t)};for(const t of i.item.getAttributeKeys())i.attributeKey=t,i.attributeOldValue=null,i.attributeNewValue=i.item.getAttribute(t),this._testAndFire(`attribute:${t}`,i,e)}_createConversionApi(t,e=new Set,i={}){const n={...this._conversionApi,consumable:new xh,writer:t,options:i,convertItem:t=>this._convertInsert(kh._createOn(t),n),convertChildren:t=>this._convertInsert(kh._createIn(t),n,{doNotAddConsumables:!0}),convertAttributes:t=>this._testAndFireAddAttributes(t,n),canReuseView:t=>!e.has(n.mapper.toModelElement(t))};return this._firedEventsMap.set(n,new Map),n}}function Th(t,e,i){const n=e.getRange(),s=Array.from(t.getAncestors());s.shift(),s.reverse();return!s.some((t=>{if(n.containsItem(t)){return!!i.toViewElement(t).getCustomProperty("addHighlight")}}))}function Eh(t){return{item:t.item,range:kh._createFromPositionAndShift(t.previousPosition,t.length)}}class Sh extends(R(lh)){constructor(...t){super(),this._lastRangeBackward=!1,this._attrs=new Map,this._ranges=[],t.length&&this.setTo(...t)}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){return 1===this._ranges.length&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let i=!1;for(const n of t._ranges)if(e.isEqual(n)){i=!0;break}if(!i)return!1}return!0}*getRanges(){for(const t of this._ranges)yield new kh(t.start,t.end)}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?new kh(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?new kh(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(...t){let[e,i,n]=t;if("object"==typeof i&&(n=i,i=void 0),null===e)this._setRanges([]);else if(e instanceof Sh)this._setRanges(e.getRanges(),e.isBackward);else if(e&&"function"==typeof e.getRanges)this._setRanges(e.getRanges(),e.isBackward);else if(e instanceof kh)this._setRanges([e],!!n&&!!n.backward);else if(e instanceof ph)this._setRanges([new kh(e)]);else if(e instanceof ch){const t=!!n&&!!n.backward;let s;if("in"==i)s=kh._createIn(e);else if("on"==i)s=kh._createOn(e);else{if(void 0===i)throw new v("model-selection-setto-required-second-parameter",[this,e]);s=new kh(ph._createAt(e,i))}this._setRanges([s],t)}else{if(!tt(e))throw new v("model-selection-setto-not-selectable",[this,e]);this._setRanges(e,n&&!!n.backward)}}_setRanges(t,e=!1){const i=Array.from(t),n=i.some((e=>{if(!(e instanceof kh))throw new v("model-selection-set-ranges-not-range",[this,t]);return this._ranges.every((t=>!t.isEqual(e)))}));(i.length!==this._ranges.length||n)&&(this._replaceAllRanges(i),this._lastRangeBackward=!!e,this.fire("change:range",{directChange:!0}))}setFocus(t,e){if(null===this.anchor)throw new v("model-selection-setfocus-no-ranges",[this,t]);const i=ph._createAt(t,e);if("same"==i.compareWith(this.focus))return;const n=this.anchor;this._ranges.length&&this._popRange(),"before"==i.compareWith(n)?(this._pushRange(new kh(i,n)),this._lastRangeBackward=!0):(this._pushRange(new kh(n,i)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){this.hasAttribute(t)&&(this._attrs.delete(t),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}setAttribute(t,e){this.getAttribute(t)!==e&&(this._attrs.set(t,e),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const i=Ih(e.start,t);i&&Vh(i,e)&&(yield i);for(const i of e.getWalker()){const n=i.item;"elementEnd"==i.type&&Oh(n,t,e)&&(yield n)}const n=Ih(e.end,t);n&&!e.end.isTouching(ph._createAt(n,0))&&Vh(n,e)&&(yield n)}}containsEntireContent(t=this.anchor.root){const e=ph._createAt(t,0),i=ph._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&i.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t),this._ranges.push(new kh(t.start,t.end))}_checkRange(t){for(let e=0;e0;)this._popRange()}_popRange(){this._ranges.pop()}}function Rh(t,e){return!e.has(t)&&(e.add(t),t.root.document.model.schema.isBlock(t)&&!!t.parent)}function Oh(t,e,i){return Rh(t,e)&&Vh(t,i)}function Ih(t,e){const i=t.parent.root.document.model.schema,n=t.parent.getAncestors({parentFirst:!0,includeSelf:!0});let s=!1;const o=n.find((t=>!s&&(s=i.isLimit(t),!s&&Rh(t,e))));return n.forEach((t=>e.add(t))),o}function Vh(t,e){const i=function(t){const e=t.root.document.model.schema;let i=t.parent;for(;i;){if(e.isBlock(i))return i;i=i.parent}}(t);if(!i)return!0;return!e.containsRange(kh._createOn(i),!0)}Sh.prototype.is=function(t){return"selection"===t||"model:selection"===t};class Mh extends(R(kh)){constructor(t,e){super(t,e),Nh.call(this)}detach(){this.stopListening()}toRange(){return new kh(this.start,this.end)}static fromRange(t){return new Mh(t.start,t.end)}}function Nh(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const i=e[0];i.isDocumentOperation&&Bh.call(this,i)}),{priority:"low"})}function Bh(t){const e=this.getTransformedByOperation(t),i=kh._createFromRanges(e),n=!i.isEqual(this),s=function(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return!1}(this,t);let o=null;if(n){"$graveyard"==i.root.rootName&&(o="remove"==t.type?t.sourcePosition:t.deletionPosition);const e=this.toRange();this.start=i.start,this.end=i.end,this.fire("change:range",e,{deletionPosition:o})}else s&&this.fire("change:content",this.toRange(),{deletionPosition:o})}Mh.prototype.is=function(t){return"liveRange"===t||"model:liveRange"===t||"range"==t||"model:range"===t};const Dh="selection:";class Fh extends(R(lh)){constructor(t){super(),this._selection=new Lh(t),this._selection.delegate("change:range").to(this),this._selection.delegate("change:attribute").to(this),this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection.updateMarkers(),this._selection._updateAttributes(!1)}observeMarkers(t){this._selection.observeMarkers(t)}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(...t){this._selection.setTo(...t)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection.getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return Dh+t}static _isStoreAttributeKey(t){return t.startsWith(Dh)}}Fh.prototype.is=function(t){return"selection"===t||"model:selection"==t||"documentSelection"==t||"model:documentSelection"==t};class Lh extends Sh{constructor(t){super(),this.markers=new co({idProperty:"name"}),this._attributePriority=new Map,this._selectionRestorePosition=null,this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this._observedMarkers=new Set,this._model=t.model,this._document=t,this.listenTo(this._model,"applyOperation",((t,e)=>{const i=e[0];i.isDocumentOperation&&"marker"!=i.type&&"rename"!=i.type&&"noop"!=i.type&&(0==this._ranges.length&&this._selectionRestorePosition&&this._fixGraveyardSelection(this._selectionRestorePosition),this._selectionRestorePosition=null,this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1})))}),{priority:"lowest"}),this.on("change:range",(()=>{this._validateSelectionRanges(this.getRanges())})),this.listenTo(this._model.markers,"update",((t,e,i,n)=>{this._updateMarker(e,n)})),this.listenTo(this._document,"change",((t,e)=>{!function(t,e){const i=t.document.differ;for(const n of i.getChanges()){if("insert"!=n.type)continue;const i=n.position.parent;n.length===i.maxOffset&&t.enqueueChange(e,(t=>{const e=Array.from(i.getAttributeKeys()).filter((t=>t.startsWith(Dh)));for(const n of e)t.removeAttribute(n,i)}))}}(this._model,e)}))}get isCollapsed(){return 0===this._ranges.length?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t{if(this._hasChangedRange=!0,e.root==this._document.graveyard){this._selectionRestorePosition=n.deletionPosition;const t=this._ranges.indexOf(e);this._ranges.splice(t,1),e.detach()}})),e}updateMarkers(){if(!this._observedMarkers.size)return;const t=[];let e=!1;for(const e of this._model.markers){const i=e.name.split(":",1)[0];if(!this._observedMarkers.has(i))continue;const n=e.getRange();for(const i of this.getRanges())n.containsRange(i,!i.isCollapsed)&&t.push(e)}const i=Array.from(this.markers);for(const i of t)this.markers.has(i)||(this.markers.add(i),e=!0);for(const i of Array.from(this.markers))t.includes(i)||(this.markers.remove(i),e=!0);e&&this.fire("change:marker",{oldMarkers:i,directChange:!1})}_updateMarker(t,e){const i=t.name.split(":",1)[0];if(!this._observedMarkers.has(i))return;let n=!1;const s=Array.from(this.markers),o=this.markers.has(t);if(e){let i=!1;for(const t of this.getRanges())if(e.containsRange(t,!t.isCollapsed)){i=!0;break}i&&!o?(this.markers.add(t),n=!0):!i&&o&&(this.markers.remove(t),n=!0)}else o&&(this.markers.remove(t),n=!0);n&&this.fire("change:marker",{oldMarkers:s,directChange:!1})}_updateAttributes(t){const e=mo(this._getSurroundingAttributes()),i=mo(this.getAttributes());if(t)this._attributePriority=new Map,this._attrs=new Map;else for(const[t,e]of this._attributePriority)"low"==e&&(this._attrs.delete(t),this._attributePriority.delete(t));this._setAttributesTo(e);const n=[];for(const[t,e]of this.getAttributes())i.has(t)&&i.get(t)===e||n.push(t);for(const[t]of i)this.hasAttribute(t)||n.push(t);n.length>0&&this.fire("change:attribute",{attributeKeys:n,directChange:!1})}_setAttribute(t,e,i=!0){const n=i?"normal":"low";if("low"==n&&"normal"==this._attributePriority.get(t))return!1;return super.getAttribute(t)!==e&&(this._attrs.set(t,e),this._attributePriority.set(t,n),!0)}_removeAttribute(t,e=!0){const i=e?"normal":"low";return("low"!=i||"normal"!=this._attributePriority.get(t))&&(this._attributePriority.set(t,i),!!super.hasAttribute(t)&&(this._attrs.delete(t),!0))}_setAttributesTo(t){const e=new Set;for(const[e,i]of this.getAttributes())t.get(e)!==i&&this._removeAttribute(e,!1);for(const[i,n]of t){this._setAttribute(i,n,!1)&&e.add(i)}return e}*getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty)for(const e of t.getAttributeKeys())if(e.startsWith(Dh)){const i=e.substr(Dh.length);yield[i,t.getAttribute(e)]}}_getSurroundingAttributes(){const t=this.getFirstPosition(),e=this._model.schema;let i=null;if(this.isCollapsed){const n=t.textNode?t.textNode:t.nodeBefore,s=t.textNode?t.textNode:t.nodeAfter;if(this.isGravityOverridden||(i=zh(n)),i||(i=zh(s)),!this.isGravityOverridden&&!i){let t=n;for(;t&&!e.isInline(t)&&!i;)t=t.previousSibling,i=zh(t)}if(!i){let t=s;for(;t&&!e.isInline(t)&&!i;)t=t.nextSibling,i=zh(t)}i||(i=this.getStoredAttributes())}else{const t=this.getFirstRange();for(const n of t){if(n.item.is("element")&&e.isObject(n.item))break;if("text"==n.type){i=n.item.getAttributes();break}}}return i}_fixGraveyardSelection(t){const e=this._model.schema.getNearestSelectionRange(t);e&&this._pushRange(e)}}function zh(t){return t instanceof uh||t instanceof dh?t.getAttributes():null}class Hh{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers)t(e);return this}}var jh=1,$h=4;const Wh=function(t){return os(t,jh|$h)};class qh extends Hh{elementToElement(t){return this.add(function(t){const e=Gh(t.model),i=Jh(t.view,"container");e.attributes.length&&(e.children=!0);return n=>{n.on(`insert:${e.name}`,function(t,e=nd){return(i,n,s)=>{if(!e(n.item,s.consumable,{preflight:!0}))return;const o=t(n.item,s,n);if(!o)return;e(n.item,s.consumable);const r=s.mapper.toViewPosition(n.range.start);s.mapper.bindElements(n.item,o),s.writer.insert(r,o),s.convertAttributes(n.item),ed(o,n.item.getChildren(),s,{reconversion:n.reconversion})}}(i,td(e)),{priority:t.converterPriority||"normal"}),(e.children||e.attributes.length)&&n.on("reduceChanges",Xh(e),{priority:"low"})}}(t))}elementToStructure(t){return this.add(function(t){const e=Gh(t.model),i=Jh(t.view,"container");return e.children=!0,n=>{if(n._conversionApi.schema.checkChild(e.name,"$text"))throw new v("conversion-element-to-structure-disallowed-text",n,{elementName:e.name});var s,o;n.on(`insert:${e.name}`,(s=i,o=td(e),(t,e,i)=>{if(!o(e.item,i.consumable,{preflight:!0}))return;const n=new Map;i.writer._registerSlotFactory(function(t,e,i){return(n,s="children")=>{const o=n.createContainerElement("$slot");let r=null;if("children"===s)r=Array.from(t.getChildren());else{if("function"!=typeof s)throw new v("conversion-slot-mode-unknown",i.dispatcher,{modeOrFilter:s});r=Array.from(t.getChildren()).filter((t=>s(t)))}return e.set(o,r),o}}(e.item,n,i));const r=s(e.item,i,e);if(i.writer._clearSlotFactory(),!r)return;!function(t,e,i){const n=Array.from(e.values()).flat(),s=new Set(n);if(s.size!=n.length)throw new v("conversion-slot-filter-overlap",i.dispatcher,{element:t});if(s.size!=t.childCount)throw new v("conversion-slot-filter-incomplete",i.dispatcher,{element:t})}(e.item,n,i),o(e.item,i.consumable);const a=i.mapper.toViewPosition(e.range.start);i.mapper.bindElements(e.item,r),i.writer.insert(a,r),i.convertAttributes(e.item),function(t,e,i,n){i.mapper.on("modelToViewPosition",r,{priority:"highest"});let s=null,o=null;for([s,o]of e)ed(t,o,i,n),i.writer.move(i.writer.createRangeIn(s),i.writer.createPositionBefore(s)),i.writer.remove(s);function r(t,e){const i=e.modelPosition.nodeAfter,n=o.indexOf(i);n<0||(e.viewPosition=e.mapper.findPositionIn(s,n))}i.mapper.off("modelToViewPosition",r)}(r,n,i,{reconversion:e.reconversion})}),{priority:t.converterPriority||"normal"}),n.on("reduceChanges",Xh(e),{priority:"low"})}}(t))}attributeToElement(t){return this.add(function(t){t=Wh(t);let e=t.model;"string"==typeof e&&(e={key:e});let i=`attribute:${e.key}`;e.name&&(i+=":"+e.name);if(e.values)for(const i of e.values)t.view[i]=Jh(t.view[i],"attribute");else t.view=Jh(t.view,"attribute");const n=Qh(t);return e=>{e.on(i,function(t){return(e,i,n)=>{if(!n.consumable.test(i.item,e.name))return;const s=t(i.attributeOldValue,n,i),o=t(i.attributeNewValue,n,i);if(!s&&!o)return;n.consumable.consume(i.item,e.name);const r=n.writer,a=r.document.selection;if(i.item instanceof Sh||i.item instanceof Fh)r.wrap(a.getFirstRange(),o);else{let t=n.mapper.toViewRange(i.range);null!==i.attributeOldValue&&s&&(t=r.unwrap(t,s)),null!==i.attributeNewValue&&o&&r.wrap(t,o)}}}(n),{priority:t.converterPriority||"normal"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=Wh(t);let e=t.model;"string"==typeof e&&(e={key:e});let i=`attribute:${e.key}`;e.name&&(i+=":"+e.name);if(e.values)for(const i of e.values)t.view[i]=Yh(t.view[i]);else t.view=Yh(t.view);const n=Qh(t);return e=>{var s;e.on(i,(s=n,(t,e,i)=>{if(!i.consumable.test(e.item,t.name))return;const n=s(e.attributeOldValue,i,e),o=s(e.attributeNewValue,i,e);if(!n&&!o)return;i.consumable.consume(e.item,t.name);const r=i.mapper.toViewElement(e.item),a=i.writer;if(!r)throw new v("conversion-attribute-to-attribute-on-text",i.dispatcher,e);if(null!==e.attributeOldValue&&n)if("class"==n.key){const t=so(n.value);for(const e of t)a.removeClass(e,r)}else if("style"==n.key){const t=Object.keys(n.value);for(const e of t)a.removeStyle(e,r)}else a.removeAttribute(n.key,r);if(null!==e.attributeNewValue&&o)if("class"==o.key){const t=so(o.value);for(const e of t)a.addClass(e,r)}else if("style"==o.key){const t=Object.keys(o.value);for(const e of t)a.setStyle(e,o.value[e],r)}else a.setAttribute(o.key,o.value,r)}),{priority:t.converterPriority||"normal"})}}(t))}markerToElement(t){return this.add(function(t){const e=Jh(t.view,"ui");return i=>{var n;i.on(`addMarker:${t.model}`,(n=e,(t,e,i)=>{e.isOpening=!0;const s=n(e,i);e.isOpening=!1;const o=n(e,i);if(!s||!o)return;const r=e.markerRange;if(r.isCollapsed&&!i.consumable.consume(r,t.name))return;for(const e of r)if(!i.consumable.consume(e.item,t.name))return;const a=i.mapper,l=i.writer;l.insert(a.toViewPosition(r.start),s),i.mapper.bindElementToMarker(s,e.markerName),r.isCollapsed||(l.insert(a.toViewPosition(r.end),o),i.mapper.bindElementToMarker(o,e.markerName)),t.stop()}),{priority:t.converterPriority||"normal"}),i.on(`removeMarker:${t.model}`,((t,e,i)=>{const n=i.mapper.markerNameToElements(e.markerName);if(n){for(const t of n)i.mapper.unbindElementFromMarkerName(t,e.markerName),i.writer.clear(i.writer.createRangeOn(t),t);i.writer.clearClonedElementsGroup(e.markerName),t.stop()}}),{priority:t.converterPriority||"normal"})}}(t))}markerToHighlight(t){return this.add(function(t){return e=>{var i;e.on(`addMarker:${t.model}`,(i=t.view,(t,e,n)=>{if(!e.item)return;if(!(e.item instanceof Sh||e.item instanceof Fh||e.item.is("$textProxy")))return;const s=Zh(i,e,n);if(!s)return;if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,r=Uh(o,s),a=o.document.selection;if(e.item instanceof Sh||e.item instanceof Fh)o.wrap(a.getFirstRange(),r);else{const t=n.mapper.toViewRange(e.range),i=o.wrap(t,r);for(const t of i.getItems())if(t.is("attributeElement")&&t.isSimilar(r)){n.mapper.bindElementToMarker(t,e.markerName);break}}}),{priority:t.converterPriority||"normal"}),e.on(`addMarker:${t.model}`,function(t){return(e,i,n)=>{if(!i.item)return;if(!(i.item instanceof fh))return;const s=Zh(t,i,n);if(!s)return;if(!n.consumable.test(i.item,e.name))return;const o=n.mapper.toViewElement(i.item);if(o&&o.getCustomProperty("addHighlight")){n.consumable.consume(i.item,e.name);for(const t of kh._createIn(i.item))n.consumable.consume(t.item,e.name);o.getCustomProperty("addHighlight")(o,s,n.writer),n.mapper.bindElementToMarker(o,i.markerName)}}}(t.view),{priority:t.converterPriority||"normal"}),e.on(`removeMarker:${t.model}`,function(t){return(e,i,n)=>{if(i.markerRange.isCollapsed)return;const s=Zh(t,i,n);if(!s)return;const o=Uh(n.writer,s),r=n.mapper.markerNameToElements(i.markerName);if(r){for(const t of r)if(n.mapper.unbindElementFromMarkerName(t,i.markerName),t.is("attributeElement"))n.writer.unwrap(n.writer.createRangeOn(t),o);else{t.getCustomProperty("removeHighlight")(t,s.id,n.writer)}n.writer.clearClonedElementsGroup(i.markerName),e.stop()}}}(t.view),{priority:t.converterPriority||"normal"})}}(t))}markerToData(t){return this.add(function(t){t=Wh(t);const e=t.model;let i=t.view;i||(i=i=>({group:e,name:i.substr(t.model.length+1)}));return n=>{var s;n.on(`addMarker:${e}`,(s=i,(t,e,i)=>{const n=s(e.markerName,i);if(!n)return;const o=e.markerRange;i.consumable.consume(o,t.name)&&(Kh(o,!1,i,e,n),Kh(o,!0,i,e,n),t.stop())}),{priority:t.converterPriority||"normal"}),n.on(`removeMarker:${e}`,function(t){return(e,i,n)=>{const s=t(i.markerName,n);if(!s)return;const o=n.mapper.markerNameToElements(i.markerName);if(o){for(const t of o)n.mapper.unbindElementFromMarkerName(t,i.markerName),t.is("containerElement")?(r(`data-${s.group}-start-before`,t),r(`data-${s.group}-start-after`,t),r(`data-${s.group}-end-before`,t),r(`data-${s.group}-end-after`,t)):n.writer.clear(n.writer.createRangeOn(t),t);n.writer.clearClonedElementsGroup(i.markerName),e.stop()}function r(t,e){if(e.hasAttribute(t)){const i=new Set(e.getAttribute(t).split(","));i.delete(s.name),0==i.size?n.writer.removeAttribute(t,e):n.writer.setAttribute(t,Array.from(i).join(","),e)}}}}(i),{priority:t.converterPriority||"normal"})}}(t))}}function Uh(t,e){const i=t.createAttributeElement("span",e.attributes);return e.classes&&i._addClass(e.classes),"number"==typeof e.priority&&(i._priority=e.priority),i._id=e.id,i}function Kh(t,e,i,n,s){const o=e?t.start:t.end,r=o.nodeAfter&&o.nodeAfter.is("element")?o.nodeAfter:null,a=o.nodeBefore&&o.nodeBefore.is("element")?o.nodeBefore:null;if(r||a){let t,o;e&&r||!e&&!a?(t=r,o=!0):(t=a,o=!1);const l=i.mapper.toViewElement(t);if(l)return void function(t,e,i,n,s,o){const r=`data-${o.group}-${e?"start":"end"}-${i?"before":"after"}`,a=t.hasAttribute(r)?t.getAttribute(r).split(","):[];a.unshift(o.name),n.writer.setAttribute(r,a.join(","),t),n.mapper.bindElementToMarker(t,s.markerName)}(l,e,o,i,n,s)}!function(t,e,i,n,s){const o=`${s.group}-${e?"start":"end"}`,r=s.name?{name:s.name}:null,a=i.writer.createUIElement(o,r);i.writer.insert(t,a),i.mapper.bindElementToMarker(a,n.markerName)}(i.mapper.toViewPosition(o),e,i,n,s)}function Gh(t){return"string"==typeof t&&(t={name:t}),t.attributes?Array.isArray(t.attributes)||(t.attributes=[t.attributes]):t.attributes=[],t.children=!!t.children,t}function Jh(t,e){return"function"==typeof t?t:(i,n)=>function(t,e,i){"string"==typeof t&&(t={name:t});let n;const s=e.writer,o=Object.assign({},t.attributes);if("container"==i)n=s.createContainerElement(t.name,o);else if("attribute"==i){const e={priority:t.priority||tl.DEFAULT_PRIORITY};n=s.createAttributeElement(t.name,o,e)}else n=s.createUIElement(t.name,o);if(t.styles){const e=Object.keys(t.styles);for(const i of e)s.setStyle(i,t.styles[i],n)}if(t.classes){const e=t.classes;if("string"==typeof e)s.addClass(e,n);else for(const t of e)s.addClass(t,n)}return n}(t,n,e)}function Qh(t){return t.model.values?(e,i,n)=>{const s=t.view[e];return s?s(e,i,n):null}:t.view}function Yh(t){return"string"==typeof t?e=>({key:t,value:e}):"object"==typeof t?t.value?()=>t:e=>({key:t.key,value:e}):t}function Zh(t,e,i){const n="function"==typeof t?t(e,i):t;return n?(n.priority||(n.priority=10),n.id||(n.id=e.markerName),n):null}function Xh(t){const e=function(t){return(e,i)=>{if(!e.is("element",t.name))return!1;if("attribute"==i.type){if(t.attributes.includes(i.attributeKey))return!0}else if(t.children)return!0;return!1}}(t);return(t,i)=>{const n=[];i.reconvertedElements||(i.reconvertedElements=new Set);for(const t of i.changes){const s="attribute"==t.type?t.range.start.nodeAfter:t.position.parent;if(s&&e(s,t)){if(!i.reconvertedElements.has(s)){i.reconvertedElements.add(s);const t=ph._createBefore(s);n.push({type:"remove",name:s.name,position:t,length:1},{type:"reinsert",name:s.name,position:t,length:1})}}else n.push(t)}i.changes=n}}function td(t){return(e,i,n={})=>{const s=["insert"];for(const i of t.attributes)e.hasAttribute(i)&&s.push(`attribute:${i}`);return!!s.every((t=>i.test(e,t)))&&(n.preflight||s.forEach((t=>i.consume(e,t))),!0)}}function ed(t,e,i,n){for(const s of e)id(t.root,s,i,n)||i.convertItem(s)}function id(t,e,i,n){const{writer:s,mapper:o}=i;if(!n.reconversion)return!1;const r=o.toViewElement(e);return!(!r||r.root==t)&&(!!i.canReuseView(r)&&(s.move(s.createRangeOn(r),o.toViewPosition(ph._createBefore(e))),!0))}function nd(t,e,{preflight:i}={}){return i?e.test(t,"insert"):e.consume(t,"insert")}function sd(t){const{schema:e,document:i}=t.model;for(const n of i.getRootNames()){const s=i.getRoot(n);if(s.isEmpty&&!e.checkChild(s,"$text")&&e.checkChild(s,"paragraph"))return t.insertElement("paragraph",s),!0}return!1}function od(t,e,i){const n=i.createContext(t);return!!i.checkChild(n,"paragraph")&&!!i.checkChild(n.push("paragraph"),e)}function rd(t,e){const i=e.createElement("paragraph");return e.insert(i,t),e.createPositionAt(i,0)}class ad extends Hh{elementToElement(t){return this.add(ld(t))}elementToAttribute(t){return this.add(function(t){t=Wh(t),dd(t);const e=ud(t,!1),i=cd(t.view),n=i?`element:${i}`:"element";return i=>{i.on(n,e,{priority:t.converterPriority||"low"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=Wh(t);let e=null;("string"==typeof t.view||t.view.key)&&(e=function(t){"string"==typeof t.view&&(t.view={key:t.view});const e=t.view.key;let i;if("class"==e||"style"==e){i={["class"==e?"classes":"styles"]:t.view.value}}else{i={attributes:{[e]:void 0===t.view.value?/[\s\S]*/:t.view.value}}}t.view.name&&(i.name=t.view.name);return t.view=i,e}(t));dd(t,e);const i=ud(t,!0);return e=>{e.on("element",i,{priority:t.converterPriority||"low"})}}(t))}elementToMarker(t){return this.add(function(t){const e=function(t){return(e,i)=>{const n="string"==typeof t?t:t(e,i);return i.writer.createElement("$marker",{"data-name":n})}}(t.model);return ld({...t,model:e})}(t))}dataToMarker(t){return this.add(function(t){t=Wh(t),t.model||(t.model=e=>e?t.view+":"+e:t.view);const e={view:t.view,model:t.model},i=hd(fd(e,"start")),n=hd(fd(e,"end"));return s=>{s.on(`element:${t.view}-start`,i,{priority:t.converterPriority||"normal"}),s.on(`element:${t.view}-end`,n,{priority:t.converterPriority||"normal"});const o=w.get("low"),r=w.get("highest"),a=w.get(t.converterPriority)/r;s.on("element",function(t){return(e,i,n)=>{const s=`data-${t.view}`;function o(e,s){for(const o of s){const s=t.model(o,n),r=n.writer.createElement("$marker",{"data-name":s});n.writer.insert(r,e),i.modelCursor.isEqual(e)?i.modelCursor=i.modelCursor.getShiftedBy(1):i.modelCursor=i.modelCursor._getTransformedByInsertion(e,1),i.modelRange=i.modelRange._getTransformedByInsertion(e,1)[0]}}(n.consumable.test(i.viewItem,{attributes:s+"-end-after"})||n.consumable.test(i.viewItem,{attributes:s+"-start-after"})||n.consumable.test(i.viewItem,{attributes:s+"-end-before"})||n.consumable.test(i.viewItem,{attributes:s+"-start-before"}))&&(i.modelRange||Object.assign(i,n.convertChildren(i.viewItem,i.modelCursor)),n.consumable.consume(i.viewItem,{attributes:s+"-end-after"})&&o(i.modelRange.end,i.viewItem.getAttribute(s+"-end-after").split(",")),n.consumable.consume(i.viewItem,{attributes:s+"-start-after"})&&o(i.modelRange.end,i.viewItem.getAttribute(s+"-start-after").split(",")),n.consumable.consume(i.viewItem,{attributes:s+"-end-before"})&&o(i.modelRange.start,i.viewItem.getAttribute(s+"-end-before").split(",")),n.consumable.consume(i.viewItem,{attributes:s+"-start-before"})&&o(i.modelRange.start,i.viewItem.getAttribute(s+"-start-before").split(",")))}}(e),{priority:o+a})}}(t))}}function ld(t){const e=hd(t=Wh(t)),i=cd(t.view),n=i?`element:${i}`:"element";return i=>{i.on(n,e,{priority:t.converterPriority||"normal"})}}function cd(t){return"string"==typeof t?t:"object"==typeof t&&"string"==typeof t.name?t.name:null}function hd(t){const e=new Tr(t.view);return(i,n,s)=>{const o=e.match(n.viewItem);if(!o)return;const r=o.match;if(r.name=!0,!s.consumable.test(n.viewItem,r))return;const a=function(t,e,i){return t instanceof Function?t(e,i):i.writer.createElement(t)}(t.model,n.viewItem,s);a&&s.safeInsert(a,n.modelCursor)&&(s.consumable.consume(n.viewItem,r),s.convertChildren(n.viewItem,a),s.updateConversionResult(a,n))}}function dd(t,e=null){const i=null===e||(t=>t.getAttribute(e)),n="object"!=typeof t.model?t.model:t.model.key,s="object"!=typeof t.model||void 0===t.model.value?i:t.model.value;t.model={key:n,value:s}}function ud(t,e){const i=new Tr(t.view);return(n,s,o)=>{if(!s.modelRange&&e)return;const r=i.match(s.viewItem);if(!r)return;if(!function(t,e){const i="function"==typeof t?t(e):t;if("object"==typeof i&&!cd(i))return!1;return!i.classes&&!i.attributes&&!i.styles}(t.view,s.viewItem)?delete r.match.name:r.match.name=!0,!o.consumable.test(s.viewItem,r.match))return;const a=t.model.key,l="function"==typeof t.model.value?t.model.value(s.viewItem,o):t.model.value;if(null===l)return;s.modelRange||Object.assign(s,o.convertChildren(s.viewItem,s.modelCursor));const c=function(t,e,i,n){let s=!1;for(const o of Array.from(t.getItems({shallow:i})))n.schema.checkAttribute(o,e.key)&&(s=!0,o.hasAttribute(e.key)||n.writer.setAttribute(e.key,e.value,o));return s}(s.modelRange,{key:a,value:l},e,o);c&&(o.consumable.test(s.viewItem,{name:!0})&&(r.match.name=!0),o.consumable.consume(s.viewItem,r.match))}}function fd(t,e){return{view:`${t.view}-${e}`,model:(e,i)=>{const n=e.getAttribute("name"),s=t.model(n,i);return i.writer.createElement("$marker",{"data-name":s})}}}class md extends(q()){constructor(t,e){super(),this.model=t,this.view=new ah(e),this.mapper=new Ah,this.downcastDispatcher=new Ph({mapper:this.mapper,schema:t.schema});const i=this.model.document,n=i.selection,s=this.model.markers;this.listenTo(this.model,"_beforeChanges",(()=>{this.view._disableRendering(!0)}),{priority:"highest"}),this.listenTo(this.model,"_afterChanges",(()=>{this.view._disableRendering(!1)}),{priority:"lowest"}),this.listenTo(i,"change",(()=>{this.view.change((t=>{this.downcastDispatcher.convertChanges(i.differ,s,t),this.downcastDispatcher.convertSelection(n,s,t)}))}),{priority:"low"}),this.listenTo(this.view.document,"selectionChange",function(t,e){return(i,n)=>{const s=n.newSelection,o=[];for(const t of s.getRanges())o.push(e.toModelRange(t));const r=t.createSelection(o,{backward:s.isBackward});r.isEqual(t.document.selection)||t.change((t=>{t.setSelection(r)}))}}(this.model,this.mapper)),this.downcastDispatcher.on("insert:$text",((t,e,i)=>{if(!i.consumable.consume(e.item,t.name))return;const n=i.writer,s=i.mapper.toViewPosition(e.range.start),o=n.createText(e.item.data);n.insert(s,o)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,i)=>{i.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||i.convertChildren(e.item)}),{priority:"lowest"}),this.downcastDispatcher.on("remove",((t,e,i)=>{const n=i.mapper.toViewPosition(e.position),s=e.position.getShiftedBy(e.length),o=i.mapper.toViewPosition(s,{isPhantom:!0}),r=i.writer.createRange(n,o),a=i.writer.remove(r.getTrimmed());for(const t of i.writer.createRangeIn(a).getItems())i.mapper.unbindViewElement(t,{defer:!0})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,i)=>{const n=i.writer,s=n.document.selection;for(const t of s.getRanges())t.isCollapsed&&t.end.parent.isAttached()&&i.writer.mergeAttributes(t.start);n.setSelection(null)}),{priority:"high"}),this.downcastDispatcher.on("selection",((t,e,i)=>{const n=e.selection;if(n.isCollapsed)return;if(!i.consumable.consume(n,"selection"))return;const s=[];for(const t of n.getRanges())s.push(i.mapper.toViewRange(t));i.writer.setSelection(s,{backward:n.isBackward})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,i)=>{const n=e.selection;if(!n.isCollapsed)return;if(!i.consumable.consume(n,"selection"))return;const s=i.writer,o=n.getFirstPosition(),r=i.mapper.toViewPosition(o),a=s.breakAttributes(r);s.setSelection(a)}),{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using((t=>{if("$graveyard"==t.rootName)return null;const e=new La(this.view.document,t.name);return e.rootName=t.rootName,this.mapper.bindElements(t,e),e}))}destroy(){this.view.destroy(),this.stopListening()}reconvertMarker(t){const e="string"==typeof t?t:t.name,i=this.model.markers.get(e);if(!i)throw new v("editingcontroller-reconvertmarker-marker-not-exist",this,{markerName:e});this.model.change((()=>{this.model.markers._refresh(i)}))}reconvertItem(t){this.model.change((()=>{this.model.document.differ._refreshItem(t)}))}}class gd{constructor(){this._consumables=new Map}add(t,e){let i;t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):(this._consumables.has(t)?i=this._consumables.get(t):(i=new wd(t),this._consumables.set(t,i)),i.add(e))}test(t,e){const i=this._consumables.get(t);return void 0===i?null:t.is("$text")||t.is("documentFragment")?i:i.test(e)}consume(t,e){return!!this.test(t,e)&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!1):this._consumables.get(t).consume(e),!0)}revert(t,e){const i=this._consumables.get(t);void 0!==i&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):i.revert(e))}static consumablesFromElement(t){const e={element:t,name:!0,attributes:[],classes:[],styles:[]},i=t.getAttributeKeys();for(const t of i)"style"!=t&&"class"!=t&&e.attributes.push(t);const n=t.getClassNames();for(const t of n)e.classes.push(t);const s=t.getStyleNames();for(const t of s)e.styles.push(t);return e}static createFrom(t,e){if(e||(e=new gd),t.is("$text"))return e.add(t),e;t.is("element")&&e.add(t,gd.consumablesFromElement(t)),t.is("documentFragment")&&e.add(t);for(const i of t.getChildren())e=gd.createFrom(i,e);return e}}const pd=["attributes","classes","styles"];class wd{constructor(t){this.element=t,this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){t.name&&(this._canConsumeName=!0);for(const e of pd)e in t&&this._add(e,t[e])}test(t){if(t.name&&!this._canConsumeName)return this._canConsumeName;for(const e of pd)if(e in t){const i=this._test(e,t[e]);if(!0!==i)return i}return!0}consume(t){t.name&&(this._canConsumeName=!1);for(const e of pd)e in t&&this._consume(e,t[e])}revert(t){t.name&&(this._canConsumeName=!0);for(const e of pd)e in t&&this._revert(e,t[e])}_add(t,e){const i=pt(e)?e:[e],n=this._consumables[t];for(const e of i){if("attributes"===t&&("class"===e||"style"===e))throw new v("viewconsumable-invalid-attribute",this);if(n.set(e,!0),"styles"===t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))n.set(t,!0)}}_test(t,e){const i=pt(e)?e:[e],n=this._consumables[t];for(const e of i)if("attributes"!==t||"class"!==e&&"style"!==e){const t=n.get(e);if(void 0===t)return null;if(!t)return!1}else{const t="class"==e?"classes":"styles",i=this._test(t,[...this._consumables[t].keys()]);if(!0!==i)return i}return!0}_consume(t,e){const i=pt(e)?e:[e],n=this._consumables[t];for(const e of i)if("attributes"!==t||"class"!==e&&"style"!==e){if(n.set(e,!1),"styles"==t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))n.set(t,!1)}else{const t="class"==e?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}}_revert(t,e){const i=pt(e)?e:[e],n=this._consumables[t];for(const e of i)if("attributes"!==t||"class"!==e&&"style"!==e){!1===n.get(e)&&n.set(e,!0)}else{const t="class"==e?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}}}class bd extends(q()){constructor(){super(),this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",((t,e)=>{e[0]=new _d(e[0])}),{priority:"highest"}),this.on("checkChild",((t,e)=>{e[0]=new _d(e[0]),e[1]=this.getDefinition(e[1])}),{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t])throw new v("schema-cannot-register-item-twice",this,{itemName:t});this._sourceDefinitions[t]=[Object.assign({},e)],this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t])throw new v("schema-cannot-extend-missing-item",this,{itemName:t});this._sourceDefinitions[t].push(Object.assign({},e)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(t){let e;return e="string"==typeof t?t:"is"in t&&(t.is("$text")||t.is("$textProxy"))?"$text":t.name,this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!(!e||!e.isBlock)}isLimit(t){const e=this.getDefinition(t);return!!e&&!(!e.isLimit&&!e.isObject)}isObject(t){const e=this.getDefinition(t);return!!e&&!!(e.isObject||e.isLimit&&e.isSelectable&&e.isContent)}isInline(t){const e=this.getDefinition(t);return!(!e||!e.isInline)}isSelectable(t){const e=this.getDefinition(t);return!!e&&!(!e.isSelectable&&!e.isObject)}isContent(t){const e=this.getDefinition(t);return!!e&&!(!e.isContent&&!e.isObject)}checkChild(t,e){return!!e&&this._checkContextMatch(e,t)}checkAttribute(t,e){const i=this.getDefinition(t.last);return!!i&&i.allowAttributes.includes(e)}checkMerge(t,e){if(t instanceof ph){const e=t.nodeBefore,i=t.nodeAfter;if(!(e instanceof fh))throw new v("schema-check-merge-no-element-before",this);if(!(i instanceof fh))throw new v("schema-check-merge-no-element-after",this);return this.checkMerge(e,i)}for(const i of e.getChildren())if(!this.checkChild(t,i))return!1;return!0}addChildCheck(t){this.on("checkChild",((e,[i,n])=>{if(!n)return;const s=t(i,n);"boolean"==typeof s&&(e.stop(),e.return=s)}),{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",((e,[i,n])=>{const s=t(i,n);"boolean"==typeof s&&(e.stop(),e.return=s)}),{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof ph)e=t.parent;else{e=(t instanceof kh?[t]:Array.from(t.getRanges())).reduce(((t,e)=>{const i=e.getCommonAncestor();return t?t.getCommonAncestor(i,{includeSelf:!0}):i}),null)}for(;!this.isLimit(e)&&e.parent;)e=e.parent;return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const i=[...t.getFirstPosition().getAncestors(),new dh("",t.getAttributes())];return this.checkAttribute(i,e)}{const i=t.getRanges();for(const t of i)for(const i of t)if(this.checkAttribute(i.item,e))return!0}return!1}*getValidRanges(t,e){t=function*(t){for(const e of t)yield*e.getMinimalFlatRanges()}(t);for(const i of t)yield*this._getValidRangesForRange(i,e)}getNearestSelectionRange(t,e="both"){if(this.checkChild(t,"$text"))return new kh(t);let i,n;const s=t.getAncestors().reverse().find((t=>this.isLimit(t)))||t.root;"both"!=e&&"backward"!=e||(i=new mh({boundaries:kh._createIn(s),startPosition:t,direction:"backward"})),"both"!=e&&"forward"!=e||(n=new mh({boundaries:kh._createIn(s),startPosition:t}));for(const t of function*(t,e){let i=!1;for(;!i;){if(i=!0,t){const e=t.next();e.done||(i=!1,yield{walker:t,value:e.value})}if(e){const t=e.next();t.done||(i=!1,yield{walker:e,value:t.value})}}}(i,n)){const e=t.walker==i?"elementEnd":"elementStart",n=t.value;if(n.type==e&&this.isObject(n.item))return kh._createOn(n.item);if(this.checkChild(n.nextPosition,"$text"))return new kh(n.nextPosition)}return null}findAllowedParent(t,e){let i=t.parent;for(;i;){if(this.checkChild(i,e))return i;if(this.isLimit(i))return null;i=i.parent}return null}setAllowedAttributes(t,e,i){const n=i.model;for(const[s,o]of Object.entries(e))n.schema.checkAttribute(t,s)&&i.setAttribute(s,o,t)}removeDisallowedAttributes(t,e){for(const i of t)if(i.is("$text"))Id(this,i,e);else{const t=kh._createIn(i).getPositions();for(const i of t){Id(this,i.nodeBefore||i.parent,e)}}}getAttributesWithProperty(t,e,i){const n={};for(const[s,o]of t.getAttributes()){const t=this.getAttributeProperties(s);void 0!==t[e]&&(void 0!==i&&i!==t[e]||(n[s]=o))}return n}createContext(t){return new _d(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={},e=this._sourceDefinitions,i=Object.keys(e);for(const n of i)t[n]=vd(e[n],n);for(const e of i)yd(t,e);for(const e of i)kd(t,e);for(const e of i)Ad(t,e);for(const e of i)xd(t,e),Cd(t,e);for(const e of i)Pd(t,e),Td(t,e),Ed(t,e);this._compiledDefinitions=t}_checkContextMatch(t,e,i=e.length-1){const n=e.getItem(i);if(t.allowIn.includes(n.name)){if(0==i)return!0;{const t=this.getDefinition(n);return this._checkContextMatch(t,e,i-1)}}return!1}*_getValidRangesForRange(t,e){let i=t.start,n=t.start;for(const s of t.getItems({shallow:!0}))s.is("element")&&(yield*this._getValidRangesForRange(kh._createIn(s),e)),this.checkAttribute(s,e)||(i.isEqual(n)||(yield new kh(i,n)),i=ph._createAfter(s)),n=ph._createAfter(s);i.isEqual(n)||(yield new kh(i,n))}}class _d{constructor(t){if(t instanceof _d)return t;let e;e="string"==typeof t?[t]:Array.isArray(t)?t:t.getAncestors({includeSelf:!0}),this._items=e.map(Od)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new _d([t]);return e._items=[...this._items,...e._items],e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map((t=>t.name))}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function vd(t,e){const i={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],allowChildren:[],inheritTypesFrom:[]};return function(t,e){for(const i of t){const t=Object.keys(i).filter((t=>t.startsWith("is")));for(const n of t)e[n]=!!i[n]}}(t,i),Sd(t,i,"allowIn"),Sd(t,i,"allowContentOf"),Sd(t,i,"allowWhere"),Sd(t,i,"allowAttributes"),Sd(t,i,"allowAttributesOf"),Sd(t,i,"allowChildren"),Sd(t,i,"inheritTypesFrom"),function(t,e){for(const i of t){const t=i.inheritAllFrom;t&&(e.allowContentOf.push(t),e.allowWhere.push(t),e.allowAttributesOf.push(t),e.inheritTypesFrom.push(t))}}(t,i),i}function yd(t,e){const i=t[e];for(const n of i.allowChildren){const i=t[n];i&&i.allowIn.push(e)}i.allowChildren.length=0}function kd(t,e){for(const i of t[e].allowContentOf)if(t[i]){Rd(t,i).forEach((t=>{t.allowIn.push(e)}))}delete t[e].allowContentOf}function Ad(t,e){for(const i of t[e].allowWhere){const n=t[i];if(n){const i=n.allowIn;t[e].allowIn.push(...i)}}delete t[e].allowWhere}function xd(t,e){for(const i of t[e].allowAttributesOf){const n=t[i];if(n){const i=n.allowAttributes;t[e].allowAttributes.push(...i)}}delete t[e].allowAttributesOf}function Cd(t,e){const i=t[e];for(const e of i.inheritTypesFrom){const n=t[e];if(n){const t=Object.keys(n).filter((t=>t.startsWith("is")));for(const e of t)e in i||(i[e]=n[e])}}delete i.inheritTypesFrom}function Pd(t,e){const i=t[e],n=i.allowIn.filter((e=>t[e]));i.allowIn=Array.from(new Set(n))}function Td(t,e){const i=t[e];for(const n of i.allowIn){t[n].allowChildren.push(e)}}function Ed(t,e){const i=t[e];i.allowAttributes=Array.from(new Set(i.allowAttributes))}function Sd(t,e,i){for(const n of t){const t=n[i];"string"==typeof t?e[i].push(t):Array.isArray(t)&&e[i].push(...t)}}function Rd(t,e){const i=t[e];return(n=t,Object.keys(n).map((t=>n[t]))).filter((t=>t.allowIn.includes(i.name)));var n}function Od(t){return"string"==typeof t||t.is("documentFragment")?{name:"string"==typeof t?t:"$documentFragment",*getAttributeKeys(){},getAttribute(){}}:{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute:e=>t.getAttribute(e)}}function Id(t,e,i){for(const n of e.getAttributeKeys())t.checkAttribute(e,n)||i.removeAttribute(n,e)}class Vd extends(R()){constructor(t){super(),this._splitParts=new Map,this._cursorParents=new Map,this._modelCursor=null,this._emptyElementsToKeep=new Set,this.conversionApi={...t,consumable:null,writer:null,store:null,convertItem:(t,e)=>this._convertItem(t,e),convertChildren:(t,e)=>this._convertChildren(t,e),safeInsert:(t,e)=>this._safeInsert(t,e),updateConversionResult:(t,e)=>this._updateConversionResult(t,e),splitToAllowedParent:(t,e)=>this._splitToAllowedParent(t,e),getSplitParts:t=>this._getSplitParts(t),keepEmptyElement:t=>this._keepEmptyElement(t)}}convert(t,e,i=["$root"]){this.fire("viewCleanup",t),this._modelCursor=function(t,e){let i;for(const n of new _d(t)){const t={};for(const e of n.getAttributeKeys())t[e]=n.getAttribute(e);const s=e.createElement(n.name,t);i&&e.insert(s,i),i=ph._createAt(s,0)}return i}(i,e),this.conversionApi.writer=e,this.conversionApi.consumable=gd.createFrom(t),this.conversionApi.store={};const{modelRange:n}=this._convertItem(t,this._modelCursor),s=e.createDocumentFragment();if(n){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren()))e.append(t,s);s.markers=function(t,e){const i=new Set,n=new Map,s=kh._createIn(t).getItems();for(const t of s)t.is("element","$marker")&&i.add(t);for(const t of i){const i=t.getAttribute("data-name"),s=e.createPositionBefore(t);n.has(i)?n.get(i).end=s.clone():n.set(i,new kh(s.clone())),e.remove(t)}return n}(s,e)}return this._modelCursor=null,this._splitParts.clear(),this._cursorParents.clear(),this._emptyElementsToKeep.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,s}_convertItem(t,e){const i={viewItem:t,modelCursor:e,modelRange:null};if(t.is("element")?this.fire(`element:${t.name}`,i,this.conversionApi):t.is("$text")?this.fire("text",i,this.conversionApi):this.fire("documentFragment",i,this.conversionApi),i.modelRange&&!(i.modelRange instanceof kh))throw new v("view-conversion-dispatcher-incorrect-result",this);return{modelRange:i.modelRange,modelCursor:i.modelCursor}}_convertChildren(t,e){let i=e.is("position")?e:ph._createAt(e,0);const n=new kh(i);for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,i);t.modelRange instanceof kh&&(n.end=t.modelRange.end,i=t.modelCursor)}return{modelRange:n,modelCursor:i}}_safeInsert(t,e){const i=this._splitToAllowedParent(t,e);return!!i&&(this.conversionApi.writer.insert(t,i.position),!0)}_updateConversionResult(t,e){const i=this._getSplitParts(t),n=this.conversionApi.writer;e.modelRange||(e.modelRange=n.createRange(n.createPositionBefore(t),n.createPositionAfter(i[i.length-1])));const s=this._cursorParents.get(t);e.modelCursor=s?n.createPositionAt(s,0):e.modelRange.end}_splitToAllowedParent(t,e){const{schema:i,writer:n}=this.conversionApi;let s=i.findAllowedParent(e,t);if(s){if(s===e.parent)return{position:e};this._modelCursor.parent.getAncestors().includes(s)&&(s=null)}if(!s)return od(e,t,i)?{position:rd(e,n)}:null;const o=this.conversionApi.writer.split(e,s),r=[];for(const t of o.range.getWalker())if("elementEnd"==t.type)r.push(t.item);else{const e=r.pop(),i=t.item;this._registerSplitPair(e,i)}const a=o.range.end.parent;return this._cursorParents.set(t,a),{position:o.position,cursorParent:a}}_registerSplitPair(t,e){this._splitParts.has(t)||this._splitParts.set(t,[t]);const i=this._splitParts.get(t);this._splitParts.set(e,i),i.push(e)}_getSplitParts(t){let e;return e=this._splitParts.has(t)?this._splitParts.get(t):[t],e}_keepEmptyElement(t){this._emptyElementsToKeep.add(t)}_removeEmptyElements(){let t=!1;for(const e of this._splitParts.keys())e.isEmpty&&!this._emptyElementsToKeep.has(e)&&(this.conversionApi.writer.remove(e),this._splitParts.delete(e),t=!0);t&&this._removeEmptyElements()}}class Md{getHtml(t){const e=document.implementation.createHTMLDocument("").createElement("div");return e.appendChild(t),e.innerHTML}}class Nd{constructor(t){this.skipComments=!0,this.domParser=new DOMParser,this.domConverter=new jl(t,{renderingMode:"data"}),this.htmlWriter=new Md}toData(t){const e=this.domConverter.viewToDom(t);return this.htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this.domConverter.domToView(e,{skipComments:this.skipComments})}registerRawContentMatcher(t){this.domConverter.registerRawContentMatcher(t)}useFillerType(t){this.domConverter.blockFillerMode="marked"==t?"markedNbsp":"nbsp"}_toDom(t){t.match(/<(?:html|body|head|meta)(?:\s[^>]*)?>/i)||(t=`${t}`);const e=this.domParser.parseFromString(t,"text/html"),i=e.createDocumentFragment(),n=e.body.childNodes;for(;n.length>0;)i.appendChild(n[0]);return i}}class Bd extends(R()){constructor(t,e){super(),this.model=t,this.mapper=new Ah,this.downcastDispatcher=new Ph({mapper:this.mapper,schema:t.schema}),this.downcastDispatcher.on("insert:$text",((t,e,i)=>{if(!i.consumable.consume(e.item,t.name))return;const n=i.writer,s=i.mapper.toViewPosition(e.range.start),o=n.createText(e.item.data);n.insert(s,o)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,i)=>{i.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||i.convertChildren(e.item)}),{priority:"lowest"}),this.upcastDispatcher=new Vd({schema:t.schema}),this.viewDocument=new Xa(e),this.stylesProcessor=e,this.htmlProcessor=new Nd(this.viewDocument),this.processor=this.htmlProcessor,this._viewWriter=new dl(this.viewDocument),this.upcastDispatcher.on("text",((t,e,{schema:i,consumable:n,writer:s})=>{let o=e.modelCursor;if(!n.test(e.viewItem))return;if(!i.checkChild(o,"$text")){if(!od(o,"$text",i))return;if(0==e.viewItem.data.trim().length)return;const t=o.nodeBefore;o=rd(o,s),t&&t.is("element","$marker")&&(s.move(s.createRangeOn(t),o),o=s.createPositionAfter(t))}n.consume(e.viewItem);const r=s.createText(e.viewItem.data);s.insert(r,o),e.modelRange=s.createRange(o,o.getShiftedBy(r.offsetSize)),e.modelCursor=e.modelRange.end}),{priority:"lowest"}),this.upcastDispatcher.on("element",((t,e,i)=>{if(!e.modelRange&&i.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:n}=i.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=n}}),{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",((t,e,i)=>{if(!e.modelRange&&i.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:n}=i.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=n}}),{priority:"lowest"}),q().prototype.decorate.call(this,"init"),q().prototype.decorate.call(this,"set"),q().prototype.decorate.call(this,"get"),q().prototype.decorate.call(this,"toView"),q().prototype.decorate.call(this,"toModel"),this.on("init",(()=>{this.fire("ready")}),{priority:"lowest"}),this.on("ready",(()=>{this.model.enqueueChange({isUndoable:!1},sd)}),{priority:"lowest"})}get(t={}){const{rootName:e="main",trim:i="empty"}=t;if(!this._checkIfRootsExists([e]))throw new v("datacontroller-get-non-existent-root",this);const n=this.model.document.getRoot(e);return"empty"!==i||this.model.hasContent(n,{ignoreWhitespaces:!0})?this.stringify(n,t):""}stringify(t,e={}){const i=this.toView(t,e);return this.processor.toData(i)}toView(t,e={}){const i=this.viewDocument,n=this._viewWriter;this.mapper.clearBindings();const s=kh._createIn(t),o=new hl(i);this.mapper.bindElements(t,o);const r=t.is("documentFragment")?t.markers:function(t){const e=[],i=t.root.document;if(!i)return new Map;const n=kh._createIn(t);for(const t of i.model.markers){const i=t.getRange(),s=i.isCollapsed,o=i.start.isEqual(n.start)||i.end.isEqual(n.end);if(s&&o)e.push([t.name,i]);else{const s=n.getIntersection(i);s&&e.push([t.name,s])}}return e.sort((([t,e],[i,n])=>{if("after"!==e.end.compareWith(n.start))return 1;if("before"!==e.start.compareWith(n.end))return-1;switch(e.start.compareWith(n.start)){case"before":return 1;case"after":return-1;default:switch(e.end.compareWith(n.end)){case"before":return 1;case"after":return-1;default:return i.localeCompare(t)}}})),new Map(e)}(t);return this.downcastDispatcher.convert(s,r,n,e),o}init(t){if(this.model.document.version)throw new v("datacontroller-init-document-not-empty",this);let e={};if("string"==typeof t?e.main=t:e=t,!this._checkIfRootsExists(Object.keys(e)))throw new v("datacontroller-init-non-existent-root",this);return this.model.enqueueChange({isUndoable:!1},(t=>{for(const i of Object.keys(e)){const n=this.model.document.getRoot(i);t.insert(this.parse(e[i],n),n,0)}})),Promise.resolve()}set(t,e={}){let i={};if("string"==typeof t?i.main=t:i=t,!this._checkIfRootsExists(Object.keys(i)))throw new v("datacontroller-set-non-existent-root",this);this.model.enqueueChange(e.batchType||{},(t=>{t.setSelection(null),t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const e of Object.keys(i)){const n=this.model.document.getRoot(e);t.remove(t.createRangeIn(n)),t.insert(this.parse(i[e],n),n,0)}}))}parse(t,e="$root"){const i=this.processor.toView(t);return this.toModel(i,e)}toModel(t,e="$root"){return this.model.change((i=>this.upcastDispatcher.convert(t,i,e)))}addStyleProcessorRules(t){t(this.stylesProcessor)}registerRawContentMatcher(t){this.processor&&this.processor!==this.htmlProcessor&&this.processor.registerRawContentMatcher(t),this.htmlProcessor.registerRawContentMatcher(t)}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t)if(!this.model.document.getRootNames().includes(e))return!1;return!0}}class Dd{constructor(t,e){this._helpers=new Map,this._downcast=so(t),this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=so(e),this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(t,e){const i=this._downcast.includes(e);if(!this._upcast.includes(e)&&!i)throw new v("conversion-add-alias-dispatcher-not-registered",this);this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:i})}for(t){if(!this._helpers.has(t))throw new v("conversion-for-unknown-group",this);return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:i}of Fd(t))this.for("upcast").elementToElement({model:e,view:i,converterPriority:t.converterPriority})}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:i}of Fd(t))this.for("upcast").elementToAttribute({view:i,model:e,converterPriority:t.converterPriority})}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:i}of Fd(t))this.for("upcast").attributeToAttribute({view:i,model:e})}_createConversionHelpers({name:t,dispatchers:e,isDowncast:i}){if(this._helpers.has(t))throw new v("conversion-group-exists",this);const n=i?new qh(e):new ad(e);this._helpers.set(t,n)}}function*Fd(t){if(t.model.values)for(const e of t.model.values){const i={key:t.model.key,value:e},n=t.view[e],s=t.upcastAlso?t.upcastAlso[e]:void 0;yield*Ld(i,n,s)}else yield*Ld(t.model,t.view,t.upcastAlso)}function*Ld(t,e,i){if(yield{model:t,view:e},i)for(const e of so(i))yield{model:t,view:e}}class zd{constructor(t){this.baseVersion=t,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);return t.__className=this.constructor.className,delete t.batch,delete t.isDocumentOperation,t}static get className(){return"Operation"}static fromJSON(t,e){return new this(t.baseVersion)}}function Hd(t,e){const i=Wd(e),n=i.reduce(((t,e)=>t+e.offsetSize),0),s=t.parent;Ud(t);const o=t.index;return s._insertChild(o,i),qd(s,o+i.length),qd(s,o),new kh(t,t.getShiftedBy(n))}function jd(t){if(!t.isFlat)throw new v("operation-utils-remove-range-not-flat",this);const e=t.start.parent;Ud(t.start),Ud(t.end);const i=e._removeChildren(t.start.index,t.end.index-t.start.index);return qd(e,t.start.index),i}function $d(t,e){if(!t.isFlat)throw new v("operation-utils-move-range-not-flat",this);const i=jd(t);return Hd(e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset),i)}function Wd(t){const e=[];!function t(i){if("string"==typeof i)e.push(new dh(i));else if(i instanceof uh)e.push(new dh(i.data,i.getAttributes()));else if(i instanceof ch)e.push(i);else if(tt(i))for(const e of i)t(e)}(t);for(let t=1;tt.maxOffset)throw new v("move-operation-nodes-do-not-exist",this);if(t===e&&i=i&&this.targetPosition.path[t]t._clone(!0)))),e=new Jd(this.position,t,this.baseVersion);return e.shouldReceiveAttributes=this.shouldReceiveAttributes,e}getReversed(){const t=this.position.root.document.graveyard,e=new ph(t,[0]);return new Gd(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffsett._clone(!0)))),Hd(this.position,t)}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t.nodes=this.nodes.toJSON(),t}static get className(){return"InsertOperation"}static fromJSON(t,e){const i=[];for(const e of t.nodes)e.name?i.push(fh.fromJSON(e)):i.push(dh.fromJSON(e));const n=new Jd(ph.fromJSON(t.position,e),i,t.baseVersion);return n.shouldReceiveAttributes=t.shouldReceiveAttributes,n}}class Qd extends zd{constructor(t,e,i,n,s,o){super(o),this.name=t,this.oldRange=e?e.clone():null,this.newRange=i?i.clone():null,this.affectsData=s,this._markers=n}get type(){return"marker"}clone(){return new Qd(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new Qd(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){this.newRange?this._markers._set(this.name,this.newRange,!0,this.affectsData):this._markers._remove(this.name)}toJSON(){const t=super.toJSON();return this.oldRange&&(t.oldRange=this.oldRange.toJSON()),this.newRange&&(t.newRange=this.newRange.toJSON()),delete t._markers,t}static get className(){return"MarkerOperation"}static fromJSON(t,e){return new Qd(t.name,t.oldRange?kh.fromJSON(t.oldRange,e):null,t.newRange?kh.fromJSON(t.newRange,e):null,e.model.markers,t.affectsData,t.baseVersion)}}const Yd=function(t,e){return Qc(t,e)};class Zd extends zd{constructor(t,e,i,n,s){super(s),this.range=t.clone(),this.key=e,this.oldValue=void 0===i?null:i,this.newValue=void 0===n?null:n}get type(){return null===this.oldValue?"addAttribute":null===this.newValue?"removeAttribute":"changeAttribute"}clone(){return new Zd(this.range,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new Zd(this.range,this.key,this.newValue,this.oldValue,this.baseVersion+1)}toJSON(){const t=super.toJSON();return t.range=this.range.toJSON(),t}_validate(){if(!this.range.isFlat)throw new v("attribute-operation-range-not-flat",this);for(const t of this.range.getItems({shallow:!0})){if(null!==this.oldValue&&!Yd(t.getAttribute(this.key),this.oldValue))throw new v("attribute-operation-wrong-old-value",this,{item:t,key:this.key,value:this.oldValue});if(null===this.oldValue&&null!==this.newValue&&t.hasAttribute(this.key))throw new v("attribute-operation-attribute-exists",this,{node:t,key:this.key})}}_execute(){Yd(this.oldValue,this.newValue)||function(t,e,i){Ud(t.start),Ud(t.end);for(const n of t.getItems({shallow:!0})){const t=n.is("$textProxy")?n.textNode:n;null!==i?t._setAttribute(e,i):t._removeAttribute(e),qd(t.parent,t.index)}qd(t.end.parent,t.end.index)}(this.range,this.key,this.newValue)}static get className(){return"AttributeOperation"}static fromJSON(t,e){return new Zd(kh.fromJSON(t.range,e),t.key,t.oldValue,t.newValue,t.baseVersion)}}class Xd extends zd{get type(){return"noop"}clone(){return new Xd(this.baseVersion)}getReversed(){return new Xd(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}class tu extends zd{constructor(t,e,i,n){super(n),this.position=t,this.position.stickiness="toNext",this.oldName=e,this.newName=i}get type(){return"rename"}clone(){return new tu(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new tu(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const t=this.position.nodeAfter;if(!(t instanceof fh))throw new v("rename-operation-wrong-position",this);if(t.name!==this.oldName)throw new v("rename-operation-wrong-name",this)}_execute(){this.position.nodeAfter.name=this.newName}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t}static get className(){return"RenameOperation"}static fromJSON(t,e){return new tu(ph.fromJSON(t.position,e),t.oldName,t.newName,t.baseVersion)}}class eu extends zd{constructor(t,e,i,n,s){super(s),this.root=t,this.key=e,this.oldValue=i,this.newValue=n}get type(){return null===this.oldValue?"addRootAttribute":null===this.newValue?"removeRootAttribute":"changeRootAttribute"}clone(){return new eu(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new eu(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment"))throw new v("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key});if(null!==this.oldValue&&this.root.getAttribute(this.key)!==this.oldValue)throw new v("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key});if(null===this.oldValue&&null!==this.newValue&&this.root.hasAttribute(this.key))throw new v("rootattribute-operation-attribute-exists",this,{root:this.root,key:this.key})}_execute(){null!==this.newValue?this.root._setAttribute(this.key,this.newValue):this.root._removeAttribute(this.key)}toJSON(){const t=super.toJSON();return t.root=this.root.toJSON(),t}static get className(){return"RootAttributeOperation"}static fromJSON(t,e){if(!e.getRoot(t.root))throw new v("rootattribute-operation-fromjson-no-root",this,{rootName:t.root});return new eu(e.getRoot(t.root),t.key,t.oldValue,t.newValue,t.baseVersion)}}class iu extends zd{constructor(t,e,i,n,s){super(s),this.sourcePosition=t.clone(),this.sourcePosition.stickiness="toPrevious",this.howMany=e,this.targetPosition=i.clone(),this.targetPosition.stickiness="toNext",this.graveyardPosition=n.clone()}get type(){return"merge"}get deletionPosition(){return new ph(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const t=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new kh(this.sourcePosition,t)}clone(){return new iu(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.targetPosition._getTransformedByMergeOperation(this),e=this.sourcePosition.path.slice(0,-1),i=new ph(this.sourcePosition.root,e)._getTransformedByMergeOperation(this);return new nu(t,this.howMany,i,this.graveyardPosition,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent,e=this.targetPosition.parent;if(!t.parent)throw new v("merge-operation-source-position-invalid",this);if(!e.parent)throw new v("merge-operation-target-position-invalid",this);if(this.howMany!=t.maxOffset)throw new v("merge-operation-how-many-invalid",this)}_execute(){const t=this.sourcePosition.parent;$d(kh._createIn(t),this.targetPosition),$d(kh._createOn(t),this.graveyardPosition)}toJSON(){const t=super.toJSON();return t.sourcePosition=t.sourcePosition.toJSON(),t.targetPosition=t.targetPosition.toJSON(),t.graveyardPosition=t.graveyardPosition.toJSON(),t}static get className(){return"MergeOperation"}static fromJSON(t,e){const i=ph.fromJSON(t.sourcePosition,e),n=ph.fromJSON(t.targetPosition,e),s=ph.fromJSON(t.graveyardPosition,e);return new this(i,t.howMany,n,s,t.baseVersion)}}class nu extends zd{constructor(t,e,i,n,s){super(s),this.splitPosition=t.clone(),this.splitPosition.stickiness="toNext",this.howMany=e,this.insertionPosition=i,this.graveyardPosition=n?n.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();return t.push(0),new ph(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new kh(this.splitPosition,t)}clone(){return new nu(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.splitPosition.root.document.graveyard,e=new ph(t,[0]);return new iu(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent,e=this.splitPosition.offset;if(!t||t.maxOffset{if(t.key===e.key&&t.range.start.hasSameParentAs(e.range.start)){const n=t.range.getDifference(e.range).map((e=>new Zd(e,t.key,t.oldValue,t.newValue,0))),s=t.range.getIntersection(e.range);return s&&i.aIsStrong&&n.push(new Zd(s,e.key,e.newValue,t.newValue,0)),0==n.length?[new Xd(0)]:n}return[t]})),au(Zd,Jd,((t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const i=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes).map((e=>new Zd(e,t.key,t.oldValue,t.newValue,t.baseVersion)));if(e.shouldReceiveAttributes){const n=mu(e,t.key,t.oldValue);n&&i.unshift(n)}return i}return t.range=t.range._getTransformedByInsertion(e.position,e.howMany,!1)[0],[t]})),au(Zd,iu,((t,e)=>{const i=[];t.range.start.hasSameParentAs(e.deletionPosition)&&(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition))&&i.push(kh._createFromPositionAndShift(e.graveyardPosition,1));const n=t.range._getTransformedByMergeOperation(e);return n.isCollapsed||i.push(n),i.map((e=>new Zd(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),au(Zd,Gd,((t,e)=>{const i=function(t,e){const i=kh._createFromPositionAndShift(e.sourcePosition,e.howMany);let n=null,s=[];i.containsRange(t,!0)?n=t:t.start.hasSameParentAs(i.start)?(s=t.getDifference(i),n=t.getIntersection(i)):s=[t];const o=[];for(let t of s){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const i=e.getMovedRangeStart(),n=t.start.hasSameParentAs(i),s=t._getTransformedByInsertion(i,e.howMany,n);o.push(...s)}n&&o.push(n._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,!1)[0]);return o}(t.range,e);return i.map((e=>new Zd(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),au(Zd,nu,((t,e)=>{if(t.range.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.range.end.offset++,[t];if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const i=t.clone();return i.range=new kh(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition)),t.range.end=e.splitPosition.clone(),t.range.end.stickiness="toPrevious",[t,i]}return t.range=t.range._getTransformedBySplitOperation(e),[t]})),au(Jd,Zd,((t,e)=>{const i=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const n=mu(t,e.key,e.newValue);n&&i.push(n)}return i})),au(Jd,Jd,((t,e,i)=>(t.position.isEqual(e.position)&&i.aIsStrong||(t.position=t.position._getTransformedByInsertOperation(e)),[t]))),au(Jd,Gd,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),au(Jd,nu,((t,e)=>(t.position=t.position._getTransformedBySplitOperation(e),[t]))),au(Jd,iu,((t,e)=>(t.position=t.position._getTransformedByMergeOperation(e),[t]))),au(Qd,Jd,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]),t.newRange&&(t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]),[t]))),au(Qd,Qd,((t,e,i)=>{if(t.name==e.name){if(!i.aIsStrong)return[new Xd(0)];t.oldRange=e.newRange?e.newRange.clone():null}return[t]})),au(Qd,iu,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByMergeOperation(e)),t.newRange&&(t.newRange=t.newRange._getTransformedByMergeOperation(e)),[t]))),au(Qd,Gd,((t,e,i)=>{if(t.oldRange&&(t.oldRange=kh._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))),t.newRange){if(i.abRelation){const n=kh._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if("left"==i.abRelation.side&&e.targetPosition.isEqual(t.newRange.start))return t.newRange.end=n.end,t.newRange.start.path=i.abRelation.path,[t];if("right"==i.abRelation.side&&e.targetPosition.isEqual(t.newRange.end))return t.newRange.start=n.start,t.newRange.end.path=i.abRelation.path,[t]}t.newRange=kh._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]})),au(Qd,nu,((t,e,i)=>{if(t.oldRange&&(t.oldRange=t.oldRange._getTransformedBySplitOperation(e)),t.newRange){if(i.abRelation){const n=t.newRange._getTransformedBySplitOperation(e);return t.newRange.start.isEqual(e.splitPosition)&&i.abRelation.wasStartBeforeMergedElement?t.newRange.start=ph._createAt(e.insertionPosition):t.newRange.start.isEqual(e.splitPosition)&&!i.abRelation.wasInLeftElement&&(t.newRange.start=ph._createAt(e.moveTargetPosition)),t.newRange.end.isEqual(e.splitPosition)&&i.abRelation.wasInRightElement?t.newRange.end=ph._createAt(e.moveTargetPosition):t.newRange.end.isEqual(e.splitPosition)&&i.abRelation.wasEndBeforeMergedElement?t.newRange.end=ph._createAt(e.insertionPosition):t.newRange.end=n.end,[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]})),au(iu,Jd,((t,e)=>(t.sourcePosition.hasSameParentAs(e.position)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e),t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e),[t]))),au(iu,iu,((t,e,i)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(i.bWasUndone){const i=e.graveyardPosition.path.slice();return i.push(0),t.sourcePosition=new ph(e.graveyardPosition.root,i),t.howMany=0,[t]}return[new Xd(0)]}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!i.bWasUndone&&"splitAtSource"!=i.abRelation){const n="$graveyard"==t.targetPosition.root.rootName,s="$graveyard"==e.targetPosition.root.rootName;if(s&&!n||!(n&&!s)&&i.aIsStrong){const i=e.targetPosition._getTransformedByMergeOperation(e),n=t.targetPosition._getTransformedByMergeOperation(e);return[new Gd(i,t.howMany,n,0)]}return[new Xd(0)]}return t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),t.graveyardPosition.isEqual(e.graveyardPosition)&&i.aIsStrong||(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),au(iu,Gd,((t,e,i)=>{const n=kh._createFromPositionAndShift(e.sourcePosition,e.howMany);return"remove"==e.type&&!i.bWasUndone&&!i.forceWeakRemove&&t.deletionPosition.hasSameParentAs(e.sourcePosition)&&n.containsPosition(t.sourcePosition)?[new Xd(0)]:(t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition.hasSameParentAs(e.sourcePosition)&&(t.howMany-=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e),t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e),t.graveyardPosition.isEqual(e.targetPosition)||(t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)),[t])})),au(iu,nu,((t,e,i)=>{if(e.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1),t.deletionPosition.isEqual(e.graveyardPosition)&&(t.howMany=e.howMany)),t.targetPosition.isEqual(e.splitPosition)){const n=0!=e.howMany,s=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(n||s||"mergeTargetNotMoved"==i.abRelation)return t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),[t]}if(t.sourcePosition.isEqual(e.splitPosition)){if("mergeSourceNotMoved"==i.abRelation)return t.howMany=0,t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t];if("mergeSameElement"==i.abRelation||t.sourcePosition.offset>0)return t.sourcePosition=e.moveTargetPosition.clone(),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]}return t.sourcePosition.hasSameParentAs(e.splitPosition)&&(t.howMany=e.splitPosition.offset),t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]})),au(Gd,Jd,((t,e)=>{const i=kh._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByInsertOperation(e,!1)[0];return t.sourcePosition=i.start,t.howMany=i.end.offset-i.start.offset,t.targetPosition.isEqual(e.position)||(t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)),[t]})),au(Gd,Gd,((t,e,i)=>{const n=kh._createFromPositionAndShift(t.sourcePosition,t.howMany),s=kh._createFromPositionAndShift(e.sourcePosition,e.howMany);let o,r=i.aIsStrong,a=!i.aIsStrong;if("insertBefore"==i.abRelation||"insertAfter"==i.baRelation?a=!0:"insertAfter"!=i.abRelation&&"insertBefore"!=i.baRelation||(a=!1),o=t.targetPosition.isEqual(e.targetPosition)&&a?t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany):t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),gu(t,e)&&gu(e,t))return[e.getReversed()];if(n.containsPosition(e.targetPosition)&&n.containsRange(s,!0))return n.start=n.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),n.end=n.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),pu([n],o);if(s.containsPosition(t.targetPosition)&&s.containsRange(n,!0))return n.start=n.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),n.end=n.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),pu([n],o);const l=X(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if("prefix"==l||"extension"==l)return n.start=n.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),n.end=n.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),pu([n],o);"remove"!=t.type||"remove"==e.type||i.aWasUndone||i.forceWeakRemove?"remove"==t.type||"remove"!=e.type||i.bWasUndone||i.forceWeakRemove||(r=!1):r=!0;const c=[],h=n.getDifference(s);for(const t of h){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany),t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const i="same"==X(t.start.getParentPath(),e.getMovedRangeStart().getParentPath()),n=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,i);c.push(...n)}const d=n.getIntersection(s);return null!==d&&r&&(d.start=d.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),d.end=d.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),0===c.length?c.push(d):1==c.length?s.start.isBefore(n.start)||s.start.isEqual(n.start)?c.unshift(d):c.push(d):c.splice(1,0,d)),0===c.length?[new Xd(t.baseVersion)]:pu(c,o)})),au(Gd,nu,((t,e,i)=>{let n=t.targetPosition.clone();t.targetPosition.isEqual(e.insertionPosition)&&e.graveyardPosition&&"moveTargetAfter"!=i.abRelation||(n=t.targetPosition._getTransformedBySplitOperation(e));const s=kh._createFromPositionAndShift(t.sourcePosition,t.howMany);if(s.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.howMany++,t.targetPosition=n,[t];if(s.start.hasSameParentAs(e.splitPosition)&&s.containsPosition(e.splitPosition)){let t=new kh(e.splitPosition,s.end);t=t._getTransformedBySplitOperation(e);return pu([new kh(s.start,e.splitPosition),t],n)}t.targetPosition.isEqual(e.splitPosition)&&"insertAtSource"==i.abRelation&&(n=e.moveTargetPosition),t.targetPosition.isEqual(e.insertionPosition)&&"insertBetween"==i.abRelation&&(n=t.targetPosition);const o=[s._getTransformedBySplitOperation(e)];if(e.graveyardPosition){const n=s.start.isEqual(e.graveyardPosition)||s.containsPosition(e.graveyardPosition);t.howMany>1&&n&&!i.aWasUndone&&o.push(kh._createFromPositionAndShift(e.insertionPosition,1))}return pu(o,n)})),au(Gd,iu,((t,e,i)=>{const n=kh._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&n.containsPosition(e.sourcePosition))if("remove"!=t.type||i.forceWeakRemove){if(1==t.howMany)return i.bWasUndone?(t.sourcePosition=e.graveyardPosition.clone(),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]):[new Xd(0)]}else if(!i.aWasUndone){const i=[];let n=e.graveyardPosition.clone(),s=e.targetPosition._getTransformedByMergeOperation(e);t.howMany>1&&(i.push(new Gd(t.sourcePosition,t.howMany-1,t.targetPosition,0)),n=n._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1),s=s._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1));const o=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition),r=new Gd(n,1,o,0),a=r.getMovedRangeStart().path.slice();a.push(0);const l=new ph(r.targetPosition.root,a);s=s._getTransformedByMove(n,o,1);const c=new Gd(s,e.howMany,l,0);return i.push(r),i.push(c),i}const s=kh._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByMergeOperation(e);return t.sourcePosition=s.start,t.howMany=s.end.offset-s.start.offset,t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]})),au(tu,Jd,((t,e)=>(t.position=t.position._getTransformedByInsertOperation(e),[t]))),au(tu,iu,((t,e)=>t.position.isEqual(e.deletionPosition)?(t.position=e.graveyardPosition.clone(),t.position.stickiness="toNext",[t]):(t.position=t.position._getTransformedByMergeOperation(e),[t]))),au(tu,Gd,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),au(tu,tu,((t,e,i)=>{if(t.position.isEqual(e.position)){if(!i.aIsStrong)return[new Xd(0)];t.oldName=e.newName}return[t]})),au(tu,nu,((t,e)=>{if("same"==X(t.position.path,e.splitPosition.getParentPath())&&!e.graveyardPosition){const e=new tu(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}return t.position=t.position._getTransformedBySplitOperation(e),[t]})),au(eu,eu,((t,e,i)=>{if(t.root===e.root&&t.key===e.key){if(!i.aIsStrong||t.newValue===e.newValue)return[new Xd(0)];t.oldValue=e.newValue}return[t]})),au(nu,Jd,((t,e)=>(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset{if(!t.graveyardPosition&&!i.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const i=e.graveyardPosition.path.slice();i.push(0);const n=new ph(e.graveyardPosition.root,i),s=nu.getInsertionPosition(new ph(e.graveyardPosition.root,i)),o=new nu(n,0,s,null,0);return t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=nu.getInsertionPosition(t.splitPosition),t.graveyardPosition=o.insertionPosition.clone(),t.graveyardPosition.stickiness="toNext",[o,t]}return t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)&&t.howMany--,t.splitPosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=nu.getInsertionPosition(t.splitPosition),t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),au(nu,Gd,((t,e,i)=>{const n=kh._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const s=n.start.isEqual(t.graveyardPosition)||n.containsPosition(t.graveyardPosition);if(!i.bWasUndone&&s){const i=t.splitPosition._getTransformedByMoveOperation(e),n=t.graveyardPosition._getTransformedByMoveOperation(e),s=n.path.slice();s.push(0);const o=new ph(n.root,s);return[new Gd(i,t.howMany,o,0)]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}const s=t.splitPosition.isEqual(e.targetPosition);if(s&&("insertAtSource"==i.baRelation||"splitBefore"==i.abRelation))return t.howMany+=e.howMany,t.splitPosition=t.splitPosition._getTransformedByDeletion(e.sourcePosition,e.howMany),t.insertionPosition=nu.getInsertionPosition(t.splitPosition),[t];if(s&&i.abRelation&&i.abRelation.howMany){const{howMany:e,offset:n}=i.abRelation;return t.howMany+=e,t.splitPosition=t.splitPosition.getShiftedBy(n),[t]}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&n.containsPosition(t.splitPosition)){const i=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);return t.howMany-=i,t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition)return[new Xd(0)];if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition))return[new Xd(0)];if("splitBefore"==i.abRelation)return t.howMany=0,t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e),[t]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const n="$graveyard"==t.splitPosition.root.rootName,s="$graveyard"==e.splitPosition.root.rootName;if(s&&!n||!(n&&!s)&&i.aIsStrong){const i=[];return e.howMany&&i.push(new Gd(e.moveTargetPosition,e.howMany,e.splitPosition,0)),t.howMany&&i.push(new Gd(t.splitPosition,t.howMany,t.moveTargetPosition,0)),i}return[new Xd(0)]}if(t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)),t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==i.abRelation)return t.howMany++,[t];if(e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==i.baRelation){const i=e.insertionPosition.path.slice();i.push(0);const n=new ph(e.insertionPosition.root,i);return[t,new Gd(t.insertionPosition,1,n,0)]}return t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset{const i=e[0];i.isDocumentOperation&&_u.call(this,i)}),{priority:"low"})}function _u(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path,this.root=e.root,this.fire("change",t)}}wu.prototype.is=function(t){return"livePosition"===t||"model:livePosition"===t||"position"==t||"model:position"===t};class vu{constructor(t={}){"string"==typeof t&&(t="transparent"===t?{isUndoable:!1}:{},y("batch-constructor-deprecated-string-type"));const{isUndoable:e=!0,isLocal:i=!0,isUndo:n=!1,isTyping:s=!1}=t;this.operations=[],this.isUndoable=e,this.isLocal=i,this.isUndo=n,this.isTyping=s}get type(){return y("batch-type-deprecated"),"default"}get baseVersion(){for(const t of this.operations)if(null!==t.baseVersion)return t.baseVersion;return null}addOperation(t){return t.batch=this,this.operations.push(t),t}}class yu{constructor(t){this._changesInElement=new Map,this._elementSnapshots=new Map,this._changedMarkers=new Map,this._changeCount=0,this._cachedChanges=null,this._cachedChangesWithGraveyard=null,this._refreshedItems=new Set,this._markerCollection=t}get isEmpty(){return 0==this._changesInElement.size&&0==this._changedMarkers.size}bufferOperation(t){const e=t;switch(e.type){case"insert":if(this._isInInsertedElement(e.position.parent))return;this._markInsert(e.position.parent,e.position.offset,e.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const t of e.range.getItems({shallow:!0}))this._isInInsertedElement(t.parent)||this._markAttribute(t);break;case"remove":case"move":case"reinsert":{if(e.sourcePosition.isEqual(e.targetPosition)||e.sourcePosition.getShiftedBy(e.howMany).isEqual(e.targetPosition))return;const t=this._isInInsertedElement(e.sourcePosition.parent),i=this._isInInsertedElement(e.targetPosition.parent);t||this._markRemove(e.sourcePosition.parent,e.sourcePosition.offset,e.howMany),i||this._markInsert(e.targetPosition.parent,e.getMovedRangeStart().offset,e.howMany);break}case"rename":{if(this._isInInsertedElement(e.position.parent))return;this._markRemove(e.position.parent,e.position.offset,1),this._markInsert(e.position.parent,e.position.offset,1);const t=kh._createFromPositionAndShift(e.position,1);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getData();this.bufferMarkerChange(e.name,t,t)}break}case"split":{const t=e.splitPosition.parent;this._isInInsertedElement(t)||this._markRemove(t,e.splitPosition.offset,e.howMany),this._isInInsertedElement(e.insertionPosition.parent)||this._markInsert(e.insertionPosition.parent,e.insertionPosition.offset,1),e.graveyardPosition&&this._markRemove(e.graveyardPosition.parent,e.graveyardPosition.offset,1);break}case"merge":{const t=e.sourcePosition.parent;this._isInInsertedElement(t.parent)||this._markRemove(t.parent,t.startOffset,1);const i=e.graveyardPosition.parent;this._markInsert(i,e.graveyardPosition.offset,1);const n=e.targetPosition.parent;this._isInInsertedElement(n)||this._markInsert(n,e.targetPosition.offset,t.maxOffset);break}}this._cachedChanges=null}bufferMarkerChange(t,e,i){const n=this._changedMarkers.get(t);n?(n.newMarkerData=i,null==n.oldMarkerData.range&&null==i.range&&this._changedMarkers.delete(t)):this._changedMarkers.set(t,{newMarkerData:i,oldMarkerData:e})}getMarkersToRemove(){const t=[];for(const[e,i]of this._changedMarkers)null!=i.oldMarkerData.range&&t.push({name:e,range:i.oldMarkerData.range});return t}getMarkersToAdd(){const t=[];for(const[e,i]of this._changedMarkers)null!=i.newMarkerData.range&&t.push({name:e,range:i.newMarkerData.range});return t}getChangedMarkers(){return Array.from(this._changedMarkers).map((([t,e])=>({name:t,data:{oldRange:e.oldMarkerData.range,newRange:e.newMarkerData.range}})))}hasDataChanges(){if(this._changesInElement.size>0)return!0;for(const{newMarkerData:t,oldMarkerData:e}of this._changedMarkers.values()){if(t.affectsData!==e.affectsData)return!0;if(t.affectsData){const i=t.range&&!e.range,n=!t.range&&e.range,s=t.range&&e.range&&!t.range.isEqual(e.range);if(i||n||s)return!0}}return!1}getChanges(t={}){if(this._cachedChanges)return t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();let e=[];for(const t of this._changesInElement.keys()){const i=this._changesInElement.get(t).sort(((t,e)=>t.offset===e.offset?t.type!=e.type?"remove"==t.type?-1:1:0:t.offsett.position.root!=e.position.root?t.position.root.rootNamet));for(const t of e)delete t.changeCount,"attribute"==t.type&&(delete t.position,delete t.length);return this._changeCount=0,this._cachedChangesWithGraveyard=e,this._cachedChanges=e.filter(xu),t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice()}getRefreshedItems(){return new Set(this._refreshedItems)}reset(){this._changesInElement.clear(),this._elementSnapshots.clear(),this._changedMarkers.clear(),this._refreshedItems=new Set,this._cachedChanges=null}_refreshItem(t){if(this._isInInsertedElement(t.parent))return;this._markRemove(t.parent,t.startOffset,t.offsetSize),this._markInsert(t.parent,t.startOffset,t.offsetSize),this._refreshedItems.add(t);const e=kh._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getData();this.bufferMarkerChange(t.name,e,e)}this._cachedChanges=null}_markInsert(t,e,i){const n={type:"insert",offset:e,howMany:i,count:this._changeCount++};this._markChange(t,n)}_markRemove(t,e,i){const n={type:"remove",offset:e,howMany:i,count:this._changeCount++};this._markChange(t,n),this._removeAllNestedChanges(t,e,i)}_markAttribute(t){const e={type:"attribute",offset:t.startOffset,howMany:t.offsetSize,count:this._changeCount++};this._markChange(t.parent,e)}_markChange(t,e){this._makeSnapshot(t);const i=this._getChangesForElement(t);this._handleChange(e,i),i.push(e);for(let t=0;ti.offset){if(n>s){const t={type:"attribute",offset:s,howMany:n-s,count:this._changeCount++};this._handleChange(t,e),e.push(t)}t.nodesToHandle=i.offset-t.offset,t.howMany=t.nodesToHandle}else t.offset>=i.offset&&t.offsets?(t.nodesToHandle=n-s,t.offset=s):t.nodesToHandle=0);if("remove"==i.type&&t.offseti.offset){const s={type:"attribute",offset:i.offset,howMany:n-i.offset,count:this._changeCount++};this._handleChange(s,e),e.push(s),t.nodesToHandle=i.offset-t.offset,t.howMany=t.nodesToHandle}"attribute"==i.type&&(t.offset>=i.offset&&n<=s?(t.nodesToHandle=0,t.howMany=0,t.offset=0):t.offset<=i.offset&&n>=s&&(i.howMany=0))}}t.howMany=t.nodesToHandle,delete t.nodesToHandle}_getInsertDiff(t,e,i){return{type:"insert",position:ph._createAt(t,e),name:i.name,attributes:new Map(i.attributes),length:1,changeCount:this._changeCount++}}_getRemoveDiff(t,e,i){return{type:"remove",position:ph._createAt(t,e),name:i.name,attributes:new Map(i.attributes),length:1,changeCount:this._changeCount++}}_getAttributesDiff(t,e,i){const n=[];i=new Map(i);for(const[s,o]of e){const e=i.has(s)?i.get(s):null;e!==o&&n.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:s,attributeOldValue:o,attributeNewValue:e,changeCount:this._changeCount++}),i.delete(s)}for(const[e,s]of i)n.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:s,changeCount:this._changeCount++});return n}_isInInsertedElement(t){const e=t.parent;if(!e)return!1;const i=this._changesInElement.get(e),n=t.startOffset;if(i)for(const t of i)if("insert"==t.type&&n>=t.offset&&nn){for(let e=0;ethis._version+1&&this._gaps.set(this._version,t),this._version=t}get lastOperation(){return this._operations[this._operations.length-1]}addOperation(t){if(t.baseVersion!==this.version)throw new v("model-document-history-addoperation-incorrect-version",this,{operation:t,historyVersion:this.version});this._operations.push(t),this._version++,this._baseVersionToOperationIndex.set(t.baseVersion,this._operations.length-1)}getOperations(t,e=this.version){if(!this._operations.length)return[];const i=this._operations[0];void 0===t&&(t=i.baseVersion);let n=e-1;for(const[e,i]of this._gaps)t>e&&te&&nthis.lastOperation.baseVersion)return[];let s=this._baseVersionToOperationIndex.get(t);void 0===s&&(s=0);let o=this._baseVersionToOperationIndex.get(n);return void 0===o&&(o=this._operations.length-1),this._operations.slice(s,o+1)}getOperation(t){const e=this._baseVersionToOperationIndex.get(t);if(void 0!==e)return this._operations[e]}setOperationAsUndone(t,e){this._undoPairs.set(e,t),this._undoneOperations.add(t)}isUndoingOperation(t){return this._undoPairs.has(t)}isUndoneOperation(t){return this._undoneOperations.has(t)}getUndoneOperation(t){return this._undoPairs.get(t)}reset(){this._version=0,this._undoPairs=new Map,this._operations=[],this._undoneOperations=new Set,this._gaps=new Map,this._baseVersionToOperationIndex=new Map}}class Pu extends fh{constructor(t,e,i="main"){super(e),this._document=t,this.rootName=i}get document(){return this._document}toJSON(){return this.rootName}}Pu.prototype.is=function(t,e){return e?e===this.name&&("rootElement"===t||"model:rootElement"===t||"element"===t||"model:element"===t):"rootElement"===t||"model:rootElement"===t||"element"===t||"model:element"===t||"node"===t||"model:node"===t};const Tu="$graveyard";class Eu extends(R()){constructor(t){super(),this.model=t,this.history=new Cu,this.selection=new Fh(this),this.roots=new co({idProperty:"rootName"}),this.differ=new yu(t.markers),this._postFixers=new Set,this._hasSelectionChangedFromTheLastChangeBlock=!1,this.createRoot("$root",Tu),this.listenTo(t,"applyOperation",((t,e)=>{const i=e[0];i.isDocumentOperation&&this.differ.bufferOperation(i)}),{priority:"high"}),this.listenTo(t,"applyOperation",((t,e)=>{const i=e[0];i.isDocumentOperation&&this.history.addOperation(i)}),{priority:"low"}),this.listenTo(this.selection,"change",(()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0})),this.listenTo(t.markers,"update",((t,e,i,n,s)=>{const o={...e.getData(),range:n};this.differ.bufferMarkerChange(e.name,s,o),null===i&&e.on("change",((t,i)=>{const n=e.getData();this.differ.bufferMarkerChange(e.name,{...n,range:i},n)}))}))}get version(){return this.history.version}set version(t){this.history.version=t}get graveyard(){return this.getRoot(Tu)}createRoot(t="$root",e="main"){if(this.roots.get(e))throw new v("model-document-createroot-name-exists",this,{name:e});const i=new Pu(this,t,e);return this.roots.add(i),i}destroy(){this.selection.destroy(),this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(){return Array.from(this.roots,(t=>t.rootName)).filter((t=>t!=Tu))}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=Ar(this);return t.selection="[engine.model.DocumentSelection]",t.model="[engine.model.Model]",t}_handleChangeBlock(t){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(t),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",t.batch):this.fire("change",t.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const t of this.roots)if(t!==this.graveyard)return t;return this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot(),e=this.model,i=e.schema,n=e.createPositionFromPath(t,[0]);return i.getNearestSelectionRange(n)||e.createRange(n)}_validateSelectionRange(t){return Su(t.start)&&Su(t.end)}_callPostFixers(t){let e=!1;do{for(const i of this._postFixers)if(this.selection.refresh(),e=i(t),e)break}while(e)}}function Su(t){const e=t.textNode;if(e){const i=e.data,n=t.offset-e.startOffset;return!po(i,n)&&!wo(i,n)}return!0}class Ru extends(R()){constructor(){super(...arguments),this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){const e=t instanceof Ou?t.name:t;return this._markers.has(e)}get(t){return this._markers.get(t)||null}_set(t,e,i=!1,n=!1){const s=t instanceof Ou?t.name:t;if(s.includes(","))throw new v("markercollection-incorrect-marker-name",this);const o=this._markers.get(s);if(o){const t=o.getData(),r=o.getRange();let a=!1;return r.isEqual(e)||(o._attachLiveRange(Mh.fromRange(e)),a=!0),i!=o.managedUsingOperations&&(o._managedUsingOperations=i,a=!0),"boolean"==typeof n&&n!=o.affectsData&&(o._affectsData=n,a=!0),a&&this.fire(`update:${s}`,o,r,e,t),o}const r=Mh.fromRange(e),a=new Ou(s,r,i,n);return this._markers.set(s,a),this.fire(`update:${s}`,a,null,e,{...a.getData(),range:null}),a}_remove(t){const e=t instanceof Ou?t.name:t,i=this._markers.get(e);return!!i&&(this._markers.delete(e),this.fire(`update:${e}`,i,i.getRange(),null,i.getData()),this._destroyMarker(i),!0)}_refresh(t){const e=t instanceof Ou?t.name:t,i=this._markers.get(e);if(!i)throw new v("markercollection-refresh-marker-not-exists",this);const n=i.getRange();this.fire(`update:${e}`,i,n,n,i.getData())}*getMarkersAtPosition(t){for(const e of this)e.getRange().containsPosition(t)&&(yield e)}*getMarkersIntersectingRange(t){for(const e of this)null!==e.getRange().getIntersection(t)&&(yield e)}destroy(){for(const t of this._markers.values())this._destroyMarker(t);this._markers=null,this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values())e.name.startsWith(t+":")&&(yield e)}_destroyMarker(t){t.stopListening(),t._detachLiveRange()}}class Ou extends(R(lh)){constructor(t,e,i,n){super(),this.name=t,this._liveRange=this._attachLiveRange(e),this._managedUsingOperations=i,this._affectsData=n}get managedUsingOperations(){if(!this._liveRange)throw new v("marker-destroyed",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new v("marker-destroyed",this);return this._affectsData}getData(){return{range:this.getRange(),affectsData:this.affectsData,managedUsingOperations:this.managedUsingOperations}}getStart(){if(!this._liveRange)throw new v("marker-destroyed",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new v("marker-destroyed",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new v("marker-destroyed",this);return this._liveRange.toRange()}_attachLiveRange(t){return this._liveRange&&this._detachLiveRange(),t.delegate("change:range").to(this),t.delegate("change:content").to(this),this._liveRange=t,t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}Ou.prototype.is=function(t){return"marker"===t||"model:marker"===t};class Iu extends zd{constructor(t,e){super(null),this.sourcePosition=t.clone(),this.howMany=e}get type(){return"detach"}toJSON(){const t=super.toJSON();return t.sourcePosition=this.sourcePosition.toJSON(),t}_validate(){if(this.sourcePosition.root.document)throw new v("detach-operation-on-document-node",this)}_execute(){jd(kh._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}class Vu extends lh{constructor(t){super(),this.markers=new Map,this._children=new hh,t&&this._insertChild(0,t)}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}get nextSibling(){return null}get previousSibling(){return null}get root(){return this}get parent(){return null}get document(){return null}getAncestors(){return[]}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const i of t)e=e.getChild(e.offsetToIndex(i));return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children)t.push(e.toJSON());return t}static fromJSON(t){const e=[];for(const i of t)i.name?e.push(fh.fromJSON(i)):e.push(dh.fromJSON(i));return new Vu(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const i=function(t){if("string"==typeof t)return[new dh(t)];tt(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new dh(t):t instanceof uh?new dh(t.data,t.getAttributes()):t))}(e);for(const t of i)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,i)}_removeChildren(t,e=1){const i=this._children._removeNodes(t,e);for(const t of i)t.parent=null;return i}}Vu.prototype.is=function(t){return"documentFragment"===t||"model:documentFragment"===t};class Mu{constructor(t,e){this.model=t,this.batch=e}createText(t,e){return new dh(t,e)}createElement(t,e){return new fh(t,e)}createDocumentFragment(){return new Vu}cloneElement(t,e=!0){return t._clone(e)}insert(t,e,i=0){if(this._assertWriterUsedCorrectly(),t instanceof dh&&""==t.data)return;const n=ph._createAt(e,i);if(t.parent){if(Lu(t.root,n.root))return void this.move(kh._createOn(t),n);if(t.root.document)throw new v("model-writer-insert-forbidden-move",this);this.remove(t)}const s=n.root.document?n.root.document.version:null,o=new Jd(n,t,s);if(t instanceof dh&&(o.shouldReceiveAttributes=!0),this.batch.addOperation(o),this.model.applyOperation(o),t instanceof Vu)for(const[e,i]of t.markers){const t=ph._createAt(i.root,0),s={range:new kh(i.start._getCombined(t,n),i.end._getCombined(t,n)),usingOperation:!0,affectsData:!0};this.model.markers.has(e)?this.updateMarker(e,s):this.addMarker(e,s)}}insertText(t,e,i,n){e instanceof Vu||e instanceof fh||e instanceof ph?this.insert(this.createText(t),e,i):this.insert(this.createText(t,e),i,n)}insertElement(t,e,i,n){e instanceof Vu||e instanceof fh||e instanceof ph?this.insert(this.createElement(t),e,i):this.insert(this.createElement(t,e),i,n)}append(t,e){this.insert(t,e,"end")}appendText(t,e,i){e instanceof Vu||e instanceof fh?this.insert(this.createText(t),e,"end"):this.insert(this.createText(t,e),i,"end")}appendElement(t,e,i){e instanceof Vu||e instanceof fh?this.insert(this.createElement(t),e,"end"):this.insert(this.createElement(t,e),i,"end")}setAttribute(t,e,i){if(this._assertWriterUsedCorrectly(),i instanceof kh){const n=i.getMinimalFlatRanges();for(const i of n)Nu(this,t,e,i)}else Bu(this,t,e,i)}setAttributes(t,e){for(const[i,n]of mo(t))this.setAttribute(i,n,e)}removeAttribute(t,e){if(this._assertWriterUsedCorrectly(),e instanceof kh){const i=e.getMinimalFlatRanges();for(const e of i)Nu(this,t,null,e)}else Bu(this,t,null,e)}clearAttributes(t){this._assertWriterUsedCorrectly();const e=t=>{for(const e of t.getAttributeKeys())this.removeAttribute(e,t)};if(t instanceof kh)for(const i of t.getItems())e(i);else e(t)}move(t,e,i){if(this._assertWriterUsedCorrectly(),!(t instanceof kh))throw new v("writer-move-invalid-range",this);if(!t.isFlat)throw new v("writer-move-range-not-flat",this);const n=ph._createAt(e,i);if(n.isEqual(t.start))return;if(this._addOperationForAffectedMarkers("move",t),!Lu(t.root,n.root))throw new v("writer-move-different-document",this);const s=t.root.document?t.root.document.version:null,o=new Gd(t.start,t.end.offset-t.start.offset,n,s);this.batch.addOperation(o),this.model.applyOperation(o)}remove(t){this._assertWriterUsedCorrectly();const e=(t instanceof kh?t:kh._createOn(t)).getMinimalFlatRanges().reverse();for(const t of e)this._addOperationForAffectedMarkers("move",t),Fu(t.start,t.end.offset-t.start.offset,this.batch,this.model)}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore,i=t.nodeAfter;if(this._addOperationForAffectedMarkers("merge",t),!(e instanceof fh))throw new v("writer-merge-no-element-before",this);if(!(i instanceof fh))throw new v("writer-merge-no-element-after",this);t.root.document?this._merge(t):this._mergeDetached(t)}createPositionFromPath(t,e,i){return this.model.createPositionFromPath(t,e,i)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(...t){return this.model.createSelection(...t)}_mergeDetached(t){const e=t.nodeBefore,i=t.nodeAfter;this.move(kh._createIn(i),ph._createAt(e,"end")),this.remove(i)}_merge(t){const e=ph._createAt(t.nodeBefore,"end"),i=ph._createAt(t.nodeAfter,0),n=t.root.document.graveyard,s=new ph(n,[0]),o=t.root.document.version,r=new iu(i,t.nodeAfter.maxOffset,e,s,o);this.batch.addOperation(r),this.model.applyOperation(r)}rename(t,e){if(this._assertWriterUsedCorrectly(),!(t instanceof fh))throw new v("writer-rename-not-element-instance",this);const i=t.root.document?t.root.document.version:null,n=new tu(ph._createBefore(t),t.name,e,i);this.batch.addOperation(n),this.model.applyOperation(n)}split(t,e){this._assertWriterUsedCorrectly();let i,n,s=t.parent;if(!s.parent)throw new v("writer-split-element-no-parent",this);if(e||(e=s.parent),!t.parent.getAncestors({includeSelf:!0}).includes(e))throw new v("writer-split-invalid-limit-element",this);do{const e=s.root.document?s.root.document.version:null,o=s.maxOffset-t.offset,r=nu.getInsertionPosition(t),a=new nu(t,o,r,null,e);this.batch.addOperation(a),this.model.applyOperation(a),i||n||(i=s,n=t.parent.nextSibling),s=(t=this.createPositionAfter(t.parent)).parent}while(s!==e);return{position:t,range:new kh(ph._createAt(i,"end"),ph._createAt(n,0))}}wrap(t,e){if(this._assertWriterUsedCorrectly(),!t.isFlat)throw new v("writer-wrap-range-not-flat",this);const i=e instanceof fh?e:new fh(e);if(i.childCount>0)throw new v("writer-wrap-element-not-empty",this);if(null!==i.parent)throw new v("writer-wrap-element-attached",this);this.insert(i,t.start);const n=new kh(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(n,ph._createAt(i,0))}unwrap(t){if(this._assertWriterUsedCorrectly(),null===t.parent)throw new v("writer-unwrap-element-no-parent",this);this.move(kh._createIn(t),this.createPositionAfter(t)),this.remove(t)}addMarker(t,e){if(this._assertWriterUsedCorrectly(),!e||"boolean"!=typeof e.usingOperation)throw new v("writer-addmarker-no-usingoperation",this);const i=e.usingOperation,n=e.range,s=void 0!==e.affectsData&&e.affectsData;if(this.model.markers.has(t))throw new v("writer-addmarker-marker-exists",this);if(!n)throw new v("writer-addmarker-no-range",this);return i?(Du(this,t,null,n,s),this.model.markers.get(t)):this.model.markers._set(t,n,i,s)}updateMarker(t,e){this._assertWriterUsedCorrectly();const i="string"==typeof t?t:t.name,n=this.model.markers.get(i);if(!n)throw new v("writer-updatemarker-marker-not-exists",this);if(!e)return y("writer-updatemarker-reconvert-using-editingcontroller",{markerName:i}),void this.model.markers._refresh(n);const s="boolean"==typeof e.usingOperation,o="boolean"==typeof e.affectsData,r=o?e.affectsData:n.affectsData;if(!s&&!e.range&&!o)throw new v("writer-updatemarker-wrong-options",this);const a=n.getRange(),l=e.range?e.range:a;s&&e.usingOperation!==n.managedUsingOperations?e.usingOperation?Du(this,i,null,l,r):(Du(this,i,a,null,r),this.model.markers._set(i,l,void 0,r)):n.managedUsingOperations?Du(this,i,a,l,r):this.model.markers._set(i,l,void 0,r)}removeMarker(t){this._assertWriterUsedCorrectly();const e="string"==typeof t?t:t.name;if(!this.model.markers.has(e))throw new v("writer-removemarker-no-marker",this);const i=this.model.markers.get(e);if(!i.managedUsingOperations)return void this.model.markers._remove(e);Du(this,e,i.getRange(),null,i.affectsData)}setSelection(...t){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(...t)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._setSelectionAttribute(t,e);else for(const[e,i]of mo(t))this._setSelectionAttribute(e,i)}removeSelectionAttribute(t){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._removeSelectionAttribute(t);else for(const e of t)this._removeSelectionAttribute(e)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const i=this.model.document.selection;if(i.isCollapsed&&i.anchor.parent.isEmpty){const n=Fh._getStoreAttributeKey(t);this.setAttribute(n,e,i.anchor.parent)}i._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const i=Fh._getStoreAttributeKey(t);this.removeAttribute(i,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new v("writer-incorrect-use",this)}_addOperationForAffectedMarkers(t,e){for(const i of this.model.markers){if(!i.managedUsingOperations)continue;const n=i.getRange();let s=!1;if("move"===t){const t=e;s=t.containsPosition(n.start)||t.start.isEqual(n.start)||t.containsPosition(n.end)||t.end.isEqual(n.end)}else{const t=e,i=t.nodeBefore,o=t.nodeAfter,r=n.start.parent==i&&n.start.isAtEnd,a=n.end.parent==o&&0==n.end.offset,l=n.end.nodeAfter==o,c=n.start.nodeAfter==o;s=r||a||l||c}s&&this.updateMarker(i.name,{range:n})}}}function Nu(t,e,i,n){const s=t.model,o=s.document;let r,a,l,c=n.start;for(const t of n.getWalker({shallow:!0}))l=t.item.getAttribute(e),r&&a!=l&&(a!=i&&h(),c=r),r=t.nextPosition,a=l;function h(){const n=new kh(c,r),l=n.root.document?o.version:null,h=new Zd(n,e,a,i,l);t.batch.addOperation(h),s.applyOperation(h)}r instanceof ph&&r!=c&&a!=i&&h()}function Bu(t,e,i,n){const s=t.model,o=s.document,r=n.getAttribute(e);let a,l;if(r!=i){if(n.root===n){const t=n.document?o.version:null;l=new eu(n,e,r,i,t)}else{a=new kh(ph._createBefore(n),t.createPositionAfter(n));const s=a.root.document?o.version:null;l=new Zd(a,e,r,i,s)}t.batch.addOperation(l),s.applyOperation(l)}}function Du(t,e,i,n,s){const o=t.model,r=o.document,a=new Qd(e,i,n,o.markers,!!s,r.version);t.batch.addOperation(a),o.applyOperation(a)}function Fu(t,e,i,n){let s;if(t.root.document){const i=n.document,o=new ph(i.graveyard,[0]);s=new Gd(t,e,o,i.version)}else s=new Iu(t,e);i.addOperation(s),n.applyOperation(s)}function Lu(t,e){return t===e||t instanceof Pu&&e instanceof Pu}function zu(t){t.document.registerPostFixer((e=>function(t,e){const i=e.document.selection,n=e.schema,s=[];let o=!1;for(const t of i.getRanges()){const e=Hu(t,n);e&&!e.isEqual(t)?(s.push(e),o=!0):s.push(t)}o&&t.setSelection(function(t){const e=[...t],i=new Set;let n=1;for(;n!i.has(e)))}(s),{backward:i.isBackward});return!1}(e,t)))}function Hu(t,e){return t.isCollapsed?function(t,e){const i=t.start,n=e.getNearestSelectionRange(i);if(!n){const t=i.getAncestors().reverse().find((t=>e.isObject(t)));return t?kh._createOn(t):null}if(!n.isCollapsed)return n;const s=n.start;if(i.isEqual(s))return null;return new kh(s)}(t,e):function(t,e){const{start:i,end:n}=t,s=e.checkChild(i,"$text"),o=e.checkChild(n,"$text"),r=e.getLimitElement(i),a=e.getLimitElement(n);if(r===a){if(s&&o)return null;if(function(t,e,i){const n=t.nodeAfter&&!i.isLimit(t.nodeAfter)||i.checkChild(t,"$text"),s=e.nodeBefore&&!i.isLimit(e.nodeBefore)||i.checkChild(e,"$text");return n||s}(i,n,e)){const t=i.nodeAfter&&e.isSelectable(i.nodeAfter)?null:e.getNearestSelectionRange(i,"forward"),s=n.nodeBefore&&e.isSelectable(n.nodeBefore)?null:e.getNearestSelectionRange(n,"backward"),o=t?t.start:i,r=s?s.end:n;return new kh(o,r)}}const l=r&&!r.is("rootElement"),c=a&&!a.is("rootElement");if(l||c){const t=i.nodeAfter&&n.nodeBefore&&i.nodeAfter.parent===n.nodeBefore.parent,s=l&&(!t||!$u(i.nodeAfter,e)),o=c&&(!t||!$u(n.nodeBefore,e));let h=i,d=n;return s&&(h=ph._createBefore(ju(r,e))),o&&(d=ph._createAfter(ju(a,e))),new kh(h,d)}return null}(t,e)}function ju(t,e){let i=t,n=i;for(;e.isLimit(n)&&n.parent;)i=n,n=n.parent;return i}function $u(t,e){return t&&e.isSelectable(t)}function Wu(t,e,i={}){if(e.isCollapsed)return;const n=e.getFirstRange();if("$graveyard"==n.root.rootName)return;const s=t.schema;t.change((t=>{if(!i.doNotResetEntireContent&&function(t,e){const i=t.getLimitElement(e);if(!e.containsEntireContent(i))return!1;const n=e.getFirstRange();if(n.start.parent==n.end.parent)return!1;return t.checkChild(i,"paragraph")}(s,e))return void function(t,e){const i=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(i)),Gu(t,t.createPositionAt(i,0),e)}(t,e);const o={};if(!i.doNotAutoparagraph){const t=e.getSelectedElement();t&&Object.assign(o,s.getAttributesWithProperty(t,"copyOnReplace",!0))}const[r,a]=function(t){const e=t.root.document.model,i=t.start;let n=t.end;if(e.hasContent(t,{ignoreMarkers:!0})){const i=function(t){const e=t.parent,i=e.root.document.model.schema,n=e.getAncestors({parentFirst:!0,includeSelf:!0});for(const t of n){if(i.isLimit(t))return null;if(i.isBlock(t))return t}}(n);if(i&&n.isTouching(e.createPositionAt(i,0))){const i=e.createSelection(t);e.modifySelection(i,{direction:"backward"});const s=i.getLastPosition(),o=e.createRange(s,n);e.hasContent(o,{ignoreMarkers:!0})||(n=s)}}return[wu.fromPosition(i,"toPrevious"),wu.fromPosition(n,"toNext")]}(n);r.isTouching(a)||t.remove(t.createRange(r,a)),i.leaveUnmerged||(!function(t,e,i){const n=t.model;if(!Ku(t.model.schema,e,i))return;const[s,o]=function(t,e){const i=t.getAncestors(),n=e.getAncestors();let s=0;for(;i[s]&&i[s]==n[s];)s++;return[i[s],n[s]]}(e,i);if(!s||!o)return;!n.hasContent(s,{ignoreMarkers:!0})&&n.hasContent(o,{ignoreMarkers:!0})?Uu(t,e,i,s.parent):qu(t,e,i,s.parent)}(t,r,a),s.removeDisallowedAttributes(r.parent.getChildren(),t)),Ju(t,e,r),!i.doNotAutoparagraph&&function(t,e){const i=t.checkChild(e,"$text"),n=t.checkChild(e,"paragraph");return!i&&n}(s,r)&&Gu(t,r,e,o),r.detach(),a.detach()}))}function qu(t,e,i,n){const s=e.parent,o=i.parent;if(s!=n&&o!=n){for(e=t.createPositionAfter(s),(i=t.createPositionBefore(o)).isEqual(e)||t.insert(o,e),t.merge(e);i.parent.isEmpty;){const e=i.parent;i=t.createPositionBefore(e),t.remove(e)}Ku(t.model.schema,e,i)&&qu(t,e,i,n)}}function Uu(t,e,i,n){const s=e.parent,o=i.parent;if(s!=n&&o!=n){for(e=t.createPositionAfter(s),(i=t.createPositionBefore(o)).isEqual(e)||t.insert(s,i);e.parent.isEmpty;){const i=e.parent;e=t.createPositionBefore(i),t.remove(i)}i=t.createPositionBefore(o),function(t,e){const i=e.nodeBefore,n=e.nodeAfter;i.name!=n.name&&t.rename(i,n.name);t.clearAttributes(i),t.setAttributes(Object.fromEntries(n.getAttributes()),i),t.merge(e)}(t,i),Ku(t.model.schema,e,i)&&Uu(t,e,i,n)}}function Ku(t,e,i){const n=e.parent,s=i.parent;return n!=s&&(!t.isLimit(n)&&!t.isLimit(s)&&function(t,e,i){const n=new kh(t,e);for(const t of n.getWalker())if(i.isLimit(t.item))return!1;return!0}(e,i,t))}function Gu(t,e,i,n={}){const s=t.createElement("paragraph");t.model.schema.setAllowedAttributes(s,n,t),t.insert(s,e),Ju(t,i,t.createPositionAt(s,0))}function Ju(t,e,i){e instanceof Fh?t.setSelection(i):e.setTo(i)}function Qu(t,e){const i=[];Array.from(t.getItems({direction:"backward"})).map((t=>e.createRangeOn(t))).filter((e=>(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end)))).forEach((t=>{i.push(t.start.parent),e.remove(t)})),i.forEach((t=>{let i=t;for(;i.parent&&i.isEmpty;){const t=e.createRangeOn(i);i=i.parent,e.remove(t)}}))}class Yu{constructor(t,e,i){this._firstNode=null,this._lastNode=null,this._lastAutoParagraph=null,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null,this._nodeToSelect=null,this.model=t,this.writer=e,this.position=i,this.canMergeWith=new Set([this.position.parent]),this.schema=t.schema,this._documentFragment=e.createDocumentFragment(),this._documentFragmentPosition=e.createPositionAt(this._documentFragment,0)}handleNodes(t){for(const e of Array.from(t))this._handleNode(e);this._insertPartialFragment(),this._lastAutoParagraph&&this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph),this._mergeOnRight(),this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer),this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(t){const e=this.writer.createPositionAfter(this._lastNode),i=this.writer.createPositionAfter(t);if(i.isAfter(e)){if(this._lastNode=t,this.position.parent!=t||!this.position.isAtEnd)throw new v("insertcontent-invalid-insertion-position",this);this.position=i,this._setAffectedBoundaries(this.position)}}getSelectionRange(){return this._nodeToSelect?kh._createOn(this._nodeToSelect):this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){return this._affectedStart?new kh(this._affectedStart,this._affectedEnd):null}destroy(){this._affectedStart&&this._affectedStart.detach(),this._affectedEnd&&this._affectedEnd.detach()}_handleNode(t){if(this.schema.isObject(t))return void this._handleObject(t);let e=this._checkAndAutoParagraphToAllowedPosition(t);e||(e=this._checkAndSplitToAllowedPosition(t),e)?(this._appendToFragment(t),this._firstNode||(this._firstNode=t),this._lastNode=t):this._handleDisallowedNode(t)}_insertPartialFragment(){if(this._documentFragment.isEmpty)return;const t=wu.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position),this._documentFragment.getChild(0)==this._firstNode&&(this.writer.insert(this._firstNode,this.position),this._mergeOnLeft(),this.position=t.toPosition()),this._documentFragment.isEmpty||this.writer.insert(this._documentFragment,this.position),this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0),this.position=t.toPosition(),t.detach()}_handleObject(t){this._checkAndSplitToAllowedPosition(t)?this._appendToFragment(t):this._tryAutoparagraphing(t)}_handleDisallowedNode(t){t.is("element")?this.handleNodes(t.getChildren()):this._tryAutoparagraphing(t)}_appendToFragment(t){if(!this.schema.checkChild(this.position,t))throw new v("insertcontent-wrong-position",this,{node:t,position:this.position});this.writer.insert(t,this._documentFragmentPosition),this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(t.offsetSize),this.schema.isObject(t)&&!this.schema.checkChild(this.position,"$text")?this._nodeToSelect=t:this._nodeToSelect=null,this._filterAttributesOf.push(t)}_setAffectedBoundaries(t){this._affectedStart||(this._affectedStart=wu.fromPosition(t,"toPrevious")),this._affectedEnd&&!this._affectedEnd.isBefore(t)||(this._affectedEnd&&this._affectedEnd.detach(),this._affectedEnd=wu.fromPosition(t,"toNext"))}_mergeOnLeft(){const t=this._firstNode;if(!(t instanceof fh))return;if(!this._canMergeLeft(t))return;const e=wu._createBefore(t);e.stickiness="toNext";const i=wu.fromPosition(this.position,"toNext");this._affectedStart.isEqual(e)&&(this._affectedStart.detach(),this._affectedStart=wu._createAt(e.nodeBefore,"end","toPrevious")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode&&(this._affectedEnd.detach(),this._affectedEnd=wu._createAt(e.nodeBefore,"end","toNext")),this.position=i.toPosition(),i.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_mergeOnRight(){const t=this._lastNode;if(!(t instanceof fh))return;if(!this._canMergeRight(t))return;const e=wu._createAfter(t);if(e.stickiness="toNext",!this.position.isEqual(e))throw new v("insertcontent-invalid-insertion-position",this);this.position=ph._createAt(e.nodeBefore,"end");const i=wu.fromPosition(this.position,"toPrevious");this._affectedEnd.isEqual(e)&&(this._affectedEnd.detach(),this._affectedEnd=wu._createAt(e.nodeBefore,"end","toNext")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode&&(this._affectedStart.detach(),this._affectedStart=wu._createAt(e.nodeBefore,0,"toPrevious")),this.position=i.toPosition(),i.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_canMergeLeft(t){const e=t.previousSibling;return e instanceof fh&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(e,t)}_canMergeRight(t){const e=t.nextSibling;return e instanceof fh&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(t,e)}_tryAutoparagraphing(t){const e=this.writer.createElement("paragraph");this._getAllowedIn(this.position.parent,e)&&this.schema.checkChild(e,t)&&(e._appendChild(t),this._handleNode(e))}_checkAndAutoParagraphToAllowedPosition(t){if(this.schema.checkChild(this.position.parent,t))return!0;if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",t))return!1;this._insertPartialFragment();const e=this.writer.createElement("paragraph");return this.writer.insert(e,this.position),this._setAffectedBoundaries(this.position),this._lastAutoParagraph=e,this.position=this.writer.createPositionAt(e,0),!0}_checkAndSplitToAllowedPosition(t){const e=this._getAllowedIn(this.position.parent,t);if(!e)return!1;for(e!=this.position.parent&&this._insertPartialFragment();e!=this.position.parent;)if(this.position.isAtStart){const t=this.position.parent;this.position=this.writer.createPositionBefore(t),t.isEmpty&&t.parent===e&&this.writer.remove(t)}else if(this.position.isAtEnd)this.position=this.writer.createPositionAfter(this.position.parent);else{const t=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position),this.writer.split(this.position),this.position=t,this.canMergeWith.add(this.position.nodeAfter)}return!0}_getAllowedIn(t,e){return this.schema.checkChild(t,e)?t:this.schema.isLimit(t)?null:this._getAllowedIn(t.parent,e)}}function Zu(t,e,i="auto"){const n=t.getSelectedElement();if(n&&e.schema.isObject(n)&&!e.schema.isInline(n))return"before"==i||"after"==i?e.createRange(e.createPositionAt(n,i)):e.createRangeOn(n);const s=ho(t.getSelectedBlocks());if(!s)return e.createRange(t.focus);if(s.isEmpty)return e.createRange(e.createPositionAt(s,0));const o=e.createPositionAfter(s);return t.focus.isTouching(o)?e.createRange(o):e.createRange(e.createPositionBefore(s))}function Xu(t,e,i,n,s={}){if(!t.schema.isObject(e))throw new v("insertobject-element-not-an-object",t,{object:e});let o;o=i?i instanceof Sh||i instanceof Fh?i:t.createSelection(i,n):t.document.selection;let r=o;s.findOptimalPosition&&t.schema.isBlock(e)&&(r=t.createSelection(Zu(o,t,s.findOptimalPosition)));const a=ho(o.getSelectedBlocks()),l={};return a&&Object.assign(l,t.schema.getAttributesWithProperty(a,"copyOnReplace",!0)),t.change((i=>{r.isCollapsed||t.deleteContent(r,{doNotAutoparagraph:!0});let n=e;const o=r.anchor.parent;!t.schema.checkChild(o,e)&&t.schema.checkChild(o,"paragraph")&&t.schema.checkChild("paragraph",e)&&(n=i.createElement("paragraph"),i.insert(e,n)),t.schema.setAllowedAttributes(n,l,i);const a=t.insertContent(n,r);return a.isCollapsed||s.setSelection&&function(t,e,i,n){const s=t.model;if("on"==i)return void t.setSelection(e,"on");if("after"!=i)throw new v("insertobject-invalid-place-parameter-value",s);let o=e.nextSibling;if(s.schema.isInline(e))return void t.setSelection(e,"after");const r=o&&s.schema.checkChild(o,"$text");!r&&s.schema.checkChild(e.parent,"paragraph")&&(o=t.createElement("paragraph"),s.schema.setAllowedAttributes(o,n,t),s.insertContent(o,t.createPositionAfter(e)));o&&t.setSelection(o,0)}(i,e,s.setSelection,l),a}))}const tf=' ,.?!:;"-()';function ef(t,e){const{isForward:i,walker:n,unit:s,schema:o,treatEmojiAsSingleUnit:r}=t,{type:a,item:l,nextPosition:c}=e;if("text"==a)return"word"===t.unit?function(t,e){let i=t.position.textNode;i||(i=e?t.position.nodeAfter:t.position.nodeBefore);for(;i&&i.is("$text");){const n=t.position.offset-i.startOffset;if(of(i,n,e))i=e?t.position.nodeAfter:t.position.nodeBefore;else{if(sf(i.data,n,e))break;t.next()}}return t.position}(n,i):function(t,e,i){const n=t.position.textNode;if(n){const s=n.data;let o=t.position.offset-n.startOffset;for(;po(s,o)||"character"==e&&wo(s,o)||i&&_o(s,o);)t.next(),o=t.position.offset-n.startOffset}return t.position}(n,s,r);if(a==(i?"elementStart":"elementEnd")){if(o.isSelectable(l))return ph._createAt(l,i?"after":"before");if(o.checkChild(c,"$text"))return c}else{if(o.isLimit(l))return void n.skip((()=>!0));if(o.checkChild(c,"$text"))return c}}function nf(t,e){const i=t.root,n=ph._createAt(i,e?"end":0);return e?new kh(t,n):new kh(n,t)}function sf(t,e,i){const n=e+(i?0:-1);return tf.includes(t.charAt(n))}function of(t,e,i){return e===(i?t.offsetSize:0)}class rf extends(q()){constructor(){super(),this.markers=new Ru,this.document=new Eu(this),this.schema=new bd,this._pendingChanges=[],this._currentWriter=null,["insertContent","insertObject","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach((t=>this.decorate(t))),this.on("applyOperation",((t,e)=>{e[0]._validate()}),{priority:"highest"}),this.schema.register("$root",{isLimit:!0}),this.schema.register("$container",{allowIn:["$root","$container"]}),this.schema.register("$block",{allowIn:["$root","$container"],isBlock:!0}),this.schema.register("$blockObject",{allowWhere:"$block",isBlock:!0,isObject:!0}),this.schema.register("$inlineObject",{allowWhere:"$text",allowAttributesOf:"$text",isInline:!0,isObject:!0}),this.schema.register("$text",{allowIn:"$block",isInline:!0,isContent:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$documentFragment",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$marker"),this.schema.addChildCheck(((t,e)=>{if("$marker"===e.name)return!0})),zu(this),this.document.registerPostFixer(sd)}change(t){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new vu,callback:t}),this._runPendingChanges()[0]):t(this._currentWriter)}catch(t){v.rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{t?"function"==typeof t?(e=t,t=new vu):t instanceof vu||(t=new vu(t)):t=new vu,this._pendingChanges.push({batch:t,callback:e}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(t){v.rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,i){return function(t,e,i,n){return t.change((s=>{let o;o=i?i instanceof Sh||i instanceof Fh?i:s.createSelection(i,n):t.document.selection,o.isCollapsed||t.deleteContent(o,{doNotAutoparagraph:!0});const r=new Yu(t,s,o.anchor),a=[];let l;if(e.is("documentFragment")){if(e.markers.size){const t=[];for(const[i,n]of e.markers){const{start:e,end:s}=n,o=e.isEqual(s);t.push({position:e,name:i,isCollapsed:o},{position:s,name:i,isCollapsed:o})}t.sort((({position:t},{position:e})=>t.isBefore(e)?1:-1));for(const{position:i,name:n,isCollapsed:o}of t){let t=null,r=null;const l=i.parent===e&&i.isAtStart,c=i.parent===e&&i.isAtEnd;l||c?o&&(r=l?"start":"end"):(t=s.createElement("$marker"),s.insert(t,i)),a.push({name:n,element:t,collapsed:r})}}l=e.getChildren()}else l=[e];r.handleNodes(l);let c=r.getSelectionRange();if(e.is("documentFragment")&&a.length){const t=c?Mh.fromRange(c):null,e={};for(let t=a.length-1;t>=0;t--){const{name:i,element:n,collapsed:o}=a[t],l=!e[i];if(l&&(e[i]=[]),n){const t=s.createPositionAt(n,"before");e[i].push(t),s.remove(n)}else{const t=r.getAffectedRange();if(!t){o&&e[i].push(r.position);continue}o?e[i].push(t[o]):e[i].push(l?t.start:t.end)}}for(const[t,[i,n]]of Object.entries(e))i&&n&&i.root===n.root&&s.addMarker(t,{usingOperation:!0,affectsData:!0,range:new kh(i,n)});t&&(c=t.toRange(),t.detach())}c&&(o instanceof Fh?s.setSelection(c):o.setTo(c));const h=r.getAffectedRange()||t.createRange(o.anchor);return r.destroy(),h}))}(this,t,e,i)}insertObject(t,e,i,n){return Xu(this,t,e,i,n)}deleteContent(t,e){Wu(this,t,e)}modifySelection(t,e){!function(t,e,i={}){const n=t.schema,s="backward"!=i.direction,o=i.unit?i.unit:"character",r=!!i.treatEmojiAsSingleUnit,a=e.focus,l=new mh({boundaries:nf(a,s),singleCharacters:!0,direction:s?"forward":"backward"}),c={walker:l,schema:n,isForward:s,unit:o,treatEmojiAsSingleUnit:r};let h;for(;h=l.next();){if(h.done)return;const i=ef(c,h.value);if(i)return void(e instanceof Fh?t.change((t=>{t.setSelectionFocus(i)})):e.setFocus(i))}}(this,t,e)}getSelectedContent(t){return function(t,e){return t.change((t=>{const i=t.createDocumentFragment(),n=e.getFirstRange();if(!n||n.isCollapsed)return i;const s=n.start.root,o=n.start.getCommonPath(n.end),r=s.getNodeByPath(o);let a;a=n.start.parent==n.end.parent?n:t.createRange(t.createPositionAt(r,n.start.path[o.length]),t.createPositionAt(r,n.end.path[o.length]+1));const l=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:!0}))e.is("$textProxy")?t.appendText(e.data,e.getAttributes(),i):t.append(t.cloneElement(e,!0),i);if(a!=n){const e=n._getTransformedByMove(a.start,t.createPositionAt(i,0),l)[0],s=t.createRange(t.createPositionAt(i,0),e.start);Qu(t.createRange(e.end,t.createPositionAt(i,"end")),t),Qu(s,t)}return i}))}(this,t)}hasContent(t,e={}){const i=t instanceof kh?t:kh._createIn(t);if(i.isCollapsed)return!1;const{ignoreWhitespaces:n=!1,ignoreMarkers:s=!1}=e;if(!s)for(const t of this.markers.getMarkersIntersectingRange(i))if(t.affectsData)return!0;for(const t of i.getItems())if(this.schema.isContent(t)){if(!t.is("$textProxy"))return!0;if(!n)return!0;if(-1!==t.data.search(/\S/))return!0}return!1}createPositionFromPath(t,e,i){return new ph(t,e,i)}createPositionAt(t,e){return ph._createAt(t,e)}createPositionAfter(t){return ph._createAfter(t)}createPositionBefore(t){return ph._createBefore(t)}createRange(t,e){return new kh(t,e)}createRangeIn(t){return kh._createIn(t)}createRangeOn(t){return kh._createOn(t)}createSelection(...t){return new Sh(...t)}createBatch(t){return new vu(t)}createOperationFromJSON(t){return ou.fromJSON(t,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const t=[];this.fire("_beforeChanges");try{for(;this._pendingChanges.length;){const e=this._pendingChanges[0].batch;this._currentWriter=new Mu(this,e);const i=this._pendingChanges[0].callback(this._currentWriter);t.push(i),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}}finally{this._pendingChanges.length=0,this._currentWriter=null,this.fire("_afterChanges")}return t}}class af extends Jl{constructor(t){super(t),this.domEventType="click"}onDomEvent(t){this.fire(t.type,t)}}class lf extends Jl{constructor(t){super(t),this.domEventType=["mousedown","mouseup","mouseover","mouseout"]}onDomEvent(t){this.fire(t.type,t)}}class cf{constructor(t){this.document=t}createDocumentFragment(t){return new hl(this.document,t)}createElement(t,e,i){return new Va(this.document,t,e,i)}createText(t){return new Cr(this.document,t)}clone(t,e=!1){return t._clone(e)}appendChild(t,e){return e._appendChild(t)}insertChild(t,e,i){return i._insertChild(t,e)}removeChildren(t,e,i){return i._removeChildren(t,e)}remove(t){const e=t.parent;return e?this.removeChildren(e.getChildIndex(t),1,e):[]}replace(t,e){const i=t.parent;if(i){const n=i.getChildIndex(t);return this.removeChildren(n,1,i),this.insertChild(n,e,i),!0}return!1}unwrapElement(t){const e=t.parent;if(e){const i=e.getChildIndex(t);this.remove(t),this.insertChild(i,t.getChildren(),e)}}rename(t,e){const i=new Va(this.document,t,e.getAttributes(),e.getChildren());return this.replace(e,i)?i:null}setAttribute(t,e,i){i._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,i){St(t)&&void 0===i?e._setStyle(t):i._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,i){i._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}createPositionAt(t,e){return Ha._createAt(t,e)}createPositionAfter(t){return Ha._createAfter(t)}createPositionBefore(t){return Ha._createBefore(t)}createRange(t,e){return new ja(t,e)}createRangeOn(t){return ja._createOn(t)}createRangeIn(t){return ja._createIn(t)}createSelection(...t){return new Wa(...t)}}new Set(["black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","orange","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","activeborder","activecaption","appworkspace","background","buttonface","buttonhighlight","buttonshadow","buttontext","captiontext","graytext","highlight","highlighttext","inactiveborder","inactivecaption","inactivecaptiontext","infobackground","infotext","menu","menutext","scrollbar","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","window","windowframe","windowtext","rebeccapurple","currentcolor","transparent"]);const hf=/^([+-]?[0-9]*([.][0-9]+)?(px|cm|mm|in|pc|pt|ch|em|ex|rem|vh|vw|vmin|vmax)|0)$/;const df=/^[+-]?[0-9]*([.][0-9]+)?%$/;function uf(t=""){if(""===t)return{top:void 0,right:void 0,bottom:void 0,left:void 0};const e=t.replace(/, /g,",").split(" ").map((t=>t.replace(/,/g,", ")));const i=e[0],n=e[2]||i,s=e[1]||i;return{top:i,bottom:n,right:s,left:e[3]||s}}function ff({top:t,right:e,bottom:i,left:n}){const s=[];return n!==e?s.push(t,e,i,n):i!==t?s.push(t,e,i):e!==t?s.push(t,e):s.push(t),s.join(" ")}function mf(t){var e,i;t.setNormalizer("margin",(e="margin",t=>({path:e,value:uf(t)}))),t.setNormalizer("margin-top",(t=>({path:"margin.top",value:t}))),t.setNormalizer("margin-right",(t=>({path:"margin.right",value:t}))),t.setNormalizer("margin-bottom",(t=>({path:"margin.bottom",value:t}))),t.setNormalizer("margin-left",(t=>({path:"margin.left",value:t}))),t.setReducer("margin",(i="margin",t=>{const{top:e,right:n,bottom:s,left:o}=t,r=[];return[e,n,o,s].every((t=>!!t))?r.push([i,ff(t)]):(e&&r.push([i+"-top",e]),n&&r.push([i+"-right",n]),s&&r.push([i+"-bottom",s]),o&&r.push([i+"-left",o])),r})),t.setStyleRelation("margin",["margin-top","margin-right","margin-bottom","margin-left"])}class gf{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const i=this.get(t);if(!i)throw new v("commandcollection-command-not-found",this,{commandName:t});return i.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands())t.destroy()}}class pf extends fo{constructor(t){super(),this.editor=t}set(t,e,i={}){if("string"==typeof e){const t=e;e=(e,i)=>{this.editor.execute(t),i()}}super.set(t,e,i)}}class wf extends(q()){constructor(t={}){super();const e=this.constructor,i=t.language||e.defaultConfig&&e.defaultConfig.language;this._context=t.context||new mr({language:i}),this._context._addEditor(this,!t.context);const n=Array.from(e.builtinPlugins||[]);this.config=new hs(t,e.defaultConfig),this.config.define("plugins",n),this.config.define(this._context._getEditorConfig()),this.plugins=new fr(this,n,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this._readOnlyLocks=new Set,this.commands=new gf,this.set("state","initializing"),this.once("ready",(()=>this.state="ready"),{priority:"high"}),this.once("destroy",(()=>this.state="destroyed"),{priority:"high"}),this.model=new rf;const s=new Ra;this.data=new Bd(this.model,s),this.editing=new md(this.model,s),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new Dd([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher),this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher),this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher),this.keystrokes=new pf(this),this.keystrokes.listenTo(this.editing.view.document)}get isReadOnly(){return this._readOnlyLocks.size>0}set isReadOnly(t){throw new v("editor-isreadonly-has-no-setter")}enableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new v("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)||(this._readOnlyLocks.add(t),1===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!0,!1))}disableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new v("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)&&(this._readOnlyLocks.delete(t),0===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!1,!0))}initPlugins(){const t=this.config,e=t.get("plugins"),i=t.get("removePlugins")||[],n=t.get("extraPlugins")||[],s=t.get("substitutePlugins")||[];return this.plugins.init(e.concat(n),i,s)}destroy(){let t=Promise.resolve();return"initializing"==this.state&&(t=new Promise((t=>this.once("ready",t)))),t.then((()=>{this.fire("destroy"),this.stopListening(),this.commands.destroy()})).then((()=>this.plugins.destroy())).then((()=>{this.model.destroy(),this.data.destroy(),this.editing.destroy(),this.keystrokes.destroy()})).then((()=>this._context._removeEditor(this)))}execute(t,...e){try{return this.commands.execute(t,...e)}catch(t){v.rethrowUnexpectedError(t,this)}}focus(){this.editing.view.focus()}}function bf(t){return class extends t{setData(t){this.data.set(t)}getData(t){return this.data.get(t)}}}{const t=bf(Object);bf.setData=t.prototype.setData,bf.getData=t.prototype.getData}function _f(t){return class extends t{updateSourceElement(t=this.data.get()){if(!this.sourceElement)throw new v("editor-missing-sourceelement",this);const e=this.config.get("updateSourceElementOnDestroy"),i=this.sourceElement instanceof HTMLTextAreaElement;Os(this.sourceElement,e||i?t:"")}}}_f.updateSourceElement=_f(Object).prototype.updateSourceElement;class vf extends gr{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new co({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(t){if("string"!=typeof t)throw new v("pendingactions-add-invalid-message",this);const e=new(q());return e.set("message",t),this._actions.add(e),this.hasAny=!0,e}remove(t){this._actions.remove(t),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}const yf={bold:'',cancel:'',caption:'',check:'',cog:'',eraser:'',image:'',lowVision:'',importExport:'',paragraph:'',plus:'',text:'',alignBottom:'',alignMiddle:'',alignTop:'',alignLeft:'',alignCenter:'',alignRight:'',alignJustify:'',objectLeft:'',objectCenter:'',objectRight:'',objectFullWidth:'',objectInline:'',objectBlockLeft:'',objectBlockRight:'',objectSizeFull:'',objectSizeLarge:'',objectSizeSmall:'',objectSizeMedium:'',pencil:'',pilcrow:'',quote:'',threeVerticalDots:''},{threeVerticalDots:kf}=yf,Af={alignLeft:yf.alignLeft,bold:yf.bold,importExport:yf.importExport,paragraph:yf.paragraph,plus:yf.plus,text:yf.text,threeVerticalDots:yf.threeVerticalDots};class xf extends yo{constructor(t,e){super(t);const i=this.bindTemplate,n=this.t;this.options=e||{},this.set("ariaLabel",n("Editor toolbar")),this.set("maxWidth","auto"),this.items=this.createCollection(),this.focusTracker=new uo,this.keystrokes=new fo,this.set("class",void 0),this.set("isCompact",!1),this.itemsView=new Cf(t),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection();const s="rtl"===t.uiLanguageDirection;this._focusCycler=new nr({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:[s?"arrowright":"arrowleft","arrowup"],focusNext:[s?"arrowleft":"arrowright","arrowdown"]}});const o=["ck","ck-toolbar",i.to("class"),i.if("isCompact","ck-toolbar_compact")];var r;this.options.shouldGroupWhenFull&&this.options.isFloating&&o.push("ck-toolbar_floating"),this.setTemplate({tag:"div",attributes:{class:o,role:"toolbar","aria-label":i.to("ariaLabel"),style:{maxWidth:i.to("maxWidth")}},children:this.children,on:{mousedown:(r=this,r.bindTemplate.to((t=>{t.target===r.element&&t.preventDefault()})))}}),this._behavior=this.options.shouldGroupWhenFull?new Tf(this):new Pf(this)}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element),this._behavior.render(this)}destroy(){return this._behavior.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy(),super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e,i){this.items.addMany(this._buildItemsFromConfig(t,e,i))}_buildItemsFromConfig(t,e,i){const n=ar(t),s=i||n.removeItems;return this._cleanItemsConfiguration(n.items,e,s).map((t=>F(t)?this._createNestedToolbarDropdown(t,e,s):"|"===t?new or:"-"===t?new rr:e.create(t))).filter((t=>!!t))}_cleanItemsConfiguration(t,e,i){const n=t.filter(((t,n,s)=>"|"===t||-1===i.indexOf(t)&&("-"===t?!this.options.shouldGroupWhenFull||(y("toolbarview-line-break-ignored-when-grouping-items",s),!1):!(!F(t)&&!e.has(t))||(y("toolbarview-item-unavailable",{item:t}),!1))));return this._cleanSeparatorsAndLineBreaks(n)}_cleanSeparatorsAndLineBreaks(t){const e=t=>"-"!==t&&"|"!==t,i=t.length,n=t.findIndex(e);if(-1===n)return[];const s=i-t.slice().reverse().findIndex(e);return t.slice(n,s).filter(((t,i,n)=>{if(e(t))return!0;return!(i>0&&n[i-1]===t)}))}_createNestedToolbarDropdown(t,e,i){let{label:n,icon:s,items:o,tooltip:r=!0,withText:a=!1}=t;if(o=this._cleanItemsConfiguration(o,e,i),!o.length)return null;const l=Of(this.locale);return n||y("toolbarview-nested-toolbar-dropdown-missing-label",t),l.class="ck-toolbar__nested-toolbar-dropdown",l.buttonView.set({label:n,tooltip:r,withText:!!a}),!1!==s?l.buttonView.icon=Af[s]||s||kf:l.buttonView.withText=!0,If(l,(()=>l.toolbarView._buildItemsFromConfig(o,e,i))),l}}class Cf extends yo{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class Pf{constructor(t){const e=t.bindTemplate;t.set("isVertical",!1),t.itemsView.children.bindTo(t.items).using((t=>t)),t.focusables.bindTo(t.items).using((t=>t)),t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class Tf{constructor(t){this.view=t,this.viewChildren=t.children,this.viewFocusables=t.focusables,this.viewItemsView=t.itemsView,this.viewFocusTracker=t.focusTracker,this.viewLocale=t.locale,this.ungroupedItems=t.createCollection(),this.groupedItems=t.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),this.resizeObserver=null,this.cachedPadding=null,this.shouldUpdateGroupingOnNextResize=!1,t.itemsView.children.bindTo(this.ungroupedItems).using((t=>t)),this.ungroupedItems.on("change",this._updateFocusCycleableItems.bind(this)),t.children.on("change",this._updateFocusCycleableItems.bind(this)),t.items.on("change",((t,e)=>{const i=e.index,n=Array.from(e.added);for(const t of e.removed)i>=this.ungroupedItems.length?this.groupedItems.remove(t):this.ungroupedItems.remove(t);for(let t=i;tthis.ungroupedItems.length?this.groupedItems.add(e,t-this.ungroupedItems.length):this.ungroupedItems.add(e,t)}this._updateGrouping()})),t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element,this._enableGroupingOnResize(),this._enableGroupingOnMaxWidthChange(t)}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;if(!Bs(this.viewElement))return void(this.shouldUpdateGroupingOnNextResize=!0);const t=this.groupedItems.length;let e;for(;this._areItemsOverflowing;)this._groupLastItem(),e=!0;if(!e&&this.groupedItems.length){for(;this.groupedItems.length&&!this._areItemsOverflowing;)this._ungroupFirstItem();this._areItemsOverflowing&&this._groupLastItem()}this.groupedItems.length!==t&&this.view.fire("groupedItemsUpdate")}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const t=this.viewElement,e=this.viewLocale.uiLanguageDirection,i=new Ps(t.lastChild),n=new Ps(t);if(!this.cachedPadding){const i=vs.window.getComputedStyle(t),n="ltr"===e?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(i[n])}return"ltr"===e?i.right>n.right-this.cachedPadding:i.left{t&&t===e.contentRect.width&&!this.shouldUpdateGroupingOnNextResize||(this.shouldUpdateGroupingOnNextResize=!1,this._updateGrouping(),t=e.contentRect.width)})),this._updateGrouping()}_enableGroupingOnMaxWidthChange(t){t.on("change:maxWidth",(()=>{this._updateGrouping()}))}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new or),this.viewChildren.add(this.groupedItemsDropdown),this.viewFocusTracker.add(this.groupedItemsDropdown.element)),this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)),this.groupedItems.length||(this.viewChildren.remove(this.groupedItemsDropdown),this.viewChildren.remove(this.viewChildren.last),this.viewFocusTracker.remove(this.groupedItemsDropdown.element))}_createGroupedItemsDropdown(){const t=this.viewLocale,e=t.t,i=Of(t);return i.class="ck-toolbar__grouped-dropdown",i.panelPosition="ltr"===t.uiLanguageDirection?"sw":"se",If(i,this.groupedItems),i.buttonView.set({label:e("Show more items"),tooltip:!0,tooltipPosition:"rtl"===t.uiLanguageDirection?"se":"sw",icon:kf}),i}_updateFocusCycleableItems(){this.viewFocusables.clear(),this.ungroupedItems.map((t=>{this.viewFocusables.add(t)})),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}class Ef extends yo{constructor(t){super(t);const e=this.bindTemplate;this.items=this.createCollection(),this.focusTracker=new uo,this.keystrokes=new fo,this._focusCycler=new nr({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this.set("ariaLabel",void 0),this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"],"aria-label":e.to("ariaLabel")},children:this.items})}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}class Sf extends yo{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!0),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item",e.if("isVisible","ck-hidden",(t=>!t))]},children:this.children})}focus(){this.children.first.focus()}}class Rf extends yo{constructor(t){super(t),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}function Of(t,e=tr){const n=new e(t),s=new ir(t),o=new Zo(t,n,s);return n.bind("isEnabled").to(o),n instanceof er?n.arrowView.bind("isOn").to(o,"isOpen"):n.bind("isOn").to(o,"isOpen"),function(t){(function(t){t.on("render",(()=>{i({emitter:t,activator:()=>t.isOpen,callback:()=>{t.isOpen=!1},contextElements:[t.element]})}))})(t),function(t){t.on("execute",(e=>{e.source instanceof Uo||(t.isOpen=!1)}))}(t),function(t){t.focusTracker.on("change:isFocused",((e,i,n)=>{t.isOpen&&!n&&(t.isOpen=!1)}))}(t),function(t){t.keystrokes.set("arrowdown",((e,i)=>{t.isOpen&&(t.panelView.focus(),i())})),t.keystrokes.set("arrowup",((e,i)=>{t.isOpen&&(t.panelView.focusLast(),i())}))}(t),function(t){t.on("change:isOpen",((e,i,n)=>{if(n)return;const s=t.panelView.element;s&&s.contains(vs.document.activeElement)&&t.buttonView.focus()}))}(t),function(t){t.on("change:isOpen",((e,i,n)=>{n&&t.panelView.focus()}),{priority:"low"})}(t)}(o),o}function If(t,e,i={}){t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),t.isOpen?Vf(t,e,i):t.once("change:isOpen",(()=>Vf(t,e,i)),{priority:"highest"}),i.enableActiveItemFocusOnDropdownOpen&&Bf(t,(()=>t.toolbarView.items.find((t=>t.isOn))))}function Vf(t,e,i){const n=t.locale,s=n.t,o=t.toolbarView=new xf(n),r="function"==typeof e?e():e;o.ariaLabel=i.ariaLabel||s("Dropdown toolbar"),i.maxWidth&&(o.maxWidth=i.maxWidth),i.class&&(o.class=i.class),i.isCompact&&(o.isCompact=i.isCompact),i.isVertical&&(o.isVertical=!0),r instanceof vo?o.items.bindTo(r).using((t=>t)):o.items.addMany(r),t.panelView.children.add(o),o.items.delegate("execute").to(t)}function Mf(t,e,i={}){t.isOpen?Nf(t,e,i):t.once("change:isOpen",(()=>Nf(t,e,i)),{priority:"highest"}),Bf(t,(()=>t.listView.items.find((t=>t instanceof Sf&&t.children.first.isOn))))}function Nf(t,e,i){const n=t.locale,s=t.listView=new Ef(n),o="function"==typeof e?e():e;s.ariaLabel=i.ariaLabel,s.items.bindTo(o).using((t=>{if("separator"===t.type)return new Rf(n);if("button"===t.type||"switchbutton"===t.type){const e=new Sf(n);let i;return i="button"===t.type?new qo(n):new Uo(n),i.bind(...Object.keys(t.model)).to(t.model),i.delegate("execute").to(e),e.children.add(i),e}return null})),t.panelView.children.add(s),s.items.delegate("execute").to(t)}function Bf(t,e){t.on("change:isOpen",(()=>{if(!t.isOpen)return;const i=e();i&&("function"==typeof i.focus?i.focus():y("ui-dropdown-focus-child-on-open-child-missing-focus",{view:i}))}),{priority:w.low-10})}const Df=Is("px"),Ff=vs.document.body;class Lf extends yo{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class",void 0),this._pinWhenIsVisibleCallback=null,this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",(t=>`ck-balloon-panel_${t}`)),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",Df),left:e.to("left",Df)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(t){this.show();const e=Lf.defaultPositions,i=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthMiddleWest,e.southArrowNorthMiddleEast,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthMiddleWest,e.northArrowSouthMiddleEast,e.northArrowSouthWest,e.northArrowSouthEast,e.viewportStickyNorth],limiter:Ff,fitInViewport:!0},t),n=Lf._getOptimalPosition(i),s=parseInt(n.left),o=parseInt(n.top),r=n.name,a=n.config||{},{withArrow:l=!0}=a;this.top=o,this.left=s,this.position=r,this.withArrow=l}pin(t){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(t):this._stopPinning()},this._startPinning(t),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(t){this.attachTo(t);const e=zf(t.target),i=t.limiter?zf(t.limiter):Ff;this.listenTo(vs.document,"scroll",((n,s)=>{const o=s.target,r=e&&o.contains(e),a=i&&o.contains(i);!r&&!a&&e&&i||this.attachTo(t)}),{useCapture:!0}),this.listenTo(vs.window,"resize",(()=>{this.attachTo(t)}))}_stopPinning(){this.stopListening(vs.document,"scroll"),this.stopListening(vs.window,"resize")}}function zf(t){return cs(t)?t:As(t)?t.commonAncestorContainer:"function"==typeof t?zf(t()):null}function Hf(t={}){const{sideOffset:e=Lf.arrowSideOffset,heightOffset:i=Lf.arrowHeightOffset,stickyVerticalOffset:n=Lf.stickyVerticalOffset,config:s}=t;return{northWestArrowSouthWest:(t,i)=>({top:o(t,i),left:t.left-e,name:"arrow_sw",...s&&{config:s}}),northWestArrowSouthMiddleWest:(t,i)=>({top:o(t,i),left:t.left-.25*i.width-e,name:"arrow_smw",...s&&{config:s}}),northWestArrowSouth:(t,e)=>({top:o(t,e),left:t.left-e.width/2,name:"arrow_s",...s&&{config:s}}),northWestArrowSouthMiddleEast:(t,i)=>({top:o(t,i),left:t.left-.75*i.width+e,name:"arrow_sme",...s&&{config:s}}),northWestArrowSouthEast:(t,i)=>({top:o(t,i),left:t.left-i.width+e,name:"arrow_se",...s&&{config:s}}),northArrowSouthWest:(t,i)=>({top:o(t,i),left:t.left+t.width/2-e,name:"arrow_sw",...s&&{config:s}}),northArrowSouthMiddleWest:(t,i)=>({top:o(t,i),left:t.left+t.width/2-.25*i.width-e,name:"arrow_smw",...s&&{config:s}}),northArrowSouth:(t,e)=>({top:o(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s",...s&&{config:s}}),northArrowSouthMiddleEast:(t,i)=>({top:o(t,i),left:t.left+t.width/2-.75*i.width+e,name:"arrow_sme",...s&&{config:s}}),northArrowSouthEast:(t,i)=>({top:o(t,i),left:t.left+t.width/2-i.width+e,name:"arrow_se",...s&&{config:s}}),northEastArrowSouthWest:(t,i)=>({top:o(t,i),left:t.right-e,name:"arrow_sw",...s&&{config:s}}),northEastArrowSouthMiddleWest:(t,i)=>({top:o(t,i),left:t.right-.25*i.width-e,name:"arrow_smw",...s&&{config:s}}),northEastArrowSouth:(t,e)=>({top:o(t,e),left:t.right-e.width/2,name:"arrow_s",...s&&{config:s}}),northEastArrowSouthMiddleEast:(t,i)=>({top:o(t,i),left:t.right-.75*i.width+e,name:"arrow_sme",...s&&{config:s}}),northEastArrowSouthEast:(t,i)=>({top:o(t,i),left:t.right-i.width+e,name:"arrow_se",...s&&{config:s}}),southWestArrowNorthWest:t=>({top:r(t),left:t.left-e,name:"arrow_nw",...s&&{config:s}}),southWestArrowNorthMiddleWest:(t,i)=>({top:r(t),left:t.left-.25*i.width-e,name:"arrow_nmw",...s&&{config:s}}),southWestArrowNorth:(t,e)=>({top:r(t),left:t.left-e.width/2,name:"arrow_n",...s&&{config:s}}),southWestArrowNorthMiddleEast:(t,i)=>({top:r(t),left:t.left-.75*i.width+e,name:"arrow_nme",...s&&{config:s}}),southWestArrowNorthEast:(t,i)=>({top:r(t),left:t.left-i.width+e,name:"arrow_ne",...s&&{config:s}}),southArrowNorthWest:t=>({top:r(t),left:t.left+t.width/2-e,name:"arrow_nw",...s&&{config:s}}),southArrowNorthMiddleWest:(t,i)=>({top:r(t),left:t.left+t.width/2-.25*i.width-e,name:"arrow_nmw",...s&&{config:s}}),southArrowNorth:(t,e)=>({top:r(t),left:t.left+t.width/2-e.width/2,name:"arrow_n",...s&&{config:s}}),southArrowNorthMiddleEast:(t,i)=>({top:r(t),left:t.left+t.width/2-.75*i.width+e,name:"arrow_nme",...s&&{config:s}}),southArrowNorthEast:(t,i)=>({top:r(t),left:t.left+t.width/2-i.width+e,name:"arrow_ne",...s&&{config:s}}),southEastArrowNorthWest:t=>({top:r(t),left:t.right-e,name:"arrow_nw",...s&&{config:s}}),southEastArrowNorthMiddleWest:(t,i)=>({top:r(t),left:t.right-.25*i.width-e,name:"arrow_nmw",...s&&{config:s}}),southEastArrowNorth:(t,e)=>({top:r(t),left:t.right-e.width/2,name:"arrow_n",...s&&{config:s}}),southEastArrowNorthMiddleEast:(t,i)=>({top:r(t),left:t.right-.75*i.width+e,name:"arrow_nme",...s&&{config:s}}),southEastArrowNorthEast:(t,i)=>({top:r(t),left:t.right-i.width+e,name:"arrow_ne",...s&&{config:s}}),westArrowEast:(t,e)=>({top:t.top+t.height/2-e.height/2,left:t.left-e.width-i,name:"arrow_e",...s&&{config:s}}),eastArrowWest:(t,e)=>({top:t.top+t.height/2-e.height/2,left:t.right+i,name:"arrow_w",...s&&{config:s}}),viewportStickyNorth:(t,e,i)=>t.getIntersection(i)?{top:i.top+n,left:t.left+t.width/2-e.width/2,name:"arrowless",config:{withArrow:!1,...s}}:null};function o(t,e){return t.top-e.height-i}function r(t){return t.bottom+i}}Lf.arrowSideOffset=25,Lf.arrowHeightOffset=10,Lf.stickyVerticalOffset=20,Lf._getOptimalPosition=Ds,Lf.defaultPositions=Hf();const jf="ck-tooltip";class $f extends(ps()){constructor(t){if(super(),$f._editors.add(t),$f._instance)return $f._instance;$f._instance=this,this.tooltipTextView=new yo(t.locale),this.tooltipTextView.set("text",""),this.tooltipTextView.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:this.tooltipTextView.bindTemplate.to("text")}]}),this.balloonPanelView=new Lf(t.locale),this.balloonPanelView.class=jf,this.balloonPanelView.content.add(this.tooltipTextView),this._resizeObserver=null,this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this._pinTooltipDebounced=dc(this._pinTooltip,600),this.listenTo(vs.document,"mouseenter",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(vs.document,"mouseleave",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(vs.document,"focus",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(vs.document,"blur",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(vs.document,"scroll",this._onScroll.bind(this),{useCapture:!0}),this._watchdogExcluded=!0}destroy(t){const e=t.ui.view&&t.ui.view.body;$f._editors.delete(t),this.stopListening(t.ui),e&&e.has(this.balloonPanelView)&&e.remove(this.balloonPanelView),$f._editors.size||(this._unpinTooltip(),this.balloonPanelView.destroy(),this.stopListening(),$f._instance=null)}static getPositioningFunctions(t){const e=$f.defaultBalloonPositions;return{s:[e.southArrowNorth,e.southArrowNorthEast,e.southArrowNorthWest],n:[e.northArrowSouth],e:[e.eastArrowWest],w:[e.westArrowEast],sw:[e.southArrowNorthEast],se:[e.southArrowNorthWest]}[t]}_onEnterOrFocus(t,{target:e}){const i=Wf(e);var n;i&&(i!==this._currentElementWithTooltip&&(this._unpinTooltip(),this._pinTooltipDebounced(i,{text:(n=i).dataset.ckeTooltipText,position:n.dataset.ckeTooltipPosition||"s",cssClass:n.dataset.ckeTooltipClass||""})))}_onLeaveOrBlur(t,{target:e,relatedTarget:i}){if("mouseleave"===t.name){if(!cs(e))return;if(this._currentElementWithTooltip&&e!==this._currentElementWithTooltip)return;const t=Wf(e),n=Wf(i);t&&t!==n&&this._unpinTooltip()}else{if(this._currentElementWithTooltip&&e!==this._currentElementWithTooltip)return;this._unpinTooltip()}}_onScroll(t,{target:e}){this._currentElementWithTooltip&&(e.contains(this.balloonPanelView.element)&&e.contains(this._currentElementWithTooltip)||this._unpinTooltip())}_pinTooltip(t,{text:e,position:i,cssClass:n}){const s=ho($f._editors.values()).ui.view.body;s.has(this.balloonPanelView)||s.add(this.balloonPanelView),this.tooltipTextView.text=e,this.balloonPanelView.pin({target:t,positions:$f.getPositioningFunctions(i)}),this._resizeObserver=new Rs(t,(()=>{Bs(t)||this._unpinTooltip()})),this.balloonPanelView.class=[jf,n].filter((t=>t)).join(" ");for(const t of $f._editors)this.listenTo(t.ui,"update",this._updateTooltipPosition.bind(this),{priority:"low"});this._currentElementWithTooltip=t,this._currentTooltipPosition=i}_unpinTooltip(){this._pinTooltipDebounced.cancel(),this.balloonPanelView.unpin();for(const t of $f._editors)this.stopListening(t.ui,"update");this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this._resizeObserver&&this._resizeObserver.destroy()}_updateTooltipPosition(){Bs(this._currentElementWithTooltip)?this.balloonPanelView.pin({target:this._currentElementWithTooltip,positions:$f.getPositioningFunctions(this._currentTooltipPosition)}):this._unpinTooltip()}}function Wf(t){return cs(t)?t.closest("[data-cke-tooltip-text]:not([data-cke-tooltip-disabled])"):null}$f.defaultBalloonPositions=Hf({heightOffset:5,sideOffset:13}),$f._editors=new Set,$f._instance=null;class qf extends(q()){constructor(t){super(),this.editor=t,this.componentFactory=new Qo(t),this.focusTracker=new uo,this.tooltipManager=new $f(t),this.set("viewportOffset",this._readViewportOffsetFromConfig()),this.isReady=!1,this.once("ready",(()=>{this.isReady=!0})),this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[],this.listenTo(t.editing.view.document,"layoutChanged",(()=>this.update())),this._initFocusTracking()}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy(),this.tooltipManager.destroy(this.editor);for(const t of this._editableElementsMap.values())t.ckeditorInstance=null;this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[]}setEditableElement(t,e){this._editableElementsMap.set(t,e),e.ckeditorInstance||(e.ckeditorInstance=this.editor),this.focusTracker.add(e);const i=()=>{this.editor.editing.view.getDomRoot(t)||this.editor.keystrokes.listenTo(e)};this.isReady?i():this.once("ready",i)}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}addToolbar(t,e={}){t.isRendered?(this.focusTracker.add(t.element),this.editor.keystrokes.listenTo(t.element)):t.once("render",(()=>{this.focusTracker.add(t.element),this.editor.keystrokes.listenTo(t.element)})),this._focusableToolbarDefinitions.push({toolbarView:t,options:e})}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}_readViewportOffsetFromConfig(){const t=this.editor,e=t.config.get("ui.viewportOffset");if(e)return e;const i=t.config.get("toolbar.viewportTopOffset");return i?(console.warn("editor-ui-deprecated-viewport-offset-config: The `toolbar.vieportTopOffset` configuration option is deprecated. It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead."),{top:i}):{top:0}}_initFocusTracking(){const t=this.editor,e=t.editing.view;let i,n;t.keystrokes.set("Alt+F10",((t,s)=>{const o=this.focusTracker.focusedElement;Array.from(this._editableElementsMap.values()).includes(o)&&!Array.from(e.domRoots.values()).includes(o)&&(i=o);const r=this._getCurrentFocusedToolbarDefinition();r&&n||(n=this._getFocusableCandidateToolbarDefinitions());for(let t=0;t{const s=this._getCurrentFocusedToolbarDefinition();s&&(i?(i.focus(),i=null):t.editing.view.focus(),s.options.afterBlur&&s.options.afterBlur(),n())}))}_getFocusableCandidateToolbarDefinitions(){const t=[];for(const e of this._focusableToolbarDefinitions){const{toolbarView:i,options:n}=e;(Bs(i.element)||n.beforeFocus)&&t.push(e)}return t.sort(((t,e)=>Uf(t)-Uf(e))),t}_getCurrentFocusedToolbarDefinition(){for(const t of this._focusableToolbarDefinitions)if(t.toolbarView.element&&t.toolbarView.element.contains(this.focusTracker.focusedElement))return t;return null}_focusFocusableCandidateToolbar(t){const{toolbarView:e,options:{beforeFocus:i}}=t;return i&&i(),!!Bs(e.element)&&(e.focus(),!0)}}function Uf(t){const{toolbarView:e,options:i}=t;let n=10;return Bs(e.element)&&n--,i.isContextual&&n--,n}class Kf extends yo{constructor(t){super(t),this.body=new $o(t)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}class Gf extends yo{constructor(t){super(t),this.set("text",void 0),this.set("for",void 0),this.id=`ck-editor__label_${p()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class Jf extends Kf{constructor(t){super(t),this.top=this.createCollection(),this.main=this.createCollection(),this._voiceLabelView=this._createVoiceLabel(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:t.uiLanguageDirection,lang:t.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const t=this.t,e=new Gf;return e.text=t("Rich Text Editor"),e.extendTemplate({attributes:{class:"ck-voice-label"}}),e}}class Qf extends yo{constructor(t,e,i){super(t),this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}}),this.name=null,this.set("isFocused",!1),this._editableElement=i,this._hasExternalElement=!!this._editableElement,this._editingView=e}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",(()=>this._updateIsFocusedClasses())),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}_updateIsFocusedClasses(){const t=this._editingView;function e(e){t.change((i=>{const n=t.document.getRoot(e.name);i.addClass(e.isFocused?"ck-focused":"ck-blurred",n),i.removeClass(e.isFocused?"ck-blurred":"ck-focused",n)}))}t.isRenderingInProgress?function i(n){t.once("change:isRenderingInProgress",((t,s,o)=>{o?i(n):e(n)}))}(this):e(this)}}class Yf extends Qf{constructor(t,e,i,n={}){super(t,e,i);const s=t.t;this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}}),this._generateLabel=n.label||(()=>s("Editor editing area: %0",this.name))}render(){super.render();const t=this._editingView;t.change((e=>{const i=t.document.getRoot(this.name);e.setAttribute("aria-label",this._generateLabel(this),i)}))}}class Zf extends yo{constructor(t){super(t),this.set("value",void 0),this.set("id",void 0),this.set("placeholder",void 0),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById",void 0),this.focusTracker=new uo,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0),this.set("inputMode","text");const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck","ck-input",e.if("isFocused","ck-input_focused"),e.if("isEmpty","ck-input-text_empty"),e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),readonly:e.to("isReadOnly"),inputmode:e.to("inputMode"),"aria-invalid":e.if("hasError",!0),"aria-describedby":e.to("ariaDescribedById")},on:{input:e.to(((...t)=>{this.fire("input",...t),this._updateIsEmpty()})),change:e.to(this._updateIsEmpty.bind(this))}})}render(){super.render(),this.focusTracker.add(this.element),this._setDomElementValue(this.value),this._updateIsEmpty(),this.on("change:value",((t,e,i)=>{this._setDomElementValue(i),this._updateIsEmpty()}))}destroy(){super.destroy(),this.focusTracker.destroy()}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=!this.element.value}_setDomElementValue(t){this.element.value=t||0===t?t:""}}class Xf extends Zf{constructor(t){super(t),this.extendTemplate({attributes:{type:"text",class:["ck-input-text"]}})}}class tm extends Zf{constructor(t,{min:e,max:i,step:n}={}){super(t);const s=this.bindTemplate;this.set("min",e),this.set("max",i),this.set("step",n),this.extendTemplate({attributes:{type:"number",class:["ck-input-number"],min:s.to("min"),max:s.to("max"),step:s.to("step")}})}}class em extends yo{constructor(t,e){super(t);const i=`ck-labeled-field-view-${p()}`,n=`ck-labeled-field-view-status-${p()}`;this.fieldView=e(this,i,n),this.set("label",void 0),this.set("isEnabled",!0),this.set("isEmpty",!0),this.set("isFocused",!1),this.set("errorText",null),this.set("infoText",null),this.set("class",void 0),this.set("placeholder",void 0),this.labelView=this._createLabelView(i),this.statusView=this._createStatusView(n),this.fieldWrapperChildren=this.createCollection([this.fieldView,this.labelView]),this.bind("_statusText").to(this,"errorText",this,"infoText",((t,e)=>t||e));const s=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",s.to("class"),s.if("isEnabled","ck-disabled",(t=>!t)),s.if("isEmpty","ck-labeled-field-view_empty"),s.if("isFocused","ck-labeled-field-view_focused"),s.if("placeholder","ck-labeled-field-view_placeholder"),s.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:this.fieldWrapperChildren},this.statusView]})}_createLabelView(t){const e=new Gf(this.locale);return e.for=t,e.bind("text").to(this,"label"),e}_createStatusView(t){const e=new yo(this.locale),i=this.bindTemplate;return e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",i.if("errorText","ck-labeled-field-view__status_error"),i.if("_statusText","ck-hidden",(t=>!t))],id:t,role:i.if("errorText","alert")},children:[{text:i.to("_statusText")}]}),e}focus(){this.fieldView.focus()}}function im(t,e,i){const n=new Xf(t.locale);return n.set({id:e,ariaDescribedById:i}),n.bind("isReadOnly").to(t,"isEnabled",(t=>!t)),n.bind("hasError").to(t,"errorText",(t=>!!t)),n.on("input",(()=>{t.errorText=null})),t.bind("isEmpty","isFocused","placeholder").to(n),n}function nm(t,e,i){const n=new tm(t.locale);return n.set({id:e,ariaDescribedById:i,inputMode:"numeric"}),n.bind("isReadOnly").to(t,"isEnabled",(t=>!t)),n.bind("hasError").to(t,"errorText",(t=>!!t)),n.on("input",(()=>{t.errorText=null})),t.bind("isEmpty","isFocused","placeholder").to(n),n}class sm extends(q()){constructor(t,e){super(),e&&Kl(this,e),t&&this.set(t)}}const om=Is("px");class rm extends lr{static get pluginName(){return"ContextualBalloon"}constructor(t){super(t),this._view=null,this._rotatorView=null,this._fakePanelsView=null,this.positionLimiter=()=>{const t=this.editor.editing.view,e=t.document.selection.editableElement;return e?t.domConverter.mapViewToDom(e.root):null},this.set("visibleView",null),this._viewToStack=new Map,this._idToStack=new Map,this.set("_numberOfStacks",0),this.set("_singleViewMode",!1),this._rotatorView=null,this._fakePanelsView=null}destroy(){super.destroy(),this._view&&this._view.destroy(),this._rotatorView&&this._rotatorView.destroy(),this._fakePanelsView&&this._fakePanelsView.destroy()}get view(){return this._view||this._createPanelView(),this._view}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this._view||this._createPanelView(),this.hasView(t.view))throw new v("contextualballoon-add-view-exist",[this,t]);const e=t.stackId||"main";if(!this._idToStack.has(e))return this._idToStack.set(e,new Map([[t.view,t]])),this._viewToStack.set(t.view,this._idToStack.get(e)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!t.singleViewMode||this.showStack(e));const i=this._idToStack.get(e);t.singleViewMode&&this.showStack(e),i.set(t.view,t),this._viewToStack.set(t.view,i),i===this._visibleStack&&this._showView(t)}remove(t){if(!this.hasView(t))throw new v("contextualballoon-remove-view-not-exist",[this,t]);const e=this._viewToStack.get(t);this._singleViewMode&&this.visibleView===t&&(this._singleViewMode=!1),this.visibleView===t&&(1===e.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(e.values())[e.size-2])),1===e.size?(this._idToStack.delete(this._getStackId(e)),this._numberOfStacks=this._idToStack.size):e.delete(t),this._viewToStack.delete(t)}updatePosition(t){t&&(this._visibleStack.get(this.visibleView).position=t),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e)throw new v("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==e&&this._showView(Array.from(e.values()).pop())}_createPanelView(){this._view=new Lf(this.editor.locale),this.editor.ui.view.body.add(this._view),this.editor.ui.focusTracker.add(this._view.element),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){return Array.from(this._idToStack.entries()).find((e=>e[1]===t))[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;t[e]||(e=0),this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;t[e]||(e=t.length-1),this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new am(this.editor.locale),e=this.editor.locale.t;return this.view.content.add(t),t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>1)),t.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"}),t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((t,i)=>{if(i<2)return"";const n=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("%0 of %1",[n,i])})),t.buttonNextView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()})),t.buttonPrevView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()})),t}_createFakePanelsView(){const t=new lm(this.editor.locale,this.view);return t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>=2?Math.min(t-1,2):0)),t.listenTo(this.view,"change:top",(()=>t.updatePosition())),t.listenTo(this.view,"change:left",(()=>t.updatePosition())),this.editor.ui.view.body.add(t),t}_showView({view:t,balloonClassName:e="",withArrow:i=!0,singleViewMode:n=!1}){this.view.class=e,this.view.withArrow=i,this._rotatorView.showView(t),this.visibleView=t,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),n&&(this._singleViewMode=!0)}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;return t&&(t.limiter||(t=Object.assign({},t,{limiter:this.positionLimiter})),t=Object.assign({},t,{viewportOffsetConfig:this.editor.ui.viewportOffset})),t}}class am extends yo{constructor(t){super(t);const e=t.t,i=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new uo,this.buttonPrevView=this._createButtonView(e("Previous"),''),this.buttonNextView=this._createButtonView(e("Next"),''),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",i.to("isNavigationVisible",(t=>t?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:i.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}destroy(){super.destroy(),this.focusTracker.destroy()}showView(t){this.hideView(),this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const i=new qo(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i}}class lm extends yo{constructor(t,e){super(t);const i=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=e,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",i.to("numberOfPanels",(t=>t?"":"ck-hidden"))],style:{top:i.to("top",om),left:i.to("left",om),width:i.to("width",om),height:i.to("height",om)}},children:this.content}),this.on("change:numberOfPanels",((t,e,i,n)=>{i>n?this._addPanels(i-n):this._removePanels(n-i),this.updatePosition()}))}_addPanels(t){for(;t--;){const t=new yo;t.setTemplate({tag:"div"}),this.content.add(t),this.registerChild(t)}}_removePanels(t){for(;t--;){const t=this.content.last;this.content.remove(t),this.deregisterChild(t),t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView,{width:i,height:n}=new Ps(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:i,height:n})}}}const cm=Is("px");class hm extends yo{constructor(t){super(t);const e=this.bindTemplate;this.set("isActive",!1),this.set("isSticky",!1),this.set("limiterElement",null),this.set("limiterBottomOffset",50),this.set("viewportTopOffset",0),this.set("_marginLeft",null),this.set("_isStickyToTheLimiter",!1),this.set("_hasViewportTopOffset",!1),this.content=this.createCollection(),this._contentPanelPlaceholder=new ko({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:e.to("isSticky",(t=>t?"block":"none")),height:e.to("isSticky",(t=>t?cm(this._panelRect.height):null))}}}).render(),this._contentPanel=new ko({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",e.if("isSticky","ck-sticky-panel__content_sticky"),e.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:e.to("isSticky",(t=>t?cm(this._contentPanelPlaceholder.getBoundingClientRect().width):null)),top:e.to("_hasViewportTopOffset",(t=>t?cm(this.viewportTopOffset):null)),bottom:e.to("_isStickyToTheLimiter",(t=>t?cm(this.limiterBottomOffset):null)),marginLeft:e.to("_marginLeft")}},children:this.content}).render(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this._contentPanel]})}render(){super.render(),this._checkIfShouldBeSticky(),this.listenTo(vs.window,"scroll",(()=>{this._checkIfShouldBeSticky()})),this.listenTo(this,"change:isActive",(()=>{this._checkIfShouldBeSticky()}))}_checkIfShouldBeSticky(){const t=this._panelRect=this._contentPanel.getBoundingClientRect();let e;this.limiterElement?(e=this._limiterRect=this.limiterElement.getBoundingClientRect(),this.isSticky=this.isActive&&e.topt||0)),t.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory),this.addToolbar(t.toolbar)}_initPlaceholder(){const t=this.editor,e=t.editing.view,i=e.document.getRoot(),n=t.sourceElement,s=t.config.get("placeholder")||n&&"textarea"===n.tagName.toLowerCase()&&n.getAttribute("placeholder");s&&function(t){const{view:e,element:i,text:n,isDirectHost:s=!0,keepOnFocus:o=!1}=t,r=e.document;pr.has(r)||(pr.set(r,new Map),r.registerPostFixer((t=>br(r,t))),r.on("change:isComposing",(()=>{e.change((t=>br(r,t)))}),{priority:"high"})),pr.get(r).set(i,{text:n,isDirectHost:s,keepOnFocus:o,hostElement:s?i:null}),e.change((t=>br(r,t)))}({view:e,element:i,text:s,isDirectHost:!1,keepOnFocus:!0})}}class fm extends Jf{constructor(t,e,i={}){super(t),this.stickyPanel=new hm(t),this.toolbar=new xf(t,{shouldGroupWhenFull:i.shouldToolbarGroupWhenFull}),this.editable=new Yf(t,e)}render(){super.render(),this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class mm extends(bf(_f(wf))){constructor(t,e={}){if(!gm(t)&&void 0!==e.initialData)throw new v("editor-create-initial-data",null);super(e),void 0===this.config.get("initialData")&&this.config.set("initialData",function(t){return gm(t)?(e=t,e instanceof HTMLTextAreaElement?e.value:e.innerHTML):t;var e}(t)),gm(t)&&(this.sourceElement=t),this.model.document.createRoot();const i=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=new fm(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:i});this.ui=new um(this,n),function(t){if(!Gt(t.updateSourceElement))throw new v("attachtoform-missing-elementapi-interface",t);const e=t.sourceElement;if(function(t){return!!t&&"textarea"===t.tagName.toLowerCase()}(e)&&e.form){let i;const n=e.form,s=()=>t.updateSourceElement();Gt(n.submit)&&(i=n.submit,n.submit=()=>{s(),i.apply(n)}),n.addEventListener("submit",s),t.on("destroy",(()=>{n.removeEventListener("submit",s),i&&(n.submit=i)}))}}(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(t,e={}){return new Promise((i=>{const n=new this(t,e);i(n.initPlugins().then((()=>n.ui.init(gm(t)?t:null))).then((()=>n.data.init(n.config.get("initialData")))).then((()=>n.fire("ready"))).then((()=>n)))}))}}function gm(t){return cs(t)}const pm=["left","right","center","justify"];function wm(t){return pm.includes(t)}function bm(t,e){return"rtl"==e.contentLanguageDirection?"right"===t:"left"===t}function _m(t){const e=t.map((t=>{let e;return e="string"==typeof t?{name:t}:t,e})).filter((t=>{const e=pm.includes(t.name);return e||y("alignment-config-name-not-recognized",{option:t}),e})),i=e.filter((t=>Boolean(t.className))).length;if(i&&i{const s=n.slice(i+1);if(s.some((t=>t.name==e.name)))throw new v("alignment-config-name-already-defined",{option:e,configuredOptions:t});if(e.className){if(s.some((t=>t.className==e.className)))throw new v("alignment-config-classname-already-defined",{option:e,configuredOptions:t})}})),e}const vm="alignment";class ym extends hr{refresh(){const t=this.editor.locale,e=ho(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=Boolean(e)&&this._canBeAligned(e),this.isEnabled&&e.hasAttribute("alignment")?this.value=e.getAttribute("alignment"):this.value="rtl"===t.contentLanguageDirection?"right":"left"}execute(t={}){const e=this.editor,i=e.locale,n=e.model,s=n.document,o=t.value;n.change((t=>{const e=Array.from(s.selection.getSelectedBlocks()).filter((t=>this._canBeAligned(t))),n=e[0].getAttribute("alignment");bm(o,i)||n===o||!o?function(t,e){for(const i of t)e.removeAttribute(vm,i)}(e,t):function(t,e,i){for(const n of t)e.setAttribute(vm,i,n)}(e,t,o)}))}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,vm)}}class km extends lr{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t),t.config.define("alignment",{options:pm.map((t=>({name:t})))})}init(){const t=this.editor,e=t.locale,i=t.model.schema,n=_m(t.config.get("alignment.options")).filter((t=>wm(t.name)&&!bm(t.name,e))),s=n.some((t=>!!t.className));i.extend("$block",{allowAttributes:"alignment"}),t.model.schema.setAttributeProperties("alignment",{isFormatting:!0}),s?t.conversion.attributeToAttribute(function(t){const e={};for(const i of t)e[i.name]={key:"class",value:i.className};const i={model:{key:"alignment",values:t.map((t=>t.name))},view:e};return i}(n)):t.conversion.for("downcast").attributeToAttribute(function(t){const e={};for(const{name:i}of t)e[i]={key:"style",value:{"text-align":i}};const i={model:{key:"alignment",values:t.map((t=>t.name))},view:e};return i}(n));const o=function(t){const e=[];for(const{name:i}of t)e.push({view:{key:"style",value:{"text-align":i}},model:{key:"alignment",value:i}});return e}(n);for(const e of o)t.conversion.for("upcast").attributeToAttribute(e);const r=function(t){const e=[];for(const{name:i}of t)e.push({view:{key:"align",value:i},model:{key:"alignment",value:i}});return e}(n);for(const e of r)t.conversion.for("upcast").attributeToAttribute(e);t.commands.add("alignment",new ym(t))}}const Am=new Map([["left",yf.alignLeft],["right",yf.alignRight],["center",yf.alignCenter],["justify",yf.alignJustify]]);class xm extends lr{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor,e=t.ui.componentFactory,i=t.t,n=_m(t.config.get("alignment.options"));n.map((t=>t.name)).filter(wm).forEach((t=>this._addButton(t))),e.add("alignment",(s=>{const o=Of(s);If(o,(()=>n.map((t=>e.create(`alignment:${t.name}`)))),{enableActiveItemFocusOnDropdownOpen:!0,isVertical:!0,ariaLabel:i("Text alignment toolbar")}),o.buttonView.set({label:i("Text alignment"),tooltip:!0}),o.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const r="rtl"===s.contentLanguageDirection?Am.get("right"):Am.get("left"),a=t.commands.get("alignment");return o.buttonView.bind("icon").to(a,"value",(t=>Am.get(t)||r)),o.bind("isEnabled").to(a,"isEnabled"),this.listenTo(o,"execute",(()=>{t.editing.view.focus()})),o}))}_addButton(t){const e=this.editor;e.ui.componentFactory.add(`alignment:${t}`,(i=>{const n=e.commands.get("alignment"),s=new qo(i);return s.set({label:this.localizedOptionTitles[t],icon:Am.get(t),tooltip:!0,isToggleable:!0}),s.bind("isEnabled").to(n),s.bind("isOn").to(n,"value",(e=>e===t)),this.listenTo(s,"execute",(()=>{e.execute("alignment",{value:t}),e.editing.view.focus()})),s}))}}class Cm{constructor(t,e=20){this._batch=null,this.model=t,this._size=0,this.limit=e,this._isLocked=!1,this._changeCallback=(t,e)=>{e.isLocal&&e.isUndoable&&e!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch({isTyping:!0})),this._batch}get size(){return this._size}input(t){this._size+=t,this._size>=this.limit&&this._reset(!0)}get isLocked(){return this._isLocked}lock(){this._isLocked=!0}unlock(){this._isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t=!1){this.isLocked&&!t||(this._batch=null,this._size=0)}}class Pm extends hr{constructor(t,e){super(t),this._buffer=new Cm(t.model,e)}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(t={}){const e=this.editor.model,i=e.document,n=t.text||"",s=n.length;let o=i.selection;t.selection?o=t.selection:t.range&&(o=e.createSelection(t.range));const r=t.resultRange;e.enqueueChange(this._buffer.batch,(t=>{this._buffer.lock(),e.deleteContent(o),n&&e.insertContent(t.createText(n,i.selection.getAttributes()),o),r?t.setSelection(r):o.is("documentSelection")||t.setSelection(o),this._buffer.unlock(),this._buffer.input(s)}))}}const Tm=["insertText","insertReplacementText"];class Em extends Ul{constructor(t){super(t),r.isAndroid&&Tm.push("insertCompositionText");const e=t.document;e.on("beforeinput",((i,n)=>{if(!this.isEnabled)return;const{data:s,targetRanges:o,inputType:r,domEvent:a}=n;if(!Tm.includes(r))return;const l=new m(e,"insertText");e.fire(l,new Gl(t,a,{text:s,selection:t.createSelection(o)})),l.stop.called&&i.stop()})),e.on("compositionend",((i,{data:n,domEvent:s})=>{this.isEnabled&&!r.isAndroid&&n&&e.fire("insertText",new Gl(t,s,{text:n,selection:e.selection}))}),{priority:"lowest"})}observe(){}}class Sm extends lr{static get pluginName(){return"Input"}init(){const t=this.editor,e=t.model,i=t.editing.view,n=e.document.selection;i.addObserver(Em);const s=new Pm(t,t.config.get("typing.undoStep")||20);t.commands.add("insertText",s),t.commands.add("input",s),this.listenTo(i.document,"insertText",((n,s)=>{i.document.isComposing||s.preventDefault();const{text:o,selection:a,resultRange:l}=s,c=Array.from(a.getRanges()).map((e=>t.editing.mapper.toModelRange(e)));let h=o;if(r.isAndroid){const t=Array.from(c[0].getItems()).reduce(((t,e)=>t+(e.is("$textProxy")?e.data:"")),"");t&&(t.length<=h.length?h.startsWith(t)&&(h=h.substring(t.length),c[0].start=c[0].start.getShiftedBy(t.length)):t.startsWith(h)&&(c[0].start=c[0].start.getShiftedBy(h.length),h=""))}const d={text:h,selection:e.createSelection(c)};l&&(d.resultRange=t.editing.mapper.toModelRange(l)),t.execute("insertText",d)})),r.isAndroid?this.listenTo(i.document,"keydown",((t,o)=>{!n.isCollapsed&&229==o.keyCode&&i.document.isComposing&&Rm(e,s)})):this.listenTo(i.document,"compositionstart",(()=>{n.isCollapsed||Rm(e,s)}))}}function Rm(t,e){if(!e.isEnabled)return;const i=e.buffer;i.lock(),t.enqueueChange(i.batch,(()=>{t.deleteContent(t.document.selection)})),i.unlock()}class Om extends hr{constructor(t,e){super(t),this.direction=e,this._buffer=new Cm(t.model,t.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model,i=e.document;e.enqueueChange(this._buffer.batch,(n=>{this._buffer.lock();const s=n.createSelection(t.selection||i.selection),o=t.sequence||1,r=s.isCollapsed;if(s.isCollapsed&&e.modifySelection(s,{direction:this.direction,unit:t.unit,treatEmojiAsSingleUnit:!0}),this._shouldEntireContentBeReplacedWithParagraph(o))return void this._replaceEntireContentWithParagraph(n);if(this._shouldReplaceFirstBlockWithParagraph(s,o))return void this.editor.execute("paragraph",{selection:s});if(s.isCollapsed)return;let a=0;s.getFirstRange().getMinimalFlatRanges().forEach((t=>{a+=Z(t.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))})),e.deleteContent(s,{doNotResetEntireContent:r,direction:this.direction}),this._buffer.input(a),n.setSelection(s),this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1)return!1;const e=this.editor.model,i=e.document.selection,n=e.schema.getLimitElement(i);if(!(i.isCollapsed&&i.containsEntireContent(n)))return!1;if(!e.schema.checkChild(n,"paragraph"))return!1;const s=n.getChild(0);return!s||!s.is("element","paragraph")}_replaceEntireContentWithParagraph(t){const e=this.editor.model,i=e.document.selection,n=e.schema.getLimitElement(i),s=t.createElement("paragraph");t.remove(t.createRangeIn(n)),t.insert(s,n),t.setSelection(s,0)}_shouldReplaceFirstBlockWithParagraph(t,e){const i=this.editor.model;if(e>1||"backward"!=this.direction)return!1;if(!t.isCollapsed)return!1;const n=t.getFirstPosition(),s=i.schema.getLimitElement(n),o=s.getChild(0);return n.parent==o&&(!!t.containsEntireContent(o)&&(!!i.schema.checkChild(s,"paragraph")&&"paragraph"!=o.name))}}const Im="word",Vm="selection",Mm="backward",Nm="forward",Bm={deleteContent:{unit:Vm,direction:Mm},deleteContentBackward:{unit:"codePoint",direction:Mm},deleteWordBackward:{unit:Im,direction:Mm},deleteHardLineBackward:{unit:Vm,direction:Mm},deleteSoftLineBackward:{unit:Vm,direction:Mm},deleteContentForward:{unit:"character",direction:Nm},deleteWordForward:{unit:Im,direction:Nm},deleteHardLineForward:{unit:Vm,direction:Nm},deleteSoftLineForward:{unit:Vm,direction:Nm}};class Dm extends Ul{constructor(t){super(t);const e=t.document;let i=0;e.on("keydown",(()=>{i++})),e.on("keyup",(()=>{i=0})),e.on("beforeinput",((n,s)=>{if(!this.isEnabled)return;const{targetRanges:o,domEvent:a,inputType:l}=s,c=Bm[l];if(!c)return;const h={direction:c.direction,unit:c.unit,sequence:i};h.unit==Vm&&(h.selectionToRemove=t.createSelection(o[0])),r.isAndroid&&"deleteContentBackward"===l&&(h.sequence=1,1!=o.length||o[0].start.parent==o[0].end.parent&&o[0].start.offset+1==o[0].end.offset||(h.unit=Vm,h.selectionToRemove=t.createSelection(o)));const d=new Ua(e,"delete",o[0]);e.fire(d,new Gl(t,a,h)),d.stop.called&&n.stop()})),r.isBlink&&function(t){const e=t.view,i=e.document;let n=null,s=!1;function o(t){return t==Zs.backspace||t==Zs.delete}function r(t){return t==Zs.backspace?Mm:Nm}i.on("keydown",((t,{keyCode:e})=>{n=e,s=!1})),i.on("keyup",((a,{keyCode:l,domEvent:c})=>{const h=i.selection,d=t.isEnabled&&l==n&&o(l)&&!h.isCollapsed&&!s;if(n=null,d){const t=h.getFirstRange(),n=new Ua(i,"delete",t),s={unit:Vm,direction:r(l),selectionToRemove:h};i.fire(n,new Gl(e,c,s))}})),i.on("beforeinput",((t,{inputType:e})=>{const i=Bm[e];o(n)&&i&&i.direction==r(n)&&(s=!0)}),{priority:"high"}),i.on("beforeinput",((t,{inputType:e,data:i})=>{n==Zs.delete&&"insertText"==e&&""==i&&t.stop()}),{priority:"high"})}(this)}observe(){}}class Fm extends lr{static get pluginName(){return"Delete"}init(){const t=this.editor,e=t.editing.view,i=e.document,n=t.model.document;e.addObserver(Dm),this._undoOnBackspace=!1;const s=new Om(t,"forward");t.commands.add("deleteForward",s),t.commands.add("forwardDelete",s),t.commands.add("delete",new Om(t,"backward")),this.listenTo(i,"delete",((n,s)=>{i.isComposing||s.preventDefault();const{direction:o,sequence:r,selectionToRemove:a,unit:l}=s,c="forward"===o?"deleteForward":"delete",h={sequence:r};if("selection"==l){const e=Array.from(a.getRanges()).map((e=>t.editing.mapper.toModelRange(e)));h.selection=t.model.createSelection(e)}else h.unit=l;t.execute(c,h),e.scrollToTheSelection()}),{priority:"low"}),this.editor.plugins.has("UndoEditing")&&(this.listenTo(i,"delete",((e,i)=>{this._undoOnBackspace&&"backward"==i.direction&&1==i.sequence&&"codePoint"==i.unit&&(this._undoOnBackspace=!1,t.execute("undo"),i.preventDefault(),e.stop())}),{context:"$capture"}),this.listenTo(n,"change",(()=>{this._undoOnBackspace=!1})))}requestUndoOnBackspace(){this.editor.plugins.has("UndoEditing")&&(this._undoOnBackspace=!0)}}class Lm extends lr{static get requires(){return[Sm,Fm]}static get pluginName(){return"Typing"}}function zm(t,e){let i=t.start;return{text:Array.from(t.getItems()).reduce(((t,n)=>n.is("$text")||n.is("$textProxy")?t+n.data:(i=e.createPositionAfter(n),"")),""),range:e.createRange(i,t.end)}}class Hm extends(q()){constructor(t,e){super(),this.model=t,this.testCallback=e,this._hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",(()=>{this.isEnabled?this._startListening():(this.stopListening(t.document.selection),this.stopListening(t.document))})),this._startListening()}get hasMatch(){return this._hasMatch}_startListening(){const t=this.model.document;this.listenTo(t.selection,"change:range",((e,{directChange:i})=>{i&&(t.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this._hasMatch=!1))})),this.listenTo(t,"change:data",((t,e)=>{!e.isUndo&&e.isLocal&&this._evaluateTextBeforeSelection("data",{batch:e})}))}_evaluateTextBeforeSelection(t,e={}){const i=this.model,n=i.document.selection,s=i.createRange(i.createPositionAt(n.focus.parent,0),n.focus),{text:o,range:r}=zm(s,i),a=this.testCallback(o);if(!a&&this.hasMatch&&this.fire("unmatched"),this._hasMatch=!!a,a){const i=Object.assign(e,{text:o,range:r});"object"==typeof a&&Object.assign(i,a),this.fire(`matched:${t}`,i)}}}class jm extends lr{static get pluginName(){return"TwoStepCaretMovement"}constructor(t){super(t),this.attributes=new Set,this._overrideUid=null}init(){const t=this.editor,e=t.model,i=t.editing.view,n=t.locale,s=e.document.selection;this.listenTo(i.document,"arrowKey",((t,e)=>{if(!s.isCollapsed)return;if(e.shiftKey||e.altKey||e.ctrlKey)return;const i=e.keyCode==Zs.arrowright,o=e.keyCode==Zs.arrowleft;if(!i&&!o)return;const r=n.contentLanguageDirection;let a=!1;a="ltr"===r&&i||"rtl"===r&&o?this._handleForwardMovement(e):this._handleBackwardMovement(e),!0===a&&t.stop()}),{context:"$text",priority:"highest"}),this._isNextGravityRestorationSkipped=!1,this.listenTo(s,"change:range",((t,e)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!e.directChange&&Um(s.getFirstPosition(),this.attributes)||this._restoreGravity())}))}registerAttribute(t){this.attributes.add(t)}_handleForwardMovement(t){const e=this.attributes,i=this.editor.model.document.selection,n=i.getFirstPosition();return!this._isGravityOverridden&&((!n.isAtStart||!$m(i,e))&&(!!Um(n,e)&&(qm(t),this._overrideGravity(),!0)))}_handleBackwardMovement(t){const e=this.attributes,i=this.editor.model,n=i.document.selection,s=n.getFirstPosition();return this._isGravityOverridden?(qm(t),this._restoreGravity(),Wm(i,e,s),!0):s.isAtStart?!!$m(n,e)&&(qm(t),Wm(i,e,s),!0):!!function(t,e){const i=t.getShiftedBy(-1);return Um(i,e)}(s,e)&&(s.isAtEnd&&!$m(n,e)&&Um(s,e)?(qm(t),Wm(i,e,s),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1))}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((t=>t.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((t=>{t.restoreSelectionGravity(this._overrideUid),this._overrideUid=null}))}}function $m(t,e){for(const i of e)if(t.hasAttribute(i))return!0;return!1}function Wm(t,e,i){const n=i.nodeBefore;t.change((t=>{n?t.setSelectionAttribute(n.getAttributes()):t.removeSelectionAttribute(e)}))}function qm(t){t.preventDefault()}function Um(t,e){const{nodeBefore:i,nodeAfter:n}=t;for(const t of e){const e=i?i.getAttribute(t):void 0;if((n?n.getAttribute(t):void 0)!==e)return!0}return!1}var Km=/[\\^$.*+?()[\]{}|]/g,Gm=RegExp(Km.source);const Jm=function(t){return(t=Gr(t))&&Gm.test(t)?t.replace(Km,"\\$&"):t},Qm={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:/(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i,to:[null,"½",null]},oneThird:{from:/(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i,to:[null,"⅓",null]},twoThirds:{from:/(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i,to:[null,"⅔",null]},oneForth:{from:/(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i,to:[null,"¼",null]},threeQuarters:{from:/(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i,to:[null,"¾",null]},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:ig('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:ig("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:ig("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:ig('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:ig('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:ig("'"),to:[null,"‚",null,"’"]}},Ym={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},Zm=["symbols","mathematical","typography","quotes"];function Xm(t){return"string"==typeof t?new RegExp(`(${Jm(t)})$`):t}function tg(t){return"string"==typeof t?()=>[t]:t instanceof Array?()=>t:t}function eg(t){return(t.textNode?t.textNode:t.nodeAfter).getAttributes()}function ig(t){return new RegExp(`(^|\\s)(${t})([^${t}]*)(${t})$`)}function ng(t,e,i,n){return n.createRange(sg(t,e,i,!0,n),sg(t,e,i,!1,n))}function sg(t,e,i,n,s){let o=t.textNode||(n?t.nodeBefore:t.nodeAfter),r=null;for(;o&&o.getAttribute(e)==i;)r=o,o=n?o.previousSibling:o.nextSibling;return r?s.createPositionAt(r,n?"before":"after"):t}function og(t,e,i,n){let s,o=null;"function"==typeof n?s=n:(o=t.commands.get(n),s=()=>{t.execute(n)}),t.model.document.on("change:data",((r,a)=>{if(o&&!o.isEnabled||!e.isEnabled)return;const l=ho(t.model.document.selection.getRanges());if(!l.isCollapsed)return;if(a.isUndo||!a.isLocal)return;const c=Array.from(t.model.document.differ.getChanges()),h=c[0];if(1!=c.length||"insert"!==h.type||"$text"!=h.name||1!=h.length)return;const d=h.position.parent;if(d.is("element","codeBlock"))return;if(d.is("element","listItem")&&"function"!=typeof n&&!["numberedList","bulletedList","todoList"].includes(n))return;if(o&&!0===o.value)return;const u=d.getChild(0),f=t.model.createRangeOn(u);if(!f.containsRange(l)&&!l.end.isEqual(f.end))return;const m=i.exec(u.data.substr(0,l.end.offset));m&&t.model.enqueueChange((e=>{const i=e.createPositionAt(d,0),n=e.createPositionAt(d,m[0].length),o=new Mh(i,n);if(!1!==s({match:m})){e.remove(o);const i=t.model.document.selection.getFirstRange(),n=e.createRangeIn(d);!d.isEmpty||n.isEqual(i)||n.containsRange(i,!0)||e.remove(d)}o.detach(),t.model.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function rg(t,e,i,n){let s,o;i instanceof RegExp?s=i:o=i,o=o||(t=>{let e;const i=[],n=[];for(;null!==(e=s.exec(t))&&!(e&&e.length<4);){let{index:t,1:s,2:o,3:r}=e;const a=s+o+r;t+=e[0].length-a.length;const l=[t,t+s.length],c=[t+s.length+o.length,t+s.length+o.length+r.length];i.push(l),i.push(c),n.push([t+s.length,t+s.length+o.length])}return{remove:i,format:n}}),t.model.document.on("change:data",((i,s)=>{if(s.isUndo||!s.isLocal||!e.isEnabled)return;const r=t.model,a=r.document.selection;if(!a.isCollapsed)return;const l=Array.from(r.document.differ.getChanges()),c=l[0];if(1!=l.length||"insert"!==c.type||"$text"!=c.name||1!=c.length)return;const h=a.focus,d=h.parent,{text:u,range:f}=function(t,e){let i=t.start;const n=Array.from(t.getItems()).reduce(((t,n)=>!n.is("$text")&&!n.is("$textProxy")||n.getAttribute("code")?(i=e.createPositionAfter(n),""):t+n.data),"");return{text:n,range:e.createRange(i,t.end)}}(r.createRange(r.createPositionAt(d,0),h),r),m=o(u),g=ag(f.start,m.format,r),p=ag(f.start,m.remove,r);g.length&&p.length&&r.enqueueChange((e=>{if(!1!==n(e,g)){for(const t of p.reverse())e.remove(t);r.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function ag(t,e,i){return e.filter((t=>void 0!==t[0]&&void 0!==t[1])).map((e=>i.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1]))))}function lg(t,e){return(i,n)=>{if(!t.commands.get(e).isEnabled)return!1;const s=t.model.schema.getValidRanges(n,e);for(const t of s)i.setAttribute(e,!0,t);i.removeSelectionAttribute(e)}}function*cg(t,e){for(const i of e)i&&t.getAttributeProperties(i[0]).copyOnEnter&&(yield i)}class hg extends hr{execute(){this.editor.model.change((t=>{this.enterBlock(t),this.fire("afterExecute",{writer:t})}))}enterBlock(t){const e=this.editor.model,i=e.document.selection,n=e.schema,s=i.isCollapsed,o=i.getFirstRange(),r=o.start.parent,a=o.end.parent;if(n.isLimit(r)||n.isLimit(a))return s||r!=a||e.deleteContent(i),!1;if(s){const e=cg(t.model.schema,i.getAttributes());return dg(t,o.start),t.setSelectionAttribute(e),!0}{const n=!(o.start.isAtStart&&o.end.isAtEnd),s=r==a;if(e.deleteContent(i,{leaveUnmerged:n}),n){if(s)return dg(t,i.focus),!0;t.setSelection(a,0)}}return!1}}function dg(t,e){t.split(e),t.setSelection(e.parent.nextSibling,0)}const ug={insertParagraph:{isSoft:!1},insertLineBreak:{isSoft:!0}};class fg extends Ul{constructor(t){super(t);const e=this.document;e.on("beforeinput",((i,n)=>{if(!this.isEnabled)return;const s=n.domEvent,o=ug[n.inputType];if(!o)return;const r=new Ua(e,"enter",n.targetRanges[0]);e.fire(r,new Gl(t,s,{isSoft:o.isSoft})),r.stop.called&&i.stop()}))}observe(){}}class mg extends lr{static get pluginName(){return"Enter"}init(){const t=this.editor,e=t.editing.view,i=e.document;e.addObserver(fg),t.commands.add("enter",new hg(t)),this.listenTo(i,"enter",((n,s)=>{i.isComposing||s.preventDefault(),s.isSoft||(t.execute("enter"),e.scrollToTheSelection())}),{priority:"low"})}}class gg extends hr{execute(){const t=this.editor.model,e=t.document;t.change((i=>{!function(t,e,i){const n=i.isCollapsed,s=i.getFirstRange(),o=s.start.parent,r=s.end.parent,a=o==r;if(n){const n=cg(t.schema,i.getAttributes());pg(t,e,s.end),e.removeSelectionAttribute(i.getAttributeKeys()),e.setSelectionAttribute(n)}else{const n=!(s.start.isAtStart&&s.end.isAtEnd);t.deleteContent(i,{leaveUnmerged:n}),a?pg(t,e,i.focus):n&&e.setSelection(r,0)}}(t,i,e.selection),this.fire("afterExecute",{writer:i})}))}refresh(){const t=this.editor.model,e=t.document;this.isEnabled=function(t,e){if(e.rangeCount>1)return!1;const i=e.anchor;if(!i||!t.checkChild(i,"softBreak"))return!1;const n=e.getFirstRange(),s=n.start.parent,o=n.end.parent;if((wg(s,t)||wg(o,t))&&s!==o)return!1;return!0}(t.schema,e.selection)}}function pg(t,e,i){const n=e.createElement("softBreak");t.insertContent(n,i),e.setSelection(n,"after")}function wg(t,e){return!t.is("rootElement")&&(e.isLimit(t)||wg(t.parent,e))}class bg extends lr{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor,e=t.model.schema,i=t.conversion,n=t.editing.view,s=n.document;e.register("softBreak",{allowWhere:"$text",isInline:!0}),i.for("upcast").elementToElement({model:"softBreak",view:"br"}),i.for("downcast").elementToElement({model:"softBreak",view:(t,{writer:e})=>e.createEmptyElement("br")}),n.addObserver(fg),t.commands.add("shiftEnter",new gg(t)),this.listenTo(s,"enter",((e,i)=>{s.isComposing||i.preventDefault(),i.isSoft&&(t.execute("shiftEnter"),n.scrollToTheSelection())}),{priority:"low"})}}class _g extends hr{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,i=e.schema,n=e.document.selection,s=Array.from(n.getSelectedBlocks()),o=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(o){const e=s.filter((t=>vg(t)||kg(i,t)));this._applyQuote(t,e)}else this._removeQuote(t,s.filter(vg))}))}_getValue(){const t=ho(this.editor.model.document.selection.getSelectedBlocks());return!(!t||!vg(t))}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,i=ho(t.getSelectedBlocks());return!!i&&kg(e,i)}_removeQuote(t,e){yg(t,e).reverse().forEach((e=>{if(e.start.isAtStart&&e.end.isAtEnd)return void t.unwrap(e.start.parent);if(e.start.isAtStart){const i=t.createPositionBefore(e.start.parent);return void t.move(e,i)}e.end.isAtEnd||t.split(e.end);const i=t.createPositionAfter(e.end.parent);t.move(e,i)}))}_applyQuote(t,e){const i=[];yg(t,e).reverse().forEach((e=>{let n=vg(e.start);n||(n=t.createElement("blockQuote"),t.wrap(e,n)),i.push(n)})),i.reverse().reduce(((e,i)=>e.nextSibling==i?(t.merge(t.createPositionAfter(e)),e):i))}}function vg(t){return"blockQuote"==t.parent.name?t.parent:null}function yg(t,e){let i,n=0;const s=[];for(;n{const n=t.model.document.differ.getChanges();for(const t of n)if("insert"==t.type){const n=t.position.nodeAfter;if(!n)continue;if(n.is("element","blockQuote")&&n.isEmpty)return i.remove(n),!0;if(n.is("element","blockQuote")&&!e.checkChild(t.position,n))return i.unwrap(n),!0;if(n.is("element")){const t=i.createRangeIn(n);for(const n of t.getItems())if(n.is("element","blockQuote")&&!e.checkChild(i.createPositionBefore(n),n))return i.unwrap(n),!0}}else if("remove"==t.type){const e=t.position.parent;if(e.is("element","blockQuote")&&e.isEmpty)return i.remove(e),!0}return!1}));const i=this.editor.editing.view.document,n=t.model.document.selection,s=t.commands.get("blockQuote");this.listenTo(i,"enter",((e,i)=>{if(!n.isCollapsed||!s.value)return;n.getLastPosition().parent.isEmpty&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),i.preventDefault(),e.stop())}),{context:"blockquote"}),this.listenTo(i,"delete",((e,i)=>{if("backward"!=i.direction||!n.isCollapsed||!s.value)return;const o=n.getLastPosition().parent;o.isEmpty&&!o.previousSibling&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),i.preventDefault(),e.stop())}),{context:"blockquote"})}}class xg extends lr{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("blockQuote",(i=>{const n=t.commands.get("blockQuote"),s=new qo(i);return s.set({label:e("Block quote"),icon:yf.quote,tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute("blockQuote"),t.editing.view.focus()})),s}))}}class Cg extends hr{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const s=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of s)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,i=t.document.selection;if(i.isCollapsed)return i.hasAttribute(this.attributeKey);for(const t of i.getRanges())for(const i of t.getItems())if(e.checkAttribute(i,this.attributeKey))return i.hasAttribute(this.attributeKey);return!1}}const Pg="bold";class Tg extends lr{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Pg}),t.model.schema.setAttributeProperties(Pg,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:Pg,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e&&("bold"==e||Number(e)>=600)?{name:!0,styles:["font-weight"]}:null}]}),t.commands.add(Pg,new Cg(t,Pg)),t.keystrokes.set("CTRL+B",Pg)}}const Eg="bold";class Sg extends lr{static get pluginName(){return"BoldUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Eg,(i=>{const n=t.commands.get(Eg),s=new qo(i);return s.set({label:e("Bold"),icon:yf.bold,keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(Eg),t.editing.view.focus()})),s}))}}class Rg extends Jl{constructor(t){super(t);const e=this.document;function i(t){return(i,n)=>{n.preventDefault();const s=n.dropRange?[n.dropRange]:null,o=new m(e,t);e.fire(o,{dataTransfer:n.dataTransfer,method:i.name,targetRanges:s,target:n.target}),o.stop.called&&n.stopPropagation()}}this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"],this.listenTo(e,"paste",i("clipboardInput"),{priority:"low"}),this.listenTo(e,"drop",i("clipboardInput"),{priority:"low"}),this.listenTo(e,"dragover",i("dragging"),{priority:"low"})}onDomEvent(t){const e={dataTransfer:new nh("clipboardData"in t?t.clipboardData:t.dataTransfer)};"drop"!=t.type&&"dragover"!=t.type||(e.dropRange=function(t,e){const i=e.target.ownerDocument,n=e.clientX,s=e.clientY;let o;i.caretRangeFromPoint&&i.caretRangeFromPoint(n,s)?o=i.caretRangeFromPoint(n,s):e.rangeParent&&(o=i.createRange(),o.setStart(e.rangeParent,e.rangeOffset),o.collapse(!0));if(o)return t.domConverter.domRangeToView(o);return null}(this.view,t)),this.fire(t.type,t,e)}}const Og=["figcaption","li"];function Ig(t){let e="";if(t.is("$text")||t.is("$textProxy"))e=t.data;else if(t.is("element","img")&&t.hasAttribute("alt"))e=t.getAttribute("alt");else if(t.is("element","br"))e="\n";else{let i=null;for(const n of t.getChildren()){const t=Ig(n);i&&(i.is("containerElement")||n.is("containerElement"))&&(Og.includes(i.name)||Og.includes(n.name)?e+="\n":e+="\n\n"),e+=t,i=n}}return e}class Vg extends lr{static get pluginName(){return"ClipboardPipeline"}init(){this.editor.editing.view.addObserver(Rg),this._setupPasteDrop(),this._setupCopyCut()}_setupPasteDrop(){const t=this.editor,e=t.model,i=t.editing.view,n=i.document;this.listenTo(n,"clipboardInput",(e=>{t.isReadOnly&&e.stop()}),{priority:"highest"}),this.listenTo(n,"clipboardInput",((t,e)=>{const n=e.dataTransfer;let s;if(e.content)s=e.content;else{let t="";n.getData("text/html")?t=function(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1==e.length?" ":e)).replace(//g,"")}(n.getData("text/html")):n.getData("text/plain")&&(((o=(o=n.getData("text/plain")).replace(//g,">").replace(/\r?\n\r?\n/g,"

      ").replace(/\r?\n/g,"
      ").replace(/\t/g,"    ").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g,"  ")).includes("

      ")||o.includes("
      "))&&(o=`

      ${o}

      `),t=o),s=this.editor.data.htmlProcessor.toView(t)}var o;const r=new m(this,"inputTransformation");this.fire(r,{content:s,dataTransfer:n,targetRanges:e.targetRanges,method:e.method}),r.stop.called&&t.stop(),i.scrollToTheSelection()}),{priority:"low"}),this.listenTo(this,"inputTransformation",((t,i)=>{if(i.content.isEmpty)return;const n=this.editor.data.toModel(i.content,"$clipboardHolder");0!=n.childCount&&(t.stop(),e.change((()=>{this.fire("contentInsertion",{content:n,method:i.method,dataTransfer:i.dataTransfer,targetRanges:i.targetRanges})})))}),{priority:"low"}),this.listenTo(this,"contentInsertion",((t,i)=>{i.resultRange=e.insertContent(i.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor,e=t.model.document,i=t.editing.view.document,n=(n,s)=>{const o=s.dataTransfer;s.preventDefault();const r=t.data.toView(t.model.getSelectedContent(e.selection));i.fire("clipboardOutput",{dataTransfer:o,content:r,method:n.name})};this.listenTo(i,"copy",n,{priority:"low"}),this.listenTo(i,"cut",((e,i)=>{t.isReadOnly?i.preventDefault():n(e,i)}),{priority:"low"}),this.listenTo(i,"clipboardOutput",((i,n)=>{n.content.isEmpty||(n.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(n.content)),n.dataTransfer.setData("text/plain",Ig(n.content))),"cut"==n.method&&t.model.deleteContent(e.selection)}),{priority:"low"})}}class Mg extends(R()){constructor(){super(),this._stack=[]}add(t,e){const i=this._stack,n=i[0];this._insertDescriptor(t);const s=i[0];n===s||Ng(n,s)||this.fire("change:top",{oldDescriptor:n,newDescriptor:s,writer:e})}remove(t,e){const i=this._stack,n=i[0];this._removeDescriptor(t);const s=i[0];n===s||Ng(n,s)||this.fire("change:top",{oldDescriptor:n,newDescriptor:s,writer:e})}_insertDescriptor(t){const e=this._stack,i=e.findIndex((e=>e.id===t.id));if(Ng(t,e[i]))return;i>-1&&e.splice(i,1);let n=0;for(;e[n]&&Bg(e[n],t);)n++;e.splice(n,0,t)}_removeDescriptor(t){const e=this._stack,i=e.findIndex((e=>e.id===t));i>-1&&e.splice(i,1)}}function Ng(t,e){return t&&e&&t.priority==e.priority&&Dg(t.classes)==Dg(e.classes)}function Bg(t,e){return t.priority>e.priority||!(t.priorityDg(e.classes)}function Dg(t){return Array.isArray(t)?t.sort().join(","):t}const Fg='',Lg="ck-widget",zg="ck-widget_selected";function Hg(t){return!!t.is("element")&&!!t.getCustomProperty("widget")}function jg(t,e,i={}){if(!t.is("containerElement"))throw new v("widget-to-widget-wrong-element-type",null,{element:t});return e.setAttribute("contenteditable","false",t),e.addClass(Lg,t),e.setCustomProperty("widget",!0,t),t.getFillerOffset=Ug,e.setCustomProperty("widgetLabel",[],t),i.label&&function(t,e){const i=t.getCustomProperty("widgetLabel");i.push(e)}(t,i.label),i.hasSelectionHandle&&function(t,e){const i=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t),i=new Wo;return i.set("content",Fg),i.render(),e.appendChild(i.element),e}));e.insert(e.createPositionAt(t,0),i),e.addClass(["ck-widget_with-selection-handle"],t)}(t,e),qg(t,e),t}function $g(t,e,i){if(e.classes&&i.addClass(so(e.classes),t),e.attributes)for(const n in e.attributes)i.setAttribute(n,e.attributes[n],t)}function Wg(t,e,i){if(e.classes&&i.removeClass(so(e.classes),t),e.attributes)for(const n in e.attributes)i.removeAttribute(n,t)}function qg(t,e,i=$g,n=Wg){const s=new Mg;s.on("change:top",((e,s)=>{s.oldDescriptor&&n(t,s.oldDescriptor,s.writer),s.newDescriptor&&i(t,s.newDescriptor,s.writer)}));e.setCustomProperty("addHighlight",((t,e,i)=>s.add(e,i)),t),e.setCustomProperty("removeHighlight",((t,e,i)=>s.remove(e,i)),t)}function Ug(){return null}const Kg="widget-type-around";function Gg(t,e,i){return!!t&&Hg(t)&&!i.isInline(e)}function Jg(t){return t.getAttribute(Kg)}const Qg=["before","after"],Yg=(new DOMParser).parseFromString('',"image/svg+xml").firstChild,Zg="ck-widget__type-around_disabled";class Xg extends lr{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[mg,Fm]}constructor(t){super(t),this._currentFakeCaretModelElement=null}init(){const t=this.editor,e=t.editing.view;this.on("change:isEnabled",((i,n,s)=>{e.change((t=>{for(const i of e.document.roots)s?t.removeClass(Zg,i):t.addClass(Zg,i)})),s||t.model.change((t=>{t.removeSelectionAttribute(Kg)}))})),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableInsertObjectIntegration(),this._enableDeleteContentIntegration()}destroy(){super.destroy(),this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const i=this.editor,n=i.editing.view,s=i.model.schema.getAttributesWithProperty(t,"copyOnReplace",!0);i.execute("insertParagraph",{position:i.model.createPositionAt(t,e),attributes:s}),n.focus(),n.scrollToTheSelection()}_listenToIfEnabled(t,e,i,n){this.listenTo(t,e,((...t)=>{this.isEnabled&&i(...t)}),n)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor.model.document.selection,e=Jg(t);if(!e)return!1;const i=t.getSelectedElement();return this._insertParagraph(i,e),!0}_enableTypeAroundUIInjection(){const t=this.editor,e=t.model.schema,i=t.locale.t,n={before:i("Insert paragraph before block"),after:i("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,s,o)=>{const r=o.mapper.toViewElement(s.item);if(r&&Gg(r,s.item,e)){!function(t,e,i){const n=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const i=this.toDomElement(t);return function(t,e){for(const i of Qg){const n=new ko({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${i}`],title:e[i],"aria-hidden":"true"},children:[t.ownerDocument.importNode(Yg,!0)]});t.appendChild(n.render())}}(i,e),function(t){const e=new ko({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}(i),i}));t.insert(t.createPositionAt(i,"end"),n)}(o.writer,n,r);r.getCustomProperty("widgetLabel").push((()=>this.isEnabled?i("Press Enter to type after or press Shift + Enter to type before the widget"):""))}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor,e=t.model,i=e.document.selection,n=e.schema,s=t.editing.view;function o(t){return`ck-widget_type-around_show-fake-caret_${t}`}this._listenToIfEnabled(s.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[Hg,"$text"],priority:"high"}),this._listenToIfEnabled(i,"change:range",((e,i)=>{i.directChange&&t.model.change((t=>{t.removeSelectionAttribute(Kg)}))})),this._listenToIfEnabled(e.document,"change:data",(()=>{const e=i.getSelectedElement();if(e){if(Gg(t.editing.mapper.toViewElement(e),e,n))return}t.model.change((t=>{t.removeSelectionAttribute(Kg)}))})),this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,i)=>{const s=i.writer;if(this._currentFakeCaretModelElement){const t=i.mapper.toViewElement(this._currentFakeCaretModelElement);t&&(s.removeClass(Qg.map(o),t),this._currentFakeCaretModelElement=null)}const r=e.selection.getSelectedElement();if(!r)return;const a=i.mapper.toViewElement(r);if(!Gg(a,r,n))return;const l=Jg(e.selection);l&&(s.addClass(o(l),a),this._currentFakeCaretModelElement=r)})),this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,i,n)=>{n||t.model.change((t=>{t.removeSelectionAttribute(Kg)}))}))}_handleArrowKeyPress(t,e){const i=this.editor,n=i.model,s=n.document.selection,o=n.schema,r=i.editing.view,a=function(t,e){const i=no(t,e);return"down"===i||"right"===i}(e.keyCode,i.locale.contentLanguageDirection),l=r.document.selection.getSelectedElement();let c;Gg(l,i.editing.mapper.toModelElement(l),o)?c=this._handleArrowKeyPressOnSelectedWidget(a):s.isCollapsed?c=this._handleArrowKeyPressWhenSelectionNextToAWidget(a):e.shiftKey||(c=this._handleArrowKeyPressWhenNonCollapsedSelection(a)),c&&(e.preventDefault(),t.stop())}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor.model,i=Jg(e.document.selection);return e.change((e=>{if(!i)return e.setSelectionAttribute(Kg,t?"after":"before"),!0;if(!(i===(t?"after":"before")))return e.removeSelectionAttribute(Kg),!0;return!1}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor,i=e.model,n=i.schema,s=e.plugins.get("Widget"),o=s._getObjectElementNextToSelection(t);return!!Gg(e.editing.mapper.toViewElement(o),o,n)&&(i.change((e=>{s._setSelectionOverElement(o),e.setSelectionAttribute(Kg,t?"before":"after")})),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(t){const e=this.editor,i=e.model,n=i.schema,s=e.editing.mapper,o=i.document.selection,r=t?o.getLastPosition().nodeBefore:o.getFirstPosition().nodeAfter;return!!Gg(s.toViewElement(r),r,n)&&(i.change((e=>{e.setSelection(r,"on"),e.setSelectionAttribute(Kg,t?"after":"before")})),!0)}_enableInsertingParagraphsOnButtonClick(){const t=this.editor,e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((i,n)=>{const s=n.domTarget.closest(".ck-widget__type-around__button");if(!s)return;const o=function(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}(s),r=function(t,e){const i=t.closest(".ck-widget");return e.mapDomToView(i)}(s,e.domConverter),a=t.editing.mapper.toModelElement(r);this._insertParagraph(a,o),n.preventDefault(),i.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor,e=t.model.document.selection,i=t.editing.view;this._listenToIfEnabled(i.document,"enter",((i,n)=>{if("atTarget"!=i.eventPhase)return;const s=e.getSelectedElement(),o=t.editing.mapper.toViewElement(s),r=t.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:Gg(o,s,r)&&(this._insertParagraph(s,n.isSoft?"before":"after"),a=!0),a&&(n.preventDefault(),i.stop())}),{context:Hg})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor.editing.view.document;this._listenToIfEnabled(t,"insertText",((e,i)=>{this._insertParagraphAccordingToFakeCaretPosition()&&(i.selection=t.selection)}),{priority:"high"}),r.isAndroid?this._listenToIfEnabled(t,"keydown",((t,e)=>{229==e.keyCode&&this._insertParagraphAccordingToFakeCaretPosition()})):this._listenToIfEnabled(t,"compositionstart",(()=>{this._insertParagraphAccordingToFakeCaretPosition()}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor,e=t.editing.view,i=t.model,n=i.schema;this._listenToIfEnabled(e.document,"delete",((e,s)=>{if("atTarget"!=e.eventPhase)return;const o=Jg(i.document.selection);if(!o)return;const r=s.direction,a=i.document.selection.getSelectedElement(),l="forward"==r;if("before"===o===l)t.execute("delete",{selection:i.createSelection(a,"on")});else{const e=n.getNearestSelectionRange(i.createPositionAt(a,o),r);if(e)if(e.isCollapsed){const s=i.createSelection(e.start);if(i.modifySelection(s,{direction:r}),s.focus.isEqual(e.start)){const t=function(t,e){let i=e;for(const n of e.getAncestors({parentFirst:!0})){if(n.childCount>1||t.isLimit(n))break;i=n}return i}(n,e.start.parent);i.deleteContent(i.createSelection(t,"on"),{doNotAutoparagraph:!0})}else i.change((i=>{i.setSelection(e),t.execute(l?"deleteForward":"delete")}))}else i.change((i=>{i.setSelection(e),t.execute(l?"deleteForward":"delete")}))}s.preventDefault(),e.stop()}),{context:Hg})}_enableInsertContentIntegration(){const t=this.editor,e=this.editor.model,i=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[n,s])=>{if(s&&!s.is("documentSelection"))return;const o=Jg(i);return o?(t.stop(),e.change((t=>{const s=i.getSelectedElement(),r=e.createPositionAt(s,o),a=t.createSelection(r),l=e.insertContent(n,a);return t.setSelection(a),l}))):void 0}),{priority:"high"})}_enableInsertObjectIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"insertObject",((t,i)=>{const[,n,,s={}]=i;if(n&&!n.is("documentSelection"))return;const o=Jg(e);o&&(s.findOptimalPosition=o,i[3]=s)}),{priority:"high"})}_enableDeleteContentIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"deleteContent",((t,[i])=>{if(i&&!i.is("documentSelection"))return;Jg(e)&&t.stop()}),{priority:"high"})}}function tp(t){const e=t.model;return(i,n)=>{const s=n.keyCode==Zs.arrowup,o=n.keyCode==Zs.arrowdown,r=n.shiftKey,a=e.document.selection;if(!s&&!o)return;const l=o;if(r&&function(t,e){return!t.isCollapsed&&t.isBackward==e}(a,l))return;const c=function(t,e,i){const n=t.model;if(i){const t=e.isCollapsed?e.focus:e.getLastPosition(),i=ep(n,t,"forward");if(!i)return null;const s=n.createRange(t,i),o=ip(n.schema,s,"backward");return o?n.createRange(t,o):null}{const t=e.isCollapsed?e.focus:e.getFirstPosition(),i=ep(n,t,"backward");if(!i)return null;const s=n.createRange(i,t),o=ip(n.schema,s,"forward");return o?n.createRange(o,t):null}}(t,a,l);if(c){if(c.isCollapsed){if(a.isCollapsed)return;if(r)return}(c.isCollapsed||function(t,e,i){const n=t.model,s=t.view.domConverter;if(i){const t=n.createSelection(e.start);n.modifySelection(t),t.focus.isAtEnd||e.start.isEqual(t.focus)||(e=n.createRange(t.focus,e.end))}const o=t.mapper.toViewRange(e),r=s.viewRangeToDom(o),a=Ps.getDomRangeRects(r);let l;for(const t of a)if(void 0!==l){if(Math.round(t.top)>=l)return!1;l=Math.max(l,Math.round(t.bottom))}else l=Math.round(t.bottom);return!0}(t,c,l))&&(e.change((t=>{const i=l?c.end:c.start;if(r){const n=e.createSelection(a.anchor);n.setFocus(i),t.setSelection(n)}else t.setSelection(i)})),i.stop(),n.preventDefault(),n.stopPropagation())}}}function ep(t,e,i){const n=t.schema,s=t.createRangeIn(e.root),o="forward"==i?"elementStart":"elementEnd";for(const{previousPosition:t,item:r,type:a}of s.getWalker({startPosition:e,direction:i})){if(n.isLimit(r)&&!n.isInline(r))return t;if(a==o&&n.isBlock(r))return null}return null}function ip(t,e,i){const n="backward"==i?e.end:e.start;if(t.checkChild(n,"$text"))return n;for(const{nextPosition:n}of e.getWalker({direction:i}))if(t.checkChild(n,"$text"))return n;return null}class np extends lr{static get pluginName(){return"Widget"}static get requires(){return[Xg,Fm]}init(){const t=this.editor,e=t.editing.view,i=e.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",((e,i,n)=>{const s=n.writer,o=i.selection;if(o.isCollapsed)return;const r=o.getSelectedElement();if(!r)return;const a=t.editing.mapper.toViewElement(r);var l;Hg(a)&&(n.consumable.consume(o,"selection")&&s.setSelection(s.createRangeOn(a),{fake:!0,label:(l=a,l.getCustomProperty("widgetLabel").reduce(((t,e)=>"function"==typeof e?t?t+". "+e():e():t?t+". "+e:e),""))}))})),this.editor.editing.downcastDispatcher.on("selection",((t,e,i)=>{this._clearPreviouslySelectedWidgets(i.writer);const n=i.writer,s=n.document.selection;let o=null;for(const t of s.getRanges())for(const e of t){const t=e.item;Hg(t)&&!sp(t,o)&&(n.addClass(zg,t),this._previouslySelected.add(t),o=t)}}),{priority:"low"}),e.addObserver(lf),this.listenTo(i,"mousedown",((...t)=>this._onMousedown(...t))),this.listenTo(i,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[Hg,"$text"]}),this.listenTo(i,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"}),this.listenTo(i,"arrowKey",tp(this.editor.editing),{context:"$text"}),this.listenTo(i,"delete",((t,e)=>{this._handleDelete("forward"==e.direction)&&(e.preventDefault(),t.stop())}),{context:"$root"})}_onMousedown(t,e){const i=this.editor,n=i.editing.view,s=n.document;let o=e.target;if(function(t){let e=t;for(;e;){if(e.is("editableElement")&&!e.is("rootElement"))return!0;if(Hg(e))return!1;e=e.parent}return!1}(o)){if((r.isSafari||r.isGecko)&&e.domEvent.detail>=3){const t=i.editing.mapper,n=o.is("attributeElement")?o.findAncestor((t=>!t.is("attributeElement"))):o,s=t.toModelElement(n);e.preventDefault(),this.editor.model.change((t=>{t.setSelection(s,"in")}))}return}if(!Hg(o)&&(o=o.findAncestor(Hg),!o))return;r.isAndroid&&e.preventDefault(),s.isFocused||n.focus();const a=i.editing.mapper.toModelElement(o);this._setSelectionOverElement(a)}_handleSelectionChangeOnArrowKeyPress(t,e){const i=e.keyCode,n=this.editor.model,s=n.schema,o=n.document.selection,r=o.getSelectedElement(),a=no(i,this.editor.locale.contentLanguageDirection),l="down"==a||"right"==a,c="up"==a||"down"==a;if(r&&s.isObject(r)){const i=l?o.getLastPosition():o.getFirstPosition(),r=s.getNearestSelectionRange(i,l?"forward":"backward");return void(r&&(n.change((t=>{t.setSelection(r)})),e.preventDefault(),t.stop()))}if(!o.isCollapsed&&!e.shiftKey){const i=o.getFirstPosition(),r=o.getLastPosition(),a=i.nodeAfter,c=r.nodeBefore;return void((a&&s.isObject(a)||c&&s.isObject(c))&&(n.change((t=>{t.setSelection(l?r:i)})),e.preventDefault(),t.stop()))}if(!o.isCollapsed)return;const h=this._getObjectElementNextToSelection(l);if(h&&s.isObject(h)){if(s.isInline(h)&&c)return;this._setSelectionOverElement(h),e.preventDefault(),t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const i=this.editor.model,n=i.schema,s=i.document.selection.getSelectedElement();s&&n.isObject(s)&&(e.preventDefault(),t.stop())}_handleDelete(t){if(this.editor.isReadOnly)return;const e=this.editor.model.document.selection;if(!e.isCollapsed)return;const i=this._getObjectElementNextToSelection(t);return i?(this.editor.model.change((t=>{let n=e.anchor.parent;for(;n.isEmpty;){const e=n;n=e.parent,t.remove(e)}this._setSelectionOverElement(i)})),!0):void 0}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model,i=e.schema,n=e.document.selection,s=e.createSelection(n);if(e.modifySelection(s,{direction:t?"forward":"backward"}),s.isEqual(n))return null;const o=t?s.focus.nodeBefore:s.focus.nodeAfter;return o&&i.isObject(o)?o:null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected)t.removeClass(zg,e);this._previouslySelected.clear()}}function sp(t,e){return!!e&&Array.from(t.getAncestors()).includes(e)}class op extends(q()){constructor(t){super(),this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=t,this._referenceCoordinates=null}get originalWidth(){return this._originalWidth}get originalHeight(){return this._originalHeight}get originalWidthPercents(){return this._originalWidthPercents}get aspectRatio(){return this._aspectRatio}begin(t,e,i){const n=new Rect(e);this.activeHandlePosition=function(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const i of e)if(t.classList.contains(getResizerHandleClass(i)))return i}(t),this._referenceCoordinates=function(t,e){const i=new Rect(t),n=e.split("-"),s={x:"right"==n[1]?i.right:i.left,y:"bottom"==n[0]?i.bottom:i.top};return s.x+=t.ownerDocument.defaultView.scrollX,s.y+=t.ownerDocument.defaultView.scrollY,s}(e,function(t){const e=t.split("-"),i={top:"bottom",bottom:"top",left:"right",right:"left"};return`${i[e[0]]}-${i[e[1]]}`}(this.activeHandlePosition)),this._originalWidth=n.width,this._originalHeight=n.height,this._aspectRatio=n.width/n.height;const s=i.style.width;s&&s.match(/^\d+(\.\d*)?%$/)?this._originalWidthPercents=parseFloat(s):this._originalWidthPercents=function(t,e){const i=t.parentElement,n=parseFloat(i.ownerDocument.defaultView.getComputedStyle(i).width);return e.width/n*100}(i,n)}update(t){this.proposedWidth=t.width,this.proposedHeight=t.height,this.proposedWidthPercents=t.widthPercents,this.proposedHandleHostWidth=t.handleHostWidth,this.proposedHandleHostHeight=t.handleHostHeight}}class rp extends(q()){constructor(t){super(),this._options=t,this._viewResizerWrapper=null,this.set("isEnabled",!0),this.set("isSelected",!1),this.bind("isVisible").to(this,"isEnabled",this,"isSelected",((t,e)=>t&&e)),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",(t=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),t.stop())}),{priority:"high"})}get state(){return this._state}show(){this._options.editor.editing.view.change((t=>{t.removeClass("ck-hidden",this._viewResizerWrapper)}))}hide(){this._options.editor.editing.view.change((t=>{t.addClass("ck-hidden",this._viewResizerWrapper)}))}attach(){const t=this,e=this._options.viewElement;this._options.editor.editing.view.change((i=>{const n=i.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(e){const i=this.toDomElement(e);return t._appendHandles(i),t._appendSizeUI(i),i}));i.insert(i.createPositionAt(e,"end"),n),i.addClass("ck-widget_with-resizer",e),this._viewResizerWrapper=n,this.isVisible||this.hide()})),this.on("change:isVisible",(()=>{this.isVisible?(this.show(),this.redraw()):this.hide()}))}begin(t){this._state=new ResizeState(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(t,this._getHandleHost(),this._getResizeHost())}updateSize(t){const e=this._proposeNewSize(t);this._options.editor.editing.view.change((t=>{const i=this._options.unit||"%",n=("%"===i?e.widthPercents:e.width)+i;t.setStyle("width",n,this._options.viewElement)}));const i=this._getHandleHost(),n=new Rect(i),s=Math.round(n.width),o=Math.round(n.height),r=new Rect(i);e.width=Math.round(r.width),e.height=Math.round(r.height),this.redraw(n),this.state.update({...e,handleHostWidth:s,handleHostHeight:o})}commit(){const t=this._options.unit||"%",e=("%"===t?this.state.proposedWidthPercents:this.state.proposedWidth)+t;this._options.editor.editing.view.change((()=>{this._cleanup(),this._options.onCommit(e)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(t){const e=this._domResizerWrapper;if(!(e&&i.ownerDocument&&i.ownerDocument.contains(i)))return;var i;const n=e.parentElement,s=this._getHandleHost(),o=this._viewResizerWrapper,r=[o.getStyle("width"),o.getStyle("height"),o.getStyle("left"),o.getStyle("top")];let a;if(n.isSameNode(s)){const e=t||new Rect(s);[e.width+"px",e.height+"px",void 0,void 0]}else[s.offsetWidth+"px",s.offsetHeight+"px",s.offsetLeft+"px",s.offsetTop+"px"];"same"!==compareArrays(r,a)&&this._options.editor.editing.view.change((t=>{t.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},o)}))}containsHandle(t){return this._domResizerWrapper.contains(t)}static isResizeHandle(t){return t.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change((t=>{t.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(t){const e=this.state,i={x:t.pageX,y:n.pageY};var n;const s=!this._options.isCentered||this._options.isCentered(this),o={x:e._referenceCoordinates.x-(i.x+e.originalWidth),y:i.y-e.originalHeight-e._referenceCoordinates.y};s&&e.activeHandlePosition.endsWith("-right")&&(o.x=i.x-(e._referenceCoordinates.x+e.originalWidth)),s&&(o.x*=2);let r=Math.abs(e.originalWidth+o.x),a=Math.abs(e.originalHeight+o.y);return"width"==(r/e.aspectRatio>a?"width":"height")?r/e.aspectRatio:a*e.aspectRatio,{width:Math.round(r),height:Math.round(a),widthPercents:Math.min(Math.round(e.originalWidthPercents/e.originalWidth*r*100)/100,100)}}_getResizeHost(){const t=this._domResizerWrapper.parentElement;return this._options.getResizeHost(t)}_getHandleHost(){const t=this._domResizerWrapper.parentElement;return this._options.getHandleHost(t)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e)t.appendChild(new Template({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(n,`ck-widget__resizer__handle-${i}`)}}).render());var i}_appendSizeUI(t){this._sizeView=new SizeView,this._sizeView.render(),t.appendChild(this._sizeView.element)}}var ap="Expected a function";const lp=function(t,e,i){var n=!0,s=!0;if("function"!=typeof t)throw new TypeError(ap);return F(i)&&(n="leading"in i?!!i.leading:n,s="trailing"in i?!!i.trailing:s),dc(t,e,{leading:n,maxWait:e,trailing:s})};class cp extends lr{static get pluginName(){return"DragDrop"}static get requires(){return[Vg,np]}init(){const t=this.editor,e=t.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,this._updateDropMarkerThrottled=lp((t=>this._updateDropMarker(t)),40),this._removeDropMarkerDelayed=up((()=>this._removeDropMarker()),40),this._clearDraggableAttributesDelayed=up((()=>this._clearDraggableAttributes()),40),e.addObserver(Rg),e.addObserver(lf),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDropMarker(),this._setupDraggableAttributeHandling(),this.listenTo(t,"change:isReadOnly",((t,e,i)=>{i?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})),this.on("change:isEnabled",((t,e,i)=>{i||this._finalizeDragging(!1)})),r.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._updateDropMarkerThrottled.cancel(),this._removeDropMarkerDelayed.cancel(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const t=this.editor,e=t.model,i=e.document,n=t.editing.view,s=n.document;this.listenTo(s,"dragstart",((n,o)=>{const r=i.selection;if(o.target&&o.target.is("editableElement"))return void o.preventDefault();const a=o.target?fp(o.target):null;if(a){const i=t.editing.mapper.toModelElement(a);this._draggedRange=Mh.fromRange(e.createRangeOn(i)),t.plugins.has("WidgetToolbarRepository")&&t.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}else if(!s.selection.isCollapsed){const t=s.selection.getSelectedElement();t&&Hg(t)||(this._draggedRange=Mh.fromRange(r.getFirstRange()))}if(!this._draggedRange)return void o.preventDefault();this._draggingUid=p(),o.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",o.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const l=e.createSelection(this._draggedRange.toRange()),c=t.data.toView(e.getSelectedContent(l));s.fire("clipboardOutput",{dataTransfer:o.dataTransfer,content:c,method:"dragstart"}),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")}),{priority:"low"}),this.listenTo(s,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&"move"==e.dataTransfer.dropEffect)}),{priority:"low"}),this.listenTo(s,"dragenter",(()=>{this.isEnabled&&n.focus()})),this.listenTo(s,"dragleave",(()=>{this._removeDropMarkerDelayed()})),this.listenTo(s,"dragging",((e,i)=>{if(!this.isEnabled)return void(i.dataTransfer.dropEffect="none");this._removeDropMarkerDelayed.cancel();const n=hp(t,i.targetRanges,i.target);this._draggedRange||(i.dataTransfer.dropEffect="copy"),r.isGecko||("copy"==i.dataTransfer.effectAllowed?i.dataTransfer.dropEffect="copy":["all","copyMove"].includes(i.dataTransfer.effectAllowed)&&(i.dataTransfer.dropEffect="move")),n&&this._updateDropMarkerThrottled(n)}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"clipboardInput",((e,i)=>{if("drop"!=i.method)return;const n=hp(t,i.targetRanges,i.target);if(this._removeDropMarker(),!n)return this._finalizeDragging(!1),void e.stop();this._draggedRange&&this._draggingUid!=i.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==dp(i.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(n,!0))return this._finalizeDragging(!1),void e.stop();i.targetRanges=[t.editing.mapper.toViewRange(n)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get(Vg);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const i=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(i)))}),{priority:"high"}),t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const i="move"==dp(e.dataTransfer),n=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(n&&i)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor,e=t.editing.view,i=e.document;this.listenTo(i,"mousedown",((n,s)=>{if(r.isAndroid||!s)return;this._clearDraggableAttributesDelayed.cancel();let o=fp(s.target);if(r.isBlink&&!t.isReadOnly&&!o&&!i.selection.isCollapsed){const t=i.selection.getSelectedElement();t&&Hg(t)||(o=i.selection.editableElement)}o&&(e.change((t=>{t.setAttribute("draggable","true",o)})),this._draggableElement=t.editing.mapper.toModelElement(o))})),this.listenTo(i,"mouseup",(()=>{r.isAndroid||this._clearDraggableAttributesDelayed()}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement)),this._draggableElement=null}))}_setupDropMarker(){const t=this.editor;t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:i})=>{if(t.model.schema.checkChild(e.markerRange.start,"$text"))return i.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);return e.append("⁠",t.createElement("span"),"⁠"),e}))}})}_updateDropMarker(t){const e=this.editor,i=e.model.markers;e.model.change((e=>{i.has("drop-target")?i.get("drop-target").getRange().isEqual(t)||e.updateMarker("drop-target",{range:t}):e.addMarker("drop-target",{range:t,usingOperation:!1,affectsData:!1})}))}_removeDropMarker(){const t=this.editor.model;this._removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),t.markers.has("drop-target")&&t.change((t=>{t.removeMarker("drop-target")}))}_finalizeDragging(t){const e=this.editor,i=e.model;this._removeDropMarker(),this._clearDraggableAttributes(),e.plugins.has("WidgetToolbarRepository")&&e.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop"),this._draggingUid="",this._draggedRange&&(t&&this.isEnabled&&i.deleteContent(i.createSelection(this._draggedRange),{doNotAutoparagraph:!0}),this._draggedRange.detach(),this._draggedRange=null)}}function hp(t,e,i){const n=t.model,s=t.editing.mapper;let o=null;const a=e?e[0].start:null;if(i.is("uiElement")&&(i=i.parent),o=function(t,e){const i=t.model,n=t.editing.mapper;if(Hg(e))return i.createRangeOn(n.toModelElement(e));if(!e.is("editableElement")){const t=e.findAncestor((t=>Hg(t)||t.is("editableElement")));if(Hg(t))return i.createRangeOn(n.toModelElement(t))}return null}(t,i),o)return o;const l=function(t,e){const i=t.editing.mapper,n=t.editing.view,s=i.toModelElement(e);if(s)return s;const o=n.createPositionBefore(e),r=i.findMappedViewAncestor(o);return i.toModelElement(r)}(t,i),c=a?s.toModelPosition(a):null;return c?(o=function(t,e,i){const n=t.model;if(!n.schema.checkChild(i,"$block"))return null;const s=n.createPositionAt(i,0),o=e.path.slice(0,s.path.length),r=n.createPositionFromPath(e.root,o),a=r.nodeAfter;if(a&&n.schema.isObject(a))return n.createRangeOn(a);return null}(t,c,l),o||(o=n.schema.getNearestSelectionRange(c,r.isGecko?"forward":"backward"),o||function(t,e){const i=t.model;let n=e;for(;n;){if(i.schema.isObject(n))return i.createRangeOn(n);n=n.parent}return null}(t,c.parent))):function(t,e){const i=t.model,n=i.schema,s=i.createPositionAt(e,0);return n.getNearestSelectionRange(s,"forward")}(t,l)}function dp(t){return r.isGecko?t.dropEffect:["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function up(t,e){let i;function n(...s){n.cancel(),i=setTimeout((()=>t(...s)),e)}return n.cancel=()=>{clearTimeout(i)},n}function fp(t){if(t.is("editableElement"))return null;if(t.hasClass("ck-widget__selection-handle"))return t.findAncestor(Hg);if(Hg(t))return t;const e=t.findAncestor((t=>Hg(t)||t.is("editableElement")));return Hg(e)?e:null}class mp extends lr{static get pluginName(){return"PastePlainText"}static get requires(){return[Vg]}init(){const t=this.editor,e=t.model,i=t.editing.view,n=i.document,s=e.document.selection;let o=!1;i.addObserver(Rg),this.listenTo(n,"keydown",((t,e)=>{o=e.shiftKey})),t.plugins.get(Vg).on("contentInsertion",((t,i)=>{(o||function(t,e){if(t.childCount>1)return!1;const i=t.getChild(0);if(e.isObject(i))return!1;return 0==Array.from(i.getAttributeKeys()).length}(i.content,e.schema))&&e.change((t=>{const n=Array.from(s.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));s.isCollapsed||e.deleteContent(s,{doNotAutoparagraph:!0}),n.push(...s.getAttributes());const o=t.createRangeIn(i.content);for(const e of o.getItems())e.is("$textProxy")&&t.setAttributes(n,e)}))}))}}class gp extends lr{static get pluginName(){return"Clipboard"}static get requires(){return[Vg,cp,mp]}}class pp extends hr{constructor(t){super(t),this.affectsData=!1}execute(){const t=this.editor.model,e=t.document.selection;let i=t.schema.getLimitElement(e);if(e.containsEntireContent(i)||!wp(t.schema,i))do{if(i=i.parent,!i)return}while(!wp(t.schema,i));t.change((t=>{t.setSelection(i,"in")}))}}function wp(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const bp=eo("Ctrl+A");class _p extends lr{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor,e=t.editing.view.document;t.commands.add("selectAll",new pp(t)),this.listenTo(e,"keydown",((e,i)=>{to(i)===bp&&(t.execute("selectAll"),i.preventDefault())}))}}class vp extends lr{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(e=>{const i=t.commands.get("selectAll"),n=new qo(e),s=e.t;return n.set({label:s("Select all"),icon:'',keystroke:"Ctrl+A",tooltip:!0}),n.bind("isEnabled").to(i,"isEnabled"),this.listenTo(n,"execute",(()=>{t.execute("selectAll"),t.editing.view.focus()})),n}))}}class yp extends lr{static get requires(){return[_p,vp]}static get pluginName(){return"SelectAll"}}class kp extends hr{constructor(t){super(t),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this.listenTo(t.data,"set",((t,e)=>{e[1]={...e[1]};const i=e[1];i.batchType||(i.batchType={isUndoable:!1})}),{priority:"high"}),this.listenTo(t.data,"set",((t,e)=>{e[1].batchType.isUndoable||this.clearStack()}))}refresh(){this.isEnabled=this._stack.length>0}addBatch(t){const e=this.editor.model.document.selection,i={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:i}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(t,e,i){const n=this.editor.model,s=n.document,o=[],r=t.map((t=>t.getTransformedByOperations(i))),a=r.flat();for(const t of r){const e=t.filter((t=>t.root!=s.graveyard)).filter((t=>!xp(t,a)));e.length&&(Ap(e),o.push(e[0]))}o.length&&n.change((t=>{t.setSelection(o,{backward:e})}))}_undo(t,e){const i=this.editor.model,n=i.document;this._createdBatches.add(e);const s=t.operations.slice().filter((t=>t.isDocumentOperation));s.reverse();for(const t of s){const s=t.baseVersion+1,o=Array.from(n.history.getOperations(s)),r=hu([t.getReversed()],o,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const s of r)e.addOperation(s),i.applyOperation(s),n.history.setOperationAsUndone(t,s)}}}function Ap(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;ee!==t&&e.containsRange(t,!0)))}class Cp extends kp{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1,i=this._stack.splice(e,1)[0],n=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(n,(()=>{this._undo(i.batch,n);const t=this.editor.model.document.history.getOperations(i.batch.baseVersion);this._restoreSelection(i.selection.ranges,i.selection.isBackward,t),this.fire("revert",i.batch,n)})),this.refresh()}}class Pp extends kp{execute(){const t=this._stack.pop(),e=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(e,(()=>{const i=t.batch.operations[t.batch.operations.length-1].baseVersion+1,n=this.editor.model.document.history.getOperations(i);this._restoreSelection(t.selection.ranges,t.selection.isBackward,n),this._undo(t.batch,e)})),this.refresh()}}class Tp extends lr{static get pluginName(){return"UndoEditing"}constructor(t){super(t),this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new Cp(t),this._redoCommand=new Pp(t),t.commands.add("undo",this._undoCommand),t.commands.add("redo",this._redoCommand),this.listenTo(t.model,"applyOperation",((t,e)=>{const i=e[0];if(!i.isDocumentOperation)return;const n=i.batch,s=this._redoCommand._createdBatches.has(n),o=this._undoCommand._createdBatches.has(n);this._batchRegistry.has(n)||(this._batchRegistry.add(n),n.isUndoable&&(s?this._undoCommand.addBatch(n):o||(this._undoCommand.addBatch(n),this._redoCommand.clearStack())))}),{priority:"highest"}),this.listenTo(this._undoCommand,"revert",((t,e,i)=>{this._redoCommand.addBatch(i)})),t.keystrokes.set("CTRL+Z","undo"),t.keystrokes.set("CTRL+Y","redo"),t.keystrokes.set("CTRL+SHIFT+Z","redo")}}const Ep='',Sp='';class Rp extends lr{static get pluginName(){return"UndoUI"}init(){const t=this.editor,e=t.locale,i=t.t,n="ltr"==e.uiLanguageDirection?Ep:Sp,s="ltr"==e.uiLanguageDirection?Sp:Ep;this._addButton("undo",i("Undo"),"CTRL+Z",n),this._addButton("redo",i("Redo"),"CTRL+Y",s)}_addButton(t,e,i,n){const s=this.editor;s.ui.componentFactory.add(t,(o=>{const r=s.commands.get(t),a=new qo(o);return a.set({label:e,icon:n,keystroke:i,tooltip:!0}),a.bind("isEnabled").to(r,"isEnabled"),this.listenTo(a,"execute",(()=>{s.execute(t),s.editing.view.focus()})),a}))}}class Op extends lr{static get requires(){return[Tp,Rp]}static get pluginName(){return"Undo"}}class Ip extends hr{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=e.selection.getAttribute(this.attributeKey),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=t.value;e.change((t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,n):t.removeSelectionAttribute(this.attributeKey);else{const s=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of s)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}}))}}class Vp extends co{constructor(t){super(t),this.set("isEmpty",!0),this.on("change",(()=>{this.set("isEmpty",0===this.length)}))}add(t,e){this.find((e=>e.color===t.color))||super.add(t,e)}hasColor(t){return!!this.find((e=>e.color===t))}}u(Vp,q);class Mp extends yo{constructor(t,{colors:e,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o}){super(t),this.items=this.createCollection(),this.colorDefinitions=e,this.focusTracker=new uo,this.keystrokes=new fo,this.set("selectedColor"),this.removeButtonLabel=n,this.columns=i,this.documentColors=new Vp,this.documentColorsCount=o,this._focusables=new vo,this._focusCycler=new nr({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this._documentColorsLabel=s,this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-table"]},children:this.items}),this.items.add(this._createRemoveColorButton())}updateDocumentColors(t,e){const i=t.document,n=this.documentColorsCount;this.documentColors.clear();for(const s of i.getRootNames()){const o=i.getRoot(s),r=t.createRangeIn(o);for(const t of r.getItems())if(t.is("$textProxy")&&t.hasAttribute(e)&&(this._addColorToDocumentColors(t.getAttribute(e)),this.documentColors.length>=n))return}}updateSelectedColors(){const t=this.documentColorsGrid,e=this.staticColorsGrid,i=this.selectedColor;e.selectedColor=i,t&&(t.selectedColor=i)}render(){super.render(),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}appendGrids(){if(!this.staticColorsGrid&&(this.staticColorsGrid=this._createStaticColorsGrid(),this.items.add(this.staticColorsGrid),this.focusTracker.add(this.staticColorsGrid.element),this._focusables.add(this.staticColorsGrid),this.documentColorsCount)){const t=ko.bind(this.documentColors,this.documentColors),e=new Gf(this.locale);e.text=this._documentColorsLabel,e.extendTemplate({attributes:{class:["ck","ck-color-grid__label",t.if("isEmpty","ck-hidden")]}}),this.items.add(e),this.documentColorsGrid=this._createDocumentColorsGrid(),this.items.add(this.documentColorsGrid),this.focusTracker.add(this.documentColorsGrid.element),this._focusables.add(this.documentColorsGrid)}}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}_createRemoveColorButton(){const t=new qo;return t.set({withText:!0,icon:yf.eraser,label:this.removeButtonLabel}),t.class="ck-color-table__remove-color",t.on("execute",(()=>{this.fire("execute",{value:null})})),t.render(),this.focusTracker.add(t.element),this._focusables.add(t),t}_createStaticColorsGrid(){const t=new Jo(this.locale,{colorDefinitions:this.colorDefinitions,columns:this.columns});return t.delegate("execute").to(this),t}_createDocumentColorsGrid(){const t=ko.bind(this.documentColors,this.documentColors),e=new Jo(this.locale,{columns:this.columns});return e.delegate("execute").to(this),e.extendTemplate({attributes:{class:t.if("isEmpty","ck-hidden")}}),e.items.bindTo(this.documentColors).using((t=>{const e=new Go;return e.set({color:t.color,hasBorder:t.options&&t.options.hasBorder}),t.label&&e.set({label:t.label,tooltip:!0}),e.on("execute",(()=>{this.fire("execute",{value:t.color})})),e})),this.documentColors.on("change:isEmpty",((t,i,n)=>{n&&(e.selectedColor=null)})),e}_addColorToDocumentColors(t){const e=this.colorDefinitions.find((e=>e.color===t));e?this.documentColors.add(Object.assign({},e)):this.documentColors.add({color:t,label:t,options:{hasBorder:!1}})}}const Np="fontSize",Bp="fontFamily",Dp="fontColor";function Fp(t,e){const i={model:{key:t,values:[]},view:{},upcastAlso:{}};for(const t of e)i.model.values.push(t.model),i.view[t.model]=t.view,t.upcastAlso&&(i.upcastAlso[t.model]=t.upcastAlso);return i}function Lp(t){return(e,{writer:i})=>i.createAttributeElement("span",{style:`${t}:${e}`},{priority:7})}class zp extends Ip{constructor(t){super(t,Dp)}}class Hp extends lr{static get pluginName(){return"FontColorEditing"}constructor(t){var e;super(t),t.config.define(Dp,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5}),t.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{color:/[\s\S]+/}},model:{key:Dp,value:(e="color",t=>t.getStyle(e).replace(/\s/g,""))}}),t.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{color:/^#?\w+$/}},model:{key:Dp,value:t=>t.getAttribute("color")}}),t.conversion.for("downcast").attributeToElement({model:Dp,view:Lp("color")}),t.commands.add(Dp,new zp(t)),t.model.schema.extend("$text",{allowAttributes:Dp}),t.model.schema.setAttributeProperties(Dp,{isFormatting:!0,copyOnEnter:!0})}}class jp extends lr{constructor(t,{commandName:e,icon:i,componentName:n,dropdownLabel:s}){super(t),this.commandName=e,this.componentName=n,this.icon=i,this.dropdownLabel=s,this.columns=t.config.get(`${this.componentName}.columns`),this.colorTableView=void 0}init(){const t=this.editor,e=t.locale,i=e.t,n=t.commands.get(this.commandName);const s=function(t,e){const i=t.t,n={Black:i("Black"),"Dim grey":i("Dim grey"),Grey:i("Grey"),"Light grey":i("Light grey"),White:i("White"),Red:i("Red"),Orange:i("Orange"),Yellow:i("Yellow"),"Light green":i("Light green"),Green:i("Green"),Aquamarine:i("Aquamarine"),Turquoise:i("Turquoise"),"Light blue":i("Light blue"),Blue:i("Blue"),Purple:i("Purple")};return e.map((t=>{const e=n[t.label];return e&&e!=t.label&&(t.label=e),t}))}(e,t.config.get(this.componentName).colors.map(Ko).filter((t=>!!t))),o=t.config.get(`${this.componentName}.documentColors`);t.ui.componentFactory.add(this.componentName,(e=>{const r=Of(e);return this.colorTableView=function({dropdownView:t,colors:e,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o}){const r=t.locale,a=new Mp(r,{colors:e,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o});return t.colorTableView=a,t.panelView.children.add(a),a.delegate("execute").to(t,"execute"),a}({dropdownView:r,colors:s.map((t=>({label:t.label,color:t.model,options:{hasBorder:t.hasBorder}}))),columns:this.columns,removeButtonLabel:i("Remove color"),documentColorsLabel:0!==o?i("Document colors"):void 0,documentColorsCount:void 0===o?this.columns:o}),this.colorTableView.bind("selectedColor").to(n,"value"),r.buttonView.set({label:this.dropdownLabel,icon:this.icon,tooltip:!0}),r.extendTemplate({attributes:{class:"ck-color-ui-dropdown"}}),r.bind("isEnabled").to(n),r.on("execute",((e,i)=>{t.execute(this.commandName,i),t.editing.view.focus()})),r.on("change:isOpen",((e,i,n)=>{r.colorTableView.appendGrids(),n&&(0!==o&&this.colorTableView.updateDocumentColors(t.model,this.componentName),this.colorTableView.updateSelectedColors())})),Bf(r,(()=>r.colorTableView.staticColorsGrid.items.find((t=>t.isOn)))),r}))}}class $p extends jp{constructor(t){const e=t.locale.t;super(t,{commandName:Dp,componentName:Dp,icon:'',dropdownLabel:e("Font Color")})}static get pluginName(){return"FontColorUI"}}class Wp extends Ip{constructor(t){super(t,Bp)}}function qp(t){return t.map(Up).filter((t=>!!t))}function Up(t){return"object"==typeof t?t:"default"===t?{title:"Default",model:void 0}:"string"==typeof t?function(t){const e=t.replace(/"|'/g,"").split(","),i=e[0],n=e.map(Kp).join(", ");return{title:i,model:n,view:{name:"span",styles:{"font-family":n},priority:7}}}(t):void 0}function Kp(t){return(t=t.trim()).indexOf(" ")>0&&(t=`'${t}'`),t}class Gp extends lr{static get pluginName(){return"FontFamilyEditing"}constructor(t){super(t),t.config.define(Bp,{options:["default","Arial, Helvetica, sans-serif","Courier New, Courier, monospace","Georgia, serif","Lucida Sans Unicode, Lucida Grande, sans-serif","Tahoma, Geneva, sans-serif","Times New Roman, Times, serif","Trebuchet MS, Helvetica, sans-serif","Verdana, Geneva, sans-serif"],supportAllValues:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Bp}),t.model.schema.setAttributeProperties(Bp,{isFormatting:!0,copyOnEnter:!0});const e=qp(t.config.get("fontFamily.options")).filter((t=>t.model)),i=Fp(Bp,e);t.config.get("fontFamily.supportAllValues")?(this._prepareAnyValueConverters(),this._prepareCompatibilityConverter()):t.conversion.attributeToElement(i),t.commands.add(Bp,new Wp(t))}_prepareAnyValueConverters(){const t=this.editor;t.conversion.for("downcast").attributeToElement({model:Bp,view:(t,{writer:e})=>e.createAttributeElement("span",{style:"font-family:"+t},{priority:7})}),t.conversion.for("upcast").elementToAttribute({model:{key:Bp,value:t=>t.getStyle("font-family")},view:{name:"span",styles:{"font-family":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{face:/.*/}},model:{key:Bp,value:t=>t.getAttribute("face")}})}}class Jp extends lr{static get pluginName(){return"FontFamilyUI"}init(){const t=this.editor,e=t.t,i=this._getLocalizedOptions(),n=t.commands.get(Bp);t.ui.componentFactory.add(Bp,(s=>{const o=Of(s);return Mf(o,(()=>function(t,e){const i=new co;for(const n of t){const t={type:"button",model:new sm({commandName:Bp,commandParam:n.model,label:n.title,withText:!0})};t.model.bind("isOn").to(e,"value",(t=>t===n.model||!(!t||!n.model)&&t.split(",")[0].replace(/'/g,"").toLowerCase()===n.model.toLowerCase())),n.view&&n.view.styles&&t.model.set("labelStyle",`font-family: ${n.view.styles["font-family"]}`),i.add(t)}return i}(i,n))),o.buttonView.set({label:e("Font Family"),icon:'',tooltip:!0}),o.extendTemplate({attributes:{class:"ck-font-family-dropdown"}}),o.bind("isEnabled").to(n),this.listenTo(o,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam}),t.editing.view.focus()})),o}))}_getLocalizedOptions(){const t=this.editor,e=t.t;return qp(t.config.get(Bp).options).map((t=>("Default"===t.title&&(t.title=e("Default")),t)))}}class Qp extends Ip{constructor(t){super(t,Np)}}function Yp(t){return t.map((t=>function(t){if(e=t,"object"==typeof e&&e.title&&e.model&&e.view)return Xp(t);var e;const i=function(t){return Zp[t]||Zp[t.model]}(t);if(i)return Xp(i);if("default"===t)return{model:void 0,title:"Default"};if(function(t){let e;if("object"==typeof t){if(!t.model)throw new v("font-size-invalid-definition",null,t);e=parseFloat(t.model)}else e=parseFloat(t);return isNaN(e)}(t))return;return function(t){"number"!=typeof t&&"string"!=typeof t||(t={title:String(t),model:`${parseFloat(t)}px`});return t.view={name:"span",styles:{"font-size":t.model}},Xp(t)}(t)}(t))).filter((t=>!!t))}const Zp={get tiny(){return{title:"Tiny",model:"tiny",view:{name:"span",classes:"text-tiny",priority:7}}},get small(){return{title:"Small",model:"small",view:{name:"span",classes:"text-small",priority:7}}},get big(){return{title:"Big",model:"big",view:{name:"span",classes:"text-big",priority:7}}},get huge(){return{title:"Huge",model:"huge",view:{name:"span",classes:"text-huge",priority:7}}}};function Xp(t){return t.view.priority||(t.view.priority=7),t}const tw=["x-small","x-small","small","medium","large","x-large","xx-large","xxx-large"];class ew extends lr{static get pluginName(){return"FontSizeEditing"}constructor(t){super(t),t.config.define(Np,{options:["tiny","small","default","big","huge"],supportAllValues:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Np}),t.model.schema.setAttributeProperties(Np,{isFormatting:!0,copyOnEnter:!0});const e=t.config.get("fontSize.supportAllValues"),i=Yp(this.editor.config.get("fontSize.options")).filter((t=>t.model)),n=Fp(Np,i);e?(this._prepareAnyValueConverters(n),this._prepareCompatibilityConverter()):t.conversion.attributeToElement(n),t.commands.add(Np,new Qp(t))}_prepareAnyValueConverters(t){const e=this.editor,i=t.model.values.filter((t=>{return!(e=String(t),hf.test(e)||function(t){return df.test(t)}(String(t)));var e}));if(i.length)throw new v("font-size-invalid-use-of-named-presets",null,{presets:i});e.conversion.for("downcast").attributeToElement({model:Np,view:(t,{writer:e})=>{if(t)return e.createAttributeElement("span",{style:"font-size:"+t},{priority:7})}}),e.conversion.for("upcast").elementToAttribute({model:{key:Np,value:t=>t.getStyle("font-size")},view:{name:"span",styles:{"font-size":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{size:/^[+-]?\d{1,3}$/}},model:{key:Np,value:t=>{const e=t.getAttribute("size"),i="-"===e[0]||"+"===e[0];let n=parseInt(e,10);i&&(n=3+n);const s=tw.length-1,o=Math.min(Math.max(n,0),s);return tw[o]}}})}}class iw extends lr{static get pluginName(){return"FontSizeUI"}init(){const t=this.editor,e=t.t,i=this._getLocalizedOptions(),n=t.commands.get(Np);t.ui.componentFactory.add(Np,(s=>{const o=Of(s);return Mf(o,(()=>function(t,e){const i=new co;for(const n of t){const t={type:"button",model:new sm({commandName:Np,commandParam:n.model,label:n.title,class:"ck-fontsize-option",withText:!0})};n.view&&n.view.styles&&t.model.set("labelStyle",`font-size:${n.view.styles["font-size"]}`),n.view&&n.view.classes&&t.model.set("class",`${t.model.class} ${n.view.classes}`),t.model.bind("isOn").to(e,"value",(t=>t===n.model)),i.add(t)}return i}(i,n))),o.buttonView.set({label:e("Font Size"),icon:'',tooltip:!0}),o.extendTemplate({attributes:{class:["ck-font-size-dropdown"]}}),o.bind("isEnabled").to(n),this.listenTo(o,"execute",(e=>{t.execute(e.source.commandName,{value:e.source.commandParam}),t.editing.view.focus()})),o}))}_getLocalizedOptions(){const t=this.editor,e=t.t,i={Default:e("Default"),Tiny:e("Tiny"),Small:e("Small"),Big:e("Big"),Huge:e("Huge")};return Yp(t.config.get(Np).options).map((t=>{const e=i[t.title];return e&&e!=t.title&&(t=Object.assign({},t,{title:e})),t}))}}class nw extends hr{refresh(){const t=this.editor.model,e=ho(t.document.selection.getSelectedBlocks());this.value=!!e&&e.is("element","paragraph"),this.isEnabled=!!e&&sw(e,t.schema)}execute(t={}){const e=this.editor.model,i=e.document;e.change((n=>{const s=(t.selection||i.selection).getSelectedBlocks();for(const t of s)!t.is("element","paragraph")&&sw(t,e.schema)&&n.rename(t,"paragraph")}))}}function sw(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class ow extends hr{execute(t){const e=this.editor.model,i=t.attributes;let n=t.position;e.change((t=>{const s=t.createElement("paragraph");if(i&&e.schema.setAllowedAttributes(s,i,t),!e.schema.checkChild(n.parent,s)){const i=e.schema.findAllowedParent(n,s);if(!i)return;n=t.split(n,i).position}e.insertContent(s,n),t.setSelection(s,"in")}))}}class rw extends lr{static get pluginName(){return"Paragraph"}init(){const t=this.editor,e=t.model;t.commands.add("paragraph",new nw(t)),t.commands.add("insertParagraph",new ow(t)),e.schema.register("paragraph",{inheritAllFrom:"$block"}),t.conversion.elementToElement({model:"paragraph",view:"p"}),t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>rw.paragraphLikeElements.has(t.name)?t.isEmpty?null:e.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}rw.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);class aw extends hr{constructor(t,e){super(t),this.modelElements=e}refresh(){const t=ho(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name,this.isEnabled=!!t&&this.modelElements.some((e=>lw(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model,i=e.document,n=t.value;e.change((t=>{const s=Array.from(i.selection.getSelectedBlocks()).filter((t=>lw(t,n,e.schema)));for(const e of s)e.is("element",n)||t.rename(e,n)}))}}function lw(t,e,i){return i.checkChild(t.parent,e)&&!i.isObject(t)}const cw="paragraph";class hw extends lr{static get pluginName(){return"HeadingEditing"}constructor(t){super(t),t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[rw]}init(){const t=this.editor,e=t.config.get("heading.options"),i=[];for(const n of e)"paragraph"!==n.model&&(t.model.schema.register(n.model,{inheritAllFrom:"$block"}),t.conversion.elementToElement(n),i.push(n.model));this._addDefaultH1Conversion(t),t.commands.add("heading",new aw(t,i))}afterInit(){const t=this.editor,e=t.commands.get("enter"),i=t.config.get("heading.options");e&&this.listenTo(e,"afterExecute",((e,n)=>{const s=t.model.document.selection.getFirstPosition().parent;i.some((t=>s.is("element",t.model)))&&!s.is("element",cw)&&0===s.childCount&&n.writer.rename(s,cw)}))}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:w.get("low")+1})}}class dw extends lr{static get pluginName(){return"HeadingUI"}init(){const t=this.editor,e=t.t,i=function(t){const e=t.t,i={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=i[t.title];return e&&e!=t.title&&(t.title=e),t}))}(t),n=e("Choose heading"),s=e("Heading");t.ui.componentFactory.add("heading",(e=>{const o={},r=new co,a=t.commands.get("heading"),l=t.commands.get("paragraph"),c=[a];for(const t of i){const e={type:"button",model:new sm({label:t.title,class:t.class,withText:!0})};"paragraph"===t.model?(e.model.bind("isOn").to(l,"value"),e.model.set("commandName","paragraph"),c.push(l)):(e.model.bind("isOn").to(a,"value",(e=>e===t.model)),e.model.set({commandName:"heading",commandValue:t.model})),r.add(e),o[t.model]=t.title}const h=Of(e);return Mf(h,r),h.buttonView.set({isOn:!1,withText:!0,tooltip:s}),h.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),h.bind("isEnabled").toMany(c,"isEnabled",((...t)=>t.some((t=>t)))),h.buttonView.bind("label").to(a,"value",l,"value",((t,e)=>{const i=t||e&&"paragraph";return"boolean"==typeof i?n:o[i]?o[i]:n})),this.listenTo(h,"execute",(e=>{const{commandName:i,commandValue:n}=e.source;t.execute(i,n?{value:n}:void 0),t.editing.view.focus()})),h}))}}class uw extends hr{refresh(){const t=this.editor.model,e=t.schema,i=t.document.selection;this.isEnabled=function(t,e,i){const n=function(t,e){const i=function(t,e){const i=t.getSelectedElement();if(i){const n=Jg(t);if(n)return e.createRange(e.createPositionAt(i,n))}return Zu(t,e)}(t,e),n=i.start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(t,i);return e.checkChild(n,"horizontalLine")}(i,e,t)}execute(){const t=this.editor.model;t.change((e=>{const i=e.createElement("horizontalLine");t.insertObject(i,null,null,{setSelection:"after"})}))}}class fw extends lr{static get pluginName(){return"HorizontalLineEditing"}init(){const t=this.editor,e=t.model.schema,i=t.t,n=t.conversion;e.register("horizontalLine",{inheritAllFrom:"$blockObject"}),n.for("dataDowncast").elementToElement({model:"horizontalLine",view:(t,{writer:e})=>e.createEmptyElement("hr")}),n.for("editingDowncast").elementToStructure({model:"horizontalLine",view:(t,{writer:e})=>{const n=i("Horizontal line"),s=e.createContainerElement("div",null,e.createEmptyElement("hr"));return e.addClass("ck-horizontal-line",s),e.setCustomProperty("hr",!0,s),function(t,e,i){return e.setCustomProperty("horizontalLine",!0,t),jg(t,e,{label:i})}(s,e,n)}}),n.for("upcast").elementToElement({view:"hr",model:"horizontalLine"}),t.commands.add("horizontalLine",new uw(t))}}class mw extends lr{static get pluginName(){return"HorizontalLineUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("horizontalLine",(i=>{const n=t.commands.get("horizontalLine"),s=new qo(i);return s.set({label:e("Horizontal line"),icon:'',tooltip:!0}),s.bind("isEnabled").to(n,"isEnabled"),this.listenTo(s,"execute",(()=>{t.execute("horizontalLine"),t.editing.view.focus()})),s}))}}class gw extends lr{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new ur(t)),t.commands.add("outdent",new ur(t))}}const pw='',ww='';class bw extends lr{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,i=t.t,n="ltr"==e.uiLanguageDirection?pw:ww,s="ltr"==e.uiLanguageDirection?ww:pw;this._defineButton("indent",i("Increase indent"),n),this._defineButton("outdent",i("Decrease indent"),s)}_defineButton(t,e,i){const n=this.editor;n.ui.componentFactory.add(t,(s=>{const o=n.commands.get(t),r=new qo(s);return r.set({label:e,icon:i,tooltip:!0}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(r,"execute",(()=>{n.execute(t),n.editing.view.focus()})),r}))}}class _w extends hr{constructor(t,e){super(t),this._indentBehavior=e}refresh(){const t=this.editor.model,e=ho(t.document.selection.getSelectedBlocks());e&&t.schema.checkAttribute(e,"blockIndent")?this.isEnabled=this._indentBehavior.checkEnabled(e.getAttribute("blockIndent")):this.isEnabled=!1}execute(){const t=this.editor.model,e=function(t){const e=t.document.selection,i=t.schema;return Array.from(e.getSelectedBlocks()).filter((t=>i.checkAttribute(t,"blockIndent")))}(t);t.change((t=>{for(const i of e){const e=i.getAttribute("blockIndent"),n=this._indentBehavior.getNextIndent(e);n?t.setAttribute("blockIndent",n,i):t.removeAttribute("blockIndent",i)}}))}}class vw{constructor(t){this.isForward="forward"===t.direction,this.offset=t.offset,this.unit=t.unit}checkEnabled(t){const e=parseFloat(t||0);return this.isForward||e>0}getNextIndent(t){const e=parseFloat(t||0);if(!(!t||t.endsWith(this.unit)))return this.isForward?this.offset+this.unit:void 0;const i=e+(this.isForward?this.offset:-this.offset);return i>0?i+this.unit:void 0}}class yw{constructor(t){this.isForward="forward"===t.direction,this.classes=t.classes}checkEnabled(t){const e=this.classes.indexOf(t);return this.isForward?e=0}getNextIndent(t){const e=this.classes.indexOf(t),i=this.isForward?1:-1;return this.classes[e+i]}}const kw=["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"];const Aw="italic";class xw extends lr{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Aw}),t.model.schema.setAttributeProperties(Aw,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:Aw,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(Aw,new Cg(t,Aw)),t.keystrokes.set("CTRL+I",Aw)}}const Cw="italic";class Pw extends lr{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Cw,(i=>{const n=t.commands.get(Cw),s=new qo(i);return s.set({label:e("Italic"),icon:'',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(Cw),t.editing.view.focus()})),s}))}}class Tw{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){Array.isArray(t)?t.forEach((t=>this._definitions.add(t))):this._definitions.add(t)}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,i)=>{if(!i.consumable.test(e.item,"attribute:linkHref"))return;if(!e.item.is("selection")&&!i.schema.isInline(e.item))return;const n=i.writer,s=n.document.selection;for(const t of this._definitions){const o=n.createAttributeElement("a",t.attributes,{priority:5});t.classes&&n.addClass(t.classes,o);for(const e in t.styles)n.setStyle(e,t.styles[e],o);n.setCustomProperty("link",!0,o),t.callback(e.attributeNewValue)?e.item.is("selection")?n.wrap(s.getFirstRange(),o):n.wrap(i.mapper.toViewRange(e.range),o):n.unwrap(i.mapper.toViewRange(e.range),o)}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:imageBlock",((t,e,{writer:i,mapper:n})=>{const s=n.toViewElement(e.item),o=Array.from(s.getChildren()).find((t=>"a"===t.name));for(const t of this._definitions){const n=mo(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of n)"class"===t?i.addClass(e,o):i.setAttribute(t,e,o);t.classes&&i.addClass(t.classes,o);for(const e in t.styles)i.setStyle(e,t.styles[e],o)}else{for(const[t,e]of n)"class"===t?i.removeClass(e,o):i.removeAttribute(t,o);t.classes&&i.removeClass(t.classes,o);for(const e in t.styles)i.removeStyle(e,o)}}}))}}}const Ew=function(t,e,i){var n=t.length;return i=void 0===i?n:i,!e&&i>=n?t:ta(t,e,i)};var Sw=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const Rw=function(t){return Sw.test(t)};const Ow=function(t){return t.split("")};var Iw="\\ud800-\\udfff",Vw="["+Iw+"]",Mw="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Nw="\\ud83c[\\udffb-\\udfff]",Bw="[^"+Iw+"]",Dw="(?:\\ud83c[\\udde6-\\uddff]){2}",Fw="[\\ud800-\\udbff][\\udc00-\\udfff]",Lw="(?:"+Mw+"|"+Nw+")"+"?",zw="[\\ufe0e\\ufe0f]?",Hw=zw+Lw+("(?:\\u200d(?:"+[Bw,Dw,Fw].join("|")+")"+zw+Lw+")*"),jw="(?:"+[Bw+Mw+"?",Mw,Dw,Fw,Vw].join("|")+")",$w=RegExp(Nw+"(?="+Nw+")|"+jw+Hw,"g");const Ww=function(t){return t.match($w)||[]};const qw=function(t){return Rw(t)?Ww(t):Ow(t)};const Uw=function(t){return function(e){e=Gr(e);var i=Rw(e)?qw(e):void 0,n=i?i[0]:e.charAt(0),s=i?Ew(i,1).join(""):e.slice(1);return n[t]()+s}}("toUpperCase"),Kw=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,Gw=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i,Jw=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,Qw=/^((\w+:(\/{2,})?)|(\W))/i,Yw="Ctrl+K";function Zw(t,{writer:e}){const i=e.createAttributeElement("a",{href:t},{priority:5});return e.setCustomProperty("link",!0,i),i}function Xw(t){return function(t){const e=t.replace(Kw,"");return e.match(Gw)}(t=String(t))?t:"#"}function tb(t,e){return!!t&&e.checkAttribute(t.name,"linkHref")}function eb(t,e){const i=(n=t,Jw.test(n)?"mailto:":e);var n;const s=!!i&&!ib(t);return t&&s?i+t:t}function ib(t){return Qw.test(t)}function nb(t){window.open(t,"_blank","noopener")}class sb extends hr{constructor(t){super(t),this.manualDecorators=new co,this.automaticDecorators=new Tw}restoreManualDecoratorStates(){for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}refresh(){const t=this.editor.model,e=t.document.selection,i=e.getSelectedElement()||ho(e.getSelectedBlocks());tb(i,t.schema)?(this.value=i.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttribute(i,"linkHref")):(this.value=e.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref"));for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}execute(t,e={}){const i=this.editor.model,n=i.document.selection,s=[],o=[];for(const t in e)e[t]?s.push(t):o.push(t);i.change((e=>{if(n.isCollapsed){const r=n.getFirstPosition();if(n.hasAttribute("linkHref")){const a=ng(r,"linkHref",n.getAttribute("linkHref"),i);e.setAttribute("linkHref",t,a),s.forEach((t=>{e.setAttribute(t,!0,a)})),o.forEach((t=>{e.removeAttribute(t,a)})),e.setSelection(e.createPositionAfter(a.end.nodeBefore))}else if(""!==t){const o=mo(n.getAttributes());o.set("linkHref",t),s.forEach((t=>{o.set(t,!0)}));const{end:a}=i.insertContent(e.createText(t,o),r);e.setSelection(a)}["linkHref",...s,...o].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const r=i.schema.getValidRanges(n.getRanges(),"linkHref"),a=[];for(const t of n.getSelectedBlocks())i.schema.checkAttribute(t,"linkHref")&&a.push(e.createRangeOn(t));const l=a.slice();for(const t of r)this._isRangeToUpdate(t,a)&&l.push(t);for(const i of l)e.setAttribute("linkHref",t,i),s.forEach((t=>{e.setAttribute(t,!0,i)})),o.forEach((t=>{e.removeAttribute(t,i)}))}}))}_getDecoratorStateFromModel(t){const e=this.editor.model,i=e.document.selection,n=i.getSelectedElement();return tb(n,e.schema)?n.getAttribute(t):i.getAttribute(t)}_isRangeToUpdate(t,e){for(const i of e)if(i.containsRange(t))return!1;return!0}}class ob extends hr{refresh(){const t=this.editor.model,e=t.document.selection,i=e.getSelectedElement();tb(i,t.schema)?this.isEnabled=t.schema.checkAttribute(i,"linkHref"):this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref")}execute(){const t=this.editor,e=this.editor.model,i=e.document.selection,n=t.commands.get("link");e.change((t=>{const s=i.isCollapsed?[ng(i.getFirstPosition(),"linkHref",i.getAttribute("linkHref"),e)]:e.schema.getValidRanges(i.getRanges(),"linkHref");for(const e of s)if(t.removeAttribute("linkHref",e),n)for(const i of n.manualDecorators)t.removeAttribute(i.id,e)}))}}class rb{constructor({id:t,label:e,attributes:i,classes:n,styles:s,defaultValue:o}){this.id=t,this.set("value"),this.defaultValue=o,this.label=e,this.attributes=i,this.classes=n,this.styles=s}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}u(rb,q);const ab="automatic",lb=/^(https?:)?\/\//;class cb extends lr{static get pluginName(){return"LinkEditing"}static get requires(){return[jm,Sm,Vg]}constructor(t){super(t),t.config.define("link",{addTargetToExternalLinks:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"linkHref"}),t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:Zw}),t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>Zw(Xw(t),e)}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:t=>t.getAttribute("href")}}),t.commands.add("link",new sb(t)),t.commands.add("unlink",new ob(t));const e=function(t,e){const i={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};return e.forEach((t=>(t.label&&i[t.label]&&(t.label=i[t.label]),t))),e}(t.t,function(t){const e=[];if(t)for(const[i,n]of Object.entries(t)){const t=Object.assign({},n,{id:`link${Uw(i)}`});e.push(t)}return e}(t.config.get("link.decorators")));this._enableAutomaticDecorators(e.filter((t=>t.mode===ab))),this._enableManualDecorators(e.filter((t=>"manual"===t.mode)));t.plugins.get(jm).registerAttribute("linkHref"),function(t,e,i,n){const s=t.editing.view,o=new Set;s.document.registerPostFixer((s=>{const r=t.model.document.selection;let a=!1;if(r.hasAttribute(e)){const l=ng(r.getFirstPosition(),e,r.getAttribute(e),t.model),c=t.editing.mapper.toViewRange(l);for(const t of c.getItems())t.is("element",i)&&!t.hasClass(n)&&(s.addClass(n,t),o.add(t),a=!0)}return a})),t.conversion.for("editingDowncast").add((t=>{function e(){s.change((t=>{for(const e of o.values())t.removeClass(n,e),o.delete(e)}))}t.on("insert",e,{priority:"highest"}),t.on("remove",e,{priority:"highest"}),t.on("attribute",e,{priority:"highest"}),t.on("selection",e,{priority:"highest"})}))}(t,"linkHref","a","ck-link_selected"),this._enableLinkOpen(),this._enableInsertContentSelectionAttributesFixer(),this._enableClickingAfterLink(),this._enableTypingOverLink(),this._handleDeleteContentAfterLink(),this._enableClipboardIntegration()}_enableAutomaticDecorators(t){const e=this.editor,i=e.commands.get("link").automaticDecorators;e.config.get("link.addTargetToExternalLinks")&&i.add({id:"linkIsExternal",mode:ab,callback:t=>lb.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}}),i.add(t),i.length&&e.conversion.for("downcast").add(i.getDispatcher())}_enableManualDecorators(t){if(!t.length)return;const e=this.editor,i=e.commands.get("link").manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id}),t=new rb(t),i.add(t),e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,{writer:i,schema:n},{item:s})=>{if((s.is("selection")||n.isInline(s))&&e){const e=i.createAttributeElement("a",t.attributes,{priority:5});t.classes&&i.addClass(t.classes,e);for(const n in t.styles)i.setStyle(n,t.styles[n],e);return i.setCustomProperty("link",!0,e),e}}}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",...t._createPattern()},model:{key:t.id}})}))}_enableLinkOpen(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",((t,e)=>{if(!(r.isMac?e.domEvent.metaKey:e.domEvent.ctrlKey))return;let i=e.domTarget;if("a"!=i.tagName.toLowerCase()&&(i=i.closest("a")),!i)return;const n=i.getAttribute("href");n&&(t.stop(),e.preventDefault(),nb(n))}),{context:"$capture"}),this.listenTo(e,"keydown",((e,i)=>{const n=t.commands.get("link").value;n&&i.keyCode===Zs.enter&&i.altKey&&(e.stop(),nb(n))}))}_enableInsertContentSelectionAttributesFixer(){const t=this.editor.model,e=t.document.selection;this.listenTo(t,"insertContent",(()=>{const i=e.anchor.nodeBefore,n=e.anchor.nodeAfter;e.hasAttribute("linkHref")&&i&&i.hasAttribute("linkHref")&&(n&&n.hasAttribute("linkHref")||t.change((e=>{hb(e,ub(t.schema))})))}),{priority:"low"})}_enableClickingAfterLink(){const t=this.editor,e=t.model;t.editing.view.addObserver(lf);let i=!1;this.listenTo(t.editing.view.document,"mousedown",(()=>{i=!0})),this.listenTo(t.editing.view.document,"selectionChange",(()=>{if(!i)return;i=!1;const t=e.document.selection;if(!t.isCollapsed)return;if(!t.hasAttribute("linkHref"))return;const n=t.getFirstPosition(),s=ng(n,"linkHref",t.getAttribute("linkHref"),e);(n.isTouching(s.start)||n.isTouching(s.end))&&e.change((t=>{hb(t,ub(e.schema))}))}))}_enableTypingOverLink(){const t=this.editor,e=t.editing.view;let i,n;this.listenTo(e.document,"delete",(()=>{n=!0}),{priority:"high"}),this.listenTo(t.model,"deleteContent",(()=>{const e=t.model.document.selection;e.isCollapsed||(n?n=!1:db(t)&&function(t){const e=t.document.selection,i=e.getFirstPosition(),n=e.getLastPosition(),s=i.nodeAfter;if(!s)return!1;if(!s.is("$text"))return!1;if(!s.hasAttribute("linkHref"))return!1;const o=n.textNode||n.nodeBefore;if(s===o)return!0;return ng(i,"linkHref",s.getAttribute("linkHref"),t).containsRange(t.createRange(i,n),!0)}(t.model)&&(i=e.getAttributes()))}),{priority:"high"}),this.listenTo(t.model,"insertContent",((e,[s])=>{n=!1,db(t)&&i&&(t.model.change((t=>{for(const[e,n]of i)t.setAttribute(e,n,s)})),i=null)}),{priority:"high"})}_handleDeleteContentAfterLink(){const t=this.editor,e=t.model,i=e.document.selection,n=t.editing.view;let s=!1,o=!1;this.listenTo(n.document,"delete",((t,e)=>{o="backward"===e.direction}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{s=!1;const t=i.getFirstPosition(),n=i.getAttribute("linkHref");if(!n)return;const o=ng(t,"linkHref",n,e);s=o.containsPosition(t)||o.end.isEqual(t)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{o&&(o=!1,s||t.model.enqueueChange((t=>{hb(t,ub(e.schema))})))}),{priority:"low"})}_enableClipboardIntegration(){const t=this.editor,e=t.model,i=this.editor.config.get("link.defaultProtocol");i&&this.listenTo(t.plugins.get("ClipboardPipeline"),"contentInsertion",((t,n)=>{e.change((t=>{const e=t.createRangeIn(n.content);for(const n of e.getItems())if(n.hasAttribute("linkHref")){const e=eb(n.getAttribute("linkHref"),i);t.setAttribute("linkHref",e,n)}}))}))}}function hb(t,e){t.removeSelectionAttribute("linkHref");for(const i of e)t.removeSelectionAttribute(i)}function db(t){return t.model.change((t=>t.batch)).isTyping}function ub(t){return t.getDefinition("$text").allowAttributes.filter((t=>t.startsWith("link")))}class fb extends yo{constructor(t,e){super(t);const i=t.t;this.focusTracker=new uo,this.keystrokes=new fo,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("Save"),yf.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),yf.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e),this.children=this._createFormChildren(e.manualDecorators),this._focusables=new vo,this._focusCycler=new nr({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const n=["ck","ck-link-form","ck-responsive-form"];e.manualDecorators.length&&n.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:n,tabindex:"-1"},children:this.children}),function(t){const e=t;e.set("_isCssTransitionsDisabled",!1),e.disableCssTransitions=()=>{e._isCssTransitionsDisabled=!0},e.enableCssTransitions=()=>{e._isCssTransitionsDisabled=!1},e.extendTemplate({attributes:{class:[e.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>(t[e.name]=e.isOn,t)),{})}render(){super.render(),function({view:t}){t.listenTo(t.element,"submit",((e,i)=>{i.preventDefault(),t.fire("submit")}),{useCapture:!0})}({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t,e=new em(this.locale,im);return e.label=t("Link URL"),e}_createButton(t,e,i,n){const s=new qo(this.locale);return s.set({label:t,icon:e,tooltip:!0}),s.extendTemplate({attributes:{class:i}}),n&&s.delegate("execute").to(this,n),s}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const i of t.manualDecorators){const n=new Uo(this.locale);n.set({name:i.id,label:i.label,withText:!0}),n.bind("isOn").toMany([i,t],"value",((t,e)=>void 0===e&&void 0===t?i.defaultValue:t)),n.on("execute",(()=>{i.set("value",!n.isOn)})),e.add(n)}return e}_createFormChildren(t){const e=this.createCollection();if(e.add(this.urlInputView),t.length){const t=new yo;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}}),e.add(t)}return e.add(this.saveButtonView),e.add(this.cancelButtonView),e}}class mb extends yo{constructor(t){super(t);const e=t.t;this.focusTracker=new uo,this.keystrokes=new fo,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(e("Unlink"),'',"unlink"),this.editButtonView=this._createButton(e("Edit link"),yf.pencil,"edit"),this.set("href"),this._focusables=new vo,this._focusCycler=new nr({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createButton(t,e,i){const n=new qo(this.locale);return n.set({label:t,icon:e,tooltip:!0}),n.delegate("execute").to(this,i),n}_createPreviewButton(){const t=new qo(this.locale),e=this.bindTemplate,i=this.t;return t.set({withText:!0,tooltip:i("Open link in new tab")}),t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&Xw(t))),target:"_blank",rel:"noopener noreferrer"}}),t.bind("label").to(this,"href",(t=>t||i("This link has no URL"))),t.bind("isEnabled").to(this,"href",(t=>!!t)),t.template.tag="a",t.template.eventListeners={},t}}const gb="link-ui";class pb extends lr{static get requires(){return[rm]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(af),this.actionsView=null,this.formView=null,this._balloon=t.plugins.get(rm),this._createToolbarLinkButton(),this._enableBalloonActivators(),t.conversion.for("editingDowncast").markerToHighlight({model:gb,view:{classes:["ck-fake-link-selection"]}}),t.conversion.for("editingDowncast").markerToElement({model:gb,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy(),this.formView&&this.formView.destroy(),this.actionsView&&this.actionsView.destroy()}_createViews(){this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._enableUserBalloonInteractions()}_createActionsView(){const t=this.editor,e=new mb(t.locale),i=t.commands.get("link"),n=t.commands.get("unlink");return e.bind("href").to(i,"value"),e.editButtonView.bind("isEnabled").to(i),e.unlinkButtonView.bind("isEnabled").to(n),this.listenTo(e,"edit",(()=>{this._addFormView()})),this.listenTo(e,"unlink",(()=>{t.execute("unlink"),this._hideUI()})),e.keystrokes.set("Esc",((t,e)=>{this._hideUI(),e()})),e.keystrokes.set(Yw,((t,e)=>{this._addFormView(),e()})),e}_createFormView(){const t=this.editor,e=t.commands.get("link"),i=t.config.get("link.defaultProtocol"),n=new fb(t.locale,e);return n.urlInputView.fieldView.bind("value").to(e,"value"),n.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t)),n.saveButtonView.bind("isEnabled").to(e),this.listenTo(n,"submit",(()=>{const{value:e}=n.urlInputView.fieldView.element,s=eb(e,i);t.execute("link",s,n.getDecoratorSwitchesState()),this._closeFormView()})),this.listenTo(n,"cancel",(()=>{this._closeFormView()})),n.keystrokes.set("Esc",((t,e)=>{this._closeFormView(),e()})),n}_createToolbarLinkButton(){const t=this.editor,e=t.commands.get("link"),i=t.t;t.ui.componentFactory.add("link",(t=>{const n=new qo(t);return n.isEnabled=!0,n.label=i("Link"),n.icon='',n.keystroke=Yw,n.tooltip=!0,n.isToggleable=!0,n.bind("isEnabled").to(e,"isEnabled"),n.bind("isOn").to(e,"value",(t=>!!t)),this.listenTo(n,"execute",(()=>this._showUI(!0))),n}))}_enableBalloonActivators(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",(()=>{this._getSelectedLinkElement()&&this._showUI()})),t.keystrokes.set(Yw,((e,i)=>{i(),t.commands.get("link").isEnabled&&this._showUI(!0)}))}_enableUserBalloonInteractions(){this.editor.keystrokes.set("Tab",((t,e)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),e())}),{priority:"high"}),this.editor.keystrokes.set("Esc",((t,e)=>{this._isUIVisible&&(this._hideUI(),e())})),i({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this.actionsView||this._createViews(),this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this.formView||this._createViews(),this._isFormInPanel)return;const t=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions(),this.formView.urlInputView.fieldView.element.value=t.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates(),void 0!==t.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(t=!1){this.formView||this._createViews(),this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),t&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),t&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const t=this.editor;this.stopListening(t.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),t.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor,e=t.editing.view.document;let i=this._getSelectedLinkElement(),n=o();const s=()=>{const t=this._getSelectedLinkElement(),e=o();i&&!t||!i&&e!==n?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),i=t,n=e};function o(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",s),this.listenTo(this._balloon,"change:visibleView",s)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){return this._balloon.visibleView==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view,e=this.editor.model,i=t.document;let n=null;if(e.markers.has(gb)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(gb)),i=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));n=t.domConverter.viewRangeToDom(i)}else n=()=>{const e=this._getSelectedLinkElement();return e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(i.selection.getFirstRange())};return{target:n}}_getSelectedLinkElement(){const t=this.editor.editing.view,e=t.document.selection,i=e.getSelectedElement();if(e.isCollapsed||i&&Hg(i))return wb(e.getFirstPosition());{const i=e.getFirstRange().getTrimmed(),n=wb(i.start),s=wb(i.end);return n&&n==s&&t.createRangeIn(n).getTrimmed().isEqual(i)?n:null}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const i=t.document.selection.getFirstRange();if(t.markers.has(gb))e.updateMarker(gb,{range:i});else if(i.start.isAtEnd){const n=i.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:i});e.addMarker(gb,{usingOperation:!1,affectsData:!1,range:e.createRange(n,i.end)})}else e.addMarker(gb,{usingOperation:!1,affectsData:!1,range:i})}))}_hideFakeVisualSelection(){const t=this.editor.model;t.markers.has(gb)&&t.change((t=>{t.removeMarker(gb)}))}}function wb(t){return t.getAncestors().find((t=>{return(e=t).is("attributeElement")&&!!e.getCustomProperty("link");var e}))}const bb=4,_b=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i"),vb=2;class yb extends lr{static get requires(){return[Fm]}static get pluginName(){return"AutoLink"}init(){const t=this.editor.model.document.selection;t.on("change:range",(()=>{this.isEnabled=!t.anchor.parent.is("element","codeBlock")})),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling()}_enableTypingHandling(){const t=this.editor,e=new Hm(t.model,(t=>{if(!function(t){return t.length>bb&&" "===t[t.length-1]&&" "!==t[t.length-2]}(t))return;const e=kb(t.substr(0,t.length-1));return e?{url:e}:void 0}));e.on("matched:data",((e,i)=>{const{batch:n,range:s,url:o}=i;if(!n.isTyping)return;const r=s.end.getShiftedBy(-1),a=r.getShiftedBy(-o.length),l=t.model.createRange(a,r);this._applyAutoLink(o,l)})),e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor,e=t.model,i=t.commands.get("enter");i&&i.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling)return;const i=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(i)}))}_enableShiftEnterHandling(){const t=this.editor,e=t.model,i=t.commands.get("shiftEnter");i&&i.on("execute",(()=>{const t=e.document.selection.getFirstPosition(),i=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(i)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model,{text:i,range:n}=zm(t,e),s=kb(i);if(s){const t=e.createRange(n.end.getShiftedBy(-s.length),n.end);this._applyAutoLink(s,t)}}_applyAutoLink(t,e){const i=this.editor.model,n=eb(t,this.editor.config.get("link.defaultProtocol"));this.isEnabled&&function(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}(e,i)&&ib(n)&&!function(t){const e=t.start.nodeAfter;return e&&e.hasAttribute("linkHref")}(e)&&this._persistAutoLink(n,e)}_persistAutoLink(t,e){const i=this.editor.model,n=this.editor.plugins.get("Delete");i.enqueueChange((s=>{s.setAttribute("linkHref",t,e),i.enqueueChange((()=>{n.requestUndoOnBackspace()}))}))}}function kb(t){const e=_b.exec(t);return e?e[vb]:null}class Ab extends hr{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,i=e.document,n=Array.from(i.selection.getSelectedBlocks()).filter((t=>Cb(t,e.schema))),s=void 0!==t.forceValue?!t.forceValue:this.value;e.change((t=>{if(s){let e=n[n.length-1].nextSibling,i=Number.POSITIVE_INFINITY,s=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t=i;)o>s.getAttribute("listIndent")&&(o=s.getAttribute("listIndent")),s.getAttribute("listIndent")==o&&t[e?"unshift":"push"](s),s=s[e?"previousSibling":"nextSibling"]}}function Cb(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class Pb extends hr{constructor(t,e){super(t),this._indentBy="forward"==e?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document;let i=Array.from(e.selection.getSelectedBlocks());t.change((t=>{const e=i[i.length-1];let n=e.nextSibling;for(;n&&"listItem"==n.name&&n.getAttribute("listIndent")>e.getAttribute("listIndent");)i.push(n),n=n.nextSibling;this._indentBy<0&&(i=i.reverse());for(const e of i){const i=e.getAttribute("listIndent")+this._indentBy;i<0?t.rename(e,"paragraph"):t.setAttribute("listIndent",i,e)}this.fire("_executeCleanup",i)}))}_checkEnabled(){const t=ho(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),i=t.getAttribute("listType");let n=t.previousSibling;for(;n&&n.is("element","listItem")&&n.getAttribute("listIndent")>=e;){if(n.getAttribute("listIndent")==e)return n.getAttribute("listType")==i;n=n.previousSibling}return!1}return!0}}function Tb(t,e){const i=e.mapper,n=e.writer,s="numbered"==t.getAttribute("listType")?"ol":"ul",o=function(t){const e=t.createContainerElement("li");return e.getFillerOffset=Fb,e}(n),r=n.createContainerElement(s,null);return n.insert(n.createPositionAt(r,0),o),i.bindElements(t,o),o}function Eb(t,e,i,n){const s=e.parent,o=i.mapper,r=i.writer;let a=o.toViewPosition(n.createPositionBefore(t));const l=Ob(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),c=t.previousSibling;if(l&&l.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=o.toViewElement(l);a=r.breakContainer(r.createPositionAfter(t))}else if(c&&"listItem"==c.name){a=o.toViewPosition(n.createPositionAt(c,"end"));const t=o.findMappedViewAncestor(a),e=function(t){for(const e of t.getChildren())if("ul"==e.name||"ol"==e.name)return e;return null}(t);a=e?r.createPositionBefore(e):r.createPositionAt(t,"end")}else a=o.toViewPosition(n.createPositionBefore(t));if(a=Rb(a),r.insert(a,s),c&&"listItem"==c.name){const t=o.toViewElement(c),i=r.createRange(r.createPositionAt(t,0),a).getWalker({ignoreElementEnd:!0});for(const t of i)if(t.item.is("element","li")){const n=r.breakContainer(r.createPositionBefore(t.item)),s=t.item.parent,o=r.createPositionAt(e,"end");Sb(r,o.nodeBefore,o.nodeAfter),r.move(r.createRangeOn(s),o),i.position=n}}else{const i=s.nextSibling;if(i&&(i.is("element","ul")||i.is("element","ol"))){let n=null;for(const e of i.getChildren()){const i=o.toModelElement(e);if(!(i&&i.getAttribute("listIndent")>t.getAttribute("listIndent")))break;n=e}n&&(r.breakContainer(r.createPositionAfter(n)),r.move(r.createRangeOn(n.parent),r.createPositionAt(e,"end")))}}Sb(r,s,s.nextSibling),Sb(r,s.previousSibling,s)}function Sb(t,e,i){return!e||!i||"ul"!=e.name&&"ol"!=e.name||e.name!=i.name||e.getAttribute("class")!==i.getAttribute("class")?null:t.mergeContainers(t.createPositionAfter(e))}function Rb(t){return t.getLastMatchingPosition((t=>t.item.is("uiElement")))}function Ob(t,e){const i=!!e.sameIndent,n=!!e.smallerIndent,s=e.listIndent;let o=t;for(;o&&"listItem"==o.name;){const t=o.getAttribute("listIndent");if(i&&s==t||n&&s>t)return o;o="forward"===e.direction?o.nextSibling:o.previousSibling}return null}function Ib(t,e,i,n){t.ui.componentFactory.add(e,(s=>{const o=t.commands.get(e),r=new qo(s);return r.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),r.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),r}))}function Vb(t,e){const i=[],n=t.parent,s={ignoreElementEnd:!1,startPosition:t,shallow:!0,direction:e},o=n.getAttribute("listIndent"),r=[...new mh(s)].filter((t=>t.item.is("element"))).map((t=>t.item));for(const t of r){if(!t.is("element","listItem"))break;if(t.getAttribute("listIndent")o)){if(t.getAttribute("listType")!==n.getAttribute("listType"))break;if(t.getAttribute("listStyle")!==n.getAttribute("listStyle"))break;if(t.getAttribute("listReversed")!==n.getAttribute("listReversed"))break;if(t.getAttribute("listStart")!==n.getAttribute("listStart"))break;"backward"===e?i.unshift(t):i.push(t)}}return i}function Mb(t){let e=[...t.document.selection.getSelectedBlocks()].filter((t=>t.is("element","listItem"))).map((e=>{const i=t.change((t=>t.createPositionAt(e,0)));return[...Vb(i,"backward"),...Vb(i,"forward")]})).flat();return e=[...new Set(e)],e}const Nb=["disc","circle","square"],Bb=["decimal","decimal-leading-zero","lower-roman","upper-roman","lower-latin","upper-latin"];function Db(t){return Nb.includes(t)?"bulleted":Bb.includes(t)?"numbered":null}function Fb(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:Ba.call(this)}class Lb extends lr{static get pluginName(){return"ListUtils"}getListTypeFromListStyleType(t){return Db(t)}getSelectedListItems(t){return Mb(t)}getSiblingNodes(t,e){return Vb(t,e)}}function zb(t){return(e,i,n)=>{const s=n.consumable;if(!s.test(i.item,"insert")||!s.test(i.item,"attribute:listType")||!s.test(i.item,"attribute:listIndent"))return;s.consume(i.item,"insert"),s.consume(i.item,"attribute:listType"),s.consume(i.item,"attribute:listIndent");const o=i.item;Eb(o,Tb(o,n),n,t)}}const Hb=(t,e,i)=>{if(!i.consumable.test(e.item,t.name))return;const n=i.mapper.toViewElement(e.item),s=i.writer;s.breakContainer(s.createPositionBefore(n)),s.breakContainer(s.createPositionAfter(n));const o=n.parent,r="numbered"==e.attributeNewValue?"ol":"ul";s.rename(r,o)},jb=(t,e,i)=>{i.consumable.consume(e.item,t.name);const n=i.mapper.toViewElement(e.item).parent,s=i.writer;Sb(s,n,n.nextSibling),Sb(s,n.previousSibling,n)};const $b=(t,e,i)=>{if(i.consumable.test(e.item,t.name)&&"listItem"!=e.item.name){let t=i.mapper.toViewPosition(e.range.start);const n=i.writer,s=[];for(;("ul"==t.parent.name||"ol"==t.parent.name)&&(t=n.breakContainer(t),"li"==t.parent.name);){const e=t,i=n.createPositionAt(t.parent,"end");if(!e.isEqual(i)){const t=n.remove(n.createRange(e,i));s.push(t)}t=n.createPositionAfter(t.parent)}if(s.length>0){for(let e=0;e0){const e=Sb(n,i,i.nextSibling);e&&e.parent==i&&t.offset--}}Sb(n,t.nodeBefore,t.nodeAfter)}}},Wb=(t,e,i)=>{const n=i.mapper.toViewPosition(e.position),s=n.nodeBefore,o=n.nodeAfter;Sb(i.writer,s,o)},qb=(t,e,i)=>{if(i.consumable.consume(e.viewItem,{name:!0})){const t=i.writer,n=t.createElement("listItem"),s=function(t){let e=0,i=t.parent;for(;i;){if(i.is("element","li"))e++;else{const t=i.previousSibling;t&&t.is("element","li")&&e++}i=i.parent}return e}(e.viewItem);t.setAttribute("listIndent",s,n);const o=e.viewItem.parent&&"ol"==e.viewItem.parent.name?"numbered":"bulleted";if(t.setAttribute("listType",o,n),!i.safeInsert(n,e.modelCursor))return;const r=function(t,e,i){const{writer:n,schema:s}=i;let o=n.createPositionAfter(t);for(const r of e)if("ul"==r.name||"ol"==r.name)o=i.convertItem(r,o).modelCursor;else{const e=i.convertItem(r,n.createPositionAt(t,"end")),a=e.modelRange.start.nodeAfter;a&&a.is("element")&&!s.checkChild(t,a.name)&&(t=e.modelCursor.parent.is("element","listItem")?e.modelCursor.parent:Qb(e.modelCursor),o=n.createPositionAfter(t))}return o}(n,e.viewItem.getChildren(),i);e.modelRange=t.createRange(e.modelCursor,r),i.updateConversionResult(n,e)}},Ub=(t,e,i)=>{if(i.consumable.test(e.viewItem,{name:!0})){const t=Array.from(e.viewItem.getChildren());for(const e of t){!(e.is("element","li")||Zb(e))&&e._remove()}}},Kb=(t,e,i)=>{if(i.consumable.test(e.viewItem,{name:!0})){if(0===e.viewItem.childCount)return;const t=[...e.viewItem.getChildren()];let i=!1;for(const e of t)i&&!Zb(e)&&e._remove(),Zb(e)&&(i=!0)}};function Gb(t){return(e,i)=>{if(i.isPhantom)return;const n=i.modelPosition.nodeBefore;if(n&&n.is("element","listItem")){const e=i.mapper.toViewElement(n),s=e.getAncestors().find(Zb),o=t.createPositionAt(e,0).getWalker();for(const t of o){if("elementStart"==t.type&&t.item.is("element","li")){i.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==s){i.viewPosition=t.nextPosition;break}}}}}const Jb=function(t,[e,i,n]){const s=this;let o,r=e.is("documentFragment")?e.getChild(0):e;if(o=i?s.createSelection(i,n):s.document.selection,r&&r.is("element","listItem")){const t=o.getFirstPosition();let e=null;if(t.parent.is("element","listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("element","listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;r&&r.is("element","listItem");)r._setAttribute("listIndent",r.getAttribute("listIndent")+t),r=r.nextSibling}}};function Qb(t){const e=new mh({startPosition:t});let i;do{i=e.next()}while(!i.value.item.is("element","listItem"));return i.value.item}function Yb(t,e,i,n,s,o){const r=Ob(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t}),a=s.mapper,l=s.writer,c=r?r.getAttribute("listIndent"):null;let h;if(r)if(c==t){const t=a.toViewElement(r).parent;h=l.createPositionAfter(t)}else{const t=o.createPositionAt(r,"end");h=a.toViewPosition(t)}else h=i;h=Rb(h);for(const t of[...n.getChildren()])Zb(t)&&(h=l.move(l.createRangeOn(t),h).end,Sb(l,t,t.nextSibling),Sb(l,t.previousSibling,t))}function Zb(t){return t.is("element","ol")||t.is("element","ul")}class Xb extends lr{static get pluginName(){return"ListEditing"}static get requires(){return[mg,Fm,Lb]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data,i=t.editing;var n;t.model.document.registerPostFixer((e=>function(t,e){const i=t.document.differ.getChanges(),n=new Map;let s=!1;for(const n of i)if("insert"==n.type&&"listItem"==n.name)o(n.position);else if("insert"==n.type&&"listItem"!=n.name){if("$text"!=n.name){const i=n.position.nodeAfter;i.hasAttribute("listIndent")&&(e.removeAttribute("listIndent",i),s=!0),i.hasAttribute("listType")&&(e.removeAttribute("listType",i),s=!0),i.hasAttribute("listStyle")&&(e.removeAttribute("listStyle",i),s=!0),i.hasAttribute("listReversed")&&(e.removeAttribute("listReversed",i),s=!0),i.hasAttribute("listStart")&&(e.removeAttribute("listStart",i),s=!0);for(const e of Array.from(t.createRangeIn(i)).filter((t=>t.item.is("element","listItem"))))o(e.previousPosition)}o(n.position.getShiftedBy(n.length))}else"remove"==n.type&&"listItem"==n.name?o(n.position):("attribute"==n.type&&"listIndent"==n.attributeKey||"attribute"==n.type&&"listType"==n.attributeKey)&&o(n.range.start);for(const t of n.values())r(t),a(t);return s;function o(t){const e=t.nodeBefore;if(e&&e.is("element","listItem")){let t=e;if(n.has(t))return;for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling)if(t=e,n.has(t))return;n.set(e,t)}else{const e=t.nodeAfter;e&&e.is("element","listItem")&&n.set(e,e)}}function r(t){let i=0,n=null;for(;t&&t.is("element","listItem");){const o=t.getAttribute("listIndent");if(o>i){let r;null===n?(n=o-i,r=i):(n>o&&(n=o),r=o-n),e.setAttribute("listIndent",r,t),s=!0}else n=null,i=t.getAttribute("listIndent")+1;t=t.nextSibling}}function a(t){let i=[],n=null;for(;t&&t.is("element","listItem");){const o=t.getAttribute("listIndent");if(n&&n.getAttribute("listIndent")>o&&(i=i.slice(0,o+1)),0!=o)if(i[o]){const n=i[o];t.getAttribute("listType")!=n&&(e.setAttribute("listType",n,t),s=!0)}else i[o]=t.getAttribute("listType");n=t,t=t.nextSibling}}}(t.model,e))),i.mapper.registerViewToModelLength("li",t_),e.mapper.registerViewToModelLength("li",t_),i.mapper.on("modelToViewPosition",Gb(i.view)),i.mapper.on("viewToModelPosition",(n=t.model,(t,e)=>{const i=e.viewPosition,s=i.parent,o=e.mapper;if("ul"==s.name||"ol"==s.name){if(i.isAtEnd){const t=o.toModelElement(i.nodeBefore),s=o.getModelLength(i.nodeBefore);e.modelPosition=n.createPositionBefore(t).getShiftedBy(s)}else{const t=o.toModelElement(i.nodeAfter);e.modelPosition=n.createPositionBefore(t)}t.stop()}else if("li"==s.name&&i.nodeBefore&&("ul"==i.nodeBefore.name||"ol"==i.nodeBefore.name)){const r=o.toModelElement(s);let a=1,l=i.nodeBefore;for(;l&&Zb(l);)a+=o.getModelLength(l),l=l.previousSibling;e.modelPosition=n.createPositionBefore(r).getShiftedBy(a),t.stop()}})),e.mapper.on("modelToViewPosition",Gb(i.view)),t.conversion.for("editingDowncast").add((e=>{e.on("insert",$b,{priority:"high"}),e.on("insert:listItem",zb(t.model)),e.on("attribute:listType:listItem",Hb,{priority:"high"}),e.on("attribute:listType:listItem",jb,{priority:"low"}),e.on("attribute:listIndent:listItem",function(t){return(e,i,n)=>{if(!n.consumable.consume(i.item,"attribute:listIndent"))return;const s=n.mapper.toViewElement(i.item),o=n.writer;o.breakContainer(o.createPositionBefore(s)),o.breakContainer(o.createPositionAfter(s));const r=s.parent,a=r.previousSibling,l=o.createRangeOn(r);o.remove(l),a&&a.nextSibling&&Sb(o,a,a.nextSibling),Yb(i.attributeOldValue+1,i.range.start,l.start,s,n,t),Eb(i.item,s,n,t);for(const t of i.item.getChildren())n.consumable.consume(t,"insert")}}(t.model)),e.on("remove:listItem",function(t){return(e,i,n)=>{const s=n.mapper.toViewPosition(i.position).getLastMatchingPosition((t=>!t.item.is("element","li"))).nodeAfter,o=n.writer;o.breakContainer(o.createPositionBefore(s)),o.breakContainer(o.createPositionAfter(s));const r=s.parent,a=r.previousSibling,l=o.createRangeOn(r),c=o.remove(l);a&&a.nextSibling&&Sb(o,a,a.nextSibling),Yb(n.mapper.toModelElement(s).getAttribute("listIndent")+1,i.position,l.start,s,n,t);for(const t of o.createRangeIn(c).getItems())n.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",Wb,{priority:"low"})})),t.conversion.for("dataDowncast").add((e=>{e.on("insert",$b,{priority:"high"}),e.on("insert:listItem",zb(t.model))})),t.conversion.for("upcast").add((t=>{t.on("element:ul",Ub,{priority:"high"}),t.on("element:ol",Ub,{priority:"high"}),t.on("element:li",Kb,{priority:"high"}),t.on("element:li",qb)})),t.model.on("insertContent",Jb,{priority:"high"}),t.commands.add("numberedList",new Ab(t,"numbered")),t.commands.add("bulletedList",new Ab(t,"bulleted")),t.commands.add("indentList",new Pb(t,"forward")),t.commands.add("outdentList",new Pb(t,"backward"));const s=i.view.document;this.listenTo(s,"enter",((t,e)=>{const i=this.editor.model.document,n=i.selection.getLastPosition().parent;i.selection.isCollapsed&&"listItem"==n.name&&n.isEmpty&&(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(s,"delete",((t,e)=>{if("backward"!==e.direction)return;const i=this.editor.model.document.selection;if(!i.isCollapsed)return;const n=i.getFirstPosition();if(!n.isAtStart)return;const s=n.parent;if("listItem"!==s.name)return;s.previousSibling&&"listItem"===s.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(t.editing.view.document,"tab",((e,i)=>{const n=i.shiftKey?"outdentList":"indentList";this.editor.commands.get(n).isEnabled&&(t.execute(n),i.stopPropagation(),i.preventDefault(),e.stop())}),{context:"li"})}afterInit(){const t=this.editor.commands,e=t.get("indent"),i=t.get("outdent");e&&e.registerChildCommand(t.get("indentList")),i&&i.registerChildCommand(t.get("outdentList"))}}function t_(t){let e=1;for(const i of t.getChildren())if("ul"==i.name||"ol"==i.name)for(const t of i.getChildren())e+=t_(t);return e}const e_='',i_='';class n_ extends lr{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;Ib(this.editor,"numberedList",t("Numbered List"),e_),Ib(this.editor,"bulletedList",t("Bulleted List"),i_)}}class s_ extends hr{constructor(t,e){super(t),this.defaultType=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){this._tryToConvertItemsToList(t);const e=this.editor.model,i=Mb(e);i.length&&e.change((e=>{for(const n of i)e.setAttribute("listStyle",t.type||this.defaultType,n)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")?t.getAttribute("listStyle"):null}_checkEnabled(){const t=this.editor,e=t.commands.get("numberedList"),i=t.commands.get("bulletedList");return e.isEnabled||i.isEnabled}_tryToConvertItemsToList(t){if(!t.type)return;const e=Db(t.type);if(!e)return;const i=this.editor,n=`${e}List`;i.commands.get(n).value||i.execute(n)}}class o_ extends hr{refresh(){const t=this._getValue();this.value=t,this.isEnabled=null!=t}execute(t={}){const e=this.editor.model,i=Mb(e).filter((t=>"numbered"==t.getAttribute("listType")));e.change((e=>{for(const n of i)e.setAttribute("listReversed",!!t.reversed,n)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")&&"numbered"==t.getAttribute("listType")?t.getAttribute("listReversed"):null}}class r_ extends hr{refresh(){const t=this._getValue();this.value=t,this.isEnabled=null!=t}execute({startIndex:t=1}={}){const e=this.editor.model,i=Mb(e).filter((t=>"numbered"==t.getAttribute("listType")));e.change((e=>{for(const n of i)e.setAttribute("listStart",t>=0?t:1,n)}))}_getValue(){const t=this.editor.model.document.selection.getFirstPosition().parent;return t&&t.is("element","listItem")&&"numbered"==t.getAttribute("listType")?t.getAttribute("listStart"):null}}const a_="default";class l_ extends lr{static get requires(){return[Xb]}static get pluginName(){return"ListPropertiesEditing"}constructor(t){super(t),t.config.define("list",{properties:{styles:!0,startIndex:!1,reversed:!1}})}init(){const t=this.editor,e=t.model,i=function(t){const e=[];t.styles&&e.push({attributeName:"listStyle",defaultValue:a_,addCommand(t){t.commands.add("listStyle",new s_(t,a_))},appliesToListItem:()=>!0,setAttributeOnDowncast(t,e,i){e&&e!==a_?t.setStyle("list-style-type",e,i):t.removeStyle("list-style-type",i)},getAttributeOnUpcast:t=>t.getStyle("list-style-type")||a_});t.reversed&&e.push({attributeName:"listReversed",defaultValue:!1,addCommand(t){t.commands.add("listReversed",new o_(t))},appliesToListItem:t=>"numbered"==t.getAttribute("listType"),setAttributeOnDowncast(t,e,i){e?t.setAttribute("reversed","reversed",i):t.removeAttribute("reversed",i)},getAttributeOnUpcast:t=>t.hasAttribute("reversed")});t.startIndex&&e.push({attributeName:"listStart",defaultValue:1,addCommand(t){t.commands.add("listStart",new r_(t))},appliesToListItem:t=>"numbered"==t.getAttribute("listType"),setAttributeOnDowncast(t,e,i){0==e||e>1?t.setAttribute("start",e,i):t.removeAttribute("start",i)},getAttributeOnUpcast(t){const e=t.getAttribute("start");return e>=0?e:1}});return e}(t.config.get("list.properties"));e.schema.extend("listItem",{allowAttributes:i.map((t=>t.attributeName))});for(const e of i)e.addCommand(t);var n;this.listenTo(t.commands.get("indentList"),"_executeCleanup",function(t,e){return(i,n)=>{const s=n[0],o=s.getAttribute("listIndent"),r=n.filter((t=>t.getAttribute("listIndent")===o));let a=null;s.previousSibling.getAttribute("listIndent")+1!==o&&(a=Ob(s.previousSibling,{sameIndent:!0,direction:"backward",listIndent:o})),t.model.change((t=>{for(const i of r)for(const n of e)if(n.appliesToListItem(i)){const e=null==a?n.defaultValue:a.getAttribute(n.attributeName);t.setAttribute(n.attributeName,e,i)}}))}}(t,i)),this.listenTo(t.commands.get("outdentList"),"_executeCleanup",function(t,e){return(i,n)=>{if(!(n=n.reverse().filter((t=>t.is("element","listItem")))).length)return;const s=n[0].getAttribute("listIndent"),o=n[0].getAttribute("listType");let r=n[0].previousSibling;if(r.is("element","listItem"))for(;r.getAttribute("listIndent")!==s;)r=r.previousSibling;else r=null;r||(r=n[n.length-1].nextSibling),r&&r.is("element","listItem")&&r.getAttribute("listType")===o&&t.model.change((t=>{const i=n.filter((t=>t.getAttribute("listIndent")===s));for(const n of i)for(const i of e)if(i.appliesToListItem(n)){const e=i.attributeName,s=r.getAttribute(e);t.setAttribute(e,s,n)}}))}}(t,i)),this.listenTo(t.commands.get("bulletedList"),"_executeCleanup",d_(t)),this.listenTo(t.commands.get("numberedList"),"_executeCleanup",d_(t)),e.document.registerPostFixer(function(t,e){return i=>{let n=!1;const s=u_(t.model.document.differ.getChanges()).filter((t=>"todo"!==t.getAttribute("listType")));if(!s.length)return n;let o=s[s.length-1].nextSibling;if((!o||!o.is("element","listItem"))&&(o=s[0].previousSibling,o)){const t=s[0].getAttribute("listIndent");for(;o.is("element","listItem")&&o.getAttribute("listIndent")!==t&&(o=o.previousSibling,o););}for(const t of e){const e=t.attributeName;for(const r of s)if(t.appliesToListItem(r))if(r.hasAttribute(e)){const s=r.previousSibling;h_(s,r,t.attributeName)&&(i.setAttribute(e,s.getAttribute(e),r),n=!0)}else c_(o,r,t)?i.setAttribute(e,o.getAttribute(e),r):i.setAttribute(e,t.defaultValue,r),n=!0;else i.removeAttribute(e,r)}return n}}(t,i)),t.conversion.for("upcast").add((n=i,t=>{t.on("element:li",((t,e,i)=>{const s=e.viewItem.parent,o=e.modelRange.start.nodeAfter||e.modelRange.end.nodeBefore;for(const t of n)if(t.appliesToListItem(o)){const e=t.getAttributeOnUpcast(s);i.writer.setAttribute(t.attributeName,e,o)}}),{priority:"low"})})),t.conversion.for("downcast").add(function(t){return i=>{for(const n of t)i.on(`attribute:${n.attributeName}:listItem`,((t,i,s)=>{const o=s.writer,r=i.item,a=Ob(r.previousSibling,{sameIndent:!0,listIndent:r.getAttribute("listIndent"),direction:"backward"}),l=s.mapper.toViewElement(r);e(r,a)||o.breakContainer(o.createPositionBefore(l)),n.setAttributeOnDowncast(o,i.attributeNewValue,l.parent)}),{priority:"low"})};function e(t,e){return e&&t.getAttribute("listType")===e.getAttribute("listType")&&t.getAttribute("listIndent")===e.getAttribute("listIndent")&&t.getAttribute("listStyle")===e.getAttribute("listStyle")&&t.getAttribute("listReversed")===e.getAttribute("listReversed")&&t.getAttribute("listStart")===e.getAttribute("listStart")}}(i)),this._mergeListAttributesWhileMergingLists(i)}afterInit(){const t=this.editor;t.commands.get("todoList")&&t.model.document.registerPostFixer(function(t){return e=>{const i=u_(t.model.document.differ.getChanges()).filter((t=>"todo"===t.getAttribute("listType")&&(t.hasAttribute("listStyle")||t.hasAttribute("listReversed")||t.hasAttribute("listStart"))));if(!i.length)return!1;for(const t of i)e.removeAttribute("listStyle",t),e.removeAttribute("listReversed",t),e.removeAttribute("listStart",t);return!0}}(t))}_mergeListAttributesWhileMergingLists(t){const e=this.editor.model;let i;this.listenTo(e,"deleteContent",((t,[e])=>{const n=e.getFirstPosition(),s=e.getLastPosition();if(n.parent===s.parent)return;if(!n.parent.is("element","listItem"))return;const o=s.parent.nextSibling;if(!o||!o.is("element","listItem"))return;const r=Ob(n.parent,{sameIndent:!0,listIndent:o.getAttribute("listIndent")});r&&r.getAttribute("listType")===o.getAttribute("listType")&&(i=r)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{i&&(e.change((e=>{const n=Ob(i.nextSibling,{sameIndent:!0,listIndent:i.getAttribute("listIndent"),direction:"forward"});if(!n)return void(i=null);const s=[n,...Vb(e.createPositionAt(n,0),"forward")];for(const n of s)for(const s of t)if(s.appliesToListItem(n)){const t=s.attributeName,o=i.getAttribute(t);e.setAttribute(t,o,n)}})),i=null)}),{priority:"low"})}}function c_(t,e,i){if(!t)return!1;const n=t.getAttribute(i.attributeName);return!!n&&(n!=i.defaultValue&&t.getAttribute("listType")===e.getAttribute("listType"))}function h_(t,e,i){if(!t||!t.is("element","listItem"))return!1;if(e.getAttribute("listType")!==t.getAttribute("listType"))return!1;const n=t.getAttribute("listIndent");if(n<1||n!==e.getAttribute("listIndent"))return!1;const s=t.getAttribute(i);return!(!s||s===e.getAttribute(i))}function d_(t){return(e,i)=>{i=i.filter((t=>t.is("element","listItem"))),t.model.change((t=>{for(const e of i)t.removeAttribute("listStyle",e)}))}}function u_(t){const e=[];for(const i of t){const t=f_(i);t&&t.is("element","listItem")&&e.push(t)}return e}function f_(t){return"attribute"===t.type?t.range.start.nodeAfter:"insert"===t.type?t.position.nodeAfter:null}class m_ extends yo{constructor(t,e){super(t);const i=this.bindTemplate;this.set("isCollapsed",!1),this.set("label",""),this.buttonView=this._createButtonView(),this.children=this.createCollection(),this.set("_collapsibleAriaLabelUid",void 0),e&&this.children.addMany(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-collapsible",i.if("isCollapsed","ck-collapsible_collapsed")]},children:[this.buttonView,{tag:"div",attributes:{class:["ck","ck-collapsible__children"],role:"region",hidden:i.if("isCollapsed","hidden"),"aria-labelledby":i.to("_collapsibleAriaLabelUid")},children:this.children}]})}render(){super.render(),this._collapsibleAriaLabelUid=this.buttonView.labelView.element.id}_createButtonView(){const t=new qo(this.locale),e=t.bindTemplate;return t.set({withText:!0,icon:Xo}),t.extendTemplate({attributes:{"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("label").to(this),t.bind("isOn").to(this,"isCollapsed",(t=>!t)),t.on("execute",(()=>{this.isCollapsed=!this.isCollapsed})),t}}class g_ extends yo{constructor(t,{enabledProperties:e,styleButtonViews:i,styleGridAriaLabel:n}){super(t),this.stylesView=null,this.additionalPropertiesCollapsibleView=null,this.startIndexFieldView=null,this.reversedSwitchButtonView=null,this.focusTracker=new uo,this.keystrokes=new fo,this.focusables=new vo;const s=["ck","ck-list-properties"];this.children=this.createCollection(),this.focusCycler=new nr({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),e.styles?(this.stylesView=this._createStylesView(i,n),this.children.add(this.stylesView)):s.push("ck-list-properties_without-styles"),(e.startIndex||e.reversed)&&(this._addNumberedListPropertyViews(e),s.push("ck-list-properties_with-numbered-properties")),this.setTemplate({tag:"div",attributes:{class:s},children:this.children})}render(){if(super.render(),this.stylesView){this.focusables.add(this.stylesView),this.focusTracker.add(this.stylesView.element),(this.startIndexFieldView||this.reversedSwitchButtonView)&&(this.focusables.add(this.children.last.buttonView),this.focusTracker.add(this.children.last.buttonView.element));for(const t of this.stylesView.children)this.stylesView.focusTracker.add(t.element);n({keystrokeHandler:this.stylesView.keystrokes,focusTracker:this.stylesView.focusTracker,gridItems:this.stylesView.children,numberOfColumns:()=>vs.window.getComputedStyle(this.stylesView.element).getPropertyValue("grid-template-columns").split(" ").length,uiLanguageDirection:this.locale&&this.locale.uiLanguageDirection})}if(this.startIndexFieldView){this.focusables.add(this.startIndexFieldView),this.focusTracker.add(this.startIndexFieldView.element),this.listenTo(this.startIndexFieldView.element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"});const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t)}this.reversedSwitchButtonView&&(this.focusables.add(this.reversedSwitchButtonView),this.focusTracker.add(this.reversedSwitchButtonView.element)),this.keystrokes.listenTo(this.element)}focus(){this.focusCycler.focusFirst()}focusLast(){this.focusCycler.focusLast()}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createStylesView(t,e){const i=new yo(this.locale);return i.children=i.createCollection(),i.children.addMany(t),i.setTemplate({tag:"div",attributes:{"aria-label":e,class:["ck","ck-list-styles-list"]},children:i.children}),i.children.delegate("execute").to(this),i.focus=function(){this.children.first.focus()},i.focusTracker=new uo,i.keystrokes=new fo,i.render(),i.keystrokes.listenTo(i.element),i}_addNumberedListPropertyViews(t){const e=this.locale.t,i=[];t.startIndex&&(this.startIndexFieldView=this._createStartIndexField(),i.push(this.startIndexFieldView)),t.reversed&&(this.reversedSwitchButtonView=this._createReversedSwitchButton(),i.push(this.reversedSwitchButtonView)),t.styles?(this.additionalPropertiesCollapsibleView=new m_(this.locale,i),this.additionalPropertiesCollapsibleView.set({label:e("List properties"),isCollapsed:!0}),this.additionalPropertiesCollapsibleView.buttonView.bind("isEnabled").toMany(i,"isEnabled",((...t)=>t.some((t=>t)))),this.additionalPropertiesCollapsibleView.buttonView.on("change:isEnabled",((t,e,i)=>{i||(this.additionalPropertiesCollapsibleView.isCollapsed=!0)})),this.children.add(this.additionalPropertiesCollapsibleView)):this.children.addMany(i)}_createStartIndexField(){const t=this.locale.t,e=new em(this.locale,nm);return e.set({label:t("Start at"),class:"ck-numbered-list-properties__start-index"}),e.fieldView.set({min:0,step:1,value:1,inputMode:"numeric"}),e.fieldView.on("input",(()=>{const i=e.fieldView.element,n=i.valueAsNumber;Number.isNaN(n)||(i.checkValidity()?this.fire("listStart",{startIndex:n}):e.errorText=t("Start index must be greater than 0."))})),e}_createReversedSwitchButton(){const t=this.locale.t,e=new Uo(this.locale);return e.set({withText:!0,label:t("Reversed order"),class:"ck-numbered-list-properties__reversed-order"}),e.delegate("execute").to(this,"listReversed"),e}}class p_ extends lr{static get pluginName(){return"ListPropertiesUI"}init(){const t=this.editor,e=t.locale.t,i=t.config.get("list.properties");i.styles&&t.ui.componentFactory.add("bulletedList",w_({editor:t,parentCommandName:"bulletedList",buttonLabel:e("Bulleted List"),buttonIcon:i_,styleGridAriaLabel:e("Bulleted list styles toolbar"),styleDefinitions:[{label:e("Toggle the disc list style"),tooltip:e("Disc"),type:"disc",icon:''},{label:e("Toggle the circle list style"),tooltip:e("Circle"),type:"circle",icon:''},{label:e("Toggle the square list style"),tooltip:e("Square"),type:"square",icon:''}]})),(i.styles||i.startIndex||i.reversed)&&t.ui.componentFactory.add("numberedList",w_({editor:t,parentCommandName:"numberedList",buttonLabel:e("Numbered List"),buttonIcon:e_,styleGridAriaLabel:e("Numbered list styles toolbar"),styleDefinitions:[{label:e("Toggle the decimal list style"),tooltip:e("Decimal"),type:"decimal",icon:''},{label:e("Toggle the decimal with leading zero list style"),tooltip:e("Decimal with leading zero"),type:"decimal-leading-zero",icon:''},{label:e("Toggle the lower–roman list style"),tooltip:e("Lower–roman"),type:"lower-roman",icon:''},{label:e("Toggle the upper–roman list style"),tooltip:e("Upper-roman"),type:"upper-roman",icon:''},{label:e("Toggle the lower–latin list style"),tooltip:e("Lower-latin"),type:"lower-latin",icon:''},{label:e("Toggle the upper–latin list style"),tooltip:e("Upper-latin"),type:"upper-latin",icon:''}]}))}}function w_({editor:t,parentCommandName:e,buttonLabel:i,buttonIcon:n,styleGridAriaLabel:s,styleDefinitions:o}){const r=t.commands.get(e);return a=>{const l=Of(a,er),c=l.buttonView;return l.bind("isEnabled").to(r),l.class="ck-list-styles-dropdown",c.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),c.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),c.bind("isOn").to(r,"value",(t=>!!t)),l.once("change:isOpen",(()=>{const i=function({editor:t,dropdownView:e,parentCommandName:i,styleDefinitions:n,styleGridAriaLabel:s}){const o=t.locale,r=t.config.get("list.properties");let a=null;"numberedList"!=i&&(r.startIndex=!1,r.reversed=!1);if(r.styles){const e=t.commands.get("listStyle"),s=function({editor:t,listStyleCommand:e,parentCommandName:i}){const n=t.locale,s=t.commands.get(i);return({label:i,type:o,icon:r,tooltip:a})=>{const l=new qo(n);return l.set({label:i,icon:r,tooltip:a}),e.on("change:value",(()=>{l.isOn=e.value===o})),l.on("execute",(()=>{s.value?e.value!==o?t.execute("listStyle",{type:o}):t.execute("listStyle",{type:e.defaultType}):t.model.change((()=>{t.execute("listStyle",{type:o})}))})),l}}({editor:t,parentCommandName:i,listStyleCommand:e}),o="function"==typeof e.isStyleTypeSupported?t=>e.isStyleTypeSupported(t.type):()=>!0;a=n.filter(o).map(s)}const l=new g_(o,{styleGridAriaLabel:s,enabledProperties:r,styleButtonViews:a});r.styles&&Bf(e,(()=>l.stylesView.children.find((t=>t.isOn))));if(r.startIndex){const e=t.commands.get("listStart");l.startIndexFieldView.bind("isEnabled").to(e),l.startIndexFieldView.fieldView.bind("value").to(e),l.on("listStart",((e,i)=>t.execute("listStart",i)))}if(r.reversed){const e=t.commands.get("listReversed");l.reversedSwitchButtonView.bind("isEnabled").to(e),l.reversedSwitchButtonView.bind("isOn").to(e,"value",(t=>!!t)),l.on("listReversed",(()=>{const i=e.value;t.execute("listReversed",{reversed:!i})}))}return l.delegate("execute").to(e),l}({editor:t,dropdownView:l,parentCommandName:e,styleGridAriaLabel:s,styleDefinitions:o});l.panelView.children.add(i)})),l.on("execute",(()=>{t.editing.view.focus()})),l}}function b_(t,e,i,{blockElements:n,inlineObjectElements:s}){let o=i.createPositionAt(t,"forward"==e?"after":"before");return o=o.getLastMatchingPosition((({item:t})=>t.is("element")&&!n.includes(t.name)&&!s.includes(t.name)),{direction:e}),"forward"==e?o.nodeAfter:o.nodeBefore}function __(t,e){return!!t&&t.is("element")&&e.includes(t.name)}function v_(t,e){if(!t.childCount)return;const i=new cf(t.document),n=function(t,e){const i=e.createRangeIn(t),n=new Tr({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),s=[];for(const t of i)if("elementStart"===t.type&&n.match(t.item)){const e=A_(t.item);s.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}return s}(t,i);if(!n.length)return;let s=null,o=1;n.forEach(((t,r)=>{const a=function(t,e){if(!t)return!0;if(t.id!==e.id)return e.indent-t.indent!=1;const i=e.element.previousSibling;if(!i)return!0;return n=i,!(n.is("element","ol")||n.is("element","ul"));var n}(n[r-1],t),l=a?null:n[r-1],c=(d=t,(h=l)?d.indent-h.indent:d.indent-1);var h,d;if(a&&(s=null,o=1),!s||0!==c){const n=function(t,e){const i=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi"),n=/mso-level-number-format:([^;]{0,100});/gi,s=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,o=i.exec(e);let r="decimal",a="ol",l=null;if(o&&o[1]){const e=n.exec(o[1]);if(e&&e[1]&&(r=e[1].trim(),a="bullet"!==r&&"image"!==r?"ol":"ul"),"bullet"===r){const e=function(t){const e=function(t){if(t.getChild(0).is("$text"))return null;for(const e of t.getChildren()){if(!e.is("element","span"))continue;const t=e.getChild(0);return t.is("$text")?t:t.getChild(0)}return null}(t);if(!e)return null;const i=e._data;if("o"===i)return"circle";if("·"===i)return"disc";if("§"===i)return"square";return null}(t.element);e&&(r=e)}else{const t=s.exec(o[1]);t&&t[1]&&(l=parseInt(t[1]))}}return{type:a,startIndex:l,style:y_(r)}}(t,e);if(s){if(t.indent>o){const t=s.getChild(s.childCount-1),e=t.getChild(t.childCount-1);s=k_(n,e,i),o+=1}else if(t.indent1&&i.setAttribute("start",t.startIndex,s),s}function A_(t){const e={},i=t.getStyle("mso-list");if(i){const t=i.match(/(^|\s{1,100})l(\d+)/i),n=i.match(/\s{0,100}lfo(\d+)/i),s=i.match(/\s{0,100}level(\d+)/i);t&&n&&s&&(e.id=t[2],e.order=n[1],e.indent=parseInt(s[1]))}return e}const x_=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class C_{constructor(t){this.document=t}isActive(t){return x_.test(t)}execute(t){const e=new cf(this.document),{body:i}=t._parsedData;!function(t,e){for(const i of t.getChildren())if(i.is("element","b")&&"normal"===i.getStyle("font-weight")){const n=t.getChildIndex(i);e.remove(i),e.insertChild(n,i.getChildren(),t)}}(i,e),function(t,e){for(const i of e.createRangeIn(t)){const t=i.item;if(t.is("element","li")){const i=t.getChild(0);i&&i.is("element","p")&&e.unwrapElement(i)}}}(i,e),function(t,e){const i=new Xa(e.document.stylesProcessor),n=new jl(i,{renderingMode:"data"}),s=n.blockElements,o=n.inlineObjectElements,r=[];for(const i of e.createRangeIn(t)){const t=i.item;if(t.is("element","br")){const i=b_(t,"forward",e,{blockElements:s,inlineObjectElements:o}),n=b_(t,"backward",e,{blockElements:s,inlineObjectElements:o}),a=__(i,s);(__(n,s)||a)&&r.push(t)}}for(const t of r)t.hasClass("Apple-interchange-newline")?e.remove(t):e.replace(t,e.createElement("p"))}(i,e),t.content=i}}function P_(t,e){if(!t.childCount)return;const i=new cf(t.document),n=function(t,e){const i=e.createRangeIn(t),n=new Tr({name:/v:(.+)/}),s=[];for(const t of i){if("elementStart"!=t.type)continue;const e=t.item,i=e.previousSibling,o=i&&i.is("element")?i.name:null;n.match(e)&&e.getAttribute("o:gfxdata")&&"v:shapetype"!==o&&s.push(t.item.getAttribute("id"))}return s}(t,i);!function(t,e,i){const n=i.createRangeIn(e),s=new Tr({name:"img"}),o=[];for(const e of n)if(e.item.is("element")&&s.match(e.item)){const i=e.item,n=i.getAttribute("v:shapes")?i.getAttribute("v:shapes").split(" "):[];n.length&&n.every((e=>t.indexOf(e)>-1))?o.push(i):i.getAttribute("src")||o.push(i)}for(const t of o)i.remove(t)}(n,t,i),function(t,e,i){const n=i.createRangeIn(e),s=[];for(const e of n)if("elementStart"==e.type&&e.item.is("element","v:shape")){const i=e.item.getAttribute("id");if(t.includes(i))continue;o(e.item.parent.getChildren(),i)||s.push(e.item)}for(const t of s){const e={src:r(t)};t.hasAttribute("alt")&&(e.alt=t.getAttribute("alt"));const n=i.createElement("img",e);i.insertChild(t.index+1,n,t.parent)}function o(t,e){for(const i of t)if(i.is("element")){if("img"==i.name&&i.getAttribute("v:shapes")==e)return!0;if(o(i.getChildren(),e))return!0}return!1}function r(t){for(const e of t.getChildren())if(e.is("element")&&e.getAttribute("src"))return e.getAttribute("src")}}(n,t,i),function(t,e){const i=e.createRangeIn(t),n=new Tr({name:/v:(.+)/}),s=[];for(const t of i)"elementStart"==t.type&&n.match(t.item)&&s.push(t.item);for(const t of s)e.remove(t)}(t,i);const s=function(t,e){const i=e.createRangeIn(t),n=new Tr({name:"img"}),s=[];for(const t of i)t.item.is("element")&&n.match(t.item)&&t.item.getAttribute("src").startsWith("file://")&&s.push(t.item);return s}(t,i);s.length&&function(t,e,i){if(t.length===e.length)for(let n=0;nString.fromCharCode(parseInt(t,16)))).join(""))}const E_=//i,S_=/xmlns:o="urn:schemas-microsoft-com/i;class R_{constructor(t){this.document=t}isActive(t){return E_.test(t)||S_.test(t)}execute(t){const{body:e,stylesString:i}=t._parsedData;v_(e,i),P_(e,t.dataTransfer.getData("text/rtf")),t.content=e}}function O_(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1===e.length?" ":Array(e.length+1).join("  ").substr(0,e.length)))}function I_(t,e){const i=new DOMParser,n=function(t){return O_(O_(t)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(t){const e="",i="",n=t.indexOf(e);if(n<0)return t;const s=t.indexOf(i,n+e.length);return t.substring(0,n+e.length)+(s>=0?t.substring(s):"")}(t=t.replace(/

      abc

      + // + if (isAttribute && this._wrapAttributeElement(wrapElement, child)) { + wrapPositions.push(new Position(parent, i)); + } + // + // Wrap the child if it is not an attribute element or if it is an attribute element that should be inside + // `wrapElement` (due to priority). + // + //

      abc

      -->

      abc

      + //

      abc

      -->

      abc

      + else if (isText || !isAttribute || shouldABeOutsideB(wrapElement, child)) { + // Clone attribute. + const newAttribute = wrapElement._clone(); + // Wrap current node with new attribute. + child._remove(); + newAttribute._appendChild(child); + parent._insertChild(i, newAttribute); + this._addToClonedElementsGroup(newAttribute); + wrapPositions.push(new Position(parent, i)); + } + // + // If other nested attribute is found and it wasn't wrapped (see above), continue wrapping inside it. + // + //

      abc

      -->

      abc

      + // + else /* if ( isAttribute ) */ { + this._wrapChildren(child, 0, child.childCount, wrapElement); + } + i++; + } + // Merge at each wrap. + let offsetChange = 0; + for (const position of wrapPositions) { + position.offset -= offsetChange; + // Do not merge with elements outside selected children. + if (position.offset == startOffset) { + continue; + } + const newPosition = this.mergeAttributes(position); + // If nodes were merged - other merge offsets will change. + if (!newPosition.isEqual(position)) { + offsetChange++; + endOffset--; + } + } + return Range._createFromParentsAndOffsets(parent, startOffset, parent, endOffset); + } + /** + * Unwraps children from provided `unwrapElement`. Only children contained in `parent` element between + * `startOffset` and `endOffset` will be unwrapped. + */ + _unwrapChildren(parent, startOffset, endOffset, unwrapElement) { + let i = startOffset; + const unwrapPositions = []; + // Iterate over each element between provided offsets inside parent. + // We don't use tree walker or range iterator because we will be removing and merging potentially multiple nodes, + // so it could get messy. It is safer to it manually in this case. + while (i < endOffset) { + const child = parent.getChild(i); + // Skip all text nodes. There should be no container element's here either. + if (!child.is('attributeElement')) { + i++; + continue; + } + // + // (In all examples, assume that `unwrapElement` is `` element.) + // + // If the child is similar to the given attribute element, unwrap it - it will be completely removed. + // + //

      abcxyz

      -->

      abcxyz

      + // + if (child.isSimilar(unwrapElement)) { + const unwrapped = child.getChildren(); + const count = child.childCount; + // Replace wrapper element with its children + child._remove(); + parent._insertChild(i, unwrapped); + this._removeFromClonedElementsGroup(child); + // Save start and end position of moved items. + unwrapPositions.push(new Position(parent, i), new Position(parent, i + count)); + // Skip elements that were unwrapped. Assuming there won't be another element to unwrap in child elements. + i += count; + endOffset += count - 1; + continue; + } + // + // If the child is not similar but is an attribute element, try partial unwrapping - remove the same attributes/styles/classes. + // Partial unwrapping will happen only if the elements have the same name. + // + //

      abcxyz

      -->

      abcxyz

      + //

      abcxyz

      -->

      abcxyz

      + // + if (this._unwrapAttributeElement(unwrapElement, child)) { + unwrapPositions.push(new Position(parent, i), new Position(parent, i + 1)); + i++; + continue; + } + // + // If other nested attribute is found, look through it's children for elements to unwrap. + // + //

      abc

      -->

      abc

      + // + this._unwrapChildren(child, 0, child.childCount, unwrapElement); + i++; + } + // Merge at each unwrap. + let offsetChange = 0; + for (const position of unwrapPositions) { + position.offset -= offsetChange; + // Do not merge with elements outside selected children. + if (position.offset == startOffset || position.offset == endOffset) { + continue; + } + const newPosition = this.mergeAttributes(position); + // If nodes were merged - other merge offsets will change. + if (!newPosition.isEqual(position)) { + offsetChange++; + endOffset--; + } + } + return Range._createFromParentsAndOffsets(parent, startOffset, parent, endOffset); + } + /** + * Helper function for `view.writer.wrap`. Wraps range with provided attribute element. + * This method will also merge newly added attribute element with its siblings whenever possible. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not + * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}. + * + * @returns New range after wrapping, spanning over wrapping attribute element. + */ + _wrapRange(range, attribute) { + // Break attributes at range start and end. + const { start: breakStart, end: breakEnd } = this._breakAttributesRange(range, true); + const parentContainer = breakStart.parent; + // Wrap all children with attribute. + const newRange = this._wrapChildren(parentContainer, breakStart.offset, breakEnd.offset, attribute); + // Merge attributes at the both ends and return a new range. + const start = this.mergeAttributes(newRange.start); + // If start position was merged - move end position back. + if (!start.isEqual(newRange.start)) { + newRange.end.offset--; + } + const end = this.mergeAttributes(newRange.end); + return new Range(start, end); + } + /** + * Helper function for {@link #wrap}. Wraps position with provided attribute element. + * This method will also merge newly added attribute element with its siblings whenever possible. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not + * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}. + * + * @returns New position after wrapping. + */ + _wrapPosition(position, attribute) { + // Return same position when trying to wrap with attribute similar to position parent. + if (attribute.isSimilar(position.parent)) { + return movePositionToTextNode(position.clone()); + } + // When position is inside text node - break it and place new position between two text nodes. + if (position.parent.is('$text')) { + position = breakTextNode(position); + } + // Create fake element that will represent position, and will not be merged with other attributes. + const fakeElement = this.createAttributeElement('_wrapPosition-fake-element'); + fakeElement._priority = Number.POSITIVE_INFINITY; + fakeElement.isSimilar = () => false; + // Insert fake element in position location. + position.parent._insertChild(position.offset, fakeElement); + // Range around inserted fake attribute element. + const wrapRange = new Range(position, position.getShiftedBy(1)); + // Wrap fake element with attribute (it will also merge if possible). + this.wrap(wrapRange, attribute); + // Remove fake element and place new position there. + const newPosition = new Position(fakeElement.parent, fakeElement.index); + fakeElement._remove(); + // If position is placed between text nodes - merge them and return position inside. + const nodeBefore = newPosition.nodeBefore; + const nodeAfter = newPosition.nodeAfter; + if (nodeBefore instanceof text_Text && nodeAfter instanceof text_Text) { + return mergeTextNodes(nodeBefore, nodeAfter); + } + // If position is next to text node - move position inside. + return movePositionToTextNode(newPosition); + } + /** + * Wraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by + * merging them if possible. When merging is possible - all attributes, styles and classes are moved from wrapper + * element to element being wrapped. + * + * @param wrapper Wrapper AttributeElement. + * @param toWrap AttributeElement to wrap using wrapper element. + * @returns Returns `true` if elements are merged. + */ + _wrapAttributeElement(wrapper, toWrap) { + if (!canBeJoined(wrapper, toWrap)) { + return false; + } + // Can't merge if name or priority differs. + if (wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority) { + return false; + } + // Check if attributes can be merged. + for (const key of wrapper.getAttributeKeys()) { + // Classes and styles should be checked separately. + if (key === 'class' || key === 'style') { + continue; + } + // If some attributes are different we cannot wrap. + if (toWrap.hasAttribute(key) && toWrap.getAttribute(key) !== wrapper.getAttribute(key)) { + return false; + } + } + // Check if styles can be merged. + for (const key of wrapper.getStyleNames()) { + if (toWrap.hasStyle(key) && toWrap.getStyle(key) !== wrapper.getStyle(key)) { + return false; + } + } + // Move all attributes/classes/styles from wrapper to wrapped AttributeElement. + for (const key of wrapper.getAttributeKeys()) { + // Classes and styles should be checked separately. + if (key === 'class' || key === 'style') { + continue; + } + // Move only these attributes that are not present - other are similar. + if (!toWrap.hasAttribute(key)) { + this.setAttribute(key, wrapper.getAttribute(key), toWrap); + } + } + for (const key of wrapper.getStyleNames()) { + if (!toWrap.hasStyle(key)) { + this.setStyle(key, wrapper.getStyle(key), toWrap); + } + } + for (const key of wrapper.getClassNames()) { + if (!toWrap.hasClass(key)) { + this.addClass(key, toWrap); + } + } + return true; + } + /** + * Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing + * corresponding attributes, classes and styles. All attributes, classes and styles from wrapper should be present + * inside element being unwrapped. + * + * @param wrapper Wrapper AttributeElement. + * @param toUnwrap AttributeElement to unwrap using wrapper element. + * @returns Returns `true` if elements are unwrapped. + **/ + _unwrapAttributeElement(wrapper, toUnwrap) { + if (!canBeJoined(wrapper, toUnwrap)) { + return false; + } + // Can't unwrap if name or priority differs. + if (wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority) { + return false; + } + // Check if AttributeElement has all wrapper attributes. + for (const key of wrapper.getAttributeKeys()) { + // Classes and styles should be checked separately. + if (key === 'class' || key === 'style') { + continue; + } + // If some attributes are missing or different we cannot unwrap. + if (!toUnwrap.hasAttribute(key) || toUnwrap.getAttribute(key) !== wrapper.getAttribute(key)) { + return false; + } + } + // Check if AttributeElement has all wrapper classes. + if (!toUnwrap.hasClass(...wrapper.getClassNames())) { + return false; + } + // Check if AttributeElement has all wrapper styles. + for (const key of wrapper.getStyleNames()) { + // If some styles are missing or different we cannot unwrap. + if (!toUnwrap.hasStyle(key) || toUnwrap.getStyle(key) !== wrapper.getStyle(key)) { + return false; + } + } + // Remove all wrapper's attributes from unwrapped element. + for (const key of wrapper.getAttributeKeys()) { + // Classes and styles should be checked separately. + if (key === 'class' || key === 'style') { + continue; + } + this.removeAttribute(key, toUnwrap); + } + // Remove all wrapper's classes from unwrapped element. + this.removeClass(Array.from(wrapper.getClassNames()), toUnwrap); + // Remove all wrapper's styles from unwrapped element. + this.removeStyle(Array.from(wrapper.getStyleNames()), toUnwrap); + return true; + } + /** + * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at the boundaries of given range. + * + * @param range Range which `start` and `end` positions will be used to break attributes. + * @param forceSplitText If set to `true`, will break text nodes even if they are directly in container element. + * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state. + * @returns New range with located at break positions. + */ + _breakAttributesRange(range, forceSplitText = false) { + const rangeStart = range.start; + const rangeEnd = range.end; + validateRangeContainer(range, this.document); + // Break at the collapsed position. Return new collapsed range. + if (range.isCollapsed) { + const position = this._breakAttributes(range.start, forceSplitText); + return new Range(position, position); + } + const breakEnd = this._breakAttributes(rangeEnd, forceSplitText); + const count = breakEnd.parent.childCount; + const breakStart = this._breakAttributes(rangeStart, forceSplitText); + // Calculate new break end offset. + breakEnd.offset += breakEnd.parent.childCount - count; + return new Range(breakStart, breakEnd); + } + /** + * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at given position. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position + * is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position + * is placed inside {@link module:engine/view/uielement~UIElement UIElement}. + * + * @param position Position where to break attributes. + * @param forceSplitText If set to `true`, will break text nodes even if they are directly in container element. + * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state. + * @returns New position after breaking the attributes. + */ + _breakAttributes(position, forceSplitText = false) { + const positionOffset = position.offset; + const positionParent = position.parent; + // If position is placed inside EmptyElement - throw an exception as we cannot break inside. + if (position.parent.is('emptyElement')) { + /** + * Cannot break an `EmptyElement` instance. + * + * This error is thrown if + * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`} + * was executed in an incorrect position. + * + * @error view-writer-cannot-break-empty-element + */ + throw new ckeditorerror_CKEditorError('view-writer-cannot-break-empty-element', this.document); + } + // If position is placed inside UIElement - throw an exception as we cannot break inside. + if (position.parent.is('uiElement')) { + /** + * Cannot break a `UIElement` instance. + * + * This error is thrown if + * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`} + * was executed in an incorrect position. + * + * @error view-writer-cannot-break-ui-element + */ + throw new ckeditorerror_CKEditorError('view-writer-cannot-break-ui-element', this.document); + } + // If position is placed inside RawElement - throw an exception as we cannot break inside. + if (position.parent.is('rawElement')) { + /** + * Cannot break a `RawElement` instance. + * + * This error is thrown if + * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`} + * was executed in an incorrect position. + * + * @error view-writer-cannot-break-raw-element + */ + throw new ckeditorerror_CKEditorError('view-writer-cannot-break-raw-element', this.document); + } + // There are no attributes to break and text nodes breaking is not forced. + if (!forceSplitText && positionParent.is('$text') && isContainerOrFragment(positionParent.parent)) { + return position.clone(); + } + // Position's parent is container, so no attributes to break. + if (isContainerOrFragment(positionParent)) { + return position.clone(); + } + // Break text and start again in new position. + if (positionParent.is('$text')) { + return this._breakAttributes(breakTextNode(position), forceSplitText); + } + const length = positionParent.childCount; + //

      foobar{}

      + //

      foobar[]

      + //

      foobar[]

      + if (positionOffset == length) { + const newPosition = new Position(positionParent.parent, positionParent.index + 1); + return this._breakAttributes(newPosition, forceSplitText); + } + else { + //

      foo{}bar

      + //

      foo[]bar

      + //

      foo{}bar

      + if (positionOffset === 0) { + const newPosition = new Position(positionParent.parent, positionParent.index); + return this._breakAttributes(newPosition, forceSplitText); + } + //

      foob{}ar

      + //

      foob[]ar

      + //

      foob[]ar

      + //

      foob[]ar

      + else { + const offsetAfter = positionParent.index + 1; + // Break element. + const clonedNode = positionParent._clone(); + // Insert cloned node to position's parent node. + positionParent.parent._insertChild(offsetAfter, clonedNode); + this._addToClonedElementsGroup(clonedNode); + // Get nodes to move. + const count = positionParent.childCount - positionOffset; + const nodesToMove = positionParent._removeChildren(positionOffset, count); + // Move nodes to cloned node. + clonedNode._appendChild(nodesToMove); + // Create new position to work on. + const newPosition = new Position(positionParent.parent, offsetAfter); + return this._breakAttributes(newPosition, forceSplitText); + } + } + } + /** + * Stores the information that an {@link module:engine/view/attributeelement~AttributeElement attribute element} was + * added to the tree. Saves the reference to the group in the given element and updates the group, so other elements + * from the group now keep a reference to the given attribute element. + * + * The clones group can be obtained using {@link module:engine/view/attributeelement~AttributeElement#getElementsWithSameId}. + * + * Does nothing if added element has no {@link module:engine/view/attributeelement~AttributeElement#id id}. + * + * @param element Attribute element to save. + */ + _addToClonedElementsGroup(element) { + // Add only if the element is in document tree. + if (!element.root.is('rootElement')) { + return; + } + // Traverse the element's children recursively to find other attribute elements that also might got inserted. + // The loop is at the beginning so we can make fast returns later in the code. + if (element.is('element')) { + for (const child of element.getChildren()) { + this._addToClonedElementsGroup(child); + } + } + const id = element.id; + if (!id) { + return; + } + let group = this._cloneGroups.get(id); + if (!group) { + group = new Set(); + this._cloneGroups.set(id, group); + } + group.add(element); + element._clonesGroup = group; + } + /** + * Removes all the information about the given {@link module:engine/view/attributeelement~AttributeElement attribute element} + * from its clones group. + * + * Keep in mind, that the element will still keep a reference to the group (but the group will not keep a reference to it). + * This allows to reference the whole group even if the element was already removed from the tree. + * + * Does nothing if the element has no {@link module:engine/view/attributeelement~AttributeElement#id id}. + * + * @param element Attribute element to remove. + */ + _removeFromClonedElementsGroup(element) { + // Traverse the element's children recursively to find other attribute elements that also got removed. + // The loop is at the beginning so we can make fast returns later in the code. + if (element.is('element')) { + for (const child of element.getChildren()) { + this._removeFromClonedElementsGroup(child); + } + } + const id = element.id; + if (!id) { + return; + } + const group = this._cloneGroups.get(id); + if (!group) { + return; + } + group.delete(element); + // Not removing group from element on purpose! + // If other parts of code have reference to this element, they will be able to get references to other elements from the group. + } +} +// Helper function for `view.writer.wrap`. Checks if given element has any children that are not ui elements. +function _hasNonUiChildren(parent) { + return Array.from(parent.getChildren()).some(child => !child.is('uiElement')); +} +/** + * The `attribute` passed to {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`} + * must be an instance of {@link module:engine/view/attributeelement~AttributeElement `AttributeElement`}. + * + * @error view-writer-wrap-invalid-attribute + */ +/** + * Returns first parent container of specified {@link module:engine/view/position~Position Position}. + * Position's parent node is checked as first, then next parents are checked. + * Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container. + * + * @param position Position used as a start point to locate parent container. + * @returns Parent container element or `undefined` if container is not found. + */ +function getParentContainer(position) { + let parent = position.parent; + while (!isContainerOrFragment(parent)) { + if (!parent) { + return undefined; + } + parent = parent.parent; + } + return parent; +} +/** + * Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function + * can be wrapped outside second element. It is done by comparing elements' + * {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority + * {@link module:engine/view/element~Element#getIdentity identities} are compared. + */ +function shouldABeOutsideB(a, b) { + if (a.priority < b.priority) { + return true; + } + else if (a.priority > b.priority) { + return false; + } + // When priorities are equal and names are different - use identities. + return a.getIdentity() < b.getIdentity(); +} +/** + * Returns new position that is moved to near text node. Returns same position if there is no text node before of after + * specified position. + * + * ```html + *

      foo[]

      ->

      foo{}

      + *

      []foo

      ->

      {}foo

      + * ``` + * + * @returns Position located inside text node or same position if there is no text nodes + * before or after position location. + */ +function movePositionToTextNode(position) { + const nodeBefore = position.nodeBefore; + if (nodeBefore && nodeBefore.is('$text')) { + return new Position(nodeBefore, nodeBefore.data.length); + } + const nodeAfter = position.nodeAfter; + if (nodeAfter && nodeAfter.is('$text')) { + return new Position(nodeAfter, 0); + } + return position; +} +/** + * Breaks text node into two text nodes when possible. + * + * ```html + *

      foo{}bar

      ->

      foo[]bar

      + *

      {}foobar

      ->

      []foobar

      + *

      foobar{}

      ->

      foobar[]

      + * ``` + * + * @param position Position that need to be placed inside text node. + * @returns New position after breaking text node. + */ +function breakTextNode(position) { + if (position.offset == position.parent.data.length) { + return new Position(position.parent.parent, position.parent.index + 1); + } + if (position.offset === 0) { + return new Position(position.parent.parent, position.parent.index); + } + // Get part of the text that need to be moved. + const textToMove = position.parent.data.slice(position.offset); + // Leave rest of the text in position's parent. + position.parent._data = position.parent.data.slice(0, position.offset); + // Insert new text node after position's parent text node. + position.parent.parent._insertChild(position.parent.index + 1, new text_Text(position.root.document, textToMove)); + // Return new position between two newly created text nodes. + return new Position(position.parent.parent, position.parent.index + 1); +} +/** + * Merges two text nodes into first node. Removes second node and returns merge position. + * + * @param t1 First text node to merge. Data from second text node will be moved at the end of this text node. + * @param t2 Second text node to merge. This node will be removed after merging. + * @returns Position after merging text nodes. + */ +function mergeTextNodes(t1, t2) { + // Merge text data into first text node and remove second one. + const nodeBeforeLength = t1.data.length; + t1._data += t2.data; + t2._remove(); + return new Position(t1, nodeBeforeLength); +} +const validNodesToInsert = [text_Text, AttributeElement, ContainerElement, EmptyElement, RawElement, UIElement]; +/** + * Checks if provided nodes are valid to insert. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert + * contains instances that are not supported ones (see error description for valid ones. + */ +function validateNodesToInsert(nodes, errorContext) { + for (const node of nodes) { + if (!validNodesToInsert.some((validNode => node instanceof validNode))) { // eslint-disable-line no-use-before-define + /** + * One of the nodes to be inserted is of an invalid type. + * + * Nodes to be inserted with {@link module:engine/view/downcastwriter~DowncastWriter#insert `DowncastWriter#insert()`} should be + * of the following types: + * + * * {@link module:engine/view/attributeelement~AttributeElement AttributeElement}, + * * {@link module:engine/view/containerelement~ContainerElement ContainerElement}, + * * {@link module:engine/view/emptyelement~EmptyElement EmptyElement}, + * * {@link module:engine/view/uielement~UIElement UIElement}, + * * {@link module:engine/view/rawelement~RawElement RawElement}, + * * {@link module:engine/view/text~Text Text}. + * + * @error view-writer-insert-invalid-node-type + */ + throw new ckeditorerror_CKEditorError('view-writer-insert-invalid-node-type', errorContext); + } + if (!node.is('$text')) { + validateNodesToInsert(node.getChildren(), errorContext); + } + } +} +/** + * Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way. + * + * @returns Returns `true` if node is instance of ContainerElement or DocumentFragment. + */ +function isContainerOrFragment(node) { + return node && (node.is('containerElement') || node.is('documentFragment')); +} +/** + * Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed + * inside same {@link module:engine/view/containerelement~ContainerElement container element}. + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails. + */ +function validateRangeContainer(range, errorContext) { + const startContainer = getParentContainer(range.start); + const endContainer = getParentContainer(range.end); + if (!startContainer || !endContainer || startContainer !== endContainer) { + /** + * The container of the given range is invalid. + * + * This may happen if {@link module:engine/view/range~Range#start range start} and + * {@link module:engine/view/range~Range#end range end} positions are not placed inside the same container element or + * a parent container for these positions cannot be found. + * + * Methods like {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#remove()`}, + * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#clean()`}, + * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`}, + * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#unwrap()`} need to be called + * on a range that has its start and end positions located in the same container element. Both positions can be + * nested within other elements (e.g. an attribute element) but the closest container ancestor must be the same. + * + * @error view-writer-invalid-range-container + */ + throw new ckeditorerror_CKEditorError('view-writer-invalid-range-container', errorContext); + } +} +/** + * Checks if two attribute elements can be joined together. Elements can be joined together if, and only if + * they do not have ids specified. + */ +function canBeJoined(a, b) { + return a.id === null && b.id === null; +} + +;// CONCATENATED MODULE: ./node_modules/@ckeditor/ckeditor5-engine/src/view/filler.js +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * Set of utilities related to handling block and inline fillers. + * + * Browsers do not allow to put caret in elements which does not have height. Because of it, we need to fill all + * empty elements which should be selectable with elements or characters called "fillers". Unfortunately there is no one + * universal filler, this is why two types are uses: + * + * * Block filler is an element which fill block elements, like `

      `. CKEditor uses `
      ` as a block filler during the editing, + * as browsers do natively. So instead of an empty `

      ` there will be `


      `. The advantage of block filler is that + * it is transparent for the selection, so when the caret is before the `
      ` and user presses right arrow he will be + * moved to the next paragraph, not after the `
      `. The disadvantage is that it breaks a block, so it can not be used + * in the middle of a line of text. The {@link module:engine/view/filler~BR_FILLER `
      ` filler} can be replaced with any other + * character in the data output, for instance {@link module:engine/view/filler~NBSP_FILLER non-breaking space} or + * {@link module:engine/view/filler~MARKED_NBSP_FILLER marked non-breaking space}. + * + * * Inline filler is a filler which does not break a line of text, so it can be used inside the text, for instance in the empty + * `` surrendered by text: `foobar`, if we want to put the caret there. CKEditor uses a sequence of the zero-width + * spaces as an {@link module:engine/view/filler~INLINE_FILLER inline filler} having the predetermined + * {@link module:engine/view/filler~INLINE_FILLER_LENGTH length}. A sequence is used, instead of a single character to + * avoid treating random zero-width spaces as the inline filler. Disadvantage of the inline filler is that it is not + * transparent for the selection. The arrow key moves the caret between zero-width spaces characters, so the additional + * code is needed to handle the caret. + * + * Both inline and block fillers are handled by the {@link module:engine/view/renderer~Renderer renderer} and are not present in the + * view. + * + * @module engine/view/filler + */ +/** + * Non-breaking space filler creator. This function creates the ` ` text node. + * It defines how the filler is created. + * + * @see module:engine/view/filler~MARKED_NBSP_FILLER + * @see module:engine/view/filler~BR_FILLER + */ +const NBSP_FILLER = (domDocument) => domDocument.createTextNode('\u00A0'); +/** + * Marked non-breaking space filler creator. This function creates the ` ` element. + * It defines how the filler is created. + * + * @see module:engine/view/filler~NBSP_FILLER + * @see module:engine/view/filler~BR_FILLER + */ +const MARKED_NBSP_FILLER = (domDocument) => { + const span = domDocument.createElement('span'); + span.dataset.ckeFiller = 'true'; + span.innerText = '\u00A0'; + return span; +}; +/** + * `
      ` filler creator. This function creates the `
      ` element. + * It defines how the filler is created. + * + * @see module:engine/view/filler~NBSP_FILLER + * @see module:engine/view/filler~MARKED_NBSP_FILLER + */ +const BR_FILLER = (domDocument) => { + const fillerBr = domDocument.createElement('br'); + fillerBr.dataset.ckeFiller = 'true'; + return fillerBr; +}; +/** + * Length of the {@link module:engine/view/filler~INLINE_FILLER INLINE_FILLER}. + */ +const INLINE_FILLER_LENGTH = 7; +/** + * Inline filler which is a sequence of the word joiners. + */ +const INLINE_FILLER = '\u2060'.repeat(INLINE_FILLER_LENGTH); +/** + * Checks if the node is a text node which starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}. + * + * ```ts + * startsWithFiller( document.createTextNode( INLINE_FILLER ) ); // true + * startsWithFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // true + * startsWithFiller( document.createTextNode( 'foo' ) ); // false + * startsWithFiller( document.createElement( 'p' ) ); // false + * ``` + * + * @param domNode DOM node. + * @returns True if the text node starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}. + */ +function startsWithFiller(domNode) { + return isText(domNode) && (domNode.data.substr(0, INLINE_FILLER_LENGTH) === INLINE_FILLER); +} +/** + * Checks if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}. + * + * ```ts + * isInlineFiller( document.createTextNode( INLINE_FILLER ) ); // true + * isInlineFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // false + * ``` + * + * @param domText DOM text node. + * @returns True if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}. + */ +function isInlineFiller(domText) { + return domText.data.length == INLINE_FILLER_LENGTH && startsWithFiller(domText); +} +/** + * Get string data from the text node, removing an {@link module:engine/view/filler~INLINE_FILLER inline filler} from it, + * if text node contains it. + * + * ```ts + * getDataWithoutFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ) == 'foo' // true + * getDataWithoutFiller( document.createTextNode( 'foo' ) ) == 'foo' // true + * ``` + * + * @param domText DOM text node, possible with inline filler. + * @returns Data without filler. + */ +function getDataWithoutFiller(domText) { + if (startsWithFiller(domText)) { + return domText.data.slice(INLINE_FILLER_LENGTH); + } + else { + return domText.data; + } +} +/** + * Assign key observer which move cursor from the end of the inline filler to the beginning of it when + * the left arrow is pressed, so the filler does not break navigation. + * + * @param view View controller instance we should inject quirks handling on. + */ +function injectQuirksHandling(view) { + view.document.on('arrowKey', jumpOverInlineFiller, { priority: 'low' }); +} +/** + * Move cursor from the end of the inline filler to the beginning of it when, so the filler does not break navigation. + */ +function jumpOverInlineFiller(evt, data) { + if (data.keyCode == keyCodes.arrowleft) { + const domSelection = data.domTarget.ownerDocument.defaultView.getSelection(); + if (domSelection.rangeCount == 1 && domSelection.getRangeAt(0).collapsed) { + const domParent = domSelection.getRangeAt(0).startContainer; + const domOffset = domSelection.getRangeAt(0).startOffset; + if (startsWithFiller(domParent) && domOffset <= INLINE_FILLER_LENGTH) { + domSelection.collapse(domParent, 0); + } + } + } +} + +;// CONCATENATED MODULE: ./node_modules/@ckeditor/ckeditor5-engine/src/view/renderer.js +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module engine/view/renderer + */ + + + + + +/** + * Renderer is responsible for updating the DOM structure and the DOM selection based on + * the {@link module:engine/view/renderer~Renderer#markToSync information about updated view nodes}. + * In other words, it renders the view to the DOM. + * + * Its main responsibility is to make only the necessary, minimal changes to the DOM. However, unlike in many + * virtual DOM implementations, the primary reason for doing minimal changes is not the performance but ensuring + * that native editing features such as text composition, autocompletion, spell checking, selection's x-index are + * affected as little as possible. + * + * Renderer uses {@link module:engine/view/domconverter~DomConverter} to transform view nodes and positions + * to and from the DOM. + */ +class Renderer extends ObservableMixin() { + /** + * Creates a renderer instance. + * + * @param domConverter Converter instance. + * @param selection View selection. + */ + constructor(domConverter, selection) { + super(); + /** + * Set of DOM Documents instances. + */ + this.domDocuments = new Set(); + /** + * Set of nodes which attributes changed and may need to be rendered. + */ + this.markedAttributes = new Set(); + /** + * Set of elements which child lists changed and may need to be rendered. + */ + this.markedChildren = new Set(); + /** + * Set of text nodes which text data changed and may need to be rendered. + */ + this.markedTexts = new Set(); + /** + * The text node in which the inline filler was rendered. + */ + this._inlineFiller = null; + /** + * DOM element containing fake selection. + */ + this._fakeSelectionContainer = null; + this.domConverter = domConverter; + this.selection = selection; + this.set('isFocused', false); + this.set('isSelecting', false); + // Rendering the selection and inline filler manipulation should be postponed in (non-Android) Blink until the user finishes + // creating the selection in DOM to avoid accidental selection collapsing + // (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723). + // When the user stops selecting, all pending changes should be rendered ASAP, though. + if (src_env.isBlink && !src_env.isAndroid) { + this.on('change:isSelecting', () => { + if (!this.isSelecting) { + this.render(); + } + }); + } + this.set('isComposing', false); + this.on('change:isComposing', () => { + if (!this.isComposing) { + this.render(); + } + }); + } + /** + * Marks a view node to be updated in the DOM by {@link #render `render()`}. + * + * Note that only view nodes whose parents have corresponding DOM elements need to be marked to be synchronized. + * + * @see #markedAttributes + * @see #markedChildren + * @see #markedTexts + * + * @param type Type of the change. + * @param node ViewNode to be marked. + */ + markToSync(type, node) { + if (type === 'text') { + if (this.domConverter.mapViewToDom(node.parent)) { + this.markedTexts.add(node); + } + } + else { + // If the node has no DOM element it is not rendered yet, + // its children/attributes do not need to be marked to be sync. + if (!this.domConverter.mapViewToDom(node)) { + return; + } + if (type === 'attributes') { + this.markedAttributes.add(node); + } + else if (type === 'children') { + this.markedChildren.add(node); + } + else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const unreachable = type; + /** + * Unknown type passed to Renderer.markToSync. + * + * @error view-renderer-unknown-type + */ + throw new ckeditorerror_CKEditorError('view-renderer-unknown-type', this); + } + } + } + /** + * Renders all buffered changes ({@link #markedAttributes}, {@link #markedChildren} and {@link #markedTexts}) and + * the current view selection (if needed) to the DOM by applying a minimal set of changes to it. + * + * Renderer tries not to break the text composition (e.g. IME) and x-index of the selection, + * so it does as little as it is needed to update the DOM. + * + * Renderer also handles {@link module:engine/view/filler fillers}. Especially, it checks if the inline filler is needed + * at the selection position and adds or removes it. To prevent breaking text composition inline filler will not be + * removed as long as the selection is in the text node which needed it at first. + */ + render() { + // Ignore rendering while in the composition mode. Composition events are not cancellable and browser will modify the DOM tree. + // All marked elements, attributes, etc. will wait until next render after the composition ends. + // On Android composition events are immediately applied to the model, so we don't need to skip rendering, + // and we should not do it because the difference between view and DOM could lead to position mapping problems. + if (this.isComposing && !src_env.isAndroid) { + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.info( '%c[Renderer]%c Rendering aborted while isComposing', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + return; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.group( '%c[Renderer]%c Rendering', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + let inlineFillerPosition = null; + const isInlineFillerRenderingPossible = src_env.isBlink && !src_env.isAndroid ? !this.isSelecting : true; + // Refresh mappings. + for (const element of this.markedChildren) { + this._updateChildrenMappings(element); + } + // Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental + // DOM selection collapsing + // (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723). + if (isInlineFillerRenderingPossible) { + // There was inline filler rendered in the DOM but it's not + // at the selection position any more, so we can remove it + // (cause even if it's needed, it must be placed in another location). + if (this._inlineFiller && !this._isSelectionInInlineFiller()) { + this._removeInlineFiller(); + } + // If we've got the filler, let's try to guess its position in the view. + if (this._inlineFiller) { + inlineFillerPosition = this._getInlineFillerPosition(); + } + // Otherwise, if it's needed, create it at the selection position. + else if (this._needsInlineFillerAtSelection()) { + inlineFillerPosition = this.selection.getFirstPosition(); + // Do not use `markToSync` so it will be added even if the parent is already added. + this.markedChildren.add(inlineFillerPosition.parent); + } + } + // Make sure the inline filler has any parent, so it can be mapped to view position by DomConverter. + else if (this._inlineFiller && this._inlineFiller.parentNode) { + // While the user is making selection, preserve the inline filler at its original position. + inlineFillerPosition = this.domConverter.domPositionToView(this._inlineFiller); + // While down-casting the document selection attributes, all existing empty + // attribute elements (for selection position) are removed from the view and DOM, + // so make sure that we were able to map filler position. + // https://github.com/ckeditor/ckeditor5/issues/12026 + if (inlineFillerPosition && inlineFillerPosition.parent.is('$text')) { + // The inline filler position is expected to be before the text node. + inlineFillerPosition = Position._createBefore(inlineFillerPosition.parent); + } + } + for (const element of this.markedAttributes) { + this._updateAttrs(element); + } + for (const element of this.markedChildren) { + this._updateChildren(element, { inlineFillerPosition }); + } + for (const node of this.markedTexts) { + if (!this.markedChildren.has(node.parent) && this.domConverter.mapViewToDom(node.parent)) { + this._updateText(node, { inlineFillerPosition }); + } + } + // * Check whether the inline filler is required and where it really is in the DOM. + // At this point in most cases it will be in the DOM, but there are exceptions. + // For example, if the inline filler was deep in the created DOM structure, it will not be created. + // Similarly, if it was removed at the beginning of this function and then neither text nor children were updated, + // it will not be present. Fix those and similar scenarios. + // * Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental + // DOM selection collapsing + // (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723). + if (isInlineFillerRenderingPossible) { + if (inlineFillerPosition) { + const fillerDomPosition = this.domConverter.viewPositionToDom(inlineFillerPosition); + const domDocument = fillerDomPosition.parent.ownerDocument; + if (!startsWithFiller(fillerDomPosition.parent)) { + // Filler has not been created at filler position. Create it now. + this._inlineFiller = addInlineFiller(domDocument, fillerDomPosition.parent, fillerDomPosition.offset); + } + else { + // Filler has been found, save it. + this._inlineFiller = fillerDomPosition.parent; + } + } + else { + // There is no filler needed. + this._inlineFiller = null; + } + } + // First focus the new editing host, then update the selection. + // Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721). + this._updateFocus(); + this._updateSelection(); + this.markedTexts.clear(); + this.markedAttributes.clear(); + this.markedChildren.clear(); + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.groupEnd(); + // @if CK_DEBUG_TYPING // } + } + /** + * Updates mappings of view element's children. + * + * Children that were replaced in the view structure by similar elements (same tag name) are treated as 'replaced'. + * This means that their mappings can be updated so the new view elements are mapped to the existing DOM elements. + * Thanks to that these elements do not need to be re-rendered completely. + * + * @param viewElement The view element whose children mappings will be updated. + */ + _updateChildrenMappings(viewElement) { + const domElement = this.domConverter.mapViewToDom(viewElement); + if (!domElement) { + // If there is no `domElement` it means that it was already removed from DOM and there is no need to process it. + return; + } + // Removing nodes from the DOM as we iterate can cause `actualDomChildren` + // (which is a live-updating `NodeList`) to get out of sync with the + // indices that we compute as we iterate over `actions`. + // This would produce incorrect element mappings. + // + // Converting live list to an array to make the list static. + const actualDomChildren = Array.from(this.domConverter.mapViewToDom(viewElement).childNodes); + const expectedDomChildren = Array.from(this.domConverter.viewChildrenToDom(viewElement, { withChildren: false })); + const diff = this._diffNodeLists(actualDomChildren, expectedDomChildren); + const actions = this._findUpdateActions(diff, actualDomChildren, expectedDomChildren, areSimilarElements); + if (actions.indexOf('update') !== -1) { + const counter = { equal: 0, insert: 0, delete: 0 }; + for (const action of actions) { + if (action === 'update') { + const insertIndex = counter.equal + counter.insert; + const deleteIndex = counter.equal + counter.delete; + const viewChild = viewElement.getChild(insertIndex); + // UIElement and RawElement are special cases. Their children are not stored in a view (#799) + // so we cannot use them with replacing flow (since they use view children during rendering + // which will always result in rendering empty elements). + if (viewChild && !(viewChild.is('uiElement') || viewChild.is('rawElement'))) { + this._updateElementMappings(viewChild, actualDomChildren[deleteIndex]); + } + remove(expectedDomChildren[insertIndex]); + counter.equal++; + } + else { + counter[action]++; + } + } + } + } + /** + * Updates mappings of a given view element. + * + * @param viewElement The view element whose mappings will be updated. + * @param domElement The DOM element representing the given view element. + */ + _updateElementMappings(viewElement, domElement) { + // Remap 'DomConverter' bindings. + this.domConverter.unbindDomElement(domElement); + this.domConverter.bindElements(domElement, viewElement); + // View element may have children which needs to be updated, but are not marked, mark them to update. + this.markedChildren.add(viewElement); + // Because we replace new view element mapping with the existing one, the corresponding DOM element + // will not be rerendered. The new view element may have different attributes than the previous one. + // Since its corresponding DOM element will not be rerendered, new attributes will not be added + // to the DOM, so we need to mark it here to make sure its attributes gets updated. See #1427 for more + // detailed case study. + // Also there are cases where replaced element is removed from the view structure and then has + // its attributes changed or removed. In such cases the element will not be present in `markedAttributes` + // and also may be the same (`element.isSimilar()`) as the reused element not having its attributes updated. + // To prevent such situations we always mark reused element to have its attributes rerenderd (#1560). + this.markedAttributes.add(viewElement); + } + /** + * Gets the position of the inline filler based on the current selection. + * Here, we assume that we know that the filler is needed and + * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it is needed, + * it is somewhere at the selection position. + * + * Note: The filler position cannot be restored based on the filler's DOM text node, because + * when this method is called (before rendering), the bindings will often be broken. View-to-DOM + * bindings are only dependable after rendering. + */ + _getInlineFillerPosition() { + const firstPos = this.selection.getFirstPosition(); + if (firstPos.parent.is('$text')) { + return Position._createBefore(firstPos.parent); + } + else { + return firstPos; + } + } + /** + * Returns `true` if the selection has not left the inline filler's text node. + * If it is `true`, it means that the filler had been added for a reason and the selection did not + * leave the filler's text node. For example, the user can be in the middle of a composition so it should not be touched. + * + * @returns `true` if the inline filler and selection are in the same place. + */ + _isSelectionInInlineFiller() { + if (this.selection.rangeCount != 1 || !this.selection.isCollapsed) { + return false; + } + // Note, we can't check if selection's position equals position of the + // this._inlineFiller node, because of #663. We may not be able to calculate + // the filler's position in the view at this stage. + // Instead, we check it the other way – whether selection is anchored in + // that text node or next to it. + // Possible options are: + // "FILLER{}" + // "FILLERadded-text{}" + const selectionPosition = this.selection.getFirstPosition(); + const position = this.domConverter.viewPositionToDom(selectionPosition); + if (position && isText(position.parent) && startsWithFiller(position.parent)) { + return true; + } + return false; + } + /** + * Removes the inline filler. + */ + _removeInlineFiller() { + const domFillerNode = this._inlineFiller; + // Something weird happened and the stored node doesn't contain the filler's text. + if (!startsWithFiller(domFillerNode)) { + /** + * The inline filler node was lost. Most likely, something overwrote the filler text node + * in the DOM. + * + * @error view-renderer-filler-was-lost + */ + throw new ckeditorerror_CKEditorError('view-renderer-filler-was-lost', this); + } + if (isInlineFiller(domFillerNode)) { + domFillerNode.remove(); + } + else { + domFillerNode.data = domFillerNode.data.substr(INLINE_FILLER_LENGTH); + } + this._inlineFiller = null; + } + /** + * Checks if the inline {@link module:engine/view/filler filler} should be added. + * + * @returns `true` if the inline filler should be added. + */ + _needsInlineFillerAtSelection() { + if (this.selection.rangeCount != 1 || !this.selection.isCollapsed) { + return false; + } + const selectionPosition = this.selection.getFirstPosition(); + const selectionParent = selectionPosition.parent; + const selectionOffset = selectionPosition.offset; + // If there is no DOM root we do not care about fillers. + if (!this.domConverter.mapViewToDom(selectionParent.root)) { + return false; + } + if (!(selectionParent.is('element'))) { + return false; + } + // Prevent adding inline filler inside elements with contenteditable=false. + // https://github.com/ckeditor/ckeditor5-engine/issues/1170 + if (!isEditable(selectionParent)) { + return false; + } + // We have block filler, we do not need inline one. + if (selectionOffset === selectionParent.getFillerOffset()) { + return false; + } + const nodeBefore = selectionPosition.nodeBefore; + const nodeAfter = selectionPosition.nodeAfter; + if (nodeBefore instanceof text_Text || nodeAfter instanceof text_Text) { + return false; + } + // Do not use inline filler while typing outside inline elements on Android. + // The deleteContentBackward would remove part of the inline filler instead of removing last letter in a link. + if (src_env.isAndroid && (nodeBefore || nodeAfter)) { + return false; + } + return true; + } + /** + * Checks if text needs to be updated and possibly updates it. + * + * @param viewText View text to update. + * @param options.inlineFillerPosition The position where the inline filler should be rendered. + */ + _updateText(viewText, options) { + const domText = this.domConverter.findCorrespondingDomText(viewText); + const newDomText = this.domConverter.viewToDom(viewText); + let expectedText = newDomText.data; + const filler = options.inlineFillerPosition; + if (filler && filler.parent == viewText.parent && filler.offset == viewText.index) { + expectedText = INLINE_FILLER + expectedText; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.group( '%c[Renderer]%c Update text', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + updateTextNode(domText, expectedText); + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.groupEnd(); + // @if CK_DEBUG_TYPING // } + } + /** + * Checks if attribute list needs to be updated and possibly updates it. + * + * @param viewElement The view element to update. + */ + _updateAttrs(viewElement) { + const domElement = this.domConverter.mapViewToDom(viewElement); + if (!domElement) { + // If there is no `domElement` it means that 'viewElement' is outdated as its mapping was updated + // in 'this._updateChildrenMappings()'. There is no need to process it as new view element which + // replaced old 'viewElement' mapping was also added to 'this.markedAttributes' + // in 'this._updateChildrenMappings()' so it will be processed separately. + return; + } + const domAttrKeys = Array.from(domElement.attributes).map(attr => attr.name); + const viewAttrKeys = viewElement.getAttributeKeys(); + // Add or overwrite attributes. + for (const key of viewAttrKeys) { + this.domConverter.setDomElementAttribute(domElement, key, viewElement.getAttribute(key), viewElement); + } + // Remove from DOM attributes which do not exists in the view. + for (const key of domAttrKeys) { + // All other attributes not present in the DOM should be removed. + if (!viewElement.hasAttribute(key)) { + this.domConverter.removeDomElementAttribute(domElement, key); + } + } + } + /** + * Checks if elements child list needs to be updated and possibly updates it. + * + * Note that on Android, to reduce the risk of composition breaks, it tries to update data of an existing + * child text nodes instead of replacing them completely. + * + * @param viewElement View element to update. + * @param options.inlineFillerPosition The position where the inline filler should be rendered. + */ + _updateChildren(viewElement, options) { + const domElement = this.domConverter.mapViewToDom(viewElement); + if (!domElement) { + // If there is no `domElement` it means that it was already removed from DOM. + // There is no need to process it. It will be processed when re-inserted. + return; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.group( '%c[Renderer]%c Update children', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + // IME on Android inserts a new text node while typing after a link + // instead of updating an existing text node that follows the link. + // We must normalize those text nodes so the diff won't get confused. + // https://github.com/ckeditor/ckeditor5/issues/12574. + if (src_env.isAndroid) { + let previousDomNode = null; + for (const domNode of Array.from(domElement.childNodes)) { + if (previousDomNode && isText(previousDomNode) && isText(domNode)) { + domElement.normalize(); + break; + } + previousDomNode = domNode; + } + } + const inlineFillerPosition = options.inlineFillerPosition; + const actualDomChildren = domElement.childNodes; + const expectedDomChildren = Array.from(this.domConverter.viewChildrenToDom(viewElement, { bind: true })); + // Inline filler element has to be created as it is present in the DOM, but not in the view. It is required + // during diffing so text nodes could be compared correctly and also during rendering to maintain + // proper order and indexes while updating the DOM. + if (inlineFillerPosition && inlineFillerPosition.parent === viewElement) { + addInlineFiller(domElement.ownerDocument, expectedDomChildren, inlineFillerPosition.offset); + } + const diff = this._diffNodeLists(actualDomChildren, expectedDomChildren); + // We need to make sure that we update the existing text node and not replace it with another one. + // The composition and different "language" browser extensions are fragile to text node being completely replaced. + const actions = this._findUpdateActions(diff, actualDomChildren, expectedDomChildren, areTextNodes); + let i = 0; + const nodesToUnbind = new Set(); + // Handle deletions first. + // This is to prevent a situation where an element that already exists in `actualDomChildren` is inserted at a different + // index in `actualDomChildren`. Since `actualDomChildren` is a `NodeList`, this works like move, not like an insert, + // and it disrupts the whole algorithm. See https://github.com/ckeditor/ckeditor5/issues/6367. + // + // It doesn't matter in what order we remove or add nodes, as long as we remove and add correct nodes at correct indexes. + for (const action of actions) { + if (action === 'delete') { + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.info( '%c[Renderer]%c Remove node', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '', actualDomChildren[ i ] + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + nodesToUnbind.add(actualDomChildren[i]); + remove(actualDomChildren[i]); + } + else if (action === 'equal' || action === 'update') { + i++; + } + } + i = 0; + for (const action of actions) { + if (action === 'insert') { + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.info( '%c[Renderer]%c Insert node', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '', expectedDomChildren[ i ] + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + insertAt(domElement, i, expectedDomChildren[i]); + i++; + } + // Update the existing text node data. Note that replace action is generated only for Android for now. + else if (action === 'update') { + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.group( '%c[Renderer]%c Update text node', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + updateTextNode(actualDomChildren[i], expectedDomChildren[i].data); + i++; + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.groupEnd(); + // @if CK_DEBUG_TYPING // } + } + else if (action === 'equal') { + // Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125). + // Do it here (not in the loop above) because only after insertions the `i` index is correct. + this._markDescendantTextToSync(this.domConverter.domToView(expectedDomChildren[i])); + i++; + } + } + // Unbind removed nodes. When node does not have a parent it means that it was removed from DOM tree during + // comparison with the expected DOM. We don't need to check child nodes, because if child node was reinserted, + // it was moved to DOM tree out of the removed node. + for (const node of nodesToUnbind) { + if (!node.parentNode) { + this.domConverter.unbindDomElement(node); + } + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.groupEnd(); + // @if CK_DEBUG_TYPING // } + } + /** + * Shorthand for diffing two arrays or node lists of DOM nodes. + * + * @param actualDomChildren Actual DOM children + * @param expectedDomChildren Expected DOM children. + * @returns The list of actions based on the {@link module:utils/diff~diff} function. + */ + _diffNodeLists(actualDomChildren, expectedDomChildren) { + actualDomChildren = filterOutFakeSelectionContainer(actualDomChildren, this._fakeSelectionContainer); + return diff(actualDomChildren, expectedDomChildren, sameNodes.bind(null, this.domConverter)); + } + /** + * Finds DOM nodes that were replaced with the similar nodes (same tag name) in the view. All nodes are compared + * within one `insert`/`delete` action group, for example: + * + * ``` + * Actual DOM:

      FooBarBazBax

      + * Expected DOM:

      Bar123Baz456

      + * Input actions: [ insert, insert, delete, delete, equal, insert, delete ] + * Output actions: [ insert, replace, delete, equal, replace ] + * ``` + * + * @param actions Actions array which is a result of the {@link module:utils/diff~diff} function. + * @param actualDom Actual DOM children + * @param expectedDom Expected DOM children. + * @param comparator A comparator function that should return `true` if the given node should be reused + * (either by the update of a text node data or an element children list for similar elements). + * @returns Actions array modified with the `update` actions. + */ + _findUpdateActions(actions, actualDom, expectedDom, comparator) { + // If there is no both 'insert' and 'delete' actions, no need to check for replaced elements. + if (actions.indexOf('insert') === -1 || actions.indexOf('delete') === -1) { + return actions; + } + let newActions = []; + let actualSlice = []; + let expectedSlice = []; + const counter = { equal: 0, insert: 0, delete: 0 }; + for (const action of actions) { + if (action === 'insert') { + expectedSlice.push(expectedDom[counter.equal + counter.insert]); + } + else if (action === 'delete') { + actualSlice.push(actualDom[counter.equal + counter.delete]); + } + else { // equal + newActions = newActions.concat(diff(actualSlice, expectedSlice, comparator) + .map(action => action === 'equal' ? 'update' : action)); + newActions.push('equal'); + // Reset stored elements on 'equal'. + actualSlice = []; + expectedSlice = []; + } + counter[action]++; + } + return newActions.concat(diff(actualSlice, expectedSlice, comparator) + .map(action => action === 'equal' ? 'update' : action)); + } + /** + * Marks text nodes to be synchronized. + * + * If a text node is passed, it will be marked. If an element is passed, all descendant text nodes inside it will be marked. + * + * @param viewNode View node to sync. + */ + _markDescendantTextToSync(viewNode) { + if (!viewNode) { + return; + } + if (viewNode.is('$text')) { + this.markedTexts.add(viewNode); + } + else if (viewNode.is('element')) { + for (const child of viewNode.getChildren()) { + this._markDescendantTextToSync(child); + } + } + } + /** + * Checks if the selection needs to be updated and possibly updates it. + */ + _updateSelection() { + // Block updating DOM selection in (non-Android) Blink while the user is selecting to prevent accidental selection collapsing. + // Note: Structural changes in DOM must trigger selection rendering, though. Nodes the selection was anchored + // to, may disappear in DOM which would break the selection (e.g. in real-time collaboration scenarios). + // https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723 + if (src_env.isBlink && !src_env.isAndroid && this.isSelecting && !this.markedChildren.size) { + return; + } + // If there is no selection - remove DOM and fake selections. + if (this.selection.rangeCount === 0) { + this._removeDomSelection(); + this._removeFakeSelection(); + return; + } + const domRoot = this.domConverter.mapViewToDom(this.selection.editableElement); + // Do nothing if there is no focus, or there is no DOM element corresponding to selection's editable element. + if (!this.isFocused || !domRoot) { + return; + } + // Render fake selection - create the fake selection container (if needed) and move DOM selection to it. + if (this.selection.isFake) { + this._updateFakeSelection(domRoot); + } + // There was a fake selection so remove it and update the DOM selection. + // This is especially important on Android because otherwise IME will try to compose over the fake selection container. + else if (this._fakeSelectionContainer && this._fakeSelectionContainer.isConnected) { + this._removeFakeSelection(); + this._updateDomSelection(domRoot); + } + // Update the DOM selection in case of a plain selection change (no fake selection is involved). + // On non-Android the whole rendering is disabled in composition mode (including DOM selection update), + // but updating DOM selection should be also disabled on Android if in the middle of the composition + // (to not interrupt it). + else if (!(this.isComposing && src_env.isAndroid)) { + this._updateDomSelection(domRoot); + } + } + /** + * Updates the fake selection. + * + * @param domRoot A valid DOM root where the fake selection container should be added. + */ + _updateFakeSelection(domRoot) { + const domDocument = domRoot.ownerDocument; + if (!this._fakeSelectionContainer) { + this._fakeSelectionContainer = createFakeSelectionContainer(domDocument); + } + const container = this._fakeSelectionContainer; + // Bind fake selection container with the current selection *position*. + this.domConverter.bindFakeSelection(container, this.selection); + if (!this._fakeSelectionNeedsUpdate(domRoot)) { + return; + } + if (!container.parentElement || container.parentElement != domRoot) { + domRoot.appendChild(container); + } + container.textContent = this.selection.fakeSelectionLabel || '\u00A0'; + const domSelection = domDocument.getSelection(); + const domRange = domDocument.createRange(); + domSelection.removeAllRanges(); + domRange.selectNodeContents(container); + domSelection.addRange(domRange); + } + /** + * Updates the DOM selection. + * + * @param domRoot A valid DOM root where the DOM selection should be rendered. + */ + _updateDomSelection(domRoot) { + const domSelection = domRoot.ownerDocument.defaultView.getSelection(); + // Let's check whether DOM selection needs updating at all. + if (!this._domSelectionNeedsUpdate(domSelection)) { + return; + } + // Multi-range selection is not available in most browsers, and, at least in Chrome, trying to + // set such selection, that is not continuous, throws an error. Because of that, we will just use anchor + // and focus of view selection. + // Since we are not supporting multi-range selection, we also do not need to check if proper editable is + // selected. If there is any editable selected, it is okay (editable is taken from selection anchor). + const anchor = this.domConverter.viewPositionToDom(this.selection.anchor); + const focus = this.domConverter.viewPositionToDom(this.selection.focus); + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.info( '%c[Renderer]%c Update DOM selection:', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '', anchor, focus + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + domSelection.collapse(anchor.parent, anchor.offset); + domSelection.extend(focus.parent, focus.offset); + // Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439). + if (src_env.isGecko) { + fixGeckoSelectionAfterBr(focus, domSelection); + } + } + /** + * Checks whether a given DOM selection needs to be updated. + * + * @param domSelection The DOM selection to check. + */ + _domSelectionNeedsUpdate(domSelection) { + if (!this.domConverter.isDomSelectionCorrect(domSelection)) { + // Current DOM selection is in incorrect position. We need to update it. + return true; + } + const oldViewSelection = domSelection && this.domConverter.domSelectionToView(domSelection); + if (oldViewSelection && this.selection.isEqual(oldViewSelection)) { + return false; + } + // If selection is not collapsed, it does not need to be updated if it is similar. + if (!this.selection.isCollapsed && this.selection.isSimilar(oldViewSelection)) { + // Selection did not changed and is correct, do not update. + return false; + } + // Selections are not similar. + return true; + } + /** + * Checks whether the fake selection needs to be updated. + * + * @param domRoot A valid DOM root where a new fake selection container should be added. + */ + _fakeSelectionNeedsUpdate(domRoot) { + const container = this._fakeSelectionContainer; + const domSelection = domRoot.ownerDocument.getSelection(); + // Fake selection needs to be updated if there's no fake selection container, or the container currently sits + // in a different root. + if (!container || container.parentElement !== domRoot) { + return true; + } + // Make sure that the selection actually is within the fake selection. + if (domSelection.anchorNode !== container && !container.contains(domSelection.anchorNode)) { + return true; + } + return container.textContent !== this.selection.fakeSelectionLabel; + } + /** + * Removes the DOM selection. + */ + _removeDomSelection() { + for (const doc of this.domDocuments) { + const domSelection = doc.getSelection(); + if (domSelection.rangeCount) { + const activeDomElement = doc.activeElement; + const viewElement = this.domConverter.mapDomToView(activeDomElement); + if (activeDomElement && viewElement) { + domSelection.removeAllRanges(); + } + } + } + } + /** + * Removes the fake selection. + */ + _removeFakeSelection() { + const container = this._fakeSelectionContainer; + if (container) { + container.remove(); + } + } + /** + * Checks if focus needs to be updated and possibly updates it. + */ + _updateFocus() { + if (this.isFocused) { + const editable = this.selection.editableElement; + if (editable) { + this.domConverter.focus(editable); + } + } + } +} +/** + * Checks if provided element is editable. + */ +function isEditable(element) { + if (element.getAttribute('contenteditable') == 'false') { + return false; + } + const parent = element.findAncestor(element => element.hasAttribute('contenteditable')); + return !parent || parent.getAttribute('contenteditable') == 'true'; +} +/** + * Adds inline filler at a given position. + * + * The position can be given as an array of DOM nodes and an offset in that array, + * or a DOM parent element and an offset in that element. + * + * @returns The DOM text node that contains an inline filler. + */ +function addInlineFiller(domDocument, domParentOrArray, offset) { + const childNodes = domParentOrArray instanceof Array ? domParentOrArray : domParentOrArray.childNodes; + const nodeAfterFiller = childNodes[offset]; + if (isText(nodeAfterFiller)) { + nodeAfterFiller.data = INLINE_FILLER + nodeAfterFiller.data; + return nodeAfterFiller; + } + else { + const fillerNode = domDocument.createTextNode(INLINE_FILLER); + if (Array.isArray(domParentOrArray)) { + childNodes.splice(offset, 0, fillerNode); + } + else { + insertAt(domParentOrArray, offset, fillerNode); + } + return fillerNode; + } +} +/** + * Whether two DOM nodes should be considered as similar. + * Nodes are considered similar if they have the same tag name. + */ +function areSimilarElements(node1, node2) { + return isNode(node1) && isNode(node2) && + !isText(node1) && !isText(node2) && + !isComment(node1) && !isComment(node2) && + node1.tagName.toLowerCase() === node2.tagName.toLowerCase(); +} +/** + * Whether two DOM nodes are text nodes. + */ +function areTextNodes(node1, node2) { + return isNode(node1) && isNode(node2) && + isText(node1) && isText(node2); +} +/** + * Whether two dom nodes should be considered as the same. + * Two nodes which are considered the same are: + * + * * Text nodes with the same text. + * * Element nodes represented by the same object. + * * Two block filler elements. + * + * @param blockFillerMode Block filler mode, see {@link module:engine/view/domconverter~DomConverter#blockFillerMode}. + */ +function sameNodes(domConverter, actualDomChild, expectedDomChild) { + // Elements. + if (actualDomChild === expectedDomChild) { + return true; + } + // Texts. + else if (isText(actualDomChild) && isText(expectedDomChild)) { + return actualDomChild.data === expectedDomChild.data; + } + // Block fillers. + else if (domConverter.isBlockFiller(actualDomChild) && + domConverter.isBlockFiller(expectedDomChild)) { + return true; + } + // Not matching types. + return false; +} +/** + * The following is a Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439). + * When the native DOM selection is at the end of the block and preceded by
      e.g. + * + * ```html + *

      foo
      []

      + * ``` + * + * which happens a lot when using the soft line break, the browser fails to (visually) move the + * caret to the new line. A quick fix is as simple as force–refreshing the selection with the same range. + */ +function fixGeckoSelectionAfterBr(focus, domSelection) { + const parent = focus.parent; + // This fix works only when the focus point is at the very end of an element. + // There is no point in running it in cases unrelated to the browser bug. + if (parent.nodeType != Node.ELEMENT_NODE || focus.offset != parent.childNodes.length - 1) { + return; + } + const childAtOffset = parent.childNodes[focus.offset]; + // To stay on the safe side, the fix being as specific as possible, it targets only the + // selection which is at the very end of the element and preceded by
      . + if (childAtOffset && childAtOffset.tagName == 'BR') { + domSelection.addRange(domSelection.getRangeAt(0)); + } +} +function filterOutFakeSelectionContainer(domChildList, fakeSelectionContainer) { + const childList = Array.from(domChildList); + if (childList.length == 0 || !fakeSelectionContainer) { + return childList; + } + const last = childList[childList.length - 1]; + if (last == fakeSelectionContainer) { + childList.pop(); + } + return childList; +} +/** + * Creates a fake selection container for a given document. + */ +function createFakeSelectionContainer(domDocument) { + const container = domDocument.createElement('div'); + container.className = 'ck-fake-selection-container'; + Object.assign(container.style, { + position: 'fixed', + top: 0, + left: '-9999px', + // See https://github.com/ckeditor/ckeditor5/issues/752. + width: '42px' + }); + // Fill it with a text node so we can update it later. + container.textContent = '\u00A0'; + return container; +} +/** + * Checks if text needs to be updated and possibly updates it by removing and inserting only parts + * of the data from the existing text node to reduce impact on the IME composition. + * + * @param domText DOM text node to update. + * @param expectedText The expected data of a text node. + */ +function updateTextNode(domText, expectedText) { + const actualText = domText.data; + if (actualText == expectedText) { + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.info( '%c[Renderer]%c Text node does not need update:', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '', + // @if CK_DEBUG_TYPING // `"${ domText.data }" (${ domText.data.length })` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + return; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.info( '%c[Renderer]%c Update text node:', + // @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', '', + // @if CK_DEBUG_TYPING // `"${ domText.data }" (${ domText.data.length }) -> "${ expectedText }" (${ expectedText.length })` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + const actions = fastDiff(actualText, expectedText); + for (const action of actions) { + if (action.type === 'insert') { + domText.insertData(action.index, action.values.join('')); + } + else { // 'delete' + domText.deleteData(action.index, action.howMany); + } + } +} + +;// CONCATENATED MODULE: ./node_modules/@ckeditor/ckeditor5-engine/src/view/domconverter.js +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module engine/view/domconverter + */ +/* globals Node, NodeFilter, DOMParser, Text */ + + + + + + + + + + + +const BR_FILLER_REF = BR_FILLER(dom_global.document); // eslint-disable-line new-cap +const NBSP_FILLER_REF = NBSP_FILLER(dom_global.document); // eslint-disable-line new-cap +const MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER(dom_global.document); // eslint-disable-line new-cap +const UNSAFE_ATTRIBUTE_NAME_PREFIX = 'data-ck-unsafe-attribute-'; +const UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE = 'data-ck-unsafe-element'; +/** + * `DomConverter` is a set of tools to do transformations between DOM nodes and view nodes. It also handles + * {@link module:engine/view/domconverter~DomConverter#bindElements bindings} between these nodes. + * + * An instance of the DOM converter is available under + * {@link module:engine/view/view~View#domConverter `editor.editing.view.domConverter`}. + * + * The DOM converter does not check which nodes should be rendered (use {@link module:engine/view/renderer~Renderer}), does not keep the + * state of a tree nor keeps the synchronization between the tree view and the DOM tree (use {@link module:engine/view/document~Document}). + * + * The DOM converter keeps DOM elements to view element bindings, so when the converter gets destroyed, the bindings are lost. + * Two converters will keep separate binding maps, so one tree view can be bound with two DOM trees. + */ +class DomConverter { + /** + * Creates a DOM converter. + * + * @param document The view document instance. + * @param options An object with configuration options. + * @param options.blockFillerMode The type of the block filler to use. + * Default value depends on the options.renderingMode: + * 'nbsp' when options.renderingMode == 'data', + * 'br' when options.renderingMode == 'editing'. + * @param options.renderingMode Whether to leave the View-to-DOM conversion result unchanged + * or improve editing experience by filtering out interactive data. + */ + constructor(document, { blockFillerMode, renderingMode = 'editing' } = {}) { + /** + * The DOM-to-view mapping. + */ + this._domToViewMapping = new WeakMap(); + /** + * The view-to-DOM mapping. + */ + this._viewToDomMapping = new WeakMap(); + /** + * Holds the mapping between fake selection containers and corresponding view selections. + */ + this._fakeSelectionMapping = new WeakMap(); + /** + * Matcher for view elements whose content should be treated as raw data + * and not processed during the conversion from DOM nodes to view elements. + */ + this._rawContentElementMatcher = new Matcher(); + /** + * A set of encountered raw content DOM nodes. It is used for preventing left trimming of the following text node. + */ + this._encounteredRawContentDomNodes = new WeakSet(); + this.document = document; + this.renderingMode = renderingMode; + this.blockFillerMode = blockFillerMode || (renderingMode === 'editing' ? 'br' : 'nbsp'); + this.preElements = ['pre']; + this.blockElements = [ + 'address', 'article', 'aside', 'blockquote', 'caption', 'center', 'dd', 'details', 'dir', 'div', + 'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', + 'hgroup', 'legend', 'li', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'tbody', + 'td', 'tfoot', 'th', 'thead', 'tr', 'ul' + ]; + this.inlineObjectElements = [ + 'object', 'iframe', 'input', 'button', 'textarea', 'select', 'option', 'video', 'embed', 'audio', 'img', 'canvas' + ]; + this.unsafeElements = ['script', 'style']; + this._domDocument = this.renderingMode === 'editing' ? dom_global.document : dom_global.document.implementation.createHTMLDocument(''); + } + /** + * Binds a given DOM element that represents fake selection to a **position** of a + * {@link module:engine/view/documentselection~DocumentSelection document selection}. + * Document selection copy is stored and can be retrieved by the + * {@link module:engine/view/domconverter~DomConverter#fakeSelectionToView} method. + */ + bindFakeSelection(domElement, viewDocumentSelection) { + this._fakeSelectionMapping.set(domElement, new Selection(viewDocumentSelection)); + } + /** + * Returns a {@link module:engine/view/selection~Selection view selection} instance corresponding to a given + * DOM element that represents fake selection. Returns `undefined` if binding to the given DOM element does not exist. + */ + fakeSelectionToView(domElement) { + return this._fakeSelectionMapping.get(domElement); + } + /** + * Binds DOM and view elements, so it will be possible to get corresponding elements using + * {@link module:engine/view/domconverter~DomConverter#mapDomToView} and + * {@link module:engine/view/domconverter~DomConverter#mapViewToDom}. + * + * @param domElement The DOM element to bind. + * @param viewElement The view element to bind. + */ + bindElements(domElement, viewElement) { + this._domToViewMapping.set(domElement, viewElement); + this._viewToDomMapping.set(viewElement, domElement); + } + /** + * Unbinds a given DOM element from the view element it was bound to. Unbinding is deep, meaning that all children of + * the DOM element will be unbound too. + * + * @param domElement The DOM element to unbind. + */ + unbindDomElement(domElement) { + const viewElement = this._domToViewMapping.get(domElement); + if (viewElement) { + this._domToViewMapping.delete(domElement); + this._viewToDomMapping.delete(viewElement); + for (const child of Array.from(domElement.children)) { + this.unbindDomElement(child); + } + } + } + /** + * Binds DOM and view document fragments, so it will be possible to get corresponding document fragments using + * {@link module:engine/view/domconverter~DomConverter#mapDomToView} and + * {@link module:engine/view/domconverter~DomConverter#mapViewToDom}. + * + * @param domFragment The DOM document fragment to bind. + * @param viewFragment The view document fragment to bind. + */ + bindDocumentFragments(domFragment, viewFragment) { + this._domToViewMapping.set(domFragment, viewFragment); + this._viewToDomMapping.set(viewFragment, domFragment); + } + /** + * Decides whether a given pair of attribute key and value should be passed further down the pipeline. + * + * @param elementName Element name in lower case. + */ + shouldRenderAttribute(attributeKey, attributeValue, elementName) { + if (this.renderingMode === 'data') { + return true; + } + attributeKey = attributeKey.toLowerCase(); + if (attributeKey.startsWith('on')) { + return false; + } + if (attributeKey === 'srcdoc' && + attributeValue.match(/\bon\S+\s*=|javascript:|<\s*\/*script/i)) { + return false; + } + if (elementName === 'img' && + (attributeKey === 'src' || attributeKey === 'srcset')) { + return true; + } + if (elementName === 'source' && attributeKey === 'srcset') { + return true; + } + if (attributeValue.match(/^\s*(javascript:|data:(image\/svg|text\/x?html))/i)) { + return false; + } + return true; + } + /** + * Set `domElement`'s content using provided `html` argument. Apply necessary filtering for the editing pipeline. + * + * @param domElement DOM element that should have `html` set as its content. + * @param html Textual representation of the HTML that will be set on `domElement`. + */ + setContentOf(domElement, html) { + // For data pipeline we pass the HTML as-is. + if (this.renderingMode === 'data') { + domElement.innerHTML = html; + return; + } + const document = new DOMParser().parseFromString(html, 'text/html'); + const fragment = document.createDocumentFragment(); + const bodyChildNodes = document.body.childNodes; + while (bodyChildNodes.length > 0) { + fragment.appendChild(bodyChildNodes[0]); + } + const treeWalker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT); + const nodes = []; + let currentNode; + // eslint-disable-next-line no-cond-assign + while (currentNode = treeWalker.nextNode()) { + nodes.push(currentNode); + } + for (const currentNode of nodes) { + // Go through nodes to remove those that are prohibited in editing pipeline. + for (const attributeName of currentNode.getAttributeNames()) { + this.setDomElementAttribute(currentNode, attributeName, currentNode.getAttribute(attributeName)); + } + const elementName = currentNode.tagName.toLowerCase(); + // There are certain nodes, that should be renamed to in editing pipeline. + if (this._shouldRenameElement(elementName)) { + _logUnsafeElement(elementName); + currentNode.replaceWith(this._createReplacementDomElement(elementName, currentNode)); + } + } + // Empty the target element. + while (domElement.firstChild) { + domElement.firstChild.remove(); + } + domElement.append(fragment); + } + /** + * Converts the view to the DOM. For all text nodes, not bound elements and document fragments new items will + * be created. For bound elements and document fragments the method will return corresponding items. + * + * @param viewNode View node or document fragment to transform. + * @param options Conversion options. + * @param options.bind Determines whether new elements will be bound. + * @param options.withChildren If `false`, node's and document fragment's children will not be converted. + * @returns Converted node or DocumentFragment. + */ + viewToDom(viewNode, options = {}) { + if (viewNode.is('$text')) { + const textData = this._processDataFromViewText(viewNode); + return this._domDocument.createTextNode(textData); + } + else { + if (this.mapViewToDom(viewNode)) { + return this.mapViewToDom(viewNode); + } + let domElement; + if (viewNode.is('documentFragment')) { + // Create DOM document fragment. + domElement = this._domDocument.createDocumentFragment(); + if (options.bind) { + this.bindDocumentFragments(domElement, viewNode); + } + } + else if (viewNode.is('uiElement')) { + if (viewNode.name === '$comment') { + domElement = this._domDocument.createComment(viewNode.getCustomProperty('$rawContent')); + } + else { + // UIElement has its own render() method (see #799). + domElement = viewNode.render(this._domDocument, this); + } + if (options.bind) { + this.bindElements(domElement, viewNode); + } + return domElement; + } + else { + // Create DOM element. + if (this._shouldRenameElement(viewNode.name)) { + _logUnsafeElement(viewNode.name); + domElement = this._createReplacementDomElement(viewNode.name); + } + else if (viewNode.hasAttribute('xmlns')) { + domElement = this._domDocument.createElementNS(viewNode.getAttribute('xmlns'), viewNode.name); + } + else { + domElement = this._domDocument.createElement(viewNode.name); + } + // RawElement take care of their children in RawElement#render() method which can be customized + // (see https://github.com/ckeditor/ckeditor5/issues/4469). + if (viewNode.is('rawElement')) { + viewNode.render(domElement, this); + } + if (options.bind) { + this.bindElements(domElement, viewNode); + } + // Copy element's attributes. + for (const key of viewNode.getAttributeKeys()) { + this.setDomElementAttribute(domElement, key, viewNode.getAttribute(key), viewNode); + } + } + if (options.withChildren !== false) { + for (const child of this.viewChildrenToDom(viewNode, options)) { + domElement.appendChild(child); + } + } + return domElement; + } + } + /** + * Sets the attribute on a DOM element. + * + * **Note**: To remove the attribute, use {@link #removeDomElementAttribute}. + * + * @param domElement The DOM element the attribute should be set on. + * @param key The name of the attribute. + * @param value The value of the attribute. + * @param relatedViewElement The view element related to the `domElement` (if there is any). + * It helps decide whether the attribute set is unsafe. For instance, view elements created via the + * {@link module:engine/view/downcastwriter~DowncastWriter} methods can allow certain attributes that would normally be filtered out. + */ + setDomElementAttribute(domElement, key, value, relatedViewElement) { + const shouldRenderAttribute = this.shouldRenderAttribute(key, value, domElement.tagName.toLowerCase()) || + relatedViewElement && relatedViewElement.shouldRenderUnsafeAttribute(key); + if (!shouldRenderAttribute) { + logWarning('domconverter-unsafe-attribute-detected', { domElement, key, value }); + } + if (!isValidAttributeName(key)) { + /** + * Invalid attribute name was ignored during rendering. + * + * @error domconverter-invalid-attribute-detected + */ + logWarning('domconverter-invalid-attribute-detected', { domElement, key, value }); + return; + } + // The old value was safe but the new value is unsafe. + if (domElement.hasAttribute(key) && !shouldRenderAttribute) { + domElement.removeAttribute(key); + } + // The old value was unsafe (but prefixed) but the new value will be safe (will be unprefixed). + else if (domElement.hasAttribute(UNSAFE_ATTRIBUTE_NAME_PREFIX + key) && shouldRenderAttribute) { + domElement.removeAttribute(UNSAFE_ATTRIBUTE_NAME_PREFIX + key); + } + // If the attribute should not be rendered, rename it (instead of removing) to give developers some idea of what + // is going on (https://github.com/ckeditor/ckeditor5/issues/10801). + domElement.setAttribute(shouldRenderAttribute ? key : UNSAFE_ATTRIBUTE_NAME_PREFIX + key, value); + } + /** + * Removes an attribute from a DOM element. + * + * **Note**: To set the attribute, use {@link #setDomElementAttribute}. + * + * @param domElement The DOM element the attribute should be removed from. + * @param key The name of the attribute. + */ + removeDomElementAttribute(domElement, key) { + // See #_createReplacementDomElement() to learn what this is. + if (key == UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE) { + return; + } + domElement.removeAttribute(key); + // See setDomElementAttribute() to learn what this is. + domElement.removeAttribute(UNSAFE_ATTRIBUTE_NAME_PREFIX + key); + } + /** + * Converts children of the view element to DOM using the + * {@link module:engine/view/domconverter~DomConverter#viewToDom} method. + * Additionally, this method adds block {@link module:engine/view/filler filler} to the list of children, if needed. + * + * @param viewElement Parent view element. + * @param options See {@link module:engine/view/domconverter~DomConverter#viewToDom} options parameter. + * @returns DOM nodes. + */ + *viewChildrenToDom(viewElement, options = {}) { + const fillerPositionOffset = viewElement.getFillerOffset && viewElement.getFillerOffset(); + let offset = 0; + for (const childView of viewElement.getChildren()) { + if (fillerPositionOffset === offset) { + yield this._getBlockFiller(); + } + const transparentRendering = childView.is('element') && + !!childView.getCustomProperty('dataPipeline:transparentRendering') && + !first_first(childView.getAttributes()); + if (transparentRendering && this.renderingMode == 'data') { + yield* this.viewChildrenToDom(childView, options); + } + else { + if (transparentRendering) { + /** + * The `dataPipeline:transparentRendering` flag is supported only in the data pipeline. + * + * @error domconverter-transparent-rendering-unsupported-in-editing-pipeline + */ + logWarning('domconverter-transparent-rendering-unsupported-in-editing-pipeline', { viewElement: childView }); + } + yield this.viewToDom(childView, options); + } + offset++; + } + if (fillerPositionOffset === offset) { + yield this._getBlockFiller(); + } + } + /** + * Converts view {@link module:engine/view/range~Range} to DOM range. + * Inline and block {@link module:engine/view/filler fillers} are handled during the conversion. + * + * @param viewRange View range. + * @returns DOM range. + */ + viewRangeToDom(viewRange) { + const domStart = this.viewPositionToDom(viewRange.start); + const domEnd = this.viewPositionToDom(viewRange.end); + const domRange = this._domDocument.createRange(); + domRange.setStart(domStart.parent, domStart.offset); + domRange.setEnd(domEnd.parent, domEnd.offset); + return domRange; + } + /** + * Converts view {@link module:engine/view/position~Position} to DOM parent and offset. + * + * Inline and block {@link module:engine/view/filler fillers} are handled during the conversion. + * If the converted position is directly before inline filler it is moved inside the filler. + * + * @param viewPosition View position. + * @returns DOM position or `null` if view position could not be converted to DOM. + * DOM position has two properties: + * * `parent` - DOM position parent. + * * `offset` - DOM position offset. + */ + viewPositionToDom(viewPosition) { + const viewParent = viewPosition.parent; + if (viewParent.is('$text')) { + const domParent = this.findCorrespondingDomText(viewParent); + if (!domParent) { + // Position is in a view text node that has not been rendered to DOM yet. + return null; + } + let offset = viewPosition.offset; + if (startsWithFiller(domParent)) { + offset += INLINE_FILLER_LENGTH; + } + return { parent: domParent, offset }; + } + else { + // viewParent is instance of ViewElement. + let domParent, domBefore, domAfter; + if (viewPosition.offset === 0) { + domParent = this.mapViewToDom(viewParent); + if (!domParent) { + // Position is in a view element that has not been rendered to DOM yet. + return null; + } + domAfter = domParent.childNodes[0]; + } + else { + const nodeBefore = viewPosition.nodeBefore; + domBefore = nodeBefore.is('$text') ? + this.findCorrespondingDomText(nodeBefore) : + this.mapViewToDom(nodeBefore); + if (!domBefore) { + // Position is after a view element that has not been rendered to DOM yet. + return null; + } + domParent = domBefore.parentNode; + domAfter = domBefore.nextSibling; + } + // If there is an inline filler at position return position inside the filler. We should never return + // the position before the inline filler. + if (isText(domAfter) && startsWithFiller(domAfter)) { + return { parent: domAfter, offset: INLINE_FILLER_LENGTH }; + } + const offset = domBefore ? indexOf(domBefore) + 1 : 0; + return { parent: domParent, offset }; + } + } + /** + * Converts DOM to view. For all text nodes, not bound elements and document fragments new items will + * be created. For bound elements and document fragments function will return corresponding items. For + * {@link module:engine/view/filler fillers} `null` will be returned. + * For all DOM elements rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned. + * + * @param domNode DOM node or document fragment to transform. + * @param options Conversion options. + * @param options.bind Determines whether new elements will be bound. False by default. + * @param options.withChildren If `true`, node's and document fragment's children will be converted too. True by default. + * @param options.keepOriginalCase If `false`, node's tag name will be converted to lower case. False by default. + * @param options.skipComments If `false`, comment nodes will be converted to `$comment` + * {@link module:engine/view/uielement~UIElement view UI elements}. False by default. + * @returns Converted node or document fragment or `null` if DOM node is a {@link module:engine/view/filler filler} + * or the given node is an empty text node. + */ + domToView(domNode, options = {}) { + if (this.isBlockFiller(domNode)) { + return null; + } + // When node is inside a UIElement or a RawElement return that parent as it's view representation. + const hostElement = this.getHostViewElement(domNode); + if (hostElement) { + return hostElement; + } + if (isComment(domNode) && options.skipComments) { + return null; + } + if (isText(domNode)) { + if (isInlineFiller(domNode)) { + return null; + } + else { + const textData = this._processDataFromDomText(domNode); + return textData === '' ? null : new text_Text(this.document, textData); + } + } + else { + if (this.mapDomToView(domNode)) { + return this.mapDomToView(domNode); + } + let viewElement; + if (this.isDocumentFragment(domNode)) { + // Create view document fragment. + viewElement = new DocumentFragment(this.document); + if (options.bind) { + this.bindDocumentFragments(domNode, viewElement); + } + } + else { + // Create view element. + viewElement = this._createViewElement(domNode, options); + if (options.bind) { + this.bindElements(domNode, viewElement); + } + // Copy element's attributes. + const attrs = domNode.attributes; + if (attrs) { + for (let l = attrs.length, i = 0; i < l; i++) { + viewElement._setAttribute(attrs[i].name, attrs[i].value); + } + } + // Treat this element's content as a raw data if it was registered as such. + // Comment node is also treated as an element with raw data. + if (this._isViewElementWithRawContent(viewElement, options) || isComment(domNode)) { + const rawContent = isComment(domNode) ? domNode.data : domNode.innerHTML; + viewElement._setCustomProperty('$rawContent', rawContent); + // Store a DOM node to prevent left trimming of the following text node. + this._encounteredRawContentDomNodes.add(domNode); + return viewElement; + } + } + if (options.withChildren !== false) { + for (const child of this.domChildrenToView(domNode, options)) { + viewElement._appendChild(child); + } + } + return viewElement; + } + } + /** + * Converts children of the DOM element to view nodes using + * the {@link module:engine/view/domconverter~DomConverter#domToView} method. + * Additionally this method omits block {@link module:engine/view/filler filler}, if it exists in the DOM parent. + * + * @param domElement Parent DOM element. + * @param options See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter. + * @returns View nodes. + */ + *domChildrenToView(domElement, options) { + for (let i = 0; i < domElement.childNodes.length; i++) { + const domChild = domElement.childNodes[i]; + const viewChild = this.domToView(domChild, options); + if (viewChild !== null) { + yield viewChild; + } + } + } + /** + * Converts DOM selection to view {@link module:engine/view/selection~Selection}. + * Ranges which cannot be converted will be omitted. + * + * @param domSelection DOM selection. + * @returns View selection. + */ + domSelectionToView(domSelection) { + // DOM selection might be placed in fake selection container. + // If container contains fake selection - return corresponding view selection. + if (domSelection.rangeCount === 1) { + let container = domSelection.getRangeAt(0).startContainer; + // The DOM selection might be moved to the text node inside the fake selection container. + if (isText(container)) { + container = container.parentNode; + } + const viewSelection = this.fakeSelectionToView(container); + if (viewSelection) { + return viewSelection; + } + } + const isBackward = this.isDomSelectionBackward(domSelection); + const viewRanges = []; + for (let i = 0; i < domSelection.rangeCount; i++) { + // DOM Range have correct start and end, no matter what is the DOM Selection direction. So we don't have to fix anything. + const domRange = domSelection.getRangeAt(i); + const viewRange = this.domRangeToView(domRange); + if (viewRange) { + viewRanges.push(viewRange); + } + } + return new Selection(viewRanges, { backward: isBackward }); + } + /** + * Converts DOM Range to view {@link module:engine/view/range~Range}. + * If the start or end position can not be converted `null` is returned. + * + * @param domRange DOM range. + * @returns View range. + */ + domRangeToView(domRange) { + const viewStart = this.domPositionToView(domRange.startContainer, domRange.startOffset); + const viewEnd = this.domPositionToView(domRange.endContainer, domRange.endOffset); + if (viewStart && viewEnd) { + return new Range(viewStart, viewEnd); + } + return null; + } + /** + * Converts DOM parent and offset to view {@link module:engine/view/position~Position}. + * + * If the position is inside a {@link module:engine/view/filler filler} which has no corresponding view node, + * position of the filler will be converted and returned. + * + * If the position is inside DOM element rendered by {@link module:engine/view/uielement~UIElement} + * that position will be converted to view position before that UIElement. + * + * If structures are too different and it is not possible to find corresponding position then `null` will be returned. + * + * @param domParent DOM position parent. + * @param domOffset DOM position offset. You can skip it when converting the inline filler node. + * @returns View position. + */ + domPositionToView(domParent, domOffset = 0) { + if (this.isBlockFiller(domParent)) { + return this.domPositionToView(domParent.parentNode, indexOf(domParent)); + } + // If position is somewhere inside UIElement or a RawElement - return position before that element. + const viewElement = this.mapDomToView(domParent); + if (viewElement && (viewElement.is('uiElement') || viewElement.is('rawElement'))) { + return Position._createBefore(viewElement); + } + if (isText(domParent)) { + if (isInlineFiller(domParent)) { + return this.domPositionToView(domParent.parentNode, indexOf(domParent)); + } + const viewParent = this.findCorrespondingViewText(domParent); + let offset = domOffset; + if (!viewParent) { + return null; + } + if (startsWithFiller(domParent)) { + offset -= INLINE_FILLER_LENGTH; + offset = offset < 0 ? 0 : offset; + } + return new Position(viewParent, offset); + } + // domParent instanceof HTMLElement. + else { + if (domOffset === 0) { + const viewParent = this.mapDomToView(domParent); + if (viewParent) { + return new Position(viewParent, 0); + } + } + else { + const domBefore = domParent.childNodes[domOffset - 1]; + // Jump over an inline filler (and also on Firefox jump over a block filler while pressing backspace in an empty paragraph). + if (isText(domBefore) && isInlineFiller(domBefore) || domBefore && this.isBlockFiller(domBefore)) { + return this.domPositionToView(domBefore.parentNode, indexOf(domBefore)); + } + const viewBefore = isText(domBefore) ? + this.findCorrespondingViewText(domBefore) : + this.mapDomToView(domBefore); + // TODO #663 + if (viewBefore && viewBefore.parent) { + return new Position(viewBefore.parent, viewBefore.index + 1); + } + } + return null; + } + } + /** + * Returns corresponding view {@link module:engine/view/element~Element Element} or + * {@link module:engine/view/documentfragment~DocumentFragment} for provided DOM element or + * document fragment. If there is no view item {@link module:engine/view/domconverter~DomConverter#bindElements bound} + * to the given DOM - `undefined` is returned. + * + * For all DOM elements rendered by a {@link module:engine/view/uielement~UIElement} or + * a {@link module:engine/view/rawelement~RawElement}, the parent `UIElement` or `RawElement` will be returned. + * + * @param domElementOrDocumentFragment DOM element or document fragment. + * @returns Corresponding view element, document fragment or `undefined` if no element was bound. + */ + mapDomToView(domElementOrDocumentFragment) { + const hostElement = this.getHostViewElement(domElementOrDocumentFragment); + return hostElement || this._domToViewMapping.get(domElementOrDocumentFragment); + } + /** + * Finds corresponding text node. Text nodes are not {@link module:engine/view/domconverter~DomConverter#bindElements bound}, + * corresponding text node is returned based on the sibling or parent. + * + * If the directly previous sibling is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} element, it is used + * to find the corresponding text node. + * + * If this is a first child in the parent and the parent is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} + * element, it is used to find the corresponding text node. + * + * For all text nodes rendered by a {@link module:engine/view/uielement~UIElement} or + * a {@link module:engine/view/rawelement~RawElement}, the parent `UIElement` or `RawElement` will be returned. + * + * Otherwise `null` is returned. + * + * Note that for the block or inline {@link module:engine/view/filler filler} this method returns `null`. + * + * @param domText DOM text node. + * @returns Corresponding view text node or `null`, if it was not possible to find a corresponding node. + */ + findCorrespondingViewText(domText) { + if (isInlineFiller(domText)) { + return null; + } + // If DOM text was rendered by a UIElement or a RawElement - return this parent element. + const hostElement = this.getHostViewElement(domText); + if (hostElement) { + return hostElement; + } + const previousSibling = domText.previousSibling; + // Try to use previous sibling to find the corresponding text node. + if (previousSibling) { + if (!(this.isElement(previousSibling))) { + // The previous is text or comment. + return null; + } + const viewElement = this.mapDomToView(previousSibling); + if (viewElement) { + const nextSibling = viewElement.nextSibling; + // It might be filler which has no corresponding view node. + if (nextSibling instanceof text_Text) { + return nextSibling; + } + else { + return null; + } + } + } + // Try to use parent to find the corresponding text node. + else { + const viewElement = this.mapDomToView(domText.parentNode); + if (viewElement) { + const firstChild = viewElement.getChild(0); + // It might be filler which has no corresponding view node. + if (firstChild instanceof text_Text) { + return firstChild; + } + else { + return null; + } + } + } + return null; + } + mapViewToDom(documentFragmentOrElement) { + return this._viewToDomMapping.get(documentFragmentOrElement); + } + /** + * Finds corresponding text node. Text nodes are not {@link module:engine/view/domconverter~DomConverter#bindElements bound}, + * corresponding text node is returned based on the sibling or parent. + * + * If the directly previous sibling is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} element, it is used + * to find the corresponding text node. + * + * If this is a first child in the parent and the parent is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} + * element, it is used to find the corresponding text node. + * + * Otherwise `null` is returned. + * + * @param viewText View text node. + * @returns Corresponding DOM text node or `null`, if it was not possible to find a corresponding node. + */ + findCorrespondingDomText(viewText) { + const previousSibling = viewText.previousSibling; + // Try to use previous sibling to find the corresponding text node. + if (previousSibling && this.mapViewToDom(previousSibling)) { + return this.mapViewToDom(previousSibling).nextSibling; + } + // If this is a first node, try to use parent to find the corresponding text node. + if (!previousSibling && viewText.parent && this.mapViewToDom(viewText.parent)) { + return this.mapViewToDom(viewText.parent).childNodes[0]; + } + return null; + } + /** + * Focuses DOM editable that is corresponding to provided {@link module:engine/view/editableelement~EditableElement}. + */ + focus(viewEditable) { + const domEditable = this.mapViewToDom(viewEditable); + if (domEditable && domEditable.ownerDocument.activeElement !== domEditable) { + // Save the scrollX and scrollY positions before the focus. + const { scrollX, scrollY } = dom_global.window; + const scrollPositions = []; + // Save all scrollLeft and scrollTop values starting from domEditable up to + // document#documentElement. + forEachDomElementAncestor(domEditable, node => { + const { scrollLeft, scrollTop } = node; + scrollPositions.push([scrollLeft, scrollTop]); + }); + domEditable.focus(); + // Restore scrollLeft and scrollTop values starting from domEditable up to + // document#documentElement. + // https://github.com/ckeditor/ckeditor5-engine/issues/951 + // https://github.com/ckeditor/ckeditor5-engine/issues/957 + forEachDomElementAncestor(domEditable, node => { + const [scrollLeft, scrollTop] = scrollPositions.shift(); + node.scrollLeft = scrollLeft; + node.scrollTop = scrollTop; + }); + // Restore the scrollX and scrollY positions after the focus. + // https://github.com/ckeditor/ckeditor5-engine/issues/951 + dom_global.window.scrollTo(scrollX, scrollY); + } + } + /** + * Returns `true` when `node.nodeType` equals `Node.ELEMENT_NODE`. + * + * @param node Node to check. + */ + isElement(node) { + return node && node.nodeType == Node.ELEMENT_NODE; + } + /** + * Returns `true` when `node.nodeType` equals `Node.DOCUMENT_FRAGMENT_NODE`. + * + * @param node Node to check. + */ + isDocumentFragment(node) { + return node && node.nodeType == Node.DOCUMENT_FRAGMENT_NODE; + } + /** + * Checks if the node is an instance of the block filler for this DOM converter. + * + * ```ts + * const converter = new DomConverter( viewDocument, { blockFillerMode: 'br' } ); + * + * converter.isBlockFiller( BR_FILLER( document ) ); // true + * converter.isBlockFiller( NBSP_FILLER( document ) ); // false + * ``` + * + * **Note:**: For the `'nbsp'` mode the method also checks context of a node so it cannot be a detached node. + * + * **Note:** A special case in the `'nbsp'` mode exists where the `
      ` in `


      ` is treated as a block filler. + * + * @param domNode DOM node to check. + * @returns True if a node is considered a block filler for given mode. + */ + isBlockFiller(domNode) { + if (this.blockFillerMode == 'br') { + return domNode.isEqualNode(BR_FILLER_REF); + } + // Special case for


      in which
      should be treated as filler even when we are not in the 'br' mode. See ckeditor5#5564. + if (domNode.tagName === 'BR' && + hasBlockParent(domNode, this.blockElements) && + domNode.parentNode.childNodes.length === 1) { + return true; + } + // If not in 'br' mode, try recognizing both marked and regular nbsp block fillers. + return domNode.isEqualNode(MARKED_NBSP_FILLER_REF) || isNbspBlockFiller(domNode, this.blockElements); + } + /** + * Returns `true` if given selection is a backward selection, that is, if it's `focus` is before `anchor`. + * + * @param DOM Selection instance to check. + */ + isDomSelectionBackward(selection) { + if (selection.isCollapsed) { + return false; + } + // Since it takes multiple lines of code to check whether a "DOM Position" is before/after another "DOM Position", + // we will use the fact that range will collapse if it's end is before it's start. + const range = this._domDocument.createRange(); + try { + range.setStart(selection.anchorNode, selection.anchorOffset); + range.setEnd(selection.focusNode, selection.focusOffset); + } + catch (e) { + // Safari sometimes gives us a selection that makes Range.set{Start,End} throw. + // See https://github.com/ckeditor/ckeditor5/issues/12375. + return false; + } + const backward = range.collapsed; + range.detach(); + return backward; + } + /** + * Returns a parent {@link module:engine/view/uielement~UIElement} or {@link module:engine/view/rawelement~RawElement} + * that hosts the provided DOM node. Returns `null` if there is no such parent. + */ + getHostViewElement(domNode) { + const ancestors = getAncestors(domNode); + // Remove domNode from the list. + ancestors.pop(); + while (ancestors.length) { + const domNode = ancestors.pop(); + const viewNode = this._domToViewMapping.get(domNode); + if (viewNode && (viewNode.is('uiElement') || viewNode.is('rawElement'))) { + return viewNode; + } + } + return null; + } + /** + * Checks if the given selection's boundaries are at correct places. + * + * The following places are considered as incorrect for selection boundaries: + * + * * before or in the middle of an inline filler sequence, + * * inside a DOM element which represents {@link module:engine/view/uielement~UIElement a view UI element}, + * * inside a DOM element which represents {@link module:engine/view/rawelement~RawElement a view raw element}. + * + * @param domSelection The DOM selection object to be checked. + * @returns `true` if the given selection is at a correct place, `false` otherwise. + */ + isDomSelectionCorrect(domSelection) { + return this._isDomSelectionPositionCorrect(domSelection.anchorNode, domSelection.anchorOffset) && + this._isDomSelectionPositionCorrect(domSelection.focusNode, domSelection.focusOffset); + } + /** + * Registers a {@link module:engine/view/matcher~MatcherPattern} for view elements whose content should be treated as raw data + * and not processed during the conversion from DOM nodes to view elements. + * + * This is affecting how {@link module:engine/view/domconverter~DomConverter#domToView} and + * {@link module:engine/view/domconverter~DomConverter#domChildrenToView} process DOM nodes. + * + * The raw data can be later accessed by a + * {@link module:engine/view/element~Element#getCustomProperty custom property of a view element} called `"$rawContent"`. + * + * @param pattern Pattern matching a view element whose content should + * be treated as raw data. + */ + registerRawContentMatcher(pattern) { + this._rawContentElementMatcher.add(pattern); + } + /** + * Returns the block {@link module:engine/view/filler filler} node based on the current {@link #blockFillerMode} setting. + */ + _getBlockFiller() { + switch (this.blockFillerMode) { + case 'nbsp': + return NBSP_FILLER(this._domDocument); // eslint-disable-line new-cap + case 'markedNbsp': + return MARKED_NBSP_FILLER(this._domDocument); // eslint-disable-line new-cap + case 'br': + return BR_FILLER(this._domDocument); // eslint-disable-line new-cap + } + } + /** + * Checks if the given DOM position is a correct place for selection boundary. See {@link #isDomSelectionCorrect}. + * + * @param domParent Position parent. + * @param offset Position offset. + * @returns `true` if given position is at a correct place for selection boundary, `false` otherwise. + */ + _isDomSelectionPositionCorrect(domParent, offset) { + // If selection is before or in the middle of inline filler string, it is incorrect. + if (isText(domParent) && startsWithFiller(domParent) && offset < INLINE_FILLER_LENGTH) { + // Selection in a text node, at wrong position (before or in the middle of filler). + return false; + } + if (this.isElement(domParent) && startsWithFiller(domParent.childNodes[offset])) { + // Selection in an element node, before filler text node. + return false; + } + const viewParent = this.mapDomToView(domParent); + // The position is incorrect when anchored inside a UIElement or a RawElement. + // Note: In case of UIElement and RawElement, mapDomToView() returns a parent element for any DOM child + // so there's no need to perform any additional checks. + if (viewParent && (viewParent.is('uiElement') || viewParent.is('rawElement'))) { + return false; + } + return true; + } + /** + * Takes text data from a given {@link module:engine/view/text~Text#data} and processes it so + * it is correctly displayed in the DOM. + * + * Following changes are done: + * + * * a space at the beginning is changed to ` ` if this is the first text node in its container + * element or if a previous text node ends with a space character, + * * space at the end of the text node is changed to ` ` if there are two spaces at the end of a node or if next node + * starts with a space or if it is the last text node in its container, + * * remaining spaces are replaced to a chain of spaces and ` ` (e.g. `'x x'` becomes `'x   x'`). + * + * Content of {@link #preElements} is not processed. + * + * @param node View text node to process. + * @returns Processed text data. + */ + _processDataFromViewText(node) { + let data = node.data; + // If any of node ancestors has a name which is in `preElements` array, then currently processed + // view text node is (will be) in preformatted element. We should not change whitespaces then. + if (node.getAncestors().some(parent => this.preElements.includes(parent.name))) { + return data; + } + // 1. Replace the first space with a nbsp if the previous node ends with a space or there is no previous node + // (container element boundary). + if (data.charAt(0) == ' ') { + const prevNode = this._getTouchingInlineViewNode(node, false); + const prevEndsWithSpace = prevNode && prevNode.is('$textProxy') && this._nodeEndsWithSpace(prevNode); + if (prevEndsWithSpace || !prevNode) { + data = '\u00A0' + data.substr(1); + } + } + // 2. Replace the last space with nbsp if there are two spaces at the end or if the next node starts with space or there is no + // next node (container element boundary). + // + // Keep in mind that Firefox prefers $nbsp; before tag, not inside it: + // + // Foo  bar <-- bad. + // Foo  bar <-- good. + // + // More here: https://github.com/ckeditor/ckeditor5-engine/issues/1747. + if (data.charAt(data.length - 1) == ' ') { + const nextNode = this._getTouchingInlineViewNode(node, true); + const nextStartsWithSpace = nextNode && nextNode.is('$textProxy') && nextNode.data.charAt(0) == ' '; + if (data.charAt(data.length - 2) == ' ' || !nextNode || nextStartsWithSpace) { + data = data.substr(0, data.length - 1) + '\u00A0'; + } + } + // 3. Create space+nbsp pairs. + return data.replace(/ {2}/g, ' \u00A0'); + } + /** + * Checks whether given node ends with a space character after changing appropriate space characters to ` `s. + * + * @param node Node to check. + * @returns `true` if given `node` ends with space, `false` otherwise. + */ + _nodeEndsWithSpace(node) { + if (node.getAncestors().some(parent => this.preElements.includes(parent.name))) { + return false; + } + const data = this._processDataFromViewText(node); + return data.charAt(data.length - 1) == ' '; + } + /** + * Takes text data from native `Text` node and processes it to a correct {@link module:engine/view/text~Text view text node} data. + * + * Following changes are done: + * + * * multiple whitespaces are replaced to a single space, + * * space at the beginning of a text node is removed if it is the first text node in its container + * element or if the previous text node ends with a space character, + * * space at the end of the text node is removed if there are two spaces at the end of a node or if next node + * starts with a space or if it is the last text node in its container + * * nbsps are converted to spaces. + * + * @param node DOM text node to process. + * @returns Processed data. + */ + _processDataFromDomText(node) { + let data = node.data; + if (_hasDomParentOfType(node, this.preElements)) { + return getDataWithoutFiller(node); + } + // Change all consecutive whitespace characters (from the [ \n\t\r] set – + // see https://github.com/ckeditor/ckeditor5-engine/issues/822#issuecomment-311670249) to a single space character. + // That's how multiple whitespaces are treated when rendered, so we normalize those whitespaces. + // We're replacing 1+ (and not 2+) to also normalize singular \n\t\r characters (#822). + data = data.replace(/[ \n\t\r]{1,}/g, ' '); + const prevNode = this._getTouchingInlineDomNode(node, false); + const nextNode = this._getTouchingInlineDomNode(node, true); + const shouldLeftTrim = this._checkShouldLeftTrimDomText(node, prevNode); + const shouldRightTrim = this._checkShouldRightTrimDomText(node, nextNode); + // If the previous dom text node does not exist or it ends by whitespace character, remove space character from the beginning + // of this text node. Such space character is treated as a whitespace. + if (shouldLeftTrim) { + data = data.replace(/^ /, ''); + } + // If the next text node does not exist remove space character from the end of this text node. + if (shouldRightTrim) { + data = data.replace(/ $/, ''); + } + // At the beginning and end of a block element, Firefox inserts normal space +
      instead of non-breaking space. + // This means that the text node starts/end with normal space instead of non-breaking space. + // This causes a problem because the normal space would be removed in `.replace` calls above. To prevent that, + // the inline filler is removed only after the data is initially processed (by the `.replace` above). See ckeditor5#692. + data = getDataWithoutFiller(new Text(data)); + // At this point we should have removed all whitespaces from DOM text data. + // + // Now, We will reverse the process that happens in `_processDataFromViewText`. + // + // We have to change   chars, that were in DOM text data because of rendering reasons, to spaces. + // First, change all ` \u00A0` pairs (space +  ) to two spaces. DOM converter changes two spaces from model/view to + // ` \u00A0` to ensure proper rendering. Since here we convert back, we recognize those pairs and change them back to ` `. + data = data.replace(/ \u00A0/g, ' '); + const isNextNodeInlineObjectElement = nextNode && this.isElement(nextNode) && nextNode.tagName != 'BR'; + const isNextNodeStartingWithSpace = nextNode && isText(nextNode) && nextNode.data.charAt(0) == ' '; + // Then, let's change the last nbsp to a space. + if (/( |\u00A0)\u00A0$/.test(data) || !nextNode || isNextNodeInlineObjectElement || isNextNodeStartingWithSpace) { + data = data.replace(/\u00A0$/, ' '); + } + // Then, change   character that is at the beginning of the text node to space character. + // We do that replacement only if this is the first node or the previous node ends on whitespace character. + if (shouldLeftTrim || prevNode && this.isElement(prevNode) && prevNode.tagName != 'BR') { + data = data.replace(/^\u00A0/, ' '); + } + // At this point, all whitespaces should be removed and all   created for rendering reasons should be + // changed to normal space. All left   are   inserted intentionally. + return data; + } + /** + * Helper function which checks if a DOM text node, preceded by the given `prevNode` should + * be trimmed from the left side. + * + * @param prevNode Either DOM text or `
      ` or one of `#inlineObjectElements`. + */ + _checkShouldLeftTrimDomText(node, prevNode) { + if (!prevNode) { + return true; + } + if (this.isElement(prevNode)) { + return prevNode.tagName === 'BR'; + } + // Shouldn't left trim if previous node is a node that was encountered as a raw content node. + if (this._encounteredRawContentDomNodes.has(node.previousSibling)) { + return false; + } + return /[^\S\u00A0]/.test(prevNode.data.charAt(prevNode.data.length - 1)); + } + /** + * Helper function which checks if a DOM text node, succeeded by the given `nextNode` should + * be trimmed from the right side. + * + * @param nextNode Either DOM text or `
      ` or one of `#inlineObjectElements`. + */ + _checkShouldRightTrimDomText(node, nextNode) { + if (nextNode) { + return false; + } + return !startsWithFiller(node); + } + /** + * Helper function. For given {@link module:engine/view/text~Text view text node}, it finds previous or next sibling + * that is contained in the same container element. If there is no such sibling, `null` is returned. + * + * @param node Reference node. + * @returns Touching text node, an inline object + * or `null` if there is no next or previous touching text node. + */ + _getTouchingInlineViewNode(node, getNext) { + const treeWalker = new TreeWalker({ + startPosition: getNext ? Position._createAfter(node) : Position._createBefore(node), + direction: getNext ? 'forward' : 'backward' + }); + for (const value of treeWalker) { + // Found an inline object (for example an image). + if (value.item.is('element') && this.inlineObjectElements.includes(value.item.name)) { + return value.item; + } + // ViewContainerElement is found on a way to next ViewText node, so given `node` was first/last + // text node in its container element. + else if (value.item.is('containerElement')) { + return null; + } + //
      found – it works like a block boundary, so do not scan further. + else if (value.item.is('element', 'br')) { + return null; + } + // Found a text node in the same container element. + else if (value.item.is('$textProxy')) { + return value.item; + } + } + return null; + } + /** + * Helper function. For the given text node, it finds the closest touching node which is either + * a text, `
      ` or an {@link #inlineObjectElements inline object}. + * + * If no such node is found, `null` is returned. + * + * For instance, in the following DOM structure: + * + * ```html + *

      foobar
      bom

      + * ``` + * + * * `foo` doesn't have its previous touching inline node (`null` is returned), + * * `foo`'s next touching inline node is `bar` + * * `bar`'s next touching inline node is `
      ` + * + * This method returns text nodes and `
      ` elements because these types of nodes affect how + * spaces in the given text node need to be converted. + */ + _getTouchingInlineDomNode(node, getNext) { + if (!node.parentNode) { + return null; + } + const stepInto = getNext ? 'firstChild' : 'lastChild'; + const stepOver = getNext ? 'nextSibling' : 'previousSibling'; + let skipChildren = true; + let returnNode = node; + do { + if (!skipChildren && returnNode[stepInto]) { + returnNode = returnNode[stepInto]; + } + else if (returnNode[stepOver]) { + returnNode = returnNode[stepOver]; + skipChildren = false; + } + else { + returnNode = returnNode.parentNode; + skipChildren = true; + } + if (!returnNode || this._isBlockElement(returnNode)) { + return null; + } + } while (!(isText(returnNode) || returnNode.tagName == 'BR' || this._isInlineObjectElement(returnNode))); + return returnNode; + } + /** + * Returns `true` if a DOM node belongs to {@link #blockElements}. `false` otherwise. + */ + _isBlockElement(node) { + return this.isElement(node) && this.blockElements.includes(node.tagName.toLowerCase()); + } + /** + * Returns `true` if a DOM node belongs to {@link #inlineObjectElements}. `false` otherwise. + */ + _isInlineObjectElement(node) { + return this.isElement(node) && this.inlineObjectElements.includes(node.tagName.toLowerCase()); + } + /** + * Creates view element basing on the node type. + * + * @param node DOM node to check. + * @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter. + */ + _createViewElement(node, options) { + if (isComment(node)) { + return new UIElement(this.document, '$comment'); + } + const viewName = options.keepOriginalCase ? node.tagName : node.tagName.toLowerCase(); + return new Element(this.document, viewName); + } + /** + * Checks if view element's content should be treated as a raw data. + * + * @param viewElement View element to check. + * @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter. + */ + _isViewElementWithRawContent(viewElement, options) { + return options.withChildren !== false && !!this._rawContentElementMatcher.match(viewElement); + } + /** + * Checks whether a given element name should be renamed in a current rendering mode. + * + * @param elementName The name of view element. + */ + _shouldRenameElement(elementName) { + const name = elementName.toLowerCase(); + return this.renderingMode === 'editing' && this.unsafeElements.includes(name); + } + /** + * Return a element with a special attribute holding the name of the original element. + * Optionally, copy all the attributes of the original element if that element is provided. + * + * @param elementName The name of view element. + * @param originalDomElement The original DOM element to copy attributes and content from. + */ + _createReplacementDomElement(elementName, originalDomElement) { + const newDomElement = this._domDocument.createElement('span'); + // Mark the span replacing a script as hidden. + newDomElement.setAttribute(UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE, elementName); + if (originalDomElement) { + while (originalDomElement.firstChild) { + newDomElement.appendChild(originalDomElement.firstChild); + } + for (const attributeName of originalDomElement.getAttributeNames()) { + newDomElement.setAttribute(attributeName, originalDomElement.getAttribute(attributeName)); + } + } + return newDomElement; + } +} +/** + * Helper function. + * Used to check if given native `Element` or `Text` node has parent with tag name from `types` array. + * + * @returns`true` if such parent exists or `false` if it does not. + */ +function _hasDomParentOfType(node, types) { + const parents = getAncestors(node); + return parents.some(parent => parent.tagName && types.includes(parent.tagName.toLowerCase())); +} +/** + * A helper that executes given callback for each DOM node's ancestor, starting from the given node + * and ending in document#documentElement. + * + * @param callback A callback to be executed for each ancestor. + */ +function forEachDomElementAncestor(element, callback) { + let node = element; + while (node) { + callback(node); + node = node.parentElement; + } +} +/** + * Checks if given node is a nbsp block filler. + * + * A   is a block filler only if it is a single child of a block element. + * + * @param domNode DOM node. + */ +function isNbspBlockFiller(domNode, blockElements) { + const isNBSP = domNode.isEqualNode(NBSP_FILLER_REF); + return isNBSP && hasBlockParent(domNode, blockElements) && domNode.parentNode.childNodes.length === 1; +} +/** + * Checks if domNode has block parent. + * + * @param domNode DOM node. + */ +function hasBlockParent(domNode, blockElements) { + const parent = domNode.parentNode; + return !!parent && !!parent.tagName && blockElements.includes(parent.tagName.toLowerCase()); +} +/** + * Log to console the information about element that was replaced. + * Check UNSAFE_ELEMENTS for all recognized unsafe elements. + * + * @param elementName The name of the view element. + */ +function _logUnsafeElement(elementName) { + if (elementName === 'script') { + logWarning('domconverter-unsafe-script-element-detected'); + } + if (elementName === 'style') { + logWarning('domconverter-unsafe-style-element-detected'); + } +} +/** + * While rendering the editor content, the {@link module:engine/view/domconverter~DomConverter} detected a ` - {{-- TODO : Voir l'inclusion de Font Awesome, pour le moment c'est fait avec mon compte FA --}} - - {!! !empty($settingsGlobal->analytics) ? $settingsGlobal->analytics : '' !!} - - - - - - - - - - -
      - {{-- Header --}} - - {{-- Fin du header --}} - {{-- Contenu --}} -
      - @yield('content') -
      - {{-- Fin du contenu --}} - {{-- Footer --}} -
      -
      - Footer {{$settingsGlobal->company}} -
      -
      - {{-- Fin du footer --}} -
      - - @stack('scripts') - - diff --git a/resources/views/front/basic_example/legals.blade.php b/resources/views/front/basic_example/legals.blade.php deleted file mode 100644 index 823d54c..0000000 --- a/resources/views/front/basic_example/legals.blade.php +++ /dev/null @@ -1,8 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Mentions légales') - -@section('content') -

      Content mentions :

      -

      {!!$content->value!!}

      -@endsection diff --git a/resources/views/front/basic_example/login.blade.php b/resources/views/front/basic_example/login.blade.php deleted file mode 100644 index 81375a7..0000000 --- a/resources/views/front/basic_example/login.blade.php +++ /dev/null @@ -1,71 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Connexion') - -@section('content') -
      -
      -
      -
      -
      ConnexionInscription
      - -
      -
      - @csrf - @if ($errors->any()) -
      -
        - @foreach ($errors->all() as $error) -
      • {{ $error }}
      • - @endforeach -
      -
      - @endif - @if (session('success')) -
      - {{ session('success') }} -
      - @endif - -
      - - -
      - -
      -
      - -
      - - -
      - -
      -
      - -
      -
      -
      - - - -
      -
      -
      - - -
      -
      -
      -
      -
      -
      -@endsection - diff --git a/resources/views/front/basic_example/loose.blade.php b/resources/views/front/basic_example/loose.blade.php deleted file mode 100644 index 54cc3dd..0000000 --- a/resources/views/front/basic_example/loose.blade.php +++ /dev/null @@ -1,6 +0,0 @@ -@extends('front.basic.layout') - -@section('content') -

      C'est perdu

      -

      Rejouer !

      -@endsection diff --git a/resources/views/front/basic_example/notif-admin.blade.php b/resources/views/front/basic_example/notif-admin.blade.php deleted file mode 100644 index 90072e8..0000000 --- a/resources/views/front/basic_example/notif-admin.blade.php +++ /dev/null @@ -1,2 +0,0 @@ -

      Bonjour,

      -

      {{ $msg }}

      diff --git a/resources/views/front/basic_example/notif-win-admin-email.blade.php b/resources/views/front/basic_example/notif-win-admin-email.blade.php deleted file mode 100644 index 1d52172..0000000 --- a/resources/views/front/basic_example/notif-win-admin-email.blade.php +++ /dev/null @@ -1,21 +0,0 @@ -
      -
      -
      -

      Bonjour,

      -

      Le lot suivant a été gagné : {{ $participation->instantWin()->first()->prize->label_one }} le {{ \Carbon\Carbon::parse($participation->created_at)->format('d/m/Y à H:i') }}


      -

      Gagnant :

      -

      {{ $participation->user->lastname }} {{ $participation->user->firstname }}

      -

      {{ $participation->user->address }}

      - @if ($participation->user->address2 !== null) -

      {{ $participation->user->address2 }}

      - @endif -

      {{ $participation->user->postal_code }} {{ $participation->user->town }} - {{ $participation->user->country }}

      -

      {{ $participation->user->email }}


      -

      Codes utilisé@if ($settings->use_ean_codes)s @endif :

      - @if ($settings->use_ean_codes) -

      - Code On Pack : {{ $participation->codeEan }}

      - @endif -

      - Code Unique : {{ $participation->code->code_unique }}

      -
      -
      -
      diff --git a/resources/views/front/basic_example/participation-exhausted.blade.php b/resources/views/front/basic_example/participation-exhausted.blade.php deleted file mode 100644 index b733105..0000000 --- a/resources/views/front/basic_example/participation-exhausted.blade.php +++ /dev/null @@ -1,7 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Plus de participations') - -@section('content') -

      Vous ne pouvez plus participer à ce jeu car vous avez déjà participer {{$settings->nb_participation_player}} fois.

      -@endsection diff --git a/resources/views/front/basic_example/password-email.blade.php b/resources/views/front/basic_example/password-email.blade.php deleted file mode 100644 index 22f5b55..0000000 --- a/resources/views/front/basic_example/password-email.blade.php +++ /dev/null @@ -1,4 +0,0 @@ -

      Pour réinitialiser votre mot de passe pour vous connecter au site {{ $settings->name }}, cliquez sur le lien suivant :


      -

      Réinitialisez votre mot de passe


      -

      Ce lien expirera dans 3 heures.


      -
      diff --git a/resources/views/front/basic_example/prize-mail.blade.php b/resources/views/front/basic_example/prize-mail.blade.php deleted file mode 100644 index f5df352..0000000 --- a/resources/views/front/basic_example/prize-mail.blade.php +++ /dev/null @@ -1,2 +0,0 @@ -

      Bonjour {{ $user->firstname }},

      -

      Félicitation, vous avez gagné 1 {{ $prize->label_one }} en jouant à notre jeu {{ $settings->name }} !

      diff --git a/resources/views/front/basic_example/reduction-mail.blade.php b/resources/views/front/basic_example/reduction-mail.blade.php deleted file mode 100644 index dd6ad1f..0000000 --- a/resources/views/front/basic_example/reduction-mail.blade.php +++ /dev/null @@ -1,3 +0,0 @@ -

      Bonjour {{ $user->firstname }},

      -

      Félicitation pour votre gain d'un bon de reduction d'une valeur de {{$coupon->face_value}}€ {{$coupon->valid_on}} !

      -J'imprime mon coupon ! diff --git a/resources/views/front/basic_example/reduction.blade.php b/resources/views/front/basic_example/reduction.blade.php deleted file mode 100644 index 328abc7..0000000 --- a/resources/views/front/basic_example/reduction.blade.php +++ /dev/null @@ -1,9 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Réduction') - -@section('content') -

      Gain d'une réduction :

      -

      {{$crmCoupon->link}}

      -

      Rejouer ! -@endsection diff --git a/resources/views/front/basic_example/register-crm.blade.php b/resources/views/front/basic_example/register-crm.blade.php deleted file mode 100644 index fa4b6bd..0000000 --- a/resources/views/front/basic_example/register-crm.blade.php +++ /dev/null @@ -1,92 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Connexion') - -@section('content') -

      -
      -
      -
      -
      Inscription
      - -
      - @if ($errors->any()) -
      -
        - @foreach ($errors->all() as $error) -
      • {{ $error }}
      • - @endforeach -
      -
      - @endif -
      - @csrf -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      -
      - -
      -
      - -
      -
      -
      -
      -
      -
      -
      -@endsection diff --git a/resources/views/front/basic_example/reglement.blade.php b/resources/views/front/basic_example/reglement.blade.php deleted file mode 100644 index 819955f..0000000 --- a/resources/views/front/basic_example/reglement.blade.php +++ /dev/null @@ -1,8 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Règlement') - -@section('content') -

      Content règlement :

      -

      {!!$content->value!!}

      -@endsection diff --git a/resources/views/front/basic_example/replay.blade.php b/resources/views/front/basic_example/replay.blade.php deleted file mode 100644 index 303e0db..0000000 --- a/resources/views/front/basic_example/replay.blade.php +++ /dev/null @@ -1,8 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Rejouer') - -@section('content') -

      Félicitations pour votre gain !

      -

      Rejouer !

      -@endsection diff --git a/resources/views/front/basic_example/teaser.blade.php b/resources/views/front/basic_example/teaser.blade.php deleted file mode 100644 index 5a03944..0000000 --- a/resources/views/front/basic_example/teaser.blade.php +++ /dev/null @@ -1,36 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Accueil') - -@section('content') -

      Date début : {{$settings->start_date}}, date de fin : {{$settings->end_date}} et la société : {{$settingsGlobal->company}}

      -

      Lots (valeur à 0 ou 1 : 0 = faux, 1 = vrai) :

      - - - - - - - - - - - - - - @foreach ($prizesGlobal as $p) - - - - - - - - - - - - @endforeach - -
      ID ArcadiaLabel singulierLabel plurielQuantitéNotification activéFormulaire suppl.ID mail ArcadiaPdf preuve de gainLot par défaut
      {{$p->arcadia_id}}{{$p->label_one}}{{$p->label_many}}{{$p->quantity}}{{$p->notifications}}{{$p->additional_form}}{{$p->arcadia_mail_id}}{{$p->pdf_winning_proof}}{{$p->need_proof}}
      -@endsection diff --git a/resources/views/front/basic_example/verifyemail.blade.php b/resources/views/front/basic_example/verifyemail.blade.php deleted file mode 100644 index 74c58e2..0000000 --- a/resources/views/front/basic_example/verifyemail.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -

      Confirmation d'email

      -

      Bonjour {{ $user->firstname }},

      -

      Merci pour votre inscription à notre jeu !

      -

      Afin d'activer votre compte, merci de confirmer votre email en cliquant sur le lien ci-dessous :

      -

      Confirmer mon adresse email

      diff --git a/resources/views/front/basic_example/winning-proof-email.blade.php b/resources/views/front/basic_example/winning-proof-email.blade.php deleted file mode 100644 index 1cd5518..0000000 --- a/resources/views/front/basic_example/winning-proof-email.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -

      Bonjour,

      -

      Vous trouverez en PJ les preuves de gain du joueur suivant :

      -

      - Lot : {{ $participation->instantWin()->first()->prize->label_one ?? ''}}
      - {{$user->lastname}} {{$user->firstname}}
      - {{$user->address}}
      - @if ($user->address2 !== null) - {{$user->address2}}
      - @endif - {{$user->postal_code}} {{$user->town}} - {{$user->country}}
      - {{$user->email}} -

      -

      Codes utilisés :

      -

      - @if ($settings->use_ean_codes) - Code On Pack : {{ $participation->codeEan->code }}
      - @endif - Code Unique : {{ $participation->code->code_unique ?? ''}} -

      \ No newline at end of file diff --git a/resources/views/front/basic_example/winning-proof.blade.php b/resources/views/front/basic_example/winning-proof.blade.php deleted file mode 100644 index 649f3ee..0000000 --- a/resources/views/front/basic_example/winning-proof.blade.php +++ /dev/null @@ -1,59 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Preuve de gain') - -@section('content') -

      Envoyer vos preuves de gain

      -
      - @method('PUT') - @csrf - @if ($errors->any()) -
      -
        - @foreach ($errors->all() as $error) -
      • {{ $error }}
      • - @endforeach -
      -
      - @endif -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - -
      -
      -@endsection From 47aaf436c6da845c57a2593dec8263142078ad4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 17:06:16 +0100 Subject: [PATCH 025/145] Sync 1 Front compilation ok --- .gitignore | 1 + package-lock.json | 7 + package.json | 13 +- resources/sass/bo/bo.scss | 3 + .../sass/bo/vendor/_ckEditorContent.scss | 482 ++++++++++++++++++ resources/ts/front-definition.d.ts | 1 + vite.config.ts | 6 +- 7 files changed, 505 insertions(+), 8 deletions(-) create mode 100644 resources/sass/bo/vendor/_ckEditorContent.scss create mode 100644 resources/ts/front-definition.d.ts diff --git a/.gitignore b/.gitignore index 2174639..30d15b1 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ yarn-error.log # https://lab.s-web.fr/ldc-web/projets/gen-game-web/-/issues/17 public/fichiers storage +resources/theme diff --git a/package-lock.json b/package-lock.json index 7d0dfe5..d7393c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@fortawesome/free-regular-svg-icons": "latest", "@fortawesome/free-solid-svg-icons": "latest", "@fortawesome/vue-fontawesome": "^3.0.3", + "@ldc-web/cookie-notice": "^3.1.0", "@sipec/vue3-tags-input": "^3.0.4", "@types/bootstrap": "^5.2.7", "@types/node": "^20.8.2", @@ -2417,6 +2418,12 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", "dev": true }, + "node_modules/@ldc-web/cookie-notice": { + "version": "3.1.0", + "resolved": "https://lab.s-web.fr/api/v4/projects/50/packages/npm/@ldc-web/cookie-notice/-/@ldc-web/cookie-notice-3.1.0.tgz", + "integrity": "sha1-bncTfaI48BII8pbXlUiU10/ZRDs=", + "dev": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/package.json b/package.json index 30ba274..8fc5a8b 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@fortawesome/free-regular-svg-icons": "latest", "@fortawesome/free-solid-svg-icons": "latest", "@fortawesome/vue-fontawesome": "^3.0.3", + "@ldc-web/cookie-notice": "^3.1.0", "@sipec/vue3-tags-input": "^3.0.4", "@types/bootstrap": "^5.2.7", "@types/node": "^20.8.2", @@ -37,9 +38,9 @@ "bootstrap": "^5.3.2", "chart.js": "^4.4.0", "cropperjs": "^1.6.1", + "eslint": "latest", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-vue": "latest", - "eslint": "latest", "laravel-vite-plugin": "latest", "postcss-discard-comments": "^6.0.0", "prettier": "latest", @@ -47,25 +48,25 @@ "resolve-url-loader": "^5.0.0", "sass": "latest", "slugify": "^1.6.6", + "stylelint": "latest", "stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order", "stylelint-config-sass-guidelines": "latest", "stylelint-config-standard-scss": "latest", "stylelint-scss": "latest", - "stylelint": "latest", "sweetalert2": "^11.7.31", "terser": "latest", "toastify-js": "^1.12.0", "ts-loader": "^9.3.1", - "typescript-eslint": "latest", "typescript": "latest", + "typescript-eslint": "latest", + "vite": "^4.0.0", "vite-plugin-babel": "latest", "vite-plugin-checker": "latest", "vite-plugin-eslint": "latest", "vite-plugin-stylelint": "latest", - "vite": "^4.0.0", + "vue": "latest", "vue-eslint-parser": "^9.1.0", "vue-loader": "^16.8.3", - "vue": "latest", "vue-tsc": "1.6.0" } -} \ No newline at end of file +} diff --git a/resources/sass/bo/bo.scss b/resources/sass/bo/bo.scss index ca97517..4ce5cca 100644 --- a/resources/sass/bo/bo.scss +++ b/resources/sass/bo/bo.scss @@ -6,6 +6,9 @@ // * VENDOR @import "./vendor/bootstrap"; +// * Add ckContent here because front is not responsible for the ck editor version +@import "./vendor/ckEditorContent"; + // * BASE @import "./base/bootstrap-overload"; @import "./base/fonts"; diff --git a/resources/sass/bo/vendor/_ckEditorContent.scss b/resources/sass/bo/vendor/_ckEditorContent.scss new file mode 100644 index 0000000..1b9bc53 --- /dev/null +++ b/resources/sass/bo/vendor/_ckEditorContent.scss @@ -0,0 +1,482 @@ +// CKeditor fix in alert +.ck-editor__main { + color: initial; +} + +// FIX +.ck-content { + // * Import bootstrap reboot to counter count theme aggressive reset + @import "bootstrap/scss/functions"; + @import "bootstrap/scss/variables"; + @import "bootstrap/scss/variables-dark"; + @import "bootstrap/scss/maps"; + @import "bootstrap/scss/mixins"; + @import "bootstrap/scss/root"; + @import "bootstrap/scss/reboot"; +} + +/* + * CKEditor 5 (v38.0.1) content styles. + * Generated on Tue, 06 Jun 2023 11:41:38 GMT. + * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html + */ + +:root { + --ck-color-image-caption-background: hsl(0, 0%, 97%); + --ck-color-image-caption-text: hsl(0, 0%, 20%); + --ck-color-mention-background: hsla(341, 100%, 30%, 0.1); + --ck-color-mention-text: hsl(341, 100%, 30%); + --ck-color-table-caption-background: hsl(0, 0%, 97%); + --ck-color-table-caption-text: hsl(0, 0%, 20%); + --ck-highlight-marker-blue: hsl(201, 97%, 72%); + --ck-highlight-marker-green: hsl(120, 93%, 68%); + --ck-highlight-marker-pink: hsl(345, 96%, 73%); + --ck-highlight-marker-yellow: hsl(60, 97%, 73%); + --ck-highlight-pen-green: hsl(112, 100%, 27%); + --ck-highlight-pen-red: hsl(0, 85%, 49%); + --ck-image-style-spacing: 1.5em; + --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2); + --ck-todo-list-checkmark-size: 16px; +} + +/* @ckeditor/ckeditor5-basic-styles/theme/code.css */ +.ck-content code { + background-color: hsla(0, 0%, 78%, 0.3); + padding: 0.15em; + border-radius: 2px; +} +/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */ +.ck-content blockquote { + overflow: hidden; + padding-right: 1.5em; + padding-left: 1.5em; + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} +/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */ +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-tiny { + font-size: 0.7em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-small { + font-size: 0.85em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-big { + font-size: 1.4em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-huge { + font-size: 1.8em; +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-yellow { + background-color: var(--ck-highlight-marker-yellow); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-green { + background-color: var(--ck-highlight-marker-green); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-pink { + background-color: var(--ck-highlight-marker-pink); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-blue { + background-color: var(--ck-highlight-marker-blue); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-red { + color: var(--ck-highlight-pen-red); + background-color: transparent; +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-green { + color: var(--ck-highlight-pen-green); + background-color: transparent; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image { + display: table; + clear: both; + text-align: center; + margin: 0.9em auto; + min-width: 50px; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image img { + display: block; + margin: 0 auto; + max-width: 100%; + min-width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline { + /* + * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).; + * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root. + * This strange behavior does not happen with inline-flex. + */ + display: inline-flex; + max-width: 100%; + align-items: flex-start; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline picture { + display: flex; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline picture, +.ck-content .image-inline img { + flex-grow: 1; + flex-shrink: 1; + max-width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized { + max-width: 100%; + display: block; + box-sizing: border-box; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized img { + width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized > figcaption { + display: block; +} +/* @ckeditor/ckeditor5-image/theme/imagecaption.css */ +.ck-content .image > figcaption { + display: table-caption; + caption-side: bottom; + word-break: break-word; + color: var(--ck-color-image-caption-text); + background-color: var(--ck-color-image-caption-background); + padding: 0.6em; + font-size: 0.75em; + outline-offset: -1px; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-left, +.ck-content .image-style-block-align-right { + max-width: calc(100% - var(--ck-image-style-spacing)); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left, +.ck-content .image-style-align-right { + clear: none; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-side { + float: right; + margin-left: var(--ck-image-style-spacing); + max-width: 50%; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left { + float: left; + margin-right: var(--ck-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-center { + margin-left: auto; + margin-right: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-right { + float: right; + margin-left: var(--ck-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-right { + margin-right: 0; + margin-left: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-left { + margin-left: 0; + margin-right: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content p + .image-style-align-left, +.ck-content p + .image-style-align-right, +.ck-content p + .image-style-side { + margin-top: 0; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-left, +.ck-content .image-inline.image-style-align-right { + margin-top: var(--ck-inline-image-style-spacing); + margin-bottom: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-left { + margin-right: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-right { + margin-left: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list { + list-style: none; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li { + margin-bottom: 5px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li .todo-list { + margin-top: 5px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input { + -webkit-appearance: none; + display: inline-block; + position: relative; + width: var(--ck-todo-list-checkmark-size); + height: var(--ck-todo-list-checkmark-size); + vertical-align: middle; + border: 0; + left: -25px; + margin-right: -15px; + right: 0; + margin-left: 0; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::before { + display: block; + position: absolute; + box-sizing: border-box; + content: ""; + width: 100%; + height: 100%; + border: 1px solid hsl(0, 0%, 20%); + border-radius: 2px; + transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, + 250ms ease-in-out border; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::after { + display: block; + position: absolute; + box-sizing: content-box; + pointer-events: none; + content: ""; + left: calc(var(--ck-todo-list-checkmark-size) / 3); + top: calc(var(--ck-todo-list-checkmark-size) / 5.3); + width: calc(var(--ck-todo-list-checkmark-size) / 5.3); + height: calc(var(--ck-todo-list-checkmark-size) / 2.6); + border-style: solid; + border-color: transparent; + border-width: 0 calc(var(--ck-todo-list-checkmark-size) / 8) + calc(var(--ck-todo-list-checkmark-size) / 8) 0; + transform: rotate(45deg); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::before { + background: hsl(126, 64%, 41%); + border-color: hsl(126, 64%, 41%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::after { + border-color: hsl(0, 0%, 100%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label .todo-list__label__description { + vertical-align: middle; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol { + list-style-type: decimal; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol { + list-style-type: lower-latin; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol { + list-style-type: lower-roman; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol ol { + list-style-type: upper-latin; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol ol ol { + list-style-type: upper-roman; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul { + list-style-type: disc; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul { + list-style-type: circle; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul ul { + list-style-type: square; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul ul ul { + list-style-type: square; +} +/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */ +.ck-content .media { + clear: both; + margin: 0.9em 0; + display: block; + min-width: 15em; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break { + position: relative; + clear: both; + padding: 5px 0; + display: flex; + align-items: center; + justify-content: center; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break::after { + content: ""; + position: absolute; + border-bottom: 2px dashed hsl(0, 0%, 77%); + width: 100%; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break__label { + position: relative; + z-index: 1; + padding: 0.3em 0.6em; + display: block; + text-transform: uppercase; + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif; + font-size: 0.75em; + font-weight: bold; + color: hsl(0, 0%, 20%); + background: hsl(0, 0%, 100%); + box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */ +.ck-content .media { + clear: both; + margin: 0.9em 0; + display: block; + min-width: 15em; +} +/* @ckeditor/ckeditor5-table/theme/tablecaption.css */ +.ck-content .table > figcaption { + display: table-caption; + caption-side: top; + word-break: break-word; + text-align: center; + color: var(--ck-color-table-caption-text); + background-color: var(--ck-color-table-caption-background); + padding: 0.6em; + font-size: 0.75em; + outline-offset: -1px; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table { + margin: 0.9em auto; + display: table; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table { + border-collapse: collapse; + border-spacing: 0; + width: 100%; + height: 100%; + border: 1px double hsl(0, 0%, 70%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table td, +.ck-content .table table th { + min-width: 2em; + padding: 0.4em; + border: 1px solid hsl(0, 0%, 75%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table th { + font-weight: bold; + background: hsla(0, 0%, 0%, 5%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content[dir="rtl"] .table th { + text-align: right; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content[dir="ltr"] .table th { + text-align: left; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table .ck-table-resized { + table-layout: fixed; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table table { + overflow: hidden; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table td, +.ck-content .table th { + position: relative; +} +/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre { + padding: 1em; + color: hsl(0, 0%, 20.8%); + background: hsla(0, 0%, 78%, 0.3); + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + text-align: left; + direction: ltr; + tab-size: 4; + white-space: pre-wrap; + font-style: normal; + min-width: 200px; +} +/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre code { + background: unset; + padding: 0; + border-radius: 0; +} +/* @ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css */ +.ck-content hr { + margin: 15px 0; + height: 4px; + background: hsl(0, 0%, 87%); + border: 0; +} +/* @ckeditor/ckeditor5-mention/theme/mention.css */ +.ck-content .mention { + background: var(--ck-color-mention-background); + color: var(--ck-color-mention-text); +} +@media print { + /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break { + padding: 0; + } + /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break::after { + display: none; + } +} diff --git a/resources/ts/front-definition.d.ts b/resources/ts/front-definition.d.ts new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/resources/ts/front-definition.d.ts @@ -0,0 +1 @@ + diff --git a/vite.config.ts b/vite.config.ts index 2d62f8e..20a3015 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -61,17 +61,19 @@ export default defineConfig({ }, eslint: { lintCommand: - "eslint --quiet -c .eslintrc.json \"./resources/ts/*\"", + "eslint --quiet -c .eslintrc.json \"./resources/ts/*\" \"./resources/theme/mounted/ts/*\"", }, stylelint: { lintCommand: - "stylelint --quiet -c .stylelintrc.json --fix ./resources/sass/**/*.scss", + "stylelint --quiet -c .stylelintrc.json --fix ./resources/sass/**/*.scss ./resources/theme/mounted/sass/**/*.scss", }, }), laravel({ input: [ "resources/sass/bo/bo.scss", "resources/ts/bo/bo.ts", + "resources/theme/mounted/sass/fo.scss", + "resources/theme/mounted/ts/fo.ts", ], refresh: true, }), From e6a16ff9653641c2242690524121427cfa6e74ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 20 Nov 2023 17:22:24 +0100 Subject: [PATCH 026/145] Setup view aliases --- .../Controllers/Bo/Auth/LoginController.php | 2 +- .../Controllers/Bo/BannedIpController.php | 6 +- app/Http/Controllers/Bo/CodesController.php | 8 +- app/Http/Controllers/Bo/ContentController.php | 4 +- .../Controllers/Bo/DashboardController.php | 4 +- .../Controllers/Bo/FaqQuestionsController.php | 6 +- .../Controllers/Bo/FaqThemesController.php | 6 +- .../Controllers/Bo/GainViewController.php | 6 +- .../Controllers/Bo/InstantWinController.php | 2 +- app/Http/Controllers/Bo/PrizesController.php | 6 +- .../Controllers/Bo/ProductsController.php | 14 +- app/Http/Controllers/Bo/RangeController.php | 6 +- .../Controllers/Bo/SettingsController.php | 2 +- .../Controllers/Bo/WinnersListController.php | 2 +- app/Mail/CodeGenerationEnd.php | 4 +- app/Mail/ExportCodesUniques.php | 2 +- app/Mail/JobFailed.php | 2 +- app/Providers/ViewServiceProvider.php | 7 +- config/mail.php | 3 + config/theme.php | 17 +- resources/theme | 2 +- resources/views/auth/login.blade.php | 68 +++++ resources/views/bo/auth/login.blade.php | 67 ----- .../views/bo/modules/flash-messages.blade.php | 45 ---- .../bo/pages/banned-ips/create.blade.php | 46 ---- .../views/bo/pages/banned-ips/edit.blade.php | 62 ----- .../views/bo/pages/banned-ips/index.blade.php | 64 ----- .../views/bo/pages/codes/index.blade.php | 100 ------- .../views/bo/pages/codes/search.blade.php | 19 -- .../views/bo/pages/contents/edit.blade.php | 52 ---- .../views/bo/pages/contents/index.blade.php | 45 ---- .../bo/pages/faq-questions/create.blade.php | 46 ---- .../bo/pages/faq-questions/edit.blade.php | 62 ----- .../bo/pages/faq-questions/index.blade.php | 68 ----- .../bo/pages/faq-themes/create.blade.php | 46 ---- .../views/bo/pages/faq-themes/edit.blade.php | 62 ----- .../views/bo/pages/faq-themes/index.blade.php | 64 ----- .../bo/pages/gain-views/create.blade.php | 46 ---- .../views/bo/pages/gain-views/edit.blade.php | 62 ----- .../views/bo/pages/gain-views/index.blade.php | 66 ----- .../bo/pages/instant-win/index.blade.php | 11 - .../views/bo/pages/prizes/create.blade.php | 46 ---- .../views/bo/pages/prizes/edit.blade.php | 62 ----- .../views/bo/pages/prizes/index.blade.php | 85 ------ .../views/bo/pages/products/create.blade.php | 46 ---- .../views/bo/pages/products/edit.blade.php | 62 ----- .../views/bo/pages/products/index.blade.php | 70 ----- .../views/bo/pages/ranges/create.blade.php | 46 ---- .../views/bo/pages/ranges/edit.blade.php | 62 ----- .../views/bo/pages/ranges/index.blade.php | 64 ----- .../views/bo/pages/settings/edit.blade.php | 48 ---- .../bo/pages/winners-list/index.blade.php | 72 ----- resources/views/errors_example/404.blade.php | 13 - resources/views/{bo => }/layout.blade.php | 8 +- .../views/{bo => }/layouts/footer.blade.php | 0 .../views/{bo => }/layouts/head.blade.php | 0 .../views/{bo => }/layouts/nav-menu.blade.php | 0 .../mails/export-codes-unique-email.blade.php | 0 .../mails/generate-end-email.blade.php | 0 .../views/{bo => }/mails/job-failed.blade.php | 0 resources/views/modules/input-error.blade.php | 2 +- .../modules/minicrud-form-inputs.blade.php | 0 .../{bo => }/modules/pagination.blade.php | 0 .../views/modules/script-constants.blade.php | 2 +- .../{bo => }/modules/search-bar.blade.php | 0 .../modules/table-col-sorter.blade.php | 0 .../views/pages/banned-ips/create.blade.php | 36 +++ .../views/pages/banned-ips/edit.blade.php | 47 ++++ .../pages/banned-ips/form-inputs.blade.php | 24 +- .../views/pages/banned-ips/index.blade.php | 55 ++++ .../pages/codes/form-inputs.blade.php | 18 +- resources/views/pages/codes/index.blade.php | 100 +++++++ .../pages/codes/search-form.blade.php | 0 resources/views/pages/codes/search.blade.php | 19 ++ resources/views/pages/contents/edit.blade.php | 41 +++ .../pages/contents/form-inputs.blade.php | 28 +- .../views/pages/contents/index.blade.php | 43 +++ .../{bo => }/pages/dashboard/index.blade.php | 14 +- .../pages/faq-questions/create.blade.php | 37 +++ .../views/pages/faq-questions/edit.blade.php | 48 ++++ .../pages/faq-questions/form-inputs.blade.php | 36 +-- .../views/pages/faq-questions/index.blade.php | 58 ++++ .../views/pages/faq-themes/create.blade.php | 37 +++ .../views/pages/faq-themes/edit.blade.php | 48 ++++ .../pages/faq-themes/form-inputs.blade.php | 26 +- .../views/pages/faq-themes/index.blade.php | 54 ++++ .../views/pages/gain-views/create.blade.php | 37 +++ .../views/pages/gain-views/edit.blade.php | 48 ++++ .../pages/gain-views/form-inputs.blade.php | 32 +-- .../views/pages/gain-views/index.blade.php | 56 ++++ .../views/pages/instant-win/index.blade.php | 11 + resources/views/pages/prizes/create.blade.php | 36 +++ resources/views/pages/prizes/edit.blade.php | 47 ++++ .../pages/prizes/form-inputs.blade.php | 70 ++--- resources/views/pages/prizes/index.blade.php | 72 +++++ .../views/pages/products/create.blade.php | 36 +++ resources/views/pages/products/edit.blade.php | 47 ++++ .../pages/products/form-inputs.blade.php | 48 ++-- .../views/pages/products/index.blade.php | 60 +++++ resources/views/pages/ranges/create.blade.php | 36 +++ resources/views/pages/ranges/edit.blade.php | 47 ++++ .../pages/ranges/form-inputs.blade.php | 30 +-- resources/views/pages/ranges/index.blade.php | 54 ++++ resources/views/pages/settings/edit.blade.php | 39 +++ .../pages/settings/form-inputs.blade.php | 252 +++++++++--------- .../views/pages/winners-list/index.blade.php | 80 ++++++ .../inputs/bigint-foreign-id.blade.php | 0 .../{bo => }/partials/inputs/date.blade.php | 0 .../partials/inputs/int-color.blade.php | 0 .../partials/inputs/int-number.blade.php | 0 .../inputs/pivot-belongsToMany.blade.php | 0 .../partials/inputs/publish-dates.blade.php | 0 .../search-belongs-to-dropdown.blade.php | 0 .../inputs/select-multiple-enum.blade.php | 0 .../partials/inputs/text-html.blade.php | 0 .../partials/inputs/text-list-items.blade.php | 0 .../inputs/timestamp-datetime.blade.php | 0 .../partials/inputs/tinyint-boolean.blade.php | 0 .../partials/inputs/tinyint-enum.blade.php | 0 .../partials/inputs/varchar-file.blade.php | 0 .../inputs/varchar-multiline.blade.php | 0 .../partials/inputs/varchar-picture.blade.php | 0 .../partials/inputs/varchar.blade.php | 0 resources/views/re7.blade.php | 2 +- 124 files changed, 1757 insertions(+), 2052 deletions(-) mode change 120000 => 160000 resources/theme create mode 100644 resources/views/auth/login.blade.php delete mode 100644 resources/views/bo/auth/login.blade.php delete mode 100644 resources/views/bo/modules/flash-messages.blade.php delete mode 100644 resources/views/bo/pages/banned-ips/create.blade.php delete mode 100644 resources/views/bo/pages/banned-ips/edit.blade.php delete mode 100644 resources/views/bo/pages/banned-ips/index.blade.php delete mode 100644 resources/views/bo/pages/codes/index.blade.php delete mode 100644 resources/views/bo/pages/codes/search.blade.php delete mode 100644 resources/views/bo/pages/contents/edit.blade.php delete mode 100644 resources/views/bo/pages/contents/index.blade.php delete mode 100644 resources/views/bo/pages/faq-questions/create.blade.php delete mode 100644 resources/views/bo/pages/faq-questions/edit.blade.php delete mode 100644 resources/views/bo/pages/faq-questions/index.blade.php delete mode 100644 resources/views/bo/pages/faq-themes/create.blade.php delete mode 100644 resources/views/bo/pages/faq-themes/edit.blade.php delete mode 100644 resources/views/bo/pages/faq-themes/index.blade.php delete mode 100644 resources/views/bo/pages/gain-views/create.blade.php delete mode 100644 resources/views/bo/pages/gain-views/edit.blade.php delete mode 100644 resources/views/bo/pages/gain-views/index.blade.php delete mode 100644 resources/views/bo/pages/instant-win/index.blade.php delete mode 100644 resources/views/bo/pages/prizes/create.blade.php delete mode 100644 resources/views/bo/pages/prizes/edit.blade.php delete mode 100644 resources/views/bo/pages/prizes/index.blade.php delete mode 100644 resources/views/bo/pages/products/create.blade.php delete mode 100644 resources/views/bo/pages/products/edit.blade.php delete mode 100644 resources/views/bo/pages/products/index.blade.php delete mode 100644 resources/views/bo/pages/ranges/create.blade.php delete mode 100644 resources/views/bo/pages/ranges/edit.blade.php delete mode 100644 resources/views/bo/pages/ranges/index.blade.php delete mode 100644 resources/views/bo/pages/settings/edit.blade.php delete mode 100644 resources/views/bo/pages/winners-list/index.blade.php delete mode 100644 resources/views/errors_example/404.blade.php rename resources/views/{bo => }/layout.blade.php (95%) rename resources/views/{bo => }/layouts/footer.blade.php (100%) rename resources/views/{bo => }/layouts/head.blade.php (100%) rename resources/views/{bo => }/layouts/nav-menu.blade.php (100%) rename resources/views/{bo => }/mails/export-codes-unique-email.blade.php (100%) rename resources/views/{bo => }/mails/generate-end-email.blade.php (100%) rename resources/views/{bo => }/mails/job-failed.blade.php (100%) rename resources/views/{bo => }/modules/minicrud-form-inputs.blade.php (100%) rename resources/views/{bo => }/modules/pagination.blade.php (100%) rename resources/views/{bo => }/modules/search-bar.blade.php (100%) rename resources/views/{bo => }/modules/table-col-sorter.blade.php (100%) create mode 100644 resources/views/pages/banned-ips/create.blade.php create mode 100644 resources/views/pages/banned-ips/edit.blade.php rename resources/views/{bo => }/pages/banned-ips/form-inputs.blade.php (73%) create mode 100644 resources/views/pages/banned-ips/index.blade.php rename resources/views/{bo => }/pages/codes/form-inputs.blade.php (80%) create mode 100644 resources/views/pages/codes/index.blade.php rename resources/views/{bo => }/pages/codes/search-form.blade.php (100%) create mode 100644 resources/views/pages/codes/search.blade.php create mode 100644 resources/views/pages/contents/edit.blade.php rename resources/views/{bo => }/pages/contents/form-inputs.blade.php (64%) create mode 100644 resources/views/pages/contents/index.blade.php rename resources/views/{bo => }/pages/dashboard/index.blade.php (65%) create mode 100644 resources/views/pages/faq-questions/create.blade.php create mode 100644 resources/views/pages/faq-questions/edit.blade.php rename resources/views/{bo => }/pages/faq-questions/form-inputs.blade.php (81%) create mode 100644 resources/views/pages/faq-questions/index.blade.php create mode 100644 resources/views/pages/faq-themes/create.blade.php create mode 100644 resources/views/pages/faq-themes/edit.blade.php rename resources/views/{bo => }/pages/faq-themes/form-inputs.blade.php (74%) create mode 100644 resources/views/pages/faq-themes/index.blade.php create mode 100644 resources/views/pages/gain-views/create.blade.php create mode 100644 resources/views/pages/gain-views/edit.blade.php rename resources/views/{bo => }/pages/gain-views/form-inputs.blade.php (79%) create mode 100644 resources/views/pages/gain-views/index.blade.php create mode 100644 resources/views/pages/instant-win/index.blade.php create mode 100644 resources/views/pages/prizes/create.blade.php create mode 100644 resources/views/pages/prizes/edit.blade.php rename resources/views/{bo => }/pages/prizes/form-inputs.blade.php (85%) create mode 100644 resources/views/pages/prizes/index.blade.php create mode 100644 resources/views/pages/products/create.blade.php create mode 100644 resources/views/pages/products/edit.blade.php rename resources/views/{bo => }/pages/products/form-inputs.blade.php (82%) create mode 100644 resources/views/pages/products/index.blade.php create mode 100644 resources/views/pages/ranges/create.blade.php create mode 100644 resources/views/pages/ranges/edit.blade.php rename resources/views/{bo => }/pages/ranges/form-inputs.blade.php (77%) create mode 100644 resources/views/pages/ranges/index.blade.php create mode 100644 resources/views/pages/settings/edit.blade.php rename resources/views/{bo => }/pages/settings/form-inputs.blade.php (72%) create mode 100644 resources/views/pages/winners-list/index.blade.php rename resources/views/{bo => }/partials/inputs/bigint-foreign-id.blade.php (100%) rename resources/views/{bo => }/partials/inputs/date.blade.php (100%) rename resources/views/{bo => }/partials/inputs/int-color.blade.php (100%) rename resources/views/{bo => }/partials/inputs/int-number.blade.php (100%) rename resources/views/{bo => }/partials/inputs/pivot-belongsToMany.blade.php (100%) rename resources/views/{bo => }/partials/inputs/publish-dates.blade.php (100%) rename resources/views/{bo => }/partials/inputs/search-belongs-to-dropdown.blade.php (100%) rename resources/views/{bo => }/partials/inputs/select-multiple-enum.blade.php (100%) rename resources/views/{bo => }/partials/inputs/text-html.blade.php (100%) rename resources/views/{bo => }/partials/inputs/text-list-items.blade.php (100%) rename resources/views/{bo => }/partials/inputs/timestamp-datetime.blade.php (100%) rename resources/views/{bo => }/partials/inputs/tinyint-boolean.blade.php (100%) rename resources/views/{bo => }/partials/inputs/tinyint-enum.blade.php (100%) rename resources/views/{bo => }/partials/inputs/varchar-file.blade.php (100%) rename resources/views/{bo => }/partials/inputs/varchar-multiline.blade.php (100%) rename resources/views/{bo => }/partials/inputs/varchar-picture.blade.php (100%) rename resources/views/{bo => }/partials/inputs/varchar.blade.php (100%) diff --git a/app/Http/Controllers/Bo/Auth/LoginController.php b/app/Http/Controllers/Bo/Auth/LoginController.php index 59b4a71..fa9aff9 100644 --- a/app/Http/Controllers/Bo/Auth/LoginController.php +++ b/app/Http/Controllers/Bo/Auth/LoginController.php @@ -39,7 +39,7 @@ class LoginController extends Controller */ public function showLoginForm(): View { - return view('bo.auth.login'); + return view('back::auth.login'); } /** diff --git a/app/Http/Controllers/Bo/BannedIpController.php b/app/Http/Controllers/Bo/BannedIpController.php index 6c42e86..5d78c15 100644 --- a/app/Http/Controllers/Bo/BannedIpController.php +++ b/app/Http/Controllers/Bo/BannedIpController.php @@ -41,7 +41,7 @@ class BannedIpController extends Controller /** Custom pagination */ $bannedipModels = $this->customPaginate($bannedipModels, $request->pagination); - return view('bo.pages.banned-ips.index', compact('bannedipModels', 'search', 'searchFields')); + return view('back::pages.banned-ips.index', compact('bannedipModels', 'search', 'searchFields')); } /** @@ -52,7 +52,7 @@ class BannedIpController extends Controller */ public function create(BannedIp $bannedip): \Illuminate\Contracts\View\View { - return view('bo.pages.banned-ips.create', [ + return view('back::pages.banned-ips.create', [ 'bannedipModel' => $bannedip, ]); } @@ -93,7 +93,7 @@ class BannedIpController extends Controller */ public function edit(BannedIp $bannedip): \Illuminate\Contracts\View\View { - return view('bo.pages.banned-ips.edit', [ + return view('back::pages.banned-ips.edit', [ 'bannedipModel' => $bannedip, ]); } diff --git a/app/Http/Controllers/Bo/CodesController.php b/app/Http/Controllers/Bo/CodesController.php index 1a2a4b7..7d715c3 100644 --- a/app/Http/Controllers/Bo/CodesController.php +++ b/app/Http/Controllers/Bo/CodesController.php @@ -26,7 +26,7 @@ class CodesController extends Controller $nbCodeUsed = Code::where('code_used', 1)->count(); $nbCodeExported = Code::where('code_exported', 1)->count(); $nbCodeRemainingToExport = Code::where('code_exported', 0)->count(); - return view('bo.pages.codes.index', compact( + return view('back::pages.codes.index', compact( 'settings', 'nbCodeBase', 'nbCodeUsed', @@ -51,7 +51,7 @@ class CodesController extends Controller return back()->with( 'success', "La génération à commencée, un mail de notification sera envoyé à l'adresse " . - config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé." + config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé." ); } @@ -72,7 +72,7 @@ class CodesController extends Controller return back()->with( 'success', "L'export des codes à commencé, un mail de notification sera envoyé à l'adresse " . - config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé." + config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé." ); } @@ -99,6 +99,6 @@ class CodesController extends Controller \session()->flash('warning', trans('Code introuvable.')); } } - return view('bo.pages.codes.search', compact('code')); + return view('back::pages.codes.search', compact('code')); } } diff --git a/app/Http/Controllers/Bo/ContentController.php b/app/Http/Controllers/Bo/ContentController.php index 1453ffd..69f167f 100644 --- a/app/Http/Controllers/Bo/ContentController.php +++ b/app/Http/Controllers/Bo/ContentController.php @@ -45,7 +45,7 @@ class ContentController extends Controller /** Custom pagination */ $contentModels = $this->customPaginate($contentModels, $request->pagination); - return view('bo.pages.contents.index', compact('contentModels', 'search', 'searchFields')); + return view('back::pages.contents.index', compact('contentModels', 'search', 'searchFields')); } /** @@ -56,7 +56,7 @@ class ContentController extends Controller */ public function edit(Content $content): \Illuminate\Contracts\View\View { - return view('bo.pages.contents.edit', [ + return view('back::pages.contents.edit', [ 'contentModel' => $content, ]); } diff --git a/app/Http/Controllers/Bo/DashboardController.php b/app/Http/Controllers/Bo/DashboardController.php index 3acb76f..67f5bad 100644 --- a/app/Http/Controllers/Bo/DashboardController.php +++ b/app/Http/Controllers/Bo/DashboardController.php @@ -30,7 +30,7 @@ class DashboardController extends Controller $statsUnique[$dateUnique] = isset($statsUnique[$dateUnique]) ? $statsUnique[$dateUnique] + 1 : 1; } $participationsUnique = Participation::selectRaw("DISTINCT customer_id AS user, COUNT(*) AS count") - ->groupBy("user")->orderBy("user")->get(); + ->groupBy("user")->orderBy("user")->get(); // Données calculées à afficher. $totalParticipation = Participation::count(); @@ -68,7 +68,7 @@ class DashboardController extends Controller $date->addDay(); } - return view('bo.pages.dashboard.index', compact( + return view('back::pages.dashboard.index', compact( 'dates', 'count', 'countUnique', diff --git a/app/Http/Controllers/Bo/FaqQuestionsController.php b/app/Http/Controllers/Bo/FaqQuestionsController.php index 6ba10c1..caeedd2 100644 --- a/app/Http/Controllers/Bo/FaqQuestionsController.php +++ b/app/Http/Controllers/Bo/FaqQuestionsController.php @@ -47,7 +47,7 @@ class FaqQuestionsController extends Controller /** Custom pagination */ $faqQuestionModels = $this->customPaginate($faqQuestionModels, $request->pagination); - return view('bo.pages.faq-questions.index', compact('faqQuestionModels', 'search', 'searchFields')); + return view('back::pages.faq-questions.index', compact('faqQuestionModels', 'search', 'searchFields')); } /** @@ -59,7 +59,7 @@ class FaqQuestionsController extends Controller public function create(FaqQuestion $faqQuestion): \Illuminate\Contracts\View\View { $faqThemeModels = FaqTheme::all(); - return view('bo.pages.faq-questions.create', [ + return view('back::pages.faq-questions.create', [ 'faqQuestionModel' => $faqQuestion, 'faqThemeModels' => $faqThemeModels ]); @@ -105,7 +105,7 @@ class FaqQuestionsController extends Controller public function edit(FaqQuestion $faqQuestion): \Illuminate\Contracts\View\View { $faqThemeModels = FaqTheme::all(); - return view('bo.pages.faq-questions.edit', [ + return view('back::pages.faq-questions.edit', [ 'faqQuestionModel' => $faqQuestion, 'faqThemeModels' => $faqThemeModels ]); diff --git a/app/Http/Controllers/Bo/FaqThemesController.php b/app/Http/Controllers/Bo/FaqThemesController.php index 8c9da64..1843a0f 100644 --- a/app/Http/Controllers/Bo/FaqThemesController.php +++ b/app/Http/Controllers/Bo/FaqThemesController.php @@ -41,7 +41,7 @@ class FaqThemesController extends Controller /** Custom pagination */ $faqThemeModels = $this->customPaginate($faqThemeModels, $request->pagination); - return view('bo.pages.faq-themes.index', compact('faqThemeModels', 'search', 'searchFields')); + return view('back::pages.faq-themes.index', compact('faqThemeModels', 'search', 'searchFields')); } /** @@ -52,7 +52,7 @@ class FaqThemesController extends Controller */ public function create(FaqTheme $faqTheme): \Illuminate\Contracts\View\View { - return view('bo.pages.faq-themes.create', [ + return view('back::pages.faq-themes.create', [ 'faqThemeModel' => $faqTheme, ]); } @@ -96,7 +96,7 @@ class FaqThemesController extends Controller */ public function edit(FaqTheme $faqTheme): \Illuminate\Contracts\View\View { - return view('bo.pages.faq-themes.edit', [ + return view('back::pages.faq-themes.edit', [ 'faqThemeModel' => $faqTheme, ]); } diff --git a/app/Http/Controllers/Bo/GainViewController.php b/app/Http/Controllers/Bo/GainViewController.php index caeb071..cdd8e20 100644 --- a/app/Http/Controllers/Bo/GainViewController.php +++ b/app/Http/Controllers/Bo/GainViewController.php @@ -45,7 +45,7 @@ class GainViewController extends Controller /** Custom pagination */ $gainViewModels = $this->customPaginate($gainViewModels, $request->pagination); - return view('bo.pages.gain-views.index', compact('gainViewModels', 'search', 'searchFields')); + return view('back::pages.gain-views.index', compact('gainViewModels', 'search', 'searchFields')); } /** @@ -56,7 +56,7 @@ class GainViewController extends Controller */ public function create(GainView $gainView): \Illuminate\Contracts\View\View { - return view('bo.pages.gain-views.create', [ + return view('back::pages.gain-views.create', [ 'gainViewModel' => $gainView, ]); } @@ -97,7 +97,7 @@ class GainViewController extends Controller */ public function edit(GainView $gainView): \Illuminate\Contracts\View\View { - return view('bo.pages.gain-views.edit', [ + return view('back::pages.gain-views.edit', [ 'gainViewModel' => $gainView, ]); } diff --git a/app/Http/Controllers/Bo/InstantWinController.php b/app/Http/Controllers/Bo/InstantWinController.php index 361a7dc..7d795c9 100644 --- a/app/Http/Controllers/Bo/InstantWinController.php +++ b/app/Http/Controllers/Bo/InstantWinController.php @@ -32,7 +32,7 @@ class InstantWinController extends Controller $instantWin = InstantWin::orderBy('appear_date')->get(); - return view('bo.pages.instant-win.index', [ + return view('back::pages.instant-win.index', [ 'can_generate' => $canGenerate, 'instant_win' => $instantWin ]); diff --git a/app/Http/Controllers/Bo/PrizesController.php b/app/Http/Controllers/Bo/PrizesController.php index 56fbf24..4dd1e2c 100644 --- a/app/Http/Controllers/Bo/PrizesController.php +++ b/app/Http/Controllers/Bo/PrizesController.php @@ -47,7 +47,7 @@ class PrizesController extends Controller /** Custom pagination */ $prizeModels = $this->customPaginate($prizeModels, $request->pagination); - return view('bo.pages.prizes.index', compact('prizeModels', 'search', 'searchFields')); + return view('back::pages.prizes.index', compact('prizeModels', 'search', 'searchFields')); } /** @@ -59,7 +59,7 @@ class PrizesController extends Controller public function create(Prize $prize): \Illuminate\Contracts\View\View { $gainViewModels = GainView::all(); - return view('bo.pages.prizes.create', [ + return view('back::pages.prizes.create', [ 'prizeModel' => $prize, 'gainViewModels' => $gainViewModels ]); @@ -102,7 +102,7 @@ class PrizesController extends Controller public function edit(Prize $prize): \Illuminate\Contracts\View\View { $gainViewModels = GainView::all(); - return view('bo.pages.prizes.edit', [ + return view('back::pages.prizes.edit', [ 'prizeModel' => $prize, 'gainViewModels' => $gainViewModels ]); diff --git a/app/Http/Controllers/Bo/ProductsController.php b/app/Http/Controllers/Bo/ProductsController.php index 00ed543..489b130 100644 --- a/app/Http/Controllers/Bo/ProductsController.php +++ b/app/Http/Controllers/Bo/ProductsController.php @@ -49,7 +49,7 @@ class ProductsController extends Controller /** Custom pagination */ $productModels = $this->customPaginate($productModels, $request->pagination); - return view('bo.pages.products.index', compact('productModels', 'search', 'searchFields')); + return view('back::pages.products.index', compact('productModels', 'search', 'searchFields')); } /** @@ -63,12 +63,12 @@ class ProductsController extends Controller $rangeModels = Range::all(); if (!count($rangeModels)) { return \redirect()->route('bo.ranges.index') - ->with( - 'error', - 'Vous devez ajouter une gamme avant de pouvoir ajouter un produit' - ); + ->with( + 'error', + 'Vous devez ajouter une gamme avant de pouvoir ajouter un produit' + ); } - return view('bo.pages.products.create', [ + return view('back::pages.products.create', [ 'productModel' => $product, 'rangeModels' => $rangeModels ]); @@ -111,7 +111,7 @@ class ProductsController extends Controller public function edit(Product $product): \Illuminate\Contracts\View\View { $rangeModels = Range::all(); - return view('bo.pages.products.edit', [ + return view('back::pages.products.edit', [ 'productModel' => $product, 'rangeModels' => $rangeModels ]); diff --git a/app/Http/Controllers/Bo/RangeController.php b/app/Http/Controllers/Bo/RangeController.php index 2dd5955..932ad36 100644 --- a/app/Http/Controllers/Bo/RangeController.php +++ b/app/Http/Controllers/Bo/RangeController.php @@ -41,7 +41,7 @@ class RangeController extends Controller /** Custom pagination */ $rangeModels = $this->customPaginate($rangeModels, $request->pagination); - return view('bo.pages.ranges.index', compact('rangeModels', 'search', 'searchFields')); + return view('back::pages.ranges.index', compact('rangeModels', 'search', 'searchFields')); } /** @@ -52,7 +52,7 @@ class RangeController extends Controller */ public function create(Range $range): \Illuminate\Contracts\View\View { - return view('bo.pages.ranges.create', [ + return view('back::pages.ranges.create', [ 'rangeModel' => $range, ]); } @@ -93,7 +93,7 @@ class RangeController extends Controller */ public function edit(Range $range): \Illuminate\Contracts\View\View { - return view('bo.pages.ranges.edit', [ + return view('back::pages.ranges.edit', [ 'rangeModel' => $range ]); } diff --git a/app/Http/Controllers/Bo/SettingsController.php b/app/Http/Controllers/Bo/SettingsController.php index 2e3fff9..78d3fb9 100644 --- a/app/Http/Controllers/Bo/SettingsController.php +++ b/app/Http/Controllers/Bo/SettingsController.php @@ -19,7 +19,7 @@ class SettingsController extends Controller */ public function edit(Settings $settings): \Illuminate\Contracts\View\View { - return view('bo.pages.settings.edit', [ + return view('back::pages.settings.edit', [ 'settingsModel' => $settings ]); } diff --git a/app/Http/Controllers/Bo/WinnersListController.php b/app/Http/Controllers/Bo/WinnersListController.php index d4dd72b..3692472 100644 --- a/app/Http/Controllers/Bo/WinnersListController.php +++ b/app/Http/Controllers/Bo/WinnersListController.php @@ -28,7 +28,7 @@ class WinnersListController extends Controller $settings = Settings::select('use_ean_codes', 'winning_proof')->first(); - return view('bo.pages.winners-list.index', compact( + return view('back::pages.winners-list.index', compact( 'participationModels', 'settings' )); diff --git a/app/Mail/CodeGenerationEnd.php b/app/Mail/CodeGenerationEnd.php index b851a69..c472db6 100644 --- a/app/Mail/CodeGenerationEnd.php +++ b/app/Mail/CodeGenerationEnd.php @@ -46,7 +46,7 @@ class CodeGenerationEnd extends Mailable public function build() { return $this->subject('Fin de génération des codes uniques') - ->view('bo.mails.generate-end-email') - ->with(['quantity' => $this->quantity, 'gameName' => $this->gameName]); + ->view('back::mails.generate-end-email') + ->with(['quantity' => $this->quantity, 'gameName' => $this->gameName]); } } diff --git a/app/Mail/ExportCodesUniques.php b/app/Mail/ExportCodesUniques.php index a498d12..288c967 100644 --- a/app/Mail/ExportCodesUniques.php +++ b/app/Mail/ExportCodesUniques.php @@ -60,6 +60,6 @@ class ExportCodesUniques extends Mailable implements ShouldQueue $nbCodeTot = $this->nbCodeTot; $nbCodeLigne = $this->nbCodeLigne; return $this->subject("Fin de l'export des codes uniques pour " . app(Settings::class)->name) - ->view('bo.mails.export-codes-unique-email', compact('nbCodeFic', 'nbCodeTot', 'nbCodeLigne')); + ->view('back::mails.export-codes-unique-email', compact('nbCodeFic', 'nbCodeTot', 'nbCodeLigne')); } } diff --git a/app/Mail/JobFailed.php b/app/Mail/JobFailed.php index 2d8efaf..c4189c7 100644 --- a/app/Mail/JobFailed.php +++ b/app/Mail/JobFailed.php @@ -37,6 +37,6 @@ class JobFailed extends Mailable public function build() { return $this->subject('[JOB FAILED] Une erreur est survenue pendant le job : ' . $this->job) - ->view('bo.mails.job-failed'); + ->view('back::mails.job-failed'); } } diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index 08daede..3d88c35 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -20,6 +20,11 @@ class ViewServiceProvider extends ServiceProvider */ public function boot() { + // * View shares + // ! Add view file pathes (also needed for console xml job). + View::addNamespace('back', resource_path('views')); + View::addNamespace('theme', resource_path('theme/views')); + if (!app()->runningInConsole()) { $appInfos = Cache::remember('composer', 3600, function () { return json_decode(File::get(\app_path('../composer.json'))); @@ -28,7 +33,7 @@ class ViewServiceProvider extends ServiceProvider View::share('version', $appInfos->version); View::share('license', $appInfos->license); // * FORCE BOOTSTRAP PAGINATOR - Paginator::defaultView('bo.modules.pagination'); + Paginator::defaultView('back::modules.pagination'); // On ramène le nom du jeu et le nom de la société sur toute les pages. $settingsGlobal = Cache::get('settingsGlobal'); diff --git a/config/mail.php b/config/mail.php index 81b4084..3ca5af0 100644 --- a/config/mail.php +++ b/config/mail.php @@ -118,6 +118,9 @@ return [ 'theme' => 'default', 'paths' => [ + // * For custom compiled css. + public_path('build/theme/css/mail'), + // * For generic customized blade (moteur seulement) resource_path('views/vendor/mail'), ], ], diff --git a/config/theme.php b/config/theme.php index 7c73ea4..d2be942 100644 --- a/config/theme.php +++ b/config/theme.php @@ -1,6 +1,15 @@ 500, - 'product_image_maxheight' => 500 -]; +return array_replace_recursive( + [ + 'theme_name' => 'basic', + 'site_name' => 'Gen Game Web Basic', + 'models' => [ + 'product' => [ + 'picture_maxwidth' => 500, + 'picture_maxheight' => 500, + ] + ], + ], + require(resource_path('theme/mounted/theme.config.php')), +); diff --git a/resources/theme b/resources/theme deleted file mode 120000 index d3c1234..0000000 --- a/resources/theme +++ /dev/null @@ -1 +0,0 @@ -../../gen-game-web-themes-dir/theme-merger \ No newline at end of file diff --git a/resources/theme b/resources/theme new file mode 160000 index 0000000..c1a097e --- /dev/null +++ b/resources/theme @@ -0,0 +1 @@ +Subproject commit c1a097e3a7f94ad254529e468108043c9fab37a1 diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..41b4140 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,68 @@ +@extends('back::layout') +@section('title', __('Authentification')) +@section('description', __('Formulaire d\'authentification au back-office.')) + +@section('content') +
      +
      +
      +
      +
      {{ __('Connexion') }}
      +
      +
      + @csrf +
      + +
      + + @error('email') + + {{ $message }} + + @enderror +
      +
      +
      + +
      + + @error('password') + + {{ $message }} + + @enderror +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + + @if (Route::has('bo.password.request')) + + {{ __('Mot de passe oublié ?') }} + + @endif +
      +
      +
      +
      +
      +
      +
      +
      +@endsection diff --git a/resources/views/bo/auth/login.blade.php b/resources/views/bo/auth/login.blade.php deleted file mode 100644 index 1731442..0000000 --- a/resources/views/bo/auth/login.blade.php +++ /dev/null @@ -1,67 +0,0 @@ -@extends('bo.layout') -@section('title', __('Authentification')) -@section('description', __('Formulaire d\'authentification au back-office.')) - -@section('content') -
      -
      -
      -
      -
      {{ __('Connexion') }}
      -
      -
      - @csrf -
      - -
      - - @error('email') - - {{ $message }} - - @enderror -
      -
      -
      - -
      - - @error('password') - - {{ $message }} - - @enderror -
      -
      -
      -
      -
      - - -
      -
      -
      -
      -
      - - @if (Route::has('bo.password.request')) - - {{ __('Mot de passe oublié ?') }} - - @endif -
      -
      -
      -
      -
      -
      -
      -
      -@endsection diff --git a/resources/views/bo/modules/flash-messages.blade.php b/resources/views/bo/modules/flash-messages.blade.php deleted file mode 100644 index 6a499dc..0000000 --- a/resources/views/bo/modules/flash-messages.blade.php +++ /dev/null @@ -1,45 +0,0 @@ -@if(!request()->routeIs('login')) - @if ($message = Session::get('success', Session::get('bo.success'))) - - @endif - - @if ($message = Session::get('error', Session::get('bo.error'))) - - @endif - - - @if ($message = Session::get('warning', Session::get('bo.warning'))) - - @endif - - - @if ($message = Session::get('info', Session::get('bo.info'))) - - @endif - - - @if ($errors->any()) - - @endif -@endif diff --git a/resources/views/bo/pages/banned-ips/create.blade.php b/resources/views/bo/pages/banned-ips/create.blade.php deleted file mode 100644 index 46039f5..0000000 --- a/resources/views/bo/pages/banned-ips/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $bannedipModel]) - -@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.bannedips'))])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.bannedips'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $bannedipModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.banned-ips.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/banned-ips/edit.blade.php b/resources/views/bo/pages/banned-ips/edit.blade.php deleted file mode 100644 index b6dd664..0000000 --- a/resources/views/bo/pages/banned-ips/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $bannedipModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.bannedips'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.bannedips'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $bannedipModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.banned-ips.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/banned-ips/index.blade.php b/resources/views/bo/pages/banned-ips/index.blade.php deleted file mode 100644 index ef3a238..0000000 --- a/resources/views/bo/pages/banned-ips/index.blade.php +++ /dev/null @@ -1,64 +0,0 @@ -@extends('bo.layout') - -@section('title', __('models.classes.bannedips')) -@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.bannedips')])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($bannedipModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'ip' => Str::ucfirst(__('validation.attributes.ip')), - ], - ]) - - - @foreach ($bannedipModels as $bannedipModel) - - - - - @endforeach - - @else - - - - @endif -
      {{ $bannedipModel->ip }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.bannedips'))]) }}
      -{!! $bannedipModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/codes/index.blade.php b/resources/views/bo/pages/codes/index.blade.php deleted file mode 100644 index 540db4a..0000000 --- a/resources/views/bo/pages/codes/index.blade.php +++ /dev/null @@ -1,100 +0,0 @@ -@extends('bo.layout') - -@section('content') -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - -
      -@include('bo.pages.codes.search-form') -
      -
      - @csrf -
      -

      {{__('Nombre de code(s)') }}

      -
        -
      • {{ __('en base') }} : {{$nbCodeBase}}
      • -
      • {{ __('utilisé(s)') }} : {{$nbCodeUsed}}
      • -
      • {{ __('déjà exporté(s)') }} : {{ $nbCodeExported }}
      • -
      • {{ __('restant à exporté(s)') }} : {{$nbCodeRemainingToExport}}
      • -
      -
      - @include('bo.pages.codes.form-inputs') - {{ __('Il est possible de générer') }} 0 {{ __('codes uniques.') }}
      - {{ __('!! Si la longueur des codes est changé l\'export pourra prendre plus de temps. !!') }} -
      - -
      - - - -@endsection - -@push('scripts') - -@endpush diff --git a/resources/views/bo/pages/codes/search.blade.php b/resources/views/bo/pages/codes/search.blade.php deleted file mode 100644 index 92919e0..0000000 --- a/resources/views/bo/pages/codes/search.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -@extends('bo.layout') - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') -
      -@include('bo.pages.codes.search-form') -
      -@if(!$code) -{{ __('Veuillez entrer un code ci-dessus pour en obtenir les informations.') }} -@else -

      {{ __('Voici l\'état du code trouvé') }}

      -

      {{ __('Code : :code', ['code' => request()->code]) }}

      -

      {{ __('ID : :id', ['id' => $code->id]) }}

      -

      {{ __('Utilisé ? : :used', ['used' => $code->code_used ? 'OUI' : 'NON']) }}

      -

      {{ __('Exporté ? : :exported', ['exported' => $code->code_exported ? 'OUI' : 'NON']) }}

      -

      {{ __('Créé le : :date_creation', ['date_creation' => $code->date_creation]) }}

      -@endif -@endsection diff --git a/resources/views/bo/pages/contents/edit.blade.php b/resources/views/bo/pages/contents/edit.blade.php deleted file mode 100644 index c69cdfb..0000000 --- a/resources/views/bo/pages/contents/edit.blade.php +++ /dev/null @@ -1,52 +0,0 @@ -@extends('bo.layout', ['brParam' => $contentModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.contents'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.contents'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $contentModel]) -
      -
      -
      - @csrf - @method('PUT') - -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.contents.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/contents/index.blade.php b/resources/views/bo/pages/contents/index.blade.php deleted file mode 100644 index e97b9b6..0000000 --- a/resources/views/bo/pages/contents/index.blade.php +++ /dev/null @@ -1,45 +0,0 @@ -@extends('bo.layout') - -@section('title', __('models.classes.contents')) -@section('description', __('Liste de tous les :model', ['model' => __('models.classes.contents')])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') -
      -@include('bo.modules.search-bar') - - @if (count($contentModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'key' => Str::ucfirst(__('validation.attributes.name')), - 'value' => Str::ucfirst(__('validation.attributes.value')), - ], - ]) - - - @foreach ($contentModels as $contentModel) - - - - - - @endforeach - - @else - - - - @endif -
      {{ $contentModel->key }}{!! Str::limit($contentModel->value, 150, '...') !!} - - - -
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.contents'))]) }}
      -{!! $contentModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/faq-questions/create.blade.php b/resources/views/bo/pages/faq-questions/create.blade.php deleted file mode 100644 index 0bc875b..0000000 --- a/resources/views/bo/pages/faq-questions/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $faqQuestionModel]) - -@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.faq-questions.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/faq-questions/edit.blade.php b/resources/views/bo/pages/faq-questions/edit.blade.php deleted file mode 100644 index 3869a84..0000000 --- a/resources/views/bo/pages/faq-questions/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $faqQuestionModel]) - -@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.faq-questions', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.faq-questions.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/faq-questions/index.blade.php b/resources/views/bo/pages/faq-questions/index.blade.php deleted file mode 100644 index aa5a18a..0000000 --- a/resources/views/bo/pages/faq-questions/index.blade.php +++ /dev/null @@ -1,68 +0,0 @@ -@extends('bo.layout') - -@section('title', trans_choice('models.classes.faq-questions', 2)) -@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.faq-questions', 2)])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($faqQuestionModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'question' => Str::ucfirst(__('validation.attributes.question')), - 'answer' => Str::ucfirst(__('validation.attributes.answer')), - 'theme_id' => Str::ucfirst(__('validation.attributes.theme')), - ], - ]) - - - @foreach ($faqQuestionModels as $faqQuestionModel) - - - - - - - @endforeach - - @else - - - - @endif -
      {{ $faqQuestionModel->question }}{{ $faqQuestionModel->answer }}{{ $faqQuestionModel->theme->name }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.faq-questions', 1)]) }}
      -{!! $faqQuestionModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/faq-themes/create.blade.php b/resources/views/bo/pages/faq-themes/create.blade.php deleted file mode 100644 index b4f1a71..0000000 --- a/resources/views/bo/pages/faq-themes/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $faqThemeModel]) - -@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.faq-themes.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/faq-themes/edit.blade.php b/resources/views/bo/pages/faq-themes/edit.blade.php deleted file mode 100644 index 96f5070..0000000 --- a/resources/views/bo/pages/faq-themes/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $faqThemeModel]) - -@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.faq-themes', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.faq-themes.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/faq-themes/index.blade.php b/resources/views/bo/pages/faq-themes/index.blade.php deleted file mode 100644 index 39887c0..0000000 --- a/resources/views/bo/pages/faq-themes/index.blade.php +++ /dev/null @@ -1,64 +0,0 @@ -@extends('bo.layout') - -@section('title', trans_choice('models.classes.faq-themes', 2)) -@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.faq-themes', 2)])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($faqThemeModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'name' => Str::ucfirst(__('validation.attributes.name')), - ], - ]) - - - @foreach ($faqThemeModels as $faqThemeModel) - - - - - @endforeach - - @else - - - - @endif -
      {{ $faqThemeModel->name }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.faq-themes', 1)]) }}
      -{!! $faqThemeModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/gain-views/create.blade.php b/resources/views/bo/pages/gain-views/create.blade.php deleted file mode 100644 index a7ccb67..0000000 --- a/resources/views/bo/pages/gain-views/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $gainViewModel]) - -@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.gain-views', 1)])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.gain-views', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.gain-views.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/gain-views/edit.blade.php b/resources/views/bo/pages/gain-views/edit.blade.php deleted file mode 100644 index 5e24141..0000000 --- a/resources/views/bo/pages/gain-views/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $gainViewModel]) - -@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.gain-views', 1)])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.gain-views', 1)])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.gain-views.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/gain-views/index.blade.php b/resources/views/bo/pages/gain-views/index.blade.php deleted file mode 100644 index c78bb30..0000000 --- a/resources/views/bo/pages/gain-views/index.blade.php +++ /dev/null @@ -1,66 +0,0 @@ -@extends('bo.layout') - -@section('title', trans_choice('models.classes.gain-views', 2)) -@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.gain-views', 2)])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($gainViewModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'name' => Str::ucfirst(__('validation.attributes.name')), - 'file_name' => Str::ucfirst(__('validation.attributes.file_name')), - ], - ]) - - - @foreach ($gainViewModels as $gainViewModel) - - - - - - @endforeach - - @else - - - - @endif -
      {{ $gainViewModel->name }}{{ $gainViewModel->file_name }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.gain-views', 1)]) }}
      -{!! $gainViewModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/instant-win/index.blade.php b/resources/views/bo/pages/instant-win/index.blade.php deleted file mode 100644 index e8c7557..0000000 --- a/resources/views/bo/pages/instant-win/index.blade.php +++ /dev/null @@ -1,11 +0,0 @@ -@extends('bo.layout') - -@section('content') - @php - $data = [ - 'cangenerate' => $can_generate, - 'instantwin' => $instant_win - ] - @endphp -
      -@endsection diff --git a/resources/views/bo/pages/prizes/create.blade.php b/resources/views/bo/pages/prizes/create.blade.php deleted file mode 100644 index 0129cdb..0000000 --- a/resources/views/bo/pages/prizes/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $prizeModel]) - -@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.prizes'))])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.prizes'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.prizes.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/prizes/edit.blade.php b/resources/views/bo/pages/prizes/edit.blade.php deleted file mode 100644 index 1e45fd8..0000000 --- a/resources/views/bo/pages/prizes/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $prizeModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.prizes'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.prizes'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.prizes.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/prizes/index.blade.php b/resources/views/bo/pages/prizes/index.blade.php deleted file mode 100644 index e7a95dd..0000000 --- a/resources/views/bo/pages/prizes/index.blade.php +++ /dev/null @@ -1,85 +0,0 @@ -@extends('bo.layout') - -@section('title', __('models.classes.prizes')) -@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.prizes')])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($prizeModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'label_one' => Str::ucfirst(__('validation.attributes.label_one')), - 'quantity' => Str::ucfirst(__('validation.attributes.quantity')), - 'need_proof' => Str::ucfirst(__('validation.attributes.need_proof')), - 'gain_view_id' => Str::ucfirst(trans_choice('models.classes.gain-views', 1)), - ], - ]) - - - @foreach ($prizeModels as $prizeModel) - - - - - - - - @endforeach - - @else - - - - @endif -
      {{ $prizeModel->label_one }}{{ $prizeModel->quantity }} - @if ($prizeModel->need_proof) - - @else - - @endif - - - {{ $prizeModel->gainView->name }} - - -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.prizes'))]) }}
      -{!! $prizeModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/products/create.blade.php b/resources/views/bo/pages/products/create.blade.php deleted file mode 100644 index 59e00eb..0000000 --- a/resources/views/bo/pages/products/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $productModel]) - -@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.products'))])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.products'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.products.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/products/edit.blade.php b/resources/views/bo/pages/products/edit.blade.php deleted file mode 100644 index 494b0db..0000000 --- a/resources/views/bo/pages/products/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $productModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.products'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.products'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.products.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/products/index.blade.php b/resources/views/bo/pages/products/index.blade.php deleted file mode 100644 index bf06927..0000000 --- a/resources/views/bo/pages/products/index.blade.php +++ /dev/null @@ -1,70 +0,0 @@ -@extends('bo.layout') - -@section('title', __('models.classes.products')) -@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.products')])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($productModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'name' => Str::ucfirst(__('validation.attributes.name')), - 'no_art' => Str::ucfirst(__('validation.attributes.no_art')), - 'code_ean' => Str::ucfirst(__('validation.attributes.ean_code')), - 'range_id' => Str::ucfirst(__('models.classes.ranges')), - ], - ]) - - - @foreach ($productModels as $productModel) - - - - - - - - @endforeach - - @else - - - - @endif -
      {{ $productModel->name }}{{ $productModel->no_art }}{{ $productModel->code_ean }}{{ $productModel->range->name }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.products'))]) }}
      -{!! $productModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/ranges/create.blade.php b/resources/views/bo/pages/ranges/create.blade.php deleted file mode 100644 index 29d0651..0000000 --- a/resources/views/bo/pages/ranges/create.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@extends('bo.layout', ['brParam' => $rangeModel]) - -@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.ranges'))])) -@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.ranges'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) -
      -
      - -
      -
      -
      - @csrf - @include('bo.pages.ranges.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/ranges/edit.blade.php b/resources/views/bo/pages/ranges/edit.blade.php deleted file mode 100644 index cf5f7ab..0000000 --- a/resources/views/bo/pages/ranges/edit.blade.php +++ /dev/null @@ -1,62 +0,0 @@ -@extends('bo.layout', ['brParam' => $rangeModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.ranges'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.ranges'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - - - - @include('breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) -
      -
      -
      - @csrf - @method('DELETE') -
      - - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.ranges.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/ranges/index.blade.php b/resources/views/bo/pages/ranges/index.blade.php deleted file mode 100644 index 2f632b5..0000000 --- a/resources/views/bo/pages/ranges/index.blade.php +++ /dev/null @@ -1,64 +0,0 @@ -@extends('bo.layout') - -@section('title', __('models.classes.ranges')) -@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.ranges')])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') - - - -
      -@include('bo.modules.search-bar') - - @if (count($rangeModels) > 0) - - @include('bo.modules.table-col-sorter', [ - 'cols' => [ - 'name' => Str::ucfirst(__('validation.attributes.name')), - ], - ]) - - - @foreach ($rangeModels as $rangeModel) - - - - - @endforeach - - @else - - - - @endif -
      {{ $rangeModel->name }} -
      - - - - @csrf - @method('DELETE') - -
      -
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.ranges'))]) }}
      -{!! $rangeModels->links() !!} -@endsection diff --git a/resources/views/bo/pages/settings/edit.blade.php b/resources/views/bo/pages/settings/edit.blade.php deleted file mode 100644 index 1ea32e7..0000000 --- a/resources/views/bo/pages/settings/edit.blade.php +++ /dev/null @@ -1,48 +0,0 @@ -@extends('bo.layout', ['brParam' => $settingsModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.settings'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.settings'))])) -@section('breadcrumb', request()->route()->getName()) - -@section('content') -
      -
      - @include('breadcrumbs.breadcrumb-body', ['brParam' => $settingsModel]) -
      -
      -
      - @csrf - @method('PUT') -
      - -
      -
      -
      -
      -
      - @csrf - @method('PUT') - @include('bo.pages.settings.form-inputs') -
      -
      - -
      -
      -
      -@endsection diff --git a/resources/views/bo/pages/winners-list/index.blade.php b/resources/views/bo/pages/winners-list/index.blade.php deleted file mode 100644 index 50d1e52..0000000 --- a/resources/views/bo/pages/winners-list/index.blade.php +++ /dev/null @@ -1,72 +0,0 @@ -@extends('bo.layout') - -@section('title', __('models.classes.winners')) -@section('description', __('Liste de tous les :model', ['model' => __('models.classes.winners')])) - -@section('content') -
      - @include('breadcrumbs.breadcrumb-body') -
      - - @if (count($participationModels) > 0) - - @php - $cols = [ - 'created_at' => __('Date participation'), - 'prize' => __('Lot'), - 'email' => __('Email') - ]; - if ($settings->use_ean_codes === 1) { - $cols['code_ean_id'] = __('Code EAN'); - } - $cols['code_unique_id'] = __('Code unique'); - if ($settings->winning_proof === 1) { - $cols['sticker'] = __('Sticker'); - $cols['barcode'] = __('Code barre'); - $cols['ticket'] = __('Ticket'); - } - @endphp - @include('bo.modules.table-col-sorter', [ - 'cols' => $cols, - 'ignore' => ['sticker', 'barcode', 'ticket'] - ]) - - - @foreach ($participationModels as $participationModel) - - - - - @if ($settings->use_ean_codes) - - @endif - - @if ($settings->winning_proof === 1) - @if ($participationModel->sticker !== null) - - @else - - @endif - @if ($participationModel->barcode !== null) - - @else - - @endif - @if ($participationModel->ticket !== null) - - @else - - @endif - @endif - - - @endforeach - - @else - - - - @endif -
      {{ \Carbon\Carbon::parse($participationModel->created_at)->format('d/m/Y à H:i') }}{{$participationModel->instantWin()->first()->prize->label_one}}{{$participationModel->customer->email}}{{$participationModel->codeEan}}{{$participationModel->code->code_unique}}Voir-Voir-Voir-
      {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.winners'))]) }}
      -{!! $participationModels->links() !!} -@endsection diff --git a/resources/views/errors_example/404.blade.php b/resources/views/errors_example/404.blade.php deleted file mode 100644 index b5d5da1..0000000 --- a/resources/views/errors_example/404.blade.php +++ /dev/null @@ -1,13 +0,0 @@ -@extends('front.basic.layout') - -@section('title', 'Erreur 404') - -@section('content') -
      -

      Page non trouvée

      -

      La page que vous recherchez n'existe pas.

      -
      -

      Cliquez sur le bouton ci-dessous pour retourner à l'accueil.

      - Accueil -
      -@endsection diff --git a/resources/views/bo/layout.blade.php b/resources/views/layout.blade.php similarity index 95% rename from resources/views/bo/layout.blade.php rename to resources/views/layout.blade.php index 4e9caf3..5ed290a 100644 --- a/resources/views/bo/layout.blade.php +++ b/resources/views/layout.blade.php @@ -2,7 +2,7 @@ - @include('bo.layouts.head') + @include('back::layouts.head') @@ -18,7 +18,7 @@
      - @include('bo.layouts.footer') + @include('back::layouts.footer') @stack('scripts-constants') - @include('modules.script-constants') + @include('modules.script-routes') @vite(['resources/ts/bo/bo.ts']) @stack('scripts') diff --git a/resources/views/bo/layouts/footer.blade.php b/resources/views/layouts/footer.blade.php similarity index 100% rename from resources/views/bo/layouts/footer.blade.php rename to resources/views/layouts/footer.blade.php diff --git a/resources/views/bo/layouts/head.blade.php b/resources/views/layouts/head.blade.php similarity index 100% rename from resources/views/bo/layouts/head.blade.php rename to resources/views/layouts/head.blade.php diff --git a/resources/views/bo/layouts/nav-menu.blade.php b/resources/views/layouts/nav-menu.blade.php similarity index 100% rename from resources/views/bo/layouts/nav-menu.blade.php rename to resources/views/layouts/nav-menu.blade.php diff --git a/resources/views/bo/mails/export-codes-unique-email.blade.php b/resources/views/mails/export-codes-unique-email.blade.php similarity index 100% rename from resources/views/bo/mails/export-codes-unique-email.blade.php rename to resources/views/mails/export-codes-unique-email.blade.php diff --git a/resources/views/bo/mails/generate-end-email.blade.php b/resources/views/mails/generate-end-email.blade.php similarity index 100% rename from resources/views/bo/mails/generate-end-email.blade.php rename to resources/views/mails/generate-end-email.blade.php diff --git a/resources/views/bo/mails/job-failed.blade.php b/resources/views/mails/job-failed.blade.php similarity index 100% rename from resources/views/bo/mails/job-failed.blade.php rename to resources/views/mails/job-failed.blade.php diff --git a/resources/views/modules/input-error.blade.php b/resources/views/modules/input-error.blade.php index 8781d93..5a17ab3 100644 --- a/resources/views/modules/input-error.blade.php +++ b/resources/views/modules/input-error.blade.php @@ -4,5 +4,5 @@ @endif @if(isset($helper)) -{{ $helper }} +{{ $helper }} @endif diff --git a/resources/views/bo/modules/minicrud-form-inputs.blade.php b/resources/views/modules/minicrud-form-inputs.blade.php similarity index 100% rename from resources/views/bo/modules/minicrud-form-inputs.blade.php rename to resources/views/modules/minicrud-form-inputs.blade.php diff --git a/resources/views/bo/modules/pagination.blade.php b/resources/views/modules/pagination.blade.php similarity index 100% rename from resources/views/bo/modules/pagination.blade.php rename to resources/views/modules/pagination.blade.php diff --git a/resources/views/modules/script-constants.blade.php b/resources/views/modules/script-constants.blade.php index ea82742..16d5d9d 100644 --- a/resources/views/modules/script-constants.blade.php +++ b/resources/views/modules/script-constants.blade.php @@ -1,4 +1,4 @@ - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/banned-ips/index.blade.php b/resources/views/pages/banned-ips/index.blade.php new file mode 100644 index 0000000..9c80305 --- /dev/null +++ b/resources/views/pages/banned-ips/index.blade.php @@ -0,0 +1,55 @@ +@extends('back::layout') + +@section('title', __('models.classes.bannedips')) +@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.bannedips')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($bannedipModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'ip' => Str::ucfirst(__('validation.attributes.ip')), + ], + ]) + + + @foreach ($bannedipModels as $bannedipModel) + + + + + @endforeach + + @else + + + + @endif +
      {{ $bannedipModel->ip }} +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.bannedips'))]) }}
      + {!! $bannedipModels->links() !!} +@endsection diff --git a/resources/views/bo/pages/codes/form-inputs.blade.php b/resources/views/pages/codes/form-inputs.blade.php similarity index 80% rename from resources/views/bo/pages/codes/form-inputs.blade.php rename to resources/views/pages/codes/form-inputs.blade.php index 126ed45..b3261b4 100644 --- a/resources/views/bo/pages/codes/form-inputs.blade.php +++ b/resources/views/pages/codes/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- QUANTITY --}}
      -
      +
      {{ __('Nombre de codes à générer') }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'codeGenerationQuantity', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.quantity')), @@ -17,9 +17,9 @@ 'attribute' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.quantity')), ]), - 'min' => 1 + 'min' => 1, ]), - 'min' => 1 + 'min' => 1, ])
      @@ -27,11 +27,11 @@
      {{-- CODE_LENGTH --}}
      -
      +
      {{ __('Longueur des codes') }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'codeGenerationLength', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.code_length')), @@ -39,15 +39,15 @@ 'name' => 'code_length', 'required' => true, 'readonly' => true, - 'value' => $settings->code_length ?? config('codes.codeLength'), + 'value' => $settings->code_length ?? config('codes.codeLength'), 'model' => null, 'helper' => __('validation.min.numeric', [ 'attribute' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.code_length')), ]), - 'min' => 1 + 'min' => 1, ]), - 'min' => 1 + 'min' => 1, ])
      diff --git a/resources/views/pages/codes/index.blade.php b/resources/views/pages/codes/index.blade.php new file mode 100644 index 0000000..de97f41 --- /dev/null +++ b/resources/views/pages/codes/index.blade.php @@ -0,0 +1,100 @@ +@extends('back::layout') + +@section('content') +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + +
      + @include('back::pages.codes.search-form') +
      +
      + @csrf +
      +

      {{ __('Nombre de code(s)') }}

      +
        +
      • {{ __('en base') }} : {{ $nbCodeBase }}
      • +
      • {{ __('utilisé(s)') }} : {{ $nbCodeUsed }}
      • +
      • {{ __('déjà exporté(s)') }} : {{ $nbCodeExported }}
      • +
      • {{ __('restant à exporté(s)') }} : {{ $nbCodeRemainingToExport }}
      • +
      +
      + @include('back::pages.codes.form-inputs') + {{ __('Il est possible de générer') }} 0 {{ __('codes uniques.') }}
      + {{ __('!! Si la longueur des codes est changé l\'export pourra prendre plus de temps. !!') }} +
      + +
      + + + +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/bo/pages/codes/search-form.blade.php b/resources/views/pages/codes/search-form.blade.php similarity index 100% rename from resources/views/bo/pages/codes/search-form.blade.php rename to resources/views/pages/codes/search-form.blade.php diff --git a/resources/views/pages/codes/search.blade.php b/resources/views/pages/codes/search.blade.php new file mode 100644 index 0000000..cefa536 --- /dev/null +++ b/resources/views/pages/codes/search.blade.php @@ -0,0 +1,19 @@ +@extends('back::layout') + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') +
      + @include('back::pages.codes.search-form') +
      + @if (!$code) + {{ __('Veuillez entrer un code ci-dessus pour en obtenir les informations.') }} + @else +

      {{ __('Voici l\'état du code trouvé') }}

      +

      {{ __('Code : :code', ['code' => request()->code]) }}

      +

      {{ __('ID : :id', ['id' => $code->id]) }}

      +

      {{ __('Utilisé ? : :used', ['used' => $code->code_used ? 'OUI' : 'NON']) }}

      +

      {{ __('Exporté ? : :exported', ['exported' => $code->code_exported ? 'OUI' : 'NON']) }}

      +

      {{ __('Créé le : :date_creation', ['date_creation' => $code->date_creation]) }}

      + @endif +@endsection diff --git a/resources/views/pages/contents/edit.blade.php b/resources/views/pages/contents/edit.blade.php new file mode 100644 index 0000000..c39e83b --- /dev/null +++ b/resources/views/pages/contents/edit.blade.php @@ -0,0 +1,41 @@ +@extends('back::layout', ['brParam' => $contentModel]) + +@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.contents'))])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.contents'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $contentModel]) +
      +
      +
      + @csrf + @method('PUT') + +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.contents.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/contents/form-inputs.blade.php b/resources/views/pages/contents/form-inputs.blade.php similarity index 64% rename from resources/views/bo/pages/contents/form-inputs.blade.php rename to resources/views/pages/contents/form-inputs.blade.php index b19f270..e87e937 100644 --- a/resources/views/bo/pages/contents/form-inputs.blade.php +++ b/resources/views/pages/contents/form-inputs.blade.php @@ -5,17 +5,17 @@ {{ __('Texte') }}
      - @include('bo.partials.inputs.text-html', [ + @include('back::partials.inputs.text-html', [ 'id' => 'contentValue', 'label' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.value')), - 'model' => Str::singular(__('models.classes.contents')) - ]), + 'model' => Str::singular(__('models.classes.contents')), + ]), 'name' => 'value', 'model' => $contentModel ?? null, 'required' => true, 'helper' => __('crud.minicrud.text_warning', [ - 'number' => 15 + 'number' => 15, ]), ])
      @@ -25,15 +25,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/contents/index.blade.php b/resources/views/pages/contents/index.blade.php new file mode 100644 index 0000000..7a5d5eb --- /dev/null +++ b/resources/views/pages/contents/index.blade.php @@ -0,0 +1,43 @@ +@extends('back::layout') + +@section('title', __('models.classes.contents')) +@section('description', __('Liste de tous les :model', ['model' => __('models.classes.contents')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') +
      + @include('back::modules.search-bar') + + @if (count($contentModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'key' => Str::ucfirst(__('validation.attributes.name')), + 'value' => Str::ucfirst(__('validation.attributes.value')), + ], + ]) + + + @foreach ($contentModels as $contentModel) + + + + + + @endforeach + + @else + + + + @endif +
      {{ $contentModel->key }}{!! Str::limit($contentModel->value, 150, '...') !!} + + + +
      + {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.contents'))]) }}
      + {!! $contentModels->links() !!} +@endsection diff --git a/resources/views/bo/pages/dashboard/index.blade.php b/resources/views/pages/dashboard/index.blade.php similarity index 65% rename from resources/views/bo/pages/dashboard/index.blade.php rename to resources/views/pages/dashboard/index.blade.php index a1ee799..fb78e68 100644 --- a/resources/views/bo/pages/dashboard/index.blade.php +++ b/resources/views/pages/dashboard/index.blade.php @@ -1,10 +1,10 @@ -@extends('bo.layout') +@extends('back::layout') @section('content')
      @@ -12,10 +12,10 @@ {{ __('Nombre de participations total') }} : {{ $totalParticipation }}
      {{ __('Nombre de participations moyenne par joueur') }} : {{ $avgParticipUser }}
      @if ($settings->use_ean_codes === 1) - {{ __('Top 3 des codes EAN les plus utilisés') }} : + {{ __('Top 3 des codes EAN les plus utilisés') }} :
        @foreach ($codesEan as $codeEan) -
      • {{ $codeEan->code_ean }} : {{ $codeEan->nb_usage }}
      • +
      • {{ $codeEan->code_ean }} : {{ $codeEan->nb_usage }}
      • @endforeach
      @endif @@ -25,8 +25,8 @@ $data = [ 'dates' => $dates, 'count' => $count, - 'countUnique' => $countUnique - ] + 'countUnique' => $countUnique, + ]; @endphp
      @endsection diff --git a/resources/views/pages/faq-questions/create.blade.php b/resources/views/pages/faq-questions/create.blade.php new file mode 100644 index 0000000..32eccc9 --- /dev/null +++ b/resources/views/pages/faq-questions/create.blade.php @@ -0,0 +1,37 @@ +@extends('back::layout', ['brParam' => $faqQuestionModel]) + +@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) +
      +
      + +
      +
      +
      + @csrf + @include('back::pages.faq-questions.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/pages/faq-questions/edit.blade.php b/resources/views/pages/faq-questions/edit.blade.php new file mode 100644 index 0000000..aa87fb2 --- /dev/null +++ b/resources/views/pages/faq-questions/edit.blade.php @@ -0,0 +1,48 @@ +@extends('back::layout', ['brParam' => $faqQuestionModel]) + +@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) +
      +
      +
      + @csrf + @method('DELETE') +
      + + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.faq-questions.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/faq-questions/form-inputs.blade.php b/resources/views/pages/faq-questions/form-inputs.blade.php similarity index 81% rename from resources/views/bo/pages/faq-questions/form-inputs.blade.php rename to resources/views/pages/faq-questions/form-inputs.blade.php index 72bdfc9..3d3b68d 100644 --- a/resources/views/bo/pages/faq-questions/form-inputs.blade.php +++ b/resources/views/pages/faq-questions/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- QUESTION --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.question')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'faqQuestionQuestion', 'label' => __(':field à intégrer à la faq', [ 'field' => Str::ucfirst(__('validation.attributes.question')), @@ -19,7 +19,7 @@ 'field' => Str::ucfirst(__('validation.attributes.question')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field à intégrer à la faq', [ 'field' => Str::ucfirst(__('validation.attributes.question')), @@ -31,11 +31,11 @@
      {{-- ANSWER --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.question')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'faqQuestionAnswer', 'label' => __(':field à la question', [ 'field' => Str::ucfirst(__('validation.attributes.answer')), @@ -49,7 +49,7 @@ 'field' => Str::ucfirst(__('validation.attributes.answer')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field à la question', [ 'field' => Str::ucfirst(__('validation.attributes.answer')), @@ -61,11 +61,11 @@
      {{-- THEME_ID --}}
      -
      +
      {{ __('Thème') }}
      - @include('bo.partials.inputs.bigint-foreign-id', [ + @include('back::partials.inputs.bigint-foreign-id', [ 'id' => 'faqQuestionTheme', 'label' => __('crud.minicrud.associated', ['entity' => trans_choice('models.classes.faq-themes', 1)]), 'name' => 'theme_id', @@ -82,15 +82,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/faq-questions/index.blade.php b/resources/views/pages/faq-questions/index.blade.php new file mode 100644 index 0000000..7a04579 --- /dev/null +++ b/resources/views/pages/faq-questions/index.blade.php @@ -0,0 +1,58 @@ +@extends('back::layout') + +@section('title', trans_choice('models.classes.faq-questions', 2)) +@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.faq-questions', 2)])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($faqQuestionModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'question' => Str::ucfirst(__('validation.attributes.question')), + 'answer' => Str::ucfirst(__('validation.attributes.answer')), + 'theme_id' => Str::ucfirst(__('validation.attributes.theme')), + ], + ]) + + + @foreach ($faqQuestionModels as $faqQuestionModel) + + + + + + + @endforeach + + @else + + + + @endif +
      {{ $faqQuestionModel->question }}{{ $faqQuestionModel->answer }}{{ $faqQuestionModel->theme->name }} +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.faq-questions', 1)]) }}
      + {!! $faqQuestionModels->links() !!} +@endsection diff --git a/resources/views/pages/faq-themes/create.blade.php b/resources/views/pages/faq-themes/create.blade.php new file mode 100644 index 0000000..853e8ab --- /dev/null +++ b/resources/views/pages/faq-themes/create.blade.php @@ -0,0 +1,37 @@ +@extends('back::layout', ['brParam' => $faqThemeModel]) + +@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) +
      +
      + +
      +
      +
      + @csrf + @include('back::pages.faq-themes.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/pages/faq-themes/edit.blade.php b/resources/views/pages/faq-themes/edit.blade.php new file mode 100644 index 0000000..9d0cb9d --- /dev/null +++ b/resources/views/pages/faq-themes/edit.blade.php @@ -0,0 +1,48 @@ +@extends('back::layout', ['brParam' => $faqThemeModel]) + +@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) +
      +
      +
      + @csrf + @method('DELETE') +
      + + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.faq-themes.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/faq-themes/form-inputs.blade.php b/resources/views/pages/faq-themes/form-inputs.blade.php similarity index 74% rename from resources/views/bo/pages/faq-themes/form-inputs.blade.php rename to resources/views/pages/faq-themes/form-inputs.blade.php index a682211..bccd087 100644 --- a/resources/views/bo/pages/faq-themes/form-inputs.blade.php +++ b/resources/views/pages/faq-themes/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- NAME --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.name')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'faqThemeName', 'label' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -20,7 +20,7 @@ 'field' => Str::ucfirst(__('validation.attributes.question')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -34,15 +34,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/faq-themes/index.blade.php b/resources/views/pages/faq-themes/index.blade.php new file mode 100644 index 0000000..484deff --- /dev/null +++ b/resources/views/pages/faq-themes/index.blade.php @@ -0,0 +1,54 @@ +@extends('back::layout') + +@section('title', trans_choice('models.classes.faq-themes', 2)) +@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.faq-themes', 2)])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($faqThemeModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'name' => Str::ucfirst(__('validation.attributes.name')), + ], + ]) + + + @foreach ($faqThemeModels as $faqThemeModel) + + + + + @endforeach + + @else + + + + @endif +
      {{ $faqThemeModel->name }} +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.faq-themes', 1)]) }}
      + {!! $faqThemeModels->links() !!} +@endsection diff --git a/resources/views/pages/gain-views/create.blade.php b/resources/views/pages/gain-views/create.blade.php new file mode 100644 index 0000000..c720f73 --- /dev/null +++ b/resources/views/pages/gain-views/create.blade.php @@ -0,0 +1,37 @@ +@extends('back::layout', ['brParam' => $gainViewModel]) + +@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.gain-views', 1)])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.gain-views', 1)])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) +
      +
      + +
      +
      +
      + @csrf + @include('back::pages.gain-views.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/pages/gain-views/edit.blade.php b/resources/views/pages/gain-views/edit.blade.php new file mode 100644 index 0000000..dbe7d5b --- /dev/null +++ b/resources/views/pages/gain-views/edit.blade.php @@ -0,0 +1,48 @@ +@extends('back::layout', ['brParam' => $gainViewModel]) + +@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.gain-views', 1)])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.gain-views', 1)])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) +
      +
      +
      + @csrf + @method('DELETE') +
      + + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.gain-views.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/gain-views/form-inputs.blade.php b/resources/views/pages/gain-views/form-inputs.blade.php similarity index 79% rename from resources/views/bo/pages/gain-views/form-inputs.blade.php rename to resources/views/pages/gain-views/form-inputs.blade.php index 3bc342a..f2d6e7a 100644 --- a/resources/views/bo/pages/gain-views/form-inputs.blade.php +++ b/resources/views/pages/gain-views/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- NAME --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.name')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'gainViewName', 'label' => __(':field de la page de gain', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -19,7 +19,7 @@ 'field' => Str::ucfirst(__('validation.attributes.name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field de la page de gain', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -31,11 +31,11 @@
      {{-- FILE_NAME --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.file_name')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'gainViewFileName', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.file_name')), @@ -49,7 +49,7 @@ 'field' => Str::ucfirst(__('validation.attributes.file_name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.file_name')), @@ -62,15 +62,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/gain-views/index.blade.php b/resources/views/pages/gain-views/index.blade.php new file mode 100644 index 0000000..8094ebd --- /dev/null +++ b/resources/views/pages/gain-views/index.blade.php @@ -0,0 +1,56 @@ +@extends('back::layout') + +@section('title', trans_choice('models.classes.gain-views', 2)) +@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.gain-views', 2)])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($gainViewModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'name' => Str::ucfirst(__('validation.attributes.name')), + 'file_name' => Str::ucfirst(__('validation.attributes.file_name')), + ], + ]) + + + @foreach ($gainViewModels as $gainViewModel) + + + + + + @endforeach + + @else + + + + @endif +
      {{ $gainViewModel->name }}{{ $gainViewModel->file_name }} +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.gain-views', 1)]) }}
      + {!! $gainViewModels->links() !!} +@endsection diff --git a/resources/views/pages/instant-win/index.blade.php b/resources/views/pages/instant-win/index.blade.php new file mode 100644 index 0000000..f7b73e5 --- /dev/null +++ b/resources/views/pages/instant-win/index.blade.php @@ -0,0 +1,11 @@ +@extends('back::layout') + +@section('content') + @php + $data = [ + 'cangenerate' => $can_generate, + 'instantwin' => $instant_win, + ]; + @endphp +
      +@endsection diff --git a/resources/views/pages/prizes/create.blade.php b/resources/views/pages/prizes/create.blade.php new file mode 100644 index 0000000..1f44914 --- /dev/null +++ b/resources/views/pages/prizes/create.blade.php @@ -0,0 +1,36 @@ +@extends('back::layout', ['brParam' => $prizeModel]) + +@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.prizes'))])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.prizes'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) +
      +
      + +
      +
      +
      + @csrf + @include('back::pages.prizes.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/pages/prizes/edit.blade.php b/resources/views/pages/prizes/edit.blade.php new file mode 100644 index 0000000..4aa4ad5 --- /dev/null +++ b/resources/views/pages/prizes/edit.blade.php @@ -0,0 +1,47 @@ +@extends('back::layout', ['brParam' => $prizeModel]) + +@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.prizes'))])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.prizes'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) +
      +
      +
      + @csrf + @method('DELETE') +
      + + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.prizes.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/prizes/form-inputs.blade.php b/resources/views/pages/prizes/form-inputs.blade.php similarity index 85% rename from resources/views/bo/pages/prizes/form-inputs.blade.php rename to resources/views/pages/prizes/form-inputs.blade.php index 4ec6669..3656e69 100644 --- a/resources/views/bo/pages/prizes/form-inputs.blade.php +++ b/resources/views/pages/prizes/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- LABEL_ONE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.label_one')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'prizeLabelOne', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.label_one')), @@ -19,7 +19,7 @@ 'field' => Str::ucfirst(__('validation.attributes.name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.label_one')), @@ -32,11 +32,11 @@
      {{-- LABEL_MANY --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.label_many')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'prizeLabelMany', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.label_many')), @@ -50,7 +50,7 @@ 'field' => Str::ucfirst(__('validation.attributes.name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.label_many')), @@ -63,12 +63,12 @@
      {{-- ARG --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.arg')) }}
      {{-- ARG_TITLE --}}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'prizeArgTitle', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.title')), @@ -82,7 +82,7 @@ 'field' => Str::ucfirst(__('validation.attributes.title')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.title')), @@ -92,7 +92,7 @@
      {{-- ARG_SUBTITLE --}}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'prizeArgSubtitle', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.subtitle')), @@ -106,7 +106,7 @@ 'field' => Str::ucfirst(__('validation.attributes.subtitle')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.subtitle')), @@ -116,16 +116,16 @@
      {{-- VALUE --}}
      - @include('bo.partials.inputs.text-html', [ + @include('back::partials.inputs.text-html', [ 'id' => 'contentValue', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.content')), - ]), + ]), 'name' => 'arg_content', 'model' => $prizeModel ?? null, 'required' => true, 'helper' => __('crud.minicrud.text_warning', [ - 'number' => 15 + 'number' => 15, ]), ])
      @@ -134,11 +134,11 @@
      {{-- QUANTITY --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.quantity')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'prizeQuantity', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.quantity')), @@ -150,7 +150,7 @@ 'attribute' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.quantity')), ]), - 'min' => 1 + 'min' => 1, ]), 'min' => 1, ]) @@ -160,11 +160,11 @@
      {{-- PDF_WINNING_PROOF --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.pdf_winning_proof')) }}
      - @include('bo.partials.inputs.varchar-file', [ + @include('back::partials.inputs.varchar-file', [ 'id' => 'prizePdfWinningProof', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.pdf_winning_proof')), @@ -176,9 +176,9 @@ 'attribute' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.pdf_winning_proof')), ]), - 'values' => 'pdf' + 'values' => 'pdf', ]), - 'file' => 'pdf' + 'file' => 'pdf', ])
      @@ -186,11 +186,11 @@
      {{-- NEED_PROOF --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.need_proof')) }}
      - @include('bo.partials.inputs.tinyint-boolean', [ + @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'prizeNeedProof', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.need_proof')), @@ -210,11 +210,11 @@
      {{-- GAIN_VIEW_ID --}}
      -
      +
      {{ trans_choice('models.classes.gain-views', 1) }}
      - @include('bo.partials.inputs.bigint-foreign-id', [ + @include('back::partials.inputs.bigint-foreign-id', [ 'id' => 'prizeGainView', 'label' => __('crud.minicrud.associated', ['entity' => trans_choice('models.classes.gain-views', 1)]), 'name' => 'gain_view_id', @@ -231,15 +231,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/prizes/index.blade.php b/resources/views/pages/prizes/index.blade.php new file mode 100644 index 0000000..8b914aa --- /dev/null +++ b/resources/views/pages/prizes/index.blade.php @@ -0,0 +1,72 @@ +@extends('back::layout') + +@section('title', __('models.classes.prizes')) +@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.prizes')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($prizeModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'label_one' => Str::ucfirst(__('validation.attributes.label_one')), + 'quantity' => Str::ucfirst(__('validation.attributes.quantity')), + 'need_proof' => Str::ucfirst(__('validation.attributes.need_proof')), + 'gain_view_id' => Str::ucfirst(trans_choice('models.classes.gain-views', 1)), + ], + ]) + + + @foreach ($prizeModels as $prizeModel) + + + + + + + + @endforeach + + @else + + + + @endif +
      {{ $prizeModel->label_one }}{{ $prizeModel->quantity }} + @if ($prizeModel->need_proof) + + @else + + @endif + + + {{ $prizeModel->gainView->name }} + + +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.prizes'))]) }}
      + {!! $prizeModels->links() !!} +@endsection diff --git a/resources/views/pages/products/create.blade.php b/resources/views/pages/products/create.blade.php new file mode 100644 index 0000000..9ed636e --- /dev/null +++ b/resources/views/pages/products/create.blade.php @@ -0,0 +1,36 @@ +@extends('back::layout', ['brParam' => $productModel]) + +@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.products'))])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.products'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) +
      +
      + +
      +
      +
      + @csrf + @include('back::pages.products.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/pages/products/edit.blade.php b/resources/views/pages/products/edit.blade.php new file mode 100644 index 0000000..0aff1d8 --- /dev/null +++ b/resources/views/pages/products/edit.blade.php @@ -0,0 +1,47 @@ +@extends('back::layout', ['brParam' => $productModel]) + +@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.products'))])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.products'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) +
      +
      +
      + @csrf + @method('DELETE') +
      + + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.products.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/products/form-inputs.blade.php b/resources/views/pages/products/form-inputs.blade.php similarity index 82% rename from resources/views/bo/pages/products/form-inputs.blade.php rename to resources/views/pages/products/form-inputs.blade.php index dfdcb7e..c2cc30c 100644 --- a/resources/views/bo/pages/products/form-inputs.blade.php +++ b/resources/views/pages/products/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- NAME --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.name')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'productName', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -19,7 +19,7 @@ 'field' => Str::ucfirst(__('validation.attributes.name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du :model', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -32,11 +32,11 @@
      {{-- NO_ART --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.no_art')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'productNoArt', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.no_art')), @@ -48,9 +48,9 @@ 'attribute' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.no_art')), ]), - 'min' => 0 + 'min' => 0, ]), - 'min' => 0 + 'min' => 0, ])
      @@ -58,13 +58,13 @@
      {{-- PICTURE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.picture')) }}
      - @include('bo.partials.inputs.varchar-picture', [ + @include('back::partials.inputs.varchar-picture', [ 'id' => 'productPicture', 'name' => 'picture', 'width' => 500, @@ -85,11 +85,11 @@
      {{-- CODE_EAN --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.ean_code')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'productEANCode', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.ean_code')), @@ -104,7 +104,7 @@ ]), // Unsigned between 7 and 13 digits 'min' => 1000000, - 'max' => 9999999999999 + 'max' => 9999999999999, ])
      @@ -112,11 +112,11 @@
      {{-- RANGE_ID --}}
      -
      +
      {{ trans_choice('models.classes.gain-views', 1) }}
      - @include('bo.partials.inputs.bigint-foreign-id', [ + @include('back::partials.inputs.bigint-foreign-id', [ 'id' => 'productRange', 'label' => __('crud.minicrud.associated', ['entity' => __('models.classes.ranges')]), 'name' => 'range_id', @@ -133,15 +133,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/products/index.blade.php b/resources/views/pages/products/index.blade.php new file mode 100644 index 0000000..fa58852 --- /dev/null +++ b/resources/views/pages/products/index.blade.php @@ -0,0 +1,60 @@ +@extends('back::layout') + +@section('title', __('models.classes.products')) +@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.products')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($productModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'name' => Str::ucfirst(__('validation.attributes.name')), + 'no_art' => Str::ucfirst(__('validation.attributes.no_art')), + 'code_ean' => Str::ucfirst(__('validation.attributes.ean_code')), + 'range_id' => Str::ucfirst(__('models.classes.ranges')), + ], + ]) + + + @foreach ($productModels as $productModel) + + + + + + + + @endforeach + + @else + + + + @endif +
      {{ $productModel->name }}{{ $productModel->no_art }}{{ $productModel->code_ean }}{{ $productModel->range->name }} +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.products'))]) }}
      + {!! $productModels->links() !!} +@endsection diff --git a/resources/views/pages/ranges/create.blade.php b/resources/views/pages/ranges/create.blade.php new file mode 100644 index 0000000..976f3a6 --- /dev/null +++ b/resources/views/pages/ranges/create.blade.php @@ -0,0 +1,36 @@ +@extends('back::layout', ['brParam' => $rangeModel]) + +@section('title', __('Création d\'une :model', ['model' => Str::singular(__('models.classes.ranges'))])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => Str::singular(__('models.classes.ranges'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) +
      +
      + +
      +
      +
      + @csrf + @include('back::pages.ranges.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/pages/ranges/edit.blade.php b/resources/views/pages/ranges/edit.blade.php new file mode 100644 index 0000000..0516ce3 --- /dev/null +++ b/resources/views/pages/ranges/edit.blade.php @@ -0,0 +1,47 @@ +@extends('back::layout', ['brParam' => $rangeModel]) + +@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.ranges'))])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.ranges'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) +
      +
      +
      + @csrf + @method('DELETE') +
      + + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.ranges.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/ranges/form-inputs.blade.php b/resources/views/pages/ranges/form-inputs.blade.php similarity index 77% rename from resources/views/bo/pages/ranges/form-inputs.blade.php rename to resources/views/pages/ranges/form-inputs.blade.php index e253b1f..2b89184 100644 --- a/resources/views/bo/pages/ranges/form-inputs.blade.php +++ b/resources/views/pages/ranges/form-inputs.blade.php @@ -1,11 +1,11 @@
      {{-- NAME --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.name')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'rangeName', 'label' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -19,7 +19,7 @@ 'field' => Str::ucfirst(__('validation.attributes.name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field de la :model', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -32,11 +32,11 @@
      {{-- PICTURE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.picture')) }}
      - @include('bo.partials.inputs.varchar-picture', [ + @include('back::partials.inputs.varchar-picture', [ 'id' => 'rangePicture', 'name' => 'picture', 'width' => 500, @@ -56,15 +56,15 @@
      @push('scripts') - + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + @endpush diff --git a/resources/views/pages/ranges/index.blade.php b/resources/views/pages/ranges/index.blade.php new file mode 100644 index 0000000..52f0a34 --- /dev/null +++ b/resources/views/pages/ranges/index.blade.php @@ -0,0 +1,54 @@ +@extends('back::layout') + +@section('title', __('models.classes.ranges')) +@section('description', __('Liste de toutes les :model', ['model' => __('models.classes.ranges')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') + + + +
      + @include('back::modules.search-bar') + + @if (count($rangeModels) > 0) + + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'name' => Str::ucfirst(__('validation.attributes.name')), + ], + ]) + + + @foreach ($rangeModels as $rangeModel) + + + + + @endforeach + + @else + + + + @endif +
      {{ $rangeModel->name }} +
      + + + + @csrf + @method('DELETE') + +
      +
      + {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.ranges'))]) }}
      + {!! $rangeModels->links() !!} +@endsection diff --git a/resources/views/pages/settings/edit.blade.php b/resources/views/pages/settings/edit.blade.php new file mode 100644 index 0000000..7e7af3d --- /dev/null +++ b/resources/views/pages/settings/edit.blade.php @@ -0,0 +1,39 @@ +@extends('back::layout', ['brParam' => $settingsModel]) + +@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.settings'))])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.settings'))])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') +
      +
      + @include('breadcrumbs.breadcrumb-body', ['brParam' => $settingsModel]) +
      +
      +
      + @csrf + @method('PUT') +
      + +
      +
      +
      +
      +
      + @csrf + @method('PUT') + @include('back::pages.settings.form-inputs') +
      +
      + +
      +
      +
      +@endsection diff --git a/resources/views/bo/pages/settings/form-inputs.blade.php b/resources/views/pages/settings/form-inputs.blade.php similarity index 72% rename from resources/views/bo/pages/settings/form-inputs.blade.php rename to resources/views/pages/settings/form-inputs.blade.php index 620b289..61aeb47 100644 --- a/resources/views/bo/pages/settings/form-inputs.blade.php +++ b/resources/views/pages/settings/form-inputs.blade.php @@ -1,16 +1,16 @@
      - {{ __('Général') }}
      + {{ __('Général') }}
      {{ __('Paramètres généraux du jeu') }}
      {{-- NAME --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.name')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'settingsName', 'label' => Str::ucfirst(__('validation.attributes.name')), 'hasWordCounter' => true, @@ -22,7 +22,7 @@ 'field' => Str::ucfirst(__('validation.attributes.name')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field du jeu', [ 'field' => Str::ucfirst(__('validation.attributes.name')), @@ -34,11 +34,11 @@
      {{-- START_DATE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.start_date')) }}
      - @include('bo.partials.inputs.timestamp-datetime', [ + @include('back::partials.inputs.timestamp-datetime', [ 'id' => 'settingsStartDate', 'label' => Str::ucfirst(__('validation.attributes.start_date')), 'name' => 'start_date', @@ -53,11 +53,11 @@
      {{-- END_DATE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.end_date')) }}
      - @include('bo.partials.inputs.timestamp-datetime', [ + @include('back::partials.inputs.timestamp-datetime', [ 'id' => 'settingsEndDate', 'label' => Str::ucfirst(__('validation.attributes.end_date')), 'name' => 'end_date', @@ -72,11 +72,11 @@
      {{-- NB_PARTICIPATION_PLAYER --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.nb_participation_player')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'settingsNbParticipationPlayer', 'label' => Str::ucfirst(__('validation.attributes.nb_participation_player')), 'name' => 'nb_participation_player', @@ -84,9 +84,9 @@ 'model' => $settingsModel ?? null, 'helper' => __('validation.min.numeric', [ 'attribute' => Str::ucfirst(__('validation.attributes.nb_participation_player')), - 'min' => 0 + 'min' => 0, ]), - 'min' => 0 + 'min' => 0, ])
      @@ -94,11 +94,11 @@
      {{-- NB_PARTICIPATION_IP --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.nb_participation_ip')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'settingsNbParticipationIp', 'label' => Str::ucfirst(__('validation.attributes.nb_participation_ip')), 'name' => 'nb_participation_ip', @@ -106,9 +106,9 @@ 'model' => $settingsModel ?? null, 'helper' => __('validation.min.numeric', [ 'attribute' => Str::ucfirst(__('validation.attributes.nb_participation_ip')), - 'min' => 0 + 'min' => 0, ]), - 'min' => 0 + 'min' => 0, ])
      @@ -116,11 +116,11 @@
      {{-- NB_UNIQUE_CODE_USE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.nb_unique_code_use')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'settingsNbUniqueCodeUse', 'label' => Str::ucfirst(__('validation.attributes.nb_unique_code_use')), 'name' => 'nb_unique_code_use', @@ -128,9 +128,9 @@ 'model' => $settingsModel ?? null, 'helper' => __('validation.min.numeric', [ 'attribute' => Str::ucfirst(__('validation.attributes.nb_unique_code_use')), - 'min' => 0 + 'min' => 0, ]), - 'min' => 0 + 'min' => 0, ])
      @@ -138,11 +138,11 @@
      {{-- CODE_LENGTH --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.code_length')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'settingsCodeLength', 'label' => Str::ucfirst(__('validation.attributes.code_length')), 'name' => 'code_length', @@ -150,7 +150,7 @@ 'disabled' => true, 'model' => $settingsModel ?? null, 'helper' => __('Cette valeur ne doit pas varier en cours de jeu.'), - 'min' => 0 + 'min' => 0, ])
      @@ -158,11 +158,11 @@
      {{-- USE_EAN_CODES --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.use_ean_codes')) }}
      - @include('bo.partials.inputs.tinyint-boolean', [ + @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsUseEANCodes', 'label' => Str::ucfirst(__('validation.attributes.use_ean_codes')), 'name' => 'use_ean_codes', @@ -178,11 +178,11 @@
      {{-- ACTIVATED_TEASER --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.activated_teaser')) }}
      - @include('bo.partials.inputs.tinyint-boolean', [ + @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsActivatedTeaser', 'label' => Str::ucfirst(__('validation.attributes.activated_teaser')), 'name' => 'activated_teaser', @@ -198,11 +198,11 @@
      {{-- TEASER_END_ACTIVITY --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.teaser_end_activity')) }}
      - @include('bo.partials.inputs.timestamp-datetime', [ + @include('back::partials.inputs.timestamp-datetime', [ 'id' => 'settingsTeaserEndActivity', 'label' => Str::ucfirst(__('validation.attributes.teaser_end_activity')), 'name' => 'teaser_end_activity', @@ -217,11 +217,11 @@
      {{-- ACTIVATED_CLOSE_PAGE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.activated_close_page')) }}
      - @include('bo.partials.inputs.tinyint-boolean', [ + @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsActivatedClosePage', 'label' => Str::ucfirst(__('validation.attributes.activated_close_page')), 'name' => 'activated_close_page', @@ -237,11 +237,11 @@
      {{-- CLOSE_PAGE_ACTIVE_DATE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.close_page_active_date')) }}
      - @include('bo.partials.inputs.timestamp-datetime', [ + @include('back::partials.inputs.timestamp-datetime', [ 'id' => 'settingsClosePageActiveDate', 'label' => __('Page active jusqu\'au'), 'name' => 'close_page_active_date', @@ -256,11 +256,11 @@
      {{-- REDIRECT_CLOSE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.redirect_close')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'settingsRedirectClose', 'label' => __('URL de redirection après la date de fin du jeu'), 'hasWordCounter' => true, @@ -276,11 +276,11 @@
      {{-- WINNING_PROOF --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.winning_proof')) }}
      - @include('bo.partials.inputs.tinyint-boolean', [ + @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsReductionsActivated', 'label' => Str::ucfirst(__('validation.attributes.winning_proof')), 'name' => 'winning_proof', @@ -296,11 +296,11 @@
      {{-- COMPANY --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.company')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'settingsCompany', 'label' => __('Nom de la :field', [ 'field' => Str::ucfirst(__('validation.attributes.company')), @@ -314,7 +314,7 @@ 'field' => Str::ucfirst(__('validation.attributes.company')), ]), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __(':field', [ 'field' => Str::ucfirst(__('validation.attributes.company')), @@ -328,18 +328,18 @@
      - {{ __('Les réductions') }}
      + {{ __('Les réductions') }}
      {{ __('Paramétrages des bons de réduction MLDC') }}
      {{-- REDUCTIONS_ACTIVATED --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.reductions_activated')) }}
      - @include('bo.partials.inputs.tinyint-boolean', [ + @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsReductionsActivated', 'label' => Str::ucfirst(__('validation.attributes.reductions_activated')), 'name' => 'reductions_activated', @@ -355,11 +355,11 @@
      {{-- REDUCTIONS_SITE --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.reductions_site')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'settingsReductionsSite', 'label' => __('validation.attributes.reductions_site'), 'hasWordCounter' => true, @@ -369,7 +369,7 @@ 'helper' => __('validation.between.string', [ 'attribute' => __('validation.attributes.reductions_site'), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __('validation.attributes.reductions_site'), ]) @@ -379,11 +379,11 @@
      {{-- REDUCTIONS_CAMPAIGN --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.reductions_campaign')) }}
      - @include('bo.partials.inputs.varchar', [ + @include('back::partials.inputs.varchar', [ 'id' => 'settingsReductionsCampaign', 'label' => __('validation.attributes.reductions_campaign'), 'hasWordCounter' => true, @@ -393,7 +393,7 @@ 'helper' => __('validation.between.string', [ 'attribute' => __('validation.attributes.reductions_campaign'), 'min' => 3, - 'max' => 255 + 'max' => 255, ]), 'placeholder' => __('validation.attributes.reductions_campaign'), ]) @@ -403,52 +403,52 @@
      {{-- WEB_COUPONS --}} @php - $data = [ - 'dbdatas' => $settingsModel->web_coupons, - 'name' => 'web_coupons' - ] + $data = [ + 'dbdatas' => $settingsModel->web_coupons, + 'name' => 'web_coupons', + ]; @endphp -
      +

      - {{ __('Destinataires des notifications de gain') }}
      + {{ __('Destinataires des notifications de gain') }}
      {{ __('Ces mails recevront toutes les notifications de gain.') }}
      {{-- NOTIFICATION_EMAILS --}} @php - $data = [ - 'dbdatas' => $settingsModel->notification_emails, - 'name' => 'notification_emails' - ] + $data = [ + 'dbdatas' => $settingsModel->notification_emails, + 'name' => 'notification_emails', + ]; @endphp

      - {{ __('Analytics') }}
      + {{ __('Analytics') }}
      {{ __('Saississez les informations permettant d\'établir des statistiques pour le jeu.') }}
      {{-- ANALYTICS --}}
      -
      +
      {{ Str::ucfirst(__('validation.attributes.analytics')) }}
      - @include('bo.partials.inputs.int-number', [ + @include('back::partials.inputs.int-number', [ 'id' => 'settingsanalytics', 'label' => Str::ucfirst(__('Site ID')), 'name' => 'analytics', 'required' => false, 'model' => $settingsModel ?? null, 'helper' => __('Insérer ici l\'id du site pour Matomo'), - 'min' => 0 + 'min' => 0, ])
      @@ -457,82 +457,82 @@
      @push('scripts') - + @endpush diff --git a/resources/views/pages/winners-list/index.blade.php b/resources/views/pages/winners-list/index.blade.php new file mode 100644 index 0000000..5b65a7e --- /dev/null +++ b/resources/views/pages/winners-list/index.blade.php @@ -0,0 +1,80 @@ +@extends('back::layout') + +@section('title', __('models.classes.winners')) +@section('description', __('Liste de tous les :model', ['model' => __('models.classes.winners')])) + +@section('content') +
      + @include('breadcrumbs.breadcrumb-body') +
      + + @if (count($participationModels) > 0) + + @php + $cols = [ + 'created_at' => __('Date participation'), + 'prize' => __('Lot'), + 'email' => __('Email'), + ]; + if ($settings->use_ean_codes === 1) { + $cols['code_ean_id'] = __('Code EAN'); + } + $cols['code_unique_id'] = __('Code unique'); + if ($settings->winning_proof === 1) { + $cols['sticker'] = __('Sticker'); + $cols['barcode'] = __('Code barre'); + $cols['ticket'] = __('Ticket'); + } + @endphp + @include('back::modules.table-col-sorter', [ + 'cols' => $cols, + 'ignore' => ['sticker', 'barcode', 'ticket'], + ]) + + + @foreach ($participationModels as $participationModel) + + + + + @if ($settings->use_ean_codes) + + @endif + + @if ($settings->winning_proof === 1) + @if ($participationModel->sticker !== null) + + @else + + @endif + @if ($participationModel->barcode !== null) + + @else + + @endif + @if ($participationModel->ticket !== null) + + @else + + @endif + @endif + + + @endforeach + + @else + + + + @endif +
      {{ \Carbon\Carbon::parse($participationModel->created_at)->format('d/m/Y à H:i') }} + {{ $participationModel->instantWin()->first()->prize->label_one }}{{ $participationModel->customer->email }}{{ $participationModel->codeEan }}{{ $participationModel->code->code_unique }}Voir-Voir-Voir-
      + {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.winners'))]) }}
      + {!! $participationModels->links() !!} +@endsection diff --git a/resources/views/bo/partials/inputs/bigint-foreign-id.blade.php b/resources/views/partials/inputs/bigint-foreign-id.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/bigint-foreign-id.blade.php rename to resources/views/partials/inputs/bigint-foreign-id.blade.php diff --git a/resources/views/bo/partials/inputs/date.blade.php b/resources/views/partials/inputs/date.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/date.blade.php rename to resources/views/partials/inputs/date.blade.php diff --git a/resources/views/bo/partials/inputs/int-color.blade.php b/resources/views/partials/inputs/int-color.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/int-color.blade.php rename to resources/views/partials/inputs/int-color.blade.php diff --git a/resources/views/bo/partials/inputs/int-number.blade.php b/resources/views/partials/inputs/int-number.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/int-number.blade.php rename to resources/views/partials/inputs/int-number.blade.php diff --git a/resources/views/bo/partials/inputs/pivot-belongsToMany.blade.php b/resources/views/partials/inputs/pivot-belongsToMany.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/pivot-belongsToMany.blade.php rename to resources/views/partials/inputs/pivot-belongsToMany.blade.php diff --git a/resources/views/bo/partials/inputs/publish-dates.blade.php b/resources/views/partials/inputs/publish-dates.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/publish-dates.blade.php rename to resources/views/partials/inputs/publish-dates.blade.php diff --git a/resources/views/bo/partials/inputs/search-belongs-to-dropdown.blade.php b/resources/views/partials/inputs/search-belongs-to-dropdown.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/search-belongs-to-dropdown.blade.php rename to resources/views/partials/inputs/search-belongs-to-dropdown.blade.php diff --git a/resources/views/bo/partials/inputs/select-multiple-enum.blade.php b/resources/views/partials/inputs/select-multiple-enum.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/select-multiple-enum.blade.php rename to resources/views/partials/inputs/select-multiple-enum.blade.php diff --git a/resources/views/bo/partials/inputs/text-html.blade.php b/resources/views/partials/inputs/text-html.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/text-html.blade.php rename to resources/views/partials/inputs/text-html.blade.php diff --git a/resources/views/bo/partials/inputs/text-list-items.blade.php b/resources/views/partials/inputs/text-list-items.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/text-list-items.blade.php rename to resources/views/partials/inputs/text-list-items.blade.php diff --git a/resources/views/bo/partials/inputs/timestamp-datetime.blade.php b/resources/views/partials/inputs/timestamp-datetime.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/timestamp-datetime.blade.php rename to resources/views/partials/inputs/timestamp-datetime.blade.php diff --git a/resources/views/bo/partials/inputs/tinyint-boolean.blade.php b/resources/views/partials/inputs/tinyint-boolean.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/tinyint-boolean.blade.php rename to resources/views/partials/inputs/tinyint-boolean.blade.php diff --git a/resources/views/bo/partials/inputs/tinyint-enum.blade.php b/resources/views/partials/inputs/tinyint-enum.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/tinyint-enum.blade.php rename to resources/views/partials/inputs/tinyint-enum.blade.php diff --git a/resources/views/bo/partials/inputs/varchar-file.blade.php b/resources/views/partials/inputs/varchar-file.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/varchar-file.blade.php rename to resources/views/partials/inputs/varchar-file.blade.php diff --git a/resources/views/bo/partials/inputs/varchar-multiline.blade.php b/resources/views/partials/inputs/varchar-multiline.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/varchar-multiline.blade.php rename to resources/views/partials/inputs/varchar-multiline.blade.php diff --git a/resources/views/bo/partials/inputs/varchar-picture.blade.php b/resources/views/partials/inputs/varchar-picture.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/varchar-picture.blade.php rename to resources/views/partials/inputs/varchar-picture.blade.php diff --git a/resources/views/bo/partials/inputs/varchar.blade.php b/resources/views/partials/inputs/varchar.blade.php similarity index 100% rename from resources/views/bo/partials/inputs/varchar.blade.php rename to resources/views/partials/inputs/varchar.blade.php diff --git a/resources/views/re7.blade.php b/resources/views/re7.blade.php index 6a3609d..5709d0e 100644 --- a/resources/views/re7.blade.php +++ b/resources/views/re7.blade.php @@ -1,4 +1,4 @@ -@extends('bo.layout') +@extends('back::layout') @section('content')
      From d3f2942c68c4ad75bcca35ced9fa366778916b6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Tue, 21 Nov 2023 12:28:09 +0100 Subject: [PATCH 027/145] Sync 2 Html loading ok --- app/Http/Controllers/EndPageController.php | 2 +- app/Http/Controllers/EnterCodeController.php | 16 ++++++++-------- app/Http/Controllers/FAQController.php | 2 +- app/Http/Controllers/GainsController.php | 4 ++-- app/Http/Controllers/HomeController.php | 2 +- app/Http/Controllers/HowToPlayController.php | 4 ++-- app/Http/Controllers/LoginController.php | 16 ++++++++-------- app/Http/Controllers/ProduitsController.php | 4 ++-- app/Http/Controllers/Re7Controller.php | 12 ++++++------ app/Http/Controllers/RegisterController.php | 8 ++++---- app/Http/Controllers/TeaserController.php | 2 +- app/Http/Controllers/ViewContentController.php | 6 +++--- app/Http/Controllers/WinningProofController.php | 2 +- app/Models/InstantWin.php | 2 +- app/Providers/ViewServiceProvider.php | 2 +- config/app.php | 4 +++- config/view.php | 2 ++ resources/ts/bo/bo.ts | 2 +- vite.config.ts | 2 ++ 19 files changed, 50 insertions(+), 44 deletions(-) diff --git a/app/Http/Controllers/EndPageController.php b/app/Http/Controllers/EndPageController.php index b97c30f..797d3cd 100644 --- a/app/Http/Controllers/EndPageController.php +++ b/app/Http/Controllers/EndPageController.php @@ -21,7 +21,7 @@ class EndPageController extends Controller $settings->activated_close_page === 1 && $settings->close_page_active_date > now() ) { - return view('front.basic.end', compact('settings')); + return view('theme::fo.end', compact('settings')); } return redirect()->route('home'); } diff --git a/app/Http/Controllers/EnterCodeController.php b/app/Http/Controllers/EnterCodeController.php index b275c2c..57b5504 100644 --- a/app/Http/Controllers/EnterCodeController.php +++ b/app/Http/Controllers/EnterCodeController.php @@ -44,9 +44,9 @@ class EnterCodeController extends Controller $nbParticipations = Participation::where('user_id', Auth::user()->id)->count(); $settings = app(Settings::class)->select('use_ean_codes', 'nb_participation_player')->first(); if ($nbParticipations >= $settings->nb_participation_player) { - return view('front.basic.participation-exhausted', compact('settings')); + return view('theme::fo.participation-exhausted', compact('settings')); } - return view('front.basic.enter-code', compact('settings')); + return view('theme::fo.enter-code', compact('settings')); } /** @@ -64,13 +64,13 @@ class EnterCodeController extends Controller // * Cas IP bannie. $ipBanned = BannedIp::where('ip', app('clientIp'))->first() === null ? 0 : 1; if ($ipBanned) { - return view('front.basic.participation-exhausted', compact('settings')); + return view('theme::fo.participation-exhausted', compact('settings')); } // * Cas nombre de participation maximale atteint. $nbParticipations = Participation::where('user_id', auth()->user()->id)->count(); if ($nbParticipations >= $settings->nb_participation_player) { - return view('front.basic.participation-exhausted', compact('settings')); + return view('theme::fo.participation-exhausted', compact('settings')); } // * Tous les cas "bloquants" sont passé, l'utilisateur participe à partir d'ici. @@ -178,7 +178,7 @@ class EnterCodeController extends Controller Mail::to($mail->email)->send(new NotifWinAdmin($settings, $participation)); } $participation->save(); - return view("front.basic." . $instantWin->prize->gainView->file_name, compact('settings')) + return view("theme::fo." . $instantWin->prize->gainView->file_name, compact('settings')) ->with('prize', $instantWin->prize); } @@ -201,9 +201,9 @@ class EnterCodeController extends Controller return back()->withErrors("Une erreur est survenue, merci de réessayez ultérieurement."); } Mail::to(Auth::user()->email)->send(new ReductionWon(Auth::user(), $coupon, $settings, $crmCoupon)); - return view('front.basic.reduction', compact('crmCoupon', 'coupon')); + return view('theme::fo.reduction', compact('crmCoupon', 'coupon')); } else { - return view('front.basic.loose'); + return view('theme::fo.loose'); } } @@ -284,7 +284,7 @@ class EnterCodeController extends Controller ['barcode', null] ])->has('instantWin')->first(); if ($participation) { - return view('front.basic.winning-proof', compact('participation')); + return view('theme::fo.winning-proof', compact('participation')); } return redirect()->route('home'); } diff --git a/app/Http/Controllers/FAQController.php b/app/Http/Controllers/FAQController.php index 553c861..2adba55 100644 --- a/app/Http/Controllers/FAQController.php +++ b/app/Http/Controllers/FAQController.php @@ -19,6 +19,6 @@ class FAQController extends Controller if (count($questions) === 0 && count($themes) === 0) { return redirect()->route('home'); } - return view('front.basic.faq', compact('questions', 'themes')); + return view('theme::fo.faq', compact('questions', 'themes')); } } diff --git a/app/Http/Controllers/GainsController.php b/app/Http/Controllers/GainsController.php index 1fec5e0..699a38a 100644 --- a/app/Http/Controllers/GainsController.php +++ b/app/Http/Controllers/GainsController.php @@ -11,8 +11,8 @@ class GainsController extends Controller */ public function index() { - if (view()->exists('front.basic.gains')) { - return view('front.basic.gains'); + if (view()->exists('theme::fo.gains')) { + return view('theme::fo.gains'); } return redirect()->route('home'); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 908ce5c..ce5fd2d 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -11,6 +11,6 @@ class HomeController extends Controller */ public function home() { - return view('front.basic.home'); + return view('theme::fo.home'); } } diff --git a/app/Http/Controllers/HowToPlayController.php b/app/Http/Controllers/HowToPlayController.php index 1e1ab63..3cc4a26 100644 --- a/app/Http/Controllers/HowToPlayController.php +++ b/app/Http/Controllers/HowToPlayController.php @@ -11,8 +11,8 @@ class HowToPlayController extends Controller */ public function index() { - if (view()->exists('front.basic.how-to-play')) { - return view('front.basic.how-to-play'); + if (view()->exists('theme::fo.basic.how-to-play')) { + return view('theme::fo.basic.how-to-play'); } return redirect()->route('home'); } diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php index 6e3e0b7..6168213 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/LoginController.php @@ -35,7 +35,7 @@ class LoginController extends Controller */ public function index() { - return view('front.basic.login'); + return view('theme::fo.login'); } /** @@ -79,7 +79,7 @@ class LoginController extends Controller ->withInput($request->except("password")) ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails."); - }//end if + } //end if } else { $connect = $this->apiCrm->loginCustomer($email, $password); @@ -162,7 +162,7 @@ class LoginController extends Controller $result = false; $user = Customer::where('email_verify_token', $verifyToken)->first(); if (!$user) { - return view('front.basic.confirm-email', compact('result')); + return view('theme::fo.confirm-email', compact('result')); } $activation = $this->apiCrm->activateCustomer($user->crm_id); @@ -182,7 +182,7 @@ class LoginController extends Controller } } - return view('front.basic.confirm-email', compact('result')); + return view('theme::fo.confirm-email', compact('result')); } /** @@ -196,9 +196,9 @@ class LoginController extends Controller if ($request->tokenValid && $request->token) { $tokenValid = $request->tokenValid; $token = $request->token; - return view('front.basic.forgot-password', compact('tokenValid', 'token')); + return view('theme::fo.forgot-password', compact('tokenValid', 'token')); } - return view('front.basic.forgot-password'); + return view('theme::fo.forgot-password'); } /** @@ -260,7 +260,7 @@ class LoginController extends Controller $user->save(); Mail::to($email)->send(new VerifyEmail($user)); return back()->withInput($request->except("password")) - ->withErrors("Votre compte existe mais votre email n'est pas confirmé, + ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails."); } } else { @@ -273,7 +273,7 @@ class LoginController extends Controller ->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); } } //end if - }//end if + } //end if $user->password_token = Str::uuid(); $user->save(); diff --git a/app/Http/Controllers/ProduitsController.php b/app/Http/Controllers/ProduitsController.php index b38f080..b70a715 100644 --- a/app/Http/Controllers/ProduitsController.php +++ b/app/Http/Controllers/ProduitsController.php @@ -14,8 +14,8 @@ class ProduitsController extends Controller public function index() { $ranges = Range::with('products')->orderBy('id')->get(); - if (view()->exists('front.basic.produits-porteurs')) { - return view('front.basic.produits-porteurs', compact('ranges')); + if (view()->exists('theme::fo.produits-porteurs')) { + return view('theme::fo.produits-porteurs', compact('ranges')); } return redirect()->route('home'); } diff --git a/app/Http/Controllers/Re7Controller.php b/app/Http/Controllers/Re7Controller.php index 0283436..90ade9b 100644 --- a/app/Http/Controllers/Re7Controller.php +++ b/app/Http/Controllers/Re7Controller.php @@ -26,7 +26,7 @@ class Re7Controller extends Controller { $settings = app(Settings::class) ->select('start_date', 'end_date', 'activated_teaser', 'teaser_end_activity')->first(); - return view('front.basic.teaser', compact('settings')); + return view('theme::fo.teaser', compact('settings')); } /** @@ -36,7 +36,7 @@ class Re7Controller extends Controller */ public function prizeMail() { - return view('front.basic.prize-mail'); + return view('theme::fo.prize-mail'); } /** @@ -46,7 +46,7 @@ class Re7Controller extends Controller */ public function reductionMail() { - return view('front.basic.reduction-mail'); + return view('theme::fo.reduction-mail'); } /** @@ -59,7 +59,7 @@ class Re7Controller extends Controller $settings = app(Settings::class); $coupon = $this->getRandomCoupon($settings); $crmCoupon = new Reduction(); - return view('front.basic.reduction', compact('coupon', 'crmCoupon')); + return view('theme::fo.reduction', compact('coupon', 'crmCoupon')); } /** @@ -69,7 +69,7 @@ class Re7Controller extends Controller */ public function gain1() { - return view('front.basic.gain1'); + return view('theme::fo.gain1'); } /** @@ -79,7 +79,7 @@ class Re7Controller extends Controller */ public function gain2() { - return view('front.basic.gain2'); + return view('theme::fo.gain2'); } /** * getRandomCoupon diff --git a/app/Http/Controllers/RegisterController.php b/app/Http/Controllers/RegisterController.php index 8ef0055..d25cebf 100644 --- a/app/Http/Controllers/RegisterController.php +++ b/app/Http/Controllers/RegisterController.php @@ -36,7 +36,7 @@ class RegisterController extends Controller */ public function index() { - return view('front.basic.register-crm'); + return view('theme::fo.register-crm'); } /** @@ -88,8 +88,8 @@ class RegisterController extends Controller $d = Carbon::createFromFormat('d/m/Y', $birthdate); if (!$d->lessThanOrEqualTo($MJ)) { return back() - ->withInput($request->except('password')) - ->withErrors("Vous devez être majeur pour vous inscrire au jeu."); + ->withInput($request->except('password')) + ->withErrors("Vous devez être majeur pour vous inscrire au jeu."); } $birthdate = $d->toDateString(); @@ -152,7 +152,7 @@ class RegisterController extends Controller ->withInput($request->except('password')) ->withErrors("Une erreur est survenue, merci de recommencer."); } - }//end if + } //end if } /** diff --git a/app/Http/Controllers/TeaserController.php b/app/Http/Controllers/TeaserController.php index 33ff028..ace5639 100644 --- a/app/Http/Controllers/TeaserController.php +++ b/app/Http/Controllers/TeaserController.php @@ -16,7 +16,7 @@ class TeaserController extends Controller $settings = app(Settings::class) ->select('start_date', 'end_date', 'activated_teaser', 'teaser_end_activity')->first(); if ($settings->activated_teaser === 1 && $settings->teaser_end_activity > now()) { - return view('front.basic.teaser', compact('settings')); + return view('theme::fo.teaser', compact('settings')); } return redirect()->route('home'); } diff --git a/app/Http/Controllers/ViewContentController.php b/app/Http/Controllers/ViewContentController.php index 8b7342e..978fb5b 100644 --- a/app/Http/Controllers/ViewContentController.php +++ b/app/Http/Controllers/ViewContentController.php @@ -14,7 +14,7 @@ class ViewContentController extends Controller public function reglement() { $content = Content::find(3); - return view('front.basic.reglement', compact('content')); + return view('theme::fo.reglement', compact('content')); } /** @@ -25,7 +25,7 @@ class ViewContentController extends Controller public function charte() { $content = Content::find(2); - return view('front.basic.charte', compact('content')); + return view('theme::fo.charte', compact('content')); } /** @@ -36,6 +36,6 @@ class ViewContentController extends Controller public function legals() { $content = Content::find(1); - return view('front.basic.legals', compact('content')); + return view('theme::fo.legals', compact('content')); } } diff --git a/app/Http/Controllers/WinningProofController.php b/app/Http/Controllers/WinningProofController.php index 0f41d76..6337f6b 100644 --- a/app/Http/Controllers/WinningProofController.php +++ b/app/Http/Controllers/WinningProofController.php @@ -139,6 +139,6 @@ class WinningProofController extends Controller )); } - return view('front.basic.replay'); + return view('theme::fo.replay'); } } diff --git a/app/Models/InstantWin.php b/app/Models/InstantWin.php index f61d074..f185660 100644 --- a/app/Models/InstantWin.php +++ b/app/Models/InstantWin.php @@ -10,7 +10,7 @@ use Illuminate\Database\Eloquent\Model; * @property-read \Illuminate\Support\Carbon $appear_date Appear date * @property boolean $won Is the prize won ? * - * @property-read \App\Models\Prizes $prize Associated prize. + * @property-read \App\Models\Prize $prize Associated prize. * @property-read \App\Models\Participation $participation Associated participation. */ class InstantWin extends Model diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index 3d88c35..baf50f0 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -23,7 +23,7 @@ class ViewServiceProvider extends ServiceProvider // * View shares // ! Add view file pathes (also needed for console xml job). View::addNamespace('back', resource_path('views')); - View::addNamespace('theme', resource_path('theme/views')); + View::addNamespace('theme', resource_path('theme/mounted/views')); if (!app()->runningInConsole()) { $appInfos = Cache::remember('composer', 3600, function () { diff --git a/config/app.php b/config/app.php index 27d8bd6..06b5bd4 100644 --- a/config/app.php +++ b/config/app.php @@ -193,6 +193,8 @@ return [ | */ - 'aliases' => Facade::defaultAliases()->merge([])->toArray(), + 'aliases' => Facade::defaultAliases()->merge([ + 'Carbon' => \Illuminate\Support\Carbon::class, + ])->toArray(), ]; diff --git a/config/view.php b/config/view.php index d8b71b1..bb1def5 100644 --- a/config/view.php +++ b/config/view.php @@ -15,6 +15,8 @@ return [ 'paths' => [ resource_path('views'), + // ! for theme vendor publish (mail notifications par ex) + resource_path('theme/mounted/views/vendor'), // ! for vendor publish (mail notifications par ex) resource_path('views/vendor'), ], diff --git a/resources/ts/bo/bo.ts b/resources/ts/bo/bo.ts index aaec412..cd94d30 100644 --- a/resources/ts/bo/bo.ts +++ b/resources/ts/bo/bo.ts @@ -1,6 +1,6 @@ // ASSETS /// -import.meta.glob(["./../assets/images/**"]); +import.meta.glob(["./../../assets/images/**"]); // UTILITIES import "./utilities/bootstrap"; diff --git a/vite.config.ts b/vite.config.ts index 20a3015..a35e78d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -123,6 +123,8 @@ export default defineConfig({ }, }, resolve: { + // * This is important for theme + preserveSymlinks: true, extensions: ["*", ".js", ".ts", ".vue"], alias: [ { From 5dda42e9daf77af5bac04ed091144c727e2e2422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Tue, 21 Nov 2023 16:24:23 +0100 Subject: [PATCH 028/145] Sync 3 Favicon System Sync 4 Layout + homepage ok --- .gitignore | 13 ++ .../{ => Fo}/EndPageController.php | 5 +- .../{ => Fo}/EnterCodeController.php | 7 +- .../Controllers/{ => Fo}/FAQController.php | 5 +- .../Controllers/{ => Fo}/GainsController.php | 6 +- .../Controllers/{ => Fo}/HomeController.php | 6 +- .../{ => Fo}/HowToPlayController.php | 6 +- .../Controllers/{ => Fo}/LoginController.php | 19 +-- .../{ => Fo}/ProduitsController.php | 3 +- .../Controllers/{ => Fo}/Re7Controller.php | 3 +- .../{ => Fo}/RegisterController.php | 7 +- .../Controllers/{ => Fo}/TeaserController.php | 5 +- .../{ => Fo}/ViewContentController.php | 3 +- .../{ => Fo}/WinningProofController.php | 7 +- app/Http/Middleware/Authenticate.php | 3 +- app/Http/Middleware/GameCheckDate.php | 4 +- app/Http/Middleware/Re7Middleware.php | 2 +- .../Middleware/RedirectIfAuthenticated.php | 2 +- app/Http/Middleware/SecureHeaders.php | 23 +++- config/purifier.php | 4 +- package-lock.json | 108 ++++++++++++++++ package.json | 1 + public/favicon.ico | 0 public/logo.png | Bin 0 -> 49286 bytes resources/assets/images/engine/logo.png | Bin 0 -> 49286 bytes resources/assets/images/engine/logo.svg | 50 ++++++++ resources/favicon/android-chrome-192x192.png | Bin 0 -> 6693 bytes resources/favicon/android-chrome-512x512.png | Bin 0 -> 19285 bytes resources/favicon/apple-touch-icon.png | Bin 0 -> 6076 bytes resources/favicon/browserconfig.xml | 9 ++ resources/favicon/favicon-16x16.png | Bin 0 -> 963 bytes resources/favicon/favicon-32x32.png | Bin 0 -> 1750 bytes resources/favicon/favicon.ico | Bin 0 -> 15086 bytes resources/favicon/mstile-150x150.png | Bin 0 -> 6537 bytes resources/favicon/safari-pinned-tab.svg | 109 ++++++++++++++++ resources/favicon/site.webmanifest | 19 +++ resources/lang/en/cookie-notice.php | 43 +++++++ resources/lang/fr/cookie-notice.php | 43 +++++++ .../views/pages/dashboard/index.blade.php | 2 +- resources/views/vendor/errors/403.blade.php | 3 +- resources/views/vendor/errors/404.blade.php | 3 +- resources/views/vendor/errors/503.blade.php | 3 +- .../errors/illustrated-layout.blade.php | 70 ++++++----- .../views/vendor/errors/minimal.blade.php | 46 ++++--- routes/web-bo.php | 116 +++++++++--------- routes/web-fo.php | 26 ++-- routes/web-re7.php | 26 ++-- vite.config.ts | 38 ++++++ 48 files changed, 657 insertions(+), 191 deletions(-) rename app/Http/Controllers/{ => Fo}/EndPageController.php (84%) rename app/Http/Controllers/{ => Fo}/EnterCodeController.php (98%) rename app/Http/Controllers/{ => Fo}/FAQController.php (78%) rename app/Http/Controllers/{ => Fo}/GainsController.php (69%) rename app/Http/Controllers/{ => Fo}/HomeController.php (58%) rename app/Http/Controllers/{ => Fo}/HowToPlayController.php (73%) rename app/Http/Controllers/{ => Fo}/LoginController.php (95%) rename app/Http/Controllers/{ => Fo}/ProduitsController.php (86%) rename app/Http/Controllers/{ => Fo}/Re7Controller.php (96%) rename app/Http/Controllers/{ => Fo}/RegisterController.php (96%) rename app/Http/Controllers/{ => Fo}/TeaserController.php (83%) rename app/Http/Controllers/{ => Fo}/ViewContentController.php (92%) rename app/Http/Controllers/{ => Fo}/WinningProofController.php (96%) delete mode 100644 public/favicon.ico create mode 100644 public/logo.png create mode 100644 resources/assets/images/engine/logo.png create mode 100644 resources/assets/images/engine/logo.svg create mode 100644 resources/favicon/android-chrome-192x192.png create mode 100644 resources/favicon/android-chrome-512x512.png create mode 100644 resources/favicon/apple-touch-icon.png create mode 100644 resources/favicon/browserconfig.xml create mode 100644 resources/favicon/favicon-16x16.png create mode 100644 resources/favicon/favicon-32x32.png create mode 100644 resources/favicon/favicon.ico create mode 100644 resources/favicon/mstile-150x150.png create mode 100644 resources/favicon/safari-pinned-tab.svg create mode 100644 resources/favicon/site.webmanifest create mode 100644 resources/lang/en/cookie-notice.php create mode 100644 resources/lang/fr/cookie-notice.php diff --git a/.gitignore b/.gitignore index 30d15b1..b507967 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,16 @@ yarn-error.log public/fichiers storage resources/theme + +# Ignore public favicon +/public/android-chrome-192x192.png +/public/android-chrome-512x512.png +/public/apple-touch-icon.png +/public/browserconfig.xml +/public/browserconfig.xml +/public/favicon-16x16.png +/public/favicon-32x32.png +/public/favicon.ico +/public/mstile-150x150.png +/public/safari-pinned-tab.svg +/public/site.webmanifest diff --git a/app/Http/Controllers/EndPageController.php b/app/Http/Controllers/Fo/EndPageController.php similarity index 84% rename from app/Http/Controllers/EndPageController.php rename to app/Http/Controllers/Fo/EndPageController.php index 797d3cd..28a5ce6 100644 --- a/app/Http/Controllers/EndPageController.php +++ b/app/Http/Controllers/Fo/EndPageController.php @@ -1,7 +1,8 @@ route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/EnterCodeController.php b/app/Http/Controllers/Fo/EnterCodeController.php similarity index 98% rename from app/Http/Controllers/EnterCodeController.php rename to app/Http/Controllers/Fo/EnterCodeController.php index 57b5504..e8bf721 100644 --- a/app/Http/Controllers/EnterCodeController.php +++ b/app/Http/Controllers/Fo/EnterCodeController.php @@ -1,7 +1,8 @@ apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -286,6 +287,6 @@ class EnterCodeController extends Controller if ($participation) { return view('theme::fo.winning-proof', compact('participation')); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/FAQController.php b/app/Http/Controllers/Fo/FAQController.php similarity index 78% rename from app/Http/Controllers/FAQController.php rename to app/Http/Controllers/Fo/FAQController.php index 2adba55..35d1e27 100644 --- a/app/Http/Controllers/FAQController.php +++ b/app/Http/Controllers/Fo/FAQController.php @@ -1,7 +1,8 @@ route('home'); + return redirect()->route('fo.home'); } return view('theme::fo.faq', compact('questions', 'themes')); } diff --git a/app/Http/Controllers/GainsController.php b/app/Http/Controllers/Fo/GainsController.php similarity index 69% rename from app/Http/Controllers/GainsController.php rename to app/Http/Controllers/Fo/GainsController.php index 699a38a..8b8ddac 100644 --- a/app/Http/Controllers/GainsController.php +++ b/app/Http/Controllers/Fo/GainsController.php @@ -1,6 +1,8 @@ exists('theme::fo.gains')) { return view('theme::fo.gains'); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/Fo/HomeController.php similarity index 58% rename from app/Http/Controllers/HomeController.php rename to app/Http/Controllers/Fo/HomeController.php index ce5fd2d..1cc0843 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/Fo/HomeController.php @@ -1,6 +1,8 @@ exists('theme::fo.basic.how-to-play')) { return view('theme::fo.basic.how-to-play'); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/Fo/LoginController.php similarity index 95% rename from app/Http/Controllers/LoginController.php rename to app/Http/Controllers/Fo/LoginController.php index 6168213..37b0f05 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/Fo/LoginController.php @@ -1,7 +1,8 @@ middleware('guest')->except('logout'); - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -137,7 +138,7 @@ class LoginController extends Controller } //end if Auth::login($userLocal); - return redirect()->route('saisir-code'); + return redirect()->route('fo.saisir-code'); } /** @@ -148,7 +149,7 @@ class LoginController extends Controller public function logout() { Auth::logout(); - return redirect()->route('home'); + return redirect()->route('fo.home'); } /** @@ -211,17 +212,17 @@ class LoginController extends Controller public function forgotPasswordReset(Request $request, string $token) { if (!$request->hasValidSignature(false)) { - return redirect()->route('login') + return redirect()->route('fo.login') ->withErrors("Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer."); } $tokenValid = false; $user = Customer::where('password_token', $token)->first(); if (!$user) { - return redirect()->route('forgot-password', compact('tokenValid')) + return redirect()->route('fo.forgot-password', compact('tokenValid')) ->withErrors('Le lien de changement du mot de passe est incorrect.'); } $tokenValid = true; - return redirect()->route('forgot-password', compact('tokenValid', 'token')); + return redirect()->route('fo.forgot-password', compact('tokenValid', 'token')); } /** @@ -280,7 +281,7 @@ class LoginController extends Controller /** @var \App\Models\Settings $settings */ $settings = app(Settings::class); Mail::to($email)->send(new PasswordReset($user, $settings)); - return redirect()->route('login') + return redirect()->route('fo.login') ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); } @@ -310,7 +311,7 @@ class LoginController extends Controller if ($update->status === 'OK') { $user->password_token = null; $user->save(); - return redirect()->route('login') + return redirect()->route('fo.login') ->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); } else { if ($update->code === 123) { diff --git a/app/Http/Controllers/ProduitsController.php b/app/Http/Controllers/Fo/ProduitsController.php similarity index 86% rename from app/Http/Controllers/ProduitsController.php rename to app/Http/Controllers/Fo/ProduitsController.php index b70a715..f88d58c 100644 --- a/app/Http/Controllers/ProduitsController.php +++ b/app/Http/Controllers/Fo/ProduitsController.php @@ -1,7 +1,8 @@ middleware('guest'); - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -132,7 +133,7 @@ class RegisterController extends Controller Mail::to($email)->send(new VerifyEmail($user)); - return redirect()->route('login') + return redirect()->route('fo.login') ->with( 'success', "Pour finaliser votre inscription, diff --git a/app/Http/Controllers/TeaserController.php b/app/Http/Controllers/Fo/TeaserController.php similarity index 83% rename from app/Http/Controllers/TeaserController.php rename to app/Http/Controllers/Fo/TeaserController.php index ace5639..523cb02 100644 --- a/app/Http/Controllers/TeaserController.php +++ b/app/Http/Controllers/Fo/TeaserController.php @@ -1,7 +1,8 @@ activated_teaser === 1 && $settings->teaser_end_activity > now()) { return view('theme::fo.teaser', compact('settings')); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/ViewContentController.php b/app/Http/Controllers/Fo/ViewContentController.php similarity index 92% rename from app/Http/Controllers/ViewContentController.php rename to app/Http/Controllers/Fo/ViewContentController.php index 978fb5b..b574dfe 100644 --- a/app/Http/Controllers/ViewContentController.php +++ b/app/Http/Controllers/Fo/ViewContentController.php @@ -1,7 +1,8 @@ apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -43,7 +44,7 @@ class WinningProofController extends Controller ['barcode', null] ])->has('instantWin')->first(); if (!$participation) { - return redirect()->route('home'); + return redirect()->route('fo.home'); } $request->validate([ diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index cc5ba2f..a332aa5 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -31,9 +31,8 @@ class Authenticate extends Middleware } } } - return route('login'); + return route('fo.login'); } - abort(401); return null; } diff --git a/app/Http/Middleware/GameCheckDate.php b/app/Http/Middleware/GameCheckDate.php index 38b4a99..bc7babf 100644 --- a/app/Http/Middleware/GameCheckDate.php +++ b/app/Http/Middleware/GameCheckDate.php @@ -23,7 +23,7 @@ class GameCheckDate // Check si le teaser est actif. if ($settings->start_date > now()) { if ($settings->activated_teaser === 1 && $settings->teaser_end_activity > now()) { - return redirect()->route('teaser'); + return redirect()->route('fo.teaser'); } return redirect($settings->redirect_close); } @@ -31,7 +31,7 @@ class GameCheckDate // Check si le jeu est terminé. if ($settings->end_date < now()) { if ($settings->activated_close_page === 1 && $settings->close_page_active_date > now()) { - return redirect()->route('end'); + return redirect()->route('fo.end'); } return redirect($settings->redirect_close); } diff --git a/app/Http/Middleware/Re7Middleware.php b/app/Http/Middleware/Re7Middleware.php index 67a8999..8b67215 100644 --- a/app/Http/Middleware/Re7Middleware.php +++ b/app/Http/Middleware/Re7Middleware.php @@ -17,7 +17,7 @@ class Re7Middleware public function handle(Request $request, Closure $next) { if (config('app.env') === 'production') { - return redirect()->route('home'); + return redirect()->route('fo.home'); } return $next($request); } diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 51604d6..393cabe 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -27,7 +27,7 @@ class RedirectIfAuthenticated if (Auth::guard($guard)->check()) { switch ($guard) { case 'frontend': - return \redirect()->route('home'); + return \redirect()->route('fo.home'); case 'backend': if (!$request->routeIs('bo.*')) { continue; diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index 8d77e62..c5e47cf 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -34,6 +34,8 @@ class SecureHeaders public function handle(Request $request, Closure $next): Response { // phpcs:enable + // * For Vite DEV + $host = \parse_url(\config('app.url'), \PHP_URL_HOST); View::share('nonce', $nonce = Vite::useCspNonce()); // * For VueJS dev tool to execute $jsDev = config('app.debug') ? "'unsafe-eval' 'unsafe-inline'" : "'nonce-{$nonce}' 'strict-dynamic'"; @@ -51,14 +53,23 @@ class SecureHeaders "default-src 'none';", "manifest-src 'self';", // * CKEDITOR Specific https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/csp.html - "connect-src 'self' blob:;", + "connect-src 'self' " . implode(' ', [ + // * VITE DEV + config('app.debug') ? "wss://{$host}:4443" : '', + config('app.debug') ? "https://{$host}:4443" : '', + 'https://yl.s-web.fr' + ]) . ';', "img-src * data: blob:;", 'frame-src ' . implode(' ', [ 'https://www.google.com/recaptcha/', 'https://recaptcha.google.com/recaptcha/', 'https://www.google.com/maps/' ]) . ';', - "font-src 'self' data: https://fonts.gstatic.com;", + "font-src 'self' data: " . \implode(' ', [ + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', + 'https://fonts.gstatic.com;' + ]) . ';', // ! Using CKEditor will must have unsafe-inline style // phpcs:ignore Generic.Files.LineLength.TooLong "style-src 'self' 'unsafe-inline' " . \implode(' ', [ @@ -67,7 +78,9 @@ class SecureHeaders 'https://fonts.googleapis.com', 'https://cdn.jsdelivr.net', 'https://use.fontawesome.com', - 'https://fonts.googleapis.com' + 'https://fonts.googleapis.com', + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', ]) . ';', // ! If you dont use ckeditor use this // "style-src 'self' 'nonce-$nonce';", @@ -77,6 +90,8 @@ class SecureHeaders 'https://www.googletagmanager.com', 'https://cdnjs.cloudflare.com', "$scheme://www.google-analytics.com", + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', ]) . ';' ]; @@ -94,7 +109,7 @@ class SecureHeaders * @param array $headerList * @return void */ - private function removeUnwantedHeaders(array $headerList) + private function removeUnwantedHeaders(array $headerList): void { foreach ($headerList as $header) { header_remove($header); diff --git a/config/purifier.php b/config/purifier.php index d74b7a6..59cb78b 100644 --- a/config/purifier.php +++ b/config/purifier.php @@ -27,7 +27,7 @@ return [ 'default' => [ 'HTML.SafeIframe' => true, // * For iframes - 'URI.SafeIframeRegexp' => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/)%", + 'URI.SafeIframeRegexp' => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/|www.dailymotion.com/video/)%", 'HTML.Doctype' => 'HTML 4.01 Transitional', // * Legacy filter en full avec safe legacy. // 'HTML.Allowed' => 'h1[style|id],h2[style|id],h3[style|id],h4[style|id],h5[style|id],h6[style|id],figure[class|style],oembed[url],div[style],b,strong,i,em,u,s,pre,code[class],a[href|title|target|rel|id],ul[style],ol[style],dl[style],li,p[style],br,span[style|class],img[width|height|alt|src|style|class|title],iframe[src|width|height|class|frameborder|style],table[style|align|border|cellspacing|cellpadding|width],thead,tbody,th[colspan|align|valign|style],tr[align|valign|style],td[style|colspan|rowspan|scope|align|valign],hr,dl,dt,mark[class]', @@ -43,7 +43,7 @@ return [ ], "youtube" => [ "HTML.SafeIframe" => 'true', - "URI.SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/)%", + "URI.SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/|www.dailymotion.com/video/)%", ], 'custom_definition' => [ 'id' => 'html5-definitions', diff --git a/package-lock.json b/package-lock.json index d7393c1..a4ec7fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "prettier": "latest", "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", + "rollup-plugin-copy": "^3.5.0", "sass": "latest", "slugify": "^1.6.6", "stylelint": "latest", @@ -2530,6 +2531,25 @@ "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.14", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", @@ -2543,6 +2563,12 @@ "dev": true, "peer": true }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", @@ -4157,6 +4183,12 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -7486,6 +7518,82 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-copy": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-copy/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup-plugin-copy/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/rollup-plugin-copy/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", diff --git a/package.json b/package.json index 8fc5a8b..633e7dc 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "prettier": "latest", "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", + "rollup-plugin-copy": "^3.5.0", "sass": "latest", "slugify": "^1.6.6", "stylelint": "latest", diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..572f192cb60ae19d350eb79ddbd4b711ffc5396d GIT binary patch literal 49286 zcmc$_hdb5(|3B^=Av+OeW@PWI$S8a7y(4?eUPls{MM5&OcO8446jF5Td8}k}NH{nS z--p-x_xT%sb*bxeo#*{L#(muGxBKn+N>4|XoP?eP4-b!AT}{aV4-Z;?^>dvN{HDEy z+zR|h_(W4x3GediZ$W2SI`|E-kD9qZcw*}62lALZCm0X!E}pv5BctHio%x^^E91_~ zznCE8heH)AC>!+g%^!`0Me!FKw>b(QWM@;~e6DbVN-yDAN@0A#s5>{Ij-L~!qBbI) zMqlVT!8d3cjNsa1u2>qsUki(iEdCt}VYdWVt7TWiZIJ0)%W_klKWyN~&c{2QwDJEx z{K3m=Q&9S|_|HmE(Q@v3TRYL{q{KCNVGHF6%cZU_>Ls>5>Xb!QpHjc!-1cH`eqM9H zF*LrYgx~h!x1dT>qsw{!y_5|dT)!o?$7B5Rq#4U?$01B} zdl5Fg}l<4tbPx}*-UkXL zA!+M*VYBG=I#p|qs}&U8kd6ptsOxMZ$R0Fl@s6F5vh!b3JWOrRPcC9OVc6%`zvh&> zd~w_Nyxh2|t};wX31X~dArv3@OzGjp$r?gcc#Z^Kgy8TmGY zkL6Ryzjsyc|2^=YJqg|7@Qz&Kwq}|~;!IPPXDqgVglWVCemnSj@O60H#^!0GaTT)4 z^1qL7F{pgurtOE$Eq5{1Gu4wfHZPT2hBQewT%>V?z$U7qKFZYmcNO;do8uMR!()b| zAJq*=i=94>-#_4df?~msd^Ho(a+&74!VJH2|7JjPJa<9D_jb}^!_w+01~qxo9g^^* z!%4!7cO6^PeoL7xi^(&%!^86*l@sDyx2g0MZoP?OQ6r5d_gy50Bk}Wz`YKF0g6#q> zbx~0&G`P3DiBUE8>aNyWEKf8_O#Mh>wq;?$rI@0Rj^YIyyL1qNbt7yY(dn;7U z`oFc-Fsix#l=URtNtvld9B;&Ox_U(6qkC|IX@8h&e)3*yGkAaM)=c z#b3v(if;F*BV@7f>)9weDeu+ppN5wY+q#YpWRfJudl7;8fUul)}E-& z9Wer_+h(S+YzC5)ko)GXpB?|L377_5UGQO@-us`OsUCr%>IY8+NN=HdmqM2AElpgW zIUMt<8(X#^vTb<3Z087^ovgZFKqnW1E*HJ%)@vWn4P zvXbv6OcGA^;qs$YN8~TUIv3<`{@Ttmj^5_ZKuh`ryo!fbs%;aFsi({7(nJtUvv}S= zv$@y#<{vA#4Tx$V!Z0j;qS_2lxXynE!f|#`LPc;Qs7Y# zHJPM#uxmzhiG)Eh;GdhAviPF1O>|@*@ZT>;TYSRtW^2q7U+XkShawk;G{^gc68#>e zC`lp-LN@YG&7Sx4ptTKtr;=L~;OO71k(I{w^uy}#b`ioy-*bX)?Mp6+ETtk=5Nxxv zc@4jQ(QVtba#ECg&(!{1ArkeNj*Bl6fQe*z&SMGOH0{b?u3Dav`w;M%ylu3~xH^;- zt{RYHCE6*`s`&YasppBNB4M{Nsy=lDqa3H{Adg7yJn$TWot5tHZo~)wex>cR_?}~? z4RdER72+`bkVdG25Wu@we|wOBDI;{vjn2LW$qqyJJ5X z>27VUD?Z=4>kK*4#@hdQTlg#}s#vl*vIDc{36mfXXcK8C#*o%nU6iybUIpyJ@~UDM zQv%jLD|u^*&gDebM;=Z2hC{yD?Wj(`FXfirVzqavuJ_8(l)M(>9_%VvC1Oo*;TFNy zF^P8`e0IF=9O(Xz2IL6!y&fxWk2vhBEbZc`E|&vFCwX>tbpOsHm828vDw`x=>aVkd zqMeMJOhE+2H0}4}ugLFX2#l+H`=qptsmtV*5#pe~0<=L0+%>zp$jQUrEF2d)$RSX^ zWYhuo)KiUM95WqdSV~q>w(igpMGLp~U4+~oPnDAq!p{`3L);7eN?zwedkfgv%pvs< z%w$dQLl9?0G~|n636_|b1ecikGA|drk=;d?@|ic)*x_h zgTMBW`CM0?fC**ImFrAi{Ym)^$6*Jj^+s!;qEcq&TNaf|4#IZxKEmFQ(jgiL90Sqh zRqc?Rrr`8;ksNJZWOI#0gaP|iy#LuH8Y|IE%*rM7Sm@D?AZek-w5z8PBzKIbL*3-J z_KuH-)Y7b@i4o`qbc#E%ljO*l|9j&q(ttH(;N%x|cA?Vyg|r?|{=c+WR<&(Ef6rLK zbEB(Hw!7^lp_)-n765dcIatLH=+-0#Ga9i?1c{?p3LPFIQA&ss` zMOD>rMapwm*-NOVdBKP5t&jW|Z-%n;3P`u3`9i^|@?G*yi=~Z`KWqt5F<}`Tt=f;& zAdUBsnx9(4(GT2$Oqx9lOK~eHTf{Y=-_-->{yx{)a*KpI8eXycVvM)&kOHOIiA=8@ zH8)Y%m0ah}oJ-Iu#iM}yeg6>7+6L_(u zxAv_Kp2qyDhE{gO_)A5eE2t!8#m|f{2vrPq9Br|obQ?8FD(~}wEISnV=)JK0b;USl z(s1hAlf^@3u`@%6qoh0jsY6+BHU@bMeuO>DPv`PhO4EW+e2eg)mRyxXr8a7;+UFVr zS9Cp0)CC9M6Kfa^hhZdL?_b2vXc1EEG=N;TQC%wR<<|;nXe2Lb52Mi+d#mMiT~?M| zm?3(`ew;RG@9WG|=^GBA-(Al=0ttLOUT~OyfkF6=_uB*5m9z})Do;; zJS6m=B@AW%OZruQwd3EtrFzrMEiYyl7KWT|3Dae{t{wmQtBc|qs6zN7NV8-Uv7{UW{%zEAL@Q6X z#sffE!WWUDxjpql+w2v#m5ez&Z|Hrag|iX3BzpFwB+eXJIt-7tWbF{`@5l!+g!2XM zC3{OBnw#sC(>$Kf5UHn8LK~yL5=AG&j?VOhs*8@34#u)%W3h%Uml@oZIPB?q{wFMY zd!#&sVTB~=$=`o1EEGFL4dUk17tgUGCKaesI1jj*qqeN^CQjL#a0)vmYGYXl`rFPE zjS`v0`Hh?pi#&!eN9Sb;;R0%D0`Wy6Evbb~zgDHU3Y$I2ouclk(?SyCi@0E1K2beC zR=cah77i2lumet%{kUPy^PYd~sMN_6BM=v9$Gso*rr*pWPlw>cT{C_t&2N8|O={#y z;U|k-F8sD~FF9ra<`bDCnWo41Dikx5xZT;mwtst{+bPxlxI7>Lr)>St_E7+yeuJdb zBA(oslJOp4?cMYT+DP$4P#sPZdtE-ykopLT={M&0>^v^oXuF6k+_&<&?Zm>Gekz4# zDLd}iHxa{pmao|$Sh62v=2U0y+p!0kY;tcsACy~78Ya@6c_rJtJV?rCzf)Rr_p1cB zO{%!Nd%oF{A2U4jEKR<(43psjj<-&D|8e#U#w86ZS8{Cdu$)8?XPE7prXW;S?qph<4dB++e zRT!I>p@BKB`uFx{jkW~V93?*%Rx3wLHgVl+wJKiVTI4G%e#<3S#*dG<&1|=P(WkPZ zp(zMl)woHl%d@|XlIPlW!uuq_SXUVa@JGj)B^&-Py3RXE2qD4kDz(u|H~$(5u<+wDsNj&iFe7 z-;=8Eo0 ztAxy%vRMJYBUP#dnpaNG-yv+WBB)OIEe_PTR`w7~h~000J3$-emW`ZFk#V{s8_MfL zpNt#3TvSU_^hBfD#TkLQvmhw}+HM$DTnwE^K&;mnp~AQO<2Qgy!gDMboa?X7{*uN{ zit`)r9MHnpSD_}htq(8l26bGQ9w4KuUadF;NE*}Vm0S{x%}TsmBFrv4ogBPmg@CX7tNYLhWPL^=&wj2`CqyN(fla+@#}k;(3xZ^9rE zMtqr3g{<5p<)iXF{{i!E2<8*HMX#;>u{K{uv{KAj zxJH0QoH}bfIOE?bI0=arHmqF8fy%ePU&i09&YH1n|5>!aM@7$Q^(CG9!aZAO+ovy0 zMYi!K-RieGVOS%u!)kj@utO_W-uz23r+f6?L*4RE0+TW{g2auZt~%ns-{{oRzQTk? zvyc^y(`2qcefJc{p`e@F0JzKt3N4nndv@-is8WvFL%4iZ!7Q4Y}=39#NW9_ zrn>#Bbh$3e8o(*aYKw@j3OQ`=?>3GBvcXcxX)|9`_s{Qd$|SZw>Vq7OdY32}NLGy zk?q z?mpce=1n5U$H$FoY4GT;u=422z)zD}w+M_}KX@OWo=Xa2DU#t$n;J`GDoIk^ck+@C zUQx&058gKwmU-Vde<3U|k8sGsQDFLo!^q&OGfxt`#pg5y$r)`_(}uhVJjgv>VWaR^ z@F#cIt*KWc`Fv`PdAq$5{LQf?t0YU*6tZzT-b_>~Z-Tmp|eN&;J%-X=jNFLU7W_=x97$$@S* z^ZniNe7uISEX&U060fDHEF2j;e{3FC0Gi0Hv9ZHwaYY)>m>CMhde~)>7p|&AmheOW z{<3xQ#q{g-f9WFau-PrjWIIR)JCF0IE!pK@kG3_qy?YhxMq5Zf?gjdVn0)vI6FX;lEZ+8|)Yr~iIf(W1Pn`YgR zN_ce;ref}p2XsE0IqHJ>i-d4X*bqa3H1ekMSWVS-9QmAWY){}-i=iVRLG#W&kP9u( zk+S#M?Z`Yr`j3D-X)6kE5P+v$$d0n-D$L}7WS{BxiD;FHskn<8=oU1i!`Y39vL3aD zt5nr!^OKaPMNZGswM5SzCml_y(=d5jTi1zi^ak^ZX2W3-790PLoCm$QQoQ?d&K8S$ z3oFi!hM#9Tee&_nG5mhsf)BcF@W-u`PrLf-{4Ky_jWA0jr)MeDI2hc5o9%O*W+S;Uof3!@&0LP!qBL8~%tGp_W zHXe!Cq(t6c(W48ZC9Nu>N^#O#MsSKAS!dTfU47!+a=+!{)peHzeOYbVqN! zvKpFFX4Ta(f>t_QIDJ3}cgQ)fMS2V8DC+7OBhxj$hIavW!Qu44+Q+-!BcJm!XctQC1mX^rrN633AWpbg!37hX=gHvAPA3H2QE^k?KAp=iXA`Ct0=QwdQE10<7a6~0ptR4;qlkwC z(G)*c;fDurxeI<=eqcH{ofpX=O{(7JSdElZ_w)PMnFNqh@SxzeKC$J^h+7+M3DOLI zbyB|1kyW_^c zDO{4H{;%cidv3g>kfoB!TMLD3dAHaqN`!S@HHRuK4TtBAD=FqGsSDH?Md7*hH4Ehx zNYREGK(6KXXVgjI7ukUKysgc>d17EZW!@wt<=(N;R8U_suvI~^%F2=K7f_D=XG z`!mt}ODU(Pc8Ss^4kG#uWdQ-QMI$w!h(Bekn`h#OP;Z+h(~0m|R6O&>k3FvW?kHFq z(!?1-1>g4R{sCGwSI5NjDPBD6??|b}A-wm?78qWqGC-ST7+3i!90x$-l;f6lmY9uH~Q1*SGjNtuUhai>=k?dE#B~+i|bBwpPsp@ z3sJ{+^s3$i`9z8yj_>kPH2}rJnvml0HsBFc(&OcAM2JF@&O|Ui#?_?at#}bQeq*lf zfpkf>ls#zQ#3y<>$x+=i8}2{Rq^{?50yk0X_JMCQeqvn35<6m$SB*@Oi?ov}9)nnD zfXH@n&2E-Ti2irdSR^Dv`q=t8cEqH@s&b?n##$iBiw8UW#<-3 z-nLsKIL?^Y*@c6zK%+|Q$L=o6J@v?I)wX54{A?*0&$kiton{YjU`Sz&^d}9SP^%v> zNTy5ctv7Oc_-@`+QPJGepK7DGcVj>2#22xHFe*eF&s?>U9zKHT{_#)pg2e_8R7lT& zb-3;~kaiK2(T&?;*(h~R!-m@0sjUS%BF1`%tgI8C-3SxJj)k3CZl!R}dcM3G-#dV%;5r?&WP;#Dt7JAQyfW8PDBD zkIAJ!G?FC>&ynhC8)*u&Ge|!_urjqmSTG>vp(&_F$fb^Doh4Gk`z_ea@aPZAok2Xs&2!fC`=94Cl3s@Arf>LF4&u{HrEuhP=4FIq*qkiB??_btBcUyRADYWin8Klpm z^5@unX`0I$z8&oVr?@rn0!$q7Q=Sa-bNi;wP}k2a5w6*!JL>bZ^1i=)UXryY&Dx-n z9SM9ye9vXIKd=diOrc+5o1=Bb%qH?6rQ>1jsSCzbYxoSj#R*WisC;44Saz7^mXA)m z2(~gqV`{t+*C@kajfkV)X!wTU|2#A1alF$@U&1CJwm#W}Cjec?W02IFxVa?r@G@Lg zHq-6^L~l`HipIJx6JKFQlTTn8~<9NFzU(G?l9&^_hWrL(Ef0)UjLSrmE2dC)0 ze8)Wtyl;_~VEp32gUP+@v2~wCz`ia{eA;DzN)DSLV`LMse?i?H-k{l3_5b^pXM1E` z7GLVcS#{ollOz>IvtMhK7tUZV#Elb8G*NhBOWoh@`V|00b!?0+zfMnQ;^E?CRGJjC z_rz9ufIGHWJ?w@u95#~dD;iGhw75BsQ+Ll!I9v<~VMNp6w~PPESg0gplGX?Uh0~vRpWIFX-)NJ3 zNsTYFu6E_f{mI@D-|mnhde?f;Hm3+Agx8coVc0y5ftq66(&J-$4b+!|+*S&Ebq z7M*{Ni%Vi`O&$8s|6sZ9|Fi%zHTo4W-Uw{r1sOUBqG%|1X3&=++h$`wNE*9|C=u(k zJR^-S`U+4dPqG?Sh^oK2T>jUc&o57ktSyC}$yb@=*BaV-#LVOtcbjYtefwJ+I`2V6 zFm6It#?ptAv#WWVC^z+Em3n)0ZT4TODc%_U5={r;2N1|w$tqMKQ~xXg{lhU31XE;K zqCdZ>p4QyzA7xP1HJ!xKN;=KIT2u$hv`?}MflO`^6iwk<;=bG&4z z6;wYr zmX8eh-+0CYm0HYfX>_Rzzb&@mlOygPz;tFWJ6YWdr)bw<@?Jf_h+Ub^jrwXshslRn zmYR7``oJ=NW{l5S&Png*AZCiY$p$XTHk>j?$NVcn-f#!zms%r3F%eueh&xUJ2|xF&)_V&vQEm2@{E8V=DU2U~%2ru3DVlR8 zmopnPGgWQW#(Q+En=Seljh>5UGUN}u<hR6+ZIWlB*D0ZZJc= z*IN4`9XCc7O>82_QtHFYcH~$xiti}Og6}l-iQXJlcldajP4`sg9ccRtYCMIO7HATg zlCTev>-{d*B!-OW^I&9J(G=11f|ZORPzEhiVz!h1?eB3LGeF4QIx6WR z+gg7+sv&+Rf=JEIn%>_Ws5&CTiHdg9l}NUXAH62n5L>0y@9i{ij@Acb1p2*sT=2q52G0%;8o6Ew<@2GS7OS;yky9K@gG3h?eQ*hk< z%IW+hI*BnvvR+X`nX{91_vPDeoR<>gA|$*;$2x-2iNMpCmrcMQ$4%2kW~CC5x3ULG zsrL(Us`RX#A8w_b=4=e)90&#w*DJZ@&^5avlwRD;DPfsruq!WAYG}3ZWn>5TV(M#YE6`bt z9JAHgdd8QD)Ozs2OPSN3uHK%h?IZxz?UA8j{83xU;@HBVy=t0Z$EJ+eN~1O0=zUco z7#cWn3?L0Vn$9ztnshCl*AwY|Ny=+v3u#EOP|1?XOEjHD$wBg4{1Yw_ELD9Vu;`1z zj9H$sjSAKBv|7FNIOa#`mX8JCNcvK6@4HR5T0Kem@I<5^EGbI?P}cotwd4& zZ<*{Hn#2{DIgbuoZW2R~#}7{w1l|r1#r!&Tf4+&-tv44vl@rq%CF#O*448WXw7wixA5`8$-L}mdHe?VdZ#BX`K=6-& z9N`vEWMb|$)Z;VFyoXvep6(exQpLY3DFJjn#glP>c*R55ywKyRE1G>O_f*48lDFD` zXC?B9MsFkJsr(X*Tx=AYZyNB3WVr@#O>4zQs3&$|V7Bzm4_nK%D{z9^bDXIBFqG45 z^-&9m#TFh;6JZ`8UcXJe5cfSN07*oc zoZlbG^PRrMCyMnzQ>+6XA@)t?-tSH!XnAO+w9|I7*HY;6kSr-PPkB;5UIXy;X{R<1 z+re?2YEIe!>d~x_ZmaxbPB=Uup!1!E?^r4MlcOyb!?|yF$qj3)(Bs#)!@%;k6rn0K z);R`J1X8@KKGL_~nuZi*RndX5hE#8Y0MpieQ#qdit=Vjc5t)9{5m)i@zw z5z$-*Zp&KU-k0SnW-$K>!Rs_j3B3-!mo^%UdPum&>I<5$n~_<@Y8Ypnsajemn4Mt7 z+mw_RR?l;PlHW~lCCp0m8^MfCHmO<&?S%?TzSCNR*wxS^gguwKC^oLr6z@4pK^MFv z_Q~(V&GFm{A_7c=n`e%gE9GFD0Y#ZESed@mEvgXjY71+{*6_Q+G0!qrvHbJ%%_l(7 zVBog?IL(p8PMf6H^AV?i=XPm6)J-vNjK^^D>yFB(x!8&Q?CgPSO~6)ck6>rwKBd-? zW%G`LkKe)0d>J;A8#k#oSMW@Ettoeii%-W6 z7m}DGI)k1Sr^#0voI=p+CDhRKhe9+>W8V!FJRc^~=EAVGJZ~G`bI&gRSY0Y{#`!LX+s}yxikHMp6M%z)hbpl6#F1|IW?` zf#hnr+c{g$MM zU`(1@@zPMr6htuxpv}%-NnJ4RXVN6%-qVq+myLD-b`K~n(3%F^XiXb##%lc%m_=0f zpqAYjjmDY2h4)UFASN>HkImg0+)E~m1NeGZ8$^eaS6t%B}$spZ9441si~am&JN0(;A~tv5c1jmVs3DVH)!-gxqc{4peVml2!;& z_sihBdcGFDj%3G*gs7k6F(}@vD47R8N`hkw5 z3=&s19^<_vH}GSXK|D)IiC(zaq)OBL)03d3+P4W-aavB%bcx$#!%b70n=_PVv=1q{ z1}5YJwxsFxNy=TXweG^w4Y;@H$XN1zd|k2OXIAjsZWpVDcDZEy@TAvfV{aCfSQ?63d$h-8m~du4K5B+#J5FeaBas|M*URjBIN~xNyGAbpmf>v3mQHKojZQbvldI z@KTjG@oJhc$ID(7&BN9WxxJ_-t9e2MGl^$Q2}l?2ru=(h%M##B5-a3R!&A@|<~|wD zay^3YqM2i0;LE=!VOXM9MK@oo7p@C}D#1Xn09M6l(B77Z@St3pph=iZ)>^aVxwgj@ z{n5|`d1}KQuJBO}a+FKdrk)_#AI1+2H^8YbE1IV{e5C$H@|=X-B6*GoB_L< zQZdVmaf3}v)~>QA^}Au6zfXMgmppkhogsxm(u@$RLaJie*)M!+dhgx#C_p>N6L=2~ z7n(X8kI=NC%MK62XL`DcdDz&JsSQ{VI6OB^5<&qI%yy?4BVC8SZ}{ySp|S@;p>p!( z>|jm13=%tHJ(mra4!jvl-ejS2QDnn;kLzT0Xm%OSyz1lQ#q88-jJ*1GazKhH3X&Or z^Jvbnrb{DDi%p?vt9J|iH{an5NXJL^ zo(PKi$fc%-gD^}qoYG1jf&ESu+*l3)Lw>JoWsmK?~SkQAtt`LHNrV})JJ zI{_?xeZaJCxpuQ#fa|d66|**d&&Rt{i)Pn3H<$0fy?MSIclYgn=p$l2xOM_sv*+(b z{r)^?k-ynMh9M1~ZFoddj>`hs9-k>XF&iYh)aOkfJ0mQYk`TLU!Z~0Btn1o#3t+n2 zJ6#m#4}ExY-f&D^BcB6pghL?r4I=(E#cG>~4^X#mo$^S*8-9`rrY`QJ*s(}K$s~?V z=wl&WU%!n40XDXp0jFO(z%L;{eptKyFh8HZL16X38#bIun70$#1B4JbksR8@d`Kzb zMFFD&kY5lAu&1{&-llG8_xflhr)yXpAK$TUXIdji`R6)r^zFgS9vnu8S4}h9pLsv|RVAF=O z;bc@)Z@R7rm5jzBj-nG!ujxN?S_(YBzCprhfW%k{euT|Zp1dGdgx$xdEWZzsnt%OQ zpfhn4%~kl`e2WS03Y1Zmn?_1XXGWHDR9`SHk}|(YW0~-qR~QiP5Y3b8`eKdUGlufUR_Kq>n4XAio*0WjVOXMD_fhzaj}vH6vShcbbIwFnQkeT}6L{$QP7p-n5w zC|zR42IK({@bMNj2@BCqaV4aXK738l46^L?$(N7qsZmHWlriSu{9l+dB^DWx0oT#P|3z(B!l_UxeE!ZqwG2 zBX9N-?9$w0WBa1$R^lh)w0=$C8*bxuyVgw79b&X9A;oNeNMU^;)Q$AO%8PHXG#2}I z#_zY(j^u~O%fhH2k~_=M_(1HdK2{nZU;O0nZ*K_YHGWn_njw-_nRK94=)-NnJZ~q= zn1eQ$8|biJlbiKyf(b4Iza1S33*Iksl;*l+Yj~=YCKZ)>;(U-TCE8HflDYZ@<`eKs zi{Y1`b|5q%b3O%hi7X}xo~$?-BAp!E>6rHvd>mJ%z}G$m45sn0F6PfdoUoTqilkn}GlKJwghyCc7@(4^oVn z*D?kVeBuKFyUI890JQw^ySI!g@Go}vyAvfT?dPhAZs>CDvJ=bd-+nG&O^h$JK+0 zmc={uFBCgEafV+~Y}&Jrln@=mBMCwJmZAm6a$)ob=%qUDjOU%X>%G4(UZ9K+J2wHT z6gd>i#x}Y^_Caf{9@eg<%rOv4L0fzQGUp1j-`@*??@pFz^YO`!m^P0YF}pFle%&-` z#m*yiE6NVlO;;b3=hT}p20X&`-Rs$jBO0G42sSyzPg3I3BYYVQ(L~Rg7I6(GVIR9! zp>BKV8?5=Vxz0eD#4$Z`KRX?!-4pR+*S!<@4ZIg8mTIs`GKi+QeemnZbxehz_3(K* z2P^*ZyP9K_sO|Yj)=eI~%ji5#R_`$|PvG$hM=V@bg76_fuzrtF#RXGXMs$K%{zR27 zrO73r&I$RiXKoa|YfGFpfHY!QmtP0z@`1)pZtY(rypd>EDo{ zA>lxKF*=q-+AH?QC`V+jHMLn)f) z=H6s;v)-B3tQA#at_{%ng+UaMu{nyyLDUP_0*}Mx=<12f2&&p=RI|lg=?KONfA{{T zgQXHlhf6v+6I6vuV2x4zgwkguzfZ1fyMq0TvNl$2n<9*tN$UTF1HSPQg>}U_6};CX4$Z0cxde5MF$Am9>P zYCL^bz@_IjGXY9EUxCD9iJD!!PYwlN>%Q#l_&DE{CNz^D9$|ShnDtXE@m0K9)u#vk z?;wk0x7l=$th~%#D+UF~Mw_>&?zzo8hBTskY6T>If{{KE@g&gpWic`EHai3s1KRH{ z_~r!G#^cCdU3{j<2+{01qUwtWFG6W2BBB7z&0R40rn%YsQA_h;SbUNHSK|d;LX~UM zXGfqi!Q$i9`26MRZ2gIx^O z2Qxd_h$V%X&tIL8Hr1}0pp?aOOOprl43BiL#r6?uGSM=#2dNS2tAK-R z;0xXSg;LmiHsq>kR)oO#vIsU10r97OO)NIt?TVS7iUAvry4gPkwQpjV%vo!-dVTZ* zh!4g0R}?xwQ~k`0Qiq6Z&+Nz{N`YgugLx$jhy2>V{A+dXD`Ig7R?cwFU1y={fiC zG6wV5zWwfzVCEi#nZjsKH~7=Z9fEPO&ww0JjYbkkpL>T91ussu0}b}|MpZO_l@YTF zNNe&{^VP(kcHS<_v0JrK1pAYv7$|5fGDh878d0QpoepIRBJg?dbdQQ^a}Qt;b|24z z8?CB)=!^*OzrT6+jS7al@^!O6=Rw`R3#t6ad(7f9UEEPgDkrQ6lDkw#1%dsMR$E2t zjHSiLUw=ImNoscI&$POq#_OFh5K}F-H_BBB>z#%&Z|N!0i#qb6zXFd5&v^is8E&rC zBgJ+7D0s9u<-q}5F>D}LHcZ5cj!63a#eyoi;)_N1=qc#x>&=Cc5wX^~Q)ngDK3WIm z_xq&nu5qn^_9xwfi<1;k$dtz3#K(V+y6>~pil}0}skmpd8WFYRb`*fBqZnt;IXGDf z<1Tpl{Yh-kx-d3X;n5zENsS=6-;UPWH-!isBcG{Fsks`!(owOU;BAp>VSm40`F}I9 z-wsD>lCV%n^o;5I)pPMVrg1%{?G_^9(9XG!+7x2Lzv@r_nSvU~cFCL5c{^B6Ei$3# zuBHso5r_#3>7|B`04?(^J*?=)t;B687HlgQ%$-SS*is1|d)z;Eeo5I)0cyu7CUXh! z%U=RtJ`*}#c(E0x?x$WLIPiLau?RNXOo2y8Nb-h`;7&VWZey@tqUCNo6NMFmP$)L$ zHy5Q2mO#9jd+bT?2(tRMlZXQ52jBf$wLa!Itr3@_$DmB7#C=J`a3b`3aaH`UP{vcC zj{V1FPD}uYT(a*7nC%l5Hr-4v+LZI0Emtt6JW3f*Q5q3Uj$C-pRsiJiO$b#e!QxMk zzNBI#r3@GYEyXKXA9%L!bunwpfQ@^9EqHW4y31Aw6(Ln+5*s29s?khKoOuaX0)>IX zE~)y>N_NvX9QJ4>iaUO{>jPoz^2&_c=n8OMbB=)N?UNm}HiFk-0i}9&UjJ{s?wd#8 zYw7mAmEB!;(A;OrRp%ZaE5uZSo-Dua%^Dah5TsBTt-}E+`*9Pv_aCO)4^Ma>qm*Nh zLRON)UrRfS-p4=cyPHXU)S1q&xH{)3DWk|F$=49PRKL(h6-f%0m91}`o$gCqMD2;z=*&C8CEpTtLj z9bs8HhO)B$__1zkX#>fjwe(mDHwjC;$JG;!ywfrL`ZQZJW10ZzT8|}yBMJkrUJ>7T zLf40T%#Q+c1KzuXKS!LD_cmO<^G{DhCS=F)JDSZ*P4lA|01**^QhdnWnUO+9$(d8O{TRHsU(mQXb@vfUXh1&^m}~fxl<#ruG&Xxf!bSD=JLSInrvJIovlAGQ zYg{GdY5`nw6W{kd;_kQ5-*Lf$k_AY`0MjXU#2)l%(aZ3hZr{Cvmtlgx&C~wm$;o$L zF#@c|&DuWQdT_8=H5P&{@J=J5210?86U~mmH^!bR^bf^epQvHb8zL#xsR#P8e3qlX z{TMt6V!g#vfC$XT{(DeEWVHX||7iizge9W}DMMr6r1ibBaIw`?S4j{7>DP+_w{*Jf!!``caLnO#5BEATbp3JUNs|oMoeh z5=?@F^HY1R&^QDg{x}9B5roziO9qc$qgvzCqhY%Fr=@VA&^Lbr%(MX?Am7b79T}~o z;9L+LEZo?PdA||^T!u~fiPEiL355lz`k<=gt_+T5{5ryoS744SVFNj;`Q_?ah}Fht zY|G)UJPwI)7gCLQpb%l}G+ZD!#0;LcpB~JfZ?UCX8s0winpkK)s@dfXG0ehS!}1k$ zJ>8qjga(|0S7JI*>;2X(K3q#N5V!D}tCzmU;=tJ|sQU>FW9H&>m~NMMl_4JnEW^ri)PIe3Q6EFFW7vnq{N|&HYJkUx}DIgi#gSAZ;K>9#Bs_w zeH5Nkha7dMCW0Px=_`by^Lbt#3pmcXIZ1puhJvms!kJACr9YQ&%)(z^Bh$;v^}%Y6 zIlr$k&(MG`H-u&1!ieul*%^Ef4!WoHVeLh@dYA$6`I8TS)T6~lqiG1(T~`aQ<)rCp z?+J*_88JNftpB3@j(>OX6!*!UnQS)0aglx3O@43cXWcq6T-txF>2$Calc#x|Cuz?X zg21ggPTctwz)^r#E6PLk=03MxGyiK>l|b*e!XEx!k_n?eEKR9Y%9l&rkFK-6IQ&HB z>K4ktMw?Rt%@wcu(fRyet;nc$nPGv~X{^2R-6?uwyB~-x&zmoQN@?AAe4Q1iz<4>2 z*rG6NKjv6B@gF;7!zybv!%Qn-^iFDS-8YHSl9!f1Cl^zzq8G2mP>~<5lvLkYLl`3O8>{6Aq_>?5MKOREmydD zQt0MOA;mw;nCJZwKAJtk&$q&3p6m~g__`^R8u8nNUx$4ne7Bdmwq{I7KFDUeo#^5k z^7<>3^~DVXXt@PPkNkwo`^!*<55c`Kc<=gq|DW&4ITPp1JTrHd zPVN?F8{Mx80s&cOGnOcq@la@8+l7(IiaVap@2PsUHt&ZhCHblKt-h<>tG2cQ;PlQq z0YehxCB*|xNA_oDv=N!44X=)#nxxA$(;yy1Kc8eBQ4IG`BZ6j2xe`Pak~|ho`S776 z+w6@^;`)XSRqTkD3_IBQ5fN(il5^DO?+<0j7ZfCgD!w2EUA~W&j*_+QKd5;q+KA|1 zzDvqz$khj6me}Lqdc_+-nzV5K_2+z8fwxuYf;uW5TB_6-gdQ zi~irLD3Il(6*({J&NWZeajcv{5}T_LLglwAvVm=P>kHPxm#C7|hhKTY9mEsE;cnP9 zziN@Spk2^g>q?k)c>=kT7+MIY9CJCv1)j5CxOuvX6Q~0+-}0!dp6y|JJ-US<6kM7i zUIC?CosrRwWrDk24E>;F*ht8L?(&XIP+ckn;LK*B=BB2Wwy1x7=tt^5?)ZfDv`a`d z;Ixb&CZa*Q!BV;O)RLrY+K86FUG*VEN>GFxFW)};)OZrqqWdyD9`acPGC%*^dK4_3 zQcJ_3=lkvTFM!7c`ua!uEx8j(f{;?vERA56V0jFiO!r@&Z{-KIJJ)M+7q`)w1SM*7 ze8i>E(#0YaA9zE{S0XGckwM7P{s!LK~Rg}oO_QhoafaE!A4|4x=zn^uCFOe zIgPe--KA?b!%!KUA*a5WlX%>}s$$q@x~NKuy-=3v{kMnWse>MN+&Y6j3DX(2A(9h% znIIu4Ea~um7Z1KBZ0(NO^LN$Uzg{2O=a&^N&nh*3`?(mdP1s`nqUJm*{hyx^^t{=Ej_eC)MlUt zj`qGLy!$CIJC;xXa;LQ5+TZpyb$^ZR#Q4`TP# zu(0|s;q6s$H=2PkU7Ns6n|eb{ZXvJNrnoz?9I(mm>hJBkcyMfN*jLiWa=G&pK0)|E z3Uj6f_p_GQb6Fsf`L%?i9`8>0U33k}LNnQIZiu0{p96rx+3@lHPDtuLN6RqMDOD*A zqx?cY4?%)#61+3Bvvrkh!KxN)Q^t66&DfH#8vS`Vipj)x!TNqOb}D9AgTswt+Iv#L zAGeqbsbVRiY<^aNxDr<>oc4P=i~cbij+F%)&)b-_xq)463~lc0+N<0ut!$(SBd5QQ z4g>Xie;F+neZ>f;oc5kNTSGulLo?en zUGJoTb4Mt~x96y&+57H>7k}xUhYTW(0NOjo&YeFbO-4opv zqvYF3%bnQNgr2IzECwqAoj1yUb{z@HQLwi5jv$1>1|UXhS~knhIy2@JXL`P!MyLAe zisACX65tHtK+WW_ON!0$Gn~w2pKq_HBf0ckIZKo8HJccoU;!#D(y}^xm}TR{xSWar zn`6cO`omY$fj<^ELT&5uP3b&y382~XGdR`ml;V`=jm=N*nj&d<}&qHrsiK>?7^)ol~ODK>_V|F^hQ%g}2O`)in=)yfa<< z){=NpZEb|L4@Wf*KK(Lk`OGsKvKDl;k@$PIBSAhLJY5E*$xp5Ke<)3uI21+R=_NeFcjAk(Za$BV`!>J=KZvp|1jJrj_z^>V!C8wSJfqnagJxzPvwfXxG@9Iowu4KT)m9YQe3^8 z>WUPs@N#MiZqU~H-3ZT$U-c_BCmqT}f=xZ#&%>*NdWI;;n$51fx$s(BeTyqlqA*RB zmV+|F6-lw1`9)oE1=#C!&xxRj2YDjm6us5@(^?D;KlOuidGngK zDI$L#oi++U4I<%p?UQh8I+Y{uyD#ouCxzM`zsH>MdVGs6FGC+K+Fz)_Adm>!&^#lP zGt{*R)zrR$l|Yxw^7jNzcB1 zlM^LQd}IEvDgWW%xuuWG_!X80T$FxNXjHP4HmSVr20NY;^*}a>Uk^jlM~JJ6GBpUd z&OtXZv7M_vqKfH(TtwQG4dx>e;>aAoXjVfnbm4&_=>+>^?IkX}e;y)bC04T`6$Nk8 z{37-|8FPjL0E%*qayTZpmk|n-!l%o@hMQHxuHOz4AvwESEtL2B<}pkPCCFI|vuTJQ zow9IrF~?sd#j$7#eoFXHycR9<;9bubtG4*BZ*NzEgKEb7oI1z$DtVMzp)^$g1M%0* z?zY~+c6}ihl!;)>I6H$liV`rd&JBQdV)S4c2{(x}V6tJ7*R~MxsqH;>Bm6t(3X{#( zSmU`55zQs&4^A~YAHaqjMX$H~yJHkQ*^~{1tNFu9P5CxyyhgP%A9Z2LC}>7tn$Ym- zq4eo~;A!I>epVGw;CgID;VV8V%FsKWh^#+Ba1nSBokwuWOHrmqH zIT!{=joXsYk#nSInHyY2gKadn#>ymDx%48lNnN@&XP+~-)0S4(Bx9P=#G*+x!JPA* z<3RfoHC*IZznM3}Y>{x;am41i1lfh`t&EvLrcSkIxC9sIp7| zMgz`kk+2w8{r`==y(AO_d}JFp&^mbV6|crN-SKKuBWz#ZXl#?+vDu2JhQl!pL)f<9 z+%MmYiQDUtAY9)HB>9Vb__lf{!V3o<{1b0rrnNe>k8*5${0_u!U!a{IqpV*E7+U(e zjBrlc-(j-gp&YBV(ZHct^Q)g)P1@P9{VBts{Er(bC(wFAxbPvbfx7f1HXG}Di!UCP zGbJc<_mu<+HNh#Bf83?ovqRkt@1?#Wie3{*<`3&RSg+&LL($w6zkJri`j1_>tD>Q= z^JIHb{t`89-<9&(lJdGfcRj>#5+A(EHv*(rXHLR0%XgJLQc7rkLpap zFocP@hF;wIYlcQ0&~}?ag1)!z)>D?kxky>(3zV8g4`ML`O?JSe5fkk6Ki+x3!)Lc5 zhKKcUSC;^5ZKBVh%3SPA(|>0mVM$&t$p)7oPd?JRtDXK1F)X)7hP=v`B}7~UJXn+D zoL0CVx3vZ+kx2KvQP--lfcaC8^e?~F^Tykx9Kf61cdjU+*WehGP>||Hy*hHCRGzb6 zqSkRv!4iG6qDjEnu*svI!hidDd|2|ZHT%H# z{)`}KnE{{oK~H&JZ?`4qeXAW}gc_!uj@Jacsjy|;DWuhxAk%NakI<(m`|dy7j8ze{ zCafZbe)sYjzE*k9mN>z;FQ`6c+Y)(Xeq4ny ztf(D-d?M0wNLiZGJiI~d^Zh+8G)|Vb!+A@xycIda^$0SgzaLpNqL z`&VSzMXWLXSMkfipyG4~@5iaPr$$a>y#KN{H0#Fnr|ZeHBC7Vrrar&`#Gv-9gTM(S z0-xPWRF(FT!KjMR!-9d8K6WqY1fB1jhK9=u?#stT?*K9pk8`&HTQ_T0qXs440X`hI z2_v`?%kJ!RYF7^@_qFUej-SL$JTDXBs&x~M+wWZyqD#XgdLf*|I(k`M^UfC-xYkkbfIGH9u zGcv;hUl69ijh7%0fr+^YV(E4p*5ws{$;7MrjaGH#9K=bp%L&JNZY!bky!VZFs_S9%Q5_l~aA$gvnAr+YV5 zv*ANXjIrUJO@oT3pPoF7Hzz|rqgBBM)b-E>tlp#NX(}f|g=Q7+#a8m^QXe^QftNnv z4r0?4C4d}No;;$^E*;YSQ_l9*(wU=?ty;KkE2+^d6WlQ=nF&Wb4m~vp6ST!F($r9r z+H-rnZ+O^uI~@-$ntd$`4aYMqXRTE=HD$Ga$TVRSdgb9V-2fmwW24bDLL1-JXoV(A z%f`F`GQOV*WYh2$sgGHKh3bvxvtdmWS`eyN(FsEKfeB3a1Uo4QO-q<+grj6r>6MZE z22_AkR`B#x>-@n)^cInOn%L{fyX_9Q%Es36F19Q$9|}gS_809qskx2L@d52LF7?!s zrziBd$oK;1V16CrzgwO(UX-=4{v9`Ai5NC6nDuXuLkH!^jKsXts-5AidsI6+$s9@L z^Zvh3TUZh&PsFHi4J6lG2!z&*y-Di*)LUVLr*lBg=H~5U8XR1{43QY~3<%~5wxjF4 zA9`^IxSoy96~Wo}2c(~Uc^P-qx-u{L7QzMlNP@HhLWmHQ{n|Ty`=JSp&iD740fpIU zt9cR_MGi{T(IupE(9d)HsT@ZFnF@0*2}~Djl3$Tx!E)VQ6OZGN52|Rf=v0j-Amu8H zr(_rzti9E!B>Xp;U?P{QIrGfio*8ZuX=*0d-cki@JF z?G$G>VxLhKtT)eT*RNJDsGRC{|BCv^=vY9v#iQ=yeM_Ws46{$;foy zGYU5kT=fEo0imDlXOR2u0;(d`+*trnuwFZ~(cfk*M;bMEn z5^1lHUNc~Yu2@o+(kNOxl`jL6GTKEVzT2y?R9?OMDUSV6VykYwCA$HF&ESKpBVgNb zh0b01q@mJ6PC!^#6#MKQBy!}76tlB;W`W4YU;E}f_~tFMloY9MiN8U>M7;=(+;s;Mu{F0kO0a!z!P^R?emj`@=>wMr=87<16@`R_b={6k79Dn~A)mW6xpnY8=%N0R zo2L{{lV>jmjIm}R3*ExukFyfdZ}H5 zp*c9>Y0EyN^qiQv|la!hF$YGsW+a%W1&~lEt^U2T6SVEDT z*k52A=y z=WCO9tZu+TusO-CCu`b+8FprxPOIB4vQOFinjg|M7~AL}RXvA2r$G{hbf) z4>=4H^rc}@Uz_O5kHpCMii`24l&IK}MW{5Krq|hZZ)ceb$dg3Q6JgXj{sCQN9-WZqC;RpF;%l^5=O>T1n+C^bWf4+)(azG_hWl0gt zK%C#y^-VQ%H_5`@7}QB5g7|hyAhIQajh|0%`K*T3?A3CzpA`YvbRwAk<-LaZY)jX- zzuVe8!75(JHo)cPV)Z|~kZDL2}rW*JRzal>xq9?um$Oo_YWxwLmNH^M%tW>D77 zUI!pJ(tC?2nP=FI}8z`H>G+2K7RfM>ncJ(*2&SWy7k` zfLUcN;6EtRd%vUyEH^KS;^UkNES*ht$ZRoeO@L-mF+WJbOMkfXUYG|7H2e+t#BQu| zbJs5E#$K?3AQkf_+r9};VIg`=x~~aIqdJ?EKkinPjXhZTV9Y$dd`ccdi=YApX4sjRI%>}MLnS|jTt8)4XJa{38WQOAj|Z(^A{cqTR@6j zDbSP*to+%(iUUF%1hq+GH&-)sMm9<`=!uXEP6BqpBCY+$oW>IcaCrWWfIgl3@&Y-I zM>aV0CcdXUDAC+EpX=s~E))s7!plLYni+=CP1Z0@Wiq|1G^Uohx zZEgAQL{iMMAU?~tSy6}9#rYbW@+)A%=ul7q1Ca@ z5_wX(7m2I4#(OyPli6sr@FGNWb6A#9vDWS?iY`S+>ucN?ziP6m zJ@-t6{uNO~3VR(J)vN4Z)24}=n=Eh5_DPYAB12FE0uYUrA zzo0Y_C=DfF@d)By_1f>ZfJ;Ws5?~U~&`r5{d2J{f zYK2~C@sxme=ZrY~GMr%nZ4sjM!=9km&QG_VGd`ct&8ZMTn)a+-*KbspeCm-^{>JeE z1%DIe7DxQ!&o2pWZl|2**@|mC|MK!z{IUVoedABLVOAwNl~dokx>(`i1By46rEtas zIQ&k(D|08%nsP;y1lQ!g?wMdciEyTZNb&0lehg`Qzmw3Ri57m<2#N>A`Ge0Fx6(O= zhKBZ-+Pxi%!YT(=uFi|FEYt)?LC0b9r~GF_M)!;@u23SygVKMw_>!GvuZ&CQ4fV{+ zi-F6pp0J&#E7Q*6{<}<9j4cDUmdfNw7O7$(#E4wU)C)Q<%GO$ojy#R$`-@yyv$d(a z_qm3KEQBorsSqg{k3}N-<@;TKZYFedBwUvyQtMO#RR-1yPs+M+_QiSv+< zn+A~uPflYMUxJ7Y3v)DXL}KD=t2nyHY}9=yKQ1>>A+JV4L8Fk1PX7MGlXG`4?!;cO zZnRPt-jVi;{?5|l<71r&0@RmkpjtEKhndMf`e~Gl;P#Vv`N5aa?4rRY||Djki|9fzM2`e#aSf0@*M z3Q&)BIh|3%JsfGLD%lH+jl;^as=3mDp-^_%y*cN%EM6;a=^J_bqkYTu9I z-L|^(pOLD%@jbD^o6!BMXgMt65hw|Vhy5<(1>a}PG2?1MIY+0tx4WV6zhJXC_$we~iB4(cjrg>pDI%il1v zP4RnB{d*yk8cO&A|6$6fL;03g9eLU>O*VIWtEw94@5iF^LmWtlv>1$;zv zSO(Zm{SOO3MO~Wmg(-EsQV!C(Ox5moBmd(YJ1ObTzgK2nB6_AF92uPW$xoI@=_~qr z>n+FVPs0Y2l}-Ow@#RN^7Ypc2?g*{6v%NSv64g@Ltof0|rU&U#^Iuv#Z#LDQ&gw0y zw9~%oxmN4#$dtMi{q&@odR?)Q0(Y4*Hc@{Ay8FVjSvD6N$>8#~HRaG`#LHYhTrCVs^K`d14T=K@BT$Hv3BK z1AJl<>8qyx%G8i9#A?nf8yH=J`An52(~UK(yS+Ruv_lWQU>t2-`dMSDQ!V5k91*_v zsK>o0mQ=d)sJm_o4`^eoR`@uQdoh3Qs|pJX)cx$-YDW;GK(@PKsI#uRl+LN}Sn5Ur zLd`ir!w{XcqD4Vsa*y+w*hjrQBXLewHLlVw#kzQ<8rxjX=uK+vBA%1y`}aB)&*tX4 z16yjF$$lV$Cc3b{cg~5yZs|>l7;WNpL`F|IbTsFI05cd7Z0#~ zZ%t3{iafCorVDIi3G$s(r=~&2PvXKct%AI>ut+VyJU4dWswY7_KR3~^JoUd=+ z$8L?r_v$%dSa-VnX%lI2oL-(Ep{~(R*$ZguU4K~snNMuQE~PbWK>D>Q78KBmEE;J zHKR5xdHm2p{2ae@o)mdYPa*T}bV5jnFPm8W@@XafW{I=xcqUw=(~RSp-*#}wx>Ha$ zi>vG2g7t?X%eX3XFB!08>inw^KW~R#;oIV;$A;nN#-DQd^vdubndBKcU5g?Gq)I~O z6<}!z???Y!txWGLv?cE#-VdExoQ)jih#Da$TMlZ%Hk=}?e|)6iv=aF$Lgj9@b=df6 zrhCtJQHCOI z(8YLty{8N$SXlRyo%OUDl#QKmeZ?|Ia z;+7T`N@v9j@@_O|Tg_sgONDc<oo{{q~iokHm*g3X<| z-7lh+O-I1&-%oEty4`g)3|P!oHU+u>tbqBq31iB)MfK$5q`y=nR_QLE2caTDEY@z7 zDHfECG0{x&E(o1{fp+Sen(hjm+v|1GaPrayblqyG+QkFw7F(EiwoX#^fY=p@)F7ZW z3vNcG=2%%C%;ec&AF0@F$JCdz`g=CyX?kPv*Mu?s)sxC9#h_T~DeFf;@S|+A3V2=m z3-E4+Gs3jGo!kGokM&8O8>{!-bmLzqZB;`d<|Vp{Wyw}<$+UqFnFmb;P27a}e8vN- zw!=V)Alp<4PjIb68*zAk4-%TbR)o@yETWsK1G{eJnNF-~)H>Oaf46swtb53nL@a7| z&|%iz$fA}^+qxI`y+$(I{FAUeVims(fxlWAzP|@gf-@iTqi{112bgU)*9y@;09Lh&x40?^R+Z1?CD8PGJ zgoKoWA?*-fsw_#2J#<>kfdbE|O1G8Fq!L!lQ?eB-nf~~F(EEu%Tti02>1Vb2@cPjc z!rN{s54{t@wZJOuaZ6iwz*pA7Z~L+YS-D)$Js^dAxZm-#q9N)_b-VX;chSaiVCagr z@1Kvo*285q&zE{i0P2jeY=RNFl9h$?*2WxZ+7@#>Yje7rs|+`CMS$Jdyp|CjRPhX?IwsFv1bG~M?|fE9FfJOMAe#xpOs!XNxOT6JCwlm>OPw{}VJdlNIzfP*jZ zpFS5qu&mNOL&y?tuMd+JSjFxsf{*xCMqC@$`S)!N{f)#652aP-bvgAbu8eV7bPUQ8 zB?WVUcg@bekjP`>!$xYP^`b^H-Ck!{ih~8w)GwGg#nn&9S zUaP5t;LD0XVoL4ePxB($>KAm=s8j)WG1Y%MylPin#TQ$ZXKkh%-&!G}MmOi#=cqRs zkLPE<-ftP2D~v?X*<1kXr7~Cb=Y8#+W>Et7dq+#Z-3eQnO@hI_8U#4I0HN`o80m1&2ra@Wr;c`~8 z?^djFNZjiJw$CVCTn`uNog0bxtZ}=!&TcYv+m#h@UT`ElXw_&kXND^helcR%JXc(- z0lE#@5WRDk$71o!r^6qQc5h~o8oj0Z%UCXhJmp{WgU-;KjccJN57MRg$lm%d2bGON zaM%R>62i61=!!8f4g^ng(T0AWpS+l2GT#M7gxb~a;Fp-EXW-*1k!)zU611gIRg0#E zOICz^HY$7m?NCnQ7XzeOS4Skv(Jzt&gO!Qr8u~;CV!N5^<+C7axj#a@>pAZ}eBcds zl}l;u#M%Xp7~pz2^htfe~&n43CN_ zll_huX=X-iMw*`Wo{1N%djR1oin@3YL2yk!i$y>+R|+8sn?lv|P4N`Rh&2`*m_52o zSe`hqD~>a@qx(3e1Cz4b~+!|$smwM)3AVRH}B$pu|*H@#9;-}XC-T?0M{>R);!gu59`#XaLr z{{a?3G|0Pn8C^G7$*a3sv(2W&oC~_A7i@Reqgu#}?jZ#jagn8qlBK(NPP;2OeT5Ab zer@`XY$eckVCGOxS%ZwvD{Ec&<&>{fqsK z_`W+t^<96Z_RhoZNdg!;F9;u6{jRw9w)|OU8kSEe{BdxwZXty$o-0s|a+Lp@M0Qm< zoN>ZiVIfDFL#K4|-ZK30Un$@|*`jjkd@^5KCojHCe@CFdBgJENPEVetfS|Cu8oKxv zcs10BQHnrD&r6A=GuV=_$jsA~j-w*^ka0UaUEhR)Vb<5tENVJDLB4|1H@86ytJTk` zdpJsP;~lmZHn=}~QuU_mg7?01087F8UA!uV)ZE)srda1u#ZQI+9_rE(Je`XXa9Vy3 zf?{1oyc~Zis3H+8hagjC!EH~8+9LVtw7nDGW*3?9c$XMPjw3^b_zaLK)pmR_JLHKl z`x9sk#;D$eB+}4?tNgjP9Wd0XM2@*6yELr~{^l-9E`Fkj?Gb5HPx@{kAT^gU5go7t9|nyz4zDqr7Vt|TiTXDF|x)*zMr z-zaOUkQ;`+R0OSeiOfuN})E4Kgn&^U(qXbZ8xU53+-J&@=TiQTh=(jtHUH%{9)R&`orGO#GS zXfM^<{Ts3AH=LpzoZ}oRs~T;M8_b89F0y4lv7qe>LMt(1ArtgrOS{%llt$&N%+WeA zi~8>tt?hjK4?DsR50+_KSBT0O{P}14MWCvl-Sy>3|LTCZmSO6QXi8JlDkNDq@*m8E z$4xRKJ~;b1mtMB$&M}GLz?JM6pO}qBSo_%{6+(2_6Gdlm&j_txe(r_ z^RTdKydq_DYIU1*@IN%pvmUT`&dER!p-MC1e*Kg@Nlr+#x1u&4yk8tAlNN6)B*Dsl zn7JqC-yW&aGPE7lGN_+NLOx^Vv@wnh%D#Iwo4Z8u%aEF}!1SiZo!+p2Eh#vwxWG_m zh>zl}%C;W`GQwP?vab5HCYlb_K14zh-x;EkcOYS)tdBv?{k&jEYp!x>=r1CwU97kmz;wDCkmpmd7FCW@6T~i ziAH!%Ag0ht;@}?4BPgpBgs9^L3?9_qjlv8@;sJVqi~+7$0hT=m9OF6NgLW&z}q|mC6pLSndouxdAk)HwjWUUt+NT$pb;xxD)nTSy4Em+BHx%|j;s~=kDHamk*5U13u)9@L{ zVht1+8Y%}mbpFZ2TUMtmoNQ-)LlicWr~YUC2Q_C=Jr>d9(20o%wVYpl%rkN?J29we zhP+bKjy1NsHIDh|-_7zsqcH<~XqOhE-O{s=PRKqw{{?P{LVRE5cWo!>M;Xsr15$Yq zchq7T`}Wq_hzV`Q1TT{J@O9)6IeoxIi+7^_vGOSf*!dE>5&u3vh-KFiZfexVUX%;> zf{EuYjg+}0#(8vi-OUWGAYl{*hkkIukbTESVpfBP&A0maexe=0odO4a5NS)CS}ChD zB4hK>K>Di(LxeO-@OJ_M%vye~Z#M*Vx91Lk855*4q7UhtQoEHJCt;8PuuNe;!g!6T z$OlyXrx-Mzth*FJ*pRutC4j109QVjyH;f*0~$Y3QgF9GG%UEQGA; z)@ixUA6X14@6$HkCLyF?PX{MciubAdufotLKSIqb$r&eS4Z%pT?*#`AUqm|#`X24Z zG5-Hh@h8+czuJEybioswe?Tw75CC3S{}v88%@^b{9aI5rH4;R3>=BJhl>*Y@b zO{vtMKe$V04$wF*{c;)wx@-uhGLDab0q(C9F3))^i>>U z>w8^*+3jk9HmKbq*Rt0qU0(9F%_(V4XPGmo`I9e~;J#^RY-mA{qOP1TJlHtlXo~vz2VW+37#C>VmrA zJyy<|LJjv)*ww~shC)&)FDy>~lRy|MMJbdDPAm60i+JpE;?33@3q#P0xP1W9RMWAr z^^HELCgJnzvoEBAIcMEhu%Ua~TV8u~kpdWnZHY6Q0(v+k&b(UY7oE3LwoftLUZp%{ zg;35_RWWouC7-fKB%Q~>(Mcmg{<|x1$DXs@Ih8e4mUfyq~^aaZ-OHQmO_H8qOGwb z=16>y7T6A}1Y^U)8dx26*5}+@$<@*hdG>V+nDL8VjU%-oHPy~|FEbcX=eqJEFM<}1 z+%}Ty_M{^-$X!Jx#5&`6QqT+`%CpvsTMS@8n4Js@vlT+BKHA7n?XQza8mB^B-@0M~ zgskOpez{~|q*so;ZoYP%CAO(4MFtzxWE{5#O0vwL7K^jC6eO|nYS*K5MP(aB-*1&l zJ>18Fjb>%KI5^;YL`POTo`!?XKQ;WcJ){6`S!Aj)TWwhm1@dCkyXcWfqm0i{N(SHYG zr8t4(;P28%)TNlcj0FnI@9uRFRbDgMDM~dhQ^6)Jkic|N&)V_Mft1#M4kuzyPI1rj zi-&Lo6KO~Gz_Wjuk@n!fQDq|ZcWKhnJgc-pwT9=>qRcO(!E?li=OpC}s_GG_5{ZyB z)8u`j?j-Oe!8FX6O?#3G1#WHa5vKK$yUz-}tM-zYwY7Be9?^?HYI+dIRhm5H-fq4> z^R}=me61)B9g|2fJfP?}%07w5xl8_&(oxFOWaXB+nrCSEM2xX`^Gsc?I_XSF)*5EgX9jT26T2q79n(Ih^k3Q>}D zt;@7Jap&<}LR+n9{>y%aT@pmq0z!wcEQLYrc9z+jWk4x4vKytvb0mPb8T_gs9IM6z zRU^H*nYBiUNwUPc|6*}(4P!W%#sAHzr!v0=K;@bRe_JnAYfkr68Rpf@;=x}&V^Vb! zr|NbrRDb^K%ugv8&3o@T=HQw@7bvT$g1dDP|F>kT_1Oiell0{FJpR&|DbZM$(H`eR zFomym&ZP3hW1ieK2Y4ZZu=2h+p5X!&q(L6-^W|?$f37Qn zfk{HnzI*QBn0!$@$Te%ZuW!mdFU*v&@t2A?<>0S2zVt7@e}$yVm=}E*DF7BT!1t&h z8V#~%klY=7y#4K9Lgrs{DF^XZwuof;JBW`$AKQ=gz*|7b##|;69#{KR49`wuA3Y*{82! zKBeeFUGKoJBGP=X7)!l`F_*C=Q!3ogeDNkfDyk6se}pu@0#a=$!pmAx;V)ig`M(vAVFTXz_9CI7-F5(MQ+gRAJZ}Q{(Xu!xeJ!y zr6C&2c{g;;gm6l+KkZ;px4fC^-)$ay@rDFk>65?;Gh=dVI-J3qCQalgWif0iUJEQE zEJn7suK&XVe2x^*yGl63Sow&2YYwF2|R^F zNHO`s6Cp0w1NYXY1Z0tkc9F1NUvf7SLY#}^Tq}$NNYb3-S?k9BlupK;N^X_uHEze!XT(O)2&?`!Pu*7-yd8S#vqn1?nIl z6yY1kk<8CA(oy-Fdf{#z+8@j+TAOtNG0~dS;Jmh=cbmG@4E^V=oWQmS*HQgrDXo}4 z;=qInH9qu4F-Z)gb3}VBE#@cz9Z4}3u7nCH4WzQ~$JA1h)r-UL1%|IoXqIFi=PL9T z+ji!D;W-TEDa1TfHQnuOLH=BI<|eTctCJt>-@W_$_n{cxX45-OFcOrlO&CD?Du_c{ zTUY7i1@R~#vZ$#7F7xl5B&*9$c>0pDn^3l)ZjF4Gig3oYi(yb&vNea9t7 zuQJ8zOVh0DUsVzv?imgXF~s#0=P~+$%wX6Fidil<$|*~JMupi7&%;uMT9W?Nrp+@? zYC$00oC^dY^Xt8N3p&uT?mO6C`)HT&W|$1WxFJKppIxfjkDOvmJ%#nJ0trWV6~lmxG-ZrZ2!1$H8l_hXW_5 z6@E1|hO!`7)%T`zL6A}UsZvcoq^ z)7ZFxi_t0hU?x-{hgS~lyvU?^cjQGFj?~?JxHCl`>8erMYP;K==BMz{{?mK1HtLmc zE?JIwfx*|0R^@`gtOd__%=9oHzhN+`wWq1yrFElNo2RLMs+yCIy?!4JRy1JZ(?b)0 zF8R3r`&>tbKYu-Y$88M8Td{uJISl5Ll}qmqx>N1E^*Kf`U#-j zE-U^o`7UhkjoSzAT_!DSZBy5TXxR@poM(Vm5eOLW-x~qrVq$Ru;K9+v^xp=k)SE`` z4hA!-tzl0NmqM#RJYg$yd3^;QyrJPf$)Y9Kkz9V~l{ZgV+%sGx@$1V|tV>JRVHV6I z@)4Ofk0RlsE!Powe(SmHt#0o@!frRd>2Sj;U(@T>yN0578m=wCL}V_{P|^tWn@a`8 zvazSkb>Nwk1b}hG=pnMNSP?SUIa6e3E~i?6pTyxMrK4L{xA|7%CEn)u)Cuf>-u?@> z{m}Ny0!}*m4?omQtrVFt+^Pgx5n^jmuC1GQfk(Syl;dFNJ_>Ge%7V1|;NAG4Qz;c> z({HIBIXdaj>x$LD3=Pm~!WL{`L)Q^pbfAulOn`je1-e}ASmA4#_j1kD9a00=ZdaHG z(%?CT*LyB603FY4L)l(47}y)*%%h%3`m!GyYL}qaDAX~|g(Y-1p0%&$(0xb8z#ppT zI@zW;i|u~jEyABQl_g>~(#e89rg;N|+56+9+ceQOmTl6c}-p za;|}H-U1X}*eVdih=;P+?kpt&es}A->X>gGk!wa~1XJyiQ#^II4b?rnE*T0*UM2>7 z=$|T5CDMhH{UZWp2?nB!a3^*5Y?Y7}6+e*o7dj7ok&|ft+>cohZ_{W@1H3KAFAtKq zdnzk%@6DsYOYt|Bo##1XpeeRR=$WCpfOf{G;Y^%0>MW%+nwvyswnW7QY=S z(?#8?;wTg_>mxOe>L#;pfSvepQ>Br-Z(|L}vfDG~&nn z4v0J_TpaYn`;?|df1QTi*aIsrP6Nyx0}`v9Eav88vC$zwc|`(#jz2@m1^Cc^PYRwb zDWW#k|07rWkFEdf?JEDG{GK+kba!_*NQQ4GU5WEU?en@9%$je8C$(JNJE`Gc#xAnmKd1P3c6FzZn?15ag$2qG%H3f{`HJ z4N0bvn)78!$GH&cUihchKIYrFyJ*SOdDy80=nAqo~l%a7&S>@N02aG~qH&sVRFzf4Ro?lLz z7|Db7;r~)U<{|?QilxY2+oqnQ>%kF>-7(6t@_Hjrmhw(J?qUyJDi_|&UYCXRU1WS1bvx<(vlm2l)iE_C-Q!gOd z#SU_C&WApDN}(OC{GvG4l7=GcV5tl*biVQJrN%R-4~2Jpd>wG!^fxAWE~7I*O_QAg zZ0WI3kwFwG+!{OyIOcXRVx)M1Co_iFiAd#S{mLA4QgaUNz2Sw_0*i^OUCSTv5B-za zLdCOz7utJ3narDghMTMll>AE25SwB;wJB=-1+8IYMXI;40lyThT6duL%mF&?4`X|p z$I0Ym7jEOP#_kx0oo&J5LO)*zKvL$XbYm0s$#CHuk)7Y$+`0 zDHyYYP3bRa7uBiY$>jS#!3EF{;&zXprhv;BQb;{=+aeGZ?W+~-m zMQV3^fSpG$|5-Nt=DKca&~_kN&j(6YL-9CN1!$0 z=P^t9W;$@xp~<454%O}@&2-7e;C%$e9WMEB%kicdB96tAT-OVPi1}HrS}$i}%PTlP^RJ9&WA{uAwh{+%#faEdH;+yU|0{e3`$ zNQH~=x@2DkDlB0%3?i``8vS7Fg)}C^jc$`?L$RmWmc6G}4EfG)E8Y#8G;h-1f!t}G zlukLz94&eZ5vesl9bnRAV|B^fthPE*6OE6@!@T9d0)>lX4K#5>9=~yvl<&|C1TqW9 z)`1@UU7nZhF)!BFG3J5AZ#4+OXed0KdHc}XnoE|B;IVP+04B#qDe3d8I0clq#8P0Q=&dFY8g%O2{-vFMXJ}1LjJW%ihS2}wP{1oY{i)(5xNMaui^dM2J z5S5}oVB9?^eDQ;TXl$3K=u;a~ zh;xdc^wp3T00&Ydimv7(OpT_t$%|NGZGDZ3i3K`ZT?*Xn z`_#Q+cX4PSu4WJlVjiA}g$ZIUD|%{tUT!>-R|1-vj3l^mFJ3&Y+`hct>}E0!!+&2_ z8_`*|QRq%sO7x>+qcmc_wHB$m@d9$s-ZR%g?>7477!^0M+pifTw3oknwW8zmml{#B zJqHJb(=Z|!{BA{3Y5ymKM`}oYaq?oQ+o)7~M@Lt@9x)FjHs63Qc7jg&DVNEU$G!D` z1FKd#b)MC~emJ?^o5o4<8za8EJ`z@>r1rMkO`$KUQn96v&7$5R37tp+^AWOWD6Kd) z0~Xz0??Z%;de4WOO!gmi5yVUJu&eYkx49DzSWAOxw4-SZVv>OJV zl9kl@+mCb7?da2@99)-L~*SHeynI7IpbS4w2qa}odM_Y=% zDo4mqgME?M`**0zwa?D(<%8ZmFvpxmy0+WK3GmhZDF@Q*+d@V1x!}79!eW*bG=thx z&oV;PBN?|ar~9iM?&`-Rbf@P3iKDIB+q(i}E39w+721!8TGW?L9H=p*=lDx0%#0kt z$J4k;ez)p|pq`8{%FTQq1f*Gilg2gz&m~7Fjo@C&J&o%=J}Sbo3Do6GDHAd-fgfxp zaU*Zy22s5jzOS$Gx|0jWjr%F;aqsYFgEuXl7IpRfX`O_96bdIkQn|tU8t<>^&#YH1 z#T>JgI>+x;P>H1hNr_lf$K})e0qHD={gUsGF*OqHA0S0ue3{^(K#omXNQQ`}@f$Ce zR)eqSa8vheETl#$JBa$s98glQ96ntNA%XcuA^iSDMtkXGQ)@N7Q6g~Zj^|oclfey= z(QNE`00>)Q71?}7<>P+O7V@cel0~rcSQ^?7IhGnIT0WB?p{%9ho&(P%1HasA6viFv zNSAK^Hb19eMh*5L-9)qmm;LpNX1egSEjbHC#&j2d^_Jxh85M+QbBu5b5M|9iTGAG; zRBEtVr}DhQ{ATU)6#$cT`U0}~CGU3&_Wc_LlPb&a&}yYj0bR}sP#0uzxegM|ouJ#C z7|`zhb{O_i8uXdRM!eG@NXPOc>-t@vhlD&Nn!B`iy*dHm8% zE3WN>Yec6|=bK`{dlHOidLYr66729dSt;_~jYB4sG>L9)nmWE~CPX zf#V8n{rvKRf~n?22)0EM=6Cn&S6{<&Y;l|zWNd@AijtZ$1A+4>#o$LNy-mf9qxOW`#mJCjQ?*B6z`o?J<(}Uy_RY^VXRxqMZ0vzh9l6~3;*9DTs$gJSs|0-YR)=PE(TEWgvEXZP1)4QLgY ze15#HfLkrqBp}YLzkZE=CtIUMob3@Xr+eiVvFJ*E@hMfHA?AEdHm-!W@z@1uXl}Va zo;*vojih?~Y!l?3&pl>~$nD>16#HfshvaS%_;=|7R|iRYi)lrSL8!J;@6m6%MeU^U ztzDS_HdH$arQM!~jAVMZTQw4hJF49u=Z`BAUppj#Exw4YD6wi0&(;SEiVxfHxYTL1 zJZDB8MPjb>MBgM(^YX1Ul^SfvL!S0L)qh~IUE?3Bk5_3yH|Ue<%JV{lp@A;wBuHQn zE}Kzi5}lB5U`D%T*&I&y?Ew+)OcD~gShE5qHMwfMW=x-uR>^Vo-N8o~(dT}!NN4@i z+S0O|uq+Q#R4aZy`^lpIPeV%hJnP*L&%Rw+FI7Sy7*8iAKm=B1+?7exS^P$0D4S>>jLZ$HEnP1={^#mTDnt<*)i#pZ$gX^^;o`<3Mje4skTZ+c@NS|-?y&n3< zgir0OFAdhFHE2`Q(YRd)sdS4u#$AR4hDJYg_xZ^84@|du{}XBjIR7?;#0|^vPVZ>F zo?E%R>6tMH@A_yZzaf48FIx5!nEjO||8A#RPyPJ@O zb6RPI8pVDs;_*6E!$om_87>k3<6uCaewX%(A#S_*TvydAk9Vo5tE%@8uOJNien!M(JursoY*M$CHoXZMKMb&0U~%qv3?=z*#2yHv^#|{r&zAFW;yn zuS7$^sYVZ`aE{|FTZsA$)jnv&alH4VS_=2H$!71Z_Q+&bpFKYL9XP@->~xln!J4*u zmcC}~a7;!;kte7s;;r$$JCS-%LiV$)B{V}$2Rpz_d;K(Vo&>Apo_gam9DkyNEyyTf z32A>IdPKM7qNZMeM1Fy{(MhA&P0T-s9eri6-?iD>Is@&%fb1)D7q;@_FwO^ZdzHy5e`6#@jdexofa;MyCHtn&4n-0-sSF zMmi$|T(Mh(^_NI!x!1y5#p(>>D1Li2R}MlAn8?kNxKSG({!cDSP2hh_))xHc$=@ALQS<+e7xe{Y@1b`>c963S{D~c8^F`I{5F#(-99ltr&dc$ zr2U5vEtH?gpRKy$kvFr(iXS?zw_gr0ky0w8oqTrGdhJ1LTLE| zQI6D;X5%w{Bm?(7IKlvdf@Wss(?6p4#T=-Kmm^rlWx)K0!n^Rrw+S$$-Z1`(?H;oO z{%&5QS6f^!nDd@mj@_I_1*6wzoaLK0m-tAE9a7Qx^)?+cngL&x-Ma7z#*+CE`-*BwO^Tamo^FX=LrM@bOc^z4R)XR|yk=URP z^NT>|tG0gwlYIfWup0y@LtbFp&i}5`0{=*YBZ9g5gX}oA|dn%|{+n zSfG^X2o3%BDeW`lNuu40gB}xM_TPHAwaRPm z0k-5L3z z-`x);$rx1BZX7*h2+&H&W2#E*QS1B1WlCFRwA5)V`EwnANEO!0$LX)c2M$lTrO)bb>?#n z0pH#!R(q&%n2VyE6g9 zw?r15PFbVPUYJfP#M6(dMm83oPENUu`^@{-qdAZQ$RhmUQR%PjI%rXtPo5`{IwjQQ z9;Ydh(ez&s-U#&^3%Xdd52nf@0lkSmmeOqre>*QE`*+POB-N{jax^Aaa>h^s15FsFGI+(dP`15T(ZUw!4 zCo`&n-&)EB*!QneY8`i6kJ4w6fHJWhuanRl6H2Z7{myLuVeu<~6#3EG;cS{3c+*9l?Wu%izqk`Rxdx7)$a2qy#f^LB=t|j(N+f(^! zrO5Spygk6xeGcO|i>_VyeYGL(*y&}ka;)JL+_Q3Q&@!`Ptm8D$^uq4NR=;SLwZJk_ zDmtZH^`)UE0VX^sQob?l`^TtsCuuDJV?_9OE9IqJuTBF{SX?%o2Hhpd#yOOkxZLp zi4#$^d$9%&nQ=}h!=`*X<<#Yx<=(@kw%aO|h*$a2UeLhve3A3zJBTrT^L!X48y7#g zxllG=m{!2Jf4=bcH=#qKP{>TLXl@nlz7%u+N^9K29SrmLl7gtw?`wMWsah#dTYhA) zD+3iiTczF{uqI@V8gGhc`r14I{H5tpJ|e|E@1uy z1#FMMDy<$|Rx3UZ#B_W&STYAu_^{i^rl}k$&!4y4^PFcQjrJF!aM8bkX5Oc}Ya$)b zmDtYQdMe8ViGx39W(v_~&{jJy-1}Sh(z{tCwja{%Fg5;f(EOrgET(b8Zo7qrIZ01O zW#;>uEkm|eN^5&*2Akpwz`_LSBuEfZ6vE4VXR0ildsKNId58KE0u>=Cz7{fRN}u$k z65&l`DfY*~;o8>M)-(re@%8o3hcmeM?o2gGbw~MuNZa1viW3}lguD3}?gSsaWAD_uDntnLq%S_iF06Ghz94-}DpcBiO!M?)Q$gJ0#|xJ_?=A ze7a)3@t1Yv^xn*I;K=FSJsef$ieH~#F^c$poNpWwx9834pcA2J?u5rhOk~BhNgKGU zvcKK~1(LF^KXnzoW>$|@C8YRDidp~%Hr`phL4m=Wv;oObeB$1n*acdJg+w%corQbF z6bj_w{KRhf``?HB5vk~h*g$%SUhC4Uo>kG8`x%i@@725p=DFOC=>-a-Ya@~i*ts;B z9gGg${VbO|vmVqbirf$|)}c*be4{yy@A6WC;!F4$|X^ z^usf;C9`jAD6-Vm-g=94)2#^APbV_(9Vri*+hb=_#ckwz*GG3O5=h5)61EiJVIq;8 z(XvRqIS?a6q^%t16pRum+?#pAgbb^*XfSyK7U8|nbzkc3l=9*@4pZqE3J_WXV8!#Q zp~`FP&T`G=eYac*?o6Xb&*n;EhH|D4z1ZWWNL~mp`Gt4t4@Dow1HL5kbBm&_f9+Q6 zRIl{aro9r-*B12_^lxdadFu(@bVM=NSzHx83EW=Lr{61Hukzu-?gizgjI@X?bl8_C zvkOool+jmcH7(5*1BfYKh4zdKF+FTNQA#LS5ydl<-tULAk#pHUMO*-A*pti6@gBVI zGXA)D^d$yOKcb$AX8K?grSyP{o|G=)dk^KepFjKHkKo@t%-3kO_mtSvA*1Mr+px5ljou(d z&BdGgy{Nu_>`N0YY^Cz>5ze<4&&waA2->>~-J2=lR-$7r`BYiob7fUK$yHf+@o~eq zkNuZ^-DE~YL{WZs0;KlLFTMA@{ox}2;)3l^}b#2oy|~v6ESVw>4}yWj+AmU zQ{l|dEm8zODq}D?zrOoi6rBV|EU_*vh!i;LP)927Nrh_RJ@_!{Y%-Q}LADemlKR_` zCaI#SKfkpVgAq4hka{13*`FUNyi5N@%hi=af?iFFnmrjE&9WediAP)3 z+g#n=?i9^6fH`U%DxTn4IJGq74l9az0^@*+H$Dxpz&|ytAt4J`RNNaj`+3C3pBY2w zT|B-VjtiCjwifLT=u9n-Nwa_1n21N?6&MDS#+He_E*!!z9&WQDnUgAGIlP{Lt7-I?D`{;VWKn~t+sxHq82x%M zRVP_O#a?7e=Zr9VZ=)(PI$wb~)O&kCGa@Na^6b)Uco?2oP~x|C=&bXJn!<*SNs>Ja zEw_}z;=64yV(2_x9`xC`;>X+;TPkooU8n}{$P;TqogL}E#o zv}YYEyXi9Ums$Cc8DRvua1Wiaz?BWa!~vYljGpWh<$8?TV!pIDekX-@?!Wavn)LTS z*#PGANK4WC@GE!t5|Aydd7un7Un^TYPSnQZp(H(J|86Ar9iIT1d8xf8!VR<4YIm3& zv>43>+e?{YaY|~7H&y&h_{sjYtfP(N-*jw@{Ed+PgJ6J*Xpd9<`jK+jkbFVIXShdm z;^C3pg%cr~-vp_BJgM{5{3Z@6U4Nf_JrF_l-QdPr=~yJusd?h;8soBAP7`v-D6JyBE^{9C+r|_|%YL^GYjEHKpbL&LIqT2UhUhuw-?~#cS z8OLf9IF|*&H$}yG>#FQ_YvAUe3tnz7S|^~5HYYZm+W>x-=E>urSav(`%NX6@BHTMm zaCVJmEFP_Fi?GQv;EJeel0icC z>wexXVMe)puu;{ck&F`!-)BocA?fwHa};S(GAr&F-3Wk9UfIr?{0vn>CC1HZ?cT4f zFcy?GVDWg$XgWbW9^33i*W(}KM7mXRE4(-ZrA`Y;25G)tWs&^Do{y03*RQxnrk$pI z*8;6gun$0Mfnf+5gp{wJ&31|?uHlZ5g6R3B29dxx3;I%g-{#i{mO{%nSHuxNF!_!d(R#F66=plzxfkmOc8Rm)MgptwMLEAxkOaFXYDYBxL%7MTCQiRFRuc z_}Q|(v{&!$F#JGpSCOgXEFR4O zBi<|yH2XN}6z2?%T)!~3@D}GYIx8&=@C}#0$Z_X=UmqK;^Ne2BcHJ<9~Rj_k$; zfbIJJ8O4&YJpQq!J#N1Clo3R0dyI|YxfNgFc{N>evFX;Gm&Mj!HBOQeqgnl#r5nE` zM=|)5A>~)jSV3Yib&s0l7WMSvt0D$ljaPV=oX~x%FOgn?SN2`RPnEYUCjyt~>&y** ziBr>7uhiFbVv7})mJ}%ai7agR?%V2lLREPD;M18e!l-YzPR^*PSkXluc_dv-X6Kjt zeNmpT?`EMGwkFXLP9AWJ658QW8d-s1qFRZ5{h)5z^|+!Jr{^F7PV+wIi?^~Hk=2*W zpiyG5#ee>kpLWR?R6Tm5ya1nVzdU?`MH5&UYWIn*lf$=*-y~`+%Pieo36<y zSSi<^$_CH`q}wXq$q#{oBsCeMO7RQ@(xUS!iq9L4V%{F;k4W-eNjX1_A?RkRf48bO zN{)TdIi95`M=aVX_IgWk07Kqn+Z-O_cJ)Bmn<$bAI@ao>)Sfci5YWW}v-Y#>kD-2# zKeQIy6GgSXHLHe*kNCm6gw`H6`Wznpd82+y1g`i^i^LsjyE#!+(0q>&oQ87fN;Ba| zc95u}T;C|$7nJ-6-zh0tYYqD|bt+T789H+6v8>!m4g2DL1n!oUIf&f3-QzDOO*r!` zd^rnOVs4?zUp)sGU-DaE)Y)yFy8X`-7q0t${4YS#qz;r!j2&INmKqvG?C({Tu$ZIcxQr#mRjnxV%|y z9wWs0?t0+(P<&AdrJqCi$!)ZzfJ2w@Pf?Enf~v{$X{K8y(Ax~gnkbU^AQ=^YzWZr$ zWFUw9Tq;;oB|0hhCgV70RIp!bNfHrb#QdjUcI;Be&!ouv$Mg<>>CgBZ`5N&@%bJ~i z&dHDfj0@14TAjLE(c#}k92%orbgYC#KRQ%39YV;h+IpG>k^}Z#U{n}0b0oG}Ar1j1WX`IR5K-;BG ziIcms^QX7WDYKKWPhy|2EG#ft)t^pRGEbX&ur2kJ2EnZ#$^_Vb{_$f`_&tamhknFc z3$v%q&bsb+uSH^$gA-)sKbM*&K7S>oW2OAdYsL7D*e>T&ON8Uq6~yEia^Nj{>(z&e zfXJ4ns=mBD6@=@xU`}T4Mq!mAhRCZAeyKeyYsb8k(Yc?hdry$n-8Ifx8J`T z_4}^H_Wey;TdHV%>dTbCbIZ|VmN_gEvhlKhRYT?=sx&J2tE4)1-S>2!tn~3{kL&#Q zt94Ihid{`DPcPo0ur-=Wh>}(zp1B_svhan`3a|b55%m4WZ+llA>UYKs>eyU7cu2O0D&$nHVTWCA}OewrpD%I_vHJ{4#K-{Ch zZ&B(3^tj0E{rZtDbN51=pN5KC#LJ8XgqCY!mx}@! zbQl=Gr^@0*5FgHju0E4dVX;zo8MV!r{q$;hV<)c@SmCII>5lU@TD9iYXU34a0QE9E zWW;E=ECRI{!*6eori1Lk{OVKaI$o_6T)h@9`etFf;3ibYuDBK{Nq@>s{A2X5-A6}J zFSC^>@On0Ps|^bpRW$us4ob-t_RHWQspVy^U!E^xwpOt@#i~9W@&uyMq(&o6g;EBc zppT%4K1^0ns}(y%B-adI`Y67n>-nMIJSa`l2ZOb1D!ns`1zz0o%w*^KgyQx;^)u$n z?XWT9fbuBF)r^+aNQBF6|CCn*OGOZ)tp5f=chkfe+tJ##<5{ju#yM;uaE3@7t@V*2|-WwBzZ& zRA!*Yp+51W$V`YznFrm|7spi2$G1Cgyrt~zY*Xa`{o_nv6~4z2rk;y)+k67IcVE_QI*H` z47d^mif{l|1uu@*j2}*>`o*9Dyq1^G`iOvpe8b^+XTn1je_H7qy;RG0rHcW~LZ0{@ z=*&unm+Pk)%GdbhWB#&yBce}2$^eXeTSA!<6mxqHj(%r3Ml#MAkBdyrUdBbl6$f;c zO0>3D6-x16Pb>fa^QSCVtjb9t!`n?VOu~{zXVLfhjRdC?gJb1$|W=OyD4>e{ua{xwtz$bv`b0J4I1~Z-tM}p2P6ih|12!W0etzv z=IPCo_L@ueH^id(9#teOMIIQOqj3?cwUvx!}-1ro@)<0^O^p7LUzNU$%Q58AA z+{xkgE^d^5(t1(An*|wzhaB9EUO5BZi4W^0%N^Kin_>p5B=VL1_ChXuMc0Ekx#XyW{K@vUL)Ba*I268Rwev zR?4hnEYT*iv#h=~x{1MWrt8th?;ye$78GBsk(|i{6aJuSjh*j_3?uLZDG;p82}*7{0FR(%yONICBe+lZbJp69<}1 z60bfndGcb?vtdXTBY01bI*ACED0_{)5@V={WTGAv0>IyAT~q8n924FM_Et}#P$5OF zK5kL;bE8_m<}2SMO?}qPyaUP}PAA(`G!WaRYt5xARrURM4g_Ma@^M1JJ!+ItY!@9Q z>tPFZ=qvZqFa*HX^3t!fti%}A<7OX%0)GoRgIgCaCBTO@Gq6U)yGQY8r4J15abI@u z?pX&3BdL?Fm_@aL>t&VUUhiG0j$}JudgME4HhuOieq!CFPLf8Mlh?0CBO|%XufLsI zFR>uX1c*y{GO>RJGs|4zu|hWWv}VpSa?zLJTJJjrM=@dWki>wd8n^{eOnQL1pzP?Z%xROD0&PvIgErznd;<;fXH*X>*swt2Id0zX?1}R+OZ0Bzm6(+*C{3bo`|L=DkZ$C-6 zRpFtVG(sHkJ_=?I!!VVKLWcPu(^GKkUx|prGcFGsd)Jlc9=i|9>0{xxk8WZ=dVjWk zZY~(WqeQ`8*^(VNm+a8lSHoRqz7I%#J1851ULHvIA4oSpBII3I?X3^>* z{o2^Cj7S*dEGW@Ea(H=Wbjbl_^_O2eT%fI^t(H(#$Px6>wwzY`J@yJo`Pb&X*RYIA zR`gZ$o2G|YyZHm_jx!P7O`iSsd)T{$7K0NVH~Zj8$YP}n4*0bU=lP{@{8D;B6wOTP zl<3b!Rul`Q8}-4?;lnscF13zN@B0DsN+ctL|AYB0#M?*WLcLN~cT!f1&A%AnHGdme z;sX`T8K#*|0#w5TnBzV6vbV2Hw7@(6TTIwy@>geJUMOGKt#qJvl0;4edhJGC2RwN* zH4yMQoqEJO*<}fHOqSc*i}U|+eJp%#7ezG|+e*%Hqd$BqgyBG!QTILu62 zEpi?v7Vi|Y5-K$kOhDM=A7bgOfRB=`Hx1K$Ck29FYCrpGNvlRGfAPlKQk#dKBS?s^ zV5T2W=KlVkyQP3J+g}hpyCBrbA~P=ts!+%AzET8|ylFqo#wmD!QdlXnZ6}blIV(^= zRU=GV9U<$ut;^ADw!Y`?D(8Q#@E+iu_z?f12v}r++WT|iN5Yu)ZjY@*s|7@6|9MS@ z-DMYrIp+X5X^NSwsjr&t3hfDK4oJ68-@iR^hg*wSkD!sOai!R`cEm^AYwwRCcWcA3 zMfF5&_!X4sbVcU_jI^#PoD?gGwr33=Zc@OZ5j1@gEhJ8aBtQ=A`t}^4g8LcL`Hds; zHBKTsr5-A=qKuqRNtSZpl^vmBFe0U7;jgA!3kg_DFB$y;T(5~70ra-V!u)_=qEK9$ zG#X#JEcy!Rx9+-1Ta6La1#p-|z#=7TFC4NJtkLDbiCTa^C@67XJG8eU{7(!U8wv|Q zXI|1G_3%`_^EIpnAohvY>5`7NwlB<}?|o03pg-m=YfYGq&YKJH{(r8JCQm~Abg8`wy_06$;0iE5!=2xs{P?}3 z+meKfG~G8EDC{Kvd&PBz+KDQnTbBnL(kjf*4gtbH3Q{;mOV|9G2N0x@(3pC5r@@IEv$G&l3 z4P!jqS-xyBLHadbBtdA|tT`k>K~y%8voF${Q-T+x}cBvl@tG zv#v-vW~;J4#b3qOQnz9Ri6txAA~GjE$A)?SlN*8Ri;Nc5Y^2hZCP6K%(eTi&J$jQi z>n)bQ|3U?;FIw#;AMy<5anP#{T6#DMkLkT)9q~9o%Wa0JDhbf+1S{K5bJ$oX^oH@9 zXrwXmzthyXHvfk4RzGW|(*H@IdwcV#Cs&^20{&zCQ_T&!#89yjqMO9MX`_WlO$Z*W zr90cFPoAD$e{i@`MjXLIovPb;``AL1Kn}p_#sJFG*|+}_#V=s7^K?99m!|F}AveFl zf)}Kl9U$H2|0yGJc8e8-y zBxoPyOB+Ipoh7hcTr%4j>8{2k#P&{H_2fj>#J&91pp|jf}H;+ zQ#)A4OHDmiE$W&J`7U*JydVlPLz?U6qst2*kugv)=Pod!9<%h&;DFGhfxHX9j;1>3m58Q;sVC0nfZHYsqs7w_iX{K7WqCGUFlYt^?Flj_a(FY$p-jk= zu4hY=U5b#TlS{b?<(Wx1?MU9zHSYm?BeT_WbdYKn6J65S_(I2!XLCLSxM2$xIpMK_ zrV2=LZc|abGb(!s_g@KRcI)-uCn6t+!g0Hb&N$$ozK)^xM=huL{{z>wU$y`M literal 0 HcmV?d00001 diff --git a/resources/assets/images/engine/logo.png b/resources/assets/images/engine/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..572f192cb60ae19d350eb79ddbd4b711ffc5396d GIT binary patch literal 49286 zcmc$_hdb5(|3B^=Av+OeW@PWI$S8a7y(4?eUPls{MM5&OcO8446jF5Td8}k}NH{nS z--p-x_xT%sb*bxeo#*{L#(muGxBKn+N>4|XoP?eP4-b!AT}{aV4-Z;?^>dvN{HDEy z+zR|h_(W4x3GediZ$W2SI`|E-kD9qZcw*}62lALZCm0X!E}pv5BctHio%x^^E91_~ zznCE8heH)AC>!+g%^!`0Me!FKw>b(QWM@;~e6DbVN-yDAN@0A#s5>{Ij-L~!qBbI) zMqlVT!8d3cjNsa1u2>qsUki(iEdCt}VYdWVt7TWiZIJ0)%W_klKWyN~&c{2QwDJEx z{K3m=Q&9S|_|HmE(Q@v3TRYL{q{KCNVGHF6%cZU_>Ls>5>Xb!QpHjc!-1cH`eqM9H zF*LrYgx~h!x1dT>qsw{!y_5|dT)!o?$7B5Rq#4U?$01B} zdl5Fg}l<4tbPx}*-UkXL zA!+M*VYBG=I#p|qs}&U8kd6ptsOxMZ$R0Fl@s6F5vh!b3JWOrRPcC9OVc6%`zvh&> zd~w_Nyxh2|t};wX31X~dArv3@OzGjp$r?gcc#Z^Kgy8TmGY zkL6Ryzjsyc|2^=YJqg|7@Qz&Kwq}|~;!IPPXDqgVglWVCemnSj@O60H#^!0GaTT)4 z^1qL7F{pgurtOE$Eq5{1Gu4wfHZPT2hBQewT%>V?z$U7qKFZYmcNO;do8uMR!()b| zAJq*=i=94>-#_4df?~msd^Ho(a+&74!VJH2|7JjPJa<9D_jb}^!_w+01~qxo9g^^* z!%4!7cO6^PeoL7xi^(&%!^86*l@sDyx2g0MZoP?OQ6r5d_gy50Bk}Wz`YKF0g6#q> zbx~0&G`P3DiBUE8>aNyWEKf8_O#Mh>wq;?$rI@0Rj^YIyyL1qNbt7yY(dn;7U z`oFc-Fsix#l=URtNtvld9B;&Ox_U(6qkC|IX@8h&e)3*yGkAaM)=c z#b3v(if;F*BV@7f>)9weDeu+ppN5wY+q#YpWRfJudl7;8fUul)}E-& z9Wer_+h(S+YzC5)ko)GXpB?|L377_5UGQO@-us`OsUCr%>IY8+NN=HdmqM2AElpgW zIUMt<8(X#^vTb<3Z087^ovgZFKqnW1E*HJ%)@vWn4P zvXbv6OcGA^;qs$YN8~TUIv3<`{@Ttmj^5_ZKuh`ryo!fbs%;aFsi({7(nJtUvv}S= zv$@y#<{vA#4Tx$V!Z0j;qS_2lxXynE!f|#`LPc;Qs7Y# zHJPM#uxmzhiG)Eh;GdhAviPF1O>|@*@ZT>;TYSRtW^2q7U+XkShawk;G{^gc68#>e zC`lp-LN@YG&7Sx4ptTKtr;=L~;OO71k(I{w^uy}#b`ioy-*bX)?Mp6+ETtk=5Nxxv zc@4jQ(QVtba#ECg&(!{1ArkeNj*Bl6fQe*z&SMGOH0{b?u3Dav`w;M%ylu3~xH^;- zt{RYHCE6*`s`&YasppBNB4M{Nsy=lDqa3H{Adg7yJn$TWot5tHZo~)wex>cR_?}~? z4RdER72+`bkVdG25Wu@we|wOBDI;{vjn2LW$qqyJJ5X z>27VUD?Z=4>kK*4#@hdQTlg#}s#vl*vIDc{36mfXXcK8C#*o%nU6iybUIpyJ@~UDM zQv%jLD|u^*&gDebM;=Z2hC{yD?Wj(`FXfirVzqavuJ_8(l)M(>9_%VvC1Oo*;TFNy zF^P8`e0IF=9O(Xz2IL6!y&fxWk2vhBEbZc`E|&vFCwX>tbpOsHm828vDw`x=>aVkd zqMeMJOhE+2H0}4}ugLFX2#l+H`=qptsmtV*5#pe~0<=L0+%>zp$jQUrEF2d)$RSX^ zWYhuo)KiUM95WqdSV~q>w(igpMGLp~U4+~oPnDAq!p{`3L);7eN?zwedkfgv%pvs< z%w$dQLl9?0G~|n636_|b1ecikGA|drk=;d?@|ic)*x_h zgTMBW`CM0?fC**ImFrAi{Ym)^$6*Jj^+s!;qEcq&TNaf|4#IZxKEmFQ(jgiL90Sqh zRqc?Rrr`8;ksNJZWOI#0gaP|iy#LuH8Y|IE%*rM7Sm@D?AZek-w5z8PBzKIbL*3-J z_KuH-)Y7b@i4o`qbc#E%ljO*l|9j&q(ttH(;N%x|cA?Vyg|r?|{=c+WR<&(Ef6rLK zbEB(Hw!7^lp_)-n765dcIatLH=+-0#Ga9i?1c{?p3LPFIQA&ss` zMOD>rMapwm*-NOVdBKP5t&jW|Z-%n;3P`u3`9i^|@?G*yi=~Z`KWqt5F<}`Tt=f;& zAdUBsnx9(4(GT2$Oqx9lOK~eHTf{Y=-_-->{yx{)a*KpI8eXycVvM)&kOHOIiA=8@ zH8)Y%m0ah}oJ-Iu#iM}yeg6>7+6L_(u zxAv_Kp2qyDhE{gO_)A5eE2t!8#m|f{2vrPq9Br|obQ?8FD(~}wEISnV=)JK0b;USl z(s1hAlf^@3u`@%6qoh0jsY6+BHU@bMeuO>DPv`PhO4EW+e2eg)mRyxXr8a7;+UFVr zS9Cp0)CC9M6Kfa^hhZdL?_b2vXc1EEG=N;TQC%wR<<|;nXe2Lb52Mi+d#mMiT~?M| zm?3(`ew;RG@9WG|=^GBA-(Al=0ttLOUT~OyfkF6=_uB*5m9z})Do;; zJS6m=B@AW%OZruQwd3EtrFzrMEiYyl7KWT|3Dae{t{wmQtBc|qs6zN7NV8-Uv7{UW{%zEAL@Q6X z#sffE!WWUDxjpql+w2v#m5ez&Z|Hrag|iX3BzpFwB+eXJIt-7tWbF{`@5l!+g!2XM zC3{OBnw#sC(>$Kf5UHn8LK~yL5=AG&j?VOhs*8@34#u)%W3h%Uml@oZIPB?q{wFMY zd!#&sVTB~=$=`o1EEGFL4dUk17tgUGCKaesI1jj*qqeN^CQjL#a0)vmYGYXl`rFPE zjS`v0`Hh?pi#&!eN9Sb;;R0%D0`Wy6Evbb~zgDHU3Y$I2ouclk(?SyCi@0E1K2beC zR=cah77i2lumet%{kUPy^PYd~sMN_6BM=v9$Gso*rr*pWPlw>cT{C_t&2N8|O={#y z;U|k-F8sD~FF9ra<`bDCnWo41Dikx5xZT;mwtst{+bPxlxI7>Lr)>St_E7+yeuJdb zBA(oslJOp4?cMYT+DP$4P#sPZdtE-ykopLT={M&0>^v^oXuF6k+_&<&?Zm>Gekz4# zDLd}iHxa{pmao|$Sh62v=2U0y+p!0kY;tcsACy~78Ya@6c_rJtJV?rCzf)Rr_p1cB zO{%!Nd%oF{A2U4jEKR<(43psjj<-&D|8e#U#w86ZS8{Cdu$)8?XPE7prXW;S?qph<4dB++e zRT!I>p@BKB`uFx{jkW~V93?*%Rx3wLHgVl+wJKiVTI4G%e#<3S#*dG<&1|=P(WkPZ zp(zMl)woHl%d@|XlIPlW!uuq_SXUVa@JGj)B^&-Py3RXE2qD4kDz(u|H~$(5u<+wDsNj&iFe7 z-;=8Eo0 ztAxy%vRMJYBUP#dnpaNG-yv+WBB)OIEe_PTR`w7~h~000J3$-emW`ZFk#V{s8_MfL zpNt#3TvSU_^hBfD#TkLQvmhw}+HM$DTnwE^K&;mnp~AQO<2Qgy!gDMboa?X7{*uN{ zit`)r9MHnpSD_}htq(8l26bGQ9w4KuUadF;NE*}Vm0S{x%}TsmBFrv4ogBPmg@CX7tNYLhWPL^=&wj2`CqyN(fla+@#}k;(3xZ^9rE zMtqr3g{<5p<)iXF{{i!E2<8*HMX#;>u{K{uv{KAj zxJH0QoH}bfIOE?bI0=arHmqF8fy%ePU&i09&YH1n|5>!aM@7$Q^(CG9!aZAO+ovy0 zMYi!K-RieGVOS%u!)kj@utO_W-uz23r+f6?L*4RE0+TW{g2auZt~%ns-{{oRzQTk? zvyc^y(`2qcefJc{p`e@F0JzKt3N4nndv@-is8WvFL%4iZ!7Q4Y}=39#NW9_ zrn>#Bbh$3e8o(*aYKw@j3OQ`=?>3GBvcXcxX)|9`_s{Qd$|SZw>Vq7OdY32}NLGy zk?q z?mpce=1n5U$H$FoY4GT;u=422z)zD}w+M_}KX@OWo=Xa2DU#t$n;J`GDoIk^ck+@C zUQx&058gKwmU-Vde<3U|k8sGsQDFLo!^q&OGfxt`#pg5y$r)`_(}uhVJjgv>VWaR^ z@F#cIt*KWc`Fv`PdAq$5{LQf?t0YU*6tZzT-b_>~Z-Tmp|eN&;J%-X=jNFLU7W_=x97$$@S* z^ZniNe7uISEX&U060fDHEF2j;e{3FC0Gi0Hv9ZHwaYY)>m>CMhde~)>7p|&AmheOW z{<3xQ#q{g-f9WFau-PrjWIIR)JCF0IE!pK@kG3_qy?YhxMq5Zf?gjdVn0)vI6FX;lEZ+8|)Yr~iIf(W1Pn`YgR zN_ce;ref}p2XsE0IqHJ>i-d4X*bqa3H1ekMSWVS-9QmAWY){}-i=iVRLG#W&kP9u( zk+S#M?Z`Yr`j3D-X)6kE5P+v$$d0n-D$L}7WS{BxiD;FHskn<8=oU1i!`Y39vL3aD zt5nr!^OKaPMNZGswM5SzCml_y(=d5jTi1zi^ak^ZX2W3-790PLoCm$QQoQ?d&K8S$ z3oFi!hM#9Tee&_nG5mhsf)BcF@W-u`PrLf-{4Ky_jWA0jr)MeDI2hc5o9%O*W+S;Uof3!@&0LP!qBL8~%tGp_W zHXe!Cq(t6c(W48ZC9Nu>N^#O#MsSKAS!dTfU47!+a=+!{)peHzeOYbVqN! zvKpFFX4Ta(f>t_QIDJ3}cgQ)fMS2V8DC+7OBhxj$hIavW!Qu44+Q+-!BcJm!XctQC1mX^rrN633AWpbg!37hX=gHvAPA3H2QE^k?KAp=iXA`Ct0=QwdQE10<7a6~0ptR4;qlkwC z(G)*c;fDurxeI<=eqcH{ofpX=O{(7JSdElZ_w)PMnFNqh@SxzeKC$J^h+7+M3DOLI zbyB|1kyW_^c zDO{4H{;%cidv3g>kfoB!TMLD3dAHaqN`!S@HHRuK4TtBAD=FqGsSDH?Md7*hH4Ehx zNYREGK(6KXXVgjI7ukUKysgc>d17EZW!@wt<=(N;R8U_suvI~^%F2=K7f_D=XG z`!mt}ODU(Pc8Ss^4kG#uWdQ-QMI$w!h(Bekn`h#OP;Z+h(~0m|R6O&>k3FvW?kHFq z(!?1-1>g4R{sCGwSI5NjDPBD6??|b}A-wm?78qWqGC-ST7+3i!90x$-l;f6lmY9uH~Q1*SGjNtuUhai>=k?dE#B~+i|bBwpPsp@ z3sJ{+^s3$i`9z8yj_>kPH2}rJnvml0HsBFc(&OcAM2JF@&O|Ui#?_?at#}bQeq*lf zfpkf>ls#zQ#3y<>$x+=i8}2{Rq^{?50yk0X_JMCQeqvn35<6m$SB*@Oi?ov}9)nnD zfXH@n&2E-Ti2irdSR^Dv`q=t8cEqH@s&b?n##$iBiw8UW#<-3 z-nLsKIL?^Y*@c6zK%+|Q$L=o6J@v?I)wX54{A?*0&$kiton{YjU`Sz&^d}9SP^%v> zNTy5ctv7Oc_-@`+QPJGepK7DGcVj>2#22xHFe*eF&s?>U9zKHT{_#)pg2e_8R7lT& zb-3;~kaiK2(T&?;*(h~R!-m@0sjUS%BF1`%tgI8C-3SxJj)k3CZl!R}dcM3G-#dV%;5r?&WP;#Dt7JAQyfW8PDBD zkIAJ!G?FC>&ynhC8)*u&Ge|!_urjqmSTG>vp(&_F$fb^Doh4Gk`z_ea@aPZAok2Xs&2!fC`=94Cl3s@Arf>LF4&u{HrEuhP=4FIq*qkiB??_btBcUyRADYWin8Klpm z^5@unX`0I$z8&oVr?@rn0!$q7Q=Sa-bNi;wP}k2a5w6*!JL>bZ^1i=)UXryY&Dx-n z9SM9ye9vXIKd=diOrc+5o1=Bb%qH?6rQ>1jsSCzbYxoSj#R*WisC;44Saz7^mXA)m z2(~gqV`{t+*C@kajfkV)X!wTU|2#A1alF$@U&1CJwm#W}Cjec?W02IFxVa?r@G@Lg zHq-6^L~l`HipIJx6JKFQlTTn8~<9NFzU(G?l9&^_hWrL(Ef0)UjLSrmE2dC)0 ze8)Wtyl;_~VEp32gUP+@v2~wCz`ia{eA;DzN)DSLV`LMse?i?H-k{l3_5b^pXM1E` z7GLVcS#{ollOz>IvtMhK7tUZV#Elb8G*NhBOWoh@`V|00b!?0+zfMnQ;^E?CRGJjC z_rz9ufIGHWJ?w@u95#~dD;iGhw75BsQ+Ll!I9v<~VMNp6w~PPESg0gplGX?Uh0~vRpWIFX-)NJ3 zNsTYFu6E_f{mI@D-|mnhde?f;Hm3+Agx8coVc0y5ftq66(&J-$4b+!|+*S&Ebq z7M*{Ni%Vi`O&$8s|6sZ9|Fi%zHTo4W-Uw{r1sOUBqG%|1X3&=++h$`wNE*9|C=u(k zJR^-S`U+4dPqG?Sh^oK2T>jUc&o57ktSyC}$yb@=*BaV-#LVOtcbjYtefwJ+I`2V6 zFm6It#?ptAv#WWVC^z+Em3n)0ZT4TODc%_U5={r;2N1|w$tqMKQ~xXg{lhU31XE;K zqCdZ>p4QyzA7xP1HJ!xKN;=KIT2u$hv`?}MflO`^6iwk<;=bG&4z z6;wYr zmX8eh-+0CYm0HYfX>_Rzzb&@mlOygPz;tFWJ6YWdr)bw<@?Jf_h+Ub^jrwXshslRn zmYR7``oJ=NW{l5S&Png*AZCiY$p$XTHk>j?$NVcn-f#!zms%r3F%eueh&xUJ2|xF&)_V&vQEm2@{E8V=DU2U~%2ru3DVlR8 zmopnPGgWQW#(Q+En=Seljh>5UGUN}u<hR6+ZIWlB*D0ZZJc= z*IN4`9XCc7O>82_QtHFYcH~$xiti}Og6}l-iQXJlcldajP4`sg9ccRtYCMIO7HATg zlCTev>-{d*B!-OW^I&9J(G=11f|ZORPzEhiVz!h1?eB3LGeF4QIx6WR z+gg7+sv&+Rf=JEIn%>_Ws5&CTiHdg9l}NUXAH62n5L>0y@9i{ij@Acb1p2*sT=2q52G0%;8o6Ew<@2GS7OS;yky9K@gG3h?eQ*hk< z%IW+hI*BnvvR+X`nX{91_vPDeoR<>gA|$*;$2x-2iNMpCmrcMQ$4%2kW~CC5x3ULG zsrL(Us`RX#A8w_b=4=e)90&#w*DJZ@&^5avlwRD;DPfsruq!WAYG}3ZWn>5TV(M#YE6`bt z9JAHgdd8QD)Ozs2OPSN3uHK%h?IZxz?UA8j{83xU;@HBVy=t0Z$EJ+eN~1O0=zUco z7#cWn3?L0Vn$9ztnshCl*AwY|Ny=+v3u#EOP|1?XOEjHD$wBg4{1Yw_ELD9Vu;`1z zj9H$sjSAKBv|7FNIOa#`mX8JCNcvK6@4HR5T0Kem@I<5^EGbI?P}cotwd4& zZ<*{Hn#2{DIgbuoZW2R~#}7{w1l|r1#r!&Tf4+&-tv44vl@rq%CF#O*448WXw7wixA5`8$-L}mdHe?VdZ#BX`K=6-& z9N`vEWMb|$)Z;VFyoXvep6(exQpLY3DFJjn#glP>c*R55ywKyRE1G>O_f*48lDFD` zXC?B9MsFkJsr(X*Tx=AYZyNB3WVr@#O>4zQs3&$|V7Bzm4_nK%D{z9^bDXIBFqG45 z^-&9m#TFh;6JZ`8UcXJe5cfSN07*oc zoZlbG^PRrMCyMnzQ>+6XA@)t?-tSH!XnAO+w9|I7*HY;6kSr-PPkB;5UIXy;X{R<1 z+re?2YEIe!>d~x_ZmaxbPB=Uup!1!E?^r4MlcOyb!?|yF$qj3)(Bs#)!@%;k6rn0K z);R`J1X8@KKGL_~nuZi*RndX5hE#8Y0MpieQ#qdit=Vjc5t)9{5m)i@zw z5z$-*Zp&KU-k0SnW-$K>!Rs_j3B3-!mo^%UdPum&>I<5$n~_<@Y8Ypnsajemn4Mt7 z+mw_RR?l;PlHW~lCCp0m8^MfCHmO<&?S%?TzSCNR*wxS^gguwKC^oLr6z@4pK^MFv z_Q~(V&GFm{A_7c=n`e%gE9GFD0Y#ZESed@mEvgXjY71+{*6_Q+G0!qrvHbJ%%_l(7 zVBog?IL(p8PMf6H^AV?i=XPm6)J-vNjK^^D>yFB(x!8&Q?CgPSO~6)ck6>rwKBd-? zW%G`LkKe)0d>J;A8#k#oSMW@Ettoeii%-W6 z7m}DGI)k1Sr^#0voI=p+CDhRKhe9+>W8V!FJRc^~=EAVGJZ~G`bI&gRSY0Y{#`!LX+s}yxikHMp6M%z)hbpl6#F1|IW?` zf#hnr+c{g$MM zU`(1@@zPMr6htuxpv}%-NnJ4RXVN6%-qVq+myLD-b`K~n(3%F^XiXb##%lc%m_=0f zpqAYjjmDY2h4)UFASN>HkImg0+)E~m1NeGZ8$^eaS6t%B}$spZ9441si~am&JN0(;A~tv5c1jmVs3DVH)!-gxqc{4peVml2!;& z_sihBdcGFDj%3G*gs7k6F(}@vD47R8N`hkw5 z3=&s19^<_vH}GSXK|D)IiC(zaq)OBL)03d3+P4W-aavB%bcx$#!%b70n=_PVv=1q{ z1}5YJwxsFxNy=TXweG^w4Y;@H$XN1zd|k2OXIAjsZWpVDcDZEy@TAvfV{aCfSQ?63d$h-8m~du4K5B+#J5FeaBas|M*URjBIN~xNyGAbpmf>v3mQHKojZQbvldI z@KTjG@oJhc$ID(7&BN9WxxJ_-t9e2MGl^$Q2}l?2ru=(h%M##B5-a3R!&A@|<~|wD zay^3YqM2i0;LE=!VOXM9MK@oo7p@C}D#1Xn09M6l(B77Z@St3pph=iZ)>^aVxwgj@ z{n5|`d1}KQuJBO}a+FKdrk)_#AI1+2H^8YbE1IV{e5C$H@|=X-B6*GoB_L< zQZdVmaf3}v)~>QA^}Au6zfXMgmppkhogsxm(u@$RLaJie*)M!+dhgx#C_p>N6L=2~ z7n(X8kI=NC%MK62XL`DcdDz&JsSQ{VI6OB^5<&qI%yy?4BVC8SZ}{ySp|S@;p>p!( z>|jm13=%tHJ(mra4!jvl-ejS2QDnn;kLzT0Xm%OSyz1lQ#q88-jJ*1GazKhH3X&Or z^Jvbnrb{DDi%p?vt9J|iH{an5NXJL^ zo(PKi$fc%-gD^}qoYG1jf&ESu+*l3)Lw>JoWsmK?~SkQAtt`LHNrV})JJ zI{_?xeZaJCxpuQ#fa|d66|**d&&Rt{i)Pn3H<$0fy?MSIclYgn=p$l2xOM_sv*+(b z{r)^?k-ynMh9M1~ZFoddj>`hs9-k>XF&iYh)aOkfJ0mQYk`TLU!Z~0Btn1o#3t+n2 zJ6#m#4}ExY-f&D^BcB6pghL?r4I=(E#cG>~4^X#mo$^S*8-9`rrY`QJ*s(}K$s~?V z=wl&WU%!n40XDXp0jFO(z%L;{eptKyFh8HZL16X38#bIun70$#1B4JbksR8@d`Kzb zMFFD&kY5lAu&1{&-llG8_xflhr)yXpAK$TUXIdji`R6)r^zFgS9vnu8S4}h9pLsv|RVAF=O z;bc@)Z@R7rm5jzBj-nG!ujxN?S_(YBzCprhfW%k{euT|Zp1dGdgx$xdEWZzsnt%OQ zpfhn4%~kl`e2WS03Y1Zmn?_1XXGWHDR9`SHk}|(YW0~-qR~QiP5Y3b8`eKdUGlufUR_Kq>n4XAio*0WjVOXMD_fhzaj}vH6vShcbbIwFnQkeT}6L{$QP7p-n5w zC|zR42IK({@bMNj2@BCqaV4aXK738l46^L?$(N7qsZmHWlriSu{9l+dB^DWx0oT#P|3z(B!l_UxeE!ZqwG2 zBX9N-?9$w0WBa1$R^lh)w0=$C8*bxuyVgw79b&X9A;oNeNMU^;)Q$AO%8PHXG#2}I z#_zY(j^u~O%fhH2k~_=M_(1HdK2{nZU;O0nZ*K_YHGWn_njw-_nRK94=)-NnJZ~q= zn1eQ$8|biJlbiKyf(b4Iza1S33*Iksl;*l+Yj~=YCKZ)>;(U-TCE8HflDYZ@<`eKs zi{Y1`b|5q%b3O%hi7X}xo~$?-BAp!E>6rHvd>mJ%z}G$m45sn0F6PfdoUoTqilkn}GlKJwghyCc7@(4^oVn z*D?kVeBuKFyUI890JQw^ySI!g@Go}vyAvfT?dPhAZs>CDvJ=bd-+nG&O^h$JK+0 zmc={uFBCgEafV+~Y}&Jrln@=mBMCwJmZAm6a$)ob=%qUDjOU%X>%G4(UZ9K+J2wHT z6gd>i#x}Y^_Caf{9@eg<%rOv4L0fzQGUp1j-`@*??@pFz^YO`!m^P0YF}pFle%&-` z#m*yiE6NVlO;;b3=hT}p20X&`-Rs$jBO0G42sSyzPg3I3BYYVQ(L~Rg7I6(GVIR9! zp>BKV8?5=Vxz0eD#4$Z`KRX?!-4pR+*S!<@4ZIg8mTIs`GKi+QeemnZbxehz_3(K* z2P^*ZyP9K_sO|Yj)=eI~%ji5#R_`$|PvG$hM=V@bg76_fuzrtF#RXGXMs$K%{zR27 zrO73r&I$RiXKoa|YfGFpfHY!QmtP0z@`1)pZtY(rypd>EDo{ zA>lxKF*=q-+AH?QC`V+jHMLn)f) z=H6s;v)-B3tQA#at_{%ng+UaMu{nyyLDUP_0*}Mx=<12f2&&p=RI|lg=?KONfA{{T zgQXHlhf6v+6I6vuV2x4zgwkguzfZ1fyMq0TvNl$2n<9*tN$UTF1HSPQg>}U_6};CX4$Z0cxde5MF$Am9>P zYCL^bz@_IjGXY9EUxCD9iJD!!PYwlN>%Q#l_&DE{CNz^D9$|ShnDtXE@m0K9)u#vk z?;wk0x7l=$th~%#D+UF~Mw_>&?zzo8hBTskY6T>If{{KE@g&gpWic`EHai3s1KRH{ z_~r!G#^cCdU3{j<2+{01qUwtWFG6W2BBB7z&0R40rn%YsQA_h;SbUNHSK|d;LX~UM zXGfqi!Q$i9`26MRZ2gIx^O z2Qxd_h$V%X&tIL8Hr1}0pp?aOOOprl43BiL#r6?uGSM=#2dNS2tAK-R z;0xXSg;LmiHsq>kR)oO#vIsU10r97OO)NIt?TVS7iUAvry4gPkwQpjV%vo!-dVTZ* zh!4g0R}?xwQ~k`0Qiq6Z&+Nz{N`YgugLx$jhy2>V{A+dXD`Ig7R?cwFU1y={fiC zG6wV5zWwfzVCEi#nZjsKH~7=Z9fEPO&ww0JjYbkkpL>T91ussu0}b}|MpZO_l@YTF zNNe&{^VP(kcHS<_v0JrK1pAYv7$|5fGDh878d0QpoepIRBJg?dbdQQ^a}Qt;b|24z z8?CB)=!^*OzrT6+jS7al@^!O6=Rw`R3#t6ad(7f9UEEPgDkrQ6lDkw#1%dsMR$E2t zjHSiLUw=ImNoscI&$POq#_OFh5K}F-H_BBB>z#%&Z|N!0i#qb6zXFd5&v^is8E&rC zBgJ+7D0s9u<-q}5F>D}LHcZ5cj!63a#eyoi;)_N1=qc#x>&=Cc5wX^~Q)ngDK3WIm z_xq&nu5qn^_9xwfi<1;k$dtz3#K(V+y6>~pil}0}skmpd8WFYRb`*fBqZnt;IXGDf z<1Tpl{Yh-kx-d3X;n5zENsS=6-;UPWH-!isBcG{Fsks`!(owOU;BAp>VSm40`F}I9 z-wsD>lCV%n^o;5I)pPMVrg1%{?G_^9(9XG!+7x2Lzv@r_nSvU~cFCL5c{^B6Ei$3# zuBHso5r_#3>7|B`04?(^J*?=)t;B687HlgQ%$-SS*is1|d)z;Eeo5I)0cyu7CUXh! z%U=RtJ`*}#c(E0x?x$WLIPiLau?RNXOo2y8Nb-h`;7&VWZey@tqUCNo6NMFmP$)L$ zHy5Q2mO#9jd+bT?2(tRMlZXQ52jBf$wLa!Itr3@_$DmB7#C=J`a3b`3aaH`UP{vcC zj{V1FPD}uYT(a*7nC%l5Hr-4v+LZI0Emtt6JW3f*Q5q3Uj$C-pRsiJiO$b#e!QxMk zzNBI#r3@GYEyXKXA9%L!bunwpfQ@^9EqHW4y31Aw6(Ln+5*s29s?khKoOuaX0)>IX zE~)y>N_NvX9QJ4>iaUO{>jPoz^2&_c=n8OMbB=)N?UNm}HiFk-0i}9&UjJ{s?wd#8 zYw7mAmEB!;(A;OrRp%ZaE5uZSo-Dua%^Dah5TsBTt-}E+`*9Pv_aCO)4^Ma>qm*Nh zLRON)UrRfS-p4=cyPHXU)S1q&xH{)3DWk|F$=49PRKL(h6-f%0m91}`o$gCqMD2;z=*&C8CEpTtLj z9bs8HhO)B$__1zkX#>fjwe(mDHwjC;$JG;!ywfrL`ZQZJW10ZzT8|}yBMJkrUJ>7T zLf40T%#Q+c1KzuXKS!LD_cmO<^G{DhCS=F)JDSZ*P4lA|01**^QhdnWnUO+9$(d8O{TRHsU(mQXb@vfUXh1&^m}~fxl<#ruG&Xxf!bSD=JLSInrvJIovlAGQ zYg{GdY5`nw6W{kd;_kQ5-*Lf$k_AY`0MjXU#2)l%(aZ3hZr{Cvmtlgx&C~wm$;o$L zF#@c|&DuWQdT_8=H5P&{@J=J5210?86U~mmH^!bR^bf^epQvHb8zL#xsR#P8e3qlX z{TMt6V!g#vfC$XT{(DeEWVHX||7iizge9W}DMMr6r1ibBaIw`?S4j{7>DP+_w{*Jf!!``caLnO#5BEATbp3JUNs|oMoeh z5=?@F^HY1R&^QDg{x}9B5roziO9qc$qgvzCqhY%Fr=@VA&^Lbr%(MX?Am7b79T}~o z;9L+LEZo?PdA||^T!u~fiPEiL355lz`k<=gt_+T5{5ryoS744SVFNj;`Q_?ah}Fht zY|G)UJPwI)7gCLQpb%l}G+ZD!#0;LcpB~JfZ?UCX8s0winpkK)s@dfXG0ehS!}1k$ zJ>8qjga(|0S7JI*>;2X(K3q#N5V!D}tCzmU;=tJ|sQU>FW9H&>m~NMMl_4JnEW^ri)PIe3Q6EFFW7vnq{N|&HYJkUx}DIgi#gSAZ;K>9#Bs_w zeH5Nkha7dMCW0Px=_`by^Lbt#3pmcXIZ1puhJvms!kJACr9YQ&%)(z^Bh$;v^}%Y6 zIlr$k&(MG`H-u&1!ieul*%^Ef4!WoHVeLh@dYA$6`I8TS)T6~lqiG1(T~`aQ<)rCp z?+J*_88JNftpB3@j(>OX6!*!UnQS)0aglx3O@43cXWcq6T-txF>2$Calc#x|Cuz?X zg21ggPTctwz)^r#E6PLk=03MxGyiK>l|b*e!XEx!k_n?eEKR9Y%9l&rkFK-6IQ&HB z>K4ktMw?Rt%@wcu(fRyet;nc$nPGv~X{^2R-6?uwyB~-x&zmoQN@?AAe4Q1iz<4>2 z*rG6NKjv6B@gF;7!zybv!%Qn-^iFDS-8YHSl9!f1Cl^zzq8G2mP>~<5lvLkYLl`3O8>{6Aq_>?5MKOREmydD zQt0MOA;mw;nCJZwKAJtk&$q&3p6m~g__`^R8u8nNUx$4ne7Bdmwq{I7KFDUeo#^5k z^7<>3^~DVXXt@PPkNkwo`^!*<55c`Kc<=gq|DW&4ITPp1JTrHd zPVN?F8{Mx80s&cOGnOcq@la@8+l7(IiaVap@2PsUHt&ZhCHblKt-h<>tG2cQ;PlQq z0YehxCB*|xNA_oDv=N!44X=)#nxxA$(;yy1Kc8eBQ4IG`BZ6j2xe`Pak~|ho`S776 z+w6@^;`)XSRqTkD3_IBQ5fN(il5^DO?+<0j7ZfCgD!w2EUA~W&j*_+QKd5;q+KA|1 zzDvqz$khj6me}Lqdc_+-nzV5K_2+z8fwxuYf;uW5TB_6-gdQ zi~irLD3Il(6*({J&NWZeajcv{5}T_LLglwAvVm=P>kHPxm#C7|hhKTY9mEsE;cnP9 zziN@Spk2^g>q?k)c>=kT7+MIY9CJCv1)j5CxOuvX6Q~0+-}0!dp6y|JJ-US<6kM7i zUIC?CosrRwWrDk24E>;F*ht8L?(&XIP+ckn;LK*B=BB2Wwy1x7=tt^5?)ZfDv`a`d z;Ixb&CZa*Q!BV;O)RLrY+K86FUG*VEN>GFxFW)};)OZrqqWdyD9`acPGC%*^dK4_3 zQcJ_3=lkvTFM!7c`ua!uEx8j(f{;?vERA56V0jFiO!r@&Z{-KIJJ)M+7q`)w1SM*7 ze8i>E(#0YaA9zE{S0XGckwM7P{s!LK~Rg}oO_QhoafaE!A4|4x=zn^uCFOe zIgPe--KA?b!%!KUA*a5WlX%>}s$$q@x~NKuy-=3v{kMnWse>MN+&Y6j3DX(2A(9h% znIIu4Ea~um7Z1KBZ0(NO^LN$Uzg{2O=a&^N&nh*3`?(mdP1s`nqUJm*{hyx^^t{=Ej_eC)MlUt zj`qGLy!$CIJC;xXa;LQ5+TZpyb$^ZR#Q4`TP# zu(0|s;q6s$H=2PkU7Ns6n|eb{ZXvJNrnoz?9I(mm>hJBkcyMfN*jLiWa=G&pK0)|E z3Uj6f_p_GQb6Fsf`L%?i9`8>0U33k}LNnQIZiu0{p96rx+3@lHPDtuLN6RqMDOD*A zqx?cY4?%)#61+3Bvvrkh!KxN)Q^t66&DfH#8vS`Vipj)x!TNqOb}D9AgTswt+Iv#L zAGeqbsbVRiY<^aNxDr<>oc4P=i~cbij+F%)&)b-_xq)463~lc0+N<0ut!$(SBd5QQ z4g>Xie;F+neZ>f;oc5kNTSGulLo?en zUGJoTb4Mt~x96y&+57H>7k}xUhYTW(0NOjo&YeFbO-4opv zqvYF3%bnQNgr2IzECwqAoj1yUb{z@HQLwi5jv$1>1|UXhS~knhIy2@JXL`P!MyLAe zisACX65tHtK+WW_ON!0$Gn~w2pKq_HBf0ckIZKo8HJccoU;!#D(y}^xm}TR{xSWar zn`6cO`omY$fj<^ELT&5uP3b&y382~XGdR`ml;V`=jm=N*nj&d<}&qHrsiK>?7^)ol~ODK>_V|F^hQ%g}2O`)in=)yfa<< z){=NpZEb|L4@Wf*KK(Lk`OGsKvKDl;k@$PIBSAhLJY5E*$xp5Ke<)3uI21+R=_NeFcjAk(Za$BV`!>J=KZvp|1jJrj_z^>V!C8wSJfqnagJxzPvwfXxG@9Iowu4KT)m9YQe3^8 z>WUPs@N#MiZqU~H-3ZT$U-c_BCmqT}f=xZ#&%>*NdWI;;n$51fx$s(BeTyqlqA*RB zmV+|F6-lw1`9)oE1=#C!&xxRj2YDjm6us5@(^?D;KlOuidGngK zDI$L#oi++U4I<%p?UQh8I+Y{uyD#ouCxzM`zsH>MdVGs6FGC+K+Fz)_Adm>!&^#lP zGt{*R)zrR$l|Yxw^7jNzcB1 zlM^LQd}IEvDgWW%xuuWG_!X80T$FxNXjHP4HmSVr20NY;^*}a>Uk^jlM~JJ6GBpUd z&OtXZv7M_vqKfH(TtwQG4dx>e;>aAoXjVfnbm4&_=>+>^?IkX}e;y)bC04T`6$Nk8 z{37-|8FPjL0E%*qayTZpmk|n-!l%o@hMQHxuHOz4AvwESEtL2B<}pkPCCFI|vuTJQ zow9IrF~?sd#j$7#eoFXHycR9<;9bubtG4*BZ*NzEgKEb7oI1z$DtVMzp)^$g1M%0* z?zY~+c6}ihl!;)>I6H$liV`rd&JBQdV)S4c2{(x}V6tJ7*R~MxsqH;>Bm6t(3X{#( zSmU`55zQs&4^A~YAHaqjMX$H~yJHkQ*^~{1tNFu9P5CxyyhgP%A9Z2LC}>7tn$Ym- zq4eo~;A!I>epVGw;CgID;VV8V%FsKWh^#+Ba1nSBokwuWOHrmqH zIT!{=joXsYk#nSInHyY2gKadn#>ymDx%48lNnN@&XP+~-)0S4(Bx9P=#G*+x!JPA* z<3RfoHC*IZznM3}Y>{x;am41i1lfh`t&EvLrcSkIxC9sIp7| zMgz`kk+2w8{r`==y(AO_d}JFp&^mbV6|crN-SKKuBWz#ZXl#?+vDu2JhQl!pL)f<9 z+%MmYiQDUtAY9)HB>9Vb__lf{!V3o<{1b0rrnNe>k8*5${0_u!U!a{IqpV*E7+U(e zjBrlc-(j-gp&YBV(ZHct^Q)g)P1@P9{VBts{Er(bC(wFAxbPvbfx7f1HXG}Di!UCP zGbJc<_mu<+HNh#Bf83?ovqRkt@1?#Wie3{*<`3&RSg+&LL($w6zkJri`j1_>tD>Q= z^JIHb{t`89-<9&(lJdGfcRj>#5+A(EHv*(rXHLR0%XgJLQc7rkLpap zFocP@hF;wIYlcQ0&~}?ag1)!z)>D?kxky>(3zV8g4`ML`O?JSe5fkk6Ki+x3!)Lc5 zhKKcUSC;^5ZKBVh%3SPA(|>0mVM$&t$p)7oPd?JRtDXK1F)X)7hP=v`B}7~UJXn+D zoL0CVx3vZ+kx2KvQP--lfcaC8^e?~F^Tykx9Kf61cdjU+*WehGP>||Hy*hHCRGzb6 zqSkRv!4iG6qDjEnu*svI!hidDd|2|ZHT%H# z{)`}KnE{{oK~H&JZ?`4qeXAW}gc_!uj@Jacsjy|;DWuhxAk%NakI<(m`|dy7j8ze{ zCafZbe)sYjzE*k9mN>z;FQ`6c+Y)(Xeq4ny ztf(D-d?M0wNLiZGJiI~d^Zh+8G)|Vb!+A@xycIda^$0SgzaLpNqL z`&VSzMXWLXSMkfipyG4~@5iaPr$$a>y#KN{H0#Fnr|ZeHBC7Vrrar&`#Gv-9gTM(S z0-xPWRF(FT!KjMR!-9d8K6WqY1fB1jhK9=u?#stT?*K9pk8`&HTQ_T0qXs440X`hI z2_v`?%kJ!RYF7^@_qFUej-SL$JTDXBs&x~M+wWZyqD#XgdLf*|I(k`M^UfC-xYkkbfIGH9u zGcv;hUl69ijh7%0fr+^YV(E4p*5ws{$;7MrjaGH#9K=bp%L&JNZY!bky!VZFs_S9%Q5_l~aA$gvnAr+YV5 zv*ANXjIrUJO@oT3pPoF7Hzz|rqgBBM)b-E>tlp#NX(}f|g=Q7+#a8m^QXe^QftNnv z4r0?4C4d}No;;$^E*;YSQ_l9*(wU=?ty;KkE2+^d6WlQ=nF&Wb4m~vp6ST!F($r9r z+H-rnZ+O^uI~@-$ntd$`4aYMqXRTE=HD$Ga$TVRSdgb9V-2fmwW24bDLL1-JXoV(A z%f`F`GQOV*WYh2$sgGHKh3bvxvtdmWS`eyN(FsEKfeB3a1Uo4QO-q<+grj6r>6MZE z22_AkR`B#x>-@n)^cInOn%L{fyX_9Q%Es36F19Q$9|}gS_809qskx2L@d52LF7?!s zrziBd$oK;1V16CrzgwO(UX-=4{v9`Ai5NC6nDuXuLkH!^jKsXts-5AidsI6+$s9@L z^Zvh3TUZh&PsFHi4J6lG2!z&*y-Di*)LUVLr*lBg=H~5U8XR1{43QY~3<%~5wxjF4 zA9`^IxSoy96~Wo}2c(~Uc^P-qx-u{L7QzMlNP@HhLWmHQ{n|Ty`=JSp&iD740fpIU zt9cR_MGi{T(IupE(9d)HsT@ZFnF@0*2}~Djl3$Tx!E)VQ6OZGN52|Rf=v0j-Amu8H zr(_rzti9E!B>Xp;U?P{QIrGfio*8ZuX=*0d-cki@JF z?G$G>VxLhKtT)eT*RNJDsGRC{|BCv^=vY9v#iQ=yeM_Ws46{$;foy zGYU5kT=fEo0imDlXOR2u0;(d`+*trnuwFZ~(cfk*M;bMEn z5^1lHUNc~Yu2@o+(kNOxl`jL6GTKEVzT2y?R9?OMDUSV6VykYwCA$HF&ESKpBVgNb zh0b01q@mJ6PC!^#6#MKQBy!}76tlB;W`W4YU;E}f_~tFMloY9MiN8U>M7;=(+;s;Mu{F0kO0a!z!P^R?emj`@=>wMr=87<16@`R_b={6k79Dn~A)mW6xpnY8=%N0R zo2L{{lV>jmjIm}R3*ExukFyfdZ}H5 zp*c9>Y0EyN^qiQv|la!hF$YGsW+a%W1&~lEt^U2T6SVEDT z*k52A=y z=WCO9tZu+TusO-CCu`b+8FprxPOIB4vQOFinjg|M7~AL}RXvA2r$G{hbf) z4>=4H^rc}@Uz_O5kHpCMii`24l&IK}MW{5Krq|hZZ)ceb$dg3Q6JgXj{sCQN9-WZqC;RpF;%l^5=O>T1n+C^bWf4+)(azG_hWl0gt zK%C#y^-VQ%H_5`@7}QB5g7|hyAhIQajh|0%`K*T3?A3CzpA`YvbRwAk<-LaZY)jX- zzuVe8!75(JHo)cPV)Z|~kZDL2}rW*JRzal>xq9?um$Oo_YWxwLmNH^M%tW>D77 zUI!pJ(tC?2nP=FI}8z`H>G+2K7RfM>ncJ(*2&SWy7k` zfLUcN;6EtRd%vUyEH^KS;^UkNES*ht$ZRoeO@L-mF+WJbOMkfXUYG|7H2e+t#BQu| zbJs5E#$K?3AQkf_+r9};VIg`=x~~aIqdJ?EKkinPjXhZTV9Y$dd`ccdi=YApX4sjRI%>}MLnS|jTt8)4XJa{38WQOAj|Z(^A{cqTR@6j zDbSP*to+%(iUUF%1hq+GH&-)sMm9<`=!uXEP6BqpBCY+$oW>IcaCrWWfIgl3@&Y-I zM>aV0CcdXUDAC+EpX=s~E))s7!plLYni+=CP1Z0@Wiq|1G^Uohx zZEgAQL{iMMAU?~tSy6}9#rYbW@+)A%=ul7q1Ca@ z5_wX(7m2I4#(OyPli6sr@FGNWb6A#9vDWS?iY`S+>ucN?ziP6m zJ@-t6{uNO~3VR(J)vN4Z)24}=n=Eh5_DPYAB12FE0uYUrA zzo0Y_C=DfF@d)By_1f>ZfJ;Ws5?~U~&`r5{d2J{f zYK2~C@sxme=ZrY~GMr%nZ4sjM!=9km&QG_VGd`ct&8ZMTn)a+-*KbspeCm-^{>JeE z1%DIe7DxQ!&o2pWZl|2**@|mC|MK!z{IUVoedABLVOAwNl~dokx>(`i1By46rEtas zIQ&k(D|08%nsP;y1lQ!g?wMdciEyTZNb&0lehg`Qzmw3Ri57m<2#N>A`Ge0Fx6(O= zhKBZ-+Pxi%!YT(=uFi|FEYt)?LC0b9r~GF_M)!;@u23SygVKMw_>!GvuZ&CQ4fV{+ zi-F6pp0J&#E7Q*6{<}<9j4cDUmdfNw7O7$(#E4wU)C)Q<%GO$ojy#R$`-@yyv$d(a z_qm3KEQBorsSqg{k3}N-<@;TKZYFedBwUvyQtMO#RR-1yPs+M+_QiSv+< zn+A~uPflYMUxJ7Y3v)DXL}KD=t2nyHY}9=yKQ1>>A+JV4L8Fk1PX7MGlXG`4?!;cO zZnRPt-jVi;{?5|l<71r&0@RmkpjtEKhndMf`e~Gl;P#Vv`N5aa?4rRY||Djki|9fzM2`e#aSf0@*M z3Q&)BIh|3%JsfGLD%lH+jl;^as=3mDp-^_%y*cN%EM6;a=^J_bqkYTu9I z-L|^(pOLD%@jbD^o6!BMXgMt65hw|Vhy5<(1>a}PG2?1MIY+0tx4WV6zhJXC_$we~iB4(cjrg>pDI%il1v zP4RnB{d*yk8cO&A|6$6fL;03g9eLU>O*VIWtEw94@5iF^LmWtlv>1$;zv zSO(Zm{SOO3MO~Wmg(-EsQV!C(Ox5moBmd(YJ1ObTzgK2nB6_AF92uPW$xoI@=_~qr z>n+FVPs0Y2l}-Ow@#RN^7Ypc2?g*{6v%NSv64g@Ltof0|rU&U#^Iuv#Z#LDQ&gw0y zw9~%oxmN4#$dtMi{q&@odR?)Q0(Y4*Hc@{Ay8FVjSvD6N$>8#~HRaG`#LHYhTrCVs^K`d14T=K@BT$Hv3BK z1AJl<>8qyx%G8i9#A?nf8yH=J`An52(~UK(yS+Ruv_lWQU>t2-`dMSDQ!V5k91*_v zsK>o0mQ=d)sJm_o4`^eoR`@uQdoh3Qs|pJX)cx$-YDW;GK(@PKsI#uRl+LN}Sn5Ur zLd`ir!w{XcqD4Vsa*y+w*hjrQBXLewHLlVw#kzQ<8rxjX=uK+vBA%1y`}aB)&*tX4 z16yjF$$lV$Cc3b{cg~5yZs|>l7;WNpL`F|IbTsFI05cd7Z0#~ zZ%t3{iafCorVDIi3G$s(r=~&2PvXKct%AI>ut+VyJU4dWswY7_KR3~^JoUd=+ z$8L?r_v$%dSa-VnX%lI2oL-(Ep{~(R*$ZguU4K~snNMuQE~PbWK>D>Q78KBmEE;J zHKR5xdHm2p{2ae@o)mdYPa*T}bV5jnFPm8W@@XafW{I=xcqUw=(~RSp-*#}wx>Ha$ zi>vG2g7t?X%eX3XFB!08>inw^KW~R#;oIV;$A;nN#-DQd^vdubndBKcU5g?Gq)I~O z6<}!z???Y!txWGLv?cE#-VdExoQ)jih#Da$TMlZ%Hk=}?e|)6iv=aF$Lgj9@b=df6 zrhCtJQHCOI z(8YLty{8N$SXlRyo%OUDl#QKmeZ?|Ia z;+7T`N@v9j@@_O|Tg_sgONDc<oo{{q~iokHm*g3X<| z-7lh+O-I1&-%oEty4`g)3|P!oHU+u>tbqBq31iB)MfK$5q`y=nR_QLE2caTDEY@z7 zDHfECG0{x&E(o1{fp+Sen(hjm+v|1GaPrayblqyG+QkFw7F(EiwoX#^fY=p@)F7ZW z3vNcG=2%%C%;ec&AF0@F$JCdz`g=CyX?kPv*Mu?s)sxC9#h_T~DeFf;@S|+A3V2=m z3-E4+Gs3jGo!kGokM&8O8>{!-bmLzqZB;`d<|Vp{Wyw}<$+UqFnFmb;P27a}e8vN- zw!=V)Alp<4PjIb68*zAk4-%TbR)o@yETWsK1G{eJnNF-~)H>Oaf46swtb53nL@a7| z&|%iz$fA}^+qxI`y+$(I{FAUeVims(fxlWAzP|@gf-@iTqi{112bgU)*9y@;09Lh&x40?^R+Z1?CD8PGJ zgoKoWA?*-fsw_#2J#<>kfdbE|O1G8Fq!L!lQ?eB-nf~~F(EEu%Tti02>1Vb2@cPjc z!rN{s54{t@wZJOuaZ6iwz*pA7Z~L+YS-D)$Js^dAxZm-#q9N)_b-VX;chSaiVCagr z@1Kvo*285q&zE{i0P2jeY=RNFl9h$?*2WxZ+7@#>Yje7rs|+`CMS$Jdyp|CjRPhX?IwsFv1bG~M?|fE9FfJOMAe#xpOs!XNxOT6JCwlm>OPw{}VJdlNIzfP*jZ zpFS5qu&mNOL&y?tuMd+JSjFxsf{*xCMqC@$`S)!N{f)#652aP-bvgAbu8eV7bPUQ8 zB?WVUcg@bekjP`>!$xYP^`b^H-Ck!{ih~8w)GwGg#nn&9S zUaP5t;LD0XVoL4ePxB($>KAm=s8j)WG1Y%MylPin#TQ$ZXKkh%-&!G}MmOi#=cqRs zkLPE<-ftP2D~v?X*<1kXr7~Cb=Y8#+W>Et7dq+#Z-3eQnO@hI_8U#4I0HN`o80m1&2ra@Wr;c`~8 z?^djFNZjiJw$CVCTn`uNog0bxtZ}=!&TcYv+m#h@UT`ElXw_&kXND^helcR%JXc(- z0lE#@5WRDk$71o!r^6qQc5h~o8oj0Z%UCXhJmp{WgU-;KjccJN57MRg$lm%d2bGON zaM%R>62i61=!!8f4g^ng(T0AWpS+l2GT#M7gxb~a;Fp-EXW-*1k!)zU611gIRg0#E zOICz^HY$7m?NCnQ7XzeOS4Skv(Jzt&gO!Qr8u~;CV!N5^<+C7axj#a@>pAZ}eBcds zl}l;u#M%Xp7~pz2^htfe~&n43CN_ zll_huX=X-iMw*`Wo{1N%djR1oin@3YL2yk!i$y>+R|+8sn?lv|P4N`Rh&2`*m_52o zSe`hqD~>a@qx(3e1Cz4b~+!|$smwM)3AVRH}B$pu|*H@#9;-}XC-T?0M{>R);!gu59`#XaLr z{{a?3G|0Pn8C^G7$*a3sv(2W&oC~_A7i@Reqgu#}?jZ#jagn8qlBK(NPP;2OeT5Ab zer@`XY$eckVCGOxS%ZwvD{Ec&<&>{fqsK z_`W+t^<96Z_RhoZNdg!;F9;u6{jRw9w)|OU8kSEe{BdxwZXty$o-0s|a+Lp@M0Qm< zoN>ZiVIfDFL#K4|-ZK30Un$@|*`jjkd@^5KCojHCe@CFdBgJENPEVetfS|Cu8oKxv zcs10BQHnrD&r6A=GuV=_$jsA~j-w*^ka0UaUEhR)Vb<5tENVJDLB4|1H@86ytJTk` zdpJsP;~lmZHn=}~QuU_mg7?01087F8UA!uV)ZE)srda1u#ZQI+9_rE(Je`XXa9Vy3 zf?{1oyc~Zis3H+8hagjC!EH~8+9LVtw7nDGW*3?9c$XMPjw3^b_zaLK)pmR_JLHKl z`x9sk#;D$eB+}4?tNgjP9Wd0XM2@*6yELr~{^l-9E`Fkj?Gb5HPx@{kAT^gU5go7t9|nyz4zDqr7Vt|TiTXDF|x)*zMr z-zaOUkQ;`+R0OSeiOfuN})E4Kgn&^U(qXbZ8xU53+-J&@=TiQTh=(jtHUH%{9)R&`orGO#GS zXfM^<{Ts3AH=LpzoZ}oRs~T;M8_b89F0y4lv7qe>LMt(1ArtgrOS{%llt$&N%+WeA zi~8>tt?hjK4?DsR50+_KSBT0O{P}14MWCvl-Sy>3|LTCZmSO6QXi8JlDkNDq@*m8E z$4xRKJ~;b1mtMB$&M}GLz?JM6pO}qBSo_%{6+(2_6Gdlm&j_txe(r_ z^RTdKydq_DYIU1*@IN%pvmUT`&dER!p-MC1e*Kg@Nlr+#x1u&4yk8tAlNN6)B*Dsl zn7JqC-yW&aGPE7lGN_+NLOx^Vv@wnh%D#Iwo4Z8u%aEF}!1SiZo!+p2Eh#vwxWG_m zh>zl}%C;W`GQwP?vab5HCYlb_K14zh-x;EkcOYS)tdBv?{k&jEYp!x>=r1CwU97kmz;wDCkmpmd7FCW@6T~i ziAH!%Ag0ht;@}?4BPgpBgs9^L3?9_qjlv8@;sJVqi~+7$0hT=m9OF6NgLW&z}q|mC6pLSndouxdAk)HwjWUUt+NT$pb;xxD)nTSy4Em+BHx%|j;s~=kDHamk*5U13u)9@L{ zVht1+8Y%}mbpFZ2TUMtmoNQ-)LlicWr~YUC2Q_C=Jr>d9(20o%wVYpl%rkN?J29we zhP+bKjy1NsHIDh|-_7zsqcH<~XqOhE-O{s=PRKqw{{?P{LVRE5cWo!>M;Xsr15$Yq zchq7T`}Wq_hzV`Q1TT{J@O9)6IeoxIi+7^_vGOSf*!dE>5&u3vh-KFiZfexVUX%;> zf{EuYjg+}0#(8vi-OUWGAYl{*hkkIukbTESVpfBP&A0maexe=0odO4a5NS)CS}ChD zB4hK>K>Di(LxeO-@OJ_M%vye~Z#M*Vx91Lk855*4q7UhtQoEHJCt;8PuuNe;!g!6T z$OlyXrx-Mzth*FJ*pRutC4j109QVjyH;f*0~$Y3QgF9GG%UEQGA; z)@ixUA6X14@6$HkCLyF?PX{MciubAdufotLKSIqb$r&eS4Z%pT?*#`AUqm|#`X24Z zG5-Hh@h8+czuJEybioswe?Tw75CC3S{}v88%@^b{9aI5rH4;R3>=BJhl>*Y@b zO{vtMKe$V04$wF*{c;)wx@-uhGLDab0q(C9F3))^i>>U z>w8^*+3jk9HmKbq*Rt0qU0(9F%_(V4XPGmo`I9e~;J#^RY-mA{qOP1TJlHtlXo~vz2VW+37#C>VmrA zJyy<|LJjv)*ww~shC)&)FDy>~lRy|MMJbdDPAm60i+JpE;?33@3q#P0xP1W9RMWAr z^^HELCgJnzvoEBAIcMEhu%Ua~TV8u~kpdWnZHY6Q0(v+k&b(UY7oE3LwoftLUZp%{ zg;35_RWWouC7-fKB%Q~>(Mcmg{<|x1$DXs@Ih8e4mUfyq~^aaZ-OHQmO_H8qOGwb z=16>y7T6A}1Y^U)8dx26*5}+@$<@*hdG>V+nDL8VjU%-oHPy~|FEbcX=eqJEFM<}1 z+%}Ty_M{^-$X!Jx#5&`6QqT+`%CpvsTMS@8n4Js@vlT+BKHA7n?XQza8mB^B-@0M~ zgskOpez{~|q*so;ZoYP%CAO(4MFtzxWE{5#O0vwL7K^jC6eO|nYS*K5MP(aB-*1&l zJ>18Fjb>%KI5^;YL`POTo`!?XKQ;WcJ){6`S!Aj)TWwhm1@dCkyXcWfqm0i{N(SHYG zr8t4(;P28%)TNlcj0FnI@9uRFRbDgMDM~dhQ^6)Jkic|N&)V_Mft1#M4kuzyPI1rj zi-&Lo6KO~Gz_Wjuk@n!fQDq|ZcWKhnJgc-pwT9=>qRcO(!E?li=OpC}s_GG_5{ZyB z)8u`j?j-Oe!8FX6O?#3G1#WHa5vKK$yUz-}tM-zYwY7Be9?^?HYI+dIRhm5H-fq4> z^R}=me61)B9g|2fJfP?}%07w5xl8_&(oxFOWaXB+nrCSEM2xX`^Gsc?I_XSF)*5EgX9jT26T2q79n(Ih^k3Q>}D zt;@7Jap&<}LR+n9{>y%aT@pmq0z!wcEQLYrc9z+jWk4x4vKytvb0mPb8T_gs9IM6z zRU^H*nYBiUNwUPc|6*}(4P!W%#sAHzr!v0=K;@bRe_JnAYfkr68Rpf@;=x}&V^Vb! zr|NbrRDb^K%ugv8&3o@T=HQw@7bvT$g1dDP|F>kT_1Oiell0{FJpR&|DbZM$(H`eR zFomym&ZP3hW1ieK2Y4ZZu=2h+p5X!&q(L6-^W|?$f37Qn zfk{HnzI*QBn0!$@$Te%ZuW!mdFU*v&@t2A?<>0S2zVt7@e}$yVm=}E*DF7BT!1t&h z8V#~%klY=7y#4K9Lgrs{DF^XZwuof;JBW`$AKQ=gz*|7b##|;69#{KR49`wuA3Y*{82! zKBeeFUGKoJBGP=X7)!l`F_*C=Q!3ogeDNkfDyk6se}pu@0#a=$!pmAx;V)ig`M(vAVFTXz_9CI7-F5(MQ+gRAJZ}Q{(Xu!xeJ!y zr6C&2c{g;;gm6l+KkZ;px4fC^-)$ay@rDFk>65?;Gh=dVI-J3qCQalgWif0iUJEQE zEJn7suK&XVe2x^*yGl63Sow&2YYwF2|R^F zNHO`s6Cp0w1NYXY1Z0tkc9F1NUvf7SLY#}^Tq}$NNYb3-S?k9BlupK;N^X_uHEze!XT(O)2&?`!Pu*7-yd8S#vqn1?nIl z6yY1kk<8CA(oy-Fdf{#z+8@j+TAOtNG0~dS;Jmh=cbmG@4E^V=oWQmS*HQgrDXo}4 z;=qInH9qu4F-Z)gb3}VBE#@cz9Z4}3u7nCH4WzQ~$JA1h)r-UL1%|IoXqIFi=PL9T z+ji!D;W-TEDa1TfHQnuOLH=BI<|eTctCJt>-@W_$_n{cxX45-OFcOrlO&CD?Du_c{ zTUY7i1@R~#vZ$#7F7xl5B&*9$c>0pDn^3l)ZjF4Gig3oYi(yb&vNea9t7 zuQJ8zOVh0DUsVzv?imgXF~s#0=P~+$%wX6Fidil<$|*~JMupi7&%;uMT9W?Nrp+@? zYC$00oC^dY^Xt8N3p&uT?mO6C`)HT&W|$1WxFJKppIxfjkDOvmJ%#nJ0trWV6~lmxG-ZrZ2!1$H8l_hXW_5 z6@E1|hO!`7)%T`zL6A}UsZvcoq^ z)7ZFxi_t0hU?x-{hgS~lyvU?^cjQGFj?~?JxHCl`>8erMYP;K==BMz{{?mK1HtLmc zE?JIwfx*|0R^@`gtOd__%=9oHzhN+`wWq1yrFElNo2RLMs+yCIy?!4JRy1JZ(?b)0 zF8R3r`&>tbKYu-Y$88M8Td{uJISl5Ll}qmqx>N1E^*Kf`U#-j zE-U^o`7UhkjoSzAT_!DSZBy5TXxR@poM(Vm5eOLW-x~qrVq$Ru;K9+v^xp=k)SE`` z4hA!-tzl0NmqM#RJYg$yd3^;QyrJPf$)Y9Kkz9V~l{ZgV+%sGx@$1V|tV>JRVHV6I z@)4Ofk0RlsE!Powe(SmHt#0o@!frRd>2Sj;U(@T>yN0578m=wCL}V_{P|^tWn@a`8 zvazSkb>Nwk1b}hG=pnMNSP?SUIa6e3E~i?6pTyxMrK4L{xA|7%CEn)u)Cuf>-u?@> z{m}Ny0!}*m4?omQtrVFt+^Pgx5n^jmuC1GQfk(Syl;dFNJ_>Ge%7V1|;NAG4Qz;c> z({HIBIXdaj>x$LD3=Pm~!WL{`L)Q^pbfAulOn`je1-e}ASmA4#_j1kD9a00=ZdaHG z(%?CT*LyB603FY4L)l(47}y)*%%h%3`m!GyYL}qaDAX~|g(Y-1p0%&$(0xb8z#ppT zI@zW;i|u~jEyABQl_g>~(#e89rg;N|+56+9+ceQOmTl6c}-p za;|}H-U1X}*eVdih=;P+?kpt&es}A->X>gGk!wa~1XJyiQ#^II4b?rnE*T0*UM2>7 z=$|T5CDMhH{UZWp2?nB!a3^*5Y?Y7}6+e*o7dj7ok&|ft+>cohZ_{W@1H3KAFAtKq zdnzk%@6DsYOYt|Bo##1XpeeRR=$WCpfOf{G;Y^%0>MW%+nwvyswnW7QY=S z(?#8?;wTg_>mxOe>L#;pfSvepQ>Br-Z(|L}vfDG~&nn z4v0J_TpaYn`;?|df1QTi*aIsrP6Nyx0}`v9Eav88vC$zwc|`(#jz2@m1^Cc^PYRwb zDWW#k|07rWkFEdf?JEDG{GK+kba!_*NQQ4GU5WEU?en@9%$je8C$(JNJE`Gc#xAnmKd1P3c6FzZn?15ag$2qG%H3f{`HJ z4N0bvn)78!$GH&cUihchKIYrFyJ*SOdDy80=nAqo~l%a7&S>@N02aG~qH&sVRFzf4Ro?lLz z7|Db7;r~)U<{|?QilxY2+oqnQ>%kF>-7(6t@_Hjrmhw(J?qUyJDi_|&UYCXRU1WS1bvx<(vlm2l)iE_C-Q!gOd z#SU_C&WApDN}(OC{GvG4l7=GcV5tl*biVQJrN%R-4~2Jpd>wG!^fxAWE~7I*O_QAg zZ0WI3kwFwG+!{OyIOcXRVx)M1Co_iFiAd#S{mLA4QgaUNz2Sw_0*i^OUCSTv5B-za zLdCOz7utJ3narDghMTMll>AE25SwB;wJB=-1+8IYMXI;40lyThT6duL%mF&?4`X|p z$I0Ym7jEOP#_kx0oo&J5LO)*zKvL$XbYm0s$#CHuk)7Y$+`0 zDHyYYP3bRa7uBiY$>jS#!3EF{;&zXprhv;BQb;{=+aeGZ?W+~-m zMQV3^fSpG$|5-Nt=DKca&~_kN&j(6YL-9CN1!$0 z=P^t9W;$@xp~<454%O}@&2-7e;C%$e9WMEB%kicdB96tAT-OVPi1}HrS}$i}%PTlP^RJ9&WA{uAwh{+%#faEdH;+yU|0{e3`$ zNQH~=x@2DkDlB0%3?i``8vS7Fg)}C^jc$`?L$RmWmc6G}4EfG)E8Y#8G;h-1f!t}G zlukLz94&eZ5vesl9bnRAV|B^fthPE*6OE6@!@T9d0)>lX4K#5>9=~yvl<&|C1TqW9 z)`1@UU7nZhF)!BFG3J5AZ#4+OXed0KdHc}XnoE|B;IVP+04B#qDe3d8I0clq#8P0Q=&dFY8g%O2{-vFMXJ}1LjJW%ihS2}wP{1oY{i)(5xNMaui^dM2J z5S5}oVB9?^eDQ;TXl$3K=u;a~ zh;xdc^wp3T00&Ydimv7(OpT_t$%|NGZGDZ3i3K`ZT?*Xn z`_#Q+cX4PSu4WJlVjiA}g$ZIUD|%{tUT!>-R|1-vj3l^mFJ3&Y+`hct>}E0!!+&2_ z8_`*|QRq%sO7x>+qcmc_wHB$m@d9$s-ZR%g?>7477!^0M+pifTw3oknwW8zmml{#B zJqHJb(=Z|!{BA{3Y5ymKM`}oYaq?oQ+o)7~M@Lt@9x)FjHs63Qc7jg&DVNEU$G!D` z1FKd#b)MC~emJ?^o5o4<8za8EJ`z@>r1rMkO`$KUQn96v&7$5R37tp+^AWOWD6Kd) z0~Xz0??Z%;de4WOO!gmi5yVUJu&eYkx49DzSWAOxw4-SZVv>OJV zl9kl@+mCb7?da2@99)-L~*SHeynI7IpbS4w2qa}odM_Y=% zDo4mqgME?M`**0zwa?D(<%8ZmFvpxmy0+WK3GmhZDF@Q*+d@V1x!}79!eW*bG=thx z&oV;PBN?|ar~9iM?&`-Rbf@P3iKDIB+q(i}E39w+721!8TGW?L9H=p*=lDx0%#0kt z$J4k;ez)p|pq`8{%FTQq1f*Gilg2gz&m~7Fjo@C&J&o%=J}Sbo3Do6GDHAd-fgfxp zaU*Zy22s5jzOS$Gx|0jWjr%F;aqsYFgEuXl7IpRfX`O_96bdIkQn|tU8t<>^&#YH1 z#T>JgI>+x;P>H1hNr_lf$K})e0qHD={gUsGF*OqHA0S0ue3{^(K#omXNQQ`}@f$Ce zR)eqSa8vheETl#$JBa$s98glQ96ntNA%XcuA^iSDMtkXGQ)@N7Q6g~Zj^|oclfey= z(QNE`00>)Q71?}7<>P+O7V@cel0~rcSQ^?7IhGnIT0WB?p{%9ho&(P%1HasA6viFv zNSAK^Hb19eMh*5L-9)qmm;LpNX1egSEjbHC#&j2d^_Jxh85M+QbBu5b5M|9iTGAG; zRBEtVr}DhQ{ATU)6#$cT`U0}~CGU3&_Wc_LlPb&a&}yYj0bR}sP#0uzxegM|ouJ#C z7|`zhb{O_i8uXdRM!eG@NXPOc>-t@vhlD&Nn!B`iy*dHm8% zE3WN>Yec6|=bK`{dlHOidLYr66729dSt;_~jYB4sG>L9)nmWE~CPX zf#V8n{rvKRf~n?22)0EM=6Cn&S6{<&Y;l|zWNd@AijtZ$1A+4>#o$LNy-mf9qxOW`#mJCjQ?*B6z`o?J<(}Uy_RY^VXRxqMZ0vzh9l6~3;*9DTs$gJSs|0-YR)=PE(TEWgvEXZP1)4QLgY ze15#HfLkrqBp}YLzkZE=CtIUMob3@Xr+eiVvFJ*E@hMfHA?AEdHm-!W@z@1uXl}Va zo;*vojih?~Y!l?3&pl>~$nD>16#HfshvaS%_;=|7R|iRYi)lrSL8!J;@6m6%MeU^U ztzDS_HdH$arQM!~jAVMZTQw4hJF49u=Z`BAUppj#Exw4YD6wi0&(;SEiVxfHxYTL1 zJZDB8MPjb>MBgM(^YX1Ul^SfvL!S0L)qh~IUE?3Bk5_3yH|Ue<%JV{lp@A;wBuHQn zE}Kzi5}lB5U`D%T*&I&y?Ew+)OcD~gShE5qHMwfMW=x-uR>^Vo-N8o~(dT}!NN4@i z+S0O|uq+Q#R4aZy`^lpIPeV%hJnP*L&%Rw+FI7Sy7*8iAKm=B1+?7exS^P$0D4S>>jLZ$HEnP1={^#mTDnt<*)i#pZ$gX^^;o`<3Mje4skTZ+c@NS|-?y&n3< zgir0OFAdhFHE2`Q(YRd)sdS4u#$AR4hDJYg_xZ^84@|du{}XBjIR7?;#0|^vPVZ>F zo?E%R>6tMH@A_yZzaf48FIx5!nEjO||8A#RPyPJ@O zb6RPI8pVDs;_*6E!$om_87>k3<6uCaewX%(A#S_*TvydAk9Vo5tE%@8uOJNien!M(JursoY*M$CHoXZMKMb&0U~%qv3?=z*#2yHv^#|{r&zAFW;yn zuS7$^sYVZ`aE{|FTZsA$)jnv&alH4VS_=2H$!71Z_Q+&bpFKYL9XP@->~xln!J4*u zmcC}~a7;!;kte7s;;r$$JCS-%LiV$)B{V}$2Rpz_d;K(Vo&>Apo_gam9DkyNEyyTf z32A>IdPKM7qNZMeM1Fy{(MhA&P0T-s9eri6-?iD>Is@&%fb1)D7q;@_FwO^ZdzHy5e`6#@jdexofa;MyCHtn&4n-0-sSF zMmi$|T(Mh(^_NI!x!1y5#p(>>D1Li2R}MlAn8?kNxKSG({!cDSP2hh_))xHc$=@ALQS<+e7xe{Y@1b`>c963S{D~c8^F`I{5F#(-99ltr&dc$ zr2U5vEtH?gpRKy$kvFr(iXS?zw_gr0ky0w8oqTrGdhJ1LTLE| zQI6D;X5%w{Bm?(7IKlvdf@Wss(?6p4#T=-Kmm^rlWx)K0!n^Rrw+S$$-Z1`(?H;oO z{%&5QS6f^!nDd@mj@_I_1*6wzoaLK0m-tAE9a7Qx^)?+cngL&x-Ma7z#*+CE`-*BwO^Tamo^FX=LrM@bOc^z4R)XR|yk=URP z^NT>|tG0gwlYIfWup0y@LtbFp&i}5`0{=*YBZ9g5gX}oA|dn%|{+n zSfG^X2o3%BDeW`lNuu40gB}xM_TPHAwaRPm z0k-5L3z z-`x);$rx1BZX7*h2+&H&W2#E*QS1B1WlCFRwA5)V`EwnANEO!0$LX)c2M$lTrO)bb>?#n z0pH#!R(q&%n2VyE6g9 zw?r15PFbVPUYJfP#M6(dMm83oPENUu`^@{-qdAZQ$RhmUQR%PjI%rXtPo5`{IwjQQ z9;Ydh(ez&s-U#&^3%Xdd52nf@0lkSmmeOqre>*QE`*+POB-N{jax^Aaa>h^s15FsFGI+(dP`15T(ZUw!4 zCo`&n-&)EB*!QneY8`i6kJ4w6fHJWhuanRl6H2Z7{myLuVeu<~6#3EG;cS{3c+*9l?Wu%izqk`Rxdx7)$a2qy#f^LB=t|j(N+f(^! zrO5Spygk6xeGcO|i>_VyeYGL(*y&}ka;)JL+_Q3Q&@!`Ptm8D$^uq4NR=;SLwZJk_ zDmtZH^`)UE0VX^sQob?l`^TtsCuuDJV?_9OE9IqJuTBF{SX?%o2Hhpd#yOOkxZLp zi4#$^d$9%&nQ=}h!=`*X<<#Yx<=(@kw%aO|h*$a2UeLhve3A3zJBTrT^L!X48y7#g zxllG=m{!2Jf4=bcH=#qKP{>TLXl@nlz7%u+N^9K29SrmLl7gtw?`wMWsah#dTYhA) zD+3iiTczF{uqI@V8gGhc`r14I{H5tpJ|e|E@1uy z1#FMMDy<$|Rx3UZ#B_W&STYAu_^{i^rl}k$&!4y4^PFcQjrJF!aM8bkX5Oc}Ya$)b zmDtYQdMe8ViGx39W(v_~&{jJy-1}Sh(z{tCwja{%Fg5;f(EOrgET(b8Zo7qrIZ01O zW#;>uEkm|eN^5&*2Akpwz`_LSBuEfZ6vE4VXR0ildsKNId58KE0u>=Cz7{fRN}u$k z65&l`DfY*~;o8>M)-(re@%8o3hcmeM?o2gGbw~MuNZa1viW3}lguD3}?gSsaWAD_uDntnLq%S_iF06Ghz94-}DpcBiO!M?)Q$gJ0#|xJ_?=A ze7a)3@t1Yv^xn*I;K=FSJsef$ieH~#F^c$poNpWwx9834pcA2J?u5rhOk~BhNgKGU zvcKK~1(LF^KXnzoW>$|@C8YRDidp~%Hr`phL4m=Wv;oObeB$1n*acdJg+w%corQbF z6bj_w{KRhf``?HB5vk~h*g$%SUhC4Uo>kG8`x%i@@725p=DFOC=>-a-Ya@~i*ts;B z9gGg${VbO|vmVqbirf$|)}c*be4{yy@A6WC;!F4$|X^ z^usf;C9`jAD6-Vm-g=94)2#^APbV_(9Vri*+hb=_#ckwz*GG3O5=h5)61EiJVIq;8 z(XvRqIS?a6q^%t16pRum+?#pAgbb^*XfSyK7U8|nbzkc3l=9*@4pZqE3J_WXV8!#Q zp~`FP&T`G=eYac*?o6Xb&*n;EhH|D4z1ZWWNL~mp`Gt4t4@Dow1HL5kbBm&_f9+Q6 zRIl{aro9r-*B12_^lxdadFu(@bVM=NSzHx83EW=Lr{61Hukzu-?gizgjI@X?bl8_C zvkOool+jmcH7(5*1BfYKh4zdKF+FTNQA#LS5ydl<-tULAk#pHUMO*-A*pti6@gBVI zGXA)D^d$yOKcb$AX8K?grSyP{o|G=)dk^KepFjKHkKo@t%-3kO_mtSvA*1Mr+px5ljou(d z&BdGgy{Nu_>`N0YY^Cz>5ze<4&&waA2->>~-J2=lR-$7r`BYiob7fUK$yHf+@o~eq zkNuZ^-DE~YL{WZs0;KlLFTMA@{ox}2;)3l^}b#2oy|~v6ESVw>4}yWj+AmU zQ{l|dEm8zODq}D?zrOoi6rBV|EU_*vh!i;LP)927Nrh_RJ@_!{Y%-Q}LADemlKR_` zCaI#SKfkpVgAq4hka{13*`FUNyi5N@%hi=af?iFFnmrjE&9WediAP)3 z+g#n=?i9^6fH`U%DxTn4IJGq74l9az0^@*+H$Dxpz&|ytAt4J`RNNaj`+3C3pBY2w zT|B-VjtiCjwifLT=u9n-Nwa_1n21N?6&MDS#+He_E*!!z9&WQDnUgAGIlP{Lt7-I?D`{;VWKn~t+sxHq82x%M zRVP_O#a?7e=Zr9VZ=)(PI$wb~)O&kCGa@Na^6b)Uco?2oP~x|C=&bXJn!<*SNs>Ja zEw_}z;=64yV(2_x9`xC`;>X+;TPkooU8n}{$P;TqogL}E#o zv}YYEyXi9Ums$Cc8DRvua1Wiaz?BWa!~vYljGpWh<$8?TV!pIDekX-@?!Wavn)LTS z*#PGANK4WC@GE!t5|Aydd7un7Un^TYPSnQZp(H(J|86Ar9iIT1d8xf8!VR<4YIm3& zv>43>+e?{YaY|~7H&y&h_{sjYtfP(N-*jw@{Ed+PgJ6J*Xpd9<`jK+jkbFVIXShdm z;^C3pg%cr~-vp_BJgM{5{3Z@6U4Nf_JrF_l-QdPr=~yJusd?h;8soBAP7`v-D6JyBE^{9C+r|_|%YL^GYjEHKpbL&LIqT2UhUhuw-?~#cS z8OLf9IF|*&H$}yG>#FQ_YvAUe3tnz7S|^~5HYYZm+W>x-=E>urSav(`%NX6@BHTMm zaCVJmEFP_Fi?GQv;EJeel0icC z>wexXVMe)puu;{ck&F`!-)BocA?fwHa};S(GAr&F-3Wk9UfIr?{0vn>CC1HZ?cT4f zFcy?GVDWg$XgWbW9^33i*W(}KM7mXRE4(-ZrA`Y;25G)tWs&^Do{y03*RQxnrk$pI z*8;6gun$0Mfnf+5gp{wJ&31|?uHlZ5g6R3B29dxx3;I%g-{#i{mO{%nSHuxNF!_!d(R#F66=plzxfkmOc8Rm)MgptwMLEAxkOaFXYDYBxL%7MTCQiRFRuc z_}Q|(v{&!$F#JGpSCOgXEFR4O zBi<|yH2XN}6z2?%T)!~3@D}GYIx8&=@C}#0$Z_X=UmqK;^Ne2BcHJ<9~Rj_k$; zfbIJJ8O4&YJpQq!J#N1Clo3R0dyI|YxfNgFc{N>evFX;Gm&Mj!HBOQeqgnl#r5nE` zM=|)5A>~)jSV3Yib&s0l7WMSvt0D$ljaPV=oX~x%FOgn?SN2`RPnEYUCjyt~>&y** ziBr>7uhiFbVv7})mJ}%ai7agR?%V2lLREPD;M18e!l-YzPR^*PSkXluc_dv-X6Kjt zeNmpT?`EMGwkFXLP9AWJ658QW8d-s1qFRZ5{h)5z^|+!Jr{^F7PV+wIi?^~Hk=2*W zpiyG5#ee>kpLWR?R6Tm5ya1nVzdU?`MH5&UYWIn*lf$=*-y~`+%Pieo36<y zSSi<^$_CH`q}wXq$q#{oBsCeMO7RQ@(xUS!iq9L4V%{F;k4W-eNjX1_A?RkRf48bO zN{)TdIi95`M=aVX_IgWk07Kqn+Z-O_cJ)Bmn<$bAI@ao>)Sfci5YWW}v-Y#>kD-2# zKeQIy6GgSXHLHe*kNCm6gw`H6`Wznpd82+y1g`i^i^LsjyE#!+(0q>&oQ87fN;Ba| zc95u}T;C|$7nJ-6-zh0tYYqD|bt+T789H+6v8>!m4g2DL1n!oUIf&f3-QzDOO*r!` zd^rnOVs4?zUp)sGU-DaE)Y)yFy8X`-7q0t${4YS#qz;r!j2&INmKqvG?C({Tu$ZIcxQr#mRjnxV%|y z9wWs0?t0+(P<&AdrJqCi$!)ZzfJ2w@Pf?Enf~v{$X{K8y(Ax~gnkbU^AQ=^YzWZr$ zWFUw9Tq;;oB|0hhCgV70RIp!bNfHrb#QdjUcI;Be&!ouv$Mg<>>CgBZ`5N&@%bJ~i z&dHDfj0@14TAjLE(c#}k92%orbgYC#KRQ%39YV;h+IpG>k^}Z#U{n}0b0oG}Ar1j1WX`IR5K-;BG ziIcms^QX7WDYKKWPhy|2EG#ft)t^pRGEbX&ur2kJ2EnZ#$^_Vb{_$f`_&tamhknFc z3$v%q&bsb+uSH^$gA-)sKbM*&K7S>oW2OAdYsL7D*e>T&ON8Uq6~yEia^Nj{>(z&e zfXJ4ns=mBD6@=@xU`}T4Mq!mAhRCZAeyKeyYsb8k(Yc?hdry$n-8Ifx8J`T z_4}^H_Wey;TdHV%>dTbCbIZ|VmN_gEvhlKhRYT?=sx&J2tE4)1-S>2!tn~3{kL&#Q zt94Ihid{`DPcPo0ur-=Wh>}(zp1B_svhan`3a|b55%m4WZ+llA>UYKs>eyU7cu2O0D&$nHVTWCA}OewrpD%I_vHJ{4#K-{Ch zZ&B(3^tj0E{rZtDbN51=pN5KC#LJ8XgqCY!mx}@! zbQl=Gr^@0*5FgHju0E4dVX;zo8MV!r{q$;hV<)c@SmCII>5lU@TD9iYXU34a0QE9E zWW;E=ECRI{!*6eori1Lk{OVKaI$o_6T)h@9`etFf;3ibYuDBK{Nq@>s{A2X5-A6}J zFSC^>@On0Ps|^bpRW$us4ob-t_RHWQspVy^U!E^xwpOt@#i~9W@&uyMq(&o6g;EBc zppT%4K1^0ns}(y%B-adI`Y67n>-nMIJSa`l2ZOb1D!ns`1zz0o%w*^KgyQx;^)u$n z?XWT9fbuBF)r^+aNQBF6|CCn*OGOZ)tp5f=chkfe+tJ##<5{ju#yM;uaE3@7t@V*2|-WwBzZ& zRA!*Yp+51W$V`YznFrm|7spi2$G1Cgyrt~zY*Xa`{o_nv6~4z2rk;y)+k67IcVE_QI*H` z47d^mif{l|1uu@*j2}*>`o*9Dyq1^G`iOvpe8b^+XTn1je_H7qy;RG0rHcW~LZ0{@ z=*&unm+Pk)%GdbhWB#&yBce}2$^eXeTSA!<6mxqHj(%r3Ml#MAkBdyrUdBbl6$f;c zO0>3D6-x16Pb>fa^QSCVtjb9t!`n?VOu~{zXVLfhjRdC?gJb1$|W=OyD4>e{ua{xwtz$bv`b0J4I1~Z-tM}p2P6ih|12!W0etzv z=IPCo_L@ueH^id(9#teOMIIQOqj3?cwUvx!}-1ro@)<0^O^p7LUzNU$%Q58AA z+{xkgE^d^5(t1(An*|wzhaB9EUO5BZi4W^0%N^Kin_>p5B=VL1_ChXuMc0Ekx#XyW{K@vUL)Ba*I268Rwev zR?4hnEYT*iv#h=~x{1MWrt8th?;ye$78GBsk(|i{6aJuSjh*j_3?uLZDG;p82}*7{0FR(%yONICBe+lZbJp69<}1 z60bfndGcb?vtdXTBY01bI*ACED0_{)5@V={WTGAv0>IyAT~q8n924FM_Et}#P$5OF zK5kL;bE8_m<}2SMO?}qPyaUP}PAA(`G!WaRYt5xARrURM4g_Ma@^M1JJ!+ItY!@9Q z>tPFZ=qvZqFa*HX^3t!fti%}A<7OX%0)GoRgIgCaCBTO@Gq6U)yGQY8r4J15abI@u z?pX&3BdL?Fm_@aL>t&VUUhiG0j$}JudgME4HhuOieq!CFPLf8Mlh?0CBO|%XufLsI zFR>uX1c*y{GO>RJGs|4zu|hWWv}VpSa?zLJTJJjrM=@dWki>wd8n^{eOnQL1pzP?Z%xROD0&PvIgErznd;<;fXH*X>*swt2Id0zX?1}R+OZ0Bzm6(+*C{3bo`|L=DkZ$C-6 zRpFtVG(sHkJ_=?I!!VVKLWcPu(^GKkUx|prGcFGsd)Jlc9=i|9>0{xxk8WZ=dVjWk zZY~(WqeQ`8*^(VNm+a8lSHoRqz7I%#J1851ULHvIA4oSpBII3I?X3^>* z{o2^Cj7S*dEGW@Ea(H=Wbjbl_^_O2eT%fI^t(H(#$Px6>wwzY`J@yJo`Pb&X*RYIA zR`gZ$o2G|YyZHm_jx!P7O`iSsd)T{$7K0NVH~Zj8$YP}n4*0bU=lP{@{8D;B6wOTP zl<3b!Rul`Q8}-4?;lnscF13zN@B0DsN+ctL|AYB0#M?*WLcLN~cT!f1&A%AnHGdme z;sX`T8K#*|0#w5TnBzV6vbV2Hw7@(6TTIwy@>geJUMOGKt#qJvl0;4edhJGC2RwN* zH4yMQoqEJO*<}fHOqSc*i}U|+eJp%#7ezG|+e*%Hqd$BqgyBG!QTILu62 zEpi?v7Vi|Y5-K$kOhDM=A7bgOfRB=`Hx1K$Ck29FYCrpGNvlRGfAPlKQk#dKBS?s^ zV5T2W=KlVkyQP3J+g}hpyCBrbA~P=ts!+%AzET8|ylFqo#wmD!QdlXnZ6}blIV(^= zRU=GV9U<$ut;^ADw!Y`?D(8Q#@E+iu_z?f12v}r++WT|iN5Yu)ZjY@*s|7@6|9MS@ z-DMYrIp+X5X^NSwsjr&t3hfDK4oJ68-@iR^hg*wSkD!sOai!R`cEm^AYwwRCcWcA3 zMfF5&_!X4sbVcU_jI^#PoD?gGwr33=Zc@OZ5j1@gEhJ8aBtQ=A`t}^4g8LcL`Hds; zHBKTsr5-A=qKuqRNtSZpl^vmBFe0U7;jgA!3kg_DFB$y;T(5~70ra-V!u)_=qEK9$ zG#X#JEcy!Rx9+-1Ta6La1#p-|z#=7TFC4NJtkLDbiCTa^C@67XJG8eU{7(!U8wv|Q zXI|1G_3%`_^EIpnAohvY>5`7NwlB<}?|o03pg-m=YfYGq&YKJH{(r8JCQm~Abg8`wy_06$;0iE5!=2xs{P?}3 z+meKfG~G8EDC{Kvd&PBz+KDQnTbBnL(kjf*4gtbH3Q{;mOV|9G2N0x@(3pC5r@@IEv$G&l3 z4P!jqS-xyBLHadbBtdA|tT`k>K~y%8voF${Q-T+x}cBvl@tG zv#v-vW~;J4#b3qOQnz9Ri6txAA~GjE$A)?SlN*8Ri;Nc5Y^2hZCP6K%(eTi&J$jQi z>n)bQ|3U?;FIw#;AMy<5anP#{T6#DMkLkT)9q~9o%Wa0JDhbf+1S{K5bJ$oX^oH@9 zXrwXmzthyXHvfk4RzGW|(*H@IdwcV#Cs&^20{&zCQ_T&!#89yjqMO9MX`_WlO$Z*W zr90cFPoAD$e{i@`MjXLIovPb;``AL1Kn}p_#sJFG*|+}_#V=s7^K?99m!|F}AveFl zf)}Kl9U$H2|0yGJc8e8-y zBxoPyOB+Ipoh7hcTr%4j>8{2k#P&{H_2fj>#J&91pp|jf}H;+ zQ#)A4OHDmiE$W&J`7U*JydVlPLz?U6qst2*kugv)=Pod!9<%h&;DFGhfxHX9j;1>3m58Q;sVC0nfZHYsqs7w_iX{K7WqCGUFlYt^?Flj_a(FY$p-jk= zu4hY=U5b#TlS{b?<(Wx1?MU9zHSYm?BeT_WbdYKn6J65S_(I2!XLCLSxM2$xIpMK_ zrV2=LZc|abGb(!s_g@KRcI)-uCn6t+!g0Hb&N$$ozK)^xM=huL{{z>wU$y`M literal 0 HcmV?d00001 diff --git a/resources/assets/images/engine/logo.svg b/resources/assets/images/engine/logo.svg new file mode 100644 index 0000000..3f52d65 --- /dev/null +++ b/resources/assets/images/engine/logo.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/favicon/android-chrome-192x192.png b/resources/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..e84712f4fe4cb49bc744f731e7bd0bacecc4d0f2 GIT binary patch literal 6693 zcmZ`;Ra6w<)*TqSdnAMb6i~WFP(VN$2BajEMtUfLp&JCGK|)$V=|;LGq-*GqE@|oS zdf)#0@SnBM*=wJ*_Bt>7?L;8dC9NtA zfmFm0-k4zj({M8dO;rd4#Rh@+2SXrN|5pB65QrNe1hQicfjs>LfxwU%4H^;<2*w3M zMN1C+tJ_;}c?nKVz}_BMUk8heU}gqPPJ+=F@JXl=?J3HX$2%MjT zn;UR_4VIU|;2@~42l@FRJ{|-G0S^!0-~gcL#p{1ciklDhjx{0SgOYU;y;=!0Xq*!~_HcfTkw! z=MUK00=c8>Vgd{dfcAD!T@Ai`0f~vg#RY_gftD7~+6sb$fw3`gb_S7=psNei)`FE4P*nv| zQh>KNaB>3E)1bQ>WM_kS??7cGK%qch9@yUp5fQ-L92_5m_wPYX4e09wo137#9AsvK zPoF?h5ty0+IXM7{1SKWF#s*kgg49%SdJ1f9L1!mOP6oe!gSk2I@grzx0BdVtdmC(Q z0C#uL(E)mU!NCErw+A0SfbekO=m^r%Kwuz^1lqM(Wbgr zR=PM-_e-&QU~}ZZDJD((C0<(%wpQ&0l|CX zGmek4#M=?q@SP&gNF@sOU=#4-vZ{bNS$PhI46C?6w@_C%%^~%6zKH=Y=RDmfFda)0 z^GF)W+%l>njIB;<EBELGqk0joOxen z%#cHHNt&>4qIIe3N{itUlaMBF|B?m*P|A_?G4!^0cvhdy%qd{hbzx9isGK@zby?o# zJ^QJ#^;f&-ltFe%LzgX6?wSO|54zsaoP1`XyEQl&c%L|i6NRG_rV`15 zU7UPP75CD8ZCs&H(kIomOms-&HEd9fl9wa!!DZfsWZ$zztMyn6oA(_2IYcwr>z2p! zsEF(Pk6pavt(D^cAW%75_keBg$lS)l75&Y3EdIOu3(B^?Pf-;G<8H?_arz-2bmuPK z7G+gPP5nhp_YAd9fGLBEfdrY_2uMFXoqOPwl%rvTQ zKbkIbm5CMf;wFYCd^^l1eIAgdOxiTsxC;H6B^TxQ;H*@sMO4lWK`au&ro^uv!e(;x z_`G9J2+~fK&UZ^>dd~fkx52V?GrIwnuC+lfp}z7dfwHu9^p{#t=5yn-x!`FX&2_gW zHrmL>QoSz0Gb;MmoW=VI%FB4l!3UHVXAH{rZr^w%#NukGN?vT5^O7ZfT}K73V$n+_ z>9rlr@;QFDal$GNL@tB*~-czHVPvuQa!Ea6N)b_fsuzcvT7P`I5@hQ6& z+7j67U&aV7d&M)fk+#ck@%3?5?wg`ZIv+fRwgytJ=tgfIB(uzSKGW0WIWVMI5x>Fj z2y`1_d~=LMAmdXq&)L#CbALf3Rixtk23xwa;Lhs&3;v00^lkOYj$Y{3f@BDR%xGsm zmoxE}?xmNadK!$K@BOHGdr60bGcmgKog{DSu|LQ?UG-wJBMG-zQ1=)o-+OvG$ar>2 z_)?POl}Q_s#3t!q3qiykR7*A! z^S6ag2Y=+e8e#+&N^bc6G>lvj@m?$*w8_=R`h-TX|`d4Aw@-KB2e6ZAmQgjRsvxH(0l&QYR>Xx5zLExB!uM=J!R?V zym!@fbYaoUY{>R-dUX)VsDND-iXp4NAJK{{b%QmB{bU%^w?^Z9#{JLD{J@_JsX$v$2O7Cxiq++gZ3akWqZR-JjvKx+Z>&!)!G2wH+@Z8nF~2!uZdL zJ~#T)lrv)$;-7C*(7SYC-gSz3RY@9OQ2KBni!mbMMA$QtGr7(qDw$qm4d4Y`Gby;W}OQ~1$8xZ4h!ocj zTnnOd*%P7_&}$=p{H^7U%;Pmo1O0EGnr?zRIC;mU;*~bptem!T`>3T+nqoFI9XJai zF=PyUZVEQHA+F2iCp7P_UF`2}bChdewtt;GXZBBu1haEpz3p8zco8N^Yw)quRbdnN+jkm?0 z?WYj=`+FD7y$CWnmimo?@WWA>Ya;%`bH$CD4hYwRT3Jr9GJ9E(Z>TA=-N7-2>7^i5 zo$eM_y0;RZm&NPJ;biL!r+(41JA3w(Gi>H>4F}*JxGokEhUsk%a}P6>|DdN%cYC2E zCdGDMPj07DJK7nwS)7ZZcr{?@(b5p^i9@3(1j%XRhKI=8 zmB0^y<%tGw_eZ@N>+0$GCNKwaAYT<4IRsn!imuAE)=J7Zg??2ZaN2xc6~P6kxzyck z^P(f5btBPpo!4eYq4$0Mj4=iBsxsNz+1(ff;2;v4{1(IRR=Hl5=98H#QWt7{PvtTX ze(-q-f#a657R0w;HEME1X38bEmG}y|SweEgs7pud2`-$}Ud8*7 zl`XL=4&XZ})nVK+;X3giSBRZqB;R*V%ti>v)7vDA( zl(oMFa8!{(jBd_OLqya${-mvlX3|O>*huS7rjXdYx>Mnde%R}2kD}5r(mgWWFd?-r zPJFhfpdyyV5_Ugim~W*5VJ`eD)Q%=~$);e7%gUwSZi?5QVpLoCiprCU|M+=4IzB}M zc47~kZlS={al3N<`hrhb_MUoUQC|`UA-QK-e6nVYqW1#o9i?c6ZI<2Y6Av>M?uVJL zZdE@gPfa;3>U0J+QwfXDyfdXV<7@vowpW~x$S!unARSS%n=73O4_%(^YEghoc*PO* zugKviv9w2&SZh#(8q%Bg#EvW_X29^@+aFi22}|fK!01@CDCP^L7fTapHI4lFFbAIv z-b>SM6YMe8zi&}15`e{gd|2=zpNo`8751pknC~I8$zVX@XonOj#I9cmZ4#hyG$fZ_ z_PTSAsjc){bOZ{S##}U!*4gHS)$)*v9p;yxg_X1yNx>>E0xgBeN2|#NNcs)uTZzeE zqp#evr~XP^eI-9-<&tV#XX8KKB4{)4JCr)+eD@yj0c1r+4^Baz(36x$OfO>``-{hj zOa7MN1E%Hd5{sO~ih!eIc$_v`@vm?>ltbTa-ig>aW4{4qO1Xg3F0?LTGllgYveK(w z!(LvaQ0}Z|WLYZ0+@BJ->K}gF_PvPRn;_N!8D75eqWmsofE~+gtA%T#Ddc^3K-AHw zGzMNnBy&J@=Q?YKym1RlI)QvTW@tm8;zJbnxM+SvH~lax5#B1U`Od#><@> zFZ9I9vZzqJX@9dPL&eb(AzBiU$D9;O&I+e^H8mp*$>OVNQ@`d7I5Z~+^k zivKRJ8sX0PCwN%Lft5X;LO?_~{XoLk2OY@!Sl$G89*fDsqT!4-ALHEdVjzb_%p>GB z&7Bof{3-R#D+WDCMEaXqO}sE;s|(#&j1%7?Gb<=H!bkMM>rk25)B1EqktVDG_;X$9 zJS~Y+rn{=;HwK}u%BGc0*Vvrd_rw z*#(W?C<|8&T@kk-E$cdyx)&kzZ4|9|=ttybhEEn-(9dfBt=L)!w5g}2xkq9#I##

      OfT8f>{(aYwNAV(>3Xd6vJ7^;Ca=wQYB1wwkld3xUFny z&5$1+78|sCc?$_qDJgqzxJ-YeT!{n=9-)hYSY!&Ea&&M`f5<_o#b@ z>;Jxzkd!bq*ttkk`$ka+N++45yi=?Em-yF%T*nr4>($m+GvHO&2g3Gw1xfbz$X2Ne zO}M6?3?Dw`bwka4zfjeN`h+!KO4qBX3)rgnua}1m>>aF>%8q{;e!y1dn@cYk6jJQ~ zjbwo8{M=A;bbXFj%3MP2r%78CL`bze%i0{)T27$rI5DwoPPZa@<1#9~D-mRic3UCm z=yZB0TT(otY*CsdR#0!4?}=e>%U*J5p!?^G1g-@;PqNh)ym&TU>n1e)B+Cz0tUd|5DRrTP^CwfMU;0l=fk>8t-uE_(58PQL-s^JI zolGHlXY)zsBaZ_Z!0*zO$nEe|4zY?CszjoZJSnA;Bq#5vdrKaFN7qHCUlmTfA_NZ5 zyErgUDeW4y>@M~nnTjw?(HKd$MpyhWQQ6@Zk=6u#-4%P4@7m)$zJl1f;~q2sw91_8@k{bMUKhdPmC3jwL-)ifcIhylJM20M~Az|=Y#a!Ay{&!7AsRsJU4G3Pe{^FfU1@f!4QBzIx zeFit7i(xg;9Nqtg;Af-jRD~O=MuCx=?7>+JPY+B$EzWW0NmdSx8Je_cJVLj7Ovnx8 ze0=EqLH4(+zz0;TOdCQeE+QT|`xlonF~^;-AQf}V0hV&h8XiI1;s4!ZOrQF{DWoPwg$UBC76tooQn z>#8`qseh|*uhQqTyWn{H)C*hqOA{q7t&GF1DM^0(&GyOCjCp^H=f(pLpX<&ldHx8Z zRrHhbtaFS@FNDsw%F><~x3kwX674f(RC(#XeEszocTtk8QniD=UE&+EG^%sWh=Oi* z{HSjp#PcFWEg8Me74;31lnWXI;nk5<@h*j;=)?GG=}8>GUr#ZOPCyT`@KwaRQi zS>tZ-=RaeHxj3EX$$Z~;vD}t}lD)nl{=-l{{kkX+`krrTXYN2qo;W#!ua@$Mt)%Yj0>p5{odrnmt%g$H>i7nl~T_9y1UOZ@Zp`Op?UQE$^Wodf# z`Z95>`FG0WdR@%R2BcxhGu(y`_^C|-7<=i7!LyHS8)g)%l_*b~Z#X@9u+@5dw~w_q z3&n!WZ8!`s-ipytN!MK1dZz^6KTccg#BSjmVcL8GwYJ`g@ylyD4%hiCwmp$Qd&SFO zjp~C3uhzZh3_CVI5rbCieOLQlBIrhfb1UC__ZZ2qM5IAjr+n&n>{O z#V_TezYW3YELx3={B{|!I3$$kGBbWvJ*u9_z9aHO-NrL~;} z+|?6l0k=lFnn55Q8NZK-@SJowIQrEGekrbNLZGaKJZ6NHtdz$=a5UQ+gaG}Y=`W@k`Om;uh{=nAK(%qmZ$_~H z`4lEHD)JzZ7aa%$2?l{){yTykfk3WoAkc{+2*jTT0^vJkwJ8gNK;S2(@2XP3f9vA| zczXk0UxDXm;QbxAzXwiFf$eQzWd->A7Z@K01_y!8PN2CNsILdAs(`XGpr{DQ%L8(9 zfQ$?vEe%Ld2g=KVfdOD{4*2&E*x3PYZh*5h;NSpQTLUI1fsPKKq5{au0^;I;pdi4@ z3vhJ>92|h3KLHC1z{CVFFaUIP08LFmOAE-(2G-Ys{e9r_5~!>MA|e2HcfisT(ANjF zwE-(Dz{3NWm;kP>fTJUzr3LWx1nlepQ&S*6A9#8KHaCHh5g;=Y2nYbItpPnfz}y`0 z^#xK>f!bPNco^8&0PgO9^K)Q%8E9<uX?X3E15QLPLR*6Trp>@bLk{!-23cATbdrDFOQW09#vNb`~ft1%`%z zni}BOFQBUnn3)0W?SZ5uU~doj{Tmn?17c$VV`CsH3i$H}XlnzGkAaX7AUGHZ376#OAFE*c>-bpP~!xRQR9l@wF;_;;>nA%QK2PiGbciBuKy!k4Y9 zkW7L=C_cl$NTO2p70LaUjD$c`l`)iXlyIbQ#y2}wlqS-%<*75}`veU(Ufbl%A12Z{ zN)$yw;Q#Lx&=N0W#-6^0atp}N8c&CcddSe1QC(>&IgDImf09rP36Ylk`t_?+ZY(>X zDCsd#HuLL~vBcECApGY-oNaiKK*^l=w4|)WjFg;&bXV?I-B^{PVn@UI&t_AtXZ2d? zgol4sez5G((Txn|2=*FL! zUwqJP`NRhtxZg{6<)GJ~9ckd|Am4>rg^h`=x`CiaPQeg^eTP$XS*LP~)IoGO` z=(Lm5kM&lH?h3Drj*k6xh_x|VjjM%8V?Oy;W5Iwd4L!}xUfH!zN$S^%AIXiX4bsKg zS!jIN^Vvzfh4C?*I^ACi5*Q<~epSIwhJMeDjLxR5*kMW1Fg>jnFib{yj$6V-Vhum8jvb7#%EC}qyUO~VRtslfx`a7f{ z?pr%iKvP@rK%{Q4Pv9Sm&g-rR4j~SM(cn5TZzZz_CX*Wmq#(gQ$_4I(sJ|2 zqrB|(tz|g*5x)`9B(G9T>pRu;#~#_v1jIojVQ+7~DvYE~28Vf>SCE&&J!GTee6@Rs znQF|U5~Pg1+@i{}20X~oJ`J|>;Dw&1L_%|Y4U$8qHE7G!GXG^Z+~+J?Izx$*z1Gl} znYK|~KlP$TTlf3PzOkYtg}JCWWm&} zo8&9T&O4d3G*$z`W8{L(xHnd%c0`U;3Me! zBm72)EpO;`%&gcW*$U!(>Wsl%MXPqUq*jTr`1X4!neMSTI%908;9DRxDL=Y4Yw)TP zoQtAgd>=d0$=|7K75UXnw+ZmMF85uFEjy!ho{JIPr=NAqE10qr=L$c!AB}S5s5gvQ zwDA``ov+gRqGTT)b2_|#wt7h&?aUV$gU9V?I69^ zjNT_aZCnGJY+Lp+N}9Oo7G`G3FXE#r4M>Wlwu>F|siWsx zG5WaY>;!s2bvA5=H~U$=>}LH&{NIkfc)C`iABjaQuHQO7^J|>JVi4BB?+WU)P!!J& zZ7K)kZVKoSPo=58WNmakHdFOktCJ5dhTgF<`EZyR<%<+@H(4~&G3{)>=C1O+_>^SJ zs9h>9-(boTl{_V7<)X*BB=P3|8h-j|+3fn1`YFtoe|KN)@J{`($Un{BLCC>SMww+- zi}9O!6#)^!A8$5b+g#t(K9++8cHLaN4)qdZ!y8mmNmDXJ|L{3HY%PrLO`rL!cKeQp zNpe*Izee9nZNKDb>Uhf|<`=QNwhNQTi>iy1Sy#Ueo10f}=$LUGdeM8Zi+!b z#y%zxG#>MI<6?OjF*y+BKl5n*b>m!{*s0U{zg%cobme*9Z3-%hxmic^|0tnhpn?Z1 z7Nq~u8fp$+nw*zl=xco@%$Ra66jxkT@?dm1Ov`jRyD9o8)=9mKJ&Gug_yeQw_e-xe z42T(Pm#!)HF(m9xOt!lB@fU|Jepp$0O)syAa^HnpTm7e@qED_-r>SXXAfURQNxuJ{ zJiys8Rj^5b;VmQ>^MrP`Qa+irFHlLFk!an1SnI`9U~VKz0U)Vu8vHWq7KmtjVYw8e zIGrB2iGNrRUuN7X&8?vJ6vs%5b}M%@i*H(Ue+}luVWZgvALu54gs}wS?TlG z@5ohR82T}jy+Zvf-tAlOJ3MIE1XTJo$gL&(W+jis!Vy-ehL+pTh zduk^?l{_unlnKx6183al@32A*D`cXpPF;()4BV=|wr!J44%*LGU*aSafs4U+v5zI{ ze58Y>T^mYQY4#lL#6|@jJMv;fDlQEg>Tfv$xfb@;f3L%DRoutdx4X@O zIdLR=PHBn8w&xg@O0^cxcO}C|CCnVIHdUdizFWdu#PMDc&L{fmcT)#pC%ruUWztUx zoBN&wy=U7}&t5^^o)r40!lxI1y?Wv6W&Arxb?bz;y8gtPiJOh~ly#s(aQQ&0Z_<}- z-q5Y#L00f#-(=Qj)j(iF{W4^HTKxC+rBzX6qI0warY$6-)OO`s$5?|`^)^2Ls` zGigd$lzm3Tzy5mtDhIejlYfwIIndY!3>RI_cogPFr>@ixV+NT#%dVQ?8gbmvrlBTE z40S7Ya~XHBla{dsJ-3N8v><+#Ix{KIQUlZ?USxXt*TQONw!G$!_AuNw|GfHLZ_|&D<_{yc zbS2xv$JO$rG$&BCk!OE{92bAap)sxo^rrh4C~LNk`h2?{{X>B~Wbx(LZac8+epdHY zS!)NLL{#3HC-7L1?p6%z4zof~qd10Nq}*K;J5teiJi5QMTZ%_s*Q$1ZU%lE_#?B%6 z<;@|Qg(+^3`^Sj?v(x)-=5q?S2$|<^xOS) zu{EOn^3G$g!UUO;jRPNrfaV!1FUd}ecIOH0SHy1vWWY&>Kvx$SsxYn=FaLt`!0<<~ z<9bmlS=2jhSg#7~eT@24pBP)n$a(jeltTQM%g}Hcw(cAeCR%?^Km6p#$MW4c!+aw9hirjdM$|jhUNWn zAu%VfODW4SgzpCs9`?+9eYS)TxM7=W-V@n9@voEShD2eVPZ2QY#=W(@6Ib>O1|{rMuRaTrjveXPWLQIyU%B z`X9+L)*4T*Vd@^zv_3NDUnb@5jPRK6Ah?d{jO{vz_QNaSd0Z&o71awHQvKwg(P~C1 zxE!(OEob|?E!`{fs_EV5h`>4Tumh!MKa;xQ=^L1I7KE67yT$nudk1qEKVx3m%ARp) z9CLa>Di}~MI#121RD5ywfHI0R?=|bYWyvCtC8#{qy)ME#&+1f}H-^Cp^N%RVt|XAr zSaFRzl27=16%_A;GS>X8u<=$4b_P8fyp1#3c)sjiws18X(g?M3ull4isC}642IyGI zwGpQX7zgiWd9`9DX-{z3vk(f#Hr-Y3c|f2I92S9mgFQcf^ht?WvYwc<;=Dt%7024c z$vBS&3U+|CdQuTv77|e??$I%3dz}Nc${dVnH866=ex+D4Fe?NYMu8|imx(-&H-I5_`^X2cTFy_RSy;542 zl1%bJS}?0_ zYW|FXFb%!Jm-nBNQos2VBpTR98uQoC2Wi+J55tip^7$@K%KFaS z_D>FA+vNFxJ-Cr>D%S5ft=x&3j`*XRmS3^n%9I8IufHlb@#Nu+g4F>joT3C<$)#_& z-eXLW3G_8~xSo_~$_9;H%G-OMBmJ0R_T0wb9kak%`tg*Xk0p~*@xzgO!uk0YBcOVM zB#hvU!Mys9d~MYG*4Tm+TvH~;triyzJgD`{+-(l;v?ZDtJjg4 zb-?(oWEPdBBE{VQ%w`pi&W0D^Y7paYn^zF%F@QI})OSb{LCjJm@xIIwP&dB!! zdgZbun3_)F(UIO464@N@U>F18@FG|m%8~{Cot8J0PvupVT3cuVVcSUW9kS6I^O_(tEfJDDt#+lZy z>1Fx?X@ee}=`vOj6GC^bIf$rjeaVlp5J$po^S1Sa3XoSK-+HhTtE*JcM^IvE;hr#> z@j_-d;!>3=v$(ouW&Lb&1smNbjszF+JWuV4S0a>a>Por@RodM%jBjWSeGTSEHjPWA z3o1z@Dm6;gzj}hf{G?=0?eSR(rpGHVs-Hy56641eq08^Q=ltv(VWZjj0h}z*Z*ZQn zEz~P7ntZRy(N%J&#EXR|zl0#(x6(1wtE4uBlEvUfzBoB9zAe-9ZD+G1V7T-d! z?0qLJ2RJGp@>$N&F^xKgkuBXC`#`0!E0pmn*MhlsxaON|gvWE2sKtZ-#`65wX}+kJ zb!Q;e7SbKOcZ(_~N;xFGCJ{FRD(OB-UT#wo>8?RHkojJjdA7jXkje&e$R{*TBOjDT z(`l$H{wyH+^#`KQ8eEy+#i-^g8ji>+8!jhUpGfIJ)aKjEXO%p>c*I*=tza0MQs|;R5r3H0C zWLuJ_dP*{L7+W>D0uq+;Vdr2kzfMwnQn2iDe=n~H%=o~lq*a^tw$|QPV*m1~_eY_+ z=)&#}J&gICsFXeQqFQKQeEzU5IBpw}4O(j25?NKDvmh!YjtbLjEny(uE=@>#tBfNL zl^=}3x@ECNV=gZH<;v&^$;L@?Y&@^2Nceb%LO~oHM<&!UvxwkLdLOCZbFr!!c*BX_ zrh1Ua{xHvBAjLK+? zWDadF{t5ivJKYoUISO*(5%I~~6f&B}e{@6+5j>{M-y0Tvsfp{KXeXZ0c$&gicpO%` zCkgu`$~1zjVc*J&&QU2d%|M!1 z%rdMkJ48Q%V(~9j;lw-$<3aW>*g{Q1dBU|Udffg4cPa_%0v&4TKH|QGB63b1#xPX0Rx@x%_hSN8zL>IGC~Unkt|+1AbRmr$*hZsE{Jh}! zuAZnu+W1UE4+KQyMP9HQ3fA(Y8{89V8ru~ch6@*ko#CU=hN=9DTn|1?1Q>;l-UfG( zVGI5%l$br(J?XzU*@oNK7FUuLuWUeC^Yg_OB;gj`Z0POs6nD^T!E11Y6Mb)JQxIKC zgf6_q3z^+dyo(q|hGm_M+zW4r?g3t?t6xS9dptO17sNT4=-)dfL1GBf2=5 z=6haOfo6?mDaO87Pz;Ru*^+?s1Iyd%;I$mg9FhxfF$UZ%7k zTic{cUpg2R9#y&r|Iz+DImiN|8-U>mqMRL3{`+3mro!<-aLo1ziH6PM|IqLVQy^!M zc!w?rGT!CaKcG9mLb?DKddy7Yk5KNKZbNg5#BltB6M_ed5GfJzUacSKH$RZOBIMcp zB}kU{H3G04h?~&t@IUhjVq{6k%qrr`;5-#Mx?(^H!a>j#(Cs(d5b+KYm8$ZLwvLVR zzIZ`}mr5m~otcX=>bxTeb|5F!!LJ@Y&; z8RA4~P#rBqUyIcCyy%+?$UTBYpqL%*Na820`X)f5aDiPL#%v*Yl+akxI9HKXw(9Wc`QgAKC!(y7l00aClA~2KEE-CK8?5kj^Q{vtXrga;5ip1laC`#l&$_QhS?U-Z zApX|`a~w9}BOxmk8W0Wz1_L;PjS`0lOhNUBP9qpGP}LA_9%50Gn@6!gIl4u~`{U1jy?PJiGZqpKOpUh> z&ecPYK$cVR5v~iYDU1PJlno3%$$q>X6)d>2QxD$F5W|L=O46K-Ninc<)TkhlX^vbM z0|heF8v+>%$m0s*UR?NMlLuD{66rn1mCF<7+U;5{yipv1WHG~<_h5`H7{ZjIOJt~Z zf-#;q!WW)9NhCS49fqOcK@64XgxMKGci2Fx3%+>aNb zH3bCMviH&MWt5rdQ!`%XzBpYcDzD40aTq)d(D)2!jw){L;l`!HA~#R6#Tk_Xe_hhT=Sy2S@s$ z$-Kxx1&n>7q1C165m?Pn3tJFlyii2B2w>h4l^7eQ_>RHMo&ARAw1q$bGqt=^u{aHL zG>cG;Q~`H5ZG$$WFj)L+GcW@x3dO4i1+p99*v<-fti%SM6YCkI{l{wjceH{M{ky`k z8<$1Xs2A#d9=kMn6*kA|u>(_)?M!3UhwI=SA{EMm}yK|RaTPJweFW}reIQ4|WMD~Z$W3-nL^S5?-zjq*Xc3Twg>l4Va< zXYVjlU%N?JzQ;(G>ld+0Z7tPGm#LI>UDaG~6HpKYulM&55JPc*WZp^)v_yhl0_L<5 ze|Ghcf2~KaH?P~B?9o-OCfgZ)!nFDA`Ga-k&NFlxO@ss*2JB5dyw{gL9e9OE!;}>49v)I%u-S9bi-$L$G7x+RfW2~{0C#)^(zB6$7 zE;#Y}>p&WIRM6jp7Y?#PmWHcYfSUv!+eQtkz*+$pBF#*8)NPcJclrLUI|(A>`paW{ zssCE0LQa=$HBR;2#dq`Y@W8LcRaY2?XGIiqwZ+k_8*~!rse10`!tJ>BR+_=e{OEv! zfv$ZmKL#)dM!!_xC4r-BguYA7A45wD!F-A2QE&}QsH{`7{r5?)y)E~9{na}L!{j<1 z)P2s3rYg?2*>|zLgJX6%z6(FZ!hP=j67NuDLB=5cTQzf%Sg@1Wj2Yca!@}n~L~j_& zt?VA|n&bIKslk*@y@oNihD943F(G-{;ax!a2Nf5MZ~Ha9YuAG`W@@C9oPJ-^LdZg5 zr$NEqAhM8cKCR9uT*QL?zT1NExA%9qVENp<&^F`4!?s9>xzs{QCAY61TMywWtH9hw zXPQ$~NK)rg&k`2rN=dimm$&w^Lbp8%5tCH#UaS3~cNG&~c4L4lWCgNH2zmfF!X7#W zO04{<;KzTRSpMP2XHc;iX9jbbFvdnIB>b!X_uT%eGm9_%SFUrrCQ(~hjSRuJ-!4i; z=JTkqif56_Q#XmMI=8j*$0?;4ms2On`(~9q2<2z@g&pzsj}fH#w27kyV@+? z#GQD>O|PC1Q0_h~VEA@EUhC6qytJWgY6OWGolEvfu5)o(mc=Utj*mXKWP`DqNlDxO zrPmd%RyyYQYhZCHkns{Y|8tY=G-rlNw{F0cr)PxaaF}Fp`{1j%EpeNipgIluX>&u7 zQT}0X5RuUJu7ProZPjgs2x&UIdC3~R8M{EWp8t94uYNIPmBNlTwI8UuA_B)ND)!4+ z%7;iZ=TH`o;M~>aD0iw5TJtPJzj8gkB@^aP6MgfT>Nr|3>W^bZCB69CE+jSdi{YJR z$A)&Vx|90ge$b-f1FHc_EgNiodx!4~udSKhr5YZZ%{oV59rLypEMt+ojth>3cC6Wb zRf+)fHaqAKaF(=MQ5xumVP^s13M1Ug;Xq-VRB^{@M%`Ol-v5{N?R|BsJijMM+tvqJP|kG5*g> zPI9Bcm*#%hYOo`-(W~p8PT>dS8HRq68xUoF1=?2TTV+y0Q1CX_ic-tu6*Z?- zxBrR2(R z$mWboggHPBcDeBN%ZL_Ub4L*he^Ed&^>V6Wy~KQ7*rff#=IaXU2=N!dL_GSL?Qby| zThD+AHLj9hZ{nE9esul6wEx2h5ve)Ig1yfTdTnuve+f1OVe`KQ+uu^3-7{B&riP@FD*KeC%ul*k)JQ`$XW#XSK$AWE58c!J zyF3zY0iH=<5@D#U1dvJ;_DcDwnaay?sSYLBdm;4P+d`t$GvM3O10jX+Bl+sQWdT)` z`Nzkm=Wol%*hoKEYGk7NN^@Zf6gGB`9*x1u{!^}>^aB}+$P4<{AqjdtE>9Ab!b9pZ za2fm3i${>>n9$t=GmC8F-AX&Gk;td8b~$FF@x$pwY827hNv_-Mvfb|(icq{&(06>) zV5aQq%4m>WjMn!a{nPCu7Ua;s6BeZ>P<+7{7_S*lxi*7|jb?4dyg8sm^pBniMkq z<3H_wJ(dshP2Qh=33t50+O(XlnFNEOtckNabmb&T4d)#>W(Y~QpkML1fPp(ObcdN# zZCxEi$}C+A@h>bjio@`C4{SCHW?yT+cR96MW5`WXG+t4LxoWD`Uo10_9Q?pi3Xs&z z0UWlibQCOabo?V3NBNAbnaqJbmbiJw`i>f(9-{ey${~{RsiPB5iKoTi-~P|k3-VFt zcfB6asClfJaTZ1DS3yRKStIHAA3P~O=D^Nkx4d@`=r8}Cg}ep^oQyE<Fee-1j+rSR9g|j$*LU(J!*-h ze;80akV9)ip%n*iRCK~xlR%pq6F_ibqi;50?mVyhQO?Nk(L&Pv`PV0URUSkE6Fvez zEfh>Sk&sY-|7x3U8HkC|m;kcTF6%pz%oVH#sT+L(n*_?9$W( z8O2i%(v}%0f>s>c6$213git*gP8~;U5L_%}yT*g*)gxFvOu2%PWegL9?vv}45B`qs zJjs8lw~=FSm+IE`y9?C{E#nFNPa23$JqCJb%<3RprJr(g!CjjIAz_65p1z#_=;w4$ zn&QPqZHQ05;9b^%N4ZKn_i2g#H_}8%v4!MqmnHC@#*7UjRj?*+{H@e29!yhWDd1W~ zc`*AOebR-YVJ%V6`om1G?OE3__Hs(GTO^SS1YNVgL1*!eH>HQWGN)cU_}|~Y(4c)b zG+1{3eF~$y8wf{td(Vr!3;rYS88jSQ-Hs1-r~f}RXiKJVH@CjbTM)3@#7^)EDvH2= z!kG6n)vA^7#md@mkc|o01Uy>xz86mQ34hKeVuYC*or5K!8|g(9wlO~wF+0dEFP!SN zNKe2b9TW6O-V4~SBq>0DA?WASTNSN;=;HAFr8ZRmD+&gN`C@U}(R&L@BctCrn`n>y zgE8sB@$PyvvlcNEv?d8myC2CgA;pZ7-QAfZL~_Vc3#g?_6*S#i7>y?BVP6QRhi-6o=^dKb7{C z-os9hMG`0!M(c`qTa6(_0|SKux2&ySLWP94$0vku|GtZT5DgGCk!9V z<%(!?m-;}enML3x7VkF;^(Mb*d6PIW6wxQQTVtXj?q<2<2{PyrW~t;uIz0Q%98Je0 zFcfEd#EjYG!b0ljM%1;n-)-wnwpOnV%YRlGmeEzlt(l4|%Lm_J?N#sKTzfz-=LQQQ zDcb(`awR*x^?72VM1~*-i#U)gxaNWa%5oroF)q)0F~9&V;ANi-8iu}0r&)BG$vqql zm57H4-^W{#h!S*x*ZyvM#x5%A9^#sU%VQ;Gw}Qh5|IH$Me=$iBo?Q>q=pDA*6N!za zGRmo{KtKE*o&74sQnPi}4-S;xz1T&}p)Pj&dw1&Np|(0%UBpm(rQPx5Sw*ifZ)7Xlb*^`8sYB?x6_H!?m%-kJ#r9fm3re{&1%(U!If^N~38>(WX^X2;l$)(lmak#H1J5getnKtwcU3P^VA;GT8 zzuL!N5@x^d$LcuXvw&nHOS<^i5mF9SwNwZbofCR0)s~{8gikv@%uxE^uu0U;)_7NfXc`;MS|@5%#A+RAwr!5 zP}e|z-Z2bH;XjOZg&CX)0#6Yf(Go>DyP`m?^1{t&8>XgM8N%4K0~_3$$%U}WHb*o{ z!Vdp?t7%zN>`dSR_aZ&3vF>jcgb4>-6%a<-Bk>=JiUH&1&}S-tfORT8BQAOI%Msad zCf5!g-5nA!!|=aNywT#TO*hCDKUB6x5FPetksnqIWhBisFQ5?F(Uww7w1+(JNJ5(8 zJApq#&-uE4FG9Ddp7}1{sfB0Q$&F+WJoFLl3bINBr>Jz;a8M>2Dobf-Dpb#FWm5#T zC`ON4&u$(9J0j;lmG;GoS#Cp#Ep`tx%y6mCAuUbu6ch*}TFXg71Oy1r;+i|xTmQu2 z_@N+Z8U9i>D$k$nAiAk$4inQs7ACS)u}08W>IgI&%WyDCzoH~CmSJZ42sD2Xz-6`y zER{`ukuegmED_rkhzsj!DhlLfxty#h5t@6522gZ6wz^~TS)H_ z>q&|u!EjXWDLh9I)28W$QaM14XD7ly7nJK0gEGW9g6u**T5FsX(-?_GtDUsbZQ4`W`2;J8Nb#<}v z?eH51$)Gl}=H7oK9%mZ3RahIe2J?!3;1fVhd{lpd4p&bQXx{VFFpMt98<`{93QKGY z!!GE8BDsHY8inGUs6Q4R1G>KU*T(=UG#J+k*u5L2=3Rb=0o=d?V~JfuD+Od1XA^n? zT4KupB!`mx*uCHuQXUA}6AXb@D+SiphrsSb322~$j4me-O8MaT^4^Vrj4%kQe=HXV zBbEozEO?>!qHShd0G{AZNEX$d17}N{7kkaO#^$t+L+Ddh0A>#7?AD7@TB@IVxaB~? z5YbhmxCjLoVk1X>-}St|VHOkHlVyP&*!M1B%-u*M8_BHn>|k|JnMf(L`9^X5;K$+9%o z74IdtoJh}?nXbY_daxbr9n=J5oUf<{UGZ_Koj+U;r8jR^8snZ6%6H&mu|qn^|0xXjN&*7a4I1Z!2d|-b!)`#TPcu6K~!oF>?Azdrp5B@%jpOg%7CVx zX0zDVjgJb#ppb!kCVQ^2y+;>y;aAye6=VthrB}589?V(uH(tLzfv;Uj* zUsRFEJ)h)7!1rR7*YUsp#3Nooj`L(n9-Pw3btqg=hS4M9s~%N_}Ns~ARf^dQjA6nbKQO?Ot3TfVHP&pw~cg!dVprs z>EweRN)Sqn1k}o4`4|f&{6`l7N35a%mLGZ(Dp{5Fd(1yf=*m%5F=9h26sBRt?e^P| zssKz^wg*n6cbMjI#;uw7ULk#iRDzVfSpy+9%F?5J!tfbq`?b@-Hb2E(GzDUNTC zL@q)}eJDx%N1xvmxBnYg;U&3?79pwoy7qIPn@<-Sr}kH3xDtDO4*E2ZS2HWyJ=9}}T`MG9|)$_B~&R_dAw$n)(%F1Msz z+xzM<{X{&+^MJt%7q|Mo^ha*MPCn1^SK7vWJf$z$xNclu0aAET9Ux6iKEx zlHw&}n4d!|j8zW-dj5L#%Bmo$00Ram7q)OBw2&lZ()&KAVuU4-nz|WBWrld9p_La& zOqAZ`&aQ_!wk5#d>jZ|4)sY}cDEyB*ysnXS+^GP~$P z9iag)XiHn2ulAAk-~srUhGNdZ(60?I!OMkr@@pXn~J6AuC}>#tGMzCerQYG1K(xY636pJKQKBnMGhy_-%v%MvN7` z9PHBnU72pEQ5g-^LzzH+xW_~o6R#lw#j(VJoNj&QF)vw4UW~X#Wu!~g$1)^2&jmR# z?hYXoMMLJ%@RJgotT&)LMpS3MRCgM`5s(u^B$`QGVF*P z;jlJa(*Pp^B`2i2)57~ks{goSglF3UJS~VP_|D3ypi<&Lw#7O&SXvk6uFbOS@wVnW z#sbt{$+l#2&Y1SS<9uKJFNHATus}WP*^TQQm^qH<4N0QpezHSOz4M4Uu3YIa6VSiC zF^TOF^Q}X||K00(5PS(|g?O0-PWOk4%&?elQYtqZi+vLqoTc(TVpJXP0qPr&X`Si* zLv2S6mQ(-UV^zPPY20wRUlEjH5c!efEwJdO_~))}%3`(L5yVv55g&ZaRDTkzFD>8E zz?m(9m6s@qrxj_z(^85};_M=pLLC!S5b-R$J6;Byx&WGiDt1?@#ztqhZS590D$*gu zBecS$ghdDFk@QgQMi_OrHB*}(KY}b5=qNA498pG+)f&oB8Q}CF3AWm~-;ALI<0q)w zkJ)#ilQ?@Rz!}kuNU;*`6rB;lAw{g1Rd%v?-eVh)!!q&GF)#8vMzy8xE?cq?`R|tI zgkNB1=P}y)k(U>V^TqlqTR>>xNJ$!y zNg}pFl(Y*4K{!q{T;YBJ4H2m!)L}h&JTffyK{R+;`nJ4O-)4^(voC0^++D_aop{K=t(VcHExvE%j7h|kx&{)6vbP6EH`Sb_|F?-DH=mM0tX5viMrA7 zZl9(06Doz2_M)S&>W$gJSdoZlas3~33Vhe(FWZ)@m&~*`L+)bL2ySFC8VU9z;->-7 z%3P^-pUA|JPgXHuEWaGu8I7M>6Zy57!o7AM$NJ~sQQoQGy|y- z-qQm8rWjX_9?e->*pqTa*;fPS3R0a1$DrqB?}l{R|0w0tSHu=H<n$vcS6H%l<54meLOGl5Y<0gA|+Fa7p{Kii%!&QM;oy@-Iz2-)U_cOS?7R zqkpv#%uhT&ZD>`e*j$8~rpN`F#}aVb**t;p)1zKX7o zVE6g2FmjI8eaD~T8T-~k(j$mpaNP>;_|A8jd0eihV4NhFL`_%cQ~uWu;V_u|Z8E{B zZXSw-YiRnZ_6r4S*VuK?U%qZW?;!qO<$}+zdW1?Hta|$}@1NayL%Up}DiG%mg z51ICEIo2-!tnD~-n1wtMDs$9)}zxJiskl1_Xg=+w|C)ebas zRqoFLKV;?_V`o2(>sSf;Ss3CZSX~PhHD=J>hM%bp_(GxgZV6H`a(seb z>uRwHTDy{leXm8x-6JcFx~xb|kd^9pdHIk31^H;>7w&8vJ8W{1MJLz}3p*KPT|FNW z43!%RZ<7dJpIeiZ)vfx_BZT%Xr^LL{xq1s8?AuMeY(}|zeXoWdsut52HWFNw`oYL+ zeVhaLYKafFy83UBqM@*D?R{Z*bT>{s-jh9aMfW(49VGt{}3gwn`vxdeBiS_+>PA!X`<881-Y~yMAC6nO>uYdc6faFUl z`6)_@+xOd1s!a;n+0lw+*1X2k-WFE2P@_Vr)xKD^um9$ zd!Hn!`HzN}v#LxTzRFZYm_a4g=-?DIKQbWM%XD={=PpxR4EpQI^WLEPLd?SO%@cF= zCR96eXI0Kc>uV(bw}5;`LNgx@_2M|gW*2dk3&kq5*TWZh7{RI`pQ>Z^FAw`S%i^JN zd8n7oSRGL^5`R5Wed>$quS)zycYh<^x*60hlT(wlIj$J|6ZToo{nj?bsBGnHpi{8a z5?UBj_V|?Aed2?aqE)tqgc8P)F02OLV@l+AXm8`h?UvA%pquY-G0QNZ^Oj1I!F&9l zR?aJ)4Mu_DN>zKUTK%*(wTco#ky@=)^+}P~vtpz+v1(P-meQcMq*Ypb`%rt9AX=kF zgNihQ+5{19@8f;AZ}+^Mr~mJ~pND^dITrNyqFKfSoD7G$BW!E8wFiS=9L+8}nFMSzRpy^qy;XQK-I~!iUR^og)M3cv`KKNOFGxDs0@1DK} zhSO{Sv@`^5CiQwnTM=x>`lV$z6vCpcIj{-c2NC={QyUEt3pwgHl=@~RKpg>aMdd{) zVXh~GB}EC@2f?L1sTwIH84r)bF`)C@z4b(VY2`60R@}klmapJ_Xh>CNGgHvGu8ko| zI6=qro5}n>e-mCh^R6SQ%Ds%8aIz`yut+~kOCLLY`pDS^O`ImX4&%Ja@!=EbNYsp0 zxt|O4&B4)HY$Ijts9Ezf^>Ls4PQ9b&g~9y`ukV5!hqzm)mTT>XHUE`ZMj)%D$=v{HvuB1o~aSxvSGy`6k-r`r2ackip|MJ3=?(vq2RkX)CB zto^f*dSZB;gcmV%h+>eofegrAdpwLh^iS&rMM3BPqTX0_ZzAr=2*(o$q2%f7KPB~Q z$BQF^SinZKD&{l3q;Ci9^2Gv|izm~dx*;YMM_#CErGQy-)9N{Sd@UK!G5!YW+p|nH zxD};eymB01XJnrCio(QB&JDkRdAzzV>(VnjLoL#B^A7?8G2aolAm%`0Yi$53z#zOM zM8(|9_oFU`Qpu>{RpOO6e-9_PDy(zglX_b7jVHmfDDJszqo;&kzZF&?>%X>Vr+xxOOqEQME;&2pJ&N{h zNXXtC_tdO$#wLl$o>N4U!h8QoWn3b7j~Ijz@E;i)bDZv=t5xP%^h|eg$EBabQ4x&; z7n;DrtcU~rW}}!Wk5(say->Xx-*S42F6?U-P=(O48zLI8YEW)%rx@8|F7)*$?uE6J zqOpo>VCd>Z(UlDI-MyjoLIJxAHEchHB821DA+gKrckP#6kQG1vcF0mg{F)k4WM5~P zuRk>JIV#V*J-8IwrIk{?qa7|3)F`}-Tb=HNvSq$99o(8e`WvL9PSNfdldJQQnEOY0f+{&&C zm}tj*mlHwMLRxt5Vw37te-pd@JtdCwwK|u$GKiBcniT-Kway?u{xqiC*6ycdA$fDa zhspef^ni`!@L2L9|KvMLq=~QI^GBBcFJr&Do*Xv1@zHw_odrzKy?d@xC*R5h|2nHA zbSfp?hac(Au5_4X%`n2dJ)k8#(NBNjfa)B^K-q$SvKo621SG4qKp0MN*1Xl-(mTGM zW4RFaBxhmiFiGJ1;^%=9?gN)%oNQX}H(29$l@XF^@a|<}VQcl%wE;{OI%+>zDw^#@ z+jVaxf<>hA=IcotZoT1+&#}HAW{maD$$zXVv&^w)^MM_4THir}`X-0hjV%faT;D z*nlngUtUE@h zN0r}~e_>BG`^8)MO&;=g6I)XId9#CkCytD#^WPPHvf5F4f&|PplZ}*Qa9x*MrL6FM zbn&2fVC-ft?;IStx)Z`!zs35wNqDsNa9q`(Jy41bM>qB4N7p~cJV|HKW{iIYRZYLAx?j1#?xVrMQNO`g!WQa(FvcD&6gXw=-Xp@R zt%C46$3aVI)^PXUjHIRQ+H}Eu^^HU^utv^FWc7kGvKx9u0fCFG;YHkD{Zh~b6@Rd- z3KLU~dp$sb$Zha7wO)JOl4R%fV&>J4R^;K0Aru=T?p^03ettt|ddc3`FL4W4T(J)7 zQqT7UbE^*1#h1)|CQ$?USpn~`lS(?gA_XD4N!Lh5%~oRmzt;C{<+nSLwtR|<+1MjJ`ZSpw)bKW6!pzFz zVq}<1O8VAFV|!ja4=ArUCg8d>nqUuz6E!37s>2`owW?HIz4F# zu|k{1*%7lXhmGnWgEGa|^amK3)Z@k3(=O-Ng|1vEI!jb)Z+{aYP<$;e5$ z_J(8CdJb4L87(Ocu+wVVIx)MR|7m2iGVo6Lt7SihD?>2lLAY;UZ>Lw)m+N*qwV+Y0(6XepL}Aj7c6y<7xj1ebB2hl>B1bd zYz!B)?Ste4noFsp_7pIV+taB$0?AA{$!LzU#%xBo8V!<=z zn=|`jrbfY?xEF0gyccpogh=P$9ub?XM9VRtduc*xzvQB%=XOfEp)Vv0A*1DCMw3t%6NL978H qjGdkO(m&eI-_L}7VTduhOSk?P2V(Dma@L;-x<`5@y44SyUj7@2`u4v7 literal 0 HcmV?d00001 diff --git a/resources/favicon/apple-touch-icon.png b/resources/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f73010ee9bf5aa78c96d15f8d80c454253119b GIT binary patch literal 6076 zcmZ`-Ra6z=(miwwNQmS?LG~G%^{>g8l)Sf73uC21SF)pyHmO)BoFcZ{`c)Z z+*xa8&z`mRnwR}BYa)~trSP!Hu^|u$o{Y4(>OZXg|HMT3SFwq%{#6L-2N4Ak2&6g| z=iUVEABUPst13VsUaue!|6m9N@o(h62Z6Z4AdmxN2!uBo0(s_`-lW10fgs%|%d1O( zfARPT9v;Bm9k{&(H#gw=8rJ1}iHdCI(nqg6e8eQUYdY!O{{)N&*Q9 zz{3L!4S~~B;OPkp3P4vEsH+3MzQElb3=Z-*N521O4kWmolsF_DjY|3-!EljLkigi* zA$jtg9*<1Q83G|Tlo1zE_gFkOxYkpXBNC(!c>#yCgeNPD5d=tMWutZz^NKgc`4eEG zTWM9(p%ajZ$K{4g3)_O7q!fYI#1C8fPJaFTV=ZHu!7G0)+!jZVDv3#Q2}0h8(_*WH zixU5*6(ky|dQmO@0$wmIBSr|(q$H&#^kh76xp=N4Z@awU47#(F8sa=uDsN%~pACFT zP=l*ZO(se)h$VV596Grv{_(?URQI80Y0Fl=I zhOSa7Sq=^hl^{RrgnBDHb%%tF>J+?wFNtNxTS|-?4`w_tmn0o`gbGYk7P-^4a#{*8 z77W+rWuK|(iOXf^eULjT4Z=#H66~rem*Zp`q`r?Kb#;k-Pv6tnI)$srwP=?hwv+Oc zzW2~$euvOz9F{~})=+<-YENC&TyA&2cK+%5knMe_=vN~jy;S=boQRGtDeJQUA$Ebv z&1o&aE3CuYyO!*nqA~9NFJsQjPQ&so#V+#h)bAZB>qz=@7o{ZruohZ)@$9RP3C%QbGH$H6XRSO>G&fKI6$JK*^4 zR&k2m-Gy2G*pe`$=3P~Y!^e{&LF#GtPJLsHxT98t&G$C*AyBGtQzTB*&Jh-frJAKQ zElnbeJX5u)C%jODd-9Y1Z58r!9S0>yg^??Zr_2HFwV}$Gz-DV-RsXD3>2~80Evl-_ zeArQNEK#TrQqszA%G}yr%3A>nC5cQpq4eaVytkN%H&)-al#YGU{LEqk_v^a@?6h9CuK4$o;$7DT#Qg; zn_<0Cs|Bc?k;7xTd)DT9Ta9q%prlC_rC*aVfWs4c<@x=--83D4epLm1Z4%W@X(RFaz$Lhtg-UkvKWWGtuQ23qC?)e9&O_Ekszs?2NtY-f(O1bGTYT7iAJ}M(FJ&V! zd_i(v7~v)q{B<3L`^P$4>QRo4ccj`K61za)dKwW=`?B!&iVCjV5SrN}gFUNn=c?ch5y5Zyy)nAb7d7_`$gP(+x5O2B^nN>Q6n zk}rkNH^yi8obb|fy7%Su^OTV!Bsx;%_i;E}Oup{A!P6gByh%aJs6HwgJzOqOK6+7{~Rk8&iu6pE5$jsanpSTK#J<;rP^in7N0 z>sD?;9K%1(H}Uk~vI|nNOzHQ6{0^0Miy9Q|tyRmr)NX(*yohjeB^cF#i zzNDQp4UAKExf`8&V3HTTeIkm?+RKW9#By5R$=foGIx=J_&wurqhqPY5E+}S?8J(QH zpk2a%Rr?K3{%tLF4LLn8O~Wso!SV`R(Ta6mRO*Zd`TJn%Ua^vIMaX$eIXuX^^M`7f zbaBbMmWR-Q0(8y8G=al5>=jd}a_P-}D2?Mm=uNM`NtXdcndK_K{t_d+8@Cff5+AjM zKZ>O+EGf~SPtE5l|1Y_R9Xl!$r?$8Itq}DC`}z{Dl0H)*l0h0qYInZzF!G4>>2{2; zd8}VvQTu_7u`qRjUb;5vs>Tyf?;SGtxBaUX<(628q-E?l_Sb!O5Ko^ep`<1a7E96z8=#g^0JP=Ss#l(zR91Bk#V~J(aGR z@yZA|O|X=na}m8+HGpat(|<7VYl6HmKu+v@N5iJRO4!7y4GC|ja*x5;&qIG}fN|#j zBHYEPid8K-u7V*{6K}XNJG+UTc%AN)3uz-JO$5UZE$`Yie52MzO*)Gr87HrS$_VWs zJIG=+Pz)WcpxiH!ZW#Kv$@b^wwZ!lQtmF`I)CKrt2FKr%uUM1a8=!u|(wOmgG8_tYfwEy6XQW0yi>!1)R9p9I=V@BDD zonr`AV)U|aa=*K2u~{yRs&%<@)YAiAaGDv_B0s&|QyCSBRp`G!`0e(a^Oi<>T+jEbs!?^xn>vn%)f{a3eS?F$1 zAyNRl4n1%uHzXXxxfZb=^wLz;dMrvz+jp@mY}|IZl1XsVlb?91wYzgq`KKnSN$AJ` zStV2b7kNEfaDXpT&dl9<{yJvy>T-%uV51A$$%<{@XQe2zl%B{&8rT8HY?Sznw7yYz zz*?6a_mV4NyN0 z%`J-={m@ArgN9W?)-Pgjm}KLXY4}cAavfNgI~~N+s;gB@rnLtjl8fX0%-k!8|8^7V zp?K#FE|r#)4SH8|b85b$Ze)@BrkoZUkUX_61v6G;SwRzFQRc6tTpp92Hp%+NP8D3e zGMXFweU!m|u)3R9YGa?G5hY*PmMmpj)sJXi~KixGo#A&Eu*vBNb5KeFDF^ z3^tdA)10)7T~L%-g)LaiMSp13_L{DtP`0n3px7evAu1CH^)2IR>z?+?T3Jrc)5P|> z#q>HR*vswOn5YN}5m!h-G|nDzB)vzmyhZ2!e%nM-`G$VMQRTSUwRH3c^SF9fjllqY z*p~0Q(g$mXaDVA5)0y%ZKLZ_$)Fl{i#<#l!g(Md)*J#S#xLt-l6XovN!M?=pIQI&^ z=2DWZsYYCPxfH~g_1@fpuVv`typR!Zl}63uH9S3^j5bEYKH9wk)wG5gS||BcjucW> zn_mk&8KUngUT?f4`Et4bYKl@f_NbGNmHn%tI#Xh-Qp+SZ%0pu`PRG8Twk=is&kT-T z=?$JdujL!W>?l)-E=D%1+Jc$qY*K^WyzHN*abk>YA?NIUlCI-Aw~fz6WRvd2kyzVu zvZ=W|Bojs(i0ABUzNs@|Yfcn!IJa`#n{lrw_jA_rUx!HWAEsQK*yy$w_1~L@Z4#<# z2Gk{n8NJ2ucMmz=v3-)zw6flR>RhmgqVecu=wg=<|8-6m`)SoDsfQGU$klS^l1hYO zfH^!&SEf!I9wYwD0~?M!Kl9HgFbOAgTU0V?h0%!IVF^loT9F4Ct$FC%>9 zE3+BmoAX6QBY3r~Ei-c}u;;xT4qoy2@Xj6l7)f{nOVC&;gw1Xn%Sp!WaFu1xB1imWH-Q=!T>(+_MB2wc~ zkmw^NLpHMz5+b&wnZ5I>OUwPtkT|4?tv{Qk@a(Zl$#L>)t}TJ|p>VMZy_txj$i^eF zvfoA6zEYgLFa=#9~DvKc_U&UkGJ0uvx_lKI|UFD5$ zaEDIUW!HU%(j*013uQ+YhscvHw9!J7U%d>3>f?(r;7q8QzzJBj{6$HG<02C0*w$Z5 zL*cZS`?krs<DTTJV9yChbNgh^d!fUw{;&qd2!Jm zA7d{-`z>C5-9?A|!-WfEETV^q`m)O6pq>3?k^ohX^%Bzzl}FQocl$}Lbg=mm^3El7 zVEWe>FaB;i<2t07XZWPW$j;0kvbH?(8_|!Z&z10B><4wP2F0*ulf1L1VNXIOuEA7d z;TFNRs-36{ye6d1{#YDn%{s=|XOu}YzLKWYAx`1QTMzv??Ufj33YAt@geQk=e2XU# ze)bpMRl)s~pZ|D!^~RomB3$ZA{#Zv~G5@^jA#Gx|a37r4=GDrGGm9mG#XG8+_f#H* z{ZEU}eaW6va}~y}Cvu;y?hw$EQ7OVp-($qmrK05pJ-W2(e13$mscPoJne_E8RKf##OL0J$i_Uf zTgsry?$8gx8m**W{VA43Sc?g+lx>`yu@Teu7_0Q-pH*LXsC6tV7(F1hM1IIMZ|KQP z8;B-pLsQx$8)Yz!XV6IF_O3ml_$hJNkB!0mW`Np|^27XJTbVN;y{P!7DsDZ(*osEI zA+ch$n^LL-1+VCwiCl1kq4|l(o#67EiOE)ySyimH2Rw5_t;Fw~WQCRc;;lFn)l07D ziINE2t6Y|yP0B)+_yCsQ66%tERH%cuk;U~YqI=KC&KZ{e+*%}+`)pOVg$ULT95J5r z*o`~LwuT7m^JMoHsbDnL7G7jrlXpEC>W5D8C1XAnken;B;Y>x!DLvi(O4#ZZGo9?Cnm)vxsx1k01{=-OyuVff{r%sdQe>RH;aR)&q1lI)r7sUP%^ z)A1-)qg;)!EcMChgjC5VWCaJV#|l*1)Mjv1pgulCeRGj!MV}~)LKUyFZ-W#r(sIlz z=xq{dY_7i-{Tz;Qp8Q2AQOWSuHW{11BFXf2*Z|pTdFylAPm1pv_8hWyi{ie6D=FPl zdZwT0>3KG1Y`6p~@VTQgDvM_MhMqNMy}Ru-Xez>)Cy5KLliSMWKUR7qm6BDZ(s18O zIEfNX?6u^up2S6T%>`RCEiL?7R<9Cx@@J9XP!3sAV`Pf5&urn|&}z}meAY^tS_&~x zUiRmcPr)X`GG2n!Sdb%P&2YJAp~-pSPX@2N)Yxk&yE%ZCZXYioedKocxfil!Zz?{8P~ifg;cRE(`atk2mMU&>ofk}fmz ziEisr@N4BrOK{_At2=G7a%{#N6&SrM?zLX7N=&`mj(xJC_!xFLz@R&EbGn#+w`kba zo+{-odxQ0pfyH$#`+4E_OT3{lj}N|N98B0Yx>lA3^T2t;Z4ygZ^4&oZD+ZH6P63y% zGkuAQ{g8%mljes6mtqBhV;{WRl2R0OK2x{@e}CY|aAK~xBK+e%cM+u;d2T=9cS*kc z35~*2ZryFR-beU+5r*HEG-ujOFsV=KsXig_zCx}!LAEy7dz%|m!&pUPHyB1 zp#Qrf&g%w`U#t-7{HD6;ba@DJFzs8r@<#5~J{EY`#)~1_?anvvYRGvjU2&)4$8yq{ z=(r@qm`RWj>1=nURX%F4vXs?N&6%l4j^o$D + + + + + #2b5797 + + + diff --git a/resources/favicon/favicon-16x16.png b/resources/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0de062a189ee2e1a13cf3c2148deb1bc63728f GIT binary patch literal 963 zcmd5)YfRE{6#Xd~<|_+RG}p*Sb0vnTn=$>Mg9HOaB+F{1A(dI7_OH}3skOANl~XHc zKGUg{;)AUk%~_(ALOH9It|o~QJ`qUNWqSMfu@8OkZug#@vwL>$?(TH~KgQX?%K;(e z%waQyIJ*8xdjehqsOuAOSaU3j7llyAEyrJ}b~vYq*+L#ddD{?@T}9|8F3BbkI!i-n zDg_}%IYJ(pmCE=Cglu*SxFQzb0RKa*uENq1%+0~#;-7WQW>Bj^p@6zNsI7&80Wg{1 z`*-N<1i2jg`(b1R+S;I_1N3@$`V?ko!Ds}f6588gW(Hopf`tXpXuxWP&!1s_9wsN@ z#}61Ch3RRiu7)pP;Okc~7(lCqu`!sMf;Vqqa1i?Xz+wTF3c9+WyBmgvK&OM68tCbP zl@*wn2ygZp!B0lTgnaz`#F)nM4u0`yP z{ce$a%R(yN25zwR>$qX?czEu?M@$pDCb1+(Ql8j#dZgv@E}O(p*tuB&b3l5?zp9XY z;BlcMYtj8v>iFB{F|9G_42ctu4+iLF9; zsJSVjp!2Z2BuVODASl+W>c>lqw3Ro5DqfGpO3p#}$2 z>A|AlPzF7W5lY`dqcLbSXVP8nUxriCwDhC7|2ACY?=<0teR-n&m@xG`B{N%kH2tK6 zg5_pPDCwD)7@?fXaf_3ER$@TFK%82`(F+m5*D*-!Nb)7^DRm=|C`?(XDvjW)5K+{_ lA71xrdcAvzY8ksWHV935Y``qhVYl%Sh{NJD<mb#->9!c~_HcL9)-cjQ2x&V} z$W#Slf8;`pqLQ;>8Wf-$xWjD+LQijK&K^?vvGk`<-4F`<86hSMp&7-9IgHRLON2)K z5VGSSv@Dcc=D8IiC8~$3mxJN}{tv|mW@q8c7nq!c_wS*!6jD=x!+~qp;ObT2@u0XE z`upMgcbK1tfdR0f__(3ZSM25)-N!w-<(o zVSF6=`k=cTIy&InH)v{tm>3uwgz#{PjD)&6Xl#U+FQK6Unww!_0=|BQ>1n8{f`<>` z{(Wd|g-4G-EQXdAkjdc56Ufen$B!W=2kPtL!2`(1fY?}wiUJl3K7YPK!fGm9<;|eF z?@<_ZE&Xx(=Q(L-PS84xbz<-L*>@b9xH)>KIbex~#+K{TL4QAjK}?BYmX07@2p zibjp$lp#+1xi+ey}$-p_VIq#XHx3Ch+e|fvV{a zb)K&Y>kmt8xYI0Q)(5k=TI~lpza^C!8CV3nh3#6dA`#pf!;0GiY5ozNkt}^xT4pE{2ua5k!q9-%s&8VXLuS z`GgN?w@!ayR~b#%DKO3qw-?f>W94GeL3)YZ#CGgZpV?BLvxd!}xGvNrY)$dR0p`W; zo?5T-9q+SAtdYb#N5oytU@A8+s*_Mit8m1G%;mb;uJ~{28xydXnu#F@AA|YykUWPq z&5l3+Z*%>l$k%Z-qu{hNC9(x) zX3ArwnQl%FwB5Eg(U_uS;}aDsCm>O>A@4}2`YN5%%5mhL7)iiNYQc+DQ)2J7$5X2P zt5Z{o)>YZcg}FHyxTK5Wr8|8Zbp5J;!{fanZa2w8^}F|~1ujV*`YS!<$*V$*k$lx$ zX7IRCHl{IG{rV|94P8EZAVWUqh&vvCo-Vc*6fHmZAfj@A#gVl9!O7a7RNL|k0;%So zkz*d7`>)p(7mm(G`nWF~OgxZd9@}v&j*r*ZKk0(-?FXKP<$i>(my6mR-+EVZ+!f9? zWjO3(1RP?}?EFvA6o819L@Nsd!GcKeB3RoIH`!TRt+%wav$W&~aHs!82tF1-KXUHB z30<~p$O?jYnAbiA_0Sn?=!s)T=s`3r<6I~WOAlrEBXpK4k!meGzSqpGdACUHG)P4l zoF?91QxB)-!d{Be!;+cSbpaS$p%+%v@#ck4ELRa6~`YSl2}%OF;#?^gsF;&@*%{45=l~wmR3^6B%kv!l|@n1C?dErBZ;^m zf+8vkjG`PX51l`%b^^zOTEP?(tOp`@MJHUCurC zoO91TucN3_)FnFWtVq|IXx7i7Xh0N2H8q*%9#OPWWj%D|{ooU#XtXMvsXA&B{Y{`e zrqkV}n!jdticl-uD9jbs3j2h7`bq`sgn7b9;R4~*YVuNUUmCZI@C)H)VX3fNI3|=! z)ZHt*DU1^O30=z_zrFP|MrWbFFiH5IP%YY_jvf^T3SHXEU$J)Tx0mo=p_+WFyBzvb zPh*9j6yxQ1-l?xn!ui57;dpdJ)!R+0)bb*s^YQSSUsvr<5dJA_6H3xC&F;VfRaWg! zKQ;UCLx;7p=+8bg+rM7|C|?4s#lMAa`Fxf0tac{~BLw_LD#6e8?PiUQW)mmM3CRl$ z9qMrDrDm60;_k1x#_Wb0%fjgNrcO0`;|;SlYs|K6F?-+vv%Bv$+q_v$Rco+Ro@&}Ovzu-*V?GZ*Y_@)V z$u&7F2AD(H>!7;-5VYE1+PBYa_G~S#R`I6as@->k0AY}ha-?J0zA$TTO>1q2zJDn$nws32 zFqfBKHlrQ7ceNzUe2Wl%sdw5O^sX+gExv^QXU=r?I(f3w`-KZ-;6*Jw+~e2M2yFhk z>&))IUz>_{71rd+E6v`1JKQEy%KlK`S5@{)VN0e?&IS8poaxiuIAg|W(;sDqE>%if zx0>B?hto-XEH;9i@V_avL*>6ou7RG}qwWpW$Dd=P<4+h5J*XD#RU~w;M#s)s z2mBH`xo1!62#@NGB2`DaKU0vD3kloAF7b!>KJ0V{5~wo4>+QFjJ@}yW3G5?JJ(W6$ zb{y-U;D2bSCUyny*cdvA&&H2;6tSN$-fOR!Enn{Rh_VzK1^;??vLFr%>6vGoU&Ghj zdaK#fPZ!pycFCeeZVzWaVLcvyJavQ>dh>nZ96^%KC1Mr!N%~u|#O(U(&35k0t%=4AyrvQF5&a>U+5n;OU!#5aeHoO?R-M!#J2Cg>vSk3zLT|> zxXmT(1-p6gJ-3$-A0`Rk@X<$Z|HVGobJ)*_35Y>i_fI}CLl5v>V8aHt{~<^A65i2{ za`thMlo7E6@hLGK@i}9r(9!&I{QebJxHysc7eDIh@L?B!tz7A1A;!Vph`Uy=cKU|D zBG!1}1sBuIla{jg;nU$AdCZvM`o+$uw_t&rzaMAuVt4kz7hQh2o3DSDcP-$b^Axc? zF&gnDcHjxyShdQ@AOC>-ksp}bk-}H-|(FxX;m~i7p1-!4jK9cfB z@6iEth?tJPQs}Gv^4+_g&M{6ygF~_oF*3RmBFam}(C`V61$5|8uI^CAd4agp>kqOC zkb1F#nZX0=#u$O};I{ z|KYRIMQo3FH)Ty_-8MDE7jY+k7rkTtob$ddLTA{&up#zPY&?bJJ?t`}Ab!9mv0;4S zBafIp^iZLWru12HG5(432K;lD!OjDO?%yc%6Xc>u!VISliObk=RZ`_1c`foYDTKcF_55enK&w_rtSRzmE%8OfbBx1$szvaNkK?SxK2=xe;;tgP zI!R;ad?(OzA0fB~oQXKYkQ2nde2##q{N$aitNu$ z%HH3re7GQq7ZN!K_$SAKJrkqhCx{V|U&{Vc*pW(DQ|yU77T(DZV6Vsse?weVgv3EO z532H0g+*y?iP3xx6T2WTV{afYfxl)>tbb@tC_}#FOz~y#jXz@^_-D@AqemBwlVNMA z@Ix=}&{gjT2+cx}@JZ~4*feJh;!kXk^(QaOny_z^kD5H$)#3a@&X=<+K82VPALCTtHfR#^l5Gx2x{{gc$}U-^8dJ*#eKVTiC_NG0M__DO8Oe_uf-IMZO4cmQ!C~4yo&)cQGM5EsqTlL#XV4o(| zXcmxFr9>aH2$Pq!zCy`wbZPvRTh185PX&2yTPWb0rS)YKb+wztd2e}9J3}b=CR8pz zmDJO?Ckek2E)yDrHw7Yq0|NE}xW^vlZR30^^FBv7xstJIE7#J^jB6CtaXl18y}7nT zQ8%tlQPhQNz5YkURc)fWC_2WqHi}v^S2a_^DB8odd*-Sy&MiFa+Qd~6W6o8YQcro{ zN^v!*p3VZ}G*O<2bD)IoR3y#VAZH_+Zxw9}PIX1ap&K~r~yqFX5Zi;NmNo*c=|nS+kA_!Yq7^eGxAwXshn=lS717UyeR;9zdU1_eu#}^m>pd16BlIJtsK^YejC4 zGZpJtDY16+#X9h9DUURgt?^~#0+2oV8|=7RgxxYeI+eEun>B_!rz3KL@Jf!J??e!` zKpXUeZ*1r>_msge=QXbQ8t$pXGj+VqH#Rz3U~cF{f>bkmcEQHTCy?(TX9BSX_*8U( z?+*BT{2}X#ec%&#N3H_f=bm!lzYXEH$uZG)K%ZOPNRBshynJJ!UkHCg&Y!-vZF9Md zjT_xFW$Z)nO40i8zv ztNl2vAATDdlFRYy=ij&YiZ0V9g68ee_kds8mkC(6wd_H!HJq7-!GDUsHxo%z07GzynVr;(;!2`Lu zBJo|eq3-({(nq-Kjwcq#Qq8Y0UylwB4HQ*VWTa+J#-di z4vmejk4*e73$?!pGllrv%6?qzOhv!&=3`Jb(}~x%5cA^Wh(Aja|HHypX3n0h(Ghq@ zPVCFXi~c`$%$0k-mGBPvH8;DunK`hwM`%NAKnzU3#Out1a_;d(#5>4<_SDU^$4)jA zk1}`S;Znp|iMeLZ3)@tGI&Fw$nODkxZ{u#^g|@`)8Jex@AB3Io3lHpPp+0EKenNZZ zBT|X|N$4t!7veaa^+6B#Zv*>1fH%tMA6aGyU5~#L>55NP4VN$Czk=u+asu>;Y!bSm z66=+;BR$gxd`RlaEdChXY2@Eimo~KhKTiRm1poj5 literal 0 HcmV?d00001 diff --git a/resources/favicon/mstile-150x150.png b/resources/favicon/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..e897e87f8f47606109010b147bf0d539e4bc9a28 GIT binary patch literal 6537 zcmb_BS5%Y1(jS7L6j4BWQ+kyWKtgY!CiE5r>4c^bL$9Ku2nbRloj~Zl1q2kO3ZX*? z5bXmZ-1~)RP2daF;lmgtS zZRjK5vJ<8N|ldLa(E$^w5#c24vG|y6i?Gh+0ae2{M2_iguo<4w@@`FOC#aD zmZ9Hd8|6|LdVf?Ee=*8j#h1`Sg1EM)A{xa~n+uuh+>~mo-C5^ANU_Qb`JFFP+bRoW zk1%2yyCzY{pIrx`-iN}I2Rc`iPq@-}xoUaocSg2<-RvJW^?Pw}!!)P=4tr~2JwZhD z()DlB9Dr>Bk2KTQ3_~twuJ;x&w@cYk%l;RwbNl+*eH$ud$kq8cBPdDl5t<_JT)l2v zdisV%a*83NOp@v2SH8oL6xr!GzlKoBTuBW~W;Wk3s~X*7NmSt{m{m%S^3LTLgP1k} zHQk5bZE7aSjqi*zl*z2*x*w7j#Ms9Dvg9KSx?0{?hqzmGT5A)T={EcPJJ%qz;96cL z^v#D%^}$k1&q7Fq%~WRW5msecypqoVRSqEBHE@KMY^FMQk^1T9wPr_QTs=jR#>sJJcHG z{;0YPJ6TEMU|vJlx0=+G9z1qGx!)ksOsZysy$9BO+KGM|A?&~x3m^XQI?M9Nznugi zJjLd0tf4a92mm=;nWKOg$9fi1JZuiQ&A-E&RNq8Nyh2jz)!)hwf4P{TYWZ_`RZu8P zuQFJrf6tK|j_%IQ|E5)ya`>Bj+X8(g;2y9}&EA?`Ubm&!-kMCCclBzzf$Z-r3z*31 zxufiuS9-&mm&ZKl&FTDgFGngAHQRhFmioni#tPD3z7@#t<=#(Sv9W!oj#kBAcwmWA702tH1%NqD5;F}q;umeRH~ygc(;8ah(W@Rp=4^;ebQ}7 zLI+N%jlP0B@GVn4b>?mcn@|NVuT-8~UtkwwjiFB^+-h@RGDeT9r&`|@t*+g_%(O-e zwd<(*Q^|z2T4w$CckxIlte=FLSQtDL{f>XvBgjqc+&5MjuT zO}`ZMQ}VBZ6N6>LK(>&n#=eg5a)=m&=K3xrQpH%_o9q{&QMa-LD<;~^C9X6ZYb_iy zoxJvbT>PeDy>!1)`5Bn}GAOaQzP0~HPaf|JQF$3c$Or?e|JSL(Nu3K}KPVvr+Rw^= z{g^1AxA1A|!1AXpkDgZ^Tj<$cr2#m#GiG7c=}$>)g{Gm+^B-OCLjD z(;qF+ZSp@qy(*)3mwqZ&>~i{#&nwl?&$Ha3WE%E6Ra51$!3DcPmW6e1^?yEI$B!D? z85dsNB>!>i(5iGHl3-zpS~GU1!UsZp7bED8Y-O0lTB^zZdj==I;@j4S=0(b>Lw?;M zzZsHLtgh#=aaSfEcM@gnnRO~kA~g%P{#CHn;T%}aYI683{1aFUAL(rS2O`K!E$y;- z?pjc@Tl)tgytbWS%Do57B7< z;1facl9~y#4V)RDGbWN8ClhJES7P_yF+xQ0SoULMhe%*VOEu(eZ1sY z3BPAl3s(S zxTE++g>iK&U5#|A%6ud?mUm^+@}+40k?FEW?cB<7y@dI%AjVVC0b!KTClUCBjfv#0qnai zIU&F4D~YZb<7hD%$v}c%5uMja%0T#o%mZL<4>N;M5R#d=!S{%SAwhxMw z_{fJt)PJ_kH=1Y;AyNjcKNjY7Q5v#ruWYht{h5BB4@iDy1e6aW2`#wiVG+#n>${iV z>k_Huo@Fh27&~ramPB7d+pVfM8~`*)IMbVEG3T;2$J*jg+kr#jFcGf@;bjfTBf%n$ zZE7M_)TgFSoe)APE+ZF2)mcDu^~(ky@Z4xY@mF;%Z;UV9dzQ7i%ZWJ`GkPLUKFQav z(~Qa;y})%Nc|oVo#4H?G2DGUT7*!V|RQ!73JcGMHplWYT$;O#^f zP!2L{p*8SE(N25856jW^I4c`fap9sbWoRgX5-ySml2LPtncVpe#7A4d7--GzLh|xH zQNA@#np&K;vTtP0D`nriT2*@aQoyq9eIY|lzALLmhUqr8FWjYOI+jz~ub`j&?MI&_ zU$|bq0UWY$R4w=Vh}ec6elFOGtG#3YFPWMyKdJIf18|8u@c9@n#1a3p25;%gFwZyO zytya+Gd#JwnLL!1GX#pwHj18F%O32?tN#1sL&#R|vohV-u~#||O|lulMRYrvC>?=& z>(~eE_d6<$H`E)b))t7?8Q20fO8iJ`MpWTz6Q+UNi!-0TemvWhT-8kccGYPY%9v%! ze8G;6316O|5ZWT^k_4qvK`NzvmyPkg5K_vj=D-7zEQVz@J%M*MCm-uD+CWs4=?)HR zigb?VJ&rtCGQ$(n6cYp$0ZZQI5XOfeJVuU+J$ye1Py(> z^gSPSuatFJh=m!I#i;w1#Rqq9ONiKu@>?AWISPtt9L>p=jBYp8UOzVZXDrYaOtn&$ z-r#9D8P)4Fw(*NS;jCq*wg*~6;$>2XNUz%ySl6Y80LQisM3Es?@tTfcF>lSnkWihF ztHdiRDtVUYxC}|zIY#n`Q2w=)EtAM#)9^~smP?46n1_7QJ~!Q8?R~BDl3&lATv5&U zukzAdUKp|YXRJ)wfdKeQHGd~@g986kjZ6vclu4uxf$!9^tOiNQ-)(<*mkx&sOc4d( zCLPN8BTF?877SF}-@JEd@VSOt!u@>G3t1j5R3A5ixn0kXH&bgu8An%S%7NX zx|mFr5cw8AXm%-d_g3^H$2t$GGgs+H!)uy(;u}sIa_Pk#f?g%L3lAP80pOu*tPV~fAekn#L>>Jo8qknJglHIO*ZhCV^kUv0L;q}JvYue5-8LGy>+CevKdn?xX%7|Rxyl0!wq_Y3KY52pH~0SX%*LG*O(P{2wDr_uT?|5Fy(*L1>;iO0N90mQd4x+tr}-q3{mCBL1XIt(90 zZ5#-xRVnX=m_1yNP+q1~D+jRY!zf~n?z*--q z(8cR!KsJ0$Y;tniq$cO0wpb!HO@266d_zjgdFtB|hS9oeGEm(n>e8(E=$z|iMlWSJ zH6Yb~S9J#IVAh(xWSUjl`&R~;r23}f;(^%hNzq)Du|o>4G*=chD9MXeol4s)&uxL` z-BnzGZ!+@u^~Kdselll8=m?{CID7t?!#?#gjq~Cn^|B)8yH0!B^?Ki|-q#9auF*F@ zqpp8VCtag2RVj?c#OC6bib6Xl?>9~FcfLgy&zGeoREl>ANgH2l%#(ZHLS;``DMjza zZnQvyTs z@=$u`wH^(A4oe)2s?pQ*k$Gpn8R4`75^;GM^ov3#`twdm8oY~9r}C?{{f_{ihOo+g zo~j3J#EN&6dJ#+ecFTE)jPnpCVA<#XlKL@~1!l4DIYFXR(B{@6JhQ0%ph5dxD|&v- zg=f1d-DWg4A%aUSQORj#CcbKO(eM)sRCyOY^fODxqYfPtSW|Jw$O-gm>udc<3XZW= zCdRi0Y$$VA(ec5tUS?=_Pe9;lV5-Qevhz}y?<4$?7-h*3JVg4J)^3#H9y$DcsSLo+ zD7A;pR22^>rd7*UDLD_@bcA_7ORq2H#Ls#kg%gsxYzC|2~l%ka`QA(vqXugETUv{ zo7z(C^bUZ#AOlEzO?J!^r2U`{yE6Bo zuD+FDge@0Hie=9Q*MUF4t2odZX@ zAlhQEZ|Q>8%omGbQ>78Mu#TQWyqB&bO=>GH9_0MCzFs%2su#|&yM`?s)D!c|tFAm^ zE=1HDbj_DN-#wEm%rq=xz|S$aEyh0661lKvQ`6lx3-8!@f!%&&)6?TFUutDGIgCeE z8-*nzH4EWIIgF6OJjBF<-Okr~d|8bL?Q}v)WP`#7pdset`9>L$>^9S%Vp-ZECyrIz zanNw@0&F~qvKqu0=NRhZ{1B2zTia$CCQ?x-By5m7D19Mq zzGDl-;|2nUr>~-IS@UW`G6AEa1bd1Ltu;B4(72vAI3v1T-sF;?Sux*d?me8jV))1; zM91gnj3pNg z!k*r1qCHgxKP{k+M}meX9vaP9Id^_2##p6J*RFnKiJN>ymQS4>AqTn2N?eqj7Idyi z$}0r97(wA>`PVBNt=l!L?e$Etkg&1|&0znLXRP+%N5xMzBgx^3-MKst%NKDzY7vQeejSz$|UK$q7zhJUsByy^XzHwCfpjH2Kx8wV-5zpsVJB~iX zhhBcGuiNXS8KQkTu zD;KjYOrr3J4)g3pPD*ZX<{Rz+`mZi{k)>fd%BZNz+7DMdg2tL~Npy_F$o5p(?{SW1 zycKhdPMTlvj-keF?lu!^rJhd5+M6+uNipah0rFFRfxHX^MzmUVce|k4f9|d0#Sa0t zep#^?tz8Y)RMNX&19#!ycW?ATS(8r4^TbyU>rkA#Lu3TSR9~SCZ?TLF$ zXEJb&`=Y(sT_u>m-PIuxNAC$$>CRIM%PenH9G~2eF@F2=r=65V51wE^eH>;y14*^8 z53yMNXQxPSQ)1b5*R<~~pK;C1B`TajaoL_Uw ze0G!th!0>*pf{%c<*0J4{@YJ(pzen@a(+DoS%<5+G%FttJ8V9~!csmX6K8$T`>2-v zw8W-7Tbt(GKu|Epc^{Q)l9pr*y|I>^Xydq>Tg0$}LPV2zlSzH^55}6%phm=o^Ic z0D$m<_3w2Lr1Rt7#@1HLIY0JgDE3TBy}VaP%W#cwlUR hcYtm*-UwqN3y?Xkp}y-XWuG4b7#qO!8+2V0{sYX&m>B>7 literal 0 HcmV?d00001 diff --git a/resources/favicon/safari-pinned-tab.svg b/resources/favicon/safari-pinned-tab.svg new file mode 100644 index 0000000..f61f502 --- /dev/null +++ b/resources/favicon/safari-pinned-tab.svg @@ -0,0 +1,109 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + diff --git a/resources/favicon/site.webmanifest b/resources/favicon/site.webmanifest new file mode 100644 index 0000000..b20abb7 --- /dev/null +++ b/resources/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/resources/lang/en/cookie-notice.php b/resources/lang/en/cookie-notice.php new file mode 100644 index 0000000..0b116b2 --- /dev/null +++ b/resources/lang/en/cookie-notice.php @@ -0,0 +1,43 @@ + 'Customize cookies', + 'button_forbid' => 'Prohibit', + 'button_allow' => 'Allow', + 'button_forbid_all' => 'Reject all', + 'button_allow_all' => 'Accept all', + 'button_customize' => 'Customize', + 'button_back' => 'Back', + 'banner_title' => 'The :site_name website uses cookies!', + 'banner_text_open' => 'This website stores cookies on your computer. :site_name uses this information to improve and personalize your browsing experience, as well as for analysis and indicators concerning our visitors both on this website and on other media. You can click on "Accept" if you consent to the use of these cookies.', + 'banner_text' => 'We use cookies to ensure the smooth operation of our site and for analytical purposes. By continuing to browse this site or by closing this banner, you consent to the use of these cookies.', + 'banner_details' => 'If you refuse the use of cookies, your information will not be tracked during your visit to this site. A cookie will be used in your browser to remember not to track your preferences. Some features will not be accessible. You can change your mind and modify your consent at any time by returning to this site.', + 'banner_details_link' => 'To find out more about the cookies we use, please consult our privacy policy.', + 'banner_details_link_title' => 'Privacy policy', + 'banner_more_details' => 'More details...', + 'banner_less_details' => 'Fewer details...', + 'Panel_title' => 'Cookie management panel', + 'Panel_subtitle' => 'Your privacy is our priority', + 'Panel_details' => 'The functionalities of this site are based on services provided by third parties. If you accept, these third parties will deposit cookies that will enable you to view content on the site hosted by these third parties. Through these cookies, these third parties will collect and use your browsing data for their own purposes, in accordance with their privacy policy (link below). This page allows you to give or withdraw your consent, either globally or service by service.', + 'custom' => [ + 'youtube' => [ + 'name' => 'Youtube', + 'description' => 'Cookies placed via video sharing services are intended to allow the user to view multimedia content directly on the site.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to view this video', + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Audience measurement services are used to generate traffic statistics, which are useful for improving the site.', + 'labelLink' => 'Learn more', + ], + 'recaptcha' => [ + 'title' => 'reCAPTACHA', + 'description' => 'The purpose of the cookies placed on forms via the recaptcha is to prevent them from being submitted by robots.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to send the form', + ] + ] +]; diff --git a/resources/lang/fr/cookie-notice.php b/resources/lang/fr/cookie-notice.php new file mode 100644 index 0000000..b569e81 --- /dev/null +++ b/resources/lang/fr/cookie-notice.php @@ -0,0 +1,43 @@ + 'Personnaliser les cookies', + 'button_forbid' => 'Interdire', + 'button_allow' => 'Autoriser', + 'button_forbid_all' => 'Tout refuser', + 'button_allow_all' => 'Tout accepter', + 'button_customize' => 'Personnaliser', + 'button_back' => 'Retour', + 'banner_title' => 'Le site internet :site_name utilise des cookies !', + 'banner_text_open' => 'Ce site web stocke les cookies sur votre ordinateur. :site_name utilise ces informations afin d’améliorer et de personnaliser votre expérience de navigation, ainsi que pour l’analyse et les indicateurs concernant nos visiteurs à la fois sur ce site web et sur d’autres supports. Vous pouvez cliquer sur « Accepter » si vous consentez à l’utilisation de ces cookies.', + 'banner_text' => 'Nous utilisons des cookies pour nous assurer du bon fonctionnement de notre site et à des fins analytiques. En poursuivant votre navigation sur ce site ou en fermant ce bandeau, vous consentez à l’utilisationde ces cookies.', + 'banner_details' => 'Si vous refusez l’utilisation des cookies, vos informations ne seront pas suivies lors de votre visite sur ce site. Un cookie sera utilisé dans votre navigateur afin de se souvenir de ne pas suivre vos préférences. Certaines fonctionnalités ne seront pas accessibles. Vous pouvez changer d’avis et modifier votre consentement à tout moment en revenant sur ce site.', + 'banner_details_link' => 'Pour en savoir plus sur les cookies que nous utilisons, consultez notre charte de confidentialité.', + 'banner_details_link_title' => 'Charte de confidentialité', + 'banner_more_details' => 'Plus de détails...', + 'banner_less_details' => 'Moins de détails...', + 'Panel_title' => 'Panneau de gestion des cookies', + 'Panel_subtitle' => 'Le respect de votre vie privée est notre priorité', + 'Panel_details' => 'Les fonctionnalités de ce site s’appuient sur des services proposés par des tiers. Si vous acceptez, ces tiers déposeront des cookies qui vous permettront de visualiser sur le site du contenu hébergé par ces tiers. Via ces cookies, ces tiers collecteront et utiliseront vos données de navigation pour des finalités qui leur sont propres, conformément à leur politique de confidentialité (lien ci-dessous). Cette page vous permet de donner ou de retirer votre consentement, soit globalement soit service par service.', + 'custom' => [ + 'youtube' => [ + 'name' => 'Youtube', + 'description' => 'Les cookies placés via les services de partage de vidéos sont destinés à permettre à l\'utilisateur de visionner des contenus multimédias directement sur le site.', + 'labelLink' => 'En apprendre plus', + 'warning' => 'Vous devez accepter les cookies pour visionner cette vidéo', + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Les services de mesure d\'audience permettent de générer des statistiques de fréquentation utiles à l\'amélioration du site.', + 'labelLink' => 'En apprendre plus', + ], + 'recaptcha' => [ + 'title' => 'reCAPTACHA', + 'description' => 'Les cookies qui sont déposés via le recaptcha sur les formulaires ont pour finalité d\'empêcher que ceux-ci ne soient soumis par des robots.', + 'labelLink' => 'En apprendre plus', + 'warning' => 'Vous devez accepter les cookies pour envoyer le formulaire', + ] + ] +]; diff --git a/resources/views/pages/dashboard/index.blade.php b/resources/views/pages/dashboard/index.blade.php index fb78e68..8af4ebf 100644 --- a/resources/views/pages/dashboard/index.blade.php +++ b/resources/views/pages/dashboard/index.blade.php @@ -3,7 +3,7 @@ @section('content')

      {{ __('Dashboard') }}

      - + {{ __('Accéder au jeu') }}
      diff --git a/resources/views/vendor/errors/403.blade.php b/resources/views/vendor/errors/403.blade.php index 6bfeea2..de31d5c 100644 --- a/resources/views/vendor/errors/403.blade.php +++ b/resources/views/vendor/errors/403.blade.php @@ -8,6 +8,5 @@ @section('button', true) @section('image') -{{-- FIXME: Personaliser ca --}} - + @endsection diff --git a/resources/views/vendor/errors/404.blade.php b/resources/views/vendor/errors/404.blade.php index 4477635..02b2b13 100644 --- a/resources/views/vendor/errors/404.blade.php +++ b/resources/views/vendor/errors/404.blade.php @@ -8,6 +8,5 @@ @section('button', true) @section('image') -{{-- FIXME: Personaliser ca --}} - + @endsection diff --git a/resources/views/vendor/errors/503.blade.php b/resources/views/vendor/errors/503.blade.php index db3d417..edf601f 100644 --- a/resources/views/vendor/errors/503.blade.php +++ b/resources/views/vendor/errors/503.blade.php @@ -6,6 +6,5 @@ @section('submessage', __('Le site est en maintenance, nous reviendrons...')) @section('image') -{{-- FIXME: Personaliser ca --}} - + @endsection diff --git a/resources/views/vendor/errors/illustrated-layout.blade.php b/resources/views/vendor/errors/illustrated-layout.blade.php index 8d7e262..a277a37 100644 --- a/resources/views/vendor/errors/illustrated-layout.blade.php +++ b/resources/views/vendor/errors/illustrated-layout.blade.php @@ -1,48 +1,52 @@ - - - - @yield('title') + + + + @yield('title') - @vite(['resources/sass/fo/fo.scss']) - @stack('scripts') - - -
      -
      -
      -
      - @yield('code', __('Oh no')) -
      + @vite(['resources/sass/bo/bo.scss']) + @stack('scripts') + -
      + +
      +
      +
      +
      + @yield('code', __('Oh no')) +
      -

      - @yield('message') -

      +
      -

      - @yield('submessage') -

      +

      + @yield('message') +

      - @hasSection('button') - +

      + @yield('submessage') +

      + + @hasSection('button') +
      {{ __('Go to page :page', [ - 'page' => __('home') + 'page' => __('home'), ]) }} - @endif -
      -
      - -
      -
      - @yield('image') -
      + @endif
      - + +
      +
      + @yield('image') +
      +
      +
      + + diff --git a/resources/views/vendor/errors/minimal.blade.php b/resources/views/vendor/errors/minimal.blade.php index 4c7ce34..f20ce4d 100644 --- a/resources/views/vendor/errors/minimal.blade.php +++ b/resources/views/vendor/errors/minimal.blade.php @@ -1,29 +1,37 @@ - - - - @yield('title') + + + - + @yield('title') - @vite(['resources/sass/fo/fo.scss']) - @stack('scripts') - - -
      -
      -
      -
      - @yield('code') -
      + -
      - @yield('message') -
      + @vite(['resources/sass/bo/bo.scss']) + @stack('scripts') + + + +
      +
      +
      +
      + @yield('code') +
      + +
      + @yield('message')
      - +
      + + diff --git a/routes/web-bo.php b/routes/web-bo.php index 3e9d752..5270490 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -17,64 +17,60 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; // * BO -Route::prefix('bo') - ->name('bo.') - ->group(function () { - Route::namespace('\App\Http\Controllers\Bo') - ->group(function () { - Auth::routes( - [ - 'confirm' => false, - 'login' => true, - 'logout' => true, - 'register' => false, - 'reset' => false, - 'verify' => false, - ] - ); - }); - Route::middleware(['auth:backend', 'is-admin', 'is-super-admin']) - ->group(function () { - Route::get('/', [DashboardController::class, 'index']) - ->name('dashboard')->withoutMiddleware('is-super-admin'); - // * BANNED IPS - Route::resource('/bannedips', BannedIpController::class)->except('show'); - // * CONTENTS - Route::resource('/contents', ContentController::class) - ->only(['index', 'edit', 'update']) - ->withoutMiddleware('htmlsanitize') - ->middleware(['htmlsanitize:value']); - // * FAQ - THEMES - Route::resource('/faq-themes', FaqThemesController::class)->except('show'); - // * FAQ - QUESTIONS - Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); - // * GAIN VIEWS - Route::resource('/gain-views', GainViewController::class)->except('show'); - // * PRIZES - Route::resource('/prizes', PrizesController::class) - ->except('show') - ->withoutMiddleware('htmlsanitize') - ->middleware(['htmlsanitize:arg_content']); - // * RANGES - Route::resource('ranges', RangeController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); - // * PRODUCTS - Route::resource('products', ProductsController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); - // * SETTINGS. - Route::resource('/settings', SettingsController::class) - ->only(['edit', 'update']); - // * WINNERS LIST - Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); - // * INSTANT WIN - Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); - Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); - // * UNIQUES CODES. - Route::get('/codes', [CodesController::class, 'index'])->name('codes'); - Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); - Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); - Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); - }); +Route::prefix('bo')->name('bo.')->group(function () { + Route::namespace('\App\Http\Controllers\Bo')->group(function () { + Auth::routes( + [ + 'confirm' => false, + 'login' => true, + 'logout' => true, + 'register' => false, + 'reset' => false, + 'verify' => false, + ] + ); }); + Route::middleware(['auth:backend', 'is-admin', 'is-super-admin'])->group(function () { + Route::get('/', [DashboardController::class, 'index']) + ->name('dashboard')->withoutMiddleware('is-super-admin'); + // * BANNED IPS + Route::resource('/bannedips', BannedIpController::class)->except('show'); + // * CONTENTS + Route::resource('/contents', ContentController::class) + ->only(['index', 'edit', 'update']) + ->withoutMiddleware('htmlsanitize') + ->middleware(['htmlsanitize:value']); + // * FAQ - THEMES + Route::resource('/faq-themes', FaqThemesController::class)->except('show'); + // * FAQ - QUESTIONS + Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); + // * GAIN VIEWS + Route::resource('/gain-views', GainViewController::class)->except('show'); + // * PRIZES + Route::resource('/prizes', PrizesController::class) + ->except('show') + ->withoutMiddleware('htmlsanitize') + ->middleware(['htmlsanitize:arg_content']); + // * RANGES + Route::resource('ranges', RangeController::class) + ->except('show') + ->withoutMiddleware('is-super-admin'); + // * PRODUCTS + Route::resource('products', ProductsController::class) + ->except('show') + ->withoutMiddleware('is-super-admin'); + // * SETTINGS. + Route::resource('/settings', SettingsController::class) + ->only(['edit', 'update']); + // * WINNERS LIST + Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); + // * INSTANT WIN + Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); + Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); + // * UNIQUES CODES. + Route::get('/codes', [CodesController::class, 'index'])->name('codes'); + Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); + Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); + Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); + }); +}); diff --git a/routes/web-fo.php b/routes/web-fo.php index ae10084..c0fb325 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -1,20 +1,20 @@ middleware(['throttle:credentials'])->group(function () { +Route::middleware(['throttle:credentials'])->name('fo.')->group(function () { Route::middleware('game-date')->group(function () { // Routes nécessitant d'être connecté. Route::middleware('auth:frontend')->group(function () { diff --git a/routes/web-re7.php b/routes/web-re7.php index 63e3298..a9cbe0d 100644 --- a/routes/web-re7.php +++ b/routes/web-re7.php @@ -1,18 +1,16 @@ middleware(['re7']) - ->group(function () { - Route::get('/', [Re7Controller::class, 'index']); - Route::get('/teaser', [Re7Controller::class, 'teaser']); - Route::get('/mail-gain', [Re7Controller::class, 'prizeMail']); - Route::get('/mail-reduction', [Re7Controller::class, 'reductionMail']); - Route::get('/br', [Re7Controller::class, 'br']); - // phpcs:ignore - // TODO : Rendre dynamique la partie gain par rapport au BO. - Route::get('/gain1', [Re7Controller::class, 'gain1']); - Route::get('/gain2', [Re7Controller::class, 'gain2']); - }); +Route::prefix('re7')->name('re7.')->middleware(['re7'])->group(function () { + Route::get('/', [Re7Controller::class, 'index'])->name('index'); + Route::get('/teaser', [Re7Controller::class, 'teaser'])->name('teaser'); + Route::get('/mail-gain', [Re7Controller::class, 'prizeMail'])->name('mail-gain'); + Route::get('/mail-reduction', [Re7Controller::class, 'reductionMail'])->name('mail-reduction'); + Route::get('/br', [Re7Controller::class, 'br'])->name('br'); + // phpcs:ignore + // TODO : Rendre dynamique la partie gain par rapport au BO. + Route::get('/gain1', [Re7Controller::class, 'gain1'])->name('gain1'); + Route::get('/gain2', [Re7Controller::class, 'gain2'])->name('gain2'); +}); diff --git a/vite.config.ts b/vite.config.ts index a35e78d..fed29d1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,7 @@ import vue from "@vitejs/plugin-vue"; import laravel from "laravel-vite-plugin"; import path from "path"; import postcssDiscard from "postcss-discard-comments"; +import copy from "rollup-plugin-copy"; import { defineConfig, loadEnv } from "vite"; import babel from "vite-plugin-babel"; import checker from "vite-plugin-checker"; @@ -77,6 +78,43 @@ export default defineConfig({ ], refresh: true, }), + copy({ + targets: [ + { + src: [ + // * Logo for Bo error pages + path.normalize("resources/assets/images/engine/logo.png"), + // * Engine copy (Default favicon) + path.normalize("resources/favicon/android-chrome-192x192.png"), + path.normalize("resources/favicon/android-chrome-512x512.png"), + path.normalize("resources/favicon/apple-touch-icon.png"), + path.normalize("resources/favicon/browserconfig.xml"), + path.normalize("resources/favicon/browserconfig.xml"), + path.normalize("resources/favicon/favicon-16x16.png"), + path.normalize("resources/favicon/favicon-32x32.png"), + path.normalize("resources/favicon/favicon.ico"), + path.normalize("resources/favicon/mstile-150x150.png"), + path.normalize("resources/favicon/safari-pinned-tab.svg"), + path.normalize("resources/favicon/site.webmanifest"), + // * Theme Copy (override if present) favicon + path.normalize("resources/theme/mounted/favicon/android-chrome-192x192.png"), + path.normalize("resources/theme/mounted/favicon/android-chrome-512x512.png"), + path.normalize("resources/theme/mounted/favicon/apple-touch-icon.png"), + path.normalize("resources/theme/mounted/favicon/browserconfig.xml"), + path.normalize("resources/theme/mounted/favicon/browserconfig.xml"), + path.normalize("resources/theme/mounted/favicon/favicon-16x16.png"), + path.normalize("resources/theme/mounted/favicon/favicon-32x32.png"), + path.normalize("resources/theme/mounted/favicon/favicon.ico"), + path.normalize("resources/theme/mounted/favicon/mstile-150x150.png"), + path.normalize("resources/theme/mounted/favicon/safari-pinned-tab.svg"), + path.normalize("resources/theme/mounted/favicon/site.webmanifest"), + ], + dest: path.normalize("public") + }, + ], + copyOnce: true, + verbose: true + }), stylelint({ dev: false, build: true, From d208854fb058bb684b4c5560b69a535ca737bdf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Thu, 23 Nov 2023 17:31:28 +0100 Subject: [PATCH 029/145] Tmp back overhaul with base project --- README.md | 8 + README.txt | 4 - app/Console/Commands/ExportCodesUniques.php | 6 +- app/Console/Commands/TestMail.php | 5 +- app/Console/Commands/UserCreate.php | 62 +-- .../ActivityLogs/ActivityLogsEventEnum.php | 46 ++ app/Enums/InputType.php | 30 ++ .../ItemsPerPaginationEnum.php | 4 +- app/Enums/StaticPageType.php | 25 + app/Enums/Theme/BootstrapThemeEnum.php | 21 + .../Controllers/Bo/ActivityLogController.php | 71 +++ .../Controllers/Bo/Auth/LoginController.php | 20 +- .../Controllers/Bo/BannedIpController.php | 4 +- app/Http/Controllers/Bo/CodesController.php | 59 ++- app/Http/Controllers/Bo/ContentController.php | 91 ---- .../Controllers/Bo/FaqQuestionsController.php | 4 +- .../Controllers/Bo/FaqThemesController.php | 2 +- .../Controllers/Bo/GainViewController.php | 2 +- app/Http/Controllers/Bo/PrizesController.php | 2 +- .../Controllers/Bo/ProductsController.php | 2 +- app/Http/Controllers/Bo/RangeController.php | 2 +- .../Controllers/Bo/StaticPageController.php | 91 ++++ app/Http/Controllers/Bo/UserController.php | 169 +++++++ .../Controllers/Bo/WinnersListController.php | 2 +- app/Http/Controllers/Controller.php | 144 ++++-- app/Http/Controllers/Fo/EndPageController.php | 2 +- .../Controllers/Fo/EnterCodeController.php | 6 +- app/Http/Controllers/Fo/FAQController.php | 2 +- app/Http/Controllers/Fo/GainsController.php | 2 +- .../Controllers/Fo/HowToPlayController.php | 2 +- app/Http/Controllers/Fo/LoginController.php | 10 +- app/Http/Controllers/Fo/TeaserController.php | 2 +- .../Controllers/Fo/ViewContentController.php | 2 +- .../Controllers/Fo/WinningProofController.php | 4 +- app/Http/Kernel.php | 7 +- app/Http/Middleware/IsAdmin.php | 18 +- app/Http/Middleware/IsSuperAdmin.php | 18 +- app/Http/Middleware/Re7Middleware.php | 2 +- .../Middleware/RedirectIfAuthenticated.php | 5 +- app/Http/Middleware/TrustProxies.php | 2 +- .../Requests/{ => Bo}/CodeSearchRequest.php | 9 +- .../Bo/Contents/UpdateContentRequest.php | 42 -- .../Requests/{ => Bo}/ExportCodesRequest.php | 13 +- .../{ => Bo}/GenerateCodesRequest.php | 6 +- .../StaticPages/UpdateStaticPageRequest.php | 46 ++ .../Requests/Bo/Users/StoreUserRequest.php | 74 +++ .../Requests/Bo/Users/UpdateUserRequest.php | 48 ++ .../Controllers => Http/Requests/Fo}/.gitkeep | 0 app/Jobs/ProcessExportCodesUniques.php | 65 +-- app/Jobs/ProcessUniqueCode.php | 136 +++--- app/Lib/Helpers/CollectionHelper.php | 2 +- app/Lib/Helpers/FileStorageHelper.php | 2 +- app/Lib/Helpers/ToolboxHelper.php | 55 +-- {class => app/Lib/venvor}/MesBR.php | 0 app/Mail/CodeGenerationEnd.php | 56 +-- app/Mail/JobFailed.php | 11 +- app/Models/ActivityLog.php | 129 ++++++ app/Models/Code.php | 18 + app/Models/Content.php | 25 - app/Models/Settings.php | 2 +- app/Models/StaticPage.php | 87 ++++ app/Models/User.php | 77 +++- app/Observers/ModelObserver.php | 54 +++ app/Policies/Rules/UserStaticRules.php | 47 ++ app/Policies/StaticPagePolicy.php | 36 ++ app/Policies/UserPolicy.php | 129 ++++++ app/Providers/AppServiceProvider.php | 11 +- app/Providers/AuthServiceProvider.php | 12 +- app/Providers/EventServiceProvider.php | 13 +- app/Providers/TranslationServiceProvider.php | 2 +- app/Providers/ViewServiceProvider.php | 36 +- app/Traits/Controllers/ChangesModelOrder.php | 57 +++ .../Controllers/UpdateModelPublished.php | 26 ++ app/Traits/Enums/BaseEnum.php | 48 +- app/Traits/Models/ActivityLog.php | 23 + class/LDCCRM_V1.php | 162 ------- composer.json | 18 +- config/app.php | 20 +- config/auth.php | 17 +- config/breadcrumbs.php | 2 +- config/broadcasting.php | 2 +- config/cache.php | 12 +- config/filesystems.php | 18 +- config/hashing.php | 2 +- config/logging.php | 1 + config/mail.php | 16 +- config/queue.php | 2 +- config/session.php | 4 +- database/factories/UserFactory.php | 44 ++ .../2014_10_12_000000_create_users_table.php | 8 +- ...12_100000_create_password_resets_table.php | 4 +- ..._08_19_000000_create_failed_jobs_table.php | 6 +- .../2020_10_20_165858_create_codes.php | 2 +- .../2020_10_23_153212_create_contents.php | 33 -- ...9_08_102717_create_actitivy_logs_table.php | 39 ++ .../2023_10_19_094711_create_static_pages.php | 46 ++ database/seeders/ContentSeeder.php | 33 -- database/seeders/DatabaseSeeder.php | 2 +- database/seeders/StaticPageSeeder.php | 55 +++ database/seeders/UserSeeder.php | 19 + public/logo.png | Bin 49286 -> 0 bytes resources/lang/en.json | 54 +++ resources/lang/en/auth.php | 18 +- resources/lang/en/crud.php | 83 ++++ resources/lang/en/enums.php | 3 + resources/lang/en/http-statuses.php | 84 ++++ resources/lang/en/models.php | 9 + resources/lang/en/pagination.php | 23 +- resources/lang/en/passwords.php | 23 +- resources/lang/en/recaptcha.php | 6 + resources/lang/en/validation.php | 338 ++++++++------ resources/lang/en/vue.php | 38 ++ resources/lang/fr.json | 189 ++------ resources/lang/fr/auth.php | 17 +- resources/lang/fr/crud.php | 123 +++-- resources/lang/fr/http-statuses.php | 84 ++++ resources/lang/fr/models.php | 5 +- resources/lang/fr/pagination.php | 21 +- resources/lang/fr/passwords.php | 17 +- resources/lang/fr/recaptcha.php | 6 + resources/lang/fr/validation.php | 198 +++++--- resources/lang/fr/vue.php | 56 ++- .../{bo => }/base/_bootstrap-overload.scss | 0 resources/sass/{bo => }/base/_common.scss | 0 resources/sass/{bo => }/base/_fonts.scss | 0 resources/sass/{bo => }/bo.scss | 0 resources/sass/bo/_variables.scss | 19 - resources/sass/{bo => }/pages/.gitkeep | 0 resources/sass/{bo => }/partials/.gitkeep | 0 .../{bo => }/utilities/_bootstrap-custom.scss | 0 .../utilities/_bootstrap-variables.scss | 0 .../sass/{bo => }/utilities/_mixins.scss | 0 .../sass/{bo => }/utilities/_variables.scss | 0 .../sass/{bo => }/vendor/_bootstrap.scss | 0 .../{bo => }/vendor/_ckEditorContent.scss | 0 resources/ts/{bo => }/base/common.ts | 2 +- resources/ts/{bo => }/bo.ts | 4 +- resources/ts/bo/components/shims-vue.d.ts | 6 - resources/ts/bo/utilities/bootstrap.ts | 21 - resources/ts/bo/utilities/fontawesome.ts | 94 ---- .../BelongsToManyDropdownComponent.vue | 13 +- .../{bo => }/components/CkEditorComponent.vue | 112 +++-- .../components/DashboardChartComponent.vue | 0 .../components/ImageInputComponent.vue | 435 +++++++++--------- .../components/InputTextAutoComponent.vue | 2 +- .../components/InstantWinComponent.vue | 4 +- .../ts/components/PasswordVisibility.vue | 124 +++++ .../components/WebCouponsComponent.vue | 0 .../{bo => }/components/WinNotification.vue | 0 .../components/WordCounterComponent.vue | 35 +- resources/ts/utilities/bootstrap.ts | 2 +- resources/ts/utilities/fontawesome.ts | 27 +- resources/ts/{bo => }/utilities/vue-bo.ts | 0 .../breadcrumbs/breadcrumb-body.blade.php | 12 - .../breadcrumbs/breadcrumb-head.blade.php | 9 - .../breadcrumbs/breadcrumb-layout.blade.php | 17 - resources/views/layout.blade.php | 85 +--- resources/views/layouts/footer.blade.php | 12 +- resources/views/layouts/head.blade.php | 28 +- resources/views/layouts/header.blade.php | 83 ++++ resources/views/layouts/nav-list.blade.php | 139 ++++++ resources/views/layouts/nav-menu.blade.php | 103 ----- .../breadcrumbs/breadcrumb-body.blade.php | 7 + .../breadcrumbs/breadcrumb-head.blade.php | 10 + .../breadcrumbs/breadcrumb-layout.blade.php | 17 + .../modules/change-model-order.blade.php | 32 ++ .../modules/change-published-status.blade.php | 20 + resources/views/modules/pagination.blade.php | 248 +++++----- resources/views/modules/search-bar.blade.php | 44 +- .../views/modules/table-col-sorter.blade.php | 131 +++--- .../pages/activity_logs/index-list.blade.php | 72 +++ .../views/pages/activity_logs/index.blade.php | 15 + .../views/pages/activity_logs/show.blade.php | 121 +++++ .../views/pages/banned-ips/create.blade.php | 2 +- .../views/pages/banned-ips/edit.blade.php | 2 +- .../pages/banned-ips/form-inputs.blade.php | 10 +- .../views/pages/banned-ips/index.blade.php | 4 +- .../views/pages/codes/form-inputs.blade.php | 12 +- resources/views/pages/codes/index.blade.php | 2 +- resources/views/pages/codes/search.blade.php | 2 +- resources/views/pages/contents/edit.blade.php | 41 -- .../pages/contents/form-inputs.blade.php | 39 -- .../views/pages/contents/index.blade.php | 43 -- .../views/pages/dashboard/index.blade.php | 2 +- .../pages/faq-questions/create.blade.php | 2 +- .../views/pages/faq-questions/edit.blade.php | 2 +- .../pages/faq-questions/form-inputs.blade.php | 16 +- .../views/pages/faq-questions/index.blade.php | 4 +- .../views/pages/faq-themes/create.blade.php | 2 +- .../views/pages/faq-themes/edit.blade.php | 2 +- .../pages/faq-themes/form-inputs.blade.php | 4 +- .../views/pages/faq-themes/index.blade.php | 2 +- .../views/pages/gain-views/create.blade.php | 2 +- .../views/pages/gain-views/edit.blade.php | 2 +- .../pages/gain-views/form-inputs.blade.php | 4 +- .../views/pages/gain-views/index.blade.php | 2 +- resources/views/pages/prizes/create.blade.php | 2 +- resources/views/pages/prizes/edit.blade.php | 2 +- .../views/pages/prizes/form-inputs.blade.php | 20 +- resources/views/pages/prizes/index.blade.php | 4 +- .../views/pages/products/create.blade.php | 2 +- resources/views/pages/products/edit.blade.php | 2 +- .../pages/products/form-inputs.blade.php | 10 +- .../views/pages/products/index.blade.php | 2 +- resources/views/pages/ranges/create.blade.php | 2 +- resources/views/pages/ranges/edit.blade.php | 2 +- .../views/pages/ranges/form-inputs.blade.php | 4 +- resources/views/pages/ranges/index.blade.php | 2 +- resources/views/pages/settings/edit.blade.php | 2 +- .../pages/settings/form-inputs.blade.php | 110 ++--- .../views/pages/static_pages/edit.blade.php | 39 ++ .../views/pages/static_pages/form.blade.php | 171 +++++++ .../pages/static_pages/index-list.blade.php | 45 ++ .../views/pages/static_pages/index.blade.php | 15 + resources/views/pages/users/create.blade.php | 36 ++ resources/views/pages/users/edit.blade.php | 52 +++ resources/views/pages/users/form.blade.php | 173 +++++++ .../views/pages/users/index-list.blade.php | 70 +++ resources/views/pages/users/index.blade.php | 21 + .../views/pages/winners-list/index.blade.php | 2 +- .../partials/inputs/varchar-email.blade.php | 33 ++ .../inputs/varchar-password.blade.php | 44 ++ .../errors/illustrated-layout.blade.php | 2 +- .../views/vendor/errors/minimal.blade.php | 2 +- routes/breadcrumbs-bo.php | 15 +- routes/web-bo.php | 114 +++-- routes/web-fo.php | 2 +- vite.config.ts | 6 +- 228 files changed, 5045 insertions(+), 2590 deletions(-) delete mode 100644 README.txt create mode 100644 app/Enums/ActivityLogs/ActivityLogsEventEnum.php create mode 100644 app/Enums/InputType.php rename app/Enums/{ => Pagination}/ItemsPerPaginationEnum.php (77%) create mode 100644 app/Enums/StaticPageType.php create mode 100644 app/Enums/Theme/BootstrapThemeEnum.php create mode 100644 app/Http/Controllers/Bo/ActivityLogController.php delete mode 100644 app/Http/Controllers/Bo/ContentController.php create mode 100644 app/Http/Controllers/Bo/StaticPageController.php create mode 100644 app/Http/Controllers/Bo/UserController.php rename app/Http/Requests/{ => Bo}/CodeSearchRequest.php (69%) delete mode 100644 app/Http/Requests/Bo/Contents/UpdateContentRequest.php rename app/Http/Requests/{ => Bo}/ExportCodesRequest.php (79%) rename app/Http/Requests/{ => Bo}/GenerateCodesRequest.php (76%) create mode 100644 app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php create mode 100644 app/Http/Requests/Bo/Users/StoreUserRequest.php create mode 100644 app/Http/Requests/Bo/Users/UpdateUserRequest.php rename app/{Traits/Controllers => Http/Requests/Fo}/.gitkeep (100%) rename {class => app/Lib/venvor}/MesBR.php (100%) create mode 100644 app/Models/ActivityLog.php delete mode 100644 app/Models/Content.php create mode 100644 app/Models/StaticPage.php create mode 100644 app/Observers/ModelObserver.php create mode 100644 app/Policies/Rules/UserStaticRules.php create mode 100644 app/Policies/StaticPagePolicy.php create mode 100644 app/Policies/UserPolicy.php create mode 100644 app/Traits/Controllers/ChangesModelOrder.php create mode 100644 app/Traits/Controllers/UpdateModelPublished.php create mode 100644 app/Traits/Models/ActivityLog.php delete mode 100644 class/LDCCRM_V1.php create mode 100644 database/factories/UserFactory.php delete mode 100644 database/migrations/2020_10_23_153212_create_contents.php create mode 100644 database/migrations/2023_09_08_102717_create_actitivy_logs_table.php create mode 100644 database/migrations/2023_10_19_094711_create_static_pages.php delete mode 100644 database/seeders/ContentSeeder.php create mode 100644 database/seeders/StaticPageSeeder.php create mode 100644 database/seeders/UserSeeder.php delete mode 100644 public/logo.png create mode 100644 resources/lang/en.json create mode 100644 resources/lang/en/crud.php create mode 100644 resources/lang/en/enums.php create mode 100644 resources/lang/en/http-statuses.php create mode 100644 resources/lang/en/models.php create mode 100644 resources/lang/en/recaptcha.php create mode 100644 resources/lang/en/vue.php create mode 100644 resources/lang/fr/http-statuses.php create mode 100644 resources/lang/fr/recaptcha.php rename resources/sass/{bo => }/base/_bootstrap-overload.scss (100%) rename resources/sass/{bo => }/base/_common.scss (100%) rename resources/sass/{bo => }/base/_fonts.scss (100%) rename resources/sass/{bo => }/bo.scss (100%) delete mode 100644 resources/sass/bo/_variables.scss rename resources/sass/{bo => }/pages/.gitkeep (100%) rename resources/sass/{bo => }/partials/.gitkeep (100%) rename resources/sass/{bo => }/utilities/_bootstrap-custom.scss (100%) rename resources/sass/{bo => }/utilities/_bootstrap-variables.scss (100%) rename resources/sass/{bo => }/utilities/_mixins.scss (100%) rename resources/sass/{bo => }/utilities/_variables.scss (100%) rename resources/sass/{bo => }/vendor/_bootstrap.scss (100%) rename resources/sass/{bo => }/vendor/_ckEditorContent.scss (100%) rename resources/ts/{bo => }/base/common.ts (95%) rename resources/ts/{bo => }/bo.ts (71%) delete mode 100644 resources/ts/bo/components/shims-vue.d.ts delete mode 100644 resources/ts/bo/utilities/bootstrap.ts delete mode 100644 resources/ts/bo/utilities/fontawesome.ts rename resources/ts/{bo => }/components/BelongsToManyDropdownComponent.vue (96%) rename resources/ts/{bo => }/components/CkEditorComponent.vue (81%) rename resources/ts/{bo => }/components/DashboardChartComponent.vue (100%) rename resources/ts/{bo => }/components/ImageInputComponent.vue (72%) rename resources/ts/{bo => }/components/InputTextAutoComponent.vue (98%) rename resources/ts/{bo => }/components/InstantWinComponent.vue (97%) create mode 100644 resources/ts/components/PasswordVisibility.vue rename resources/ts/{bo => }/components/WebCouponsComponent.vue (100%) rename resources/ts/{bo => }/components/WinNotification.vue (100%) rename resources/ts/{bo => }/components/WordCounterComponent.vue (82%) rename resources/ts/{bo => }/utilities/vue-bo.ts (100%) delete mode 100644 resources/views/breadcrumbs/breadcrumb-body.blade.php delete mode 100644 resources/views/breadcrumbs/breadcrumb-head.blade.php delete mode 100644 resources/views/breadcrumbs/breadcrumb-layout.blade.php create mode 100644 resources/views/layouts/header.blade.php create mode 100644 resources/views/layouts/nav-list.blade.php delete mode 100644 resources/views/layouts/nav-menu.blade.php create mode 100644 resources/views/modules/breadcrumbs/breadcrumb-body.blade.php create mode 100644 resources/views/modules/breadcrumbs/breadcrumb-head.blade.php create mode 100644 resources/views/modules/breadcrumbs/breadcrumb-layout.blade.php create mode 100644 resources/views/modules/change-model-order.blade.php create mode 100644 resources/views/modules/change-published-status.blade.php create mode 100644 resources/views/pages/activity_logs/index-list.blade.php create mode 100644 resources/views/pages/activity_logs/index.blade.php create mode 100644 resources/views/pages/activity_logs/show.blade.php delete mode 100644 resources/views/pages/contents/edit.blade.php delete mode 100644 resources/views/pages/contents/form-inputs.blade.php delete mode 100644 resources/views/pages/contents/index.blade.php create mode 100644 resources/views/pages/static_pages/edit.blade.php create mode 100644 resources/views/pages/static_pages/form.blade.php create mode 100644 resources/views/pages/static_pages/index-list.blade.php create mode 100644 resources/views/pages/static_pages/index.blade.php create mode 100644 resources/views/pages/users/create.blade.php create mode 100644 resources/views/pages/users/edit.blade.php create mode 100644 resources/views/pages/users/form.blade.php create mode 100644 resources/views/pages/users/index-list.blade.php create mode 100644 resources/views/pages/users/index.blade.php create mode 100644 resources/views/partials/inputs/varchar-email.blade.php create mode 100644 resources/views/partials/inputs/varchar-password.blade.php diff --git a/README.md b/README.md index 569171c..598539a 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,11 @@ Choisir un thème dans le dépôt des thèmes `gen-game-web`, puis copier les fi - SH - Soucis de connexion / déconnexion quand le jeu est terminé et que l'adresse du jeu redirige vers une autre adresse : si on se déconnecte et qu'on revient sur le bo, on est toujours connecté -> MJ - Pour que le cookie soit delete il ne faut pas renvoyer un 302 juste apres le disconnect ``` + + +## Generation des codes + +`artisan queue:work` + +En cas de manipulation pourrie, penser a vider le cache pour supprimer le lock +sur le job de generation des codes. diff --git a/README.txt b/README.txt deleted file mode 100644 index b4a8c3a..0000000 --- a/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -git checkout --orphan master -git add . -git commit -m "Initial commit" -git push \ No newline at end of file diff --git a/app/Console/Commands/ExportCodesUniques.php b/app/Console/Commands/ExportCodesUniques.php index 2aa2e4a..83944d8 100644 --- a/app/Console/Commands/ExportCodesUniques.php +++ b/app/Console/Commands/ExportCodesUniques.php @@ -109,8 +109,8 @@ class ExportCodesUniques extends Command $this->info("L'archive CodesUniques_" . date('dmY') . ".zip a ete creer."); // Envoi de mail à MAIL_ADMIN avec le nom du ZIP "CodesUniques_". date('dmY') .".zip" . - Mail::to(config('mail.MAIL_ADMIN')) - ->send(new MailExportCodesUniques($nbCodeFic, $nbCodeTot, $nbCodeLigne)); + Mail::to(config('mail.admin')) + ->send(new MailExportCodesUniques($nbCodeFic, $nbCodeTot, $nbCodeLigne)); return 0; } @@ -210,6 +210,6 @@ class ExportCodesUniques extends Command Code::whereIn('id', $exportedCodesId)->update(['code_exported' => 1]); } } //end if - }//end foreach + } //end foreach } } diff --git a/app/Console/Commands/TestMail.php b/app/Console/Commands/TestMail.php index ae0936b..176f35a 100644 --- a/app/Console/Commands/TestMail.php +++ b/app/Console/Commands/TestMail.php @@ -12,7 +12,7 @@ class TestMail extends Command * * @var string */ - protected $signature = 'uwil:mail-test'; + protected $signature = 'uwil:mail:test'; /** * The console command description. @@ -24,13 +24,12 @@ class TestMail extends Command /** * Execute the console command. * - * @return integer + * @return void */ public function handle() { Mail::raw(sprintf('UWIL mail-test from %s %s', \config('app.name'), \config('app.url')), function ($msg) { $msg->to('equipe.web@ldc.fr')->subject('Test Email'); }); - return 0; } } diff --git a/app/Console/Commands/UserCreate.php b/app/Console/Commands/UserCreate.php index b14d954..95c8dd2 100644 --- a/app/Console/Commands/UserCreate.php +++ b/app/Console/Commands/UserCreate.php @@ -16,7 +16,7 @@ class UserCreate extends Command * * @var string */ - protected $signature = 'user:create'; + protected $signature = 'uwil:user:create'; /** * The console command description. @@ -26,18 +26,18 @@ class UserCreate extends Command protected $description = 'Create a backend admin user'; /** - * The firstname of the new user. + * The first name of the new user. * * @var string */ - protected $firstname; + protected $first_name; /** - * The lastname of the new user. + * The last name of the new user. * * @var string */ - protected $lastname; + protected $last_name; /** * The email of the new user. @@ -67,11 +67,11 @@ class UserCreate extends Command */ public function handle(): int { - $this->firstname = null; - $this->addFirstname(); + $this->first_name = null; + $this->addFirstName(); - $this->lastname = null; - $this->addLastname(); + $this->last_name = null; + $this->addLastName(); $this->email = null; $this->addEmail(); @@ -83,8 +83,8 @@ class UserCreate extends Command $this->addRole(); $user = new User([ - 'firstname' => $this->firstname, - 'lastname' => $this->lastname, + 'first_name' => $this->first_name, + 'last_name' => $this->last_name, 'email' => $this->email, 'password' => $this->password, 'role' => $this->role, @@ -99,23 +99,23 @@ class UserCreate extends Command } /** - * Add a firstname to the user. + * Add a first name to the user. * * @return void */ - private function addFirstname(): void + private function addFirstName(): void { - while (is_null($this->firstname)) { + while (is_null($this->first_name)) { try { - $tmp = $this->ask('Type the wanted user firstname', 'Admin'); - $validator = Validator::make(['firstname' => $tmp], [ - 'firstname' => 'required|min:3|max:255' + $tmp = $this->ask('Type the wanted user first name', 'Admin'); + $validator = Validator::make(['first_name' => $tmp], [ + 'first_name' => 'required|min:3|max:255' ]); $validator->validate(); - $this->firstname = $tmp; + $this->first_name = $tmp; } catch (ValidationException $e) { $this->error(sprintf( - 'Please provide a valid firstname %s', + 'Please provide a valid first name %s', \implode(',', collect($e->errors())->flatten()->all()) )); continue; @@ -124,23 +124,23 @@ class UserCreate extends Command } /** - * Add a lastname to the user. + * Add a last name to the user. * * @return void */ - private function addLastname(): void + private function addLastName(): void { - while (is_null($this->lastname)) { + while (is_null($this->last_name)) { try { - $tmp = $this->ask('Type the wanted user lastname', 'Saïtama'); - $validator = Validator::make(['lastname' => $tmp], [ - 'lastname' => 'required|min:3|max:255' + $tmp = $this->ask('Type the wanted user last name', 'Saïtama'); + $validator = Validator::make(['last_name' => $tmp], [ + 'last_name' => 'required|min:3|max:255' ]); $validator->validate(); - $this->lastname = $tmp; + $this->last_name = $tmp; } catch (ValidationException $e) { $this->error(sprintf( - 'Please provide a valid lastname %s', + 'Please provide a valid last_name %s', \implode(',', collect($e->errors())->flatten()->all()) )); continue; @@ -200,15 +200,15 @@ class UserCreate extends Command try { $tmp = $this->choice( 'Select his role', - [RoleEnum::conceptor->label(), RoleEnum::admin->label()], - RoleEnum::admin->label(), + [RoleEnum::conceptor->name, RoleEnum::admin->name], + RoleEnum::admin->name, $maxAttempts = null, $allowMultipleSelections = false ); - if ($tmp === RoleEnum::conceptor->label()) { + if ($tmp === RoleEnum::conceptor->name) { $tmp = RoleEnum::conceptor; } - if ($tmp === RoleEnum::admin->label()) { + if ($tmp === RoleEnum::admin->name) { $tmp = RoleEnum::admin; } $validator = Validator::make(['role' => $tmp], [ diff --git a/app/Enums/ActivityLogs/ActivityLogsEventEnum.php b/app/Enums/ActivityLogs/ActivityLogsEventEnum.php new file mode 100644 index 0000000..ebb098c --- /dev/null +++ b/app/Enums/ActivityLogs/ActivityLogsEventEnum.php @@ -0,0 +1,46 @@ +name => 'Création', + self::updated->name => 'Mise à jour', + self::duplicated->name => 'Duplication', + self::deleted->name => 'Suppression', + ]; + + + /** + * Custom added classes definition + */ + private const BOOTSTRAPCLASS = [ + self::created->name => 'success', + self::updated->name => 'warning', + self::duplicated->name => 'secondary', + self::deleted->name => 'danger', + ]; + + /** + * Get Class + * + * @return string + */ + public function bootstrapClass(): string + { + return self::BOOTSTRAPCLASS[$this->name]; + } +} diff --git a/app/Enums/InputType.php b/app/Enums/InputType.php new file mode 100644 index 0000000..0b59d29 --- /dev/null +++ b/app/Enums/InputType.php @@ -0,0 +1,30 @@ +name => 'Contact', + self::legals->name => 'Mentions légales', + self::rules->name => 'Règlement', + self::confidentiality->name => 'Charte de confidentialité', + ]; +} diff --git a/app/Enums/Theme/BootstrapThemeEnum.php b/app/Enums/Theme/BootstrapThemeEnum.php new file mode 100644 index 0000000..f1f3725 --- /dev/null +++ b/app/Enums/Theme/BootstrapThemeEnum.php @@ -0,0 +1,21 @@ +name => 'Light', + self::dark->name => 'Dark', + ]; +} diff --git a/app/Http/Controllers/Bo/ActivityLogController.php b/app/Http/Controllers/Bo/ActivityLogController.php new file mode 100644 index 0000000..7f79987 --- /dev/null +++ b/app/Http/Controllers/Bo/ActivityLogController.php @@ -0,0 +1,71 @@ +authorize('isConceptor'); + /** @var \Illuminate\Database\Eloquent\Builder $query */ + $query = ActivityLog::query()->with('user'); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $query, + $search, + null, + 'model_class', + ); + } + $searchFields = \implode(', ', [ + trans('validation.custom.target'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($query); + + /** Custom pagination */ + $activitylogModels = $this->paginate($query); + + return view('back::pages.activity_logs.index', compact('activitylogModels', 'search', 'searchFields')); + } + + /** + * Show the form for editing the specified resource. + * + * @param App\Models\ActivityLog $activity_log + * @return \Illuminate\Contracts\View\View + */ + public function show(ActivityLog $activity_log): \Illuminate\Contracts\View\View + { + $this->authorize('isConceptor'); + $targetModelClass = $activity_log->model_class; + $targetModel = $activity_log->model_class::where( + (new $targetModelClass())->getRouteKeyName(), + $activity_log->model_id + )->first(); + + return view('back::pages.activity_logs.show', [ + 'activitylogModel' => $activity_log, + 'targetModel' => $targetModel, + ]); + } +} diff --git a/app/Http/Controllers/Bo/Auth/LoginController.php b/app/Http/Controllers/Bo/Auth/LoginController.php index fa9aff9..314f43e 100644 --- a/app/Http/Controllers/Bo/Auth/LoginController.php +++ b/app/Http/Controllers/Bo/Auth/LoginController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use Illuminate\Contracts\Auth\StatefulGuard; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\AuthenticatesUsers; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class LoginController extends Controller @@ -39,7 +40,7 @@ class LoginController extends Controller */ public function showLoginForm(): View { - return view('back::auth.login'); + return view('bo.auth.login'); } /** @@ -51,4 +52,21 @@ class LoginController extends Controller { return response()->redirectToIntended()->getTargetUrl(); } + + /** + * Attempt to log the user into the application. + * + * @param \Illuminate\Http\Request $request + * @return boolean + */ + protected function attemptLogin(Request $request) + { + $credentials = $this->credentials($request); + // * Attempt login only using published users. + $credentials['published'] = true; + return $this->guard()->attempt( + $credentials, + $request->boolean('remember') + ); + } } diff --git a/app/Http/Controllers/Bo/BannedIpController.php b/app/Http/Controllers/Bo/BannedIpController.php index 5d78c15..864dfff 100644 --- a/app/Http/Controllers/Bo/BannedIpController.php +++ b/app/Http/Controllers/Bo/BannedIpController.php @@ -33,13 +33,13 @@ class BannedIpController extends Controller 'ip', ); } - $searchFields = trans('validation.attributes.ip'); + $searchFields = trans('validation.custom.ip'); /** Sort columns with a query */ $this->sortQuery($bannedipModels); /** Custom pagination */ - $bannedipModels = $this->customPaginate($bannedipModels, $request->pagination); + $bannedipModels = $this->paginate($bannedipModels); return view('back::pages.banned-ips.index', compact('bannedipModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/CodesController.php b/app/Http/Controllers/Bo/CodesController.php index 7d715c3..23f7224 100644 --- a/app/Http/Controllers/Bo/CodesController.php +++ b/app/Http/Controllers/Bo/CodesController.php @@ -3,13 +3,14 @@ namespace App\Http\Controllers\Bo; use App\Http\Controllers\Controller; -use App\Http\Requests\CodeSearchRequest; -use App\Http\Requests\ExportCodesRequest; -use App\Http\Requests\GenerateCodesRequest; +use App\Http\Requests\Bo\CodeSearchRequest; +use App\Http\Requests\Bo\ExportCodesRequest; +use App\Http\Requests\Bo\GenerateCodesRequest; use App\Jobs\ProcessExportCodesUniques; use App\Jobs\ProcessUniqueCode; use App\Models\Code; use App\Models\Settings; +use Illuminate\Support\Facades\Queue; use Kwaadpepper\Serial\Exceptions\SerialCasterException; class CodesController extends Controller @@ -21,11 +22,11 @@ class CodesController extends Controller */ public function index(): \Illuminate\Contracts\View\View { - $settings = Settings::first(); - $nbCodeBase = Code::count(); - $nbCodeUsed = Code::where('code_used', 1)->count(); - $nbCodeExported = Code::where('code_exported', 1)->count(); - $nbCodeRemainingToExport = Code::where('code_exported', 0)->count(); + $settings = Settings::query()->firstOrFail(); + $nbCodeBase = Code::query()->count(); + $nbCodeUsed = Code::query()->where('code_used', true)->count(); + $nbCodeExported = Code::query()->where('code_exported', true)->count(); + $nbCodeRemainingToExport = Code::query()->where('code_exported', false)->count(); return view('back::pages.codes.index', compact( 'settings', 'nbCodeBase', @@ -38,55 +39,67 @@ class CodesController extends Controller /** * Run generate codes action * - * @param GenerateCodesRequest $request + * @param \App\Http\Controllers\Bo\GenerateCodesRequest $request * @return \Illuminate\Http\RedirectResponse */ public function generate(GenerateCodesRequest $request): \Illuminate\Http\RedirectResponse { - ProcessUniqueCode::dispatch( - $request->quantity, - $request->code_length + Queue::push( + new ProcessUniqueCode( + intval($request->quantity), + $request->code_length + ) ); return back()->with( 'success', - "La génération à commencée, un mail de notification sera envoyé à l'adresse " . - config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé." + trans( + // phpcs:ignore Generic.Files.LineLength.TooLong + 'La tache de génération à été ajoutée, un mail de notification sera envoyé à l\'adresse :email lorsque le traitement sera terminé.', + [ + 'email' => config('mail.admin') + ] + ) ); } /** * Run export codes * - * @param ExportCodesRequest $request + * @param \App\Http\Requests\Bo\ExportCodesRequest $request * @return \Illuminate\Http\RedirectResponse */ public function export(ExportCodesRequest $request): \Illuminate\Http\RedirectResponse { - ProcessExportCodesUniques::dispatch( - intval($request->nb_code_fic), - intval($request->nb_code_tot), - intval($request->nb_code_ligne) + Queue::push( + new ProcessExportCodesUniques( + intval($request->nb_code_fic), + intval($request->nb_code_tot), + intval($request->nb_code_ligne) + ) ); return back()->with( 'success', - "L'export des codes à commencé, un mail de notification sera envoyé à l'adresse " . - config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé." + // phpcs:ignore Generic.Files.LineLength.TooLong + 'L\'export des codes à commencé, un mail de notification sera envoyé à l\'adresse :email lorsque le traitement sera terminé.', + [ + 'email' => config('mail.admin') + ] ); } /** * Search for a specific code. * - * @param CodeSearchRequest $request + * @param \App\Http\Requests\Bo\CodeSearchRequest $request * @return \Illuminate\Contracts\View\View */ public function search(CodeSearchRequest $request): \Illuminate\Contracts\View\View { $code = null; try { - $code = Code::whereId(Code::serialToInt($request->code))->first(); + $code = Code::query()->where('id', Code::serialToInt($request->code))->first(); } catch (\Throwable $e) { if (\get_class($e) === SerialCasterException::class) { $code = false; diff --git a/app/Http/Controllers/Bo/ContentController.php b/app/Http/Controllers/Bo/ContentController.php deleted file mode 100644 index 69f167f..0000000 --- a/app/Http/Controllers/Bo/ContentController.php +++ /dev/null @@ -1,91 +0,0 @@ -search; - if ($search) { - $this->searchQuery( - $contentModels, - $search, - null, - 'key', - 'value' - ); - } - $searchFields = \sprintf( - '%s, %s', - trans('validation.attributes.name'), - trans('validation.attributes.value'), - ); - - /** Sort columns with a query */ - $this->sortQuery($contentModels); - - /** Custom pagination */ - $contentModels = $this->customPaginate($contentModels, $request->pagination); - - return view('back::pages.contents.index', compact('contentModels', 'search', 'searchFields')); - } - - /** - * Show the form for editing the specified resource. - * - * @param \App\Models\Content $content - * @return \Illuminate\Contracts\View\View - */ - public function edit(Content $content): \Illuminate\Contracts\View\View - { - return view('back::pages.contents.edit', [ - 'contentModel' => $content, - ]); - } - - /** - * Update the specified resource in storage. - * - * @param \App\Http\Requests\Bo\Contents\UpdateContentRequest $request - * @param \App\Models\Content $content - * @return \Illuminate\Http\RedirectResponse - */ - public function update(UpdateContentRequest $request, Content $content): \Illuminate\Http\RedirectResponse - { - return DB::transaction(function () use ($request, $content) { - $content->fill($request->validated()); - if ($content->saveOrFail()) { - return redirect() - ->route('bo.contents.edit', $content) - ->with('success', trans( - 'crud.messages.has_been_updated', - ['model' => Str::singular(trans('models.classes.contents'))] - )); - } - return redirect() - ->back() - ->with('error', trans( - 'crud.messages.cannot_be_updated', - ['model' => Str::singular(trans('models.classes.contents'))] - )); - }); - } -} diff --git a/app/Http/Controllers/Bo/FaqQuestionsController.php b/app/Http/Controllers/Bo/FaqQuestionsController.php index caeedd2..bdc01b8 100644 --- a/app/Http/Controllers/Bo/FaqQuestionsController.php +++ b/app/Http/Controllers/Bo/FaqQuestionsController.php @@ -37,7 +37,7 @@ class FaqQuestionsController extends Controller } $searchFields = \sprintf( '%s, %s ...', - Str::ucfirst(__('validation.attributes.question')), + Str::ucfirst(__('validation.custom.question')), __('validation.attributes.answer'), ); @@ -45,7 +45,7 @@ class FaqQuestionsController extends Controller $this->sortQuery($faqQuestionModels); /** Custom pagination */ - $faqQuestionModels = $this->customPaginate($faqQuestionModels, $request->pagination); + $faqQuestionModels = $this->paginate($faqQuestionModels); return view('back::pages.faq-questions.index', compact('faqQuestionModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/FaqThemesController.php b/app/Http/Controllers/Bo/FaqThemesController.php index 1843a0f..74616b3 100644 --- a/app/Http/Controllers/Bo/FaqThemesController.php +++ b/app/Http/Controllers/Bo/FaqThemesController.php @@ -39,7 +39,7 @@ class FaqThemesController extends Controller $this->sortQuery($faqThemeModels); /** Custom pagination */ - $faqThemeModels = $this->customPaginate($faqThemeModels, $request->pagination); + $faqThemeModels = $this->paginate($faqThemeModels); return view('back::pages.faq-themes.index', compact('faqThemeModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/GainViewController.php b/app/Http/Controllers/Bo/GainViewController.php index cdd8e20..95a15c9 100644 --- a/app/Http/Controllers/Bo/GainViewController.php +++ b/app/Http/Controllers/Bo/GainViewController.php @@ -43,7 +43,7 @@ class GainViewController extends Controller $this->sortQuery($gainViewModels); /** Custom pagination */ - $gainViewModels = $this->customPaginate($gainViewModels, $request->pagination); + $gainViewModels = $this->paginate($gainViewModels); return view('back::pages.gain-views.index', compact('gainViewModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/PrizesController.php b/app/Http/Controllers/Bo/PrizesController.php index 4dd1e2c..6d1f719 100644 --- a/app/Http/Controllers/Bo/PrizesController.php +++ b/app/Http/Controllers/Bo/PrizesController.php @@ -45,7 +45,7 @@ class PrizesController extends Controller $this->sortQuery($prizeModels); /** Custom pagination */ - $prizeModels = $this->customPaginate($prizeModels, $request->pagination); + $prizeModels = $this->paginate($prizeModels); return view('back::pages.prizes.index', compact('prizeModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/ProductsController.php b/app/Http/Controllers/Bo/ProductsController.php index 489b130..4d0ea50 100644 --- a/app/Http/Controllers/Bo/ProductsController.php +++ b/app/Http/Controllers/Bo/ProductsController.php @@ -47,7 +47,7 @@ class ProductsController extends Controller $this->sortQuery($productModels); /** Custom pagination */ - $productModels = $this->customPaginate($productModels, $request->pagination); + $productModels = $this->paginate($productModels); return view('back::pages.products.index', compact('productModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/RangeController.php b/app/Http/Controllers/Bo/RangeController.php index 932ad36..1e8b019 100644 --- a/app/Http/Controllers/Bo/RangeController.php +++ b/app/Http/Controllers/Bo/RangeController.php @@ -39,7 +39,7 @@ class RangeController extends Controller $this->sortQuery($rangeModels); /** Custom pagination */ - $rangeModels = $this->customPaginate($rangeModels, $request->pagination); + $rangeModels = $this->paginate($rangeModels); return view('back::pages.ranges.index', compact('rangeModels', 'search', 'searchFields')); } diff --git a/app/Http/Controllers/Bo/StaticPageController.php b/app/Http/Controllers/Bo/StaticPageController.php new file mode 100644 index 0000000..b177201 --- /dev/null +++ b/app/Http/Controllers/Bo/StaticPageController.php @@ -0,0 +1,91 @@ +authorizeResource(StaticPage::class); + } + + /** + * Display a listing of the resource. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\View\View + */ + public function index(Request $request): \Illuminate\Contracts\View\View + { + /** @var \Illuminate\Database\Eloquent\Builder $query */ + $query = StaticPage::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $query, + $search, + null, + 'title', + ); + } + $searchFields = \implode(', ', [ + trans('validation.attributes.title'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($query); + + /** Custom pagination */ + $staticPageModelList = $this->paginate($query); + + return view('back::pages.static_pages.index', compact('staticPageModelList', 'search', 'searchFields')); + } + + /** + * Show the form for editing the specified resource. + * + * @param App\Models\StaticPage $static_page + * @return \Illuminate\Contracts\View\View + */ + public function edit(StaticPage $static_page): \Illuminate\Contracts\View\View + { + return view('back::pages.static_pages.edit', ['staticPageModel' => $static_page]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\StaticPages\UpdateStaticPageRequest $request + * @param \App\Models\StaticPage $static_page + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateStaticPageRequest $request, StaticPage $static_page): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request, $static_page) { + $static_page->fill($request->validated()); + + if ($static_page->saveOrFail()) { + return redirect()->route('bo.static_pages.edit', $static_page) + ->with('success', __('crud.messages.has_been_updated', [ + 'model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1)) + ])); + } + return redirect()->route('bo.static_pages.edit', $static_page) + ->with('error', __('crud.messages.cannot_be_updated', [ + 'model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1)) + ])); + }); + } +} diff --git a/app/Http/Controllers/Bo/UserController.php b/app/Http/Controllers/Bo/UserController.php new file mode 100644 index 0000000..094cd54 --- /dev/null +++ b/app/Http/Controllers/Bo/UserController.php @@ -0,0 +1,169 @@ +authorizeResource(User::class); + } + + /** + * Display a listing of the resource. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\View\View + */ + public function index(Request $request): \Illuminate\Contracts\View\View + { + /** @var \Illuminate\Database\Eloquent\Builder $userModels */ + $userModels = User::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $userModels, + $search, + null, + 'first_name', + 'last_name', + 'email', + 'role', + ); + } + $searchFields = \implode(', ', [ + trans('validation.attributes.first_name'), + trans('validation.attributes.last_name'), + trans('validation.attributes.email'), + trans('validation.attributes.role'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($userModels); + + /** Custom pagination */ + $userModels = $this->paginate($userModels); + + return view('back::pages.users.index', compact('userModels', 'search', 'searchFields')); + } + + + /** + * Show the form for creating a new resource. + * + * @param \App\Models\User $user + * @return \Illuminate\Contracts\View\View + */ + public function create(User $user): \Illuminate\Contracts\View\View + { + return view('back::pages.users.create', ['userModel' => $user]); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\Users\StoreUserRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreUserRequest $request): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request) { + $user = new User(); + $user->fill($request->validated()); + + if ($user->saveOrFail()) { + return redirect()->route('bo.users.edit', $user) + ->with('success', __('crud.messages.has_been_created', [ + 'model' => Str::ucfirst(__('models.classes.user')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_created', [ + 'model' => Str::ucfirst(__('models.classes.user')) + ])); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param App\Models\User $user + * @return \Illuminate\Contracts\View\View + */ + public function edit(User $user): \Illuminate\Contracts\View\View + { + return view('back::pages.users.edit', ['userModel' => $user]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\Users\UpdateUserRequest $request + * @param \App\Models\User $user + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateUserRequest $request, User $user): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request, $user) { + $user->fill($request->validated()); + + if ($user->saveOrFail()) { + return redirect()->route('bo.users.edit', $user) + ->with('success', __('crud.messages.has_been_updated', [ + 'model' => Str::ucfirst(__('models.classes.user')) + ])); + } + return redirect()->route('bo.users.edit', $user) + ->with('error', __('crud.messages.cannot_be_updated', [ + 'model' => Str::ucfirst(__('models.classes.user')) + ])); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\User $user + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(User $user): \Illuminate\Http\RedirectResponse + { + if ($user->deleteOrFail()) { + return redirect()->route('bo.users.index') + ->with('success', __('crud.messages.has_been_deleted', [ + 'model' => Str::ucfirst(__('models.classes.user')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_deleted', [ + 'model' => Str::ucfirst(__('models.classes.user')) + ])); + } + + /** + * Duplicate the specified resource. + * + * @param \App\Models\User $user + * @return \Illuminate\Contracts\View\View + */ + public function duplicate(User $user): \Illuminate\Contracts\View\View + { + return $this->create($user->replicate()); + } +} diff --git a/app/Http/Controllers/Bo/WinnersListController.php b/app/Http/Controllers/Bo/WinnersListController.php index 3692472..6af2242 100644 --- a/app/Http/Controllers/Bo/WinnersListController.php +++ b/app/Http/Controllers/Bo/WinnersListController.php @@ -24,7 +24,7 @@ class WinnersListController extends Controller $this->sortQuery($participationModels); /** Custom pagination */ - $participationModels = $this->customPaginate($participationModels, $request->pagination); + $participationModels = $this->paginate($participationModels); $settings = Settings::select('use_ean_codes', 'winning_proof')->first(); diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 8449041..768c25f 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,20 +2,22 @@ namespace App\Http\Controllers; +use App\Enums\Pagination\ItemsPerPaginationEnum; +use App\Enums\Theme\BootstrapThemeEnum; +use App\Lib\Helpers\ToolboxHelper; use Illuminate\Database\Eloquent\Builder; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; -use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; -use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Http\Request; use Illuminate\Routing\Controller as BaseController; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Session; +use Illuminate\Support\Str; class Controller extends BaseController { use AuthorizesRequests; - use DispatchesJobs; use ValidatesRequests; /** @@ -35,7 +37,7 @@ class Controller extends BaseController string $search, callable $searchQuery = null, string ...$fields - ): Builder { + ): \Illuminate\Database\Eloquent\Builder { if (count($fields)) { // Search using words. $words = explode(' ', $search); @@ -64,36 +66,85 @@ class Controller extends BaseController * @param array $fields * @return \Illuminate\Database\Eloquent\Builder */ - private function searchOnFields(Builder $query, string $search, array $fields): Builder - { + private function searchOnFields( + Builder $query, + string $search, + array $fields + ): \Illuminate\Database\Eloquent\Builder { $table = $query->getModel()->getTable(); - foreach ($fields as $f) { - $f = str_replace('?', '\?', $f); - if (is_array($f)) { + foreach ($fields as $field) { + $field = str_replace('?', '\?', $field); + if (is_array($field)) { $query->orWhereRaw( - sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($f)->map(function ($q) use ($table) { + sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($field)->map(function ($q) use ($table) { return "`$table`.`$q`"; })->implode(', \' \', ')), - ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] - ); - } else { - $query->orWhereRaw( - "UPPER(`$table`.`$f`) LIKE UPPER(?)", - ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] + ['%' . htmlspecialchars($search) . '%'] ); + return $query; } - } + // Get models woth enum's label. + if (is_array($this->getSearchValue($query, $search, $field))) { + foreach ($this->getSearchValue($query, $search, $field) as $array) { + $query->orWhereRaw( + "UPPER(`$table`.`$field`) LIKE UPPER(?)", + ['%' . htmlspecialchars($array->value) . '%'] + ); + } + return $query; + } + // Get models with relation's name/label. + if (Str::endsWith($field, '_id') && $query->getModel()->has(Str::remove('_id', $field))) { + $query->orWhereHas(Str::remove('_id', $field), function ($queryRelation) use ($field, $search) { + if (Schema::hasColumn(Str::remove('_id', $field) . 's', 'name')) { + $queryRelation->where('name', 'like', '%' . $search . '%'); + } elseif (Schema::hasColumn(Str::remove('_id', $field) . 's', 'label')) { + $queryRelation->where('label', 'like', '%' . $search . '%'); + } + }); + return $query; + } + $query->orWhereRaw( + "UPPER(`$table`.`$field`) LIKE UPPER(?)", + ['%' . htmlspecialchars($this->getSearchValue($query, $search, $field)) . '%'] + ); + } //end foreach return $query; } /** - * Sort columns with a query + * Get the search value (on string or Enum). + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $search + * @param string $field + * @return string|array + */ + protected function getSearchValue(Builder $query, string $search, string $field): string|array + { + if ( + count($query->getModel()->getCasts()) and // Check if the model has casts. + isset($query->getModel()->getCasts()[$field]) and // Check if there is cast about specific field. + enum_exists($query->getModel()->getCasts()[$field]) // Check if the cast is an enum. + ) { + $cases = collect($query->getModel()->getCasts()[$field]::toArray()); + $enum = $cases->filter(function ($item) use ($search) { + return preg_match('/' . Str::lower($search) . '/', Str::lower($item->label)); + }); + return $enum->toArray(); + } else { + return $search; + } + } + + /** + * Sort columns with a query. * * @param \Illuminate\Database\Eloquent\Builder $query * @param array $ignore * @return \Illuminate\Database\Eloquent\Builder */ - protected function sortQuery(Builder $query, array $ignore = []): Builder + protected function sortQuery(Builder $query, array $ignore = []): \Illuminate\Database\Eloquent\Builder { $rName = request()->route()->getName(); $table = $query->getModel()->getTable(); @@ -121,6 +172,14 @@ class Controller extends BaseController $query = $query->orderBy('order', 'ASC'); Session::put("$rName.sort_col", 'order'); Session::put("$rName.sort_way", 'asc'); + } elseif (Schema::hasColumn($table, 'updated_at')) { + $query = $query->orderBy('updated_at', 'DESC'); + Session::put("$rName.sort_col", 'updated_at'); + Session::put("$rName.sort_way", 'desc'); + } elseif (Schema::hasColumn($table, 'created_at')) { + $query = $query->orderBy('created_at', 'DESC'); + Session::put("$rName.sort_col", 'created_at'); + Session::put("$rName.sort_way", 'desc'); } return $query; } @@ -128,18 +187,45 @@ class Controller extends BaseController /** * Customize pagination with cache or config (default). * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param integer|null $pagination - * @return \Illuminate\Pagination\LengthAwarePaginator + * @param \Illuminate\Database\Eloquent\Builder $query + * @param \App\Enums\Pagination\ItemsPerPaginationEnum|null $pagination + * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator */ - protected function customPaginate(Builder $query, $pagination): LengthAwarePaginator - { - if ($pagination) { - Cache::put('pagination', $pagination); - }; - $query = $query->paginate( - (Cache::get('pagination')) ? intval(Cache::get('pagination')) : config('pagination.default') + protected function paginate( + Builder $query, + ItemsPerPaginationEnum $pagination = null + ): \Illuminate\Contracts\Pagination\LengthAwarePaginator { + $currentRoutePath = Str::slug(request()->route()->getName()); + $cacheKey = "pagination.{$currentRoutePath}"; + $pagination = $pagination ?? ItemsPerPaginationEnum::twelve; + $pagination = ToolboxHelper::getValidatedEnum( + Cache::get($cacheKey, $pagination->value()), + 'pagination', + '\App\Enums\Pagination\ItemsPerPaginationEnum', ); + if (Cache::get($cacheKey) !== $pagination) { + Cache::put($cacheKey, $pagination); + } + $query = $query->paginate($pagination); return $query; } + + /** + * Set the bootstrap theme or light (default). + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + protected function setTheme(Request $request): \Illuminate\Http\RedirectResponse + { + $theme = ToolboxHelper::getValidatedEnum( + $request->theme ?: Cache::get('theme', BootstrapThemeEnum::light->value()), + 'theme', + '\App\Http\Controllers\BootstrapThemeEnum', + ); + if (Cache::get("theme") !== $theme) { + Cache::put("theme", $theme); + } + return redirect()->back()->with('success', __('crud.messages.theme_updated')); + } } diff --git a/app/Http/Controllers/Fo/EndPageController.php b/app/Http/Controllers/Fo/EndPageController.php index 28a5ce6..315ee38 100644 --- a/app/Http/Controllers/Fo/EndPageController.php +++ b/app/Http/Controllers/Fo/EndPageController.php @@ -24,6 +24,6 @@ class EndPageController extends Controller ) { return view('theme::fo.end', compact('settings')); } - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } } diff --git a/app/Http/Controllers/Fo/EnterCodeController.php b/app/Http/Controllers/Fo/EnterCodeController.php index e8bf721..f61132e 100644 --- a/app/Http/Controllers/Fo/EnterCodeController.php +++ b/app/Http/Controllers/Fo/EnterCodeController.php @@ -169,7 +169,7 @@ class EnterCodeController extends Controller $arcadiaMail = $this->apiCrm->ArcadiaOutgoingMail($crmId, $fields, 'game'); if ($arcadiaMail->status === 'KO') { - Mail::to(config('mail.MAIL_ADMIN'))->send(new CourrierArcadiaError(auth()->user())); + Mail::to(config('mail.admin'))->send(new CourrierArcadiaError(auth()->user())); } } //end if @@ -260,7 +260,7 @@ class EnterCodeController extends Controller $participation->reduction_id = $reduction->id; $participation->save(); } else { - Mail::to(config('mail.MAIL_ADMIN')) + Mail::to(config('mail.admin')) ->send(new NotifAdmin(\sprintf( 'MESBR : Une erreur est survenue. Code : %s Message : %s', $result["code"], @@ -287,6 +287,6 @@ class EnterCodeController extends Controller if ($participation) { return view('theme::fo.winning-proof', compact('participation')); } - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } } diff --git a/app/Http/Controllers/Fo/FAQController.php b/app/Http/Controllers/Fo/FAQController.php index 35d1e27..4f7e0ba 100644 --- a/app/Http/Controllers/Fo/FAQController.php +++ b/app/Http/Controllers/Fo/FAQController.php @@ -18,7 +18,7 @@ class FAQController extends Controller $questions = FaqQuestion::all(); $themes = FaqTheme::all(); if (count($questions) === 0 && count($themes) === 0) { - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } return view('theme::fo.faq', compact('questions', 'themes')); } diff --git a/app/Http/Controllers/Fo/GainsController.php b/app/Http/Controllers/Fo/GainsController.php index 8b8ddac..e20a2b5 100644 --- a/app/Http/Controllers/Fo/GainsController.php +++ b/app/Http/Controllers/Fo/GainsController.php @@ -16,6 +16,6 @@ class GainsController extends Controller if (view()->exists('theme::fo.gains')) { return view('theme::fo.gains'); } - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } } diff --git a/app/Http/Controllers/Fo/HowToPlayController.php b/app/Http/Controllers/Fo/HowToPlayController.php index 4cb2fe0..9e609f8 100644 --- a/app/Http/Controllers/Fo/HowToPlayController.php +++ b/app/Http/Controllers/Fo/HowToPlayController.php @@ -16,6 +16,6 @@ class HowToPlayController extends Controller if (view()->exists('theme::fo.basic.how-to-play')) { return view('theme::fo.basic.how-to-play'); } - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } } diff --git a/app/Http/Controllers/Fo/LoginController.php b/app/Http/Controllers/Fo/LoginController.php index 37b0f05..e9e49e2 100644 --- a/app/Http/Controllers/Fo/LoginController.php +++ b/app/Http/Controllers/Fo/LoginController.php @@ -88,8 +88,8 @@ class LoginController extends Controller /** @var \App\Models\Customer $userLocal */ $userLocal = Customer::create([ 'crm_id' => $connect->user->crm_id, - 'firstname' => $connect->user->firstname, - 'lastname' => $connect->user->lastname, + 'firstname' => $connect->user->first_name, + 'lastname' => $connect->user->last_name, 'birth_date' => $connect->user->birth_date, 'email' => $email, 'password' => Hash::make($password), @@ -106,8 +106,8 @@ class LoginController extends Controller /** @var \App\Models\Customer $userLocal */ $userLocal = Customer::create([ 'crm_id' => $connect->user->crm_id, - 'firstname' => $connect->user->firstname, - 'lastname' => $connect->user->lastname, + 'firstname' => $connect->user->first_name, + 'lastname' => $connect->user->last_name, 'birth_date' => $connect->user->birth_date, 'email' => $email, 'password' => Hash::make($password), @@ -149,7 +149,7 @@ class LoginController extends Controller public function logout() { Auth::logout(); - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } /** diff --git a/app/Http/Controllers/Fo/TeaserController.php b/app/Http/Controllers/Fo/TeaserController.php index 523cb02..955d465 100644 --- a/app/Http/Controllers/Fo/TeaserController.php +++ b/app/Http/Controllers/Fo/TeaserController.php @@ -19,6 +19,6 @@ class TeaserController extends Controller if ($settings->activated_teaser === 1 && $settings->teaser_end_activity > now()) { return view('theme::fo.teaser', compact('settings')); } - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } } diff --git a/app/Http/Controllers/Fo/ViewContentController.php b/app/Http/Controllers/Fo/ViewContentController.php index b574dfe..cbf73fa 100644 --- a/app/Http/Controllers/Fo/ViewContentController.php +++ b/app/Http/Controllers/Fo/ViewContentController.php @@ -14,7 +14,7 @@ class ViewContentController extends Controller */ public function reglement() { - $content = Content::find(3); + $content = Content::query()->find(3); return view('theme::fo.reglement', compact('content')); } diff --git a/app/Http/Controllers/Fo/WinningProofController.php b/app/Http/Controllers/Fo/WinningProofController.php index 33b099b..92401a7 100644 --- a/app/Http/Controllers/Fo/WinningProofController.php +++ b/app/Http/Controllers/Fo/WinningProofController.php @@ -44,7 +44,7 @@ class WinningProofController extends Controller ['barcode', null] ])->has('instantWin')->first(); if (!$participation) { - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } $request->validate([ @@ -102,7 +102,7 @@ class WinningProofController extends Controller if ($update->status !== 'OK') { Log::warning('Erreur lors de la mise a jour du user (crm_id : ' . $user->crm_id . ') - code : ' . $update->code . ' - message : ' . $update->message); - Mail::to(config('mail.MAIL_ADMIN'))->send(new NotifAdmin( + Mail::to(config('mail.admin'))->send(new NotifAdmin( 'CRM : Erreur lors de la mise a jour du user (crm_id : ' . $user->crm_id . ') - code : ' . $update->code . ' - message : ' . $update->message )); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index a2ab0d0..1b83325 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -37,7 +37,7 @@ class Kernel extends HttpKernel \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, - \App\Http\Middleware\SecureHeaders::class, + \App\Http\Middleware\SecureHeaders::class ], 'api' => [ @@ -57,16 +57,15 @@ class Kernel extends HttpKernel 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, - 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'game-date' => \App\Http\Middleware\GameCheckDate::class, 'is-admin' => \App\Http\Middleware\IsAdmin::class, 'is-super-admin' => \App\Http\Middleware\IsSuperAdmin::class, 're7' => \App\Http\Middleware\Re7Middleware::class, - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'htmlsanitize' => \App\Http\Middleware\HtmlSanitizer::class, diff --git a/app/Http/Middleware/IsAdmin.php b/app/Http/Middleware/IsAdmin.php index 8bece33..7f43034 100644 --- a/app/Http/Middleware/IsAdmin.php +++ b/app/Http/Middleware/IsAdmin.php @@ -2,9 +2,9 @@ namespace App\Http\Middleware; +use App\Enums\Users\RoleEnum; use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; class IsAdmin { @@ -17,10 +17,18 @@ class IsAdmin */ public function handle(Request $request, Closure $next) { - $role = Auth::user()->role; - if ($role === 1 || $role === 2) { - return $next($request); + /** @var \App\Models\User|null */ + $user = auth('backend')->user(); + + if (!$user) { + abort(403, trans('Vous devez être authentifé')); } - abort(404, "Cette page n'existe pas."); + + if ($user->role->value() > RoleEnum::admin->value()) { + return response()->redirectToRoute('bo.home') + ->with('warning', trans('Vous n\'avez pas les droits nécessaires pour accéder à cet élément')); + } + + return $next($request); } } diff --git a/app/Http/Middleware/IsSuperAdmin.php b/app/Http/Middleware/IsSuperAdmin.php index 1c252b2..1bb4de7 100644 --- a/app/Http/Middleware/IsSuperAdmin.php +++ b/app/Http/Middleware/IsSuperAdmin.php @@ -2,9 +2,9 @@ namespace App\Http\Middleware; +use App\Enums\Users\RoleEnum; use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; class IsSuperAdmin { @@ -17,10 +17,18 @@ class IsSuperAdmin */ public function handle(Request $request, Closure $next) { - $role = Auth::user()->role; - if ($role === 1) { - return $next($request); + /** @var \App\Models\User|null */ + $user = auth('backend')->user(); + + if (!$user) { + abort(403, trans('Vous devez être authentifé')); } - return redirect()->route('bo.dashboard'); + + if ($user->role->value() > RoleEnum::conceptor->value()) { + return response()->redirectToRoute('bo.home') + ->with('warning', trans('Vous n\'avez pas les droits nécessaires pour accéder à cet élément')); + } + + return $next($request); } } diff --git a/app/Http/Middleware/Re7Middleware.php b/app/Http/Middleware/Re7Middleware.php index 8b67215..137b959 100644 --- a/app/Http/Middleware/Re7Middleware.php +++ b/app/Http/Middleware/Re7Middleware.php @@ -17,7 +17,7 @@ class Re7Middleware public function handle(Request $request, Closure $next) { if (config('app.env') === 'production') { - return redirect()->route('fo.home'); + return redirect()->route('fo.homepage'); } return $next($request); } diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 393cabe..2c78eaf 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -3,7 +3,6 @@ namespace App\Http\Middleware; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; class RedirectIfAuthenticated @@ -24,10 +23,10 @@ class RedirectIfAuthenticated $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { - if (Auth::guard($guard)->check()) { + if (auth($guard)->check()) { switch ($guard) { case 'frontend': - return \redirect()->route('fo.home'); + return \redirect()->route('fo.homepage'); case 'backend': if (!$request->routeIs('bo.*')) { continue; diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index d727add..78de7a0 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -20,7 +20,7 @@ class TrustProxies extends Middleware * @var integer */ protected $headers = - Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | diff --git a/app/Http/Requests/CodeSearchRequest.php b/app/Http/Requests/Bo/CodeSearchRequest.php similarity index 69% rename from app/Http/Requests/CodeSearchRequest.php rename to app/Http/Requests/Bo/CodeSearchRequest.php index 2ece3fb..06b8b42 100644 --- a/app/Http/Requests/CodeSearchRequest.php +++ b/app/Http/Requests/Bo/CodeSearchRequest.php @@ -1,7 +1,8 @@ check() and - auth()->user()->role === 1; + // ? Is auth and super admin + return auth('backend')->check() and + auth('backend')->user()->role === RoleEnum::conceptor; } /** diff --git a/app/Http/Requests/Bo/Contents/UpdateContentRequest.php b/app/Http/Requests/Bo/Contents/UpdateContentRequest.php deleted file mode 100644 index 23aa3e4..0000000 --- a/app/Http/Requests/Bo/Contents/UpdateContentRequest.php +++ /dev/null @@ -1,42 +0,0 @@ -check(); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'value' => 'required|string|min:15', - ]; - } - - /** - * Get custom attributes for validator errors. - * - * @return array - */ - public function attributes(): array - { - return [ - 'value' => trans('Texte'), - ]; - } -} diff --git a/app/Http/Requests/ExportCodesRequest.php b/app/Http/Requests/Bo/ExportCodesRequest.php similarity index 79% rename from app/Http/Requests/ExportCodesRequest.php rename to app/Http/Requests/Bo/ExportCodesRequest.php index c44d93b..4221f83 100644 --- a/app/Http/Requests/ExportCodesRequest.php +++ b/app/Http/Requests/Bo/ExportCodesRequest.php @@ -1,7 +1,8 @@ where('code_exported', false); + $lastExportedId = Code::query()->where('code_exported', true) ->orderBy('id', 'desc')->first()->id ?? null; if ($lastExportedId) { $codesAvailableToExport = $codesAvailableToExport @@ -26,8 +27,10 @@ class ExportCodesRequest extends FormRequest 'available_export' => $codesAvailableToExport->count() ]); // ? Is auth and super admin, also is json ? - return auth()->check() and - auth()->user()->role === 1 and $this->json(); + return auth('backend')->check() and + // ? Is auth and super admin + auth('backend')->user()->role === RoleEnum::conceptor + and $this->json(); } /** diff --git a/app/Http/Requests/GenerateCodesRequest.php b/app/Http/Requests/Bo/GenerateCodesRequest.php similarity index 76% rename from app/Http/Requests/GenerateCodesRequest.php rename to app/Http/Requests/Bo/GenerateCodesRequest.php index 9677399..1ec2a58 100644 --- a/app/Http/Requests/GenerateCodesRequest.php +++ b/app/Http/Requests/Bo/GenerateCodesRequest.php @@ -1,7 +1,8 @@ check() and auth()->user()->role === 1; + return auth('backend')->check() and + auth('backend')->user()->role === RoleEnum::conceptor; } /** diff --git a/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php new file mode 100644 index 0000000..238721f --- /dev/null +++ b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php @@ -0,0 +1,46 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + public function prepareForValidation(): void + { + $this->merge([ + 'content' => (string)Str::of($this->content) + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'seo_title' => 'required|min:45|max:70', + 'seo_description' => 'required|min:50|max:160', + 'title' => 'required|min:3|max:255', + 'content' => 'present', + ]; + } +} diff --git a/app/Http/Requests/Bo/Users/StoreUserRequest.php b/app/Http/Requests/Bo/Users/StoreUserRequest.php new file mode 100644 index 0000000..ffa3d18 --- /dev/null +++ b/app/Http/Requests/Bo/Users/StoreUserRequest.php @@ -0,0 +1,74 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation() + { + $this->merge([ + 'published' => $this->published ? true : false + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + 'first_name' => 'required|string|min:3|max:255', + 'last_name' => 'required|string|min:3|max:255', + 'email' => 'required|email:rfc,strict,dns,spoof,filter|unique:users,email', + 'password' => [ + 'required', 'required_with:password_confirmation', 'confirmed', 'max:255', Password::min(8) + ->letters() + ->mixedCase() + ->numbers() + ->symbols() + ->uncompromised() + ], + 'role' => ['required', new Enum(RoleEnum::class)], + 'published' => 'required|boolean', + ]; + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'first_name' => trans('validation.attributes.first_name'), + 'last_name' => trans('validation.attributes.last_name'), + 'email' => trans('validation.attributes.email'), + 'password' => trans('validation.attributes.password'), + 'role' => trans('validation.attributes.role'), + 'published' => trans('validation.custom.publication') + ]; + } +} diff --git a/app/Http/Requests/Bo/Users/UpdateUserRequest.php b/app/Http/Requests/Bo/Users/UpdateUserRequest.php new file mode 100644 index 0000000..5dede0b --- /dev/null +++ b/app/Http/Requests/Bo/Users/UpdateUserRequest.php @@ -0,0 +1,48 @@ +merge([ + 'published' => $this->published ? true : false, + 'password' => $this->password ? $this->password : $this->route('user')->password, + 'password_confirmation' => $this->password_confirmation ? + $this->password_confirmation : + $this->route('user')->password + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return array_merge(parent::rules(), [ + 'email' => [ + 'required', + 'email:rfc,strict,dns,spoof,filter', + 'unique:users,email,' . $this->route('user')->id . ',id', + ], + 'password' => [ + 'required', 'required_with:password_confirmation', 'confirmed', 'max:255', Password::min(8) + ->letters() + ->mixedCase() + ->numbers() + ->symbols() + ->uncompromised() + ], + ]); + } +} diff --git a/app/Traits/Controllers/.gitkeep b/app/Http/Requests/Fo/.gitkeep similarity index 100% rename from app/Traits/Controllers/.gitkeep rename to app/Http/Requests/Fo/.gitkeep diff --git a/app/Jobs/ProcessExportCodesUniques.php b/app/Jobs/ProcessExportCodesUniques.php index 3e07314..fad9472 100644 --- a/app/Jobs/ProcessExportCodesUniques.php +++ b/app/Jobs/ProcessExportCodesUniques.php @@ -7,6 +7,7 @@ use App\Mail\JobFailed; use App\Models\Code; use Exception; use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; @@ -14,7 +15,7 @@ use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Mail; -class ProcessExportCodesUniques implements ShouldQueue +class ProcessExportCodesUniques implements ShouldQueue, ShouldBeUnique { use Dispatchable; use InteractsWithQueue; @@ -30,33 +31,12 @@ class ProcessExportCodesUniques implements ShouldQueue */ public $timeout = 7200; - /** - * Nombre de codes par fichiers. - * - * @var integer - */ - private $nbCodeFic; - - /** - * Nombre total de codes à exporter. - * - * @var integer - */ - private $nbCodeTot; - - /** - * Nombre de codes par ligne. - * - * @var integer - */ - private $nbCodeLigne; - /** * The export file name * * @var string */ - private $exportFileName = null; + protected $exportFileName = null; /** * Create a new job instance. @@ -66,11 +46,11 @@ class ProcessExportCodesUniques implements ShouldQueue * @param integer $nbCodeLigne Nombre de codes par ligne. * @return void */ - public function __construct(int $nbCodeFic, int $nbCodeTot, int $nbCodeLigne) - { - $this->nbCodeFic = $nbCodeFic; - $this->nbCodeTot = $nbCodeTot; - $this->nbCodeLigne = $nbCodeLigne; + public function __construct( + protected int $nbCodeFic, + protected int $nbCodeTot, + protected int $nbCodeLigne + ) { } /** @@ -86,7 +66,8 @@ class ProcessExportCodesUniques implements ShouldQueue date('dmY_His') ); - $lastExportedCodeId = Code::whereCodeExported(true) + $lastExportedCodeId = Code::query() + ->where('code_exported', true) ->orderBy('id', 'desc')->first()->id ?? null; $filesPath = $this->generateCsvFiles($lastExportedCodeId); @@ -115,12 +96,12 @@ class ProcessExportCodesUniques implements ShouldQueue } // * Envoi de mail à MAIL_ADMIN avec le nom du ZIP "CodesUniques_". date('dmY_His') .".zip". - Mail::to(config('mail.MAIL_ADMIN')) - ->send(new ExportCodesUniques( - $this->nbCodeFic, - $this->nbCodeTot, - $this->nbCodeLigne - )); + Mail::to(config('mail.admin')) + ->send(new ExportCodesUniques( + $this->nbCodeFic, + $this->nbCodeTot, + $this->nbCodeLigne + )); } /** @@ -185,7 +166,7 @@ class ProcessExportCodesUniques implements ShouldQueue } // ? Have we reached pagination limit for mass saving ? if (count($exportedCodesId) === $paginate) { - Code::whereIn('id', $exportedCodesId)->update(['code_exported' => 1]); + Code::query()->whereIn('id', $exportedCodesId)->update(['code_exported' => true]); $exportedCodesId = []; } } //end if @@ -193,7 +174,7 @@ class ProcessExportCodesUniques implements ShouldQueue // ? Are there exported codes to save ? if (count($exportedCodesId)) { - Code::whereIn('id', $exportedCodesId)->update(['code_exported' => 1]); + Code::query()->whereIn('id', $exportedCodesId)->update(['code_exported' => true]); } return $outPaths; } @@ -206,10 +187,10 @@ class ProcessExportCodesUniques implements ShouldQueue */ public function failed(Exception $exception) { - Mail::to(config('mail.MAIL_ADMIN')) - ->send(new JobFailed("ProcessExportCodeUnique", [ - 'message' => $exception->getMessage(), - 'trace' => $exception->getTraceAsString() - ])); + Mail::to(config('mail.admin')) + ->send(new JobFailed("ProcessExportCodeUnique", [ + 'message' => $exception->getMessage(), + 'trace' => $exception->getTraceAsString() + ])); } } diff --git a/app/Jobs/ProcessUniqueCode.php b/app/Jobs/ProcessUniqueCode.php index e8c99d0..c0e9a97 100644 --- a/app/Jobs/ProcessUniqueCode.php +++ b/app/Jobs/ProcessUniqueCode.php @@ -6,16 +6,17 @@ use App\Mail\CodeGenerationEnd; use App\Mail\JobFailed; use App\Models\Code; use App\Models\Settings; -use Exception; use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\Middleware\WithoutOverlapping; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; -class ProcessUniqueCode implements ShouldQueue +class ProcessUniqueCode implements ShouldQueue, ShouldBeUnique { use Dispatchable; use InteractsWithQueue; @@ -31,101 +32,104 @@ class ProcessUniqueCode implements ShouldQueue */ public $timeout = 7200; - /** - * Quantity of code to generate - * - * @var integer - */ - private $quantity; - - /** - * Length of code to generate - * - * @var integer - */ - private $length; - /** * Create a new job instance. * - * @param integer $quantity - * @param integer $length + * @param integer $amount Amount of code to generate. + * @param integer $length Length of each code to generate. * @return void */ - public function __construct(int $quantity, int $length) + public function __construct(protected int $amount, protected int $length) { - $this->quantity = $quantity; - $this->length = $length; } /** * Execute the job. - * TODO: Mettre tout ce bordel dans une transaction quand les serveur de leurs morts auront été mis à jour Uu. * * @return void */ public function handle() { - /** @var \App\Models\Settings $settings */ - $settings = app(Settings::class); + DB::transaction(function () { + // ! Le premier code commence à 1 + $last_id = (Code::query()->max('id') ?? 0) + 1; - $maxSQLPlaceholders = 65535; + /** @var \App\Models\Settings $settings */ + $settings = app(Settings::class); - $insertColumns = collect(DB::getSchemaBuilder() - ->getColumnListing((new Code())->getTable())) - ->filter(function ($name) { - // * Ignorer les colonnes avec valeurs par défaut sur la table. - return !in_array($name, ['id', 'code_used', 'code_exported']); - })->count(); + $maxSQLPlaceholders = 65535; - /** - * Nombre d'insertions max sur un seule requète - * - * @var integer $perPage - */ - $perPage = $maxSQLPlaceholders / $insertColumns; + $insertColumns = collect(DB::getSchemaBuilder() + ->getColumnListing((new Code())->getTable())) + ->filter(function ($name) { + // * Ignorer les colonnes avec valeurs par défaut sur la table. + return !in_array($name, ['id', 'code_used', 'code_exported']); + })->count() + 1; - /** - * Nombre de page totale à insérer. - * - * @var integer $totalPages - */ - $totalPages = \ceil($this->quantity / $perPage); + /** + * Nombre d'insertions max sur un seule requète + * + * @var integer $perPage + */ + $perPage = \floor($maxSQLPlaceholders / $insertColumns); - $totalGeneratedInserts = 0; + /** + * Nombre de page totale à insérer. + * + * @var integer $totalPages + */ + $totalPages = \ceil($this->amount / $perPage); - for ($currentPage = 1; $currentPage <= $totalPages; $currentPage++) { - $inserts = []; - $insertToGenerate = min($perPage, $this->quantity - $totalGeneratedInserts); - do { - $inserts[] = [ - 'date_creation' => now()->format('Y-m-d'), - ]; - } while ($totalGeneratedInserts < $this->quantity and --$insertToGenerate); + $totalGeneratedInserts = 0; - // * Mass insert - Code::insert($inserts); + for ($currentPage = 1; $currentPage <= $totalPages; $currentPage++) { + $inserts = []; + $insertToGenerate = min($perPage, $this->amount - $totalGeneratedInserts); + do { + $inserts[] = [ + 'id' => $last_id++, + 'date_creation' => now()->format('Y-m-d'), + ]; + } while (($totalGeneratedInserts < $this->amount) && --$insertToGenerate); - $totalGeneratedInserts += count($inserts); - } + // * Mass insert + Code::query()->insert($inserts); - // * Fin de la génération. - Mail::to(config('mail.MAIL_ADMIN')) - ->send(new CodeGenerationEnd($this->quantity, $settings->name)); + $totalGeneratedInserts += count($inserts); + } + + // * Fin de la génération. + Mail::to(config('mail.admin')) + ->send(new CodeGenerationEnd($this->amount, $settings->name)); + }); } /** * In case of job failure * - * @param Exception $exception + * @param \Exception $exception * @return void */ - public function failed(Exception $exception) + public function failed(\Exception $exception) { - Mail::to(config('mail.MAIL_ADMIN')) - ->send(new JobFailed("ProcessUniqueCode", [ - 'message' => $exception->getMessage(), - 'trace' => $exception->getTraceAsString() - ])); + Mail::to(config('mail.admin'))->send( + new JobFailed('ProcessUniqueCode', [ + 'message' => $exception->getMessage(), + 'trace' => $exception->getTrace() + ]) + ); + } + + /** + * Get the middleware the job should pass through. + * + * @return array + */ + public function middleware(): array + { + return [ + (new WithoutOverlapping('code_generation')) + ->releaseAfter(60) + ]; } } diff --git a/app/Lib/Helpers/CollectionHelper.php b/app/Lib/Helpers/CollectionHelper.php index b9e9ecd..a665a2f 100644 --- a/app/Lib/Helpers/CollectionHelper.php +++ b/app/Lib/Helpers/CollectionHelper.php @@ -1,6 +1,6 @@ getBaseName(); diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php index d6b6fff..de1c040 100644 --- a/app/Lib/Helpers/ToolboxHelper.php +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -14,42 +14,13 @@ use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; +use Illuminate\Validation\Rules\Enum; use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Finder\SplFileInfo; class ToolboxHelper { - /** - * Run a terminal command and gives the output - * - * @param array|string $command The command to execute on terminal. - * @param boolean $throw Wether to throw en esception on failure or not. - * @return string|false Return false on failure only if $throw is false. - * @phpcs:disable Squiz.Commenting.FunctionComment.EmptyThrows - * @phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber - * @throws \Illuminate\Process\Exceptions\ProcessTimedOutException - * @throws \Symfony\Component\Process\Exception\LogicException - * @throws \Symfony\Component\Process\Exception\InvalidArgumentException - * @throws \Symfony\Component\Process\Exception\RuntimeException - * @throws \LogicException - * @throws \RuntimeException If the command fails. - */ - public static function runConsoleCommand(array|string $command, bool $throw = true): string | false - { - // phpcs:enable - $process = \Illuminate\Support\Facades\Process::command($command)->run(); - if ($process->failed()) { - $code = $process->exitCode(); - $ouput = $process->errorOutput(); - if ($throw) { - throw new \RuntimeException("Failed to run command exit code {$code} with output \n{$ouput}"); - } - return false; - } - return $process->output(); - } - /** * @param array $array1 * @param array $array2 @@ -104,7 +75,7 @@ class ToolboxHelper throw new \RuntimeException(); } if (\floatval($response->json('score')) < 0.8) { - $fail("Vous n'avez pas obtenu un score assez élevé lors de la validation du recaptcha"); + $fail(trans('recaptcha.not_enough_score')); } return; } @@ -117,7 +88,7 @@ class ToolboxHelper throw new \RuntimeException(); } } catch (\Exception $e) { - $fail('Erreur lors de la validation du formulaire veuillez réssayer'); + $fail(trans('recaptcha.error')); } //end try } ] @@ -546,4 +517,24 @@ class ToolboxHelper ->contains(fn (string $class_interface) => $class_interface === $interface) ); } + + /** + * Get validated pagination from request. + * + * @param integer $default + * @param string $field + * @param string $enumPath + * @return integer + */ + public static function getValidatedEnum(int $default, string $field, string $enumPath): int + { + try { + return \intval(Validator::make( + [$field => \request()->get($field)], + [$field => new Enum($enumPath)] + )->validated()[$field]); + } catch (ValidationException $e) { + return $default; + } + } } diff --git a/class/MesBR.php b/app/Lib/venvor/MesBR.php similarity index 100% rename from class/MesBR.php rename to app/Lib/venvor/MesBR.php diff --git a/app/Mail/CodeGenerationEnd.php b/app/Mail/CodeGenerationEnd.php index c472db6..f4cd179 100644 --- a/app/Mail/CodeGenerationEnd.php +++ b/app/Mail/CodeGenerationEnd.php @@ -4,6 +4,9 @@ namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; +use Illuminate\Mail\Mailables\Address; +use Illuminate\Mail\Mailables\Content; +use Illuminate\Mail\Mailables\Envelope; use Illuminate\Queue\SerializesModels; class CodeGenerationEnd extends Mailable @@ -12,41 +15,42 @@ class CodeGenerationEnd extends Mailable use SerializesModels; /** - * Number of codes generated + * Create a new job instance. * - * @var integer - */ - private $quantity; - - /** - * The game name - * - * @var string - */ - private $gameName; - - /** - * Create a new message instance. - * - * @param integer $quantity - * @param string $gameName + * @param integer $amount Amount of code to generate. + * @param string $gameName The game name. * @return void */ - public function __construct(int $quantity, string $gameName) + public function __construct(private int $amount, private string $gameName) { - $this->quantity = $quantity; - $this->gameName = $gameName; } /** - * Build the message. + * Get the message envelope. * - * @return $this + * @return \Illuminate\Mail\Mailables\Envelope */ - public function build() + public function envelope(): \Illuminate\Mail\Mailables\Envelope { - return $this->subject('Fin de génération des codes uniques') - ->view('back::mails.generate-end-email') - ->with(['quantity' => $this->quantity, 'gameName' => $this->gameName]); + return new Envelope( + to: [new Address(\config('mail.admin'))], + subject: trans('Fin de génération des codes uniques'), + ); + } + + /** + * Get the message content definition. + * + * @return \Illuminate\Mail\Mailables\Content + */ + public function content(): \Illuminate\Mail\Mailables\Content + { + return new Content( + markdown: 'back::mails.generate-end-email', + with: [ + 'quantity' => $this->amount, + 'gameName' => $this->gameName + ], + ); } } diff --git a/app/Mail/JobFailed.php b/app/Mail/JobFailed.php index c4189c7..c686f0a 100644 --- a/app/Mail/JobFailed.php +++ b/app/Mail/JobFailed.php @@ -11,12 +11,6 @@ class JobFailed extends Mailable use Queueable; use SerializesModels; - /** @var string */ - public $job; - - /** @var array */ - public $exception; - /** * Create a new message instance. * @@ -24,11 +18,10 @@ class JobFailed extends Mailable * @param array $exception * @return void */ - public function __construct(string $job, array $exception) + public function __construct(public string $job, public array $exception) { - $this->job = $job; - $this->exception = $exception; } + /** * Build the message. * diff --git a/app/Models/ActivityLog.php b/app/Models/ActivityLog.php new file mode 100644 index 0000000..1ab7000 --- /dev/null +++ b/app/Models/ActivityLog.php @@ -0,0 +1,129 @@ + + */ + protected $fillable = [ + 'is_anonymous', + 'model_class', + 'model_id', + 'event', + 'data', + 'created_at', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'is_anonymous' => 'bool', + 'event' => ActivityLogsEventEnum::class, + 'data' => 'json', + 'created_at' => 'datetime', + ]; + + // * METHODS + + /** + * Add new activity to the activity logs list. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum + * @return void + */ + public static function addActivity(Model $model, ActivityLogsEventEnum $eventEnum): void + { + $isAnonymous = true; + /** @var \Illuminate\Database\Eloquent\Model|null */ + $userModel = auth('backend')->user(); + if (is_object($userModel)) { + $userModel = $userModel->getKeyForSelectQuery(); + $isAnonymous = false; + } + $activity = new self(); + $activity->user_id = $userModel; + $activity->is_console = app()->runningInConsole(); + $activity->is_anonymous = $isAnonymous; + $activity->model_class = \get_class($model); + $activity->model_id = $model->getKey(); + $activity->event = $eventEnum; + $activity->data = static::getChangedColumns($activity, $model, $eventEnum); + $activity->created_at = Carbon::now(); + $activity->saveOrFail(); + } + + /** + * Get old, new columns that has changed. + * + * @param \self $activity + * @param \Illuminate\Database\Eloquent\Model $model + * @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum + * @return array|null + */ + public static function getChangedColumns(self $activity, Model $model, ActivityLogsEventEnum $eventEnum): array|null + { + $modelClassName = $activity->model_class; + /** Get type of each fields of the target model */ + $targetModel = $activity->model_class::where( + (new $modelClassName())->getRouteKeyName(), + $activity->model_id + )->first(); + if ($targetModel != null) { + // phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed + $targetModelTypes = collect($targetModel->toArray()) + ->map(function ($field, $fieldIndex) use ($targetModel) { + return Schema::getColumnType($targetModel->getTable(), $fieldIndex); + })->toArray(); + // phpcs:enable + } + /** Return old, new and type of values changed */ + return ($eventEnum === ActivityLogsEventEnum::updated) ? + array_intersect_key($targetModelTypes, $model->getChanges()) : null; + } + + // * RELATIONS + + /** + * User BelongsTo relation. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/Code.php b/app/Models/Code.php index deb2a58..0f646ad 100644 --- a/app/Models/Code.php +++ b/app/Models/Code.php @@ -22,6 +22,13 @@ use Kwaadpepper\Serial\SerialCaster; */ class Code extends Model { + /** + * Indicates if the IDs are auto-incrementing. + * + * @var boolean + */ + public $incrementing = false; + /** * The attributes that are mass assignable. * @@ -33,6 +40,17 @@ class Code extends Model 'date_creation' ]; + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'code_used' => 'bool', + 'code_exported' => 'bool', + 'date_creation' => 'date', + ]; + /** * Indicates if the model should be timestamped. * diff --git a/app/Models/Content.php b/app/Models/Content.php deleted file mode 100644 index 05074e7..0000000 --- a/app/Models/Content.php +++ /dev/null @@ -1,25 +0,0 @@ - + */ + protected $fillable = [ + 'seo_title', + 'seo_description', + 'title', + 'content', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'type' => StaticPageType::class, + ]; + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted(): void + { + static::creating(function (self $model) { + // * ASSERTIONS + static::assertTitleIsUnique($model->title); + + // * CHANGES + $model->slug = Str::slug($model->title); + }); + static::updating(function (self $model) { + // * ASSERTIONS + static::assertTitleIsUnique($model->title, $model->id); + + // * CHANGES + $model->slug = Str::slug($model->title); + }); + } + + // * METHODS + + /** + * Asserts using validation that the title is unique + * + * @param string|null $title + * @param integer|null $id + * @return void + * @throws \Illuminate\Validation\ValidationException If an actu title already exists. + */ + private static function assertTitleIsUnique(string|null $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/Models/User.php b/app/Models/User.php index 8684263..91ae6f9 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,49 +3,50 @@ namespace App\Models; use App\Enums\Users\RoleEnum; +use App\Traits\Models\ActivityLog; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Hash; /** - * User. + * @property string $first_name Prénom. + * @property string $last_name Nom. + * @property string $email Email. + * @property string $password Mot de passe. + * @property \App\Enums\Users\RoleEnum $role Rôle. + * @property \Illuminate\Support\Carbon $published État de publication. + * @property \Illuminate\Support\Carbon $published_at Date de mise à jour de l'état de publication. + * @property-read \Illuminate\Support\Carbon $created_at Created date. + * @property-read \Illuminate\Support\Carbon $updated_at Updated date. * - * @property string $firstname Firstname - * @property string $lastname Lastname - * @property string $email Email - * @property-read \Illuminate\Support\Carbon $email_verified_at Date of email verification. - * @property string $password Password - * @property-read string $remember_token Remember token - * @property \App\Enums\Users\RoleEnum $role Role of the user - * @property-read \Illuminate\Support\Carbon $created_at Creation Date. - * @property-read \Illuminate\Support\Carbon $updated_at Last update Date. - * - * @method protected static function booted() The "booted" method of the model. - * @method private static function updatePassword($model) Update the password if needed. + * @property-read \App\Models\ActivityLog $activityLogs Activities logs One-to-many relationship. */ class User extends Authenticatable { + use ActivityLog; use HasFactory; use Notifiable; /** * The attributes that are mass assignable. * - * @var array + * @var array */ protected $fillable = [ - 'firstname', - 'lastname', + 'first_name', + 'last_name', 'email', 'password', 'role', + 'published', + 'published_at', ]; /** * The attributes that should be hidden for serialization. * - * @var array + * @var array */ protected $hidden = [ 'password', @@ -53,13 +54,14 @@ class User extends Authenticatable ]; /** - * Cast the property to an enum. + * The attributes that should be cast. * - * @var array + * @var array */ - protected $enumCasts = [ - 'role' => RoleEnum::class, + protected $casts = [ + 'role' => RoleEnum::class, 'email_verified_at' => 'datetime', + 'published' => 'boolean', ]; /** @@ -67,15 +69,30 @@ class User extends Authenticatable * * @return void */ - protected static function booted() + protected static function booted(): void { - // * EVENT CLOSURES. static::creating(function (self $model) { static::updatePassword($model); - static::setOrder($model); + // * Prevent user elevation privileges + throw_if( + auth('backend')->user() and auth('backend')->user()->role->value() > $model->role->value(), + AuthorizationException::class + ); }); static::updating(function (self $model) { static::updatePassword($model); + if (optional(auth('backend')->user())->getKey() === $model->getKey()) { + \validator( + ['published' => $model->published], + ['published' => 'required|boolean|accepted'], + ['published.accepted' => trans('Vous ne pouvez pas déactiver votre propre compte')], + )->validate(); + } + // * Prevent user elevation privileges + throw_if( + auth('backend')->user() and auth('backend')->user()->role->value() > $model->role->value(), + AuthorizationException::class + ); }); } @@ -93,4 +110,16 @@ class User extends Authenticatable $model->password = Hash::make($model->password); } } + + // * RELATIONS + + /** + * Activities logs One-to-many relationship. + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function activityLogs(): \Illuminate\Database\Eloquent\Relations\HasMany + { + return $this->hasMany(ActivityLog::class); + } } diff --git a/app/Observers/ModelObserver.php b/app/Observers/ModelObserver.php new file mode 100644 index 0000000..71d194b --- /dev/null +++ b/app/Observers/ModelObserver.php @@ -0,0 +1,54 @@ +role->value() <= $minRole->value(); + } +} diff --git a/app/Policies/StaticPagePolicy.php b/app/Policies/StaticPagePolicy.php new file mode 100644 index 0000000..3ab2af8 --- /dev/null +++ b/app/Policies/StaticPagePolicy.php @@ -0,0 +1,36 @@ +role); + } + + /** + * Determine whether the user can create models. + * + * @param \App\Models\User $authUser + * @return boolean + */ + public function create(User $authUser): bool + { + return UserStaticRules::atLeastRole($authUser, RoleEnum::admin); + } + + /** + * Determine whether the user can update the model. + * + * @param \App\Models\User $authUser + * @param \App\Models\User $user + * @return boolean + */ + public function update(User $authUser, User $user): bool + { + return $authUser->getRouteKey() === $user->getRouteKey() or + (UserStaticRules::atLeastRole($authUser, RoleEnum::admin) and + UserStaticRules::atLeastRole($authUser, $user->role)); + } + + /** + * Determine whether the user can delete the model. + * + * @param \App\Models\User $authUser + * @param \App\Models\User $user + * @return boolean + */ + public function delete(User $authUser, User $user): bool + { + return $authUser->getRouteKey() !== $user->getRouteKey() and + UserStaticRules::atLeastRole($authUser, RoleEnum::admin) and + UserStaticRules::atLeastRole($authUser, $user->role); + } + + /** + * Determine whether the user can restore the model. + * + * @param \App\Models\User $authUser + * @param \App\Models\User $user + * @return boolean + */ + public function restore(User $authUser, User $user): bool + { + return $authUser->getRouteKey() !== $user->getRouteKey() and + UserStaticRules::atLeastRole($authUser, RoleEnum::admin) and + UserStaticRules::atLeastRole($authUser, $user->role); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @param \App\Models\User $authUser + * @param \App\Models\User $user + * @return boolean + */ + public function forceDelete(User $authUser, User $user): bool + { + return $authUser->getRouteKey() !== $user->getRouteKey() and + UserStaticRules::atLeastRole($authUser, RoleEnum::admin) and + UserStaticRules::atLeastRole($authUser, $user->role); + } + + /** + * Determine whether the user can duplicate the model. + * + * @param \App\Models\User $authUser + * @param \App\Models\User $user + * @return boolean + */ + public function duplicate(User $authUser, User $user): bool + { + return $authUser->getRouteKey() !== $user->getRouteKey() and + UserStaticRules::atLeastRole($authUser, RoleEnum::admin) and + UserStaticRules::atLeastRole($authUser, $user->role); + } + + /** + * Determine whether the user can publish/unpublish the model. + * + * @param \App\Models\User $authUser + * @param \App\Models\User $user + * @return boolean + */ + public function changePublished(User $authUser, User $user): bool + { + return $authUser->getRouteKey() !== $user->getRouteKey() and + UserStaticRules::atLeastRole($authUser, RoleEnum::admin) and + UserStaticRules::atLeastRole($authUser, $user->role); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 2cced3a..8bfc071 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,8 @@ namespace App\Providers; use App\Models\Settings; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\URL; use Illuminate\Support\Pluralizer; @@ -26,6 +28,9 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { + Model::shouldBeStrict(!$this->app->environment('production')); + + // * HTTPS FIX URL::forceScheme('https'); // * HA PROXY FIX. @@ -34,17 +39,17 @@ class AppServiceProvider extends ServiceProvider return request()->getClientIp(); } else { return request()->server('HTTP_X_FORWARDED_FOR') ?? - request()->getClientIp(); + request()->getClientIp(); } }); - // * LOCAL FORCE eg: for Carbon. + // * LOCAL FORCE eg: for Carbon setlocale(LC_ALL, \sprintf( '%s_%s.UTF-8', config('app.locale'), \strtoupper(config('app.locale')) )); - + Carbon::setLocale(config('app.locale')); Pluralizer::useLanguage('french'); app()->singleton(Settings::class, function () { diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index b726da0..1945fce 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,14 +2,17 @@ namespace App\Providers; +use App\Enums\Users\RoleEnum; +use App\Models\User; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider { /** - * The policy mappings for the application. + * The model to policy mappings for the application. * - * @var array + * @var array */ protected $policies = []; @@ -18,7 +21,10 @@ class AuthServiceProvider extends ServiceProvider * * @return void */ - public function boot() + public function boot(): void { + Gate::define('isConceptor', function (User $user) { + return $user->role === RoleEnum::conceptor; + }); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 13750e8..6e0c396 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -9,9 +9,9 @@ use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvi class EventServiceProvider extends ServiceProvider { /** - * The event listener mappings for the application. + * The event to listener mappings for the application. * - * @var array + * @var array> */ protected $listen = [ Registered::class => [ @@ -19,15 +19,6 @@ class EventServiceProvider extends ServiceProvider ], ]; - /** - * Register any events for your application. - * - * @return void - */ - public function boot(): void - { - } - /** * Determine if events and listeners should be automatically discovered. * diff --git a/app/Providers/TranslationServiceProvider.php b/app/Providers/TranslationServiceProvider.php index a042a23..b3e3f4b 100644 --- a/app/Providers/TranslationServiceProvider.php +++ b/app/Providers/TranslationServiceProvider.php @@ -18,7 +18,7 @@ class TranslationServiceProvider extends ServiceProvider public function boot(): void { foreach ($this->collectLocalesStrings() as $locale) { - // * Supported locales + // * Suported locales Cache::rememberForever(sprintf('translations.%s', $locale), function () use ($locale) { $translations = [ 'php' => $this->phpTranslations($locale), diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index baf50f0..113b419 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Enums\Users\RoleEnum; use App\Models\Prize; use App\Models\Settings; use Illuminate\Pagination\Paginator; @@ -25,16 +26,25 @@ class ViewServiceProvider extends ServiceProvider View::addNamespace('back', resource_path('views')); View::addNamespace('theme', resource_path('theme/mounted/views')); - if (!app()->runningInConsole()) { - $appInfos = Cache::remember('composer', 3600, function () { - return json_decode(File::get(\app_path('../composer.json'))); - }); - View::share('name', $appInfos->name); - View::share('version', $appInfos->version); - View::share('license', $appInfos->license); - // * FORCE BOOTSTRAP PAGINATOR - Paginator::defaultView('back::modules.pagination'); + $appInfos = Cache::remember('composer', 360, function () { + return json_decode(File::get(\app_path('../composer.json'))); + }); + // Share composer.json infos. + if (isset($appInfos->name) and isset($appInfos->version)) { + View::share('cpsr_name', $appInfos->name); + View::share('cpsr_version', $appInfos->version); + } + if (!app()->runningInConsole()) { + // * FORCE BOOTSTRAP PAGINATOR (or custom if in front) + // Early boot, request wont be filled as expected. + if (collect(explode('/', \request()->getPathInfo()))->get(1) === 'bo') { + Paginator::defaultView('modules.pagination'); + } else { + Paginator::useBootstrapFive(); + } + + // FIXME: USe trait cache here // On ramène le nom du jeu et le nom de la société sur toute les pages. $settingsGlobal = Cache::get('settingsGlobal'); if (!$settingsGlobal) { @@ -53,9 +63,15 @@ class ViewServiceProvider extends ServiceProvider } View::share('prizesGlobal', $prizesGlobal); + // * CUSTOM IF STATEMENTS + Blade::if('admin', function () { + return auth('backend')->user() and auth('backend')->user() + ->role->value() <= RoleEnum::admin->value(); + }); Blade::if('superadmin', function () { - return auth()->user() && auth()->user()->role == 1; + return auth('backend')->user() and auth('backend')->user() + ->role->equals(RoleEnum::conceptor); }); } //end if } diff --git a/app/Traits/Controllers/ChangesModelOrder.php b/app/Traits/Controllers/ChangesModelOrder.php new file mode 100644 index 0000000..51af5ba --- /dev/null +++ b/app/Traits/Controllers/ChangesModelOrder.php @@ -0,0 +1,57 @@ +route()->parameterNames); + $className = Str::ucfirst(Str::lower($params->get($params->count() - 2))); + $className = "\\App\\Models\\$className"; + + if (!class_exists($className)) { + throw new \RuntimeException("The $className class doesn't exist."); + } + + /** @var \Illuminate\Database\Eloquent\Model|null */ + $model = $className::where($model->getRouteKeyName(), $model->getRouteKey())->first(); + + if (!$model) { + return back()->with('error', trans('crud.messages.order_not_changed')); + } + + return DB::transaction(function () use ($request, $className, $model) { + /** @var \Illuminate\Database\Eloquent\Model|null */ + $tmp = $className::where('order', $request->direction ? '<' : '>', $model->order) + ->orderBy('order', $request->direction ? 'DESC' : 'ASC')->first(); + + if (!$tmp) { + return back()->with('error', trans('crud.messages.order_not_changed')); + } + + $newOrder = $tmp->order; + $tmp->order = $model->order; + $model->order = $newOrder; + $tmp->saveOrFail(); + $model->saveOrFail(); + Session::flash('success', trans('crud.messages.order_changed')); + + return back(); + }); + } +} diff --git a/app/Traits/Controllers/UpdateModelPublished.php b/app/Traits/Controllers/UpdateModelPublished.php new file mode 100644 index 0000000..4ca47df --- /dev/null +++ b/app/Traits/Controllers/UpdateModelPublished.php @@ -0,0 +1,26 @@ +published = !$model->published; + $model->saveOrFail(); + return redirect()->back()->with('success', trans(__('crud.messages.publish_status_saved'))); + } +} diff --git a/app/Traits/Enums/BaseEnum.php b/app/Traits/Enums/BaseEnum.php index 615c807..559b1ee 100644 --- a/app/Traits/Enums/BaseEnum.php +++ b/app/Traits/Enums/BaseEnum.php @@ -4,14 +4,12 @@ namespace App\Traits\Enums; use Illuminate\Support\Str; -/** - * @author Jérémy Munsch - */ trait BaseEnum { // * GENERIC METHODS + /** - * Get enum value + * Get enum value. * * @return string|integer */ @@ -21,7 +19,7 @@ trait BaseEnum } /** - * Get enum label + * Get enum label. * * @return string */ @@ -31,7 +29,7 @@ trait BaseEnum } /** - * Get enum name + * Get enum name. * * @return string */ @@ -43,7 +41,7 @@ trait BaseEnum // * STATIC FETCH METHODS /** - * Get enum labels + * Get enum labels. * * @return array */ @@ -65,7 +63,7 @@ trait BaseEnum } /** - * Get enum values + * Get enum values. * * @return array */ @@ -79,7 +77,7 @@ trait BaseEnum } /** - * Get enums + * Get enums. * * @return array */ @@ -89,7 +87,7 @@ trait BaseEnum } /** - * Get enums + * Get enums. * * @return array */ @@ -118,30 +116,36 @@ trait BaseEnum } /** - * Fetch enum using value + * Fetch enum using value. * * @param \App\Traits\Enums\BaseEnum|integer|string $value + * @param string $field * @return \App\Traits\Enums\BaseEnum|null */ - public static function make(self|int|string $value): self|null + public static function make(self|int|string $value, string $field = 'value'): self|null { + if ($field === "label") { + $enumLabels = array_change_key_case(array_flip(self::toLabels()), CASE_LOWER); + $value = (isset($enumLabels[strtolower($value)])) ? $enumLabels[strtolower($value)] : false; + $field = 'name'; + } return !\is_object($value) ? - \collect(self::cases())->keyBy('value')->get($value) : $value; + \collect(self::cases())->keyBy($field)->get($value) : $value; } /** - * Test if 2 enum are equals + * Test if 2 enum are equals. * * @param object ...$others * @return boolean - * @throws \Error If provided element are not enums taht extends BaseEnum. + * @throws \Error If provided element are not enums that extends BaseEnum. */ public function equals(object ...$others): bool { foreach ($others as $other) { if (!\in_array(BaseEnum::class, \class_uses_recursive($other))) { throw new \Error(__METHOD__ . - ' requires $enum to use ' . BaseEnum::class); + ' requires $enum to use ' . BaseEnum::class); } if ( get_class($this) === get_class($other) @@ -154,7 +158,7 @@ trait BaseEnum } /** - * Serialize to json + * Serialize to json. * * @return mixed */ @@ -167,7 +171,7 @@ trait BaseEnum // * CACHE /** - * Get cache array + * Get cache array. * * @param string $index * @return array @@ -182,7 +186,7 @@ trait BaseEnum } /** - * Set cache array + * Set cache array. * * @param string $index * @param array $items @@ -198,7 +202,7 @@ trait BaseEnum } /** - * Init cache if needed + * Init cache if needed. * * @return void */ @@ -219,7 +223,7 @@ trait BaseEnum // * PRIVATE /** - * Fetch the LABELS constant if exists + * Fetch the LABELS constant if exists. * * @return array|null */ @@ -235,7 +239,7 @@ trait BaseEnum } /** - * Get custom constants + * Get custom constants. * * @return array */ diff --git a/app/Traits/Models/ActivityLog.php b/app/Traits/Models/ActivityLog.php new file mode 100644 index 0000000..67973e1 --- /dev/null +++ b/app/Traits/Models/ActivityLog.php @@ -0,0 +1,23 @@ +endpoint = $endpoint; - $this->api_key = $api_key; - } - - public function getCustomer($id){ - return $this->callAPI('GET', "/customer/id/$id"); - } - - public function getCustomerByEmail($email){ - return $this->callAPI('GET', "/customer/email/$email"); - } - - public function createCustomer($email, $password, $firstname, $lastname, $optin, $birthdate = null, $phone = null, $address = null, $address2 = null, $city = null, $postcode = null, $country = null){ - $user = [ - 'email' => $email, - 'password' => $password, - 'firstname' => $firstname, - 'lastname' => $lastname, - 'opt_in' => $optin, - 'birth_date' => $birthdate, - 'phone' => $phone, - 'address' => $address, - 'address2' => $address2, - 'city' => $city, - 'postcode' => $postcode, - 'country' => $country - ]; - return $this->callAPI('POST', '/customer/create', $user); - } - - public function updateCustomer($crmId, $firstname = null, $lastname = null, $optin = null, $birthdate = null, $phone = null, $address = null, $address2 = null, $city = null, $postcode = null, $country = null){ - $user = []; - - if ($firstname !== null) - $user['firstname'] = $firstname; - - if ($lastname !== null) - $user['lastname'] = $lastname; - - if ($optin !== null) - $user['opt_in'] = $optin; - - if ($birthdate !== null) - $user['birth_date'] = $birthdate; - - if ($phone !== null) - $user['phone'] = $phone; - - if ($address !== null) - $user['address'] = $address; - - if ($address2 !== null) - $user['address2'] = $address2; - - if ($city !== null) - $user['city'] = $city; - - if ($postcode !== null) - $user['postcode'] = $postcode; - - if ($country !== null) - $user['country'] = $country; - - - return $this->callAPI('PUT', "/customer/$crmId", $user); - } - - public function deleteCustomer($id){ - return $this->callAPI('DELETE', "/customer/$id"); - } - - public function changePwdCustomer($id, $password){ - return $this->callAPI('POST', "/customer/$id/change-password", ['password' => $password]); - } - - public function activateCustomer($id){ - return $this->callAPI('POST', "/customer/$id/activate"); - } - - public function toggleOptInCustomer($id){ - return $this->callAPI('POST', "/customer/$id/toggle-optin"); - } - - public function loginCustomer($email, $password){ - return $this->callAPI('POST', "/customer/login", ['email' => $email, 'password' => $password]); - } - - public function createSingleOptin($email){ - return $this->callAPI('POST', '/single-optin', ['email' => $email]); - } - - public function ArcadiaOutgoingMail($crm_id, $fields, $type){ - return $this->callAPI('POST', '/arcadia/outgoing-mail', ['crm_id' => $crm_id, 'fields' => json_encode($fields), 'type' => $type]); - } - - private function callAPI($method, $url, $data = false){ - - if (strpos($this->endpoint, "dev")){ - if ($data !== false){ - $data = array_merge($data, ['api_token' => $this->api_key]); - }else{ - $data = ['api_token' => $this->api_key]; - } - } - - $url = $this->endpoint . '/api/v1' . $url; - $curl = curl_init(); - switch ($method){ - case "POST": - curl_setopt($curl, CURLOPT_POST, 1); - if ($data) - curl_setopt($curl, CURLOPT_POSTFIELDS, $data); - break; - case "PUT": - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); - if ($data) - curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); - break; - case "DELETE": - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); - if ($data) - curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); - break; - default: - if ($data) - $url = sprintf("%s?%s", $url, http_build_query($data)); - } - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - if (!strpos($this->endpoint, "dev")) { - curl_setopt($curl, CURLOPT_HTTPHEADER, array( - 'Accept: application/json', - 'Authorization: Bearer ' . $this->api_key - )); - } - - $result = curl_exec($curl); - - if (!curl_errno($curl)) { - $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); - if (!in_array($http_code, [200, 201])) - return (object) ['status' => 'KO', 'code' => 500, 'message' => 'Connection to API failed - Code HTTP : '. $http_code]; - } else { - return (object) ['status' => 'KO', 'code' => 500, 'message' => 'Connection to API failed : '. curl_error($curl)]; - } - - curl_close($curl); - return json_decode($result); - } -} diff --git a/composer.json b/composer.json index db9780e..48c9bbf 100644 --- a/composer.json +++ b/composer.json @@ -1,30 +1,31 @@ { - "name": "laravel/laravel", + "name": "uwil/gen-game-web", "version": "2.0.0", "type": "project", - "description": "The Laravel Framework.", + "description": "Game generator", + "support": { + "email": "equipe.web@ldc.fr" + }, "keywords": [ - "framework", + "game", "laravel" ], "license": "MIT", "require": { - "php": "^8.1", + "php": "^8.2", "diglactic/laravel-breadcrumbs": "^8.0", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^10.0", "laravel/tinker": "^2.8", "laravel/ui": "^4.2", "mews/purifier": "^3.4", - "sentry/sentry-laravel": "*", - "kwaadpepper/enum": "^2.1", - "kwaadpepper/serial-int-caster": "^1.0" + "sentry/sentry-laravel": "*" }, "require-dev": { - "doctrine/dbal": "^3.6", "fakerphp/faker": "^1.9.1", "kitloong/laravel-migrations-generator": "^6.8", "krlove/eloquent-model-generator": "dev-l10-compatibility", + "laravel-lang/common": "^4.0", "laravel/pint": "^1.0", "laravel/sail": "^1.18", "mockery/mockery": "^1.4.4", @@ -32,7 +33,6 @@ "phpunit/phpunit": "^10.0", "slevomat/coding-standard": "^8.10", "spatie/laravel-ignition": "^2.0", - "squizlabs/php_codesniffer": "^3.6", "thedoctor0/laravel-factory-generator": "^1.2" }, "autoload": { diff --git a/config/app.php b/config/app.php index 06b5bd4..486751d 100644 --- a/config/app.php +++ b/config/app.php @@ -108,7 +108,7 @@ return [ | */ - 'faker_locale' => 'en_US', + 'faker_locale' => 'fr_FR', /* |-------------------------------------------------------------------------- @@ -125,6 +125,23 @@ return [ 'cipher' => 'AES-256-CBC', + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file' + ], + /* |-------------------------------------------------------------------------- | Autoloaded Service Providers @@ -179,7 +196,6 @@ return [ App\Providers\RouteServiceProvider::class, App\Providers\TranslationServiceProvider::class, App\Providers\ViewServiceProvider::class, - ], /* diff --git a/config/auth.php b/config/auth.php index 9a8be38..f5385f0 100644 --- a/config/auth.php +++ b/config/auth.php @@ -31,7 +31,7 @@ return [ | users are actually retrieved out of your database or other storage | mechanisms used by this application to persist your user's data. | - | Supported: "session", "token" + | Supported: "session" | */ @@ -43,6 +43,7 @@ return [ 'frontend' => [ 'driver' => 'session', + // ! Remplacer "users" par le model authenticable voulu 'provider' => 'customers', ], ], @@ -67,11 +68,11 @@ return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent', - 'model' => App\Models\User::class, + 'model' => \App\Models\User::class, ], 'customers' => [ 'driver' => 'eloquent', - 'model' => App\Models\Customer::class, + 'model' => \App\Models\Customer::class, ], ], @@ -84,22 +85,26 @@ return [ | than one user table or model in the application and you want to have | separate password reset settings based on the specific user types. | - | The expire time is the number of minutes that the reset token should be + | The expiry time is the number of minutes that each reset token will be | considered valid. This security feature keeps tokens short-lived so | they have less time to be guessed. You may change this as needed. | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | */ 'passwords' => [ 'users' => [ 'provider' => 'users', - 'table' => 'password', + 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], 'customers' => [ 'provider' => 'customers', - 'table' => 'password', + 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], diff --git a/config/breadcrumbs.php b/config/breadcrumbs.php index 0b8d984..6c96342 100644 --- a/config/breadcrumbs.php +++ b/config/breadcrumbs.php @@ -23,7 +23,7 @@ return [ | */ - 'view' => 'breadcrumbs/breadcrumb-layout', + 'view' => 'modules/breadcrumbs/breadcrumb-layout', /* |-------------------------------------------------------------------------- diff --git a/config/broadcasting.php b/config/broadcasting.php index 3e45d82..ae079a6 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -11,7 +11,7 @@ return [ | framework when an event needs to be broadcast. You may set this to | any of the connections defined in the "connections" array below. | - | Supported: "pusher", "redis", "log", "null" + | Supported: "pusher", "ably", "redis", "log", "null" | */ diff --git a/config/cache.php b/config/cache.php index 9ac517a..8e0f9c7 100644 --- a/config/cache.php +++ b/config/cache.php @@ -13,9 +13,6 @@ return [ | using this caching library. This connection is used when another is | not explicitly specified when executing a given caching function. | - | Supported: "apc", "array", "database", "file", - | "memcached", "redis", "dynamodb" - | */ 'default' => env('CACHE_DRIVER', 'file'), @@ -29,6 +26,9 @@ return [ | well as their drivers. You may even define multiple stores for the | same cache driver to group types of items stored in your caches. | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | */ 'stores' => [ @@ -99,9 +99,9 @@ return [ | Cache Key Prefix |-------------------------------------------------------------------------- | - | When utilizing a RAM based store such as APC or Memcached, there might - | be other applications utilizing the same cache. So, we'll specify a - | value to get prefixed to all our keys so we can avoid collisions. + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. | */ diff --git a/config/filesystems.php b/config/filesystems.php index e77a2da..89920a5 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -13,20 +13,7 @@ return [ | */ - 'default' => env('FILESYSTEM_DRIVER', 'local'), - - /* - |-------------------------------------------------------------------------- - | Default Cloud Filesystem Disk - |-------------------------------------------------------------------------- - | - | Many applications store files both locally and in the cloud. For this - | reason, you may specify a default "cloud" driver here. This driver - | will be bound as the Cloud disk implementation in the container. - | - */ - - 'cloud' => env('FILESYSTEM_CLOUD', 's3'), + 'default' => env('FILESYSTEM_DISK', 'local'), /* |-------------------------------------------------------------------------- @@ -35,7 +22,7 @@ return [ | | Here you may configure as many filesystem "disks" as you wish, and you | may even configure multiple disks of the same driver. Defaults have - | been setup for each driver as an example of the required options. + | been set up for each driver as an example of the required values. | | Supported Drivers: "local", "ftp", "sftp", "s3" | @@ -78,7 +65,6 @@ return [ ], - /* |-------------------------------------------------------------------------- | Symbolic Links diff --git a/config/hashing.php b/config/hashing.php index db3d9dd..be29b34 100644 --- a/config/hashing.php +++ b/config/hashing.php @@ -29,7 +29,7 @@ return [ */ 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), + 'rounds' => env('BCRYPT_ROUNDS', 12), ], /* diff --git a/config/logging.php b/config/logging.php index 00679d6..5906e47 100644 --- a/config/logging.php +++ b/config/logging.php @@ -3,6 +3,7 @@ use Monolog\Handler\NullHandler; use Monolog\Handler\StreamHandler; use Monolog\Handler\SyslogUdpHandler; +use Monolog\Processor\PsrLogMessageProcessor; return [ diff --git a/config/mail.php b/config/mail.php index 3ca5af0..c5d3548 100644 --- a/config/mail.php +++ b/config/mail.php @@ -15,13 +15,6 @@ return [ 'default' => env('MAIL_MAILER', 'smtp'), - // Mail admin pour l'envoi de mail comme la fin de la génération des codes uniques. - 'MAIL_ADMIN' => env('MAIL_ADMIN'), - - 'contactsList' => [ - 'serviceweb' => env('MAIL_ADMIN', 'equipe.web@ldc.fr') - ], - /* |-------------------------------------------------------------------------- | Mailer Configurations @@ -35,8 +28,8 @@ return [ | sending an e-mail. You will specify which one you are using for your | mailers below. You are free to add additional mailers as required. | - | Supported: "smtp", "sendmail", "mailgun", "ses", - | "postmark", "log", "array" + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover" | */ @@ -118,11 +111,10 @@ return [ 'theme' => 'default', 'paths' => [ - // * For custom compiled css. - public_path('build/theme/css/mail'), - // * For generic customized blade (moteur seulement) resource_path('views/vendor/mail'), ], ], + 'admin' => env('MAIL_ADMIN') + ]; diff --git a/config/queue.php b/config/queue.php index 91725f8..f5a66b9 100644 --- a/config/queue.php +++ b/config/queue.php @@ -101,7 +101,7 @@ return [ */ 'failed' => [ - 'driver' => env('QUEUE_FAILED_DRIVER', 'database'), + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 'database' => env('DB_CONNECTION', 'mysql'), 'table' => 'failed_jobs', ], diff --git a/config/session.php b/config/session.php index 4bf5f2e..d2e3239 100644 --- a/config/session.php +++ b/config/session.php @@ -72,7 +72,7 @@ return [ | */ - 'connection' => env('SESSION_CONNECTION', null), + 'connection' => env('SESSION_CONNECTION'), /* |-------------------------------------------------------------------------- @@ -164,7 +164,7 @@ return [ | | By setting this option to true, session cookies will only be sent back | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you if it can not be done securely. + | the cookie from being sent to you when it can't be done securely. | */ diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..8a8bc99 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ + public function definition() + { + $published = $this->faker->boolean(75); + return [ + 'first_name' => fake()->firstname(), + 'last_name' => fake()->lastname(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', + 'remember_token' => Str::random(10), + 'role' => \collect(RoleEnum::toArray())->random()->value, + 'published' => $published, + 'published_at' => ($published) ? now() : null, + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return static + */ + public function unverified(): static + { + // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index e3d921b..612e0a9 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -15,13 +15,15 @@ return new class extends Migration { Schema::create('users', function (Blueprint $table) { $table->id(); - $table->string('firstname')->comment('Firstname of the user.'); - $table->string('lastname')->comment('Lastname of the user.'); + $table->string('first_name')->comment('First name of the user.'); + $table->string('last_name')->comment('Last name of the user.'); $table->string('email')->unique()->comment('Email of the user.'); $table->timestamp('email_verified_at')->nullable(); $table->string('password')->comment('Password of the user account.'); $table->rememberToken(); - $table->boolean('role')->comment('Role of the user who defines the rights/access.'); + $table->unsignedTinyInteger('role')->comment('Role of the user who defines the rights/access.'); + $table->boolean('published')->comment('The user is acivated or not.'); + $table->timestamp('published_at')->nullable()->comment('The date on which the user was acivated.'); $table->timestamps(); }); } diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php index 0ee0a36..fcacb80 100644 --- a/database/migrations/2014_10_12_100000_create_password_resets_table.php +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreatePasswordResetsTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -29,4 +29,4 @@ class CreatePasswordResetsTable extends Migration { Schema::dropIfExists('password_resets'); } -} +}; diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php index fc1304f..1719198 100644 --- a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateFailedJobsTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -15,7 +15,7 @@ class CreateFailedJobsTable extends Migration { Schema::create('failed_jobs', function (Blueprint $table) { $table->id(); - $table->string('uuid')->nullable()->unique(); + $table->string('uuid')->unique(); $table->text('connection'); $table->text('queue'); $table->longText('payload'); @@ -33,4 +33,4 @@ class CreateFailedJobsTable extends Migration { Schema::dropIfExists('failed_jobs'); } -} +}; diff --git a/database/migrations/2020_10_20_165858_create_codes.php b/database/migrations/2020_10_20_165858_create_codes.php index 4846556..02fa65b 100644 --- a/database/migrations/2020_10_20_165858_create_codes.php +++ b/database/migrations/2020_10_20_165858_create_codes.php @@ -14,7 +14,7 @@ class CreateCodes extends Migration public function up() { Schema::create('codes', function (Blueprint $table) { - $table->id(); + $table->unsignedBigInteger('id')->primary(); $table->boolean('code_used')->default(0); $table->boolean('code_exported')->default(0); $table->date('date_creation'); diff --git a/database/migrations/2020_10_23_153212_create_contents.php b/database/migrations/2020_10_23_153212_create_contents.php deleted file mode 100644 index 6617b31..0000000 --- a/database/migrations/2020_10_23_153212_create_contents.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('key'); - $table->text('value'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('content'); - } -} diff --git a/database/migrations/2023_09_08_102717_create_actitivy_logs_table.php b/database/migrations/2023_09_08_102717_create_actitivy_logs_table.php new file mode 100644 index 0000000..aeb4d90 --- /dev/null +++ b/database/migrations/2023_09_08_102717_create_actitivy_logs_table.php @@ -0,0 +1,39 @@ +id(); + $table->foreignId('user_id')->nullable()->constrained('users') + ->comment('Id of the user associated, or nullable for a deleted user.'); + $table->boolean('is_anonymous')->comment('If there is no user connected when action was realised.'); + $table->boolean('is_console')->comment('If the action was realised in console.'); + $table->string('model_class')->comment('Target model.'); + $table->integer('model_id')->comment('Id of the target model.'); + $table->integer('event')->comment('Event of this activity (ActivityLogsEventEnum).'); + $table->json('data')->nullable()->comment('List of changes (old and new values).'); + $table->timestamp('created_at')->comment('The date on which the user was published.'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('activity_logs'); + } +}; diff --git a/database/migrations/2023_10_19_094711_create_static_pages.php b/database/migrations/2023_10_19_094711_create_static_pages.php new file mode 100644 index 0000000..a28d0c0 --- /dev/null +++ b/database/migrations/2023_10_19_094711_create_static_pages.php @@ -0,0 +1,46 @@ +id(); + + $table->unsignedTinyInteger('type')->unique()->comment('Page type (StaticPageEnum)'); + + $table->string('seo_title')->comment('Seo title about 70 chars as recommended'); + $table->string('seo_description')->comment('Seo description about 160 chars as recommended'); + + $table->string('title')->comment('Title for the page'); + $table->string('slug')->unique()->comment('Unique title slug'); + + $table->text('content')->comment('WYSIWYG text content using ckeditor'); + + $table->timestamps(); + }); + Artisan::call('db:seed', [ + 'class' => 'StaticPageSeeder' + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('static_pages'); + } +}; diff --git a/database/seeders/ContentSeeder.php b/database/seeders/ContentSeeder.php deleted file mode 100644 index b58c58a..0000000 --- a/database/seeders/ContentSeeder.php +++ /dev/null @@ -1,33 +0,0 @@ -key = "mentions legales"; - $mentions->value = "..."; - - $charte = new Content(); - $charte->key = "charte"; - $charte->value = "..."; - - $reglement = new Content(); - $reglement->key = "reglement"; - $reglement->value = "..."; - - $mentions->save(); - $charte->save(); - $reglement->save(); - } -} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 9aa2016..2f99f19 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -14,7 +14,7 @@ class DatabaseSeeder extends Seeder public function run() { $this->call(SettingsSeeder::class); - $this->call(ContentSeeder::class); + $this->call(StaticPageSeeder::class); $this->call(PrizeSeeder::class); } } diff --git a/database/seeders/StaticPageSeeder.php b/database/seeders/StaticPageSeeder.php new file mode 100644 index 0000000..eb60d6c --- /dev/null +++ b/database/seeders/StaticPageSeeder.php @@ -0,0 +1,55 @@ +updateOrCreate( + [ + 'type' => StaticPageType::contact, + ], + [ + 'seo_title' => 'Seo title pour la page contactez nous', + 'seo_description' => 'Seo description pour la page contactez nous', + 'title' => 'Contactez-nous', + 'type' => StaticPageType::contact, + 'content' => \clean(\fake()->randomHtml(6, 7)), + ] + ); + StaticPage::query()->updateOrCreate( + [ + 'type' => StaticPageType::legals, + ], + [ + 'seo_title' => 'Seo title pour la page mentions légales', + 'seo_description' => 'Seo description pour la page mentions légales', + 'title' => 'Mentions légales', + 'type' => StaticPageType::legals, + 'content' => \clean(\fake()->randomHtml(6, 7)), + ] + ); + StaticPage::query()->updateOrCreate( + [ + 'type' => StaticPageType::rules, + ], + [ + 'seo_title' => 'Seo title pour la page charte de confidentialitée', + 'seo_description' => 'Seo description pour la page charte de confidentialitée', + 'title' => 'Charte de confidentialitée', + 'type' => StaticPageType::rules, + 'content' => \clean(\fake()->randomHtml(6, 7)), + ] + ); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..ba66561 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/public/logo.png b/public/logo.png deleted file mode 100644 index 572f192cb60ae19d350eb79ddbd4b711ffc5396d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49286 zcmc$_hdb5(|3B^=Av+OeW@PWI$S8a7y(4?eUPls{MM5&OcO8446jF5Td8}k}NH{nS z--p-x_xT%sb*bxeo#*{L#(muGxBKn+N>4|XoP?eP4-b!AT}{aV4-Z;?^>dvN{HDEy z+zR|h_(W4x3GediZ$W2SI`|E-kD9qZcw*}62lALZCm0X!E}pv5BctHio%x^^E91_~ zznCE8heH)AC>!+g%^!`0Me!FKw>b(QWM@;~e6DbVN-yDAN@0A#s5>{Ij-L~!qBbI) zMqlVT!8d3cjNsa1u2>qsUki(iEdCt}VYdWVt7TWiZIJ0)%W_klKWyN~&c{2QwDJEx z{K3m=Q&9S|_|HmE(Q@v3TRYL{q{KCNVGHF6%cZU_>Ls>5>Xb!QpHjc!-1cH`eqM9H zF*LrYgx~h!x1dT>qsw{!y_5|dT)!o?$7B5Rq#4U?$01B} zdl5Fg}l<4tbPx}*-UkXL zA!+M*VYBG=I#p|qs}&U8kd6ptsOxMZ$R0Fl@s6F5vh!b3JWOrRPcC9OVc6%`zvh&> zd~w_Nyxh2|t};wX31X~dArv3@OzGjp$r?gcc#Z^Kgy8TmGY zkL6Ryzjsyc|2^=YJqg|7@Qz&Kwq}|~;!IPPXDqgVglWVCemnSj@O60H#^!0GaTT)4 z^1qL7F{pgurtOE$Eq5{1Gu4wfHZPT2hBQewT%>V?z$U7qKFZYmcNO;do8uMR!()b| zAJq*=i=94>-#_4df?~msd^Ho(a+&74!VJH2|7JjPJa<9D_jb}^!_w+01~qxo9g^^* z!%4!7cO6^PeoL7xi^(&%!^86*l@sDyx2g0MZoP?OQ6r5d_gy50Bk}Wz`YKF0g6#q> zbx~0&G`P3DiBUE8>aNyWEKf8_O#Mh>wq;?$rI@0Rj^YIyyL1qNbt7yY(dn;7U z`oFc-Fsix#l=URtNtvld9B;&Ox_U(6qkC|IX@8h&e)3*yGkAaM)=c z#b3v(if;F*BV@7f>)9weDeu+ppN5wY+q#YpWRfJudl7;8fUul)}E-& z9Wer_+h(S+YzC5)ko)GXpB?|L377_5UGQO@-us`OsUCr%>IY8+NN=HdmqM2AElpgW zIUMt<8(X#^vTb<3Z087^ovgZFKqnW1E*HJ%)@vWn4P zvXbv6OcGA^;qs$YN8~TUIv3<`{@Ttmj^5_ZKuh`ryo!fbs%;aFsi({7(nJtUvv}S= zv$@y#<{vA#4Tx$V!Z0j;qS_2lxXynE!f|#`LPc;Qs7Y# zHJPM#uxmzhiG)Eh;GdhAviPF1O>|@*@ZT>;TYSRtW^2q7U+XkShawk;G{^gc68#>e zC`lp-LN@YG&7Sx4ptTKtr;=L~;OO71k(I{w^uy}#b`ioy-*bX)?Mp6+ETtk=5Nxxv zc@4jQ(QVtba#ECg&(!{1ArkeNj*Bl6fQe*z&SMGOH0{b?u3Dav`w;M%ylu3~xH^;- zt{RYHCE6*`s`&YasppBNB4M{Nsy=lDqa3H{Adg7yJn$TWot5tHZo~)wex>cR_?}~? z4RdER72+`bkVdG25Wu@we|wOBDI;{vjn2LW$qqyJJ5X z>27VUD?Z=4>kK*4#@hdQTlg#}s#vl*vIDc{36mfXXcK8C#*o%nU6iybUIpyJ@~UDM zQv%jLD|u^*&gDebM;=Z2hC{yD?Wj(`FXfirVzqavuJ_8(l)M(>9_%VvC1Oo*;TFNy zF^P8`e0IF=9O(Xz2IL6!y&fxWk2vhBEbZc`E|&vFCwX>tbpOsHm828vDw`x=>aVkd zqMeMJOhE+2H0}4}ugLFX2#l+H`=qptsmtV*5#pe~0<=L0+%>zp$jQUrEF2d)$RSX^ zWYhuo)KiUM95WqdSV~q>w(igpMGLp~U4+~oPnDAq!p{`3L);7eN?zwedkfgv%pvs< z%w$dQLl9?0G~|n636_|b1ecikGA|drk=;d?@|ic)*x_h zgTMBW`CM0?fC**ImFrAi{Ym)^$6*Jj^+s!;qEcq&TNaf|4#IZxKEmFQ(jgiL90Sqh zRqc?Rrr`8;ksNJZWOI#0gaP|iy#LuH8Y|IE%*rM7Sm@D?AZek-w5z8PBzKIbL*3-J z_KuH-)Y7b@i4o`qbc#E%ljO*l|9j&q(ttH(;N%x|cA?Vyg|r?|{=c+WR<&(Ef6rLK zbEB(Hw!7^lp_)-n765dcIatLH=+-0#Ga9i?1c{?p3LPFIQA&ss` zMOD>rMapwm*-NOVdBKP5t&jW|Z-%n;3P`u3`9i^|@?G*yi=~Z`KWqt5F<}`Tt=f;& zAdUBsnx9(4(GT2$Oqx9lOK~eHTf{Y=-_-->{yx{)a*KpI8eXycVvM)&kOHOIiA=8@ zH8)Y%m0ah}oJ-Iu#iM}yeg6>7+6L_(u zxAv_Kp2qyDhE{gO_)A5eE2t!8#m|f{2vrPq9Br|obQ?8FD(~}wEISnV=)JK0b;USl z(s1hAlf^@3u`@%6qoh0jsY6+BHU@bMeuO>DPv`PhO4EW+e2eg)mRyxXr8a7;+UFVr zS9Cp0)CC9M6Kfa^hhZdL?_b2vXc1EEG=N;TQC%wR<<|;nXe2Lb52Mi+d#mMiT~?M| zm?3(`ew;RG@9WG|=^GBA-(Al=0ttLOUT~OyfkF6=_uB*5m9z})Do;; zJS6m=B@AW%OZruQwd3EtrFzrMEiYyl7KWT|3Dae{t{wmQtBc|qs6zN7NV8-Uv7{UW{%zEAL@Q6X z#sffE!WWUDxjpql+w2v#m5ez&Z|Hrag|iX3BzpFwB+eXJIt-7tWbF{`@5l!+g!2XM zC3{OBnw#sC(>$Kf5UHn8LK~yL5=AG&j?VOhs*8@34#u)%W3h%Uml@oZIPB?q{wFMY zd!#&sVTB~=$=`o1EEGFL4dUk17tgUGCKaesI1jj*qqeN^CQjL#a0)vmYGYXl`rFPE zjS`v0`Hh?pi#&!eN9Sb;;R0%D0`Wy6Evbb~zgDHU3Y$I2ouclk(?SyCi@0E1K2beC zR=cah77i2lumet%{kUPy^PYd~sMN_6BM=v9$Gso*rr*pWPlw>cT{C_t&2N8|O={#y z;U|k-F8sD~FF9ra<`bDCnWo41Dikx5xZT;mwtst{+bPxlxI7>Lr)>St_E7+yeuJdb zBA(oslJOp4?cMYT+DP$4P#sPZdtE-ykopLT={M&0>^v^oXuF6k+_&<&?Zm>Gekz4# zDLd}iHxa{pmao|$Sh62v=2U0y+p!0kY;tcsACy~78Ya@6c_rJtJV?rCzf)Rr_p1cB zO{%!Nd%oF{A2U4jEKR<(43psjj<-&D|8e#U#w86ZS8{Cdu$)8?XPE7prXW;S?qph<4dB++e zRT!I>p@BKB`uFx{jkW~V93?*%Rx3wLHgVl+wJKiVTI4G%e#<3S#*dG<&1|=P(WkPZ zp(zMl)woHl%d@|XlIPlW!uuq_SXUVa@JGj)B^&-Py3RXE2qD4kDz(u|H~$(5u<+wDsNj&iFe7 z-;=8Eo0 ztAxy%vRMJYBUP#dnpaNG-yv+WBB)OIEe_PTR`w7~h~000J3$-emW`ZFk#V{s8_MfL zpNt#3TvSU_^hBfD#TkLQvmhw}+HM$DTnwE^K&;mnp~AQO<2Qgy!gDMboa?X7{*uN{ zit`)r9MHnpSD_}htq(8l26bGQ9w4KuUadF;NE*}Vm0S{x%}TsmBFrv4ogBPmg@CX7tNYLhWPL^=&wj2`CqyN(fla+@#}k;(3xZ^9rE zMtqr3g{<5p<)iXF{{i!E2<8*HMX#;>u{K{uv{KAj zxJH0QoH}bfIOE?bI0=arHmqF8fy%ePU&i09&YH1n|5>!aM@7$Q^(CG9!aZAO+ovy0 zMYi!K-RieGVOS%u!)kj@utO_W-uz23r+f6?L*4RE0+TW{g2auZt~%ns-{{oRzQTk? zvyc^y(`2qcefJc{p`e@F0JzKt3N4nndv@-is8WvFL%4iZ!7Q4Y}=39#NW9_ zrn>#Bbh$3e8o(*aYKw@j3OQ`=?>3GBvcXcxX)|9`_s{Qd$|SZw>Vq7OdY32}NLGy zk?q z?mpce=1n5U$H$FoY4GT;u=422z)zD}w+M_}KX@OWo=Xa2DU#t$n;J`GDoIk^ck+@C zUQx&058gKwmU-Vde<3U|k8sGsQDFLo!^q&OGfxt`#pg5y$r)`_(}uhVJjgv>VWaR^ z@F#cIt*KWc`Fv`PdAq$5{LQf?t0YU*6tZzT-b_>~Z-Tmp|eN&;J%-X=jNFLU7W_=x97$$@S* z^ZniNe7uISEX&U060fDHEF2j;e{3FC0Gi0Hv9ZHwaYY)>m>CMhde~)>7p|&AmheOW z{<3xQ#q{g-f9WFau-PrjWIIR)JCF0IE!pK@kG3_qy?YhxMq5Zf?gjdVn0)vI6FX;lEZ+8|)Yr~iIf(W1Pn`YgR zN_ce;ref}p2XsE0IqHJ>i-d4X*bqa3H1ekMSWVS-9QmAWY){}-i=iVRLG#W&kP9u( zk+S#M?Z`Yr`j3D-X)6kE5P+v$$d0n-D$L}7WS{BxiD;FHskn<8=oU1i!`Y39vL3aD zt5nr!^OKaPMNZGswM5SzCml_y(=d5jTi1zi^ak^ZX2W3-790PLoCm$QQoQ?d&K8S$ z3oFi!hM#9Tee&_nG5mhsf)BcF@W-u`PrLf-{4Ky_jWA0jr)MeDI2hc5o9%O*W+S;Uof3!@&0LP!qBL8~%tGp_W zHXe!Cq(t6c(W48ZC9Nu>N^#O#MsSKAS!dTfU47!+a=+!{)peHzeOYbVqN! zvKpFFX4Ta(f>t_QIDJ3}cgQ)fMS2V8DC+7OBhxj$hIavW!Qu44+Q+-!BcJm!XctQC1mX^rrN633AWpbg!37hX=gHvAPA3H2QE^k?KAp=iXA`Ct0=QwdQE10<7a6~0ptR4;qlkwC z(G)*c;fDurxeI<=eqcH{ofpX=O{(7JSdElZ_w)PMnFNqh@SxzeKC$J^h+7+M3DOLI zbyB|1kyW_^c zDO{4H{;%cidv3g>kfoB!TMLD3dAHaqN`!S@HHRuK4TtBAD=FqGsSDH?Md7*hH4Ehx zNYREGK(6KXXVgjI7ukUKysgc>d17EZW!@wt<=(N;R8U_suvI~^%F2=K7f_D=XG z`!mt}ODU(Pc8Ss^4kG#uWdQ-QMI$w!h(Bekn`h#OP;Z+h(~0m|R6O&>k3FvW?kHFq z(!?1-1>g4R{sCGwSI5NjDPBD6??|b}A-wm?78qWqGC-ST7+3i!90x$-l;f6lmY9uH~Q1*SGjNtuUhai>=k?dE#B~+i|bBwpPsp@ z3sJ{+^s3$i`9z8yj_>kPH2}rJnvml0HsBFc(&OcAM2JF@&O|Ui#?_?at#}bQeq*lf zfpkf>ls#zQ#3y<>$x+=i8}2{Rq^{?50yk0X_JMCQeqvn35<6m$SB*@Oi?ov}9)nnD zfXH@n&2E-Ti2irdSR^Dv`q=t8cEqH@s&b?n##$iBiw8UW#<-3 z-nLsKIL?^Y*@c6zK%+|Q$L=o6J@v?I)wX54{A?*0&$kiton{YjU`Sz&^d}9SP^%v> zNTy5ctv7Oc_-@`+QPJGepK7DGcVj>2#22xHFe*eF&s?>U9zKHT{_#)pg2e_8R7lT& zb-3;~kaiK2(T&?;*(h~R!-m@0sjUS%BF1`%tgI8C-3SxJj)k3CZl!R}dcM3G-#dV%;5r?&WP;#Dt7JAQyfW8PDBD zkIAJ!G?FC>&ynhC8)*u&Ge|!_urjqmSTG>vp(&_F$fb^Doh4Gk`z_ea@aPZAok2Xs&2!fC`=94Cl3s@Arf>LF4&u{HrEuhP=4FIq*qkiB??_btBcUyRADYWin8Klpm z^5@unX`0I$z8&oVr?@rn0!$q7Q=Sa-bNi;wP}k2a5w6*!JL>bZ^1i=)UXryY&Dx-n z9SM9ye9vXIKd=diOrc+5o1=Bb%qH?6rQ>1jsSCzbYxoSj#R*WisC;44Saz7^mXA)m z2(~gqV`{t+*C@kajfkV)X!wTU|2#A1alF$@U&1CJwm#W}Cjec?W02IFxVa?r@G@Lg zHq-6^L~l`HipIJx6JKFQlTTn8~<9NFzU(G?l9&^_hWrL(Ef0)UjLSrmE2dC)0 ze8)Wtyl;_~VEp32gUP+@v2~wCz`ia{eA;DzN)DSLV`LMse?i?H-k{l3_5b^pXM1E` z7GLVcS#{ollOz>IvtMhK7tUZV#Elb8G*NhBOWoh@`V|00b!?0+zfMnQ;^E?CRGJjC z_rz9ufIGHWJ?w@u95#~dD;iGhw75BsQ+Ll!I9v<~VMNp6w~PPESg0gplGX?Uh0~vRpWIFX-)NJ3 zNsTYFu6E_f{mI@D-|mnhde?f;Hm3+Agx8coVc0y5ftq66(&J-$4b+!|+*S&Ebq z7M*{Ni%Vi`O&$8s|6sZ9|Fi%zHTo4W-Uw{r1sOUBqG%|1X3&=++h$`wNE*9|C=u(k zJR^-S`U+4dPqG?Sh^oK2T>jUc&o57ktSyC}$yb@=*BaV-#LVOtcbjYtefwJ+I`2V6 zFm6It#?ptAv#WWVC^z+Em3n)0ZT4TODc%_U5={r;2N1|w$tqMKQ~xXg{lhU31XE;K zqCdZ>p4QyzA7xP1HJ!xKN;=KIT2u$hv`?}MflO`^6iwk<;=bG&4z z6;wYr zmX8eh-+0CYm0HYfX>_Rzzb&@mlOygPz;tFWJ6YWdr)bw<@?Jf_h+Ub^jrwXshslRn zmYR7``oJ=NW{l5S&Png*AZCiY$p$XTHk>j?$NVcn-f#!zms%r3F%eueh&xUJ2|xF&)_V&vQEm2@{E8V=DU2U~%2ru3DVlR8 zmopnPGgWQW#(Q+En=Seljh>5UGUN}u<hR6+ZIWlB*D0ZZJc= z*IN4`9XCc7O>82_QtHFYcH~$xiti}Og6}l-iQXJlcldajP4`sg9ccRtYCMIO7HATg zlCTev>-{d*B!-OW^I&9J(G=11f|ZORPzEhiVz!h1?eB3LGeF4QIx6WR z+gg7+sv&+Rf=JEIn%>_Ws5&CTiHdg9l}NUXAH62n5L>0y@9i{ij@Acb1p2*sT=2q52G0%;8o6Ew<@2GS7OS;yky9K@gG3h?eQ*hk< z%IW+hI*BnvvR+X`nX{91_vPDeoR<>gA|$*;$2x-2iNMpCmrcMQ$4%2kW~CC5x3ULG zsrL(Us`RX#A8w_b=4=e)90&#w*DJZ@&^5avlwRD;DPfsruq!WAYG}3ZWn>5TV(M#YE6`bt z9JAHgdd8QD)Ozs2OPSN3uHK%h?IZxz?UA8j{83xU;@HBVy=t0Z$EJ+eN~1O0=zUco z7#cWn3?L0Vn$9ztnshCl*AwY|Ny=+v3u#EOP|1?XOEjHD$wBg4{1Yw_ELD9Vu;`1z zj9H$sjSAKBv|7FNIOa#`mX8JCNcvK6@4HR5T0Kem@I<5^EGbI?P}cotwd4& zZ<*{Hn#2{DIgbuoZW2R~#}7{w1l|r1#r!&Tf4+&-tv44vl@rq%CF#O*448WXw7wixA5`8$-L}mdHe?VdZ#BX`K=6-& z9N`vEWMb|$)Z;VFyoXvep6(exQpLY3DFJjn#glP>c*R55ywKyRE1G>O_f*48lDFD` zXC?B9MsFkJsr(X*Tx=AYZyNB3WVr@#O>4zQs3&$|V7Bzm4_nK%D{z9^bDXIBFqG45 z^-&9m#TFh;6JZ`8UcXJe5cfSN07*oc zoZlbG^PRrMCyMnzQ>+6XA@)t?-tSH!XnAO+w9|I7*HY;6kSr-PPkB;5UIXy;X{R<1 z+re?2YEIe!>d~x_ZmaxbPB=Uup!1!E?^r4MlcOyb!?|yF$qj3)(Bs#)!@%;k6rn0K z);R`J1X8@KKGL_~nuZi*RndX5hE#8Y0MpieQ#qdit=Vjc5t)9{5m)i@zw z5z$-*Zp&KU-k0SnW-$K>!Rs_j3B3-!mo^%UdPum&>I<5$n~_<@Y8Ypnsajemn4Mt7 z+mw_RR?l;PlHW~lCCp0m8^MfCHmO<&?S%?TzSCNR*wxS^gguwKC^oLr6z@4pK^MFv z_Q~(V&GFm{A_7c=n`e%gE9GFD0Y#ZESed@mEvgXjY71+{*6_Q+G0!qrvHbJ%%_l(7 zVBog?IL(p8PMf6H^AV?i=XPm6)J-vNjK^^D>yFB(x!8&Q?CgPSO~6)ck6>rwKBd-? zW%G`LkKe)0d>J;A8#k#oSMW@Ettoeii%-W6 z7m}DGI)k1Sr^#0voI=p+CDhRKhe9+>W8V!FJRc^~=EAVGJZ~G`bI&gRSY0Y{#`!LX+s}yxikHMp6M%z)hbpl6#F1|IW?` zf#hnr+c{g$MM zU`(1@@zPMr6htuxpv}%-NnJ4RXVN6%-qVq+myLD-b`K~n(3%F^XiXb##%lc%m_=0f zpqAYjjmDY2h4)UFASN>HkImg0+)E~m1NeGZ8$^eaS6t%B}$spZ9441si~am&JN0(;A~tv5c1jmVs3DVH)!-gxqc{4peVml2!;& z_sihBdcGFDj%3G*gs7k6F(}@vD47R8N`hkw5 z3=&s19^<_vH}GSXK|D)IiC(zaq)OBL)03d3+P4W-aavB%bcx$#!%b70n=_PVv=1q{ z1}5YJwxsFxNy=TXweG^w4Y;@H$XN1zd|k2OXIAjsZWpVDcDZEy@TAvfV{aCfSQ?63d$h-8m~du4K5B+#J5FeaBas|M*URjBIN~xNyGAbpmf>v3mQHKojZQbvldI z@KTjG@oJhc$ID(7&BN9WxxJ_-t9e2MGl^$Q2}l?2ru=(h%M##B5-a3R!&A@|<~|wD zay^3YqM2i0;LE=!VOXM9MK@oo7p@C}D#1Xn09M6l(B77Z@St3pph=iZ)>^aVxwgj@ z{n5|`d1}KQuJBO}a+FKdrk)_#AI1+2H^8YbE1IV{e5C$H@|=X-B6*GoB_L< zQZdVmaf3}v)~>QA^}Au6zfXMgmppkhogsxm(u@$RLaJie*)M!+dhgx#C_p>N6L=2~ z7n(X8kI=NC%MK62XL`DcdDz&JsSQ{VI6OB^5<&qI%yy?4BVC8SZ}{ySp|S@;p>p!( z>|jm13=%tHJ(mra4!jvl-ejS2QDnn;kLzT0Xm%OSyz1lQ#q88-jJ*1GazKhH3X&Or z^Jvbnrb{DDi%p?vt9J|iH{an5NXJL^ zo(PKi$fc%-gD^}qoYG1jf&ESu+*l3)Lw>JoWsmK?~SkQAtt`LHNrV})JJ zI{_?xeZaJCxpuQ#fa|d66|**d&&Rt{i)Pn3H<$0fy?MSIclYgn=p$l2xOM_sv*+(b z{r)^?k-ynMh9M1~ZFoddj>`hs9-k>XF&iYh)aOkfJ0mQYk`TLU!Z~0Btn1o#3t+n2 zJ6#m#4}ExY-f&D^BcB6pghL?r4I=(E#cG>~4^X#mo$^S*8-9`rrY`QJ*s(}K$s~?V z=wl&WU%!n40XDXp0jFO(z%L;{eptKyFh8HZL16X38#bIun70$#1B4JbksR8@d`Kzb zMFFD&kY5lAu&1{&-llG8_xflhr)yXpAK$TUXIdji`R6)r^zFgS9vnu8S4}h9pLsv|RVAF=O z;bc@)Z@R7rm5jzBj-nG!ujxN?S_(YBzCprhfW%k{euT|Zp1dGdgx$xdEWZzsnt%OQ zpfhn4%~kl`e2WS03Y1Zmn?_1XXGWHDR9`SHk}|(YW0~-qR~QiP5Y3b8`eKdUGlufUR_Kq>n4XAio*0WjVOXMD_fhzaj}vH6vShcbbIwFnQkeT}6L{$QP7p-n5w zC|zR42IK({@bMNj2@BCqaV4aXK738l46^L?$(N7qsZmHWlriSu{9l+dB^DWx0oT#P|3z(B!l_UxeE!ZqwG2 zBX9N-?9$w0WBa1$R^lh)w0=$C8*bxuyVgw79b&X9A;oNeNMU^;)Q$AO%8PHXG#2}I z#_zY(j^u~O%fhH2k~_=M_(1HdK2{nZU;O0nZ*K_YHGWn_njw-_nRK94=)-NnJZ~q= zn1eQ$8|biJlbiKyf(b4Iza1S33*Iksl;*l+Yj~=YCKZ)>;(U-TCE8HflDYZ@<`eKs zi{Y1`b|5q%b3O%hi7X}xo~$?-BAp!E>6rHvd>mJ%z}G$m45sn0F6PfdoUoTqilkn}GlKJwghyCc7@(4^oVn z*D?kVeBuKFyUI890JQw^ySI!g@Go}vyAvfT?dPhAZs>CDvJ=bd-+nG&O^h$JK+0 zmc={uFBCgEafV+~Y}&Jrln@=mBMCwJmZAm6a$)ob=%qUDjOU%X>%G4(UZ9K+J2wHT z6gd>i#x}Y^_Caf{9@eg<%rOv4L0fzQGUp1j-`@*??@pFz^YO`!m^P0YF}pFle%&-` z#m*yiE6NVlO;;b3=hT}p20X&`-Rs$jBO0G42sSyzPg3I3BYYVQ(L~Rg7I6(GVIR9! zp>BKV8?5=Vxz0eD#4$Z`KRX?!-4pR+*S!<@4ZIg8mTIs`GKi+QeemnZbxehz_3(K* z2P^*ZyP9K_sO|Yj)=eI~%ji5#R_`$|PvG$hM=V@bg76_fuzrtF#RXGXMs$K%{zR27 zrO73r&I$RiXKoa|YfGFpfHY!QmtP0z@`1)pZtY(rypd>EDo{ zA>lxKF*=q-+AH?QC`V+jHMLn)f) z=H6s;v)-B3tQA#at_{%ng+UaMu{nyyLDUP_0*}Mx=<12f2&&p=RI|lg=?KONfA{{T zgQXHlhf6v+6I6vuV2x4zgwkguzfZ1fyMq0TvNl$2n<9*tN$UTF1HSPQg>}U_6};CX4$Z0cxde5MF$Am9>P zYCL^bz@_IjGXY9EUxCD9iJD!!PYwlN>%Q#l_&DE{CNz^D9$|ShnDtXE@m0K9)u#vk z?;wk0x7l=$th~%#D+UF~Mw_>&?zzo8hBTskY6T>If{{KE@g&gpWic`EHai3s1KRH{ z_~r!G#^cCdU3{j<2+{01qUwtWFG6W2BBB7z&0R40rn%YsQA_h;SbUNHSK|d;LX~UM zXGfqi!Q$i9`26MRZ2gIx^O z2Qxd_h$V%X&tIL8Hr1}0pp?aOOOprl43BiL#r6?uGSM=#2dNS2tAK-R z;0xXSg;LmiHsq>kR)oO#vIsU10r97OO)NIt?TVS7iUAvry4gPkwQpjV%vo!-dVTZ* zh!4g0R}?xwQ~k`0Qiq6Z&+Nz{N`YgugLx$jhy2>V{A+dXD`Ig7R?cwFU1y={fiC zG6wV5zWwfzVCEi#nZjsKH~7=Z9fEPO&ww0JjYbkkpL>T91ussu0}b}|MpZO_l@YTF zNNe&{^VP(kcHS<_v0JrK1pAYv7$|5fGDh878d0QpoepIRBJg?dbdQQ^a}Qt;b|24z z8?CB)=!^*OzrT6+jS7al@^!O6=Rw`R3#t6ad(7f9UEEPgDkrQ6lDkw#1%dsMR$E2t zjHSiLUw=ImNoscI&$POq#_OFh5K}F-H_BBB>z#%&Z|N!0i#qb6zXFd5&v^is8E&rC zBgJ+7D0s9u<-q}5F>D}LHcZ5cj!63a#eyoi;)_N1=qc#x>&=Cc5wX^~Q)ngDK3WIm z_xq&nu5qn^_9xwfi<1;k$dtz3#K(V+y6>~pil}0}skmpd8WFYRb`*fBqZnt;IXGDf z<1Tpl{Yh-kx-d3X;n5zENsS=6-;UPWH-!isBcG{Fsks`!(owOU;BAp>VSm40`F}I9 z-wsD>lCV%n^o;5I)pPMVrg1%{?G_^9(9XG!+7x2Lzv@r_nSvU~cFCL5c{^B6Ei$3# zuBHso5r_#3>7|B`04?(^J*?=)t;B687HlgQ%$-SS*is1|d)z;Eeo5I)0cyu7CUXh! z%U=RtJ`*}#c(E0x?x$WLIPiLau?RNXOo2y8Nb-h`;7&VWZey@tqUCNo6NMFmP$)L$ zHy5Q2mO#9jd+bT?2(tRMlZXQ52jBf$wLa!Itr3@_$DmB7#C=J`a3b`3aaH`UP{vcC zj{V1FPD}uYT(a*7nC%l5Hr-4v+LZI0Emtt6JW3f*Q5q3Uj$C-pRsiJiO$b#e!QxMk zzNBI#r3@GYEyXKXA9%L!bunwpfQ@^9EqHW4y31Aw6(Ln+5*s29s?khKoOuaX0)>IX zE~)y>N_NvX9QJ4>iaUO{>jPoz^2&_c=n8OMbB=)N?UNm}HiFk-0i}9&UjJ{s?wd#8 zYw7mAmEB!;(A;OrRp%ZaE5uZSo-Dua%^Dah5TsBTt-}E+`*9Pv_aCO)4^Ma>qm*Nh zLRON)UrRfS-p4=cyPHXU)S1q&xH{)3DWk|F$=49PRKL(h6-f%0m91}`o$gCqMD2;z=*&C8CEpTtLj z9bs8HhO)B$__1zkX#>fjwe(mDHwjC;$JG;!ywfrL`ZQZJW10ZzT8|}yBMJkrUJ>7T zLf40T%#Q+c1KzuXKS!LD_cmO<^G{DhCS=F)JDSZ*P4lA|01**^QhdnWnUO+9$(d8O{TRHsU(mQXb@vfUXh1&^m}~fxl<#ruG&Xxf!bSD=JLSInrvJIovlAGQ zYg{GdY5`nw6W{kd;_kQ5-*Lf$k_AY`0MjXU#2)l%(aZ3hZr{Cvmtlgx&C~wm$;o$L zF#@c|&DuWQdT_8=H5P&{@J=J5210?86U~mmH^!bR^bf^epQvHb8zL#xsR#P8e3qlX z{TMt6V!g#vfC$XT{(DeEWVHX||7iizge9W}DMMr6r1ibBaIw`?S4j{7>DP+_w{*Jf!!``caLnO#5BEATbp3JUNs|oMoeh z5=?@F^HY1R&^QDg{x}9B5roziO9qc$qgvzCqhY%Fr=@VA&^Lbr%(MX?Am7b79T}~o z;9L+LEZo?PdA||^T!u~fiPEiL355lz`k<=gt_+T5{5ryoS744SVFNj;`Q_?ah}Fht zY|G)UJPwI)7gCLQpb%l}G+ZD!#0;LcpB~JfZ?UCX8s0winpkK)s@dfXG0ehS!}1k$ zJ>8qjga(|0S7JI*>;2X(K3q#N5V!D}tCzmU;=tJ|sQU>FW9H&>m~NMMl_4JnEW^ri)PIe3Q6EFFW7vnq{N|&HYJkUx}DIgi#gSAZ;K>9#Bs_w zeH5Nkha7dMCW0Px=_`by^Lbt#3pmcXIZ1puhJvms!kJACr9YQ&%)(z^Bh$;v^}%Y6 zIlr$k&(MG`H-u&1!ieul*%^Ef4!WoHVeLh@dYA$6`I8TS)T6~lqiG1(T~`aQ<)rCp z?+J*_88JNftpB3@j(>OX6!*!UnQS)0aglx3O@43cXWcq6T-txF>2$Calc#x|Cuz?X zg21ggPTctwz)^r#E6PLk=03MxGyiK>l|b*e!XEx!k_n?eEKR9Y%9l&rkFK-6IQ&HB z>K4ktMw?Rt%@wcu(fRyet;nc$nPGv~X{^2R-6?uwyB~-x&zmoQN@?AAe4Q1iz<4>2 z*rG6NKjv6B@gF;7!zybv!%Qn-^iFDS-8YHSl9!f1Cl^zzq8G2mP>~<5lvLkYLl`3O8>{6Aq_>?5MKOREmydD zQt0MOA;mw;nCJZwKAJtk&$q&3p6m~g__`^R8u8nNUx$4ne7Bdmwq{I7KFDUeo#^5k z^7<>3^~DVXXt@PPkNkwo`^!*<55c`Kc<=gq|DW&4ITPp1JTrHd zPVN?F8{Mx80s&cOGnOcq@la@8+l7(IiaVap@2PsUHt&ZhCHblKt-h<>tG2cQ;PlQq z0YehxCB*|xNA_oDv=N!44X=)#nxxA$(;yy1Kc8eBQ4IG`BZ6j2xe`Pak~|ho`S776 z+w6@^;`)XSRqTkD3_IBQ5fN(il5^DO?+<0j7ZfCgD!w2EUA~W&j*_+QKd5;q+KA|1 zzDvqz$khj6me}Lqdc_+-nzV5K_2+z8fwxuYf;uW5TB_6-gdQ zi~irLD3Il(6*({J&NWZeajcv{5}T_LLglwAvVm=P>kHPxm#C7|hhKTY9mEsE;cnP9 zziN@Spk2^g>q?k)c>=kT7+MIY9CJCv1)j5CxOuvX6Q~0+-}0!dp6y|JJ-US<6kM7i zUIC?CosrRwWrDk24E>;F*ht8L?(&XIP+ckn;LK*B=BB2Wwy1x7=tt^5?)ZfDv`a`d z;Ixb&CZa*Q!BV;O)RLrY+K86FUG*VEN>GFxFW)};)OZrqqWdyD9`acPGC%*^dK4_3 zQcJ_3=lkvTFM!7c`ua!uEx8j(f{;?vERA56V0jFiO!r@&Z{-KIJJ)M+7q`)w1SM*7 ze8i>E(#0YaA9zE{S0XGckwM7P{s!LK~Rg}oO_QhoafaE!A4|4x=zn^uCFOe zIgPe--KA?b!%!KUA*a5WlX%>}s$$q@x~NKuy-=3v{kMnWse>MN+&Y6j3DX(2A(9h% znIIu4Ea~um7Z1KBZ0(NO^LN$Uzg{2O=a&^N&nh*3`?(mdP1s`nqUJm*{hyx^^t{=Ej_eC)MlUt zj`qGLy!$CIJC;xXa;LQ5+TZpyb$^ZR#Q4`TP# zu(0|s;q6s$H=2PkU7Ns6n|eb{ZXvJNrnoz?9I(mm>hJBkcyMfN*jLiWa=G&pK0)|E z3Uj6f_p_GQb6Fsf`L%?i9`8>0U33k}LNnQIZiu0{p96rx+3@lHPDtuLN6RqMDOD*A zqx?cY4?%)#61+3Bvvrkh!KxN)Q^t66&DfH#8vS`Vipj)x!TNqOb}D9AgTswt+Iv#L zAGeqbsbVRiY<^aNxDr<>oc4P=i~cbij+F%)&)b-_xq)463~lc0+N<0ut!$(SBd5QQ z4g>Xie;F+neZ>f;oc5kNTSGulLo?en zUGJoTb4Mt~x96y&+57H>7k}xUhYTW(0NOjo&YeFbO-4opv zqvYF3%bnQNgr2IzECwqAoj1yUb{z@HQLwi5jv$1>1|UXhS~knhIy2@JXL`P!MyLAe zisACX65tHtK+WW_ON!0$Gn~w2pKq_HBf0ckIZKo8HJccoU;!#D(y}^xm}TR{xSWar zn`6cO`omY$fj<^ELT&5uP3b&y382~XGdR`ml;V`=jm=N*nj&d<}&qHrsiK>?7^)ol~ODK>_V|F^hQ%g}2O`)in=)yfa<< z){=NpZEb|L4@Wf*KK(Lk`OGsKvKDl;k@$PIBSAhLJY5E*$xp5Ke<)3uI21+R=_NeFcjAk(Za$BV`!>J=KZvp|1jJrj_z^>V!C8wSJfqnagJxzPvwfXxG@9Iowu4KT)m9YQe3^8 z>WUPs@N#MiZqU~H-3ZT$U-c_BCmqT}f=xZ#&%>*NdWI;;n$51fx$s(BeTyqlqA*RB zmV+|F6-lw1`9)oE1=#C!&xxRj2YDjm6us5@(^?D;KlOuidGngK zDI$L#oi++U4I<%p?UQh8I+Y{uyD#ouCxzM`zsH>MdVGs6FGC+K+Fz)_Adm>!&^#lP zGt{*R)zrR$l|Yxw^7jNzcB1 zlM^LQd}IEvDgWW%xuuWG_!X80T$FxNXjHP4HmSVr20NY;^*}a>Uk^jlM~JJ6GBpUd z&OtXZv7M_vqKfH(TtwQG4dx>e;>aAoXjVfnbm4&_=>+>^?IkX}e;y)bC04T`6$Nk8 z{37-|8FPjL0E%*qayTZpmk|n-!l%o@hMQHxuHOz4AvwESEtL2B<}pkPCCFI|vuTJQ zow9IrF~?sd#j$7#eoFXHycR9<;9bubtG4*BZ*NzEgKEb7oI1z$DtVMzp)^$g1M%0* z?zY~+c6}ihl!;)>I6H$liV`rd&JBQdV)S4c2{(x}V6tJ7*R~MxsqH;>Bm6t(3X{#( zSmU`55zQs&4^A~YAHaqjMX$H~yJHkQ*^~{1tNFu9P5CxyyhgP%A9Z2LC}>7tn$Ym- zq4eo~;A!I>epVGw;CgID;VV8V%FsKWh^#+Ba1nSBokwuWOHrmqH zIT!{=joXsYk#nSInHyY2gKadn#>ymDx%48lNnN@&XP+~-)0S4(Bx9P=#G*+x!JPA* z<3RfoHC*IZznM3}Y>{x;am41i1lfh`t&EvLrcSkIxC9sIp7| zMgz`kk+2w8{r`==y(AO_d}JFp&^mbV6|crN-SKKuBWz#ZXl#?+vDu2JhQl!pL)f<9 z+%MmYiQDUtAY9)HB>9Vb__lf{!V3o<{1b0rrnNe>k8*5${0_u!U!a{IqpV*E7+U(e zjBrlc-(j-gp&YBV(ZHct^Q)g)P1@P9{VBts{Er(bC(wFAxbPvbfx7f1HXG}Di!UCP zGbJc<_mu<+HNh#Bf83?ovqRkt@1?#Wie3{*<`3&RSg+&LL($w6zkJri`j1_>tD>Q= z^JIHb{t`89-<9&(lJdGfcRj>#5+A(EHv*(rXHLR0%XgJLQc7rkLpap zFocP@hF;wIYlcQ0&~}?ag1)!z)>D?kxky>(3zV8g4`ML`O?JSe5fkk6Ki+x3!)Lc5 zhKKcUSC;^5ZKBVh%3SPA(|>0mVM$&t$p)7oPd?JRtDXK1F)X)7hP=v`B}7~UJXn+D zoL0CVx3vZ+kx2KvQP--lfcaC8^e?~F^Tykx9Kf61cdjU+*WehGP>||Hy*hHCRGzb6 zqSkRv!4iG6qDjEnu*svI!hidDd|2|ZHT%H# z{)`}KnE{{oK~H&JZ?`4qeXAW}gc_!uj@Jacsjy|;DWuhxAk%NakI<(m`|dy7j8ze{ zCafZbe)sYjzE*k9mN>z;FQ`6c+Y)(Xeq4ny ztf(D-d?M0wNLiZGJiI~d^Zh+8G)|Vb!+A@xycIda^$0SgzaLpNqL z`&VSzMXWLXSMkfipyG4~@5iaPr$$a>y#KN{H0#Fnr|ZeHBC7Vrrar&`#Gv-9gTM(S z0-xPWRF(FT!KjMR!-9d8K6WqY1fB1jhK9=u?#stT?*K9pk8`&HTQ_T0qXs440X`hI z2_v`?%kJ!RYF7^@_qFUej-SL$JTDXBs&x~M+wWZyqD#XgdLf*|I(k`M^UfC-xYkkbfIGH9u zGcv;hUl69ijh7%0fr+^YV(E4p*5ws{$;7MrjaGH#9K=bp%L&JNZY!bky!VZFs_S9%Q5_l~aA$gvnAr+YV5 zv*ANXjIrUJO@oT3pPoF7Hzz|rqgBBM)b-E>tlp#NX(}f|g=Q7+#a8m^QXe^QftNnv z4r0?4C4d}No;;$^E*;YSQ_l9*(wU=?ty;KkE2+^d6WlQ=nF&Wb4m~vp6ST!F($r9r z+H-rnZ+O^uI~@-$ntd$`4aYMqXRTE=HD$Ga$TVRSdgb9V-2fmwW24bDLL1-JXoV(A z%f`F`GQOV*WYh2$sgGHKh3bvxvtdmWS`eyN(FsEKfeB3a1Uo4QO-q<+grj6r>6MZE z22_AkR`B#x>-@n)^cInOn%L{fyX_9Q%Es36F19Q$9|}gS_809qskx2L@d52LF7?!s zrziBd$oK;1V16CrzgwO(UX-=4{v9`Ai5NC6nDuXuLkH!^jKsXts-5AidsI6+$s9@L z^Zvh3TUZh&PsFHi4J6lG2!z&*y-Di*)LUVLr*lBg=H~5U8XR1{43QY~3<%~5wxjF4 zA9`^IxSoy96~Wo}2c(~Uc^P-qx-u{L7QzMlNP@HhLWmHQ{n|Ty`=JSp&iD740fpIU zt9cR_MGi{T(IupE(9d)HsT@ZFnF@0*2}~Djl3$Tx!E)VQ6OZGN52|Rf=v0j-Amu8H zr(_rzti9E!B>Xp;U?P{QIrGfio*8ZuX=*0d-cki@JF z?G$G>VxLhKtT)eT*RNJDsGRC{|BCv^=vY9v#iQ=yeM_Ws46{$;foy zGYU5kT=fEo0imDlXOR2u0;(d`+*trnuwFZ~(cfk*M;bMEn z5^1lHUNc~Yu2@o+(kNOxl`jL6GTKEVzT2y?R9?OMDUSV6VykYwCA$HF&ESKpBVgNb zh0b01q@mJ6PC!^#6#MKQBy!}76tlB;W`W4YU;E}f_~tFMloY9MiN8U>M7;=(+;s;Mu{F0kO0a!z!P^R?emj`@=>wMr=87<16@`R_b={6k79Dn~A)mW6xpnY8=%N0R zo2L{{lV>jmjIm}R3*ExukFyfdZ}H5 zp*c9>Y0EyN^qiQv|la!hF$YGsW+a%W1&~lEt^U2T6SVEDT z*k52A=y z=WCO9tZu+TusO-CCu`b+8FprxPOIB4vQOFinjg|M7~AL}RXvA2r$G{hbf) z4>=4H^rc}@Uz_O5kHpCMii`24l&IK}MW{5Krq|hZZ)ceb$dg3Q6JgXj{sCQN9-WZqC;RpF;%l^5=O>T1n+C^bWf4+)(azG_hWl0gt zK%C#y^-VQ%H_5`@7}QB5g7|hyAhIQajh|0%`K*T3?A3CzpA`YvbRwAk<-LaZY)jX- zzuVe8!75(JHo)cPV)Z|~kZDL2}rW*JRzal>xq9?um$Oo_YWxwLmNH^M%tW>D77 zUI!pJ(tC?2nP=FI}8z`H>G+2K7RfM>ncJ(*2&SWy7k` zfLUcN;6EtRd%vUyEH^KS;^UkNES*ht$ZRoeO@L-mF+WJbOMkfXUYG|7H2e+t#BQu| zbJs5E#$K?3AQkf_+r9};VIg`=x~~aIqdJ?EKkinPjXhZTV9Y$dd`ccdi=YApX4sjRI%>}MLnS|jTt8)4XJa{38WQOAj|Z(^A{cqTR@6j zDbSP*to+%(iUUF%1hq+GH&-)sMm9<`=!uXEP6BqpBCY+$oW>IcaCrWWfIgl3@&Y-I zM>aV0CcdXUDAC+EpX=s~E))s7!plLYni+=CP1Z0@Wiq|1G^Uohx zZEgAQL{iMMAU?~tSy6}9#rYbW@+)A%=ul7q1Ca@ z5_wX(7m2I4#(OyPli6sr@FGNWb6A#9vDWS?iY`S+>ucN?ziP6m zJ@-t6{uNO~3VR(J)vN4Z)24}=n=Eh5_DPYAB12FE0uYUrA zzo0Y_C=DfF@d)By_1f>ZfJ;Ws5?~U~&`r5{d2J{f zYK2~C@sxme=ZrY~GMr%nZ4sjM!=9km&QG_VGd`ct&8ZMTn)a+-*KbspeCm-^{>JeE z1%DIe7DxQ!&o2pWZl|2**@|mC|MK!z{IUVoedABLVOAwNl~dokx>(`i1By46rEtas zIQ&k(D|08%nsP;y1lQ!g?wMdciEyTZNb&0lehg`Qzmw3Ri57m<2#N>A`Ge0Fx6(O= zhKBZ-+Pxi%!YT(=uFi|FEYt)?LC0b9r~GF_M)!;@u23SygVKMw_>!GvuZ&CQ4fV{+ zi-F6pp0J&#E7Q*6{<}<9j4cDUmdfNw7O7$(#E4wU)C)Q<%GO$ojy#R$`-@yyv$d(a z_qm3KEQBorsSqg{k3}N-<@;TKZYFedBwUvyQtMO#RR-1yPs+M+_QiSv+< zn+A~uPflYMUxJ7Y3v)DXL}KD=t2nyHY}9=yKQ1>>A+JV4L8Fk1PX7MGlXG`4?!;cO zZnRPt-jVi;{?5|l<71r&0@RmkpjtEKhndMf`e~Gl;P#Vv`N5aa?4rRY||Djki|9fzM2`e#aSf0@*M z3Q&)BIh|3%JsfGLD%lH+jl;^as=3mDp-^_%y*cN%EM6;a=^J_bqkYTu9I z-L|^(pOLD%@jbD^o6!BMXgMt65hw|Vhy5<(1>a}PG2?1MIY+0tx4WV6zhJXC_$we~iB4(cjrg>pDI%il1v zP4RnB{d*yk8cO&A|6$6fL;03g9eLU>O*VIWtEw94@5iF^LmWtlv>1$;zv zSO(Zm{SOO3MO~Wmg(-EsQV!C(Ox5moBmd(YJ1ObTzgK2nB6_AF92uPW$xoI@=_~qr z>n+FVPs0Y2l}-Ow@#RN^7Ypc2?g*{6v%NSv64g@Ltof0|rU&U#^Iuv#Z#LDQ&gw0y zw9~%oxmN4#$dtMi{q&@odR?)Q0(Y4*Hc@{Ay8FVjSvD6N$>8#~HRaG`#LHYhTrCVs^K`d14T=K@BT$Hv3BK z1AJl<>8qyx%G8i9#A?nf8yH=J`An52(~UK(yS+Ruv_lWQU>t2-`dMSDQ!V5k91*_v zsK>o0mQ=d)sJm_o4`^eoR`@uQdoh3Qs|pJX)cx$-YDW;GK(@PKsI#uRl+LN}Sn5Ur zLd`ir!w{XcqD4Vsa*y+w*hjrQBXLewHLlVw#kzQ<8rxjX=uK+vBA%1y`}aB)&*tX4 z16yjF$$lV$Cc3b{cg~5yZs|>l7;WNpL`F|IbTsFI05cd7Z0#~ zZ%t3{iafCorVDIi3G$s(r=~&2PvXKct%AI>ut+VyJU4dWswY7_KR3~^JoUd=+ z$8L?r_v$%dSa-VnX%lI2oL-(Ep{~(R*$ZguU4K~snNMuQE~PbWK>D>Q78KBmEE;J zHKR5xdHm2p{2ae@o)mdYPa*T}bV5jnFPm8W@@XafW{I=xcqUw=(~RSp-*#}wx>Ha$ zi>vG2g7t?X%eX3XFB!08>inw^KW~R#;oIV;$A;nN#-DQd^vdubndBKcU5g?Gq)I~O z6<}!z???Y!txWGLv?cE#-VdExoQ)jih#Da$TMlZ%Hk=}?e|)6iv=aF$Lgj9@b=df6 zrhCtJQHCOI z(8YLty{8N$SXlRyo%OUDl#QKmeZ?|Ia z;+7T`N@v9j@@_O|Tg_sgONDc<oo{{q~iokHm*g3X<| z-7lh+O-I1&-%oEty4`g)3|P!oHU+u>tbqBq31iB)MfK$5q`y=nR_QLE2caTDEY@z7 zDHfECG0{x&E(o1{fp+Sen(hjm+v|1GaPrayblqyG+QkFw7F(EiwoX#^fY=p@)F7ZW z3vNcG=2%%C%;ec&AF0@F$JCdz`g=CyX?kPv*Mu?s)sxC9#h_T~DeFf;@S|+A3V2=m z3-E4+Gs3jGo!kGokM&8O8>{!-bmLzqZB;`d<|Vp{Wyw}<$+UqFnFmb;P27a}e8vN- zw!=V)Alp<4PjIb68*zAk4-%TbR)o@yETWsK1G{eJnNF-~)H>Oaf46swtb53nL@a7| z&|%iz$fA}^+qxI`y+$(I{FAUeVims(fxlWAzP|@gf-@iTqi{112bgU)*9y@;09Lh&x40?^R+Z1?CD8PGJ zgoKoWA?*-fsw_#2J#<>kfdbE|O1G8Fq!L!lQ?eB-nf~~F(EEu%Tti02>1Vb2@cPjc z!rN{s54{t@wZJOuaZ6iwz*pA7Z~L+YS-D)$Js^dAxZm-#q9N)_b-VX;chSaiVCagr z@1Kvo*285q&zE{i0P2jeY=RNFl9h$?*2WxZ+7@#>Yje7rs|+`CMS$Jdyp|CjRPhX?IwsFv1bG~M?|fE9FfJOMAe#xpOs!XNxOT6JCwlm>OPw{}VJdlNIzfP*jZ zpFS5qu&mNOL&y?tuMd+JSjFxsf{*xCMqC@$`S)!N{f)#652aP-bvgAbu8eV7bPUQ8 zB?WVUcg@bekjP`>!$xYP^`b^H-Ck!{ih~8w)GwGg#nn&9S zUaP5t;LD0XVoL4ePxB($>KAm=s8j)WG1Y%MylPin#TQ$ZXKkh%-&!G}MmOi#=cqRs zkLPE<-ftP2D~v?X*<1kXr7~Cb=Y8#+W>Et7dq+#Z-3eQnO@hI_8U#4I0HN`o80m1&2ra@Wr;c`~8 z?^djFNZjiJw$CVCTn`uNog0bxtZ}=!&TcYv+m#h@UT`ElXw_&kXND^helcR%JXc(- z0lE#@5WRDk$71o!r^6qQc5h~o8oj0Z%UCXhJmp{WgU-;KjccJN57MRg$lm%d2bGON zaM%R>62i61=!!8f4g^ng(T0AWpS+l2GT#M7gxb~a;Fp-EXW-*1k!)zU611gIRg0#E zOICz^HY$7m?NCnQ7XzeOS4Skv(Jzt&gO!Qr8u~;CV!N5^<+C7axj#a@>pAZ}eBcds zl}l;u#M%Xp7~pz2^htfe~&n43CN_ zll_huX=X-iMw*`Wo{1N%djR1oin@3YL2yk!i$y>+R|+8sn?lv|P4N`Rh&2`*m_52o zSe`hqD~>a@qx(3e1Cz4b~+!|$smwM)3AVRH}B$pu|*H@#9;-}XC-T?0M{>R);!gu59`#XaLr z{{a?3G|0Pn8C^G7$*a3sv(2W&oC~_A7i@Reqgu#}?jZ#jagn8qlBK(NPP;2OeT5Ab zer@`XY$eckVCGOxS%ZwvD{Ec&<&>{fqsK z_`W+t^<96Z_RhoZNdg!;F9;u6{jRw9w)|OU8kSEe{BdxwZXty$o-0s|a+Lp@M0Qm< zoN>ZiVIfDFL#K4|-ZK30Un$@|*`jjkd@^5KCojHCe@CFdBgJENPEVetfS|Cu8oKxv zcs10BQHnrD&r6A=GuV=_$jsA~j-w*^ka0UaUEhR)Vb<5tENVJDLB4|1H@86ytJTk` zdpJsP;~lmZHn=}~QuU_mg7?01087F8UA!uV)ZE)srda1u#ZQI+9_rE(Je`XXa9Vy3 zf?{1oyc~Zis3H+8hagjC!EH~8+9LVtw7nDGW*3?9c$XMPjw3^b_zaLK)pmR_JLHKl z`x9sk#;D$eB+}4?tNgjP9Wd0XM2@*6yELr~{^l-9E`Fkj?Gb5HPx@{kAT^gU5go7t9|nyz4zDqr7Vt|TiTXDF|x)*zMr z-zaOUkQ;`+R0OSeiOfuN})E4Kgn&^U(qXbZ8xU53+-J&@=TiQTh=(jtHUH%{9)R&`orGO#GS zXfM^<{Ts3AH=LpzoZ}oRs~T;M8_b89F0y4lv7qe>LMt(1ArtgrOS{%llt$&N%+WeA zi~8>tt?hjK4?DsR50+_KSBT0O{P}14MWCvl-Sy>3|LTCZmSO6QXi8JlDkNDq@*m8E z$4xRKJ~;b1mtMB$&M}GLz?JM6pO}qBSo_%{6+(2_6Gdlm&j_txe(r_ z^RTdKydq_DYIU1*@IN%pvmUT`&dER!p-MC1e*Kg@Nlr+#x1u&4yk8tAlNN6)B*Dsl zn7JqC-yW&aGPE7lGN_+NLOx^Vv@wnh%D#Iwo4Z8u%aEF}!1SiZo!+p2Eh#vwxWG_m zh>zl}%C;W`GQwP?vab5HCYlb_K14zh-x;EkcOYS)tdBv?{k&jEYp!x>=r1CwU97kmz;wDCkmpmd7FCW@6T~i ziAH!%Ag0ht;@}?4BPgpBgs9^L3?9_qjlv8@;sJVqi~+7$0hT=m9OF6NgLW&z}q|mC6pLSndouxdAk)HwjWUUt+NT$pb;xxD)nTSy4Em+BHx%|j;s~=kDHamk*5U13u)9@L{ zVht1+8Y%}mbpFZ2TUMtmoNQ-)LlicWr~YUC2Q_C=Jr>d9(20o%wVYpl%rkN?J29we zhP+bKjy1NsHIDh|-_7zsqcH<~XqOhE-O{s=PRKqw{{?P{LVRE5cWo!>M;Xsr15$Yq zchq7T`}Wq_hzV`Q1TT{J@O9)6IeoxIi+7^_vGOSf*!dE>5&u3vh-KFiZfexVUX%;> zf{EuYjg+}0#(8vi-OUWGAYl{*hkkIukbTESVpfBP&A0maexe=0odO4a5NS)CS}ChD zB4hK>K>Di(LxeO-@OJ_M%vye~Z#M*Vx91Lk855*4q7UhtQoEHJCt;8PuuNe;!g!6T z$OlyXrx-Mzth*FJ*pRutC4j109QVjyH;f*0~$Y3QgF9GG%UEQGA; z)@ixUA6X14@6$HkCLyF?PX{MciubAdufotLKSIqb$r&eS4Z%pT?*#`AUqm|#`X24Z zG5-Hh@h8+czuJEybioswe?Tw75CC3S{}v88%@^b{9aI5rH4;R3>=BJhl>*Y@b zO{vtMKe$V04$wF*{c;)wx@-uhGLDab0q(C9F3))^i>>U z>w8^*+3jk9HmKbq*Rt0qU0(9F%_(V4XPGmo`I9e~;J#^RY-mA{qOP1TJlHtlXo~vz2VW+37#C>VmrA zJyy<|LJjv)*ww~shC)&)FDy>~lRy|MMJbdDPAm60i+JpE;?33@3q#P0xP1W9RMWAr z^^HELCgJnzvoEBAIcMEhu%Ua~TV8u~kpdWnZHY6Q0(v+k&b(UY7oE3LwoftLUZp%{ zg;35_RWWouC7-fKB%Q~>(Mcmg{<|x1$DXs@Ih8e4mUfyq~^aaZ-OHQmO_H8qOGwb z=16>y7T6A}1Y^U)8dx26*5}+@$<@*hdG>V+nDL8VjU%-oHPy~|FEbcX=eqJEFM<}1 z+%}Ty_M{^-$X!Jx#5&`6QqT+`%CpvsTMS@8n4Js@vlT+BKHA7n?XQza8mB^B-@0M~ zgskOpez{~|q*so;ZoYP%CAO(4MFtzxWE{5#O0vwL7K^jC6eO|nYS*K5MP(aB-*1&l zJ>18Fjb>%KI5^;YL`POTo`!?XKQ;WcJ){6`S!Aj)TWwhm1@dCkyXcWfqm0i{N(SHYG zr8t4(;P28%)TNlcj0FnI@9uRFRbDgMDM~dhQ^6)Jkic|N&)V_Mft1#M4kuzyPI1rj zi-&Lo6KO~Gz_Wjuk@n!fQDq|ZcWKhnJgc-pwT9=>qRcO(!E?li=OpC}s_GG_5{ZyB z)8u`j?j-Oe!8FX6O?#3G1#WHa5vKK$yUz-}tM-zYwY7Be9?^?HYI+dIRhm5H-fq4> z^R}=me61)B9g|2fJfP?}%07w5xl8_&(oxFOWaXB+nrCSEM2xX`^Gsc?I_XSF)*5EgX9jT26T2q79n(Ih^k3Q>}D zt;@7Jap&<}LR+n9{>y%aT@pmq0z!wcEQLYrc9z+jWk4x4vKytvb0mPb8T_gs9IM6z zRU^H*nYBiUNwUPc|6*}(4P!W%#sAHzr!v0=K;@bRe_JnAYfkr68Rpf@;=x}&V^Vb! zr|NbrRDb^K%ugv8&3o@T=HQw@7bvT$g1dDP|F>kT_1Oiell0{FJpR&|DbZM$(H`eR zFomym&ZP3hW1ieK2Y4ZZu=2h+p5X!&q(L6-^W|?$f37Qn zfk{HnzI*QBn0!$@$Te%ZuW!mdFU*v&@t2A?<>0S2zVt7@e}$yVm=}E*DF7BT!1t&h z8V#~%klY=7y#4K9Lgrs{DF^XZwuof;JBW`$AKQ=gz*|7b##|;69#{KR49`wuA3Y*{82! zKBeeFUGKoJBGP=X7)!l`F_*C=Q!3ogeDNkfDyk6se}pu@0#a=$!pmAx;V)ig`M(vAVFTXz_9CI7-F5(MQ+gRAJZ}Q{(Xu!xeJ!y zr6C&2c{g;;gm6l+KkZ;px4fC^-)$ay@rDFk>65?;Gh=dVI-J3qCQalgWif0iUJEQE zEJn7suK&XVe2x^*yGl63Sow&2YYwF2|R^F zNHO`s6Cp0w1NYXY1Z0tkc9F1NUvf7SLY#}^Tq}$NNYb3-S?k9BlupK;N^X_uHEze!XT(O)2&?`!Pu*7-yd8S#vqn1?nIl z6yY1kk<8CA(oy-Fdf{#z+8@j+TAOtNG0~dS;Jmh=cbmG@4E^V=oWQmS*HQgrDXo}4 z;=qInH9qu4F-Z)gb3}VBE#@cz9Z4}3u7nCH4WzQ~$JA1h)r-UL1%|IoXqIFi=PL9T z+ji!D;W-TEDa1TfHQnuOLH=BI<|eTctCJt>-@W_$_n{cxX45-OFcOrlO&CD?Du_c{ zTUY7i1@R~#vZ$#7F7xl5B&*9$c>0pDn^3l)ZjF4Gig3oYi(yb&vNea9t7 zuQJ8zOVh0DUsVzv?imgXF~s#0=P~+$%wX6Fidil<$|*~JMupi7&%;uMT9W?Nrp+@? zYC$00oC^dY^Xt8N3p&uT?mO6C`)HT&W|$1WxFJKppIxfjkDOvmJ%#nJ0trWV6~lmxG-ZrZ2!1$H8l_hXW_5 z6@E1|hO!`7)%T`zL6A}UsZvcoq^ z)7ZFxi_t0hU?x-{hgS~lyvU?^cjQGFj?~?JxHCl`>8erMYP;K==BMz{{?mK1HtLmc zE?JIwfx*|0R^@`gtOd__%=9oHzhN+`wWq1yrFElNo2RLMs+yCIy?!4JRy1JZ(?b)0 zF8R3r`&>tbKYu-Y$88M8Td{uJISl5Ll}qmqx>N1E^*Kf`U#-j zE-U^o`7UhkjoSzAT_!DSZBy5TXxR@poM(Vm5eOLW-x~qrVq$Ru;K9+v^xp=k)SE`` z4hA!-tzl0NmqM#RJYg$yd3^;QyrJPf$)Y9Kkz9V~l{ZgV+%sGx@$1V|tV>JRVHV6I z@)4Ofk0RlsE!Powe(SmHt#0o@!frRd>2Sj;U(@T>yN0578m=wCL}V_{P|^tWn@a`8 zvazSkb>Nwk1b}hG=pnMNSP?SUIa6e3E~i?6pTyxMrK4L{xA|7%CEn)u)Cuf>-u?@> z{m}Ny0!}*m4?omQtrVFt+^Pgx5n^jmuC1GQfk(Syl;dFNJ_>Ge%7V1|;NAG4Qz;c> z({HIBIXdaj>x$LD3=Pm~!WL{`L)Q^pbfAulOn`je1-e}ASmA4#_j1kD9a00=ZdaHG z(%?CT*LyB603FY4L)l(47}y)*%%h%3`m!GyYL}qaDAX~|g(Y-1p0%&$(0xb8z#ppT zI@zW;i|u~jEyABQl_g>~(#e89rg;N|+56+9+ceQOmTl6c}-p za;|}H-U1X}*eVdih=;P+?kpt&es}A->X>gGk!wa~1XJyiQ#^II4b?rnE*T0*UM2>7 z=$|T5CDMhH{UZWp2?nB!a3^*5Y?Y7}6+e*o7dj7ok&|ft+>cohZ_{W@1H3KAFAtKq zdnzk%@6DsYOYt|Bo##1XpeeRR=$WCpfOf{G;Y^%0>MW%+nwvyswnW7QY=S z(?#8?;wTg_>mxOe>L#;pfSvepQ>Br-Z(|L}vfDG~&nn z4v0J_TpaYn`;?|df1QTi*aIsrP6Nyx0}`v9Eav88vC$zwc|`(#jz2@m1^Cc^PYRwb zDWW#k|07rWkFEdf?JEDG{GK+kba!_*NQQ4GU5WEU?en@9%$je8C$(JNJE`Gc#xAnmKd1P3c6FzZn?15ag$2qG%H3f{`HJ z4N0bvn)78!$GH&cUihchKIYrFyJ*SOdDy80=nAqo~l%a7&S>@N02aG~qH&sVRFzf4Ro?lLz z7|Db7;r~)U<{|?QilxY2+oqnQ>%kF>-7(6t@_Hjrmhw(J?qUyJDi_|&UYCXRU1WS1bvx<(vlm2l)iE_C-Q!gOd z#SU_C&WApDN}(OC{GvG4l7=GcV5tl*biVQJrN%R-4~2Jpd>wG!^fxAWE~7I*O_QAg zZ0WI3kwFwG+!{OyIOcXRVx)M1Co_iFiAd#S{mLA4QgaUNz2Sw_0*i^OUCSTv5B-za zLdCOz7utJ3narDghMTMll>AE25SwB;wJB=-1+8IYMXI;40lyThT6duL%mF&?4`X|p z$I0Ym7jEOP#_kx0oo&J5LO)*zKvL$XbYm0s$#CHuk)7Y$+`0 zDHyYYP3bRa7uBiY$>jS#!3EF{;&zXprhv;BQb;{=+aeGZ?W+~-m zMQV3^fSpG$|5-Nt=DKca&~_kN&j(6YL-9CN1!$0 z=P^t9W;$@xp~<454%O}@&2-7e;C%$e9WMEB%kicdB96tAT-OVPi1}HrS}$i}%PTlP^RJ9&WA{uAwh{+%#faEdH;+yU|0{e3`$ zNQH~=x@2DkDlB0%3?i``8vS7Fg)}C^jc$`?L$RmWmc6G}4EfG)E8Y#8G;h-1f!t}G zlukLz94&eZ5vesl9bnRAV|B^fthPE*6OE6@!@T9d0)>lX4K#5>9=~yvl<&|C1TqW9 z)`1@UU7nZhF)!BFG3J5AZ#4+OXed0KdHc}XnoE|B;IVP+04B#qDe3d8I0clq#8P0Q=&dFY8g%O2{-vFMXJ}1LjJW%ihS2}wP{1oY{i)(5xNMaui^dM2J z5S5}oVB9?^eDQ;TXl$3K=u;a~ zh;xdc^wp3T00&Ydimv7(OpT_t$%|NGZGDZ3i3K`ZT?*Xn z`_#Q+cX4PSu4WJlVjiA}g$ZIUD|%{tUT!>-R|1-vj3l^mFJ3&Y+`hct>}E0!!+&2_ z8_`*|QRq%sO7x>+qcmc_wHB$m@d9$s-ZR%g?>7477!^0M+pifTw3oknwW8zmml{#B zJqHJb(=Z|!{BA{3Y5ymKM`}oYaq?oQ+o)7~M@Lt@9x)FjHs63Qc7jg&DVNEU$G!D` z1FKd#b)MC~emJ?^o5o4<8za8EJ`z@>r1rMkO`$KUQn96v&7$5R37tp+^AWOWD6Kd) z0~Xz0??Z%;de4WOO!gmi5yVUJu&eYkx49DzSWAOxw4-SZVv>OJV zl9kl@+mCb7?da2@99)-L~*SHeynI7IpbS4w2qa}odM_Y=% zDo4mqgME?M`**0zwa?D(<%8ZmFvpxmy0+WK3GmhZDF@Q*+d@V1x!}79!eW*bG=thx z&oV;PBN?|ar~9iM?&`-Rbf@P3iKDIB+q(i}E39w+721!8TGW?L9H=p*=lDx0%#0kt z$J4k;ez)p|pq`8{%FTQq1f*Gilg2gz&m~7Fjo@C&J&o%=J}Sbo3Do6GDHAd-fgfxp zaU*Zy22s5jzOS$Gx|0jWjr%F;aqsYFgEuXl7IpRfX`O_96bdIkQn|tU8t<>^&#YH1 z#T>JgI>+x;P>H1hNr_lf$K})e0qHD={gUsGF*OqHA0S0ue3{^(K#omXNQQ`}@f$Ce zR)eqSa8vheETl#$JBa$s98glQ96ntNA%XcuA^iSDMtkXGQ)@N7Q6g~Zj^|oclfey= z(QNE`00>)Q71?}7<>P+O7V@cel0~rcSQ^?7IhGnIT0WB?p{%9ho&(P%1HasA6viFv zNSAK^Hb19eMh*5L-9)qmm;LpNX1egSEjbHC#&j2d^_Jxh85M+QbBu5b5M|9iTGAG; zRBEtVr}DhQ{ATU)6#$cT`U0}~CGU3&_Wc_LlPb&a&}yYj0bR}sP#0uzxegM|ouJ#C z7|`zhb{O_i8uXdRM!eG@NXPOc>-t@vhlD&Nn!B`iy*dHm8% zE3WN>Yec6|=bK`{dlHOidLYr66729dSt;_~jYB4sG>L9)nmWE~CPX zf#V8n{rvKRf~n?22)0EM=6Cn&S6{<&Y;l|zWNd@AijtZ$1A+4>#o$LNy-mf9qxOW`#mJCjQ?*B6z`o?J<(}Uy_RY^VXRxqMZ0vzh9l6~3;*9DTs$gJSs|0-YR)=PE(TEWgvEXZP1)4QLgY ze15#HfLkrqBp}YLzkZE=CtIUMob3@Xr+eiVvFJ*E@hMfHA?AEdHm-!W@z@1uXl}Va zo;*vojih?~Y!l?3&pl>~$nD>16#HfshvaS%_;=|7R|iRYi)lrSL8!J;@6m6%MeU^U ztzDS_HdH$arQM!~jAVMZTQw4hJF49u=Z`BAUppj#Exw4YD6wi0&(;SEiVxfHxYTL1 zJZDB8MPjb>MBgM(^YX1Ul^SfvL!S0L)qh~IUE?3Bk5_3yH|Ue<%JV{lp@A;wBuHQn zE}Kzi5}lB5U`D%T*&I&y?Ew+)OcD~gShE5qHMwfMW=x-uR>^Vo-N8o~(dT}!NN4@i z+S0O|uq+Q#R4aZy`^lpIPeV%hJnP*L&%Rw+FI7Sy7*8iAKm=B1+?7exS^P$0D4S>>jLZ$HEnP1={^#mTDnt<*)i#pZ$gX^^;o`<3Mje4skTZ+c@NS|-?y&n3< zgir0OFAdhFHE2`Q(YRd)sdS4u#$AR4hDJYg_xZ^84@|du{}XBjIR7?;#0|^vPVZ>F zo?E%R>6tMH@A_yZzaf48FIx5!nEjO||8A#RPyPJ@O zb6RPI8pVDs;_*6E!$om_87>k3<6uCaewX%(A#S_*TvydAk9Vo5tE%@8uOJNien!M(JursoY*M$CHoXZMKMb&0U~%qv3?=z*#2yHv^#|{r&zAFW;yn zuS7$^sYVZ`aE{|FTZsA$)jnv&alH4VS_=2H$!71Z_Q+&bpFKYL9XP@->~xln!J4*u zmcC}~a7;!;kte7s;;r$$JCS-%LiV$)B{V}$2Rpz_d;K(Vo&>Apo_gam9DkyNEyyTf z32A>IdPKM7qNZMeM1Fy{(MhA&P0T-s9eri6-?iD>Is@&%fb1)D7q;@_FwO^ZdzHy5e`6#@jdexofa;MyCHtn&4n-0-sSF zMmi$|T(Mh(^_NI!x!1y5#p(>>D1Li2R}MlAn8?kNxKSG({!cDSP2hh_))xHc$=@ALQS<+e7xe{Y@1b`>c963S{D~c8^F`I{5F#(-99ltr&dc$ zr2U5vEtH?gpRKy$kvFr(iXS?zw_gr0ky0w8oqTrGdhJ1LTLE| zQI6D;X5%w{Bm?(7IKlvdf@Wss(?6p4#T=-Kmm^rlWx)K0!n^Rrw+S$$-Z1`(?H;oO z{%&5QS6f^!nDd@mj@_I_1*6wzoaLK0m-tAE9a7Qx^)?+cngL&x-Ma7z#*+CE`-*BwO^Tamo^FX=LrM@bOc^z4R)XR|yk=URP z^NT>|tG0gwlYIfWup0y@LtbFp&i}5`0{=*YBZ9g5gX}oA|dn%|{+n zSfG^X2o3%BDeW`lNuu40gB}xM_TPHAwaRPm z0k-5L3z z-`x);$rx1BZX7*h2+&H&W2#E*QS1B1WlCFRwA5)V`EwnANEO!0$LX)c2M$lTrO)bb>?#n z0pH#!R(q&%n2VyE6g9 zw?r15PFbVPUYJfP#M6(dMm83oPENUu`^@{-qdAZQ$RhmUQR%PjI%rXtPo5`{IwjQQ z9;Ydh(ez&s-U#&^3%Xdd52nf@0lkSmmeOqre>*QE`*+POB-N{jax^Aaa>h^s15FsFGI+(dP`15T(ZUw!4 zCo`&n-&)EB*!QneY8`i6kJ4w6fHJWhuanRl6H2Z7{myLuVeu<~6#3EG;cS{3c+*9l?Wu%izqk`Rxdx7)$a2qy#f^LB=t|j(N+f(^! zrO5Spygk6xeGcO|i>_VyeYGL(*y&}ka;)JL+_Q3Q&@!`Ptm8D$^uq4NR=;SLwZJk_ zDmtZH^`)UE0VX^sQob?l`^TtsCuuDJV?_9OE9IqJuTBF{SX?%o2Hhpd#yOOkxZLp zi4#$^d$9%&nQ=}h!=`*X<<#Yx<=(@kw%aO|h*$a2UeLhve3A3zJBTrT^L!X48y7#g zxllG=m{!2Jf4=bcH=#qKP{>TLXl@nlz7%u+N^9K29SrmLl7gtw?`wMWsah#dTYhA) zD+3iiTczF{uqI@V8gGhc`r14I{H5tpJ|e|E@1uy z1#FMMDy<$|Rx3UZ#B_W&STYAu_^{i^rl}k$&!4y4^PFcQjrJF!aM8bkX5Oc}Ya$)b zmDtYQdMe8ViGx39W(v_~&{jJy-1}Sh(z{tCwja{%Fg5;f(EOrgET(b8Zo7qrIZ01O zW#;>uEkm|eN^5&*2Akpwz`_LSBuEfZ6vE4VXR0ildsKNId58KE0u>=Cz7{fRN}u$k z65&l`DfY*~;o8>M)-(re@%8o3hcmeM?o2gGbw~MuNZa1viW3}lguD3}?gSsaWAD_uDntnLq%S_iF06Ghz94-}DpcBiO!M?)Q$gJ0#|xJ_?=A ze7a)3@t1Yv^xn*I;K=FSJsef$ieH~#F^c$poNpWwx9834pcA2J?u5rhOk~BhNgKGU zvcKK~1(LF^KXnzoW>$|@C8YRDidp~%Hr`phL4m=Wv;oObeB$1n*acdJg+w%corQbF z6bj_w{KRhf``?HB5vk~h*g$%SUhC4Uo>kG8`x%i@@725p=DFOC=>-a-Ya@~i*ts;B z9gGg${VbO|vmVqbirf$|)}c*be4{yy@A6WC;!F4$|X^ z^usf;C9`jAD6-Vm-g=94)2#^APbV_(9Vri*+hb=_#ckwz*GG3O5=h5)61EiJVIq;8 z(XvRqIS?a6q^%t16pRum+?#pAgbb^*XfSyK7U8|nbzkc3l=9*@4pZqE3J_WXV8!#Q zp~`FP&T`G=eYac*?o6Xb&*n;EhH|D4z1ZWWNL~mp`Gt4t4@Dow1HL5kbBm&_f9+Q6 zRIl{aro9r-*B12_^lxdadFu(@bVM=NSzHx83EW=Lr{61Hukzu-?gizgjI@X?bl8_C zvkOool+jmcH7(5*1BfYKh4zdKF+FTNQA#LS5ydl<-tULAk#pHUMO*-A*pti6@gBVI zGXA)D^d$yOKcb$AX8K?grSyP{o|G=)dk^KepFjKHkKo@t%-3kO_mtSvA*1Mr+px5ljou(d z&BdGgy{Nu_>`N0YY^Cz>5ze<4&&waA2->>~-J2=lR-$7r`BYiob7fUK$yHf+@o~eq zkNuZ^-DE~YL{WZs0;KlLFTMA@{ox}2;)3l^}b#2oy|~v6ESVw>4}yWj+AmU zQ{l|dEm8zODq}D?zrOoi6rBV|EU_*vh!i;LP)927Nrh_RJ@_!{Y%-Q}LADemlKR_` zCaI#SKfkpVgAq4hka{13*`FUNyi5N@%hi=af?iFFnmrjE&9WediAP)3 z+g#n=?i9^6fH`U%DxTn4IJGq74l9az0^@*+H$Dxpz&|ytAt4J`RNNaj`+3C3pBY2w zT|B-VjtiCjwifLT=u9n-Nwa_1n21N?6&MDS#+He_E*!!z9&WQDnUgAGIlP{Lt7-I?D`{;VWKn~t+sxHq82x%M zRVP_O#a?7e=Zr9VZ=)(PI$wb~)O&kCGa@Na^6b)Uco?2oP~x|C=&bXJn!<*SNs>Ja zEw_}z;=64yV(2_x9`xC`;>X+;TPkooU8n}{$P;TqogL}E#o zv}YYEyXi9Ums$Cc8DRvua1Wiaz?BWa!~vYljGpWh<$8?TV!pIDekX-@?!Wavn)LTS z*#PGANK4WC@GE!t5|Aydd7un7Un^TYPSnQZp(H(J|86Ar9iIT1d8xf8!VR<4YIm3& zv>43>+e?{YaY|~7H&y&h_{sjYtfP(N-*jw@{Ed+PgJ6J*Xpd9<`jK+jkbFVIXShdm z;^C3pg%cr~-vp_BJgM{5{3Z@6U4Nf_JrF_l-QdPr=~yJusd?h;8soBAP7`v-D6JyBE^{9C+r|_|%YL^GYjEHKpbL&LIqT2UhUhuw-?~#cS z8OLf9IF|*&H$}yG>#FQ_YvAUe3tnz7S|^~5HYYZm+W>x-=E>urSav(`%NX6@BHTMm zaCVJmEFP_Fi?GQv;EJeel0icC z>wexXVMe)puu;{ck&F`!-)BocA?fwHa};S(GAr&F-3Wk9UfIr?{0vn>CC1HZ?cT4f zFcy?GVDWg$XgWbW9^33i*W(}KM7mXRE4(-ZrA`Y;25G)tWs&^Do{y03*RQxnrk$pI z*8;6gun$0Mfnf+5gp{wJ&31|?uHlZ5g6R3B29dxx3;I%g-{#i{mO{%nSHuxNF!_!d(R#F66=plzxfkmOc8Rm)MgptwMLEAxkOaFXYDYBxL%7MTCQiRFRuc z_}Q|(v{&!$F#JGpSCOgXEFR4O zBi<|yH2XN}6z2?%T)!~3@D}GYIx8&=@C}#0$Z_X=UmqK;^Ne2BcHJ<9~Rj_k$; zfbIJJ8O4&YJpQq!J#N1Clo3R0dyI|YxfNgFc{N>evFX;Gm&Mj!HBOQeqgnl#r5nE` zM=|)5A>~)jSV3Yib&s0l7WMSvt0D$ljaPV=oX~x%FOgn?SN2`RPnEYUCjyt~>&y** ziBr>7uhiFbVv7})mJ}%ai7agR?%V2lLREPD;M18e!l-YzPR^*PSkXluc_dv-X6Kjt zeNmpT?`EMGwkFXLP9AWJ658QW8d-s1qFRZ5{h)5z^|+!Jr{^F7PV+wIi?^~Hk=2*W zpiyG5#ee>kpLWR?R6Tm5ya1nVzdU?`MH5&UYWIn*lf$=*-y~`+%Pieo36<y zSSi<^$_CH`q}wXq$q#{oBsCeMO7RQ@(xUS!iq9L4V%{F;k4W-eNjX1_A?RkRf48bO zN{)TdIi95`M=aVX_IgWk07Kqn+Z-O_cJ)Bmn<$bAI@ao>)Sfci5YWW}v-Y#>kD-2# zKeQIy6GgSXHLHe*kNCm6gw`H6`Wznpd82+y1g`i^i^LsjyE#!+(0q>&oQ87fN;Ba| zc95u}T;C|$7nJ-6-zh0tYYqD|bt+T789H+6v8>!m4g2DL1n!oUIf&f3-QzDOO*r!` zd^rnOVs4?zUp)sGU-DaE)Y)yFy8X`-7q0t${4YS#qz;r!j2&INmKqvG?C({Tu$ZIcxQr#mRjnxV%|y z9wWs0?t0+(P<&AdrJqCi$!)ZzfJ2w@Pf?Enf~v{$X{K8y(Ax~gnkbU^AQ=^YzWZr$ zWFUw9Tq;;oB|0hhCgV70RIp!bNfHrb#QdjUcI;Be&!ouv$Mg<>>CgBZ`5N&@%bJ~i z&dHDfj0@14TAjLE(c#}k92%orbgYC#KRQ%39YV;h+IpG>k^}Z#U{n}0b0oG}Ar1j1WX`IR5K-;BG ziIcms^QX7WDYKKWPhy|2EG#ft)t^pRGEbX&ur2kJ2EnZ#$^_Vb{_$f`_&tamhknFc z3$v%q&bsb+uSH^$gA-)sKbM*&K7S>oW2OAdYsL7D*e>T&ON8Uq6~yEia^Nj{>(z&e zfXJ4ns=mBD6@=@xU`}T4Mq!mAhRCZAeyKeyYsb8k(Yc?hdry$n-8Ifx8J`T z_4}^H_Wey;TdHV%>dTbCbIZ|VmN_gEvhlKhRYT?=sx&J2tE4)1-S>2!tn~3{kL&#Q zt94Ihid{`DPcPo0ur-=Wh>}(zp1B_svhan`3a|b55%m4WZ+llA>UYKs>eyU7cu2O0D&$nHVTWCA}OewrpD%I_vHJ{4#K-{Ch zZ&B(3^tj0E{rZtDbN51=pN5KC#LJ8XgqCY!mx}@! zbQl=Gr^@0*5FgHju0E4dVX;zo8MV!r{q$;hV<)c@SmCII>5lU@TD9iYXU34a0QE9E zWW;E=ECRI{!*6eori1Lk{OVKaI$o_6T)h@9`etFf;3ibYuDBK{Nq@>s{A2X5-A6}J zFSC^>@On0Ps|^bpRW$us4ob-t_RHWQspVy^U!E^xwpOt@#i~9W@&uyMq(&o6g;EBc zppT%4K1^0ns}(y%B-adI`Y67n>-nMIJSa`l2ZOb1D!ns`1zz0o%w*^KgyQx;^)u$n z?XWT9fbuBF)r^+aNQBF6|CCn*OGOZ)tp5f=chkfe+tJ##<5{ju#yM;uaE3@7t@V*2|-WwBzZ& zRA!*Yp+51W$V`YznFrm|7spi2$G1Cgyrt~zY*Xa`{o_nv6~4z2rk;y)+k67IcVE_QI*H` z47d^mif{l|1uu@*j2}*>`o*9Dyq1^G`iOvpe8b^+XTn1je_H7qy;RG0rHcW~LZ0{@ z=*&unm+Pk)%GdbhWB#&yBce}2$^eXeTSA!<6mxqHj(%r3Ml#MAkBdyrUdBbl6$f;c zO0>3D6-x16Pb>fa^QSCVtjb9t!`n?VOu~{zXVLfhjRdC?gJb1$|W=OyD4>e{ua{xwtz$bv`b0J4I1~Z-tM}p2P6ih|12!W0etzv z=IPCo_L@ueH^id(9#teOMIIQOqj3?cwUvx!}-1ro@)<0^O^p7LUzNU$%Q58AA z+{xkgE^d^5(t1(An*|wzhaB9EUO5BZi4W^0%N^Kin_>p5B=VL1_ChXuMc0Ekx#XyW{K@vUL)Ba*I268Rwev zR?4hnEYT*iv#h=~x{1MWrt8th?;ye$78GBsk(|i{6aJuSjh*j_3?uLZDG;p82}*7{0FR(%yONICBe+lZbJp69<}1 z60bfndGcb?vtdXTBY01bI*ACED0_{)5@V={WTGAv0>IyAT~q8n924FM_Et}#P$5OF zK5kL;bE8_m<}2SMO?}qPyaUP}PAA(`G!WaRYt5xARrURM4g_Ma@^M1JJ!+ItY!@9Q z>tPFZ=qvZqFa*HX^3t!fti%}A<7OX%0)GoRgIgCaCBTO@Gq6U)yGQY8r4J15abI@u z?pX&3BdL?Fm_@aL>t&VUUhiG0j$}JudgME4HhuOieq!CFPLf8Mlh?0CBO|%XufLsI zFR>uX1c*y{GO>RJGs|4zu|hWWv}VpSa?zLJTJJjrM=@dWki>wd8n^{eOnQL1pzP?Z%xROD0&PvIgErznd;<;fXH*X>*swt2Id0zX?1}R+OZ0Bzm6(+*C{3bo`|L=DkZ$C-6 zRpFtVG(sHkJ_=?I!!VVKLWcPu(^GKkUx|prGcFGsd)Jlc9=i|9>0{xxk8WZ=dVjWk zZY~(WqeQ`8*^(VNm+a8lSHoRqz7I%#J1851ULHvIA4oSpBII3I?X3^>* z{o2^Cj7S*dEGW@Ea(H=Wbjbl_^_O2eT%fI^t(H(#$Px6>wwzY`J@yJo`Pb&X*RYIA zR`gZ$o2G|YyZHm_jx!P7O`iSsd)T{$7K0NVH~Zj8$YP}n4*0bU=lP{@{8D;B6wOTP zl<3b!Rul`Q8}-4?;lnscF13zN@B0DsN+ctL|AYB0#M?*WLcLN~cT!f1&A%AnHGdme z;sX`T8K#*|0#w5TnBzV6vbV2Hw7@(6TTIwy@>geJUMOGKt#qJvl0;4edhJGC2RwN* zH4yMQoqEJO*<}fHOqSc*i}U|+eJp%#7ezG|+e*%Hqd$BqgyBG!QTILu62 zEpi?v7Vi|Y5-K$kOhDM=A7bgOfRB=`Hx1K$Ck29FYCrpGNvlRGfAPlKQk#dKBS?s^ zV5T2W=KlVkyQP3J+g}hpyCBrbA~P=ts!+%AzET8|ylFqo#wmD!QdlXnZ6}blIV(^= zRU=GV9U<$ut;^ADw!Y`?D(8Q#@E+iu_z?f12v}r++WT|iN5Yu)ZjY@*s|7@6|9MS@ z-DMYrIp+X5X^NSwsjr&t3hfDK4oJ68-@iR^hg*wSkD!sOai!R`cEm^AYwwRCcWcA3 zMfF5&_!X4sbVcU_jI^#PoD?gGwr33=Zc@OZ5j1@gEhJ8aBtQ=A`t}^4g8LcL`Hds; zHBKTsr5-A=qKuqRNtSZpl^vmBFe0U7;jgA!3kg_DFB$y;T(5~70ra-V!u)_=qEK9$ zG#X#JEcy!Rx9+-1Ta6La1#p-|z#=7TFC4NJtkLDbiCTa^C@67XJG8eU{7(!U8wv|Q zXI|1G_3%`_^EIpnAohvY>5`7NwlB<}?|o03pg-m=YfYGq&YKJH{(r8JCQm~Abg8`wy_06$;0iE5!=2xs{P?}3 z+meKfG~G8EDC{Kvd&PBz+KDQnTbBnL(kjf*4gtbH3Q{;mOV|9G2N0x@(3pC5r@@IEv$G&l3 z4P!jqS-xyBLHadbBtdA|tT`k>K~y%8voF${Q-T+x}cBvl@tG zv#v-vW~;J4#b3qOQnz9Ri6txAA~GjE$A)?SlN*8Ri;Nc5Y^2hZCP6K%(eTi&J$jQi z>n)bQ|3U?;FIw#;AMy<5anP#{T6#DMkLkT)9q~9o%Wa0JDhbf+1S{K5bJ$oX^oH@9 zXrwXmzthyXHvfk4RzGW|(*H@IdwcV#Cs&^20{&zCQ_T&!#89yjqMO9MX`_WlO$Z*W zr90cFPoAD$e{i@`MjXLIovPb;``AL1Kn}p_#sJFG*|+}_#V=s7^K?99m!|F}AveFl zf)}Kl9U$H2|0yGJc8e8-y zBxoPyOB+Ipoh7hcTr%4j>8{2k#P&{H_2fj>#J&91pp|jf}H;+ zQ#)A4OHDmiE$W&J`7U*JydVlPLz?U6qst2*kugv)=Pod!9<%h&;DFGhfxHX9j;1>3m58Q;sVC0nfZHYsqs7w_iX{K7WqCGUFlYt^?Flj_a(FY$p-jk= zu4hY=U5b#TlS{b?<(Wx1?MU9zHSYm?BeT_WbdYKn6J65S_(I2!XLCLSxM2$xIpMK_ zrV2=LZc|abGb(!s_g@KRcI)-uCn6t+!g0Hb&N$$ozK)^xM=huL{{z>wU$y`M diff --git a/resources/lang/en.json b/resources/lang/en.json new file mode 100644 index 0000000..d208ff2 --- /dev/null +++ b/resources/lang/en.json @@ -0,0 +1,54 @@ +{ + "(and :count more error)": "(and :count more error)", + "(and :count more errors)": "(and :count more errors)", + "A fresh verification link has been sent to your email address.": "A fresh verification link has been sent to your email address.", + "All rights reserved.": "All rights reserved.", + "Before proceeding, please check your email for a verification link.": "Before proceeding, please check your email for a verification link.", + "click here to request another": "click here to request another", + "Confirm Password": "Confirm Password", + "Dashboard": "Dashboard", + "Email Address": "Email Address", + "Forbidden": "Forbidden", + "Forgot Your Password?": "Forgot Your Password?", + "Go to page :page": "Go to page :page", + "Hello!": "Hello!", + "If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.", + "If you did not receive the email": "If you did not receive the email", + "If you did not request a password reset, no further action is required.": "If you did not request a password reset, no further action is required.", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:", + "Invalid JSON was returned from the route.": "Invalid JSON was returned from the route.", + "Login": "Login", + "Logout": "Logout", + "Name": "Name", + "Not Found": "Not Found", + "of": "of", + "Page Expired": "Page Expired", + "Pagination Navigation": "Pagination Navigation", + "Password": "Password", + "Payment Required": "Payment Required", + "Please click the button below to verify your email address.": "Please click the button below to verify your email address.", + "Please confirm your password before continuing.": "Please confirm your password before continuing.", + "Regards": "Regards", + "Register": "Register", + "Remember Me": "Remember Me", + "Reset Password": "Reset Password", + "Reset Password Notification": "Reset Password Notification", + "results": "results", + "Send Password Reset Link": "Send Password Reset Link", + "Server Error": "Server Error", + "Service Unavailable": "Service Unavailable", + "Showing": "Showing", + "The given data was invalid.": "The given data was invalid.", + "The response is not a streamed response.": "The response is not a streamed response.", + "The response is not a view.": "The response is not a view.", + "This password reset link will expire in :count minutes.": "This password reset link will expire in :count minutes.", + "to": "to", + "Toggle navigation": "Toggle navigation", + "Too Many Requests": "Too Many Requests", + "Unauthorized": "Unauthorized", + "Verify Email Address": "Verify Email Address", + "Verify Your Email Address": "Verify Your Email Address", + "Whoops!": "Whoops!", + "You are logged in!": "You are logged in!", + "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account." +} \ No newline at end of file diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php index e5506df..6db4982 100644 --- a/resources/lang/en/auth.php +++ b/resources/lang/en/auth.php @@ -1,19 +1,9 @@ 'These credentials do not match our records.', + 'failed' => 'These credentials do not match our records.', + 'password' => 'The password is incorrect.', 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - ]; diff --git a/resources/lang/en/crud.php b/resources/lang/en/crud.php new file mode 100644 index 0000000..b04af04 --- /dev/null +++ b/resources/lang/en/crud.php @@ -0,0 +1,83 @@ + [ + 'list' => 'list', + 'view' => 'view', + 'create' => 'create', + 'duplicate' => 'duplicate', + 'update' => 'update', + 'delete' => 'delete', + 'save' => 'save', + 'edit' => 'edit', + ], + + 'helpers' => [ + 'list' => 'List', + 'list_all' => 'List all :model', + 'create_model' => 'Create :model', + 'view_model' => 'View :model', + 'update_model' => 'Update :model', + 'duplicate_model' => 'Duplicate :model', + 'delete_model' => 'Delete :model', + 'save_model' => 'Save :model', + 'edit_model' => 'Edit :model', + 'no_results' => 'No results for :models', + 'publish' => 'Publish', + 'unpublish' => 'Unpublish', + 'seo_title' => 'Must give a precise description of the page, which is recommended for optimum + positioning in search engines ( tag).', + 'seo_description' => 'Must give a precise description of the page content (<meta> description tag).', + ], + + 'libs' => [ + 'toolbox' => [ + 'assertFieldIsUnique' => 'The :value for the :attribute field is already in use', + 'assertNoInternalBoUrls' => ':attribute : It is forbidden to paste back-office uri into this field', + 'assertNoInternalUrls' => ':attribute : It is forbidden to paste a url of :appname into this field', + ] + ], + + 'messages' => [ + 'has_been_created' => ':model has been created', + 'cannot_be_created' => ':model cannot be created', + 'has_been_updated' => ':model has been updated', + 'cannot_be_updated' => ':model cannot be updated', + 'has_been_deleted' => ':model has been deleted', + 'cannot_be_deleted' => ':model cannot be deleted', + 'order_changed' => 'The order has been changed!', + 'order_not_changed' => 'The order hasn\'t been changed!', + 'publish_status_saved' => 'Change of publication status successful!', + 'right' => 'You don\'t have the rights to access this part !', + 'theme_updated' => 'The theme has been updated !', + ], + + 'minicrud' => [ + 'visibility_label' => 'Visibility', + 'visibility_helper' => 'Check to make it visible.', + 'enum_select' => 'Select :enum from the list.', + 'associated_enum' => 'Associated :enum', + 'dimensions_must_be' => 'Must be :widthpx (width) by :heightpx (height).', + 'picture_title_helper' => 'Useful for users, displayed by moving the mouse over the image', + 'picture_title_label' => 'Title attribute of the image', + 'picture_alt_helper' => 'Must describe your image for search engines and blind people (5 to 6 words)', + 'picture_alt_label' => 'Alt attribute of the image', + 'text_warning' => 'Proofread your content before publishing it', + ], + + 'other' => [ + 'up' => 'Change the order of appearance upwards', + 'down' => 'Change the order of appearance downwards', + 'no_model_found' => 'None :model found', + 'publish' => 'Published', + 'unpublish' => 'Unpublished', + 'search_start' => 'Start search', + 'search_delete' => 'Delete search', + 'search_placeholder' => 'Your keywords here...', + 'sort_ascending' => 'Sort :name in ascending order', + 'sort_descending' => 'Sort :name in descending order', + 'sort_delete' => 'Delete sorting', + 'sort_arrow' => 'Here, the arrows are used to sort, not filter.', + 'right' => 'You don\'t have the rights', + ] +]; diff --git a/resources/lang/en/enums.php b/resources/lang/en/enums.php new file mode 100644 index 0000000..0b67a5f --- /dev/null +++ b/resources/lang/en/enums.php @@ -0,0 +1,3 @@ +<?php + +return []; diff --git a/resources/lang/en/http-statuses.php b/resources/lang/en/http-statuses.php new file mode 100644 index 0000000..3346f78 --- /dev/null +++ b/resources/lang/en/http-statuses.php @@ -0,0 +1,84 @@ +<?php + +declare(strict_types=1); + +return [ + '0' => 'Unknown Error', + '100' => 'Continue', + '101' => 'Switching Protocols', + '102' => 'Processing', + '200' => 'OK', + '201' => 'Created', + '202' => 'Accepted', + '203' => 'Non-Authoritative Information', + '204' => 'No Content', + '205' => 'Reset Content', + '206' => 'Partial Content', + '207' => 'Multi-Status', + '208' => 'Already Reported', + '226' => 'IM Used', + '300' => 'Multiple Choices', + '301' => 'Moved Permanently', + '302' => 'Found', + '303' => 'See Other', + '304' => 'Not Modified', + '305' => 'Use Proxy', + '307' => 'Temporary Redirect', + '308' => 'Permanent Redirect', + '400' => 'Bad Request', + '401' => 'Unauthorized', + '402' => 'Payment Required', + '403' => 'Forbidden', + '404' => 'Not Found', + '405' => 'Method Not Allowed', + '406' => 'Not Acceptable', + '407' => 'Proxy Authentication Required', + '408' => 'Request Timeout', + '409' => 'Conflict', + '410' => 'Gone', + '411' => 'Length Required', + '412' => 'Precondition Failed', + '413' => 'Payload Too Large', + '414' => 'URI Too Long', + '415' => 'Unsupported Media Type', + '416' => 'Range Not Satisfiable', + '417' => 'Expectation Failed', + '418' => 'I\'m a teapot', + '419' => 'Session Has Expired', + '421' => 'Misdirected Request', + '422' => 'Unprocessable Entity', + '423' => 'Locked', + '424' => 'Failed Dependency', + '425' => 'Too Early', + '426' => 'Upgrade Required', + '428' => 'Precondition Required', + '429' => 'Too Many Requests', + '431' => 'Request Header Fields Too Large', + '444' => 'Connection Closed Without Response', + '449' => 'Retry With', + '451' => 'Unavailable For Legal Reasons', + '499' => 'Client Closed Request', + '500' => 'Internal Server Error', + '501' => 'Not Implemented', + '502' => 'Bad Gateway', + '503' => 'Maintenance Mode', + '504' => 'Gateway Timeout', + '505' => 'HTTP Version Not Supported', + '506' => 'Variant Also Negotiates', + '507' => 'Insufficient Storage', + '508' => 'Loop Detected', + '509' => 'Bandwidth Limit Exceeded', + '510' => 'Not Extended', + '511' => 'Network Authentication Required', + '520' => 'Unknown Error', + '521' => 'Web Server is Down', + '522' => 'Connection Timed Out', + '523' => 'Origin Is Unreachable', + '524' => 'A Timeout Occurred', + '525' => 'SSL Handshake Failed', + '526' => 'Invalid SSL Certificate', + '527' => 'Railgun Error', + '598' => 'Network Read Timeout Error', + '599' => 'Network Connect Timeout Error', + 'unknownError' => 'Unknown Error', +]; diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php new file mode 100644 index 0000000..a709346 --- /dev/null +++ b/resources/lang/en/models.php @@ -0,0 +1,9 @@ +<?php + +return [ + 'classes' => [ + 'user' => 'user', + 'activity_log' => 'activity log|activity logs', + 'static_page' => 'static page|static pages', + ] +]; diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php index d481411..ead9596 100644 --- a/resources/lang/en/pagination.php +++ b/resources/lang/en/pagination.php @@ -1,19 +1,12 @@ <?php +declare(strict_types=1); + return [ - - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ - - 'previous' => '« Previous', - 'next' => 'Next »', - + 'next' => 'Next »', + 'previous' => '« Previous', + 'previous_page' => 'Previous page', + 'next_page' => 'Next page', + 'specific_page' => 'Go to page n°:id', + 'paginate_list' => 'Number of elements per page', ]; diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php index 2345a56..f3b65ba 100644 --- a/resources/lang/en/passwords.php +++ b/resources/lang/en/passwords.php @@ -1,22 +1,11 @@ <?php +declare(strict_types=1); + return [ - - /* - |-------------------------------------------------------------------------- - | Password Reset Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ - - 'reset' => 'Your password has been reset!', - 'sent' => 'We have emailed your password reset link!', + 'reset' => 'Your password has been reset.', + 'sent' => 'We have emailed your password reset link.', 'throttled' => 'Please wait before retrying.', - 'token' => 'This password reset token is invalid.', - 'user' => "We can't find a user with that email address.", - + 'token' => 'This password reset token is invalid.', + 'user' => 'We can\'t find a user with that email address.', ]; diff --git a/resources/lang/en/recaptcha.php b/resources/lang/en/recaptcha.php new file mode 100644 index 0000000..8a95f21 --- /dev/null +++ b/resources/lang/en/recaptcha.php @@ -0,0 +1,6 @@ +<?php + +return [ + 'error' => 'An error occurred when validating the form, please try again', + 'not_enough_score' => 'You have not obtained a fairly high score when validation of the reCAPTCHA' +]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index a65914f..0307003 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -1,151 +1,233 @@ <?php +declare(strict_types=1); + return [ - - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used by - | the validator class. Some of these rules have multiple versions such - | as the size rules. Feel free to tweak each of these messages here. - | - */ - - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ + 'accepted' => 'The :attribute must be accepted.', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'array' => 'The :attribute must have between :min and :max items.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'string' => 'The :attribute must be between :min and :max characters.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_equals' => 'The :attribute must be a date equal to :date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'ends_with' => 'The :attribute must end with one of the following: :values.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field must have a value.', - 'gt' => [ + 'boolean' => 'The :attribute field must be true or false.', + 'can' => 'The :attribute field contains an unauthorized value.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'decimal' => 'The :attribute field must have :decimal decimal places.', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'enum' => 'The selected :attribute is invalid.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field is required.', + 'gt' => [ + 'array' => 'The :attribute must have more than :value items.', + 'file' => 'The :attribute must be greater than :value kilobytes.', 'numeric' => 'The :attribute must be greater than :value.', - 'file' => 'The :attribute must be greater than :value kilobytes.', - 'string' => 'The :attribute must be greater than :value characters.', - 'array' => 'The :attribute must have more than :value items.', + 'string' => 'The :attribute must be greater than :value characters.', ], - 'gte' => [ + 'gte' => [ + 'array' => 'The :attribute must have :value items or more.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', 'numeric' => 'The :attribute must be greater than or equal :value.', - 'file' => 'The :attribute must be greater than or equal :value kilobytes.', - 'string' => 'The :attribute must be greater than or equal :value characters.', - 'array' => 'The :attribute must have :value items or more.', + 'string' => 'The :attribute must be greater than or equal :value characters.', ], - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'ipv4' => 'The :attribute must be a valid IPv4 address.', - 'ipv6' => 'The :attribute must be a valid IPv6 address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'lt' => [ + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lowercase' => 'The :attribute field must be lowercase.', + 'lt' => [ + 'array' => 'The :attribute must have less than :value items.', + 'file' => 'The :attribute must be less than :value kilobytes.', 'numeric' => 'The :attribute must be less than :value.', - 'file' => 'The :attribute must be less than :value kilobytes.', - 'string' => 'The :attribute must be less than :value characters.', - 'array' => 'The :attribute must have less than :value items.', + 'string' => 'The :attribute must be less than :value characters.', ], - 'lte' => [ + 'lte' => [ + 'array' => 'The :attribute must not have more than :value items.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', 'numeric' => 'The :attribute must be less than or equal :value.', - 'file' => 'The :attribute must be less than or equal :value kilobytes.', - 'string' => 'The :attribute must be less than or equal :value characters.', - 'array' => 'The :attribute must not have more than :value items.', + 'string' => 'The :attribute must be less than or equal :value characters.', ], - 'max' => [ + 'mac_address' => 'The :attribute must be a valid MAC address.', + 'max' => [ + 'array' => 'The :attribute may not have more than :max items.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'string' => 'The :attribute may not be greater than :max characters.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ + 'max_digits' => 'The :attribute field must not have more than :max digits.', + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute must have at least :min items.', + 'file' => 'The :attribute must be at least :min kilobytes.', 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'string' => 'The :attribute must be at least :min characters.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'not_regex' => 'The :attribute format is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'password' => 'The password is incorrect.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values are present.', - 'required_without' => 'The :attribute field is required when :values is not present.', + 'min_digits' => 'The :attribute field must have at least :min digits.', + 'missing' => 'The :attribute field must be missing.', + 'missing_if' => 'The :attribute field must be missing when :other is :value.', + 'missing_unless' => 'The :attribute field must be missing unless :other is :value.', + 'missing_with' => 'The :attribute field must be missing when :values is present.', + 'missing_with_all' => 'The :attribute field must be missing when :values are present.', + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => [ + 'letters' => 'The :attribute field must contain at least one letter.', + 'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.', + 'numbers' => 'The :attribute field must contain at least one number.', + 'symbols' => 'The :attribute field must contain at least one symbol.', + 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', + ], + 'present' => 'The :attribute field must be present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_array_keys' => 'The :attribute field must contain entries for: :values.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_if_accepted' => 'The :attribute field is required when :other is accepted.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'array' => 'The :attribute must contain :size items.', + 'file' => 'The :attribute must be :size kilobytes.', 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'string' => 'The :attribute must be :size characters.', ], - 'starts_with' => 'The :attribute must start with one of the following: :values.', - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - 'uuid' => 'The :attribute must be a valid UUID.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', + 'starts_with' => 'The :attribute must start with one of the following: :values', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'ulid' => 'The :attribute field must be a valid ULID.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'uppercase' => 'The :attribute field must be uppercase.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + 'attributes' => [ + 'address' => 'address', + 'age' => 'age', + 'amount' => 'amount', + 'area' => 'area', + 'available' => 'available', + 'birthday' => 'birthday', + 'body' => 'body', + 'city' => 'city', + 'content' => 'content', + 'country' => 'country', + 'created_at' => 'created at', + 'creator' => 'creator', + 'current_password' => 'current password', + 'date' => 'date', + 'date_of_birth' => 'date of birth', + 'day' => 'day', + 'deleted_at' => 'deleted at', + 'description' => 'description', + 'district' => 'district', + 'duration' => 'duration', + 'email' => 'email', + 'excerpt' => 'excerpt', + 'filter' => 'filter', + 'first_name' => 'first name', + 'gender' => 'gender', + 'group' => 'group', + 'hour' => 'hour', + 'image' => 'image', + 'last_name' => 'last name', + 'lesson' => 'lesson', + 'line_address_1' => 'line address 1', + 'line_address_2' => 'line address 2', + 'message' => 'message', + 'middle_name' => 'middle name', + 'minute' => 'minute', + 'mobile' => 'mobile', + 'month' => 'month', + 'name' => 'name', + 'national_code' => 'national code', + 'number' => 'number', + 'password' => 'password', + 'password_confirmation' => 'password confirmation', + 'phone' => 'phone', + 'photo' => 'photo', + 'postal_code' => 'postal code', + 'price' => 'price', + 'province' => 'province', + 'recaptcha_response_field' => 'recaptcha response field', + 'remember' => 'remember', + 'restored_at' => 'restored at', + 'result_text_under_image' => 'result text under image', + 'role' => 'role', + 'second' => 'second', + 'sex' => 'sex', + 'short_text' => 'short text', + 'size' => 'size', + 'state' => 'state', + 'street' => 'street', + 'student' => 'student', + 'subject' => 'subject', + 'teacher' => 'teacher', + 'terms' => 'terms', + 'test_description' => 'test description', + 'test_locale' => 'test locale', + 'test_name' => 'test name', + 'text' => 'text', + 'time' => 'time', + 'title' => 'title', + 'updated_at' => 'updated at', + 'username' => 'username', + 'year' => 'year', + ], + 'custom' => [ + 'of_the' => [ + 'male' => 'of the ', + 'female' => 'of the ', + 'vowel' => 'of the ' ], + 'event' => 'event', + 'model' => 'target element', + 'order' => 'order', + 'publication' => 'publication', + 'activated' => 'activated', + 'target' => 'target', + 'static_page_type' => 'static page type', + 'seo_title' => 'SEO title', + 'seo_description' => 'SEO description', ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap our attribute placeholder - | with something more reader friendly such as "E-Mail Address" instead - | of "email". This simply helps us make our message more expressive. - | - */ - - 'attributes' => [], - ]; diff --git a/resources/lang/en/vue.php b/resources/lang/en/vue.php new file mode 100644 index 0000000..b513341 --- /dev/null +++ b/resources/lang/en/vue.php @@ -0,0 +1,38 @@ +<?php + +return [ + 'ImageInputComponent' => [ + 'choose_a_file' => 'Choose a file', + 'change_source_picture' => 'Edit Source Image', + 'view_source_picture' => 'View image', + 'resize_source_picture' => 'Resize image', + 'resized_source_picture' => 'Image resized', + 'preview_picture' => 'Image preview', + 'change_picture_before_import' => 'Image modification before import', + 'close_window' => 'Close the window', + 'close_and_validate' => 'Validate the content and close the window', + 'close_window_without_validation' => 'Close the window without validating the content', + 'zoom_in' => 'Zoom in', + 'zoom_out' => 'Zoom out', + 'move_left' => 'Move left', + 'move_right' => 'Move right', + 'move_up' => 'Move up', + 'move_down' => 'Move down', + 'mirror_horizontal' => 'Horizontal mirror', + 'mirror_vertical' => 'Vertical mirror', + 'rotation' => 'Rotation', + 'rotate_rewind' => 'Counter-clockwise rotation', + 'rotate' => 'Clockwise rotation', + 'degres' => ':deg degrees', + 'validate' => 'Validate', + 'preview' => 'Preview', + ], + 'WordCounterComponent' => [ + 'words' => 'Words', + 'characters' => 'Characters' + ], + 'PasswordVisibility' => [ + 'hide' => 'Hide the password', + 'show' => 'Show the password', + ] +]; diff --git a/resources/lang/fr.json b/resources/lang/fr.json index d5601f8..37cb6d6 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -1,185 +1,54 @@ { - "A fresh verification link has been sent to your email address.": "Un nouveau lien de vérification a été envoyé à votre adresse email.", - "A new verification link has been sent to the email address you provided during registration.": "Un nouveau lien de vérification a été envoyé à l'adresse email que vous avez indiquée lors de votre inscription.", - "Add a new team member to your team, allowing them to collaborate with you." : "Ajoutez un nouveau membre de l'équipe à votre équipe, permettant de collaborer avec vous.", - "Add additional security to your account using two factor authentication." : "Ajoutez une sécurité supplémentaire à votre compte en utilisant l'authentification à deux facteurs.", - "Add Team Member" : "Ajoutez un membre d'équipe", - "Add" : "Ajoutez", - "Added." : "Ajouté", - "Administrator" : "Administrateur", - "Administrator users can perform any action." : "Les administrateurs peuvent faire n'importe quelle action.", - "All of the people that are part of this team." : "Toutes les personnes qui font partie de cette équipe.", + "(and :count more error)": "(et :count erreur en plus)", + "(and :count more errors)": "(et :count erreurs en plus)", + "A fresh verification link has been sent to your email address.": "Un nouveau lien de vérification a été envoyé à votre adresse e-mail.", "All rights reserved.": "Tous droits réservés.", - "Already registered?": "Déjà inscrit(e) ?", - "API Token Permissions" : "Autorisations de jeton API", - "API Token" : "Jeton API", - "API tokens allow third-party services to authenticate with our application on your behalf." : "Les jetons API permettent à des services tiers de s'authentifier auprès de notre application en votre nom.", - "API Tokens" : "Jeton API", - "Are you sure you want to delete this team? Once a team is deleted, all of its resources and data will be permanently deleted." : "Êtes-vous sûr de vouloir supprimer cette équipe ? Lorsqu'une équipe est supprimée, toutes les ressources et données associées seront supprimées de manière définitive.", - "Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account." : "Êtes-vous sûr de vouloir supprimer votre compte ? Une fois que votre compte est supprimé, toutes les données associées seront supprimées définitivement. Pour confirmer que vous voulez supprimer définitivement votre compte, renseignez votre mot de passe.", - "Are you sure you would like to delete this API token?" : "Êtes-vous sûr de vouloir supprimer ce jeton API ?", - "Are you sure you would like to leave this team?" : "Êtes-vous sûr de vouloir quitter cette équipe ?", - "Are you sure you would like to remove this person from the team?" : "Êtes-vous sûr de vouloir supprimer cette personne de cette équipe ?", - "Before proceeding, please check your email for a verification link.": "Avant de continuer, veuillez vérifier vos emails, vous devriez avoir reçu un lien de vérification.", - "Browser Sessions" : "Sessions de navigateur", - "click here to request another": "cliquez ici pour faire une nouvelle demande", - "Close" : "Fermer", - "Code" : "Code", - "Confirm Password": "Confirmez votre mot de passe", - "Confirm" : "Confirmer", - "Create a new team to collaborate with others on projects." : "Créer une nouvelle équipe pour collaborer avec d'autres personnes sur des projets.", - "Create API Token" : "Créer un jeton API", - "Create New Team" : "Créer une nouvelle équipe", - "Create Team" : "Créer l'équipe", - "Create" : "Créer", - "Created." : "Créé.", - "Current Password" : "Mot de passe actuel", + "Before proceeding, please check your email for a verification link.": "Avant de continuer, merci de vérifier votre e-mail contenant un lien de vérification.", + "click here to request another": "cliquez ici pour en demander un autre", + "Confirm Password": "Confirmer le mot de passe", "Dashboard": "Tableau de bord", - "Delete Account" : "Supprimer le compte", - "Delete API Token" : "Supprimer le jeton API", - "Delete Team" : "Supprimer l'équipe", - "Delete" : "Supprimer", - "Disable" : "Désactiver", - "Done." : "Terminé.", - "E-Mail Address": "Adresse email", - "Editor" : "Editeur", - "Editor users have the ability to read, create, and update." : "Les éditeurs peuvent lire, créer et mettre à jour", - "Email Password Reset Link": "Lien de réinitialisation du mot de passe", - "Email": "Email", - "Enable" : "Activé", - "Ensure your account is using a long, random password to stay secure." : "Assurez-vous d'utiliser un mot de passe long et aléatoire pour sécuriser votre compte", - "Error": "Erreur", - "For your security, please confirm your password to continue." : "Par mesure de sécurité, veuillez confirmer votre mot de passe pour continuer.", + "Email Address": "Adresse e-mail", "Forbidden": "Interdit", - "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "Mot de passe oublié ? Pas de soucis. Veuillez nous indiquer votre adresse email et nous vous enverrons un lien de réinitialisation du mot de passe.", - "Forgot your password?": "Vous avez oublié votre mot de passe ?", - "Forgot Your Password?": "Vous avez oublié votre mot de passe ?", - "Go Home": "Aller à l'accueil", - "Go to page :page" : "Aller à la page :page", + "Forgot Your Password?": "Mot de passe oublié ?", + "Go to page :page": "Aller à la page :page", "Hello!": "Bonjour !", - "hi": "salut", - "If necessary, you may logout of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password." : "Si nécessaire, vous pouvez vous déconnecter de toutes vos sessions de navigateur de tous vos appareils. Certaines de vos sessions sont listées plus bas ; pourtant, cette liste peut ne pas être exhaustive. Si vous sentez que votre compte a été compromis, vous pouvez aussi mettre à jour votre mot de passe.", "If you did not create an account, no further action is required.": "Si vous n'avez pas créé de compte, vous pouvez ignorer ce message.", - "If you did not receive the email": "Si vous n'avez pas reçu l'email", + "If you did not receive the email": "Si vous n'avez pas reçu cet e-mail", "If you did not request a password reset, no further action is required.": "Si vous n'avez pas demandé de réinitialisation de mot de passe, vous pouvez ignorer ce message.", - "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si le bouton \":actionText\" ne fonctionne pas, copiez/collez l'adresse ci-dessous dans votre navigateur :\n", - "Invalid signature.": "Signature invalide", - "Last active" : "Dernier actif", - "Last used" : "Dernière utilisation", - "Leave Team" : "Quitter l'équipe", - "Leave" : "Quitter", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si vous avez des difficultés à cliquer sur le bouton \":actionText\", copiez et collez l'URL ci-dessous\ndans votre navigateur Web :", + "Invalid JSON was returned from the route.": "Un JSON non valide a été renvoyé par la route.", "Login": "Connexion", - "Logout Other Browser Sessions" : "Déconnecter les sessions ouvertes sur d'autres navigateurs.", "Logout": "Déconnexion", - "Manage Account" : "Gérer le compte", - "Manage and logout your active sessions on other browsers and devices." : "Gérer et déconnecter vos sessions actives sur les autres navigateurs et appareils.", - "Manage API Tokens" : "Gérer les jetons API", - "Manage Role" : "Gérer le rôle", - "Manage Team" : "Gérer l'équipe", "Name": "Nom", - "Nevermind" : "Peu importe", - "New Password" : "Nouveau mot de passe", "Not Found": "Non trouvé", - "of" : "de", - "Oh no": "Oh non", - "Once a team is deleted, all of its resources and data will be permanently deleted. Before deleting this team, please download any data or information regarding this team that you wish to retain." : "Une fois qu'une équipe est supprimée, toutes ses données seront supprimées définitivement. Avant de supprimer cette équipe, veuillez télécharger toutes données ou informations de cette équipe.", - "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain." : "Une fois que votre compte est supprimé, toutes vos données sont supprimées définitivement. Avant de supprimer votre compte, veuillez télécharger vos données.", + "of": "de", "Page Expired": "Page expirée", - "Page Not Found": "Page introuvable", "Pagination Navigation": "Pagination", "Password": "Mot de passe", - "Permanently delete this team." : "Supprimer définitivement cette team.", - "Permanently delete your account." : "Supprimer définitivement ce compte.", - "Permissions" : "Permissions", - "Photo" : "Image", - "Please click the button below to verify your email address.": "Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse email :", - "Please confirm access to your account by entering one of your emergency recovery codes.": "Veuillez confirmer l'accès à votre compte en entrant l'un des codes de récupération d'urgence.", - "Please confirm access to your account by entering the authentication code provided by your authenticator application.": "Veuillez confirmer l'accès à votre compte en entrant le code d'authentification fourni par votre application d'authentification.", - "Please confirm your password before continuing.": "Veuillez confirmer votre mot de passe avant de continuer", - "Please copy your new API token. For your security, it won't be shown again." : "Veuillez copier votre nouveau token API. Pour votre sécurité, il ne sera pas ré-affiché.", - "Please enter your password to confirm you would like to logout of your other browser sessions across all of your devices." : "Veuillez entrer votre mot de passe pour confirmer que vous voulez déconnecter toutes les autres sessions navigateur sur l'ensemble de vos appareils.", - "Please provide the email address of the person you would like to add to this team. The email address must be associated with an existing account." : "Veuillez renseigner l'adresse email de la personne que vous voulez ajouter à cette équipe. L'adresse email doit être associée à un compte existant.", - "Profile Information" : "Information du profil", - "Profile" : "Profil", - "Recovery Code" : "Code de récupération", + "Payment Required": "Paiement requis", + "Please click the button below to verify your email address.": "Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse e-mail :", + "Please confirm your password before continuing.": "Veuillez confirmer votre mot de passe avant de continuer.", "Regards": "Cordialement", - "Regenerate Recovery Codes" : "Régénérer les codes de récupération", "Register": "Inscription", - "Remember me" : "Se souvenir de moi", "Remember Me": "Se souvenir de moi", - "Remove Photo" : "Supprimer l'image", - "Remove Team Member" : "Supprimer le membre d'équipe", - "Remove" : "Supprimer", - "Resend Verification Email": "Renvoyer l'email de vérification", - "Reset Password Notification": "Notification de réinitialisation du mot de passe", "Reset Password": "Réinitialisation du mot de passe", - "results" : "résultats", - "Role" : "Rôle", - "Save" : "Sauvegarder", - "Saved." : "Sauvegardé", - "Select A New Photo" : "Sélectionner une nouvelle image", + "Reset Password Notification": "Notification de réinitialisation du mot de passe", + "results": "résultats", "Send Password Reset Link": "Envoyer le lien de réinitialisation du mot de passe", "Server Error": "Erreur serveur", "Service Unavailable": "Service indisponible", - "Show Recovery Codes" : "Voir les codes de récupération", - "Showing" : "Montrant", - "Sorry, the page you are looking for could not be found.": "Désolé, la page que vous recherchez est introuvable.", - "Sorry, we are doing some maintenance. Please check back soon.": "Désolé, nous sommes en maintenance. Veuillez revenir plus tard.", - "Sorry, you are forbidden from accessing this page.": "Désolé, vous ne pouvez accéder à cette page.", - "Sorry, you are making too many requests to our servers.": "Désolé, vous faites trop de requêtes vers nos serveurs.", - "Sorry, you are not authorized to access this page.": "Désolé, vous n'êtes pas autorisé à accéder à cette page.", - "Sorry, your session has expired. Please refresh and try again.": "Désolé, votre session a expiré. Veuillez actualiser la page et réessayer.", - "Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.": "Enregistrez ces codes dans un gestionnaire de mot de passe sécurisé. Ils peuvent être réutilisés pour accéder à votre compte si l'authentification à deux facteurs n'abouti pas.", - "Switch Teams" : "Permuter les équipes", - "Team Details" : "Détails de l'équipe", - "Team Members" : "Membres de l'équipe", - "Team Name" : "Nom de l'équipe", - "Team Owner" : "Propriétaire de l'équipe", - "Team Settings" : "Préférences de l'équipe", - "Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn't receive the email, we will gladly send you another.":"Merci de vous être inscrit(e) ! Avant de commencer, veuillez vérifier votre adresse email en cliquant sur le lien que nous venons de vous envoyer. Si vous n'avez pas reçu cet email, nous vous en enverrons un nouveau avec plaisir.", - "The :attribute must be a valid role.": "Le :attribute doit être un rôle valide.", - "The :attribute must be at least :length characters and contain at least one number." : "Le champ :attribute doit avoir au moins :length caractères et contenir au moins un chiffre.", - "The :attribute must be at least :length characters and contain at least one special character." : "Le champ :attribute doit avoir au moins :length caractères et contenir au moins un caractère spécial.", - "The :attribute must be at least :length characters and contain at least one uppercase character and one number." : "Le champ :attribute doit avoir au moins :length caractères et contenir au moins une majuscule et un chiffre.", - "The :attribute must be at least :length characters and contain at least one uppercase character and one special character." : "Le champ :attribute doit avoir au moins :length caractères et contenir au moins une majuscule et un caractère spécial.", - "The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character." : "Le champ :attribute doit avoir au moins :length caractères, et contenir au moins une majuscule, un chiffre et un caractère spécial.", - "The :attribute must be at least :length characters and contain at least one uppercase character." : "Le champ :attribute doit avoir au moins :length caractères et au moins une majuscule.", - "The :attribute must be at least :length characters." : "Le champ :attribute doit avoir au moins :length caractères.", - "The provided password does not match your current password." : "Le mot de passe indiqué ne correspond pas à votre mot de passe actuel.", - "The provided password was incorrect." : "Le mot de passé indiqué est incorrect.", - "The provided two factor authentication code was invalid." : "Le code d'authentification double facteur fourni est incorrect.", - "The team's name and owner information." : "Les informations concernant l'équipe et son propriétaire.", - "This action is unauthorized.": "Cette action n'est pas autorisée.", - "This device" : "Cet appareil", - "This password does not match our records.": "Ce mot de passe ne correspond pas à nos enregistrements.", + "Showing": "Montrant", + "The given data was invalid.": "La donnée renseignée est incorrecte.", + "The response is not a streamed response.": "La réponse n'est pas une réponse diffusée.", + "The response is not a view.": "La réponse n'est pas une vue.", "This password reset link will expire in :count minutes.": "Ce lien de réinitialisation du mot de passe expirera dans :count minutes.", - "This user already belongs to the team.": "Cet utilisateur appartient déjà à l'équipe.", - "to" : "à", - "Toggle navigation": "Basculer la navigation", - "Token Name" : "Nom du jeton", - "Too Many Attempts.": "Trop de tentatives.", + "to": "à", + "Toggle navigation": "Afficher / masquer le menu de navigation", "Too Many Requests": "Trop de requêtes", - "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application.": "L'authentification à deux facteurs est maintenant activée. Enregistrez ce QR code dans votre application d'authentification.", - "Two Factor Authentication" : "Double authentification", "Unauthorized": "Non autorisé", - "Update Password" : "Mettre à jour le mot de passe", - "Update your account's profile information and email address." : "Modifier le profil associé à votre compte ainsi que votre adresse email.", - "Use a recovery code": "Utilisez un code de récupération", - "Use an authentication code": "Utilisez un code d'authentification", - "Verify Email Address": "Vérification de l'adresse email", - "Verify Your Email Address": "Vérifiez votre adresse email", - "We were unable to find a registered user with this email address.": "Nous n'avons pas pu trouver un utilisateur enregistré avec cette adresse e-mail.", - "We won't ask for your password again for a few hours.": "Nous ne vous demanderons plus votre mot de passe pour quelques heures", - "When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone's Google Authenticator application." : "Lorsque l'authentification à deux facteurs est activée, vous serez invité à saisir un jeton aléatoire sécurisé lors de l'authentification. Vous pouvez récupérer ce jeton depuis l'application Google Authenticator de votre téléphone.", - "Whoops! Something went wrong." : "Oups ! Un problème est survenu.", + "Verify Email Address": "Vérifier l'adresse e-mail", + "Verify Your Email Address": "Vérifiez votre adresse e-mail", "Whoops!": "Oups !", - "Whoops, something went wrong on our servers.": "Oups, une erreur s'est produite sur nos serveurs.", - "You are logged in!": "Vous êtes connecté !", - "You are receiving this email because we received a password reset request for your account.": "Vous recevez cet email car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.", - "You have enabled two factor authentication." : "Vous avez activé la double authentification.", - "You have not enabled two factor authentication." : "Vous n'avez pas activé la double authentification.", - "You may delete any of your existing tokens if they are no longer needed." : "Vous pouvez supprimer n'importe lequel de vos jetons existants s'ils ne sont plus nécessaires.", - "You may not delete your personal team.": "Vous ne pouvez pas supprimer votre équipe personnelle.", - "You may not leave a team that you created.": "Vous ne pouvez pas quitter une équipe que vous avez créée.", - "Your email address is not verified.": "Votre adresse email n'a pas été vérifiée." -} + "You are logged in!": "Vous êtes connecté·e !", + "You are receiving this email because we received a password reset request for your account.": "Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte." +} \ No newline at end of file diff --git a/resources/lang/fr/auth.php b/resources/lang/fr/auth.php index 188cf44..a22cd3f 100644 --- a/resources/lang/fr/auth.php +++ b/resources/lang/fr/auth.php @@ -1,18 +1,9 @@ <?php -return [ - /** - *-------------------------------------------------------------------------- - * Authentication Language Lines - *-------------------------------------------------------------------------- - * - * The following language lines are used during authentication for various - * messages that we need to display to the user. You are free to modify - * these language lines according to your application's requirements. - * - */ +declare(strict_types=1); - 'failed' => 'Ces identifiants ne correspondent pas à nos enregistrements', - 'password' => 'Le mot de passe fourni est incorrect.', +return [ + 'failed' => 'Ces identifiants ne correspondent pas à nos enregistrements.', + 'password' => 'Le mot de passe est incorrect', 'throttle' => 'Tentatives de connexion trop nombreuses. Veuillez essayer de nouveau dans :seconds secondes.', ]; diff --git a/resources/lang/fr/crud.php b/resources/lang/fr/crud.php index f5216b3..75b4dac 100644 --- a/resources/lang/fr/crud.php +++ b/resources/lang/fr/crud.php @@ -2,93 +2,92 @@ return [ 'actions' => [ - 'list' => 'Liste', - 'view' => 'Voir', - 'create' => 'Créer', - 'duplicate' => 'Dupliquer', - 'update' => 'Éditer', - 'delete' => 'Supprimer', - 'save' => 'Sauvegarder', - 'edit' => 'Mise à jour', - 'show' => 'Aperçu', - 'download' => 'Télécharger', - 'historic' => 'Historique', - 'credit' => 'Créditer', - 'stats' => 'Statistiques', + 'list' => 'liste', + 'view' => 'voir', + 'create' => 'créer', + 'duplicate' => 'dupliquer', + 'update' => 'éditer', + 'delete' => 'supprimer', + 'save' => 'sauvegarder', + 'edit' => 'mettre à jour', ], 'helpers' => [ - 'list' => 'Liste', - 'list_all' => 'Lister tous les :model', - 'create_model' => 'Créer :model', - 'view_model' => 'Voir :model', - 'update_model' => 'Éditer :model', + 'list' => 'Liste', + 'list_all' => 'Lister tous les :model', + 'create_model' => 'Créer :model', + 'view_model' => 'Voir :model', + 'update_model' => 'Éditer :model', 'duplicate_model' => 'Dupliquer :model', - 'delete_model' => 'Supprimer :model', - 'save_model' => 'Sauvegarder :model', - 'edit_model' => 'Mettre à jour :model', - 'credit_model' => 'Créditer :model', - 'no_results' => 'Aucun résultat pour :models', - 'publish' => 'Publié', - 'unpublish' => 'Dépublié', + 'delete_model' => 'Supprimer :model', + 'save_model' => 'Sauvegarder :model', + 'edit_model' => 'Mettre à jour :model', + 'no_results' => 'Aucun résultat pour :model', + 'publish' => 'Publié', + 'unpublish' => 'Dépublié', + 'seo_title' => 'Doit décrire précisément la page, recommandation pour un positionnement + optimal dans les moteurs de recherche (balise <title>).', + 'seo_description' => 'Doit décrire précisément le contenu de la page (balise <meta> description).', ], 'libs' => [ 'toolbox' => [ - 'assertFieldIsUnique' => 'La :valeur du champ :attribut est déjà utilisée', + 'assertFieldIsUnique' => 'La :valeur du champ :attribut est déjà utilisée', 'assertNoInternalBoUrls' => ':attribute : Il est interdit de coller l\'uri de back-office dans ce champ', - 'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ.', + 'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ.', ] ], 'messages' => [ - 'has_been_created' => ':model a été créé', - 'cannot_be_created' => ':model ne peut être créé', - 'has_been_updated' => ':model a été mis à jour', - 'cannot_be_updated' => ':model ne peut être mis à jour', - 'has_been_deleted' => ':model a été supprimé', - 'cannot_be_deleted' => ':model ne peut être supprimé', - 'cannot_be_deleted_relationship' => ':model ne peut être supprimé. - Veuillez d\'abord supprimer les :relationship associé(e)s', - 'order_changed' => 'L\'ordre a été changé !', - 'order_not_changed' => 'L\'ordre n\'a pas été changé !', + 'has_been_created' => ':model a été créé', + 'cannot_be_created' => ':model ne peut être créé', + 'has_been_updated' => ':model a été mis à jour', + 'cannot_be_updated' => ':model ne peut être mis à jour', + 'has_been_deleted' => ':model a été supprimé', + 'cannot_be_deleted' => ':model ne peut être supprimé', + 'order_changed' => 'L\'ordre a été changé !', + 'order_not_changed' => 'L\'ordre n\'a pas été changé !', 'publish_status_saved' => 'Changement de l\'état de publication réussit !', - 'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !' + 'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !', + 'theme_updated' => 'Le thème a été mis à jour !', ], 'minicrud' => [ - 'visibility_label' => 'Visibilité', - 'visibility_helper' => 'Vérifier qu\'il est visible.', - 'enum_select' => 'Sélectionnez un(e) :enum dans la liste.', - 'select' => 'Sélectionnez un(e) :entity dans la liste.', - 'associated_enum' => ':enum associé(e)', - 'associated' => ':entity associé(e)', - 'dimensions_must_be' => 'Doit être :widthpx (largeur) par :heightpx (hauteur).', + 'visibility_label' => 'Visibilité', + 'visibility_helper' => 'Vérifier qu\'il est visible.', + 'enum_select' => 'Sélectionnez un(e) :enum dans la liste.', + 'select' => 'Sélectionnez un(e) :entity dans la liste.', + 'associated_enum' => ':enum associé(e)', + 'associated' => ':entity associé(e)', + 'dimensions_must_be' => 'Doit être :widthpx (largeur) par :heightpx (hauteur).', 'picture_title_helper' => 'Utile pour les utilisateurs, s\'affiche en passant la souris sur l\'image', - 'picture_title_label' => 'Attribut du titre de l\'image', - 'picture_alt_helper' => 'Doit décrire votre image pour les moteurs de recherche et les aveugles (5 à 6 mots)', - 'picture_alt_label' => 'Attribut Alt de l\'image', - 'text_warning' => 'Relisez votre contenu avant de le publier (minimum :number caractères)', - 'url' => 'Doit être une url valide.', + 'picture_title_label' => 'Attribut du titre de l\'image', + 'picture_alt_helper' => 'Doit décrire votre image pour les moteurs de recherche et les aveugles (5 à 6 mots)', + 'picture_alt_label' => 'Attribut Alt de l\'image', + 'text_warning' => 'Relisez votre contenu avant de le publier (minimum :number caractères)', + 'url' => 'Doit être une url valide.', ], 'pagination' => [ - "previous" => "Page précédente", - "next" => "Page suivante", + "previous" => "Page précédente", + "next" => "Page suivante", "specific_page" => "Accéder à la page n°:id", 'paginate_list' => 'Nombre d\'éléments par page', ], 'other' => [ - 'up' => 'Modifier l\'ordre d\'apparition vers le haut', - 'down' => 'Modifier l\'ordre d\'apparition vers le bas', - 'no_model_found' => 'Aucun :model trouvé', - 'publish' => 'Publié', - 'unpublish' => 'Dépublié', - 'sort_ascending' => 'Trier :name dans l\'ordre croissant', - 'sort_descending' => 'Trier :name dans l\'ordre décroissant', - 'sort_delete' => 'Supprimer le tri', - 'sort_arrow' => 'Ici, les flèches sont utilisées pour trier et non pour filtrer', - 'right' => 'Vous n\'avez pas les droits', + 'up' => 'Modifier l\'ordre d\'apparition vers le haut', + 'down' => 'Modifier l\'ordre d\'apparition vers le bas', + 'no_model_found' => 'Aucun :model trouvé', + 'publish' => 'Publié', + 'unpublish' => 'Dépublié', + 'search_start' => 'Lancer la recherche', + 'search_delete' => 'Supprimer la recherche', + 'search_placeholder' => 'Vos mots clés ici...', + 'sort_ascending' => 'Trier :name dans l\'ordre croissant', + 'sort_descending' => 'Trier :name dans l\'ordre décroissant', + 'sort_delete' => 'Supprimer le tri', + 'sort_arrow' => 'Ici, les flèches sont utilisées pour trier et non pour filtrer', + 'right' => 'Vous n\'avez pas les droits', ] ]; diff --git a/resources/lang/fr/http-statuses.php b/resources/lang/fr/http-statuses.php new file mode 100644 index 0000000..af44920 --- /dev/null +++ b/resources/lang/fr/http-statuses.php @@ -0,0 +1,84 @@ +<?php + +declare(strict_types=1); + +return [ + '0' => 'Erreur inconnue', + '100' => 'Continuer', + '101' => 'Protocoles de commutation', + '102' => 'En traitement', + '200' => 'D\'accord', + '201' => 'Créé', + '202' => 'Accepté', + '203' => 'Informations non autorisées', + '204' => 'Pas content', + '205' => 'Réinitialiser le contenu', + '206' => 'Contenu partiel', + '207' => 'Multi-statut', + '208' => 'Déjà rapporté', + '226' => 'J\'ai l\'habitude', + '300' => 'Choix multiples', + '301' => 'Déplacé de façon permanente', + '302' => 'A trouvé', + '303' => 'Voir autre', + '304' => 'Non modifié', + '305' => 'Utiliser un proxy', + '307' => 'Redirection temporaire', + '308' => 'Redirection permanente', + '400' => 'Mauvaise Demande', + '401' => 'Non autorisé', + '402' => 'Paiement Requis', + '403' => 'Interdit', + '404' => 'Page non trouvée', + '405' => 'Méthode Non Autorisée', + '406' => 'Pas acceptable', + '407' => 'Authentification proxy requise', + '408' => 'Délai d\'expiration de la demande', + '409' => 'Conflit', + '410' => 'Disparu', + '411' => 'Longueur requise', + '412' => 'La précondition a échoué', + '413' => 'Charge utile trop grande', + '414' => 'URI trop long', + '415' => 'Type de support non supporté', + '416' => 'Plage non satisfaisante', + '417' => 'Échec de l\'attente', + '418' => 'Je suis une théière', + '419' => 'La session a expiré', + '421' => 'Demande mal dirigée', + '422' => 'Entité non traitable', + '423' => 'Fermé à clef', + '424' => 'Dépendance échouée', + '425' => 'Trop tôt', + '426' => 'Mise à niveau requise', + '428' => 'Condition préalable requise', + '429' => 'Trop de demandes', + '431' => 'Demander des champs d\'en-tête trop grands', + '444' => 'Connexion fermée sans réponse', + '449' => 'Réessayer avec', + '451' => 'Indisponible pour des raisons légales', + '499' => 'Demande fermée du client', + '500' => 'Erreur Interne du Serveur', + '501' => 'Pas mis en œuvre', + '502' => 'Mauvaise passerelle', + '503' => 'Mode de Maintenance', + '504' => 'Délai d\'attente de la passerelle', + '505' => 'Version HTTP non prise en charge', + '506' => 'La variante négocie également', + '507' => 'Espace insuffisant', + '508' => 'Boucle détectée', + '509' => 'Limite de bande passante dépassée', + '510' => 'Non prolongé', + '511' => 'Authentification réseau requise', + '520' => 'Erreur inconnue', + '521' => 'Le serveur Web est en panne', + '522' => 'La connexion a expiré', + '523' => 'L\'origine est inaccessible', + '524' => 'Un dépassement de délai s\'est produit', + '525' => 'Échec de la prise de contact SSL', + '526' => 'Certificat SSL invalide', + '527' => 'Erreur de canon ferroviaire', + '598' => 'Erreur de délai de lecture réseau', + '599' => 'Erreur de délai de connexion réseau', + 'unknownError' => 'Erreur inconnue', +]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 3d01b35..dfa964b 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -2,8 +2,10 @@ return [ 'classes' => [ + 'user' => 'utilisateur', + 'activity_log' => 'journal d\'activité|journaux d\'activité', + 'static_page' => 'page statique|pages statiques', 'bannedips' => 'IP bannies', - 'contents' => 'Contenus', 'faq-questions' => 'Question pour la FAQ|Questions pour la FAQ', 'faq-themes' => 'Thème pour la FAQ|Thèmes pour la FAQ', 'gain-views' => 'Page de gain|Pages de gain', @@ -12,6 +14,5 @@ return [ 'products' => 'Produits', 'winners' => 'Gagnants', 'settings' => 'Réglages', - 'codes' => 'Codes uniques' ] ]; diff --git a/resources/lang/fr/pagination.php b/resources/lang/fr/pagination.php index 8c1080e..ccd0f82 100644 --- a/resources/lang/fr/pagination.php +++ b/resources/lang/fr/pagination.php @@ -1,17 +1,12 @@ <?php -return [ - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ +declare(strict_types=1); - 'previous' => '« Précédent', - 'next' => 'Suivant »', +return [ + 'next' => 'Suivant »', + 'previous' => '« Précédent', + 'previous_page' => 'Page précédente', + 'next_page' => 'Page suivante', + 'specific_page' => 'Aller à la page n°:id', + 'paginate_list' => 'Nombre d\'élements par page', ]; diff --git a/resources/lang/fr/passwords.php b/resources/lang/fr/passwords.php index 2f898d3..75ae148 100644 --- a/resources/lang/fr/passwords.php +++ b/resources/lang/fr/passwords.php @@ -1,20 +1,11 @@ <?php -return [ - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ +declare(strict_types=1); +return [ 'reset' => 'Votre mot de passe a été réinitialisé !', 'sent' => 'Nous vous avons envoyé par email le lien de réinitialisation du mot de passe !', 'throttled' => 'Veuillez patienter avant de réessayer.', - 'token' => "Ce jeton de réinitialisation du mot de passe n'est pas valide.", - 'user' => "Aucun utilisateur n'a été trouvé avec cette adresse email.", + 'token' => 'Ce jeton de réinitialisation du mot de passe n\'est pas valide.', + 'user' => 'Aucun utilisateur n\'a été trouvé avec cette adresse email.', ]; diff --git a/resources/lang/fr/recaptcha.php b/resources/lang/fr/recaptcha.php new file mode 100644 index 0000000..690105e --- /dev/null +++ b/resources/lang/fr/recaptcha.php @@ -0,0 +1,6 @@ +<?php + +return [ + 'error' => 'Une erreur s\'est produite lors de la validation du formulaire, veuillez réessayer', + 'not_enough_score' => 'Vous n\'avez pas obtenu un score assez élevé lors de la validation du reCAPTCHA' +]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index 7a9f93a..cb2ebd6 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -1,19 +1,10 @@ <?php +declare(strict_types=1); + return [ - - /** - *-------------------------------------------------------------------------- - * Validation Language Lines - *-------------------------------------------------------------------------- - * - * The following language lines contain the default error messages used by - * the validator class. Some of these rules have multiple versions such - * as the size rules. Feel free to tweak each of these messages. - * - */ - 'accepted' => 'Le champ :attribute doit être accepté.', + 'accepted_if' => 'Le champ :attribute doit être accepté quand :other a la valeur :value.', 'active_url' => 'Le champ :attribute n\'est pas une URL valide.', 'after' => 'Le champ :attribute doit être une date postérieure au :date.', 'after_or_equal' => 'Le champ :attribute doit être une date postérieure ou égale au :date.', @@ -21,7 +12,7 @@ return [ 'alpha_dash' => 'Le champ :attribute doit contenir uniquement des lettres, des chiffres et des tirets.', 'alpha_num' => 'Le champ :attribute doit contenir uniquement des chiffres et des lettres.', 'array' => 'Le champ :attribute doit être un tableau.', - 'attached' => ':attribute est déjà attaché(e).', + 'ascii' => 'Le champ :attribute ne doit contenir que des caractères alphanumériques et des symboles codés sur un octet.', 'before' => 'Le champ :attribute doit être une date antérieure au :date.', 'before_or_equal' => 'Le champ :attribute doit être une date antérieure ou égale au :date.', 'between' => [ @@ -31,18 +22,25 @@ return [ 'string' => 'Le texte :attribute doit contenir entre :min et :max caractères.', ], 'boolean' => 'Le champ :attribute doit être vrai ou faux.', - 'color' => 'Le champ :attribute doit être au format hexadécimal (ex: #FFFFFF)', + 'can' => 'Le champ :attribute contient une valeur non autorisée.', 'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.', + 'current_password' => 'Le mot de passe est incorrect.', 'date' => 'Le champ :attribute n\'est pas une date valide.', 'date_equals' => 'Le champ :attribute doit être une date égale à :date.', 'date_format' => 'Le champ :attribute ne correspond pas au format :format.', + 'decimal' => 'Le champ :attribute doit comporter :decimal décimales.', + 'declined' => 'Le champ :attribute doit être décliné.', + 'declined_if' => 'Le champ :attribute doit être décliné quand :other a la valeur :value.', 'different' => 'Les champs :attribute et :other doivent être différents.', 'digits' => 'Le champ :attribute doit contenir :digits chiffres.', 'digits_between' => 'Le champ :attribute doit contenir entre :min et :max chiffres.', 'dimensions' => 'La taille de l\'image :attribute n\'est pas conforme.', 'distinct' => 'Le champ :attribute a une valeur en double.', - 'email' => 'Le champ :attribute doit être une adresse email valide.', + 'doesnt_end_with' => 'Le champ :attribute ne doit pas finir avec une des valeurs suivantes : :values.', + 'doesnt_start_with' => 'Le champ :attribute ne doit pas commencer avec une des valeurs suivantes : :values.', + 'email' => 'Le champ :attribute doit être une adresse e-mail valide.', 'ends_with' => 'Le champ :attribute doit se terminer par une des valeurs suivantes : :values', + 'enum' => 'Le champ :attribute sélectionné est invalide.', 'exists' => 'Le champ :attribute sélectionné est invalide.', 'file' => 'Le champ :attribute doit être un fichier.', 'filled' => 'Le champ :attribute doit avoir une valeur.', @@ -66,6 +64,7 @@ return [ 'ipv4' => 'Le champ :attribute doit être une adresse IPv4 valide.', 'ipv6' => 'Le champ :attribute doit être une adresse IPv6 valide.', 'json' => 'Le champ :attribute doit être un document JSON valide.', + 'lowercase' => 'Le champ :attribute doit être en minuscules.', 'lt' => [ 'array' => 'Le tableau :attribute doit contenir moins de :value éléments.', 'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.', @@ -78,33 +77,49 @@ return [ 'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.', 'string' => 'Le texte :attribute doit contenir au plus :value caractères.', ], + 'mac_address' => 'Le champ :attribute doit être une adresse MAC valide.', 'max' => [ - 'array' => 'Le tableau :attribute ne peut contenir plus de :max éléments.', + 'array' => 'Le tableau :attribute ne peut pas contenir plus que :max éléments.', 'file' => 'La taille du fichier de :attribute ne peut pas dépasser :max kilo-octets.', - 'numeric' => 'La valeur de :attribute ne peut être supérieure à :max.', - 'string' => 'Le texte de :attribute ne peut contenir plus de :max caractères.', + 'numeric' => 'La valeur de :attribute ne peut pas être supérieure à :max.', + 'string' => 'Le texte de :attribute ne peut pas contenir plus de :max caractères.', ], + 'max_digits' => 'Le champ :attribute ne doit pas avoir plus de :max chiffres.', 'mimes' => 'Le champ :attribute doit être un fichier de type : :values.', 'mimetypes' => 'Le champ :attribute doit être un fichier de type : :values.', 'min' => [ 'array' => 'Le tableau :attribute doit contenir au moins :min éléments.', - 'file' => 'La taille du fichier de :attribute doit être supérieure à :min kilo-octets.', + 'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :min kilo-octets.', 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.', - 'string' => 'Le texte :attribute doit contenir au moins :min caractères.', + 'string' => 'Le texte de :attribute doit contenir au moins :min caractères.', ], + 'min_digits' => 'Le champ :attribute doit avoir au moins :min chiffres.', + 'missing' => 'Le champ :attribute doit être manquant.', + 'missing_if' => 'Le champ :attribute doit être manquant quand :other a la valeur :value.', + 'missing_unless' => 'Le champ :attribute doit être manquant sauf si :other a la valeur :value.', + 'missing_with' => 'Le champ :attribute doit être manquant quand :values est présent.', + 'missing_with_all' => 'Le champ :attribute doit être manquant quand :values sont présents.', 'multiple_of' => 'La valeur de :attribute doit être un multiple de :value', 'not_in' => 'Le champ :attribute sélectionné n\'est pas valide.', 'not_regex' => 'Le format du champ :attribute n\'est pas valide.', 'numeric' => 'Le champ :attribute doit contenir un nombre.', - 'password' => 'Le mot de passe est incorrect', + 'password' => [ + 'letters' => 'Le champ :attribute doit contenir au moins une lettre.', + 'mixed' => 'Le champ :attribute doit contenir au moins une majuscule et une minuscule.', + 'numbers' => 'Le champ :attribute doit contenir au moins un chiffre.', + 'symbols' => 'Le champ :attribute doit contenir au moins un symbole.', + 'uncompromised' => 'La valeur du champ :attribute est apparue dans une fuite de données. Veuillez choisir une valeur différente.', + ], 'present' => 'Le champ :attribute doit être présent.', 'prohibited' => 'Le champ :attribute est interdit.', 'prohibited_if' => 'Le champ :attribute est interdit quand :other a la valeur :value.', 'prohibited_unless' => 'Le champ :attribute est interdit à moins que :other est l\'une des valeurs :values.', + 'prohibits' => 'Le champ :attribute interdit :other d\'être présent.', 'regex' => 'Le format du champ :attribute est invalide.', - 'relatable' => ':attribute n\'est sans doute pas associé(e) avec cette donnée.', 'required' => 'Le champ :attribute est obligatoire.', + 'required_array_keys' => 'Le champ :attribute doit contenir des entrées pour : :values.', 'required_if' => 'Le champ :attribute est obligatoire quand la valeur de :other est :value.', + 'required_if_accepted' => 'Le champ :attribute est obligatoire quand le champ :other a été accepté.', 'required_unless' => 'Le champ :attribute est obligatoire sauf si :other est :values.', 'required_with' => 'Le champ :attribute est obligatoire quand :values est présent.', 'required_with_all' => 'Le champ :attribute est obligatoire quand :values sont présents.', @@ -120,61 +135,100 @@ return [ 'starts_with' => 'Le champ :attribute doit commencer avec une des valeurs suivantes : :values', 'string' => 'Le champ :attribute doit être une chaîne de caractères.', 'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.', + 'ulid' => 'Le champ :attribute doit être un ULID valide.', 'unique' => 'La valeur du champ :attribute est déjà utilisée.', 'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.', + 'uppercase' => 'Le champ :attribute doit être en majuscules.', 'url' => 'Le format de l\'URL de :attribute n\'est pas valide.', 'uuid' => 'Le champ :attribute doit être un UUID valide', - 'ip' => 'Le champ :attribute doit être une adresse IP valide', - 'ean' => 'Le champ :attribute doit être un code EAN valide (7, 8 ou 13 chiffres)', - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', - ], + 'attributes' => [ + 'address' => 'adresse', + 'age' => 'âge', + 'amount' => 'montant', + 'area' => 'zone', + 'available' => 'disponible', + 'birthday' => 'anniversaire', + 'body' => 'corps', + 'city' => 'ville', + 'content' => 'contenu', + 'country' => 'pays', + 'created_at' => 'créé à', + 'creator' => 'créateur', + 'current_password' => 'mot de passe actuel', + 'date' => 'Date', + 'date_of_birth' => 'date de naissance', + 'day' => 'jour', + 'deleted_at' => 'supprimé à', + 'description' => 'la description', + 'district' => 'quartier', + 'duration' => 'durée', + 'email' => 'adresse e-mail', + 'excerpt' => 'extrait', + 'filter' => 'filtre', + 'first_name' => 'prénom', + 'gender' => 'genre', + 'group' => 'groupe', + 'hour' => 'heure', + 'image' => 'image', + 'last_name' => 'nom', + 'lesson' => 'leçon', + 'line_address_1' => 'ligne d\'adresse 1', + 'line_address_2' => 'ligne d\'adresse 2', + 'message' => 'message', + 'middle_name' => 'deuxième prénom', + 'minute' => 'minute', + 'mobile' => 'portable', + 'month' => 'mois', + 'name' => 'nom', + 'national_code' => 'code national', + 'number' => 'numéro', + 'password' => 'mot de passe', + 'password_confirmation' => 'confirmation du mot de passe', + 'phone' => 'téléphone', + 'photo' => 'photo', + 'postal_code' => 'code postal', + 'price' => 'prix', + 'province' => 'région', + 'recaptcha_response_field' => 'champ de réponse recaptcha', + 'remember' => 'se souvenir', + 'restored_at' => 'restauré à', + 'result_text_under_image' => 'texte de résultat sous l\'image', + 'role' => 'rôle', + 'second' => 'seconde', + 'sex' => 'sexe', + 'short_text' => 'texte court', + 'size' => 'taille', + 'state' => 'état', + 'street' => 'rue', + 'student' => 'étudiant', + 'subject' => 'sujet', + 'teacher' => 'professeur', + 'terms' => 'conditions', + 'test_description' => 'description test', + 'test_locale' => 'localisation test', + 'test_name' => 'nom test', + 'text' => 'texte', + 'time' => 'heure', + 'title' => 'titre', + 'updated_at' => 'mis à jour à', + 'username' => 'nom d\'utilisateur', + 'year' => 'année', ], - - - /** - *-------------------------------------------------------------------------- - * Custom Validation Attributes - *-------------------------------------------------------------------------- - * - * The following language lines are used to swap attribute place-holders - * with something more reader friendly such as E-Mail Address instead - * of "email". This simply helps us make messages a little cleaner. - * - */ - - 'attributes' => [ - 'name' => 'nom', - 'username' => "nom d'utilisateur", - 'email' => 'adresse email', - 'first_name' => 'prénom', - 'last_name' => 'nom', - 'password' => 'mot de passe', - 'password_confirmation' => 'confirmation du mot de passe', - 'city' => 'ville', - 'country' => 'pays', - 'address' => 'adresse', - 'phone' => 'téléphone', - 'mobile' => 'portable', - 'age' => 'âge', - 'sex' => 'sexe', - 'gender' => 'genre', - 'day' => 'jour', - 'month' => 'mois', - 'year' => 'année', - 'hour' => 'heure', - 'minute' => 'minute', - 'second' => 'seconde', - 'title' => 'titre', - 'content' => 'contenu', - 'description' => 'description', - 'excerpt' => 'extrait', - 'date' => 'date', - 'time' => 'heure', - 'available' => 'disponible', - 'size' => 'taille', - 'birth_date' => 'date de naissance', + 'custom' => [ + 'of_the' => [ + 'male' => 'du ', + 'female' => 'de la ', + 'vowel' => 'de l\'' + ], + 'event' => 'évènement', + 'model' => 'élément ciblé', + 'order' => 'ordre', + 'publication' => 'publication', + 'activated' => 'activé', + 'target' => 'cible', + 'static_page_type' => 'type de page', + 'seo_title' => 'titre SEO', + 'seo_description' => 'description SEO', 'ip' => 'IP', 'code' => 'code', diff --git a/resources/lang/fr/vue.php b/resources/lang/fr/vue.php index 4d87ce8..9491a29 100644 --- a/resources/lang/fr/vue.php +++ b/resources/lang/fr/vue.php @@ -2,29 +2,37 @@ return [ 'ImageInputComponent' => [ - 'choose_a_file' => 'Choose a file', - 'change_source_picture' => 'Edit Source Image', - 'view_source_picture' => 'View image', - 'resize_source_picture' => 'Resize image', - 'resized_source_picture' => 'Image resized', - 'preview_picture' => 'Image preview', - 'change_picture_before_import' => 'Image modification before import', - 'close_window' => 'Close the window', - 'close_and_validate' => 'Validate the content and close the window', - 'close_window_without_validation' => 'Close the window without validating the content', - 'zoom_in' => 'Zoom in', - 'zoom_out' => 'Zoom out', - 'move_left' => 'Move left', - 'move_right' => 'Move right', - 'move_up' => 'Move up', - 'move_down' => 'Move down', - 'mirror_horizontal' => 'Horizontal mirror', - 'mirror_vertical' => 'Vertical mirror', - 'rotation' => 'Rotation', - 'rotate_rewind' => 'Counter-clockwise rotation', - 'rotate' => 'Clockwise rotation', - 'degres' => ':deg egrees', - 'validate' => 'Validate', - 'preview' => 'Preview', + 'choose_a_file' => 'Choisir un fichier', + 'change_source_picture' => 'Modifier l\'image source', + 'view_source_picture' => 'Voir l\'image', + 'resize_source_picture' => 'Redimensionner l\'image', + 'resized_source_picture' => 'Image redimensionnée', + 'preview_picture' => 'Aperçu de l\'image', + 'change_picture_before_import' => 'Modification de l\'image avant l\'importation', + 'close_window' => 'Fermer la fenêtre', + 'close_and_validate' => 'Valider le contenu et fermer la fenêtre', + 'close_window_without_validation' => 'Fermer la fenêtre sans valider le contenu', + 'zoom_in' => 'Zoom avant', + 'zoom_out' => 'Zoom arrière', + 'move_left' => 'Déplacer vers la gauche', + 'move_right' => 'Déplacer vers la droite', + 'move_up' => 'Déplacer en vers le haut', + 'move_down' => 'Déplacer en vers le bas', + 'mirror_horizontal' => 'Miroir horizontal', + 'mirror_vertical' => 'Miroir vertical', + 'rotation' => 'Rotation', + 'rotate_rewind' => 'Rotation dans le sens inverse des aiguilles d\'une montre', + 'rotate' => 'Rotation dans le sens des aiguilles d\'une montre', + 'degres' => ':deg degrés', + 'validate' => 'Valider', + 'preview' => 'Prévisualisation', + ], + 'WordCounterComponent' => [ + 'words' => 'Mots', + 'characters' => 'Caractères' + ], + 'PasswordVisibility' => [ + 'hide' => 'Cacher le mot de passe', + 'show' => 'Dévoiler le mot de passe', ] ]; diff --git a/resources/sass/bo/base/_bootstrap-overload.scss b/resources/sass/base/_bootstrap-overload.scss similarity index 100% rename from resources/sass/bo/base/_bootstrap-overload.scss rename to resources/sass/base/_bootstrap-overload.scss diff --git a/resources/sass/bo/base/_common.scss b/resources/sass/base/_common.scss similarity index 100% rename from resources/sass/bo/base/_common.scss rename to resources/sass/base/_common.scss diff --git a/resources/sass/bo/base/_fonts.scss b/resources/sass/base/_fonts.scss similarity index 100% rename from resources/sass/bo/base/_fonts.scss rename to resources/sass/base/_fonts.scss diff --git a/resources/sass/bo/bo.scss b/resources/sass/bo.scss similarity index 100% rename from resources/sass/bo/bo.scss rename to resources/sass/bo.scss diff --git a/resources/sass/bo/_variables.scss b/resources/sass/bo/_variables.scss deleted file mode 100644 index 0f89db0..0000000 --- a/resources/sass/bo/_variables.scss +++ /dev/null @@ -1,19 +0,0 @@ -// Body -$body-bg: #f8fafc; - -// Typography -$font-family-sans-serif: "Nunito", sans-serif; -$font-size-base: 0.9rem; -$line-height-base: 1.6; - -// Colors -$blue: #3490dc; -$indigo: #6574cd; -$purple: #9561e2; -$pink: #f66d9b; -$red: #e3342f; -$orange: #f6993f; -$yellow: #ffed4a; -$green: #38c172; -$teal: #4dc0b5; -$cyan: #6cb2eb; diff --git a/resources/sass/bo/pages/.gitkeep b/resources/sass/pages/.gitkeep similarity index 100% rename from resources/sass/bo/pages/.gitkeep rename to resources/sass/pages/.gitkeep diff --git a/resources/sass/bo/partials/.gitkeep b/resources/sass/partials/.gitkeep similarity index 100% rename from resources/sass/bo/partials/.gitkeep rename to resources/sass/partials/.gitkeep diff --git a/resources/sass/bo/utilities/_bootstrap-custom.scss b/resources/sass/utilities/_bootstrap-custom.scss similarity index 100% rename from resources/sass/bo/utilities/_bootstrap-custom.scss rename to resources/sass/utilities/_bootstrap-custom.scss diff --git a/resources/sass/bo/utilities/_bootstrap-variables.scss b/resources/sass/utilities/_bootstrap-variables.scss similarity index 100% rename from resources/sass/bo/utilities/_bootstrap-variables.scss rename to resources/sass/utilities/_bootstrap-variables.scss diff --git a/resources/sass/bo/utilities/_mixins.scss b/resources/sass/utilities/_mixins.scss similarity index 100% rename from resources/sass/bo/utilities/_mixins.scss rename to resources/sass/utilities/_mixins.scss diff --git a/resources/sass/bo/utilities/_variables.scss b/resources/sass/utilities/_variables.scss similarity index 100% rename from resources/sass/bo/utilities/_variables.scss rename to resources/sass/utilities/_variables.scss diff --git a/resources/sass/bo/vendor/_bootstrap.scss b/resources/sass/vendor/_bootstrap.scss similarity index 100% rename from resources/sass/bo/vendor/_bootstrap.scss rename to resources/sass/vendor/_bootstrap.scss diff --git a/resources/sass/bo/vendor/_ckEditorContent.scss b/resources/sass/vendor/_ckEditorContent.scss similarity index 100% rename from resources/sass/bo/vendor/_ckEditorContent.scss rename to resources/sass/vendor/_ckEditorContent.scss diff --git a/resources/ts/bo/base/common.ts b/resources/ts/base/common.ts similarity index 95% rename from resources/ts/bo/base/common.ts rename to resources/ts/base/common.ts index 89c7b86..1ef2123 100644 --- a/resources/ts/bo/base/common.ts +++ b/resources/ts/base/common.ts @@ -1,5 +1,5 @@ import type { SweetAlertResult } from "sweetalert2"; -import sweetalert from "../../modules/sweetalertConfirm"; +import sweetalert from "../modules/sweetalertConfirm"; window.addEventListener("DOMContentLoaded", () => { /** diff --git a/resources/ts/bo/bo.ts b/resources/ts/bo.ts similarity index 71% rename from resources/ts/bo/bo.ts rename to resources/ts/bo.ts index cd94d30..fa51b5d 100644 --- a/resources/ts/bo/bo.ts +++ b/resources/ts/bo.ts @@ -1,6 +1,6 @@ // ASSETS /// <reference types="vite/client" /> -import.meta.glob(["./../../assets/images/**"]); +import.meta.glob(["./../assets/images/**"]); // UTILITIES import "./utilities/bootstrap"; @@ -8,7 +8,7 @@ import "./utilities/fontawesome"; import "./utilities/vue-bo"; // MODULES -import "./../modules/sweetalert"; +import "./modules/sweetalert"; // CUSTOM import "./base/common"; diff --git a/resources/ts/bo/components/shims-vue.d.ts b/resources/ts/bo/components/shims-vue.d.ts deleted file mode 100644 index d2833d6..0000000 --- a/resources/ts/bo/components/shims-vue.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module "*.vue" { - import type { DefineComponent } from "vue"; - const component: DefineComponent<{}, {}, any>; - // @ts-ignore - export default component; -} diff --git a/resources/ts/bo/utilities/bootstrap.ts b/resources/ts/bo/utilities/bootstrap.ts deleted file mode 100644 index 2419164..0000000 --- a/resources/ts/bo/utilities/bootstrap.ts +++ /dev/null @@ -1,21 +0,0 @@ -import axios from "axios"; -import * as bootstrap from "bootstrap"; -import bsTooltips from "./../../modules/bsTooltips"; - -/** - * We'll load the axios HTTP library which allows us to easily issue requests - * to our Laravel back-end. This library automatically handles sending the - * CSRF token as a header based on the value of the "XSRF" token cookie. - */ -axios.defaults.headers.common = { - Accept: "application/json, text/plain, */*", - "X-Requested-With": "XMLHttpRequest", - "X-CSRF-TOKEN": document - .querySelector("meta[name=\"csrf-token\"]")! - .getAttribute("content"), -}; - -window.axios = axios; -window.bootstrap = bootstrap; - -bsTooltips.methods.initTooltips(); diff --git a/resources/ts/bo/utilities/fontawesome.ts b/resources/ts/bo/utilities/fontawesome.ts deleted file mode 100644 index 58da045..0000000 --- a/resources/ts/bo/utilities/fontawesome.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { config, dom, library } from "@fortawesome/fontawesome-svg-core"; -import { - faArrowAltCircleDown, - faArrowAltCircleUp, - faArrowDown, - faArrowLeft, - faArrowLeftLong, - faArrowRight, - faArrowRightFromBracket, - faArrowUp, - faArrowsAltH, - faArrowsAltV, - faBackspace, - faBan, - faCheck, - faChevronLeft, - faChevronRight, - faCircleCheck, - faCircleExclamation, - faCircleInfo, - faCircleNotch, - faCircleXmark, - faCog, - faCopy, - faCrop, - faEraser, - faEye, - faEyeSlash, - faFileExport, - faFolderOpen, - faListUl, - faPaintRoller, - faPencil, - faPlus, - faQuestionCircle, - faRedoAlt, - faSearch, - faSearchMinus, - faSearchPlus, - faSliders, - faSyncAlt, - faTimes, - faTrash, - faUndoAlt, - faWandMagic -} from "@fortawesome/free-solid-svg-icons"; - -config.autoReplaceSvg = false; -library.add(faEraser); -library.add(faArrowLeftLong); -library.add(faPlus); -library.add(faTrash); -library.add(faEye); -library.add(faEyeSlash); -library.add(faFolderOpen); -library.add(faCrop); -library.add(faQuestionCircle); -library.add(faCheck); -library.add(faUndoAlt); -library.add(faRedoAlt); -library.add(faSyncAlt); -library.add(faSearchPlus); -library.add(faSearchMinus); -library.add(faArrowLeft); -library.add(faArrowRight); -library.add(faArrowUp); -library.add(faArrowDown); -library.add(faArrowsAltH); -library.add(faArrowsAltV); -library.add(faWandMagic); -library.add(faPencil); -library.add(faTimes); -library.add(faBackspace); -library.add(faSearch); -library.add(faArrowRightFromBracket); -library.add(faArrowAltCircleDown); -library.add(faArrowAltCircleUp); -library.add(faCircleCheck); -library.add(faCircleXmark); -library.add(faCopy); -library.add(faListUl); -library.add(faBan); -library.add(faCircleExclamation); -library.add(faCircleInfo); -library.add(faPaintRoller); -library.add(faChevronLeft); -library.add(faChevronRight); -library.add(faCircleXmark); -library.add(faCircleNotch); -library.add(faSliders); -library.add(faCog); -library.add(faFileExport); - -dom.watch(); diff --git a/resources/ts/bo/components/BelongsToManyDropdownComponent.vue b/resources/ts/components/BelongsToManyDropdownComponent.vue similarity index 96% rename from resources/ts/bo/components/BelongsToManyDropdownComponent.vue rename to resources/ts/components/BelongsToManyDropdownComponent.vue index 38bc712..284d9e3 100644 --- a/resources/ts/bo/components/BelongsToManyDropdownComponent.vue +++ b/resources/ts/components/BelongsToManyDropdownComponent.vue @@ -63,15 +63,16 @@ </template> <script lang="ts"> -import { defineComponent } from "vue"; import type VueTagsInput from "@sipec/vue3-tags-input"; import { VueTagsInput as VueTagsInputCls } from "@sipec/vue3-tags-input"; import slugify from "slugify"; -import route from "../../modules/route"; -import trans from "../../modules/trans"; -import parseLaravelErrorMessages from "../../modules/parseLaravelErrorMessages"; +import { defineComponent } from "vue"; +import parseLaravelErrorMessages from "../modules/parseLaravelErrorMessages"; +import route from "../modules/route"; +import trans from "../modules/trans"; export default defineComponent({ + name: "BelongsToManyDropdownComponent", mixins: [route, trans, parseLaravelErrorMessages], components: { VueTagsInputCls, @@ -196,7 +197,9 @@ export default defineComponent({ <style lang="scss"> .belongs-to-many-dropdown { - max-width: 100% !important; + &, .vue-tags-input { + max-width: 100% !important; + } .ti- { &autocomplete { max-height: 10rem !important; diff --git a/resources/ts/bo/components/CkEditorComponent.vue b/resources/ts/components/CkEditorComponent.vue similarity index 81% rename from resources/ts/bo/components/CkEditorComponent.vue rename to resources/ts/components/CkEditorComponent.vue index 363232c..962cfc3 100644 --- a/resources/ts/bo/components/CkEditorComponent.vue +++ b/resources/ts/components/CkEditorComponent.vue @@ -1,5 +1,5 @@ <template> - <div> + <div class="ck-editor-component"> <div ref="wordCounter" /> <div ref="ckeditor" /> <input @@ -15,8 +15,8 @@ <script lang="ts"> import { defineComponent } from "vue"; -import trans from "./../../modules/trans"; -import "./../../../js/vendor/ckeditor"; +import "./../../js/vendor/ckeditor"; +import trans from "./../modules/trans"; // import { CKUploadAdaptater } from "../../bo/CkUploadAdaptater"; export default defineComponent({ @@ -84,7 +84,9 @@ export default defineComponent({ if (this.internalText != this.dbtext) { this.internalText = this.dbtext ? this.dbtext : ""; if (this.editor) { - this.editor.setData(this.internalText); + const text = this.internalText; + Object.freeze(text); + this.editor.setData(text); } } }, @@ -93,15 +95,24 @@ export default defineComponent({ makeSuperBuild() { const self = this, ckeditor = this.$refs.ckeditor as HTMLElement, - wordCounter = this.$refs.wordCounter as HTMLElement; - // * Specific to Calliope - // verticalTopMenuOffset = document.querySelector( - // "body > div> .navbar" - // ) as HTMLElement | null; + wordCounter = this.$refs.wordCounter as HTMLElement, + // * Top Menu + verticalTopMenuOffset = document.querySelector( + "body > #top-navbar" + ) as HTMLElement | null; - // if (!verticalTopMenuOffset) { - // throw new Error("Could not find bo Top menu navbar"); - // } + if (!verticalTopMenuOffset) { + console.warn("Could not find bo #top-navbar"); + } + + const ui = verticalTopMenuOffset ? { + viewportOffset: { + top: verticalTopMenuOffset.getBoundingClientRect().height, + right: 0, + bottom: 0, + left: 0, + }, + } : undefined; // @ts-ignore ClassicEditor.create(ckeditor, { @@ -126,29 +137,21 @@ export default defineComponent({ this.words = stats.words; }, }, - // ui: { - // viewportOffset: { - // top: verticalTopMenuOffset.getBoundingClientRect().height, - // right: 0, - // bottom: 0, - // left: 0, - // }, - // }, + ui: ui, link: { // Automatically add target="_blank" and rel="noopener noreferrer" to all external links. addTargetToExternalLinks: true, // Let the users control the "download" attribute of each link. - decorators: [ - { + decorators: { + openInNewTab: { mode: "manual", label: "Ouvrir dans un nouvel onglet", attributes: { target: "_blank", - rel: "noopener noreferrer", - }, - }, - ], + } + } + } }, typing: { transformations: { @@ -301,7 +304,7 @@ export default defineComponent({ }; // Display all toolbar elements // console.log(Array.from(editor.ui.componentFactory.names())); - self.editor = editor; + self.editor = Object.freeze(editor); editor.setData(this.internalText); editor.model.document.on("change:data", () => { if(timer) { @@ -326,27 +329,38 @@ export default defineComponent({ </script> <style lang="scss"> -@import url("./../../../js/vendor/ckeditor/build/styles.css"); -.ck-rounded-corners { - border-radius: 0 0 0.375rem 0.375rem !important; -} -.ck-word-count { - background-color: #fafafa; - border: 1px solid #c4c4c4; - border-bottom: 0px; - border-top-left-radius: 0.375rem; - border-top-right-radius: 0.375rem; - color: initial; - display: flex; - flex-direction: row; - justify-content: space-around !important; -} -.ck-content { - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -.ck-focused { - border-color: #86b7fe !important; - box-shadow: 0 0 0 0.25rem rgb(13 110 253 / 25%) !important; - outline: 0 !important; +@import url("./../../js/vendor/ckeditor/build/styles.css"); +.ck-editor-component{ + // 2. Include functions first (so you can manipulate colors, SVGs, calc, etc) + @import "bootstrap/scss/functions"; + + // 3. Include remainder of required Bootstrap stylesheets + @import "bootstrap/scss/variables"; + .ck-rounded-corners { + border-radius: 0 0 0.375rem 0.375rem !important; + } + .ck-word-count { + background-color: #fafafa; + border: 1px solid #c4c4c4; + border-bottom: 0px; + border-top-left-radius: 0.375rem; + border-top-right-radius: 0.375rem; + color: initial; + display: flex; + flex-direction: row; + justify-content: space-around !important; + } + .ck-content { + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + .ck-focused { + border-color: #86b7fe !important; + box-shadow: 0 0 0 0.25rem rgb(13 110 253 / 25%) !important; + outline: 0 !important; + } + .ck-editor__main{ + color: $body-color; + } } + </style> diff --git a/resources/ts/bo/components/DashboardChartComponent.vue b/resources/ts/components/DashboardChartComponent.vue similarity index 100% rename from resources/ts/bo/components/DashboardChartComponent.vue rename to resources/ts/components/DashboardChartComponent.vue diff --git a/resources/ts/bo/components/ImageInputComponent.vue b/resources/ts/components/ImageInputComponent.vue similarity index 72% rename from resources/ts/bo/components/ImageInputComponent.vue rename to resources/ts/components/ImageInputComponent.vue index a9398fd..abc6c36 100644 --- a/resources/ts/bo/components/ImageInputComponent.vue +++ b/resources/ts/components/ImageInputComponent.vue @@ -1,10 +1,10 @@ <template> <div class="container image-input-vue p-0"> <div class="row"> - <div :class="`col-12 ${inTpreview ? 'col-md-6' : ''} form-group`"> + <div :class="`col-12 ${intPreview ? 'col-md-6' : ''} form-group`"> <label - v-if="inTpreview && showLabels" - :for="inTId" + v-if="intPreview && showLabels" + :for="intId" class="col-form-label" > <b>{{ __("vue.ImageInputComponent.choose_a_file") }}</b> @@ -20,34 +20,34 @@ <FontAwesomeIcon icon="fa-solid fa-folder-open" /> </button> <input - :id="inTId" + :id="intId" ref="actualImage" @change="changedImage" type="file" class="d-none" - :name="inTname" + :name="intName" accept=".jpg,.jpeg,.gif,.png" - :aria-describedby="`Help${inTId}`" + :aria-describedby="`Help${intId}`" > <input - v-if="inTvalue.indexOf('data:image/png;base64') !== 0" + v-if="intValue.indexOf('data:image/png;base64') !== 0" class="d-none" - :name="inTname" + :name="intName" type="text" :value="submitIntValue" > <input @click.prevent="chooseAFile" type="text" - :value="inTvalueFileName" + :value="intValueFileName" class="form-control right-aligned" data-bs-toggle="tooltip" :title="__('vue.ImageInputComponent.change_source_picture')" - :aria-describedby="`Help${inTId}`" + :aria-describedby="`Help${intId}`" readonly > <button - v-if="!inTrequired && inThasImage" + v-if="!intRequired && intHasImage" @click.prevent="removeFile" class="btn btn-outline-danger" type="button" @@ -55,11 +55,11 @@ <FontAwesomeIcon icon="fa-solid fa-eraser" /> </button> <button - v-if="!inTpreview && inTvalue" + v-if="!intPreview && intValue" class="btn btn-warning" type="button" data-bs-toggle="modal" - :data-bs-target="`#ModalPreview${inTId}`" + :data-bs-target="`#ModalPreview${intId}`" > <span data-bs-toggle="tooltip" @@ -70,11 +70,11 @@ </button> <button @click.prevent="prepareImageEditor($event)" - :disabled="!inThasImage" - :class="`btn ${!inThasModdedImage ? 'btn-primary' : 'btn-success'}`" + :disabled="!intHasImage" + :class="`btn ${!intHasModdedImage ? 'btn-primary' : 'btn-success'}`" type="button" data-bs-toggle="modal" - :data-bs-target="`#Modal${inTId}`" + :data-bs-target="`#Modal${intId}`" > <span data-bs-toggle="tooltip" @@ -84,7 +84,7 @@ </span> </button> <span - v-if="inThasModdedImage" + v-if="intHasModdedImage" class="input-group-text text-success" data-bs-toggle="tooltip" :title="__('vue.ImageInputComponent.resized_source_picture')" @@ -93,41 +93,42 @@ </span> </div> <small - :id="`Help${inTId}`" - class="form-text text-muted" - >{{ - inThelper - }}</small> + :id="`Help${intId}`" + class="form-text text-body-secondary" + > + {{ intHelper }} + </small> </div> <div - v-if="inTpreview" - :class="`col-12 ${inTpreview ? 'col-md-6' : ''} form-group`" + v-if="intPreview" + :class="`col-12 ${intPreview ? 'col-md-6' : ''} form-group d-flex flex-column`" > - <small - v-if="inTvalue && showLabels" - :id="`PreviewHelp${inTId}`" - class="form-text text-muted d-block" - >{{ __("vue.ImageInputComponent.preview_picture") }} - <span - v-if="inToriginalFile" - class="fw-bold" - > - {{ humanFileSize(inToriginalFile.size) }} - {{ `hauteur ${inToriginalFileDimensions.height}px` }} - {{ `largeur ${inToriginalFileDimensions.width}px` }} - </span> - </small> - <img - v-if="inTvalue" - class="img-fluid" - :src="inTvalue" - :alt="__('Image placeholder')" - :aria-describedby="`PreviewHelp${inTId}`" + <p + v-if="intValue && showLabels" + :id="`PreviewHelp${intId}`" + class="col-form-label fw-bold m-0" > + {{ __("vue.ImageInputComponent.preview_picture") }} + </p> + <img + v-if="intValue" + class="img-fluid" + :src="intValue" + :alt="__('Image placeholder')" + :aria-describedby="`PreviewHelp${intId}`" + > + <small + v-if="intOriginalFile" + class="form-text text-body-secondary" + > + {{ humanFileSize(intOriginalFile.size) }} + {{ `hauteur ${intOriginalFileDimensions.height}px` }} + {{ `largeur ${intOriginalFileDimensions.width}px` }} + </small> </div> </div> <div - :id="`Modal${inTId}`" + :id="`Modal${intId}`" class="modal" tabindex="-1" role="dialog" @@ -270,11 +271,12 @@ <label for="range" class="form-label me-4" - >{{ - __("vue.ImageInputComponent.degres", { - deg: String(inTrotationText), - }) - }} + > + {{ + __("vue.ImageInputComponent.degres", { + deg: String(intRotationText), + }) + }} </label> <input ref="rotationSlider" @@ -307,11 +309,11 @@ </div> <div ref="previewBox" - class="col-12 col-md-6 p-0 bg-light preview-img" + class="col-12 col-md-6 p-0 preview-img" > <div - :id="`Preview${inTId}`" - :style="inTpreviewStyle" + :id="`Preview${intId}`" + :style="intPreviewStyle" /> </div> </div> @@ -343,8 +345,8 @@ </div> </div> <div - v-if="!inTpreview && inTvalue" - :id="`ModalPreview${inTId}`" + v-if="!intPreview && intValue" + :id="`ModalPreview${intId}`" class="modal" tabindex="-1" role="dialog" @@ -374,14 +376,14 @@ <div class="row"> <div class="col-12 text-center"> <small - :id="`PreviewHelp${inTId}`" - class="form-text text-muted d-block" + :id="`PreviewHelp${intId}`" + class="form-text text-body-secondary d-block" >{{ __("vue.ImageInputComponent.preview_picture") }}</small> <img class="img-fluid" - :src="inTvalue" + :src="intValue" :alt="__('Image placeholder')" - :aria-describedby="`PreviewHelp${inTId}`" + :aria-describedby="`PreviewHelp${intId}`" > </div> </div> @@ -397,8 +399,8 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; import Cropper from "cropperjs"; import { defineComponent } from "vue"; -import bsTooltips from "../../modules/bsTooltips"; -import trans from "../../modules/trans"; +import bsTooltips from "../modules/bsTooltips"; +import trans from "../modules/trans"; const UNITS = [ "byte", @@ -411,13 +413,14 @@ const UNITS = [ const BYTES_PER_KB = 1024; export default defineComponent({ + name: "ImageInputComponent", components: { FontAwesomeIcon, }, mixins: [trans, bsTooltips], emits: { - browseFile: (inTId: string) => { - inTId; + browseFile: (intId: string) => { + intId; return true; }, imageFile: (file: File | null) => { @@ -431,42 +434,42 @@ export default defineComponent({ if (json.length) { // * Init uppon Laravel Blade const data = JSON.parse(json); - this.inTId = data.id; - this.inTname = data.name; - this.inThelper = data.helper ?? ""; - this.inTwidth = Number.parseInt(String(data.width)); - this.inTheight = Number.parseInt(String(data.height)); - this.inTvalue = String(data.value); - if (this.inTvalue.length) { - this.inTvalueFileName = this.inTvalue.replace(/^\/|^/, ""); - this.inTvalue = this.inTvalue.replace(/^\/|^/, "/"); + this.intId = data.id; + this.intName = data.name; + this.intHelper = data.helper ?? ""; + this.intWidth = Number.parseInt(String(data.width)); + this.intHeight = Number.parseInt(String(data.height)); + this.intValue = String(data.value); + if (this.intValue.length) { + this.intValueFileName = this.intValue.replace(/^\/|^/, ""); + this.intValue = this.intValue.replace(/^\/|^/, "/"); } if (data.preview !== undefined) { - this.inTpreview = data.preview ? true : false; + this.intPreview = data.preview ? true : false; } if (data.required !== undefined) { - this.inTrequired = data.required ? true : false; + this.intRequired = data.required ? true : false; } if (data.browseEvent !== undefined) { - this.inTbrowseEvent = data.browseEvent ? true : false; + this.intBrowseEvent = data.browseEvent ? true : false; } } else { // * Init Uppon Vue component - this.inTId = this.id; - this.inTname = this.name; - this.inThelper = this.helper; - this.inTwidth = this.width; - this.inTheight = this.height; - this.inTvalue = this.value; - if (this.inTvalue.length) { - this.inTvalueFileName = this.inTvalue.replace(/^\/|^/, ""); - this.inTvalue = this.inTvalue.replace(/^\/|^/, "/"); + this.intId = this.id; + this.intName = this.name; + this.intHelper = this.helper; + this.intWidth = this.width; + this.intHeight = this.height; + this.intValue = this.value; + if (this.intValue.length) { + this.intValueFileName = this.intValue.replace(/^\/|^/, ""); + this.intValue = this.intValue.replace(/^\/|^/, "/"); } - this.inTpreview = this.preview; - this.inTrequired = this.required; - this.inTbrowseEvent = this.browseEvent; + this.intPreview = this.preview; + this.intRequired = this.required; + this.intBrowseEvent = this.browseEvent; } - this.inThasImage = false; + this.intHasImage = false; }, props: { id: { @@ -511,67 +514,67 @@ export default defineComponent({ }, }, data(): { - inTId: string; - inTvalue: string; - inTvalueFileName: string; - inThelper: string; - inTname: string; - inTrequired: boolean; - inTwidth: number; - inTheight: number; - inTpreview: boolean; + intId: string; + intValue: string; + intValueFileName: string; + intHelper: string; + intName: string; + intRequired: boolean; + intWidth: number; + intHeight: number; + intPreview: boolean; - inTbrowseEvent: boolean; + intBrowseEvent: boolean; - inTrotationText: number; - inTrotationValue: number; - inTscaleX: number; - inTscaleY: number; - inThasImage: boolean; - inThasModdedImage: boolean; - inTcropper: Cropper | null; + intRotationText: number; + intRotationValue: number; + intScaleX: number; + intScaleY: number; + intHasImage: boolean; + intHasModdedImage: boolean; + intCropper: Cropper | null; - inToriginalFile: File | null; - inToriginalFileDimensions: { + intOriginalFile: File | null; + intOriginalFileDimensions: { height: number; width: number; }; - inToriginalFileName: string; - inTpreviewStyle: string; + intOriginalFileName: string; + intPreviewStyle: string; } { return { - inTId: "", - inTvalue: "", - inTvalueFileName: this.__("vue.ImageInputComponent.choose_a_file"), - inThelper: "", - inTname: "", - inTrequired: true, - inTwidth: 0, - inTheight: 0, - inTpreview: true, + intId: "", + intValue: "", + intValueFileName: this.__("vue.ImageInputComponent.choose_a_file"), + intHelper: "", + intName: "", + intRequired: true, + intWidth: 0, + intHeight: 0, + intPreview: true, - inTbrowseEvent: false, + intBrowseEvent: false, - inTrotationText: 0, - inTrotationValue: 0, - inTscaleX: 1, - inTscaleY: 1, - inThasImage: false, - inThasModdedImage: false, - inTcropper: null, + intRotationText: 0, + intRotationValue: 0, + intScaleX: 1, + intScaleY: 1, + intHasImage: false, + intHasModdedImage: false, + intCropper: null, - inToriginalFile: null, - inToriginalFileDimensions: { + intOriginalFile: null, + intOriginalFileDimensions: { height: 0, width: 0, }, - inToriginalFileName: "", - inTpreviewStyle: "", + intOriginalFileName: "", + intPreviewStyle: "", }; }, computed: { imageRatio() { - return this.inTwidth / this.inTheight; + return this.intWidth / this.intHeight; }, cropperOption(): Cropper.Options { return { @@ -590,25 +593,25 @@ export default defineComponent({ cropBoxMovable: true, cropBoxResizable: false, toggleDragModeOnDblclick: false, - aspectRatio: this.inTwidth / this.inTheight, - preview: `#Preview${this.inTId}`, + aspectRatio: this.intWidth / this.intHeight, + preview: `#Preview${this.intId}`, }; }, /** Removes prepended slash */ submitIntValue(): string { - return this.inTvalue.replace(/^\/|^/, ""); + return this.intValue.replace(/^\/|^/, ""); }, }, watch: { - inTrotationValue(value) { - if (!this.inTcropper) { + intRotationValue(value) { + if (!this.intCropper) { return; } - this.inTcropper.rotateTo(value); + this.intCropper.rotateTo(value); }, - inTvalue() { - if (this.inTbrowseEvent) { - this.inThasImage = true; + intValue() { + if (this.intBrowseEvent) { + this.intHasImage = true; } }, value: { @@ -620,39 +623,36 @@ export default defineComponent({ return; } if (!value.length) { - this.$nextTick(() => { - this.removeFile(); - }); + this.removeFile(); return; } else { - this.inThasImage = true; + this.intHasImage = true; } // * Using browse event, If user changed imagem recompile blob (File Upload storage strategy) if (this.inTbrowseEvent && this.inThasImage) { - const self = this, - actualImage = this.$refs.actualImage as HTMLInputElement, + const actualImage = this.$refs.actualImage as HTMLInputElement, container = new DataTransfer(); this.$nextTick(() => { - this.inTvalue = value.replace(/^\/|^/, "/"); - this.inTvalueFileName = value.replace(/^\/|^/, ""); - fetch(this.inTvalue) + this.intValue = value.replace(/^\/|^/, "/"); + this.intValueFileName = value.replace(/^\/|^/, ""); + fetch(this.intValue) .then((response) => { - self.inToriginalFileName = response.url.substring( + this.intOriginalFileName = decodeURI(response.url.substring( response.url.lastIndexOf("/") + 1 - ); + )); return response.blob(); }) .then((blob: Blob) => { if (!actualImage.files) { throw new Error("3- missing files list"); } - this.fetchDataUrlImageSizes(self.inTvalue); + this.fetchDataUrlImageSizes(this.inTvalue); const file = new File([blob], this.inTvalueFileName, { type: "image/png", lastModified: new Date().getTime(), }); - this.inThasImage = true; - this.inToriginalFile = file; + this.intHasImage = true; + this.intOriginalFile = file; this.$emit("imageFile", file); container.items.add(file); actualImage.files = container.files; @@ -675,57 +675,57 @@ export default defineComponent({ style = window.getComputedStyle(previewBox), targetWidth = Number.parseFloat(style.width) / 1.2, targetHeight = - (this.inTheight * Number.parseFloat(style.width)) / - this.inTwidth / + (this.intHeight * Number.parseFloat(style.width)) / + this.intWidth / 1.2; - this.inTpreviewStyle = `width: ${targetWidth.toFixed( + this.intPreviewStyle = `width: ${targetWidth.toFixed( 3 )}px;height:${targetHeight.toFixed(3)}px;`; }, reset() { - if (!this.inTcropper) { + if (!this.intCropper) { return; } - this.inTcropper.reset(); + this.intCropper.reset(); }, zoom(v: number) { - if (!this.inTcropper) { + if (!this.intCropper) { return; } - this.inTcropper.zoom(v); + this.intCropper.zoom(v); }, move(x: number, y: number) { - if (!this.inTcropper) { + if (!this.intCropper) { return; } - this.inTcropper.move(x, y); + this.intCropper.move(x, y); }, scale(horizontal: boolean) { - if (!this.inTcropper) { + if (!this.intCropper) { return; } if (horizontal) { - this.inTscaleX = -1 / this.inTscaleX; - this.inTcropper.scaleX(this.inTscaleX); + this.intScaleX = -1 / this.intScaleX; + this.intCropper.scaleX(this.intScaleX); } else { - this.inTscaleY = -1 / this.inTscaleY; - this.inTcropper.scaleY(this.inTscaleY); + this.intScaleY = -1 / this.intScaleY; + this.intCropper.scaleY(this.intScaleY); } }, rotate(value: number) { const rotationSlider = this.$refs.rotationSlider as HTMLInputElement; - let res = this.inTrotationValue + value; + let res = this.intRotationValue + value; res = res < 0 ? 0 : res; res = res > 360 ? 360 : res; - this.inTrotationValue = res; - this.inTrotationText = this.inTrotationValue; - rotationSlider.value = String(this.inTrotationValue); + this.intRotationValue = res; + this.intRotationText = this.intRotationValue; + rotationSlider.value = String(this.intRotationValue); }, rotateTo(value: number) { value = value < 0 ? 0 : value; value = value > 360 ? 360 : value; - this.inTrotationValue = value; - this.inTrotationText = this.inTrotationValue; + this.intRotationValue = value; + this.intRotationText = this.intRotationValue; }, rotationChange(e: Event) { const el = e.target; @@ -736,73 +736,74 @@ export default defineComponent({ }, chooseAFile() { const actualImage = this.$refs.actualImage as HTMLInputElement; - if (this.inTbrowseEvent) { - this.$emit("browseFile", this.inTId); + if (this.intBrowseEvent) { + this.$emit("browseFile", this.intId); return; } actualImage.click(); }, removeFile() { + if (!this.$refs.actualImage) { + return; + } const actualImage = this.$refs.actualImage as HTMLInputElement; actualImage.value = ""; - this.inTvalueFileName = this.__("vue.ImageInputComponent.choose_a_file"); - this.inTvalue = ""; - this.inToriginalFileName = ""; - this.inToriginalFile = null; - this.inThasModdedImage = false; - this.inToriginalFileDimensions = { + this.intValueFileName = this.__("vue.ImageInputComponent.choose_a_file"); + this.intValue = ""; + this.intOriginalFileName = ""; + this.intOriginalFile = null; + this.intHasModdedImage = false; + this.intOriginalFileDimensions = { height: 0, width: 0, }; - // * To overload watcher for inTvalue - this.$nextTick(() => (this.inThasImage = false)); + // * To overload watcher for intValue + this.$nextTick(() => (this.intHasImage = false)); this.$emit("imageFile", null); }, changedImage() { - const self = this, - reader = new FileReader(), + const reader = new FileReader(), actualImage = this.$refs.actualImage as HTMLInputElement; if (!actualImage.files) { throw new Error("missing files list"); } - self.inThasImage = true; + this.intHasImage = true; reader.addEventListener( "load", () => { // On convertit l'image en une chaîne de caractères base64. - self.inTvalue = String(reader.result); + this.intValue = String(reader.result); }, false ); if (actualImage.files[0]) { - self.inToriginalFile = actualImage.files[0]; - self.inToriginalFileName = actualImage.files[0].name; + this.intOriginalFile = actualImage.files[0]; + this.intOriginalFileName = actualImage.files[0].name; reader.readAsDataURL(actualImage.files[0]); reader.onloadend = () => { this.fetchDataUrlImageSizes(String(reader.result)); this.exportToBlob(); }; - this.inTvalueFileName = actualImage.files[0].name; + this.intValueFileName = actualImage.files[0].name; } }, prepareImageEditor(e: Event) { const actualImage = this.$refs.actualImage as HTMLInputElement, imgEditor = this.$refs.imgEditor as HTMLImageElement, - self = this, createCropper = () => { - if (self.inTcropper) { - self.inTcropper.destroy(); + if (this.intCropper) { + this.intCropper.destroy(); } - self.inTcropper = new Cropper(imgEditor, self.cropperOption); + this.intCropper = new Cropper(imgEditor, this.cropperOption); }; if (!this.browseEvent) { if (!actualImage || !actualImage.files) { throw new Error("actualImage is not defined"); } - this.inToriginalFile = actualImage.files[0]; - this.inToriginalFileName = actualImage.files[0].name; + this.intOriginalFile = actualImage.files[0]; + this.intOriginalFileName = actualImage.files[0].name; imgEditor.src = URL.createObjectURL(actualImage.files[0]); this.previewStyleCompute(); @@ -814,7 +815,7 @@ export default defineComponent({ this.$nextTick(() => { fetch(this.value.replace(/^\/|^/, "/")) .then((response) => { - this.inToriginalFileName = response.url.substring( + this.intOriginalFileName = response.url.substring( response.url.lastIndexOf("/") + 1 ); return response.blob(); @@ -845,29 +846,28 @@ export default defineComponent({ return new Blob([u8arr], { type: mime[1] }); }, fetchDataUrlImageSizes(dataUrl: string) { - const img = new Image(), - self = this; + const img = new Image(); try { img.onload = () => { - self.inToriginalFileDimensions.width = img.width; - self.inToriginalFileDimensions.height = img.height; + this.intOriginalFileDimensions.width = img.width; + this.intOriginalFileDimensions.height = img.height; }; img.src = dataUrl; } catch (e) { - self.inToriginalFileDimensions.width = img.width; - self.inToriginalFileDimensions.height = img.height; + this.intOriginalFileDimensions.width = img.width; + this.intOriginalFileDimensions.height = img.height; } }, exportCropperFile() { - this.inThasModdedImage = true; - if (!this.inTcropper) { + this.intHasModdedImage = true; + if (!this.intCropper) { return; } - this.inTvalue = this.inTcropper + this.intValue = this.intCropper .getCroppedCanvas({ fillColor: "rgba(0, 0, 0, 0)", - width: this.inTwidth, - height: this.inTheight, + width: this.intWidth, + height: this.intHeight, imageSmoothingEnabled: true, imageSmoothingQuality: "high", }) @@ -875,22 +875,21 @@ export default defineComponent({ this.exportToBlob(); }, exportToBlob() { - const self = this, - actualImage = this.$refs.actualImage as HTMLInputElement, + const actualImage = this.$refs.actualImage as HTMLInputElement, container = new DataTransfer(); if (!actualImage.files) { throw new Error("2- missing files list"); } - this.fetchDataUrlImageSizes(self.inTvalue); + this.fetchDataUrlImageSizes(this.intValue); const file = new File( - [self.dataURLtoBlob(self.inTvalue)], - self.inToriginalFileName, + [this.dataURLtoBlob(this.intValue)], + this.intOriginalFileName, { type: "image/png", lastModified: new Date().getTime(), } ); - this.inToriginalFile = file; + this.intOriginalFile = file; this.$emit("imageFile", file); container.items.add(file); actualImage.files = container.files; @@ -916,7 +915,7 @@ export default defineComponent({ </script> <style lang="scss" scopped> -@import "~/cropperjs/dist/cropper.css"; +@import "cropperjs/dist/cropper.css"; .image-input-vue { /* Ensure the size of the image fit the container perfectly */ @@ -926,7 +925,7 @@ export default defineComponent({ /* This rule is very important, please don't ignore this */ max-width: 100%; } - .rotateButton { + .rotate-button { display: flex; flex-direction: column; } @@ -953,7 +952,7 @@ export default defineComponent({ direction: ltr !important; overflow: hidden !important; } - input.right-aligned:not(:focus) { + input.right-aligned :not(:focus) { direction: rtl !important; text-align: left !important; text-overflow: ellipsis !important; diff --git a/resources/ts/bo/components/InputTextAutoComponent.vue b/resources/ts/components/InputTextAutoComponent.vue similarity index 98% rename from resources/ts/bo/components/InputTextAutoComponent.vue rename to resources/ts/components/InputTextAutoComponent.vue index 92deebb..213f539 100644 --- a/resources/ts/bo/components/InputTextAutoComponent.vue +++ b/resources/ts/components/InputTextAutoComponent.vue @@ -19,7 +19,7 @@ <script lang="ts"> import { defineComponent, ref } from "vue"; -import trans from "../../modules/trans"; +import trans from "../modules/trans"; import WordCounter from "./WordCounterComponent.vue"; const textarea = ref<HTMLTextAreaElement | null>(null); diff --git a/resources/ts/bo/components/InstantWinComponent.vue b/resources/ts/components/InstantWinComponent.vue similarity index 97% rename from resources/ts/bo/components/InstantWinComponent.vue rename to resources/ts/components/InstantWinComponent.vue index 76fa2ff..abea4d4 100644 --- a/resources/ts/bo/components/InstantWinComponent.vue +++ b/resources/ts/components/InstantWinComponent.vue @@ -70,8 +70,8 @@ <script lang="ts"> import axios from "axios"; import { defineComponent } from "vue"; -import toast from "../../modules/toast"; -import trans from "../../modules/trans"; +import toast from "../modules/toast"; +import trans from "../modules/trans"; export default defineComponent({ mixins: [toast, trans], diff --git a/resources/ts/components/PasswordVisibility.vue b/resources/ts/components/PasswordVisibility.vue new file mode 100644 index 0000000..e965391 --- /dev/null +++ b/resources/ts/components/PasswordVisibility.vue @@ -0,0 +1,124 @@ +<template> + <div :class="`password-visibility-${inputId} h-100`"> + <span + v-if="visible" + class="text-bg-primary reveal d-flex justify-content-center align-items-center h-100" + @click.prevent="toggleVisibility()" + type="button" + :title="__('vue.PasswordVisibility.hide')" + data-bs="tooltip" + > + <FontAwesomeIcon + icon="fas fa-eye-slash" + :aria-hidden="true" + /> + </span> + <span + v-else + class="text-bg-primary reveal d-flex justify-content-center align-items-center h-100" + @click.prevent="toggleVisibility()" + type="button" + :title="__('vue.PasswordVisibility.show')" + data-bs="tooltip" + > + <FontAwesomeIcon + icon="fas fa-eye" + :aria-hidden="true" + /> + </span> + </div> +</template> + +<script lang="ts"> +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; +import { Tooltip } from "bootstrap"; +import { defineComponent } from "vue"; +import trans from "./../modules/trans"; + +export default defineComponent({ + name: "PasswordVisibility", + mixins: [trans], + components: { FontAwesomeIcon }, + data(): { + inputId: string; + input: HTMLInputElement; + visible: boolean; + tooltipList: HTMLButtonElement[]; + } { + return { + inputId: "", + input: document.createElement("input"), + visible: false, + tooltipList: [], + }; + }, + computed: {}, + mounted() { + const json = String(this.$attrs.json ?? "{}"), + data = JSON.parse(json); + this.inputId = data.inputId; + this.input = document.getElementById(this.inputId) as HTMLInputElement; + if (!this.input) { + throw new Error(`Cannot find input id '${this.inputId}'`); + } + if (this.input.tagName !== "INPUT") { + throw new Error(`id '${this.inputId}' is not an input`); + } + if ((this.input as HTMLInputElement).type !== "password") { + throw new Error(`id '${this.inputId}' is not an input password`); + } + this.input = this.input as HTMLInputElement; + this.$nextTick(() => { + this.updateBootstrapTooltip(); + }); + }, + methods: { + /** + * Update password status (visible, hidden). + */ + toggleVisibility(): void { + if (this.input.type === "password") { + this.input.type = "text"; + this.visible = true; + } else { + this.input.type = "password"; + this.visible = false; + } + this.$nextTick(() => { + this.updateBootstrapTooltip(); + }); + }, + /** + * Update Bootstrap tooltips. + */ + updateBootstrapTooltip() { + let newTooltipList = [].slice.call( + document.querySelectorAll( + ".password-visibility-" + this.inputId + " [data-bs=\"tooltip\"]" + ) + ) as HTMLButtonElement[]; + let tmp = newTooltipList.filter((x) => !this.tooltipList.includes(x)); + tmp.map((tooltip) => { + return new Tooltip(tooltip); + }); + this.closeBootstrapTooltip(); + this.tooltipList = newTooltipList; + }, + /** + * Close all Bootstrap tooltips. + */ + closeBootstrapTooltip() { + this.tooltipList.forEach((tooltip) => { + tooltip.blur(); + Tooltip.getInstance(tooltip)?.hide(); + }); + }, + }, +}); +</script> + +<style lang="scss"> +.reveal { + width: 52px; +} +</style> diff --git a/resources/ts/bo/components/WebCouponsComponent.vue b/resources/ts/components/WebCouponsComponent.vue similarity index 100% rename from resources/ts/bo/components/WebCouponsComponent.vue rename to resources/ts/components/WebCouponsComponent.vue diff --git a/resources/ts/bo/components/WinNotification.vue b/resources/ts/components/WinNotification.vue similarity index 100% rename from resources/ts/bo/components/WinNotification.vue rename to resources/ts/components/WinNotification.vue diff --git a/resources/ts/bo/components/WordCounterComponent.vue b/resources/ts/components/WordCounterComponent.vue similarity index 82% rename from resources/ts/bo/components/WordCounterComponent.vue rename to resources/ts/components/WordCounterComponent.vue index bdbd9ef..0b4182d 100644 --- a/resources/ts/bo/components/WordCounterComponent.vue +++ b/resources/ts/components/WordCounterComponent.vue @@ -1,21 +1,17 @@ <template> - <div class="word-counter-varchar"> - <span class="words"> - <u>{{ __("Mots") }}</u> -  :  - <b>{{ inTwords }}</b> + <div class="word-counter-varchar d-flex flex-row justify-content-around align-items-center w-100"> + <span> + {{ __("vue.WordCounterComponent.words") }} : <b>{{ inTwords }}</b> </span> - <span class="chars"> - <u>{{ __("Caractères") }}</u> -  :  - <b>{{ inTchars }}</b> + <span> + {{ __("vue.WordCounterComponent.characters") }} : <b>{{ inTchars }}</b> </span> </div> </template> <script lang="ts"> import { defineComponent } from "vue"; -import trans from "../../modules/trans"; +import trans from "../modules/trans"; export default defineComponent({ mixins: [trans], @@ -116,24 +112,11 @@ export default defineComponent({ border-radius: 0 0 0.375rem 0.375rem; } .word-counter-varchar { - display: inline-block; - color: initial; - border: 1px solid rgb(196, 196, 196); + color: var(--bs-body-color); + border: var(--bs-border-width) solid var(--bs-border-color); border-bottom: 0; - background-color: #fafafa; - position: relative; - width: 100%; + background-color: rgb(var(--bs-secondary-bg-rgb)); border-top-left-radius: 0.375rem; border-top-right-radius: 0.375rem; - - .words { - position: relative; - left: 2rem; - } - - .chars { - position: absolute; - left: 9rem; - } } </style> diff --git a/resources/ts/utilities/bootstrap.ts b/resources/ts/utilities/bootstrap.ts index 0cdbcf9..3457350 100644 --- a/resources/ts/utilities/bootstrap.ts +++ b/resources/ts/utilities/bootstrap.ts @@ -1,6 +1,6 @@ import axios from "axios"; import * as bootstrap from "bootstrap"; -import bsTooltips from "../modules/bsTooltips"; +import bsTooltips from "./../modules/bsTooltips"; /** * We'll load the axios HTTP library which allows us to easily issue requests diff --git a/resources/ts/utilities/fontawesome.ts b/resources/ts/utilities/fontawesome.ts index 1f33637..83f7ef5 100644 --- a/resources/ts/utilities/fontawesome.ts +++ b/resources/ts/utilities/fontawesome.ts @@ -1,5 +1,4 @@ import { config, dom, library } from "@fortawesome/fontawesome-svg-core"; -import { faCircleXmark, faCopy } from "@fortawesome/free-regular-svg-icons"; import { faArrowAltCircleDown, faArrowAltCircleUp, @@ -12,17 +11,25 @@ import { faArrowsAltH, faArrowsAltV, faBackspace, + faBan, faCheck, faChevronLeft, faChevronRight, + faCircleCheck, + faCircleExclamation, + faCircleInfo, faCircleNotch, + faCircleXmark, faCog, + faCopy, faCrop, faEraser, faEye, + faEyeSlash, faFileExport, faFolderOpen, faListUl, + faPaintRoller, faPencil, faPlus, faQuestionCircle, @@ -35,8 +42,7 @@ import { faTimes, faTrash, faUndoAlt, - faWandMagic, - faXmark, + faWandMagic } from "@fortawesome/free-solid-svg-icons"; config.autoReplaceSvg = false; @@ -45,6 +51,7 @@ library.add(faArrowLeftLong); library.add(faPlus); library.add(faTrash); library.add(faEye); +library.add(faEyeSlash); library.add(faFolderOpen); library.add(faCrop); library.add(faQuestionCircle); @@ -68,17 +75,21 @@ library.add(faSearch); library.add(faArrowRightFromBracket); library.add(faArrowAltCircleDown); library.add(faArrowAltCircleUp); -library.add(faXmark); -library.add(faFileExport); -library.add(faCog); +library.add(faCircleCheck); +library.add(faCircleXmark); library.add(faCopy); - -// Front +library.add(faListUl); +library.add(faBan); +library.add(faCircleExclamation); +library.add(faCircleInfo); +library.add(faPaintRoller); library.add(faChevronLeft); library.add(faChevronRight); library.add(faCircleXmark); library.add(faCircleNotch); library.add(faSliders); library.add(faListUl); +library.add(faCog); +library.add(faFileExport); dom.watch(); diff --git a/resources/ts/bo/utilities/vue-bo.ts b/resources/ts/utilities/vue-bo.ts similarity index 100% rename from resources/ts/bo/utilities/vue-bo.ts rename to resources/ts/utilities/vue-bo.ts diff --git a/resources/views/breadcrumbs/breadcrumb-body.blade.php b/resources/views/breadcrumbs/breadcrumb-body.blade.php deleted file mode 100644 index 2f17974..0000000 --- a/resources/views/breadcrumbs/breadcrumb-body.blade.php +++ /dev/null @@ -1,12 +0,0 @@ -@hasSection('breadcrumb') -@if(Breadcrumbs::exists(app()->view->getSections()['breadcrumb'])) -{{ call_user_func_array('Breadcrumbs::render', array_merge( - [app()->view->getSections()['breadcrumb']], - !empty($brParam) ? (is_array($brParam) ? $brParam : [$brParam]) : [] -)) }} -@endif -@elseif(request()->route() != null) -@if(Breadcrumbs::exists(request()->route()->getName())) -{{ Breadcrumbs::render(request()->route()->getName()) }} -@endif -@endif diff --git a/resources/views/breadcrumbs/breadcrumb-head.blade.php b/resources/views/breadcrumbs/breadcrumb-head.blade.php deleted file mode 100644 index b2d8502..0000000 --- a/resources/views/breadcrumbs/breadcrumb-head.blade.php +++ /dev/null @@ -1,9 +0,0 @@ -@hasSection('breadcrumb') -@if(Breadcrumbs::exists(app()->view->getSections()['breadcrumb'])) -{{ Breadcrumbs::view('breadcrumbs::json-ld', app()->view->getSections()['breadcrumb'], $brParam ?? null) }} -@endif -@elseif(request()->route() != null) -@if (Breadcrumbs::exists(request()->route()->getName())) -{{ Breadcrumbs::view('breadcrumbs::json-ld', request()->route()->getName()) }} -@endif -@endif diff --git a/resources/views/breadcrumbs/breadcrumb-layout.blade.php b/resources/views/breadcrumbs/breadcrumb-layout.blade.php deleted file mode 100644 index e9ff09d..0000000 --- a/resources/views/breadcrumbs/breadcrumb-layout.blade.php +++ /dev/null @@ -1,17 +0,0 @@ -@if (count($breadcrumbs)) -<ol class="breadcrumb flex-nowrap border-0 w-fit p-0 m-0"> - @foreach ($breadcrumbs as $breadcrumb) - @if ($breadcrumb->url && !$loop->last) - <li class="breadcrumb-item d-flex h2 fw-bold m-0"> - <a class="text-decoration-none text-secondary" href="{{ $breadcrumb->url }}"> - {{ $breadcrumb->title }} - </a> - </li> - @else - <li class="breadcrumb-item d-flex align-items-center flex-grow-1 text-dark h2 fw-bold active m-0"> - {{ $breadcrumb->title }} - </li> - @endif - @endforeach -</ol> -@endif diff --git a/resources/views/layout.blade.php b/resources/views/layout.blade.php index 5ed290a..c1b94e4 100644 --- a/resources/views/layout.blade.php +++ b/resources/views/layout.blade.php @@ -5,74 +5,37 @@ @include('back::layouts.head') </head> -<body class="position-relative min-vh-100"> - <nav class="navbar navbar-expand-md bg-light text-bg-light shadow-sm"> - <div class="container"> - <a class="navbar-brand rounded px-2 py-1" href="{{ url('/') }}"> - {{ config('app.name', 'Laravel') }} - </a> - <button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" type="button" - aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}"> - <span class="navbar-toggler-icon"></span> - </button> +<body + data-bs-theme="{{ (\App\Enums\Theme\BootstrapThemeEnum::make(intval(Cache::get('theme'))) ?? \App\Enums\Theme\BootstrapThemeEnum::light)->name() }}"> + <!-- Navigation --> + @include('back::layouts.header') - <div class="navbar-collapse collapse" id="navbarSupportedContent"> - <!-- Left Side Of Navbar --> - @include('back::layouts.nav-menu') - - <!-- Right Side Of Navbar --> - <ul class="navbar-nav ms-auto"> - <!-- Authentication Links --> - @guest('backend') - @if (Route::has('bo.login')) - <li class="nav-item"> - <a class="nav-link" href="{{ route('bo.login') }}">{{ __('Connexion') }}</a> - </li> - @endif - - @if (Route::has('bo.register')) - <li class="nav-item"> - <a class="nav-link" href="{{ route('bo.register') }}">{{ __('Créer un compte') }}</a> - </li> - @endif - @endguest - @auth('backend') - <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" id="navbarDropdown" data-bs-toggle="dropdown" href="#" role="button" - aria-haspopup="true" aria-expanded="false"> - {{ auth('backend')->user()->firstname }} {{ auth('backend')->user()->lastname }} <span - class="caret"></span> - </a> - - <div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown"> - <form class="text-center" action="{{ route('bo.logout') }}" method="POST"> - @csrf - <button class="btn btn-link text-decoration-none text-muted text-capitalize p-0" - type="submit">{{ __('Déconnexion') }}</button> - </form> - </div> - </li> - @endauth - </ul> + <!-- Main content --> + <main class="container-fluid"> + <div class="row justify-content-center p-3"> + <!-- Show a message when an action is performed --> + <div class="container"> + <div class="row justify-content-center"> + <div class="col-12 col-md-10 col-lg-8 px-2"> + @include('back::modules.flash-messages') + </div> + </div> </div> - </div> - </nav> - <main class="container-fluid @yield('bg-color') pb-5 pt-2"> - <div class="row justify-content-center"> - <div class="col col-md-6"> - @include('modules.flash-messages') - </div> - </div> - <div class="row p-md-3 justify-content-center"> - <div class="col-12 col-md-10 col-lg-8 p-md-0 pt-3"> - @yield('content') + <!-- Main content --> + <div class="row justify-content-center"> + <div class="col-12 col-md-10 col-lg-8 p-md-0 pt-3"> + @yield('content') + </div> </div> </div> </main> + + <!-- Footer --> @include('back::layouts.footer') - @stack('scripts-constants') + + <!-- Other --> @include('modules.script-routes') - @vite(['resources/ts/bo/bo.ts']) + @vite(['resources/ts/bo.ts']) @stack('scripts') </body> diff --git a/resources/views/layouts/footer.blade.php b/resources/views/layouts/footer.blade.php index 34e895d..15d04b5 100644 --- a/resources/views/layouts/footer.blade.php +++ b/resources/views/layouts/footer.blade.php @@ -1,8 +1,10 @@ -<footer id="footer" class="position-absolute bottom-0 w-100 text-center"> - <div class="text-center p-2 bg-light"> - <span class="text-reset">{{ $name }} - {{ $version }}</span> - - - <span class="text-reset fw-bold">UWIL</span> +<footer class="bg-body-secondary px-0 text-center" id="footer"> + <div class="p-2 text-center"> + @if (isset($cpsr_name) && isset($cpsr_version)) + <span class="text-reset">{{ $cpsr_name }} - {{ $cpsr_version }}</span> + <span>-</span> + @endif + <span class="text-reset fw-bold">{{ __('UWIL') }}</span> © {{ date('Y') }} </div> </footer> diff --git a/resources/views/layouts/head.blade.php b/resources/views/layouts/head.blade.php index e146bea..1aa5c70 100644 --- a/resources/views/layouts/head.blade.php +++ b/resources/views/layouts/head.blade.php @@ -9,33 +9,35 @@ <meta name="csrf-token" content="{{ csrf_token() }}"> @hasSection('canonical') -<link rel="canonical" href="@yield('canonical')" /> + <link href="@yield('canonical')" rel="canonical" /> @else -<link rel="canonical" href="{{ url()->current() }}" /> + <link href="{{ url()->current() }}" rel="canonical" /> @endif <!-- META INDEX, FOLLOW --> @hasSection('metaIndex') -<meta name="robots" content="@yield('metaIndex')"> + <meta name="robots" content="@yield('metaIndex')"> @else -<meta name="robots" content="index, follow"> + <meta name="robots" content="index, follow"> @endif <!-- Favicon --> {{-- GENERER favicon avec un outil https://realfavicongenerator.net/ --}} -<link rel="apple-touch-icon" sizes="180x180" href=""> -<link rel="icon" type="image/png" sizes="32x32" href=""> -<link rel="icon" type="image/png" sizes="16x16" href=""> -<link rel="manifest" href=""> -<link rel="mask-icon" href="" color="#5bbad5"> +<link href="" rel="apple-touch-icon" sizes="180x180"> +<link type="image/png" href="" rel="icon" sizes="32x32"> +<link type="image/png" href="" rel="icon" sizes="16x16"> +<link href="" rel="manifest"> +<link href="" rel="mask-icon" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff"> -@include('breadcrumbs.breadcrumb-head') +@include('modules.breadcrumbs.breadcrumb-head') <!-- STYLES --> -@vite(['resources/sass/bo/bo.scss']) +@vite(['resources/sass/bo.scss']) -@if(config('app.debug')) -<script nonce="{{ $nonce }}">window.vueDebug = true;</script> +@if (config('app.debug')) + <script nonce="{{ $nonce }}"> + window.vueDebug = true; + </script> @endif diff --git a/resources/views/layouts/header.blade.php b/resources/views/layouts/header.blade.php new file mode 100644 index 0000000..a300086 --- /dev/null +++ b/resources/views/layouts/header.blade.php @@ -0,0 +1,83 @@ +<nav class="navbar navbar-expand-lg position-fixed fixed-top bg-body-secondary shadow-sm" id="top-navbar"> + <div class="container"> + <a class="navbar-brand" data-bs-toggle="tooltip" data-bs-placement="bottom" href="{{ route('fo.homepage') }}" + title="{{ __('Accéder au front du projet') }}" target="_blank"> + {{ config('app.name', 'Laravel') }} + </a> + @auth + <button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" type="button" + aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}"> + <span class="navbar-toggler-icon"></span> + </button> + @endauth + + <div class="navbar-collapse collapse" id="navbarSupportedContent"> + <!-- Left Side Of Navbar --> + @include('back::layouts.nav-list') + + <!-- Right Side Of Navbar --> + <ul class="navbar-nav ms-auto"> + <!-- Bootstrap themes --> + <li class="nav-item dropdown @auth border-end @endauth"> + <button class="btn nav-link dropdown-toggle d-flex align-items-center h-100 flex-row border-0 pe-3" + data-bs-toggle="dropdown" type="button" aria-expanded="false"> + <i class="fa-solid fa-paint-roller"></i> + </button> + <form class="dropdown-menu dropdown-menu-end text-center" id="theme-selector" action="{{ route('bo.theme.set') }}" + method="POST"> + @push('scripts') + <script @if (!empty($nonce)) nonce="{{ $nonce }}" @endif> + document.addEventListener('DOMContentLoaded', function() { + const themeSelector = document.getElementById('theme-selector'); + if (themeSelector) { + themeSelector.addEventListener('change', function() { + this.submit(); + }); + } + }); + </script> + @endpush + @csrf + @php $theme = intval(Cache::get('theme')); @endphp + @foreach (\App\Enums\Theme\BootstrapThemeEnum::toArray() as $key => $bootstrapTheme) + <input class="d-none form-check-input" id="theme{{ $key }}" name="theme" type="radio" + value="{{ $bootstrapTheme->value }}"> + <label class="dropdown-item w-100 text-decoration-none @if ($bootstrapTheme->value === intval(Cache::get('theme'))) active @endif p-2" + for="theme{{ $key }}" role="button"> + {{ $bootstrapTheme->label }} + </label> + @endforeach + </form> + </li> + <!-- Authentication Links --> + @auth + <li class="nav-item dropdown"> + <button class="btn nav-link dropdown-toggle d-flex align-items-center h-100 flex-row border-0 ps-3" id="navbarDropdown" + data-bs-toggle="dropdown" type="button"> + <div class="d-flex flex-column align-items-end lh-1"> + <span + class="fw-bold">{{ auth('backend')->user()->first_name }} {{ auth('backend')->user()->last_name }}</span> + <small class="text-secondary-body">{{ auth('backend')->user()->role->label() }}</small> + </div> + </button> + <div class="dropdown-menu dropdown-menu-end m-0 text-center" aria-labelledby="navbarDropdown"> + <a class="dropdown-item w-100 text-decoration-none p-2" data-bs-toggle="tooltip" data-bs-placement="left" + href="{{ route('bo.users.edit',auth('backend')->user()->getKey()) }}" + title="{{ __('Accéder à son profile') }}"> + {{ __('Profile') }} + </a> + <hr class="dropdown-divider m-0"> + <form class="m-0 text-center" id="logout-form" action="{{ route('bo.logout') }}" method="POST"> + @csrf + <button class="dropdown-item w-100 text-decoration-none p-2" data-bs-toggle="tooltip" data-bs-placement="left" + type="submit" title="{{ __('Se déconnecter du back-office') }}"> + {{ __('Déconnexion') }} + </button> + </form> + </div> + </li> + @endauth + </ul> + </div> + </div> +</nav> diff --git a/resources/views/layouts/nav-list.blade.php b/resources/views/layouts/nav-list.blade.php new file mode 100644 index 0000000..7969996 --- /dev/null +++ b/resources/views/layouts/nav-list.blade.php @@ -0,0 +1,139 @@ +@auth('backend') + <ul class="navbar-nav me-auto"> + <li class="nav-item"> + <a class="nav-link @if (request()->routeIs('bo.dashboard')) active @endif" data-bs-toggle="tooltip" href="{{ route('bo.dashboard') }}" + title="{{ __('Revenir à l\'accueil') }}"> + {{ __('Accueil') }} + </a> + </li> + + @superadmin + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" id="navbarDropdownGame" data-bs-toggle="dropdown" href="#" role="button" + aria-haspopup="true" aria-expanded="false"> + {{ __('Gestion du jeu') }} <span class="caret"></span> + </a> + <ul class="dropdown-menu" aria-labelledby="navbarDropdownGame"> + <li> + <a class="dropdown-item" href="{{ route('bo.instant-win') }}">{{ __('Instant gagnants') }}</a> + </li> + <li> + <a class="dropdown-item" href="{{ route('bo.winners-list') }}">{{ __('Liste des gagnants') }}</a> + </li> + <li> + <a class="dropdown-item" href="{{ route('bo.bannedips.index') }}">{{ __('IP Bannies') }}</a> + </li> + <li> + <a class="dropdown-item" href="{{ route('bo.codes') }}">{{ __('Codes uniques') }}</a> + </li> + </ul> + </li> + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" id="navbarDropdownPrizes" data-bs-toggle="dropdown" href="#" role="button" + aria-haspopup="true" aria-expanded="false"> + {{ __('Lots') }} <span class="caret"></span> + </a> + <ul class="dropdown-menu" aria-labelledby="navbarDropdownPrizes"> + <li> + <a class="dropdown-item" href="{{ route('bo.prizes.index') }}">{{ __('Gérer les lots') }}</a> + </li> + <li> + <a class="dropdown-item" href="{{ route('bo.gain-views.index') }}">{{ __('Gérer les vues des lots') }}</a> + </li> + </ul> + </li> + @endsuperadmin + + @admin + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" id="navbarDropdownProducts" data-bs-toggle="dropdown" href="#" role="button" + aria-haspopup="true" aria-expanded="false"> + {{ __('Produits') }} <span class="caret"></span> + </a> + <ul class="dropdown-menu" aria-labelledby="navbarDropdownProducts"> + <li> + <a class="dropdown-item" href="{{ route('bo.ranges.index') }}">{{ __('Gammes') }}</a> + </li> + <li> + <a class="dropdown-item" href="{{ route('bo.products.index') }}">{{ __('Produits porteurs') }}</a> + </li> + </ul> + </li> + @endadmin + @superadmin + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" id="navbarDropdownContents" data-bs-toggle="dropdown" href="#" role="button" + aria-haspopup="true" aria-expanded="false"> + {{ __('Contenus') }} <span class="caret"></span> + </a> + <ul class="dropdown-menu" aria-labelledby="navbarDropdownContents"> + <li> + <a class="dropdown-item" + href="{{ route('bo.static_pages.edit', \App\Enums\StaticPageType::legals) }}">{{ __('Mentions légales') }}</a> + </li> + <li> + <a class="dropdown-item" + href="{{ route('bo.static_pages.edit', \App\Enums\StaticPageType::confidentiality) }}">{{ __('Charte') }}</a> + </li> + <li> + <a class="dropdown-item" + href="{{ route('bo.static_pages.edit', \App\Enums\StaticPageType::rules) }}">{{ __('Règlement') }}</a> + </li> + </ul> + </li> + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" id="navbarDropdownFaq" data-bs-toggle="dropdown" href="#" role="button" + aria-haspopup="true" aria-expanded="false"> + {{ __('FAQ') }} <span class="caret"></span> + </a> + <ul class="dropdown-menu" aria-labelledby="navbarDropdownFaq"> + <li> + <a class="dropdown-item" href="{{ route('bo.faq-themes.index') }}">{{ __('Thèmes') }}</a> + </li> + <li> + <a class="dropdown-item" href="{{ route('bo.faq-questions.index') }}">{{ __('Questions') }}</a> + </li> + </ul> + </li> + @endsuperadmin + + @canAny(['isConceptor', 'viewAny'], \App\Models\User::class) + <li class="nav-item"> + <div class="dropdown"> + <a class="nav-link @if (request()->routeIs('bo.users.*') || request()->routeIs('bo.activity_logs.*')) active @endif dropdown-toggle" data-bs-toggle="dropdown" type="button" + aria-expanded="false"> + {{ __('Avancé') }} + </a> + <ol class="dropdown-menu"> + @can('viewAny', \App\Models\User::class) + <li> + <a class="dropdown-item @if (request()->routeIs('bo.users.*')) active @endif" data-bs-toggle="tooltip" + href="{{ route('bo.users.index') }}" + title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.user'))]) }}"> + {{ Str::of(__('models.classes.user'))->plural()->ucfirst() }} + </a> + </li> + @endcan + + @can('isConceptor') + <li class="nav-item"> + <a class="nav-link @if (request()->routeIs('bo.settings.*')) active @endif" data-bs-toggle="tooltip" + href="{{ route('bo.settings.edit', \App\Models\Settings::first()) }}" + title="{{ __('models.classes.settings') }}"> + {{ __('models.classes.settings') }} + </a> + </li> + <li> + <a class="dropdown-item @if (request()->routeIs('bo.activity_logs.*')) active @endif" data-bs-toggle="tooltip" + href="{{ route('bo.activity_logs.index') }}" + title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.activity_log', '*')]) }}"> + {{ Str::of(trans_choice('models.classes.activity_log', '*'))->ucfirst() }} + </a> + </li> + @endcan + </ol> + </a> + </li> + @endcan + </ul> +@endauth diff --git a/resources/views/layouts/nav-menu.blade.php b/resources/views/layouts/nav-menu.blade.php deleted file mode 100644 index 6f73fd0..0000000 --- a/resources/views/layouts/nav-menu.blade.php +++ /dev/null @@ -1,103 +0,0 @@ -@auth('backend') - <ul class="navbar-nav me-auto"> - <li class="nav-item"> - <a class="nav-link @if(request()->routeIs('bo.dashboard')) active @endif" - href="{{ route('bo.dashboard') }}" - title="{{ __('Revenir à l\'accueil') }}" - data-bs-toggle="tooltip"> - {{ __('Dashboard') }} - </a> - </li> - @superadmin - <li class="nav-item"> - <a class="nav-link @if(request()->routeIs('bo.settings.*')) active @endif" - href="{{ route('bo.settings.edit', \App\Models\Settings::first()) }}" - title="{{ __('models.classes.settings') }}" - data-bs-toggle="tooltip"> - {{ __('models.classes.settings') }} - </a> - </li> - <li class="nav-item dropdown"> - <a id="navbarDropdownGame" class="nav-link dropdown-toggle" href="#" role="button" - data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - {{ __('Gestion du jeu') }} <span class="caret"></span> - </a> - <ul class="dropdown-menu" aria-labelledby="navbarDropdownGame"> - <li> - <a class="dropdown-item" href="{{ route('bo.instant-win') }}">{{ __('Instant gagnants') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{ route('bo.winners-list') }}">{{ __('Liste des gagnants') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{ route('bo.bannedips.index') }}">{{ __('IP Bannies') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{ route('bo.codes') }}">{{ __('Codes uniques') }}</a> - </li> - </ul> - </li> - <li class="nav-item dropdown"> - <a id="navbarDropdownPrizes" class="nav-link dropdown-toggle" href="#" role="button" - data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - {{ __('Lots') }} <span class="caret"></span> - </a> - <ul class="dropdown-menu" aria-labelledby="navbarDropdownPrizes"> - <li> - <a class="dropdown-item" href="{{route('bo.prizes.index')}}">{{ __('Gérer les lots') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{route('bo.gain-views.index')}}">{{ __('Gérer les vues des lots') }}</a> - </li> - </ul> - </li> - @endsuperadmin - <li class="nav-item dropdown"> - <a id="navbarDropdownProducts" class="nav-link dropdown-toggle" href="#" role="button" - data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - {{ __('Produits') }} <span class="caret"></span> - </a> - <ul class="dropdown-menu" aria-labelledby="navbarDropdownProducts"> - <li> - <a class="dropdown-item" href="{{ route('bo.ranges.index') }}">{{ __('Gammes') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{route('bo.products.index')}}">{{ __('Produits porteurs') }}</a> - </li> - </ul> - </li> - @superadmin - <li class="nav-item dropdown"> - <a id="navbarDropdownContents" class="nav-link dropdown-toggle" href="#" role="button" - data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - {{ __('Contenus') }} <span class="caret"></span> - </a> - <ul class="dropdown-menu" aria-labelledby="navbarDropdownContents"> - <li> - <a class="dropdown-item" href="{{route('bo.contents.edit', 1)}}">{{ __('Mentions légales') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{route('bo.contents.edit', 2)}}">{{ __('Charte') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{route('bo.contents.edit', 3)}}">{{ __('Règlement') }}</a> - </li> - </ul> - </li> - <li class="nav-item dropdown"> - <a id="navbarDropdownFaq" class="nav-link dropdown-toggle" href="#" role="button" - data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - {{ __('FAQ') }} <span class="caret"></span> - </a> - <ul class="dropdown-menu" aria-labelledby="navbarDropdownFaq"> - <li> - <a class="dropdown-item" href="{{route('bo.faq-themes.index')}}">{{ __('Thèmes') }}</a> - </li> - <li> - <a class="dropdown-item" href="{{route('bo.faq-questions.index')}}">{{ __('Questions') }}</a> - </li> - </ul> - </li> - @endsuperadmin - </ul> -@endauth diff --git a/resources/views/modules/breadcrumbs/breadcrumb-body.blade.php b/resources/views/modules/breadcrumbs/breadcrumb-body.blade.php new file mode 100644 index 0000000..51b36a8 --- /dev/null +++ b/resources/views/modules/breadcrumbs/breadcrumb-body.blade.php @@ -0,0 +1,7 @@ +@hasSection('breadcrumb') + @if (Breadcrumbs::exists(app()->view->getSections()['breadcrumb'])) + {{ call_user_func_array('Breadcrumbs::render', array_merge([app()->view->getSections()['breadcrumb']], Arr::wrap($brParam))) }} + @endif +@elseif(Breadcrumbs::exists(request()->route()->getName())) + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endif diff --git a/resources/views/modules/breadcrumbs/breadcrumb-head.blade.php b/resources/views/modules/breadcrumbs/breadcrumb-head.blade.php new file mode 100644 index 0000000..ac3e053 --- /dev/null +++ b/resources/views/modules/breadcrumbs/breadcrumb-head.blade.php @@ -0,0 +1,10 @@ +@hasSection('breadcrumb') + @if (Breadcrumbs::exists(app()->view->getSections()['breadcrumb'])) + {{ call_user_func_array( + 'Breadcrumbs::view', + array_merge(['breadcrumbs::json-ld', app()->view->getSections()['breadcrumb']], Arr::wrap($brParam)), + ) }} + @endif +@elseif(Breadcrumbs::exists(request()->route()->getName())) + {{ Breadcrumbs::view('breadcrumbs::json-ld',request()->route()->getName()) }} +@endif diff --git a/resources/views/modules/breadcrumbs/breadcrumb-layout.blade.php b/resources/views/modules/breadcrumbs/breadcrumb-layout.blade.php new file mode 100644 index 0000000..e1b07cd --- /dev/null +++ b/resources/views/modules/breadcrumbs/breadcrumb-layout.blade.php @@ -0,0 +1,17 @@ +@if (count($breadcrumbs)) + <ol class="breadcrumb justify-content-center w-100 m-0"> + @foreach ($breadcrumbs as $breadcrumb) + @if ($breadcrumb->url && !$loop->last) + <li class="breadcrumb-item d-flex"> + <a class="h2 fw-bold m-0 ps-2" href="{{ $breadcrumb->url }}"> + {{ $breadcrumb->title }} + </a> + </li> + @else + <li class="breadcrumb-item btn-games d-flex align-items-center flex-grow-1 active h2 fw-bold m-0"> + {{ $breadcrumb->title }} + </li> + @endif + @endforeach + </ol> +@endif diff --git a/resources/views/modules/change-model-order.blade.php b/resources/views/modules/change-model-order.blade.php new file mode 100644 index 0000000..a76ed7c --- /dev/null +++ b/resources/views/modules/change-model-order.blade.php @@ -0,0 +1,32 @@ +<td class="text-center align-middle"> + @can('changeOrder', $model) + <div class="d-flex justify-content-center align-items-center"> + <form class="@if ($loop->first and $models->onFirstPage()) invisible @endif" + action="{{ route('bo.' . $routeName . '.change-order', [Str::singular($routeName) => $model, 'direction' => 'up']) }}" + method="POST" + > + @csrf + @method('PATCH') + <button class="btn btn-sm btn-outline-secondary @if ($loop->first and $models->onFirstPage()) disabled @endif" data-bs-toggle="tooltip" + type="submit" title="{{ __('crud.other.up') }}"> + <i class="fas fa-arrow-up"></i> + </button> + </form> + <form class="@if ($loop->last and $models->currentPage() === $models->lastPage()) invisible @endif" + action="{{ route('bo.' . $routeName . '.change-order', [Str::singular($routeName) => $model, 'direction' => 'down']) }}" + method="POST" + > + @csrf + @method('PATCH') + <button class="btn btn-sm btn-outline-secondary @if ($loop->last and $models->currentPage() === $models->lastPage()) disabled @endif ms-1" data-bs-toggle="tooltip" + type="submit" title="{{ __('crud.other.down') }}"> + <i class="fas fa-arrow-down"></i> + </button> + </form> + </div> + @else + <span class="text-danger" data-bs-toggle="tooltip" title="{{ __('crud.other.right') }}"> + <i class="fa-solid fa-ban"></i> + </span> + @endcan +</td> diff --git a/resources/views/modules/change-published-status.blade.php b/resources/views/modules/change-published-status.blade.php new file mode 100644 index 0000000..3322e5a --- /dev/null +++ b/resources/views/modules/change-published-status.blade.php @@ -0,0 +1,20 @@ +<td class="text-center align-middle"> + @can('changePublished', $model) + <form action="{{ route('bo.' . $routeName . '.change-published', $model->getRouteKey()) }}" method="POST"> + @csrf + @method('PATCH') + <button class="btn btn-sm @if ($model->published) btn-primary @else btn-danger @endif" data-bs-toggle="tooltip" + type="submit" title="{{ __($model->published ? __('crud.other.unpublish') : __('crud.other.publish')) }}"> + @if ($model->published) + <i class="fa-solid fa-circle-check"></i> + @else + <i class="fa-solid fa-circle-xmark"></i> + @endif + </button> + </form> + @else + <span class="text-danger" data-bs-toggle="tooltip" title="{{ __('crud.other.right') }}"> + <i class="fa-solid fa-ban"></i> + </span> + @endcan +</td> diff --git a/resources/views/modules/pagination.blade.php b/resources/views/modules/pagination.blade.php index 687ca1b..5ce1e6b 100644 --- a/resources/views/modules/pagination.blade.php +++ b/resources/views/modules/pagination.blade.php @@ -1,140 +1,114 @@ -<?php - // Get actual pagination. - $pagination = (Cache::get('pagination')) ? intval(Cache::get('pagination')) : config('pagination.default'); - // Get actual request parameters. - $queryString = ""; - if (!array_key_exists("page", request()->all())) { - foreach (request()->all() as $key => $value) { - if($key != "page" && $key != "pagination" && $key != "search") { - $queryString .= "&" . $key . "=" . $value; - } - } - } -?> -@if($paginator->items()) -<nav class="pagination-custom d-flex flex-column flex-md-row justify-content-between align-items-center"> - {{-- SELECT ITEMS PER PAGE --}} - <div class="dropup-center dropup d-flex justify-content-center align-items-center w-fit input-group mb-3 m-md-0"> - <span class="btn-md input-group-text" - data-bs-toggle="tooltip" - data-bs-placement="top" - title="{{ __('crud.pagination.paginate_list') }}"> - <i class="fa-solid fa-list-ul"></i> - </span> - <button class="btn btn-primary dropdown-toggle" - type="button" - data-bs-toggle="dropdown" - aria-expanded="false"> - {{ $pagination }} - </button> - <ul class="dropdown-menu"> - @foreach (\App\Enums\ItemsPerPaginationEnum::toArray() as $itemsPerPaginationEnum) - <li> - <a class="dropdown-item text-center user-select-none @if($pagination === $itemsPerPaginationEnum->value) active @endif" - href="{{ request()->fullUrlWithQuery(['page' => 1, 'pagination' => $itemsPerPaginationEnum->value]) . $queryString }}" - role="button"> - {{ $itemsPerPaginationEnum->value }} - </a> - </li> - @endforeach - </ul> - </div> - @if ($paginator->hasPages()) - {{-- PAGINATION --}} - <div class="d-flex justify-content-end align-items-center"> - <ul class="pagination m-0"> - {{-- PREVIOUS PAGE --}} - <li class="page-item @if ($paginator->onFirstPage()) disabled @endif"> - <a class="page-link d-flex align-items-center h-100" - data-bs-toggle="tooltip" - data-bs-placement="top" - title="{{ __('crud.pagination.previous') }}" - @if (!$paginator->onFirstPage()) - href="{{ request()->fullUrlWithQuery(['page' => $paginator->currentPage() - 1]) . $queryString }}" - @endif - rel="prev" - aria-label="@lang('crud.pagination.previous')" - @if ($paginator->onFirstPage()) aria-hidden="true" disabled @endif> - <i class="fa-solid fa-chevron-left fa-2xs mt-1"></i> - </a> - </li> - {{-- FIRST PAGE --}} - @if($paginator->currentPage() > 3) - <li class="page-item" - data-bs-toggle="tooltip" - data-bs-placement="top" - title="{{ __('crud.pagination.specific_page', ['id' => 1]) }}"> - <a class="page-link" href="{{ request()->fullUrlWithQuery(['page' => 1]) . $queryString }}">1</a> - </li> - @endif - {{-- HIDE PAGES TOO FAR --}} - @if($paginator->currentPage() > 4) - <li class="page-item disabled"><span class="page-link">...</span></li> - @endif - {{-- SHOW ACTUAL PAGES + N-2/N+2 --}} - @foreach(range(1, $paginator->lastPage()) as $i) - @if($i >= $paginator->currentPage() - 2 && $i <= $paginator->currentPage() + 2) - @if ($i == $paginator->currentPage()) - <li class="page-item"> - <div class="dropup-center dropup"> - <button class="btn btn-primary dropdown-toggle rounded-0" - type="button" - data-bs-toggle="dropdown" - aria-expanded="false"> - {{ $i }} - </button> - <ul class="dropdown-menu"> - @for ($i = 1; $i <= $paginator->lastPage(); $i++) - <li> - <a class="dropdown-item text-center user-select-none @if($paginator->currentPage() === $i) active @endif" - href="{{ request()->fullUrlWithQuery(['page' => $i]) . $queryString }}" - role="button"> - {{ $i }} - </a> +{{-- GET ACTUAL PAGINATION --}} +@php + $pagination = intval( + Cache::get( + 'pagination.' . + \Illuminate\Support\Str::slug( + request() + ->route() + ->getName(), + ), + ), + ); +@endphp +@if ($paginator->items()) + <nav class="pagination-custom d-flex justify-content-between align-items-center"> + {{-- SELECT ITEMS PER PAGE --}} + <div class="dropup-center d-flex justify-content-center align-items-center input-group w-fit"> + <span class="btn-md input-group-text" data-bs-toggle="tooltip" title="{{ __('pagination.paginate_list') }}"> + <i class="fa-solid fa-list-ul"></i> + </span> + <button class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" type="button" aria-expanded="false"> + {{ $pagination }} + </button> + <ul class="dropdown-menu"> + @foreach (\App\Enums\Pagination\ItemsPerPaginationEnum::toArray() as $itemsPerPaginationEnum) + <li> + <a class="dropdown-item user-select-none @if ($pagination === $itemsPerPaginationEnum->value) active @endif text-center" + href="{{ request()->fullUrlWithQuery(['page' => 1, 'pagination' => $itemsPerPaginationEnum->value]) }}" + role="button"> + {{ $itemsPerPaginationEnum->value }} + </a> + </li> + @endforeach + </ul> + </div> + @if ($paginator->hasPages()) + {{-- PAGINATION --}} + <div class="d-flex justify-content-end align-items-center"> + <ul class="pagination m-0"> + {{-- PREVIOUS PAGE --}} + <li class="page-item @if ($paginator->onFirstPage()) disabled @endif"> + <a class="page-link d-flex align-items-center h-100" data-bs-toggle="tooltip" + title="{{ __('pagination.previous_page') }}" aria-label="{{ __('pagination.previous_page') }}" + @if (!$paginator->onFirstPage()) href="{{ request()->fullUrlWithQuery(['page' => $paginator->currentPage() - 1]) }}" @endif + rel="prev" @if ($paginator->onFirstPage()) aria-hidden="true" disabled @endif> + <i class="fa-solid fa-chevron-left fa-2xs mt-1"></i> + </a> + </li> + {{-- FIRST PAGE --}} + @if ($paginator->currentPage() > 3) + <li class="page-item d-none d-sm-block" data-bs-toggle="tooltip" + title="{{ __('pagination.specific_page', ['id' => 1]) }}"> + <a class="page-link" href="{{ request()->fullUrlWithQuery(['page' => 1]) }}">1</a> </li> - @endfor - </ul> - </div> - </li> - @else - <li class="page-item d-none d-sm-block" - data-bs-toggle="tooltip" - data-bs-placement="top" - title="{{ __('crud.pagination.specific_page', ['id' => $i]) }}"> - <a class="page-link" href="{{ request()->fullUrlWithQuery(['page' => $i]) . $queryString }}">{{ $i }}</a> - </li> - @endif - @endif - @endforeach - {{-- HIDE PAGES TOO FAR --}} - @if($paginator->currentPage() < $paginator->lastPage() - 3) - <li class="page-item disabled"><span class="page-link">...</span></li> - @endif - {{-- LAST PAGE --}} - @if($paginator->currentPage() < $paginator->lastPage() - 2) - <li class="page-item" - data-bs-toggle="tooltip" - data-bs-placement="top" - title="{{ __('crud.pagination.specific_page', ['id' => $paginator->lastPage()]) }}"> - <a class="page-link" href="{{ request()->fullUrlWithQuery(['page' => $paginator->lastPage()]) . $queryString }}">{{ $paginator->lastPage() }}</a> - </li> - @endif - {{-- NEXT PAGE --}} - <li class="page-item @if (!$paginator->hasMorePages()) disabled @endif"> - <a class="page-link d-flex align-items-center h-100" - data-bs-toggle="tooltip" - data-bs-placement="top" - title="{{ __('crud.pagination.next') }}" - @if ($paginator->hasMorePages()) - href="{{ request()->fullUrlWithQuery(['page' => $paginator->currentPage() + 1]) . $queryString }}" @endif - rel="next" - aria-label="@lang('crud.pagination.next')" - @if (!$paginator->hasMorePages()) aria-hidden="true" disabled @endif> - <i class="fa-solid fa-chevron-right fa-2xs mt-1"></i></a> - </li> - </ul> - </div> - @endif -</nav> + {{-- HIDE PAGES TOO FAR --}} + @if ($paginator->currentPage() > 4) + <li class="page-item d-none d-sm-block disabled"><span class="page-link">...</span></li> + @endif + {{-- SHOW ACTUAL PAGES + N-2/N+2 --}} + @foreach (range(1, $paginator->lastPage()) as $i) + @if ($i >= $paginator->currentPage() - 2 && $i <= $paginator->currentPage() + 2) + @if ($i == $paginator->currentPage()) + <li class="page-item"> + <div class="dropup-center"> + <button class="btn btn-primary dropdown-toggle rounded-0" data-bs-toggle="dropdown" type="button" + aria-expanded="false"> + {{ $i }} + </button> + <ul class="dropdown-menu"> + @for ($i = 1; $i <= $paginator->lastPage(); $i++) + <li> + <a class="dropdown-item user-select-none @if ($paginator->currentPage() === $i) active @endif text-center" + href="{{ request()->fullUrlWithQuery(['page' => $i]) }}" role="button"> + {{ $i }} + </a> + </li> + @endfor + </ul> + </div> + </li> + @else + <li class="page-item d-none d-md-block" data-bs-toggle="tooltip" + title="{{ __('pagination.specific_page', ['id' => $i]) }}"> + <a class="page-link" href="{{ request()->fullUrlWithQuery(['page' => $i]) }}">{{ $i }}</a> + </li> + @endif + @endif + @endforeach + {{-- HIDE PAGES TOO FAR --}} + @if ($paginator->currentPage() < $paginator->lastPage() - 3) + <li class="page-item d-none d-sm-block disabled"><span class="page-link">...</span></li> + @endif + {{-- LAST PAGE --}} + @if ($paginator->currentPage() < $paginator->lastPage() - 2) + <li class="page-item d-none d-sm-block" data-bs-toggle="tooltip" + title="{{ __('pagination.specific_page', ['id' => $paginator->lastPage()]) }}"> + <a class="page-link" + href="{{ request()->fullUrlWithQuery(['page' => $paginator->lastPage()]) }}">{{ $paginator->lastPage() }}</a> + </li> + @endif + {{-- NEXT PAGE --}} + <li class="page-item @if (!$paginator->hasMorePages()) disabled @endif"> + <a class="page-link d-flex align-items-center h-100" data-bs-toggle="tooltip" + title="{{ __('pagination.next_page') }}" aria-label="{{ __('pagination.next_page') }}" + @if ($paginator->hasMorePages()) href="{{ request()->fullUrlWithQuery(['page' => $paginator->currentPage() + 1]) }}" @endif + rel="next" @if (!$paginator->hasMorePages()) aria-hidden="true" disabled @endif> + <i class="fa-solid fa-chevron-right fa-2xs mt-1"></i></a> + </li> + </ul> + </div> + @endif + </nav> @endif diff --git a/resources/views/modules/search-bar.blade.php b/resources/views/modules/search-bar.blade.php index 8cb21e1..f8f7c62 100644 --- a/resources/views/modules/search-bar.blade.php +++ b/resources/views/modules/search-bar.blade.php @@ -1,44 +1,46 @@ @php $iArgs = []; - if(request()->sort_col) { + if (request()->sort_col) { $iArgs['sort_col'] = request()->sort_col; } - if(request()->search) { + if (request()->search) { $iArgs['search'] = request()->sort_way; } @endphp -<div class="row my-3"> +<div class="row mb-3"> <div class="col-12"> <form id="searchForm" action="/{{ request()->path() }}"> - <div class="input-group"> + <div class="input-group pt-3"> <label class="input-group-text" for="searchField">{{ $searchFields }}</label> - @if(request()->sort_col) - <input class="d-none" type="text" name="sort_col" value="{{ request()->sort_col }}"> + @if (request()->sort_col) + <input class="d-none" name="sort_col" type="text" value="{{ request()->sort_col }}"> @endif - @if(request()->sort_way) - <input class="d-none" type="text" name="sort_way" value="{{ request()->sort_way }}"> + @if (request()->sort_way) + <input class="d-none" name="sort_way" type="text" value="{{ request()->sort_way }}"> @endif - @if(request()->rangefilter) - <input class="d-none" type="text" name="rangefilter" value="{{ request()->rangefilter }}"> + @if (request()->rangefilter) + <input class="d-none" name="rangefilter" type="text" value="{{ request()->rangefilter }}"> @endif - @if(request()->group) - <input class="d-none" type="text" name="group" value="{{ request()->group }}"> + @if (request()->group) + <input class="d-none" name="group" type="text" value="{{ request()->group }}"> @endif - <input type="search" id="searchField" name="search" class="form-control" value="{{ request()->search }}" placeholder="{{ __('Your keywords here...') }}"/> - <button type="submit" class="btn btn-primary" data-bs-toggle="tooltip" title="{{ __('Start search') }}"> + <input class="form-control" id="searchField" name="search" type="search" value="{{ request()->search }}" + placeholder="{{ __('crud.other.search_placeholder') }}" /> + <button class="btn btn-primary" data-bs-toggle="tooltip" type="submit" title="{{ __('crud.other.search_start') }}"> <i class="fas fa-search"></i> </button> - <button id="searchDelete" type="button" class="btn btn-danger" data-bs-toggle="tooltip" title="{{ __('Delete search') }}"> + <button class="btn btn-danger" id="searchDelete" data-bs-toggle="tooltip" type="button" + title="{{ __('crud.other.search_delete') }}"> <i class="fas fa-backspace"></i> </button> @push('scripts') - <script nonce="{{ $nonce }}"> - document.getElementById('searchDelete').addEventListener('click', function (e) { - document.getElementById('searchField').value = ''; - document.getElementById('searchForm').submit(); - }); - </script> + <script nonce="{{ $nonce }}"> + document.getElementById('searchDelete').addEventListener('click', function(e) { + document.getElementById('searchField').value = ''; + document.getElementById('searchForm').submit(); + }); + </script> @endpush </div> </form> diff --git a/resources/views/modules/table-col-sorter.blade.php b/resources/views/modules/table-col-sorter.blade.php index 6bae966..fcf00bb 100644 --- a/resources/views/modules/table-col-sorter.blade.php +++ b/resources/views/modules/table-col-sorter.blade.php @@ -1,73 +1,76 @@ @php -$route = request()->route(); -$routeName = $route->getName(); -$rst = !is_null(request()->rst) || !Session::has("$routeName.sorted"); -$noOrder = !empty($noOrder); -$noOrder = $noOrder || (Session::get("$routeName.sort_col") !== 'order' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way"))); -$noOrder = $noOrder || !empty(request()->search); -$ignore = (isset($ignore) and is_array($ignore)) ? $ignore : []; + $route = request()->route(); + $routeName = $route->getName(); + $rst = !is_null(request()->rst) || !Session::has("$routeName.sorted"); + $noOrder = !empty($noOrder); + $noOrder = $noOrder || (Session::get("$routeName.sort_col") !== 'order' and (Session::has("$routeName.sort_col") or Session::has("$routeName.sort_way"))); + $noOrder = $noOrder || !empty(request()->search); + $ignore = (isset($ignore) and is_array($ignore)) ? $ignore : []; @endphp -<tr class="table-col-sorter"> - @foreach($cols as $col => $colname) - @php - $iArgs = ['sort_col' => $col]; - if(request()->search) { - $iArgs['search'] = request()->search; - } - @endphp - {{-- NO Sort for order column --}} - @if($col === 'order' or in_array($col, $ignore)) - @if($noOrder and !in_array($col, $ignore)) @continue @endif - <th scope="col" class="text-center h-100 @if(isset($mobileHide) and is_array($mobileHide) and in_array($col, $mobileHide)) d-none d-md-table-cell @endif"> - <div class="d-flex justify-content-center align-items-center h-100"> - <span class="text-nowrap">{{ $colname }}</span> - </div> - </th> - @continue - @endif - <th scope="col" class="text-center h-100 @if(isset($mobileHide) and is_array($mobileHide) and in_array($col, $mobileHide)) d-none d-md-table-cell @endif"> - <div class="d-flex justify-content-center align-items-center h-100"> - <span class="text-nowrap"> - {{ $colname }} - </span> - @if(!session("$routeName.sort_way") or session("$routeName.sort_col") !== $col or (session("$routeName.sort_way") === 'desc' and session("$routeName.sort_col") === $col)) - <a class="text-decoration-none ms-1" - href="{{ request()->fullUrlWithQuery(array_merge($iArgs, ['sort_way' => 'asc', 'rst' => null])) }}"> - <button - class="btn btn-sm btn-outline-dark" - title="{{ __('crud.other.sort_descending', ['name' => Str::lower($colname)]) }}" - data-bs-toggle="tooltip"> - <i class="fas fa-arrow-down 2xs"></i> - </button> - </a> +<tr class="table-col-sorter border-start-0 border-end-0 border-top-0 border-dark border border-2"> + @foreach ($cols as $col => $colname) + @php + $iArgs = ['sort_col' => $col]; + if (request()->search) { + $iArgs['search'] = request()->search; + } + @endphp + {{-- NO Sort for order column --}} + @if ($col === 'order' or in_array($col, $ignore)) + @if ($noOrder and !in_array($col, $ignore)) + @continue @endif - @if(!session("$routeName.sort_way") or session("$routeName.sort_col") !== $col or (session("$routeName.sort_way") === 'asc' and session("$routeName.sort_col") === $col)) - <a class="text-decoration-none ms-1" - href="{{ request()->fullUrlWithQuery(array_merge($iArgs, ['sort_way' => 'desc', 'rst' => null])) }}"> - <button - class="btn btn-sm btn-outline-dark" - title="{{ __('crud.other.sort_ascending', ['name' => Str::lower($colname)]) }}" - data-bs-toggle="tooltip"> - <i class="fas fa-arrow-up 2xs"></i> - </button> - </a> - @endif - </div> - </th> + <th class="h-100 @if (isset($mobileHide) and is_array($mobileHide) and in_array($col, $mobileHide)) d-none d-md-table-cell @endif text-center" scope="col"> + <div class="d-flex justify-content-center align-items-center h-100"> + <span class="text-nowrap">{{ $colname }}</span> + </div> + </th> + @continue + @endif + <th class="h-100 @if (isset($mobileHide) and is_array($mobileHide) and in_array($col, $mobileHide)) d-none d-md-table-cell @endif text-center" scope="col"> + <div class="d-flex justify-content-center align-items-center h-100"> + <span class="text-nowrap"> + {{ $colname }} + </span> + @if ( + !session("$routeName.sort_way") or + session("$routeName.sort_col") !== $col or + session("$routeName.sort_way") === 'desc' and session("$routeName.sort_col") === $col) + <a class="text-decoration-none ms-1" + href="{{ request()->fullUrlWithQuery(array_merge($iArgs, ['sort_way' => 'asc', 'rst' => null])) }}"> + <button class="btn btn-sm btn-outline-secondary" data-bs-toggle="tooltip" + title="{{ __('crud.other.sort_descending', ['name' => Str::lower($colname)]) }}"> + <i class="fas fa-arrow-down 2xs"></i> + </button> + </a> + @endif + @if ( + !session("$routeName.sort_way") or + session("$routeName.sort_col") !== $col or + session("$routeName.sort_way") === 'asc' and session("$routeName.sort_col") === $col) + <a class="text-decoration-none ms-1" + href="{{ request()->fullUrlWithQuery(array_merge($iArgs, ['sort_way' => 'desc', 'rst' => null])) }}"> + <button class="btn btn-sm btn-outline-secondary" data-bs-toggle="tooltip" + title="{{ __('crud.other.sort_ascending', ['name' => Str::lower($colname)]) }}"> + <i class="fas fa-arrow-up 2xs"></i> + </button> + </a> + @endif + </div> + </th> @endforeach {{-- Buttons Col --}} - <th scope="col" class="text-end"> - @if(!$rst) - <a class="btn btn-sm btn-danger" - href="{{ request()->fullUrlWithQuery(['sort_col' => null, 'sort_way' => null, 'rst' => true, 'search' => null]) }}" - data-bs-toggle="tooltip" - title="{{ __('crud.other.sort_delete') }}"> - <i class="fa fa-eraser"></i> - </a> + <th class="text-end" scope="col"> + @if (!$rst) + <a class="btn btn-sm btn-danger" data-bs-toggle="tooltip" + href="{{ request()->fullUrlWithQuery(['sort_col' => null, 'sort_way' => null, 'rst' => true, 'search' => null]) }}" + title="{{ __('crud.other.sort_delete') }}"> + <i class="fa fa-eraser"></i> + </a> @else - <span data-bs-toggle="tooltip" data-bs-placement="top" title="{{ __('crud.other.sort_arrow') }}"> - <i class="fas fa-question-circle"></i> - </span> + <span data-bs-toggle="tooltip" title="{{ __('crud.other.sort_arrow') }}"> + <i class="fas fa-question-circle"></i> + </span> @endif </th> </tr> diff --git a/resources/views/pages/activity_logs/index-list.blade.php b/resources/views/pages/activity_logs/index-list.blade.php new file mode 100644 index 0000000..cb1e0a4 --- /dev/null +++ b/resources/views/pages/activity_logs/index-list.blade.php @@ -0,0 +1,72 @@ +<table class="table-hover table-fix-action m-0 table"> + @if (count($activitylogModels) > 0) + <thead> + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'event' => Str::ucfirst(__('validation.custom.event')), + 'user' => Str::ucfirst(__('models.classes.user')), + 'model' => Str::ucfirst(__('validation.custom.model')), + 'created_at' => Str::ucfirst(__('validation.attributes.created_at')), + ], + ]) + </thead> + <tbody> + @foreach ($activitylogModels as $activitylogModel) + <tr class="border-bottom list-item"> + <td + class="bg-{{ $activitylogModel->event->bootstrapClass() }}-subtle text-{{ $activitylogModel->event->bootstrapClass() }}-emphasis text-center align-middle"> + {{ $activitylogModel->event->label() }} + </td> + <td class="bg-{{ $activitylogModel->event->bootstrapClass() }}-subtle text-center align-middle"> + @if (isset($activitylogModel->user)) + <a class="btn btn-sm btn-primary text-decoration-none" data-bs-toggle="tooltip" + href="{{ route('bo.users.edit', $activitylogModel->user) }}" + title="{{ __('crud.helpers.view_model', ['model' => __('models.classes.user')]) }}"> + {{ $activitylogModel->user->last_name }} {{ $activitylogModel->user->first_name }} + </a> + @elseif($activitylogModel->is_console) + {{ __('Utilisateur dans la console') }} + @elseif($activitylogModel->is_anonymous) + {{ __('Utilisateur anonyme') }} + @else + {{ __('Utilisateur supprimé') }} + @endif + </td> + @php + $targetModel = $activitylogModel->model_class::where((new $activitylogModel->model_class())->getRouteKeyName(), $activitylogModel->model_id)->first(); + $editRouteName = 'bo.' . optional($targetModel)->getTable() . '.edit'; + @endphp + <td class="bg-{{ $activitylogModel->event->bootstrapClass() }}-subtle text-center align-middle"> + @if (!empty($targetModel) and Route::has($editRouteName)) + <a class="btn btn-sm btn-primary text-decoration-none" data-bs-toggle="tooltip" + href="{{ route($editRouteName, $activitylogModel->model_id) }}" + title="{{ __('crud.helpers.view_model', ['model' => __('models.classes.' . Str::singular($targetModel->getTable()))]) }}"> + @endif + {{ $activitylogModel->model_class }} + @if (!empty($targetModel) and Route::has($editRouteName)) + </a> + @endif + </td> + <td class="bg-{{ $activitylogModel->event->bootstrapClass() }}-subtle text-center align-middle"> + <span class="badge bg-secondary"> + {{ $activitylogModel->created_at->isoFormat('LLLL') }} + </span> + </td> + <td class="text-end align-middle"> + @can('isConceptor') + <a class="btn btn-sm btn-warning" data-bs-toggle="tooltip" + href="{{ route('bo.activity_logs.show', ['activity_log' => $activitylogModel]) }}" + title="{{ Str::ucfirst(__('crud.actions.view')) }}"> + <i class="fa-solid fa-eye"></i> + </a> + @endcan + </td> + </tr> + @endforeach + </tbody> + @else + <tr> + <td class="border-0">{{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.activity_log', 1)]) }}</td> + </tr> + @endif +</table> diff --git a/resources/views/pages/activity_logs/index.blade.php b/resources/views/pages/activity_logs/index.blade.php new file mode 100644 index 0000000..a7eb42a --- /dev/null +++ b/resources/views/pages/activity_logs/index.blade.php @@ -0,0 +1,15 @@ +@extends('back::layout') + +@section('title', Str::ucfirst(trans_choice('models.classes.activity_log', '*'))) +@section('description', __('Liste de tous les :model', ['model' => trans_choice('models.classes.activity_log', '*')])) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> + @include('modules.breadcrumbs.breadcrumb-body') + </div> + @include('back::modules.search-bar') + <div class="table-responsive mb-3"> + @include('back::pages.activity_logs.index-list') + </div> + {{ $activitylogModels->links() }} +@endsection diff --git a/resources/views/pages/activity_logs/show.blade.php b/resources/views/pages/activity_logs/show.blade.php new file mode 100644 index 0000000..27b33b8 --- /dev/null +++ b/resources/views/pages/activity_logs/show.blade.php @@ -0,0 +1,121 @@ +@extends('back::layout', ['brParam' => $activitylogModel]) + +@section('title', __('Édition d\'un :model', ['model' => __('models.classes.activity_log')])) +@section('description', __('Édition d\'un :model déjà existant', ['model' => __('models.classes.activity_log')])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3"> + <div class="d-flex align-items-start flex-row"> + <a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.activity_logs.index') }}" + title="{{ __('crud.helpers.list_all', ['model' => trans_choice(__('models.classes.activity_log'), '*')]) }}"> + <i class="fa-solid fa-arrow-left"></i> + </a> + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $activitylogModel]) + </div> + </div> + <div class="row"> + <div class="col-12 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Informations principales') }}</legend> + <div class="row"> + <div class="col-12"> + <div class="table-responsive mb-3"> + <table class="table-hover m-0 table"> + <tbody> + <tr class="border-bottom"> + <td class="w-50 fw-bold text-center align-middle">{{ __('Auteur') }}</td> + <td class="w-50 text-center align-middle"> + @if (isset($activitylogModel->user)) + <a class="btn btn-sm btn-primary" data-bs-toggle="tooltip" + href="{{ route('bo.users.edit', $activitylogModel->user) }}" + title="{{ __('crud.helpers.view_model', ['model' => __('models.classes.user')]) }}"> + {{ $activitylogModel->user->last_name }} {{ $activitylogModel->user->first_name }} + </a> + @elseif($activitylogModel->is_console) + {{ __('Utilisateur dans la console') }} + @elseif($activitylogModel->is_anonymous) + {{ __('Utilisateur anonyme') }} + @else + {{ __('Utilisateur supprimé') }} + @endif + </td> + </tr> + <tr class="border-bottom"> + <td class="w-50 fw-bold text-center align-middle">{{ __('Évènement') }}</td> + <td class="w-50 text-center align-middle"> + <span + class="text-{{ $activitylogModel->event->bootstrapClass() }}-emphasis bg-{{ $activitylogModel->event->bootstrapClass() }}-subtle border-{{ $activitylogModel->event->bootstrapClass() }}-subtle rounded-3 border p-1"> + {{ $activitylogModel->event->label() }} + </span> + </td> + </tr> + <tr class="border-bottom"> + <td class="w-50 fw-bold text-center align-middle">{{ __('Élément ciblé') }}</td> + <td class="w-50 text-center align-middle"> + @php + $editRouteName = 'bo.' . optional($targetModel)->getTable() . '.edit'; + @endphp + @if (isset($targetModel) and Route::has($editRouteName)) + <a class="btn btn-sm btn-primary" data-bs-toggle="tooltip" + href="{{ route($editRouteName, $activitylogModel->model_id) }}" + title="{{ __('crud.helpers.view_model', ['model' => __('models.classes.' . Str::singular($targetModel->getTable()))]) }}"> + @endif + {{ $activitylogModel->model_class }} + @if (isset($targetModel) and Route::has($editRouteName)) + </a> + @endif + </td> + </tr> + <tr class="border-bottom"> + <td class="w-50 fw-bold text-center align-middle">{{ __('Réalisé le') }}</td> + <td class="w-50 text-center align-middle"> + <span class="badge bg-secondary">{{ $activitylogModel->created_at }}</span> + </td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </fieldset> + </div> + @if (isset($activitylogModel->data)) + <div class="col-12 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Modifications apportées') }}</legend> + <div class="row"> + <div class="col-12"> + <div class="table-responsive mb-3"> + <table class="table-hover m-0 table"> + <thead> + <tr class="table-col-sorter border-start-0 border-end-0 border-top-0 border-dark border border-2"> + <td class="w-50 fw-bold text-center align-middle">{{ __('Column') }}</td> + <td class="fw-bold text-center align-middle"> + <i class="fa-solid fa-arrow-right"></i> + </td> + <td class="w-50 fw-bold text-center align-middle">{{ __('Type') }}</td> + </tr> + </thead> + <tbody> + @foreach ($activitylogModel->data as $key => $dataType) + <tr class="border-bottom"> + <td class="fw-bold text-center align-middle">{{ $key }}</td> + <td class="fw-bold text-center align-middle"> + <i class="fa-solid fa-arrow-right"></i> + </td> + <td class="w-25 text-center align-middle"> + {{ $dataType }} + </td> + </tr> + @endforeach + </table> + </div> + </div> + </div> + </fieldset> + </div> + @endif + </div> +@endsection diff --git a/resources/views/pages/banned-ips/create.blade.php b/resources/views/pages/banned-ips/create.blade.php index faecdc5..d4c9154 100644 --- a/resources/views/pages/banned-ips/create.blade.php +++ b/resources/views/pages/banned-ips/create.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.bannedips.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.bannedips')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $bannedipModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $bannedipModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/banned-ips/edit.blade.php b/resources/views/pages/banned-ips/edit.blade.php index c515b90..d126441 100644 --- a/resources/views/pages/banned-ips/edit.blade.php +++ b/resources/views/pages/banned-ips/edit.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.bannedips.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.bannedips')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $bannedipModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $bannedipModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.bannedips.destroy', $bannedipModel->id) }}" method="POST"> diff --git a/resources/views/pages/banned-ips/form-inputs.blade.php b/resources/views/pages/banned-ips/form-inputs.blade.php index b8c6dda..4b9f715 100644 --- a/resources/views/pages/banned-ips/form-inputs.blade.php +++ b/resources/views/pages/banned-ips/form-inputs.blade.php @@ -1,14 +1,14 @@ <div class="row"> {{-- IP --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.ip')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.ip')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.varchar', [ 'id' => 'bannedipIp', 'label' => __(':field à bannir', [ - 'field' => Str::ucfirst(__('validation.attributes.ip')), + 'field' => Str::ucfirst(__('validation.custom.ip')), ]), 'hasWordCounter' => true, 'name' => 'ip', @@ -16,11 +16,11 @@ 'model' => $bannedipModel ?? null, 'helper' => __('validation.ip', [ 'attribute' => __(':field à bannir', [ - 'field' => Str::ucfirst(__('validation.attributes.ip')), + 'field' => Str::ucfirst(__('validation.custom.ip')), ]), ]), 'placeholder' => __(':field à bannir', [ - 'field' => Str::ucfirst(__('validation.attributes.ip')), + 'field' => Str::ucfirst(__('validation.custom.ip')), ]), ]) </div> diff --git a/resources/views/pages/banned-ips/index.blade.php b/resources/views/pages/banned-ips/index.blade.php index 9c80305..30f6ed7 100644 --- a/resources/views/pages/banned-ips/index.blade.php +++ b/resources/views/pages/banned-ips/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.bannedips.create') }}" title="{{ __('crud.helpers.create_model', ['model' => Str::singular(__('models.classes.bannedips'))]) }}"> <i class="fa-solid fa-plus"></i> @@ -17,7 +17,7 @@ <thead> @include('back::modules.table-col-sorter', [ 'cols' => [ - 'ip' => Str::ucfirst(__('validation.attributes.ip')), + 'ip' => Str::ucfirst(__('validation.custom.ip')), ], ]) </thead> diff --git a/resources/views/pages/codes/form-inputs.blade.php b/resources/views/pages/codes/form-inputs.blade.php index b3261b4..748385a 100644 --- a/resources/views/pages/codes/form-inputs.blade.php +++ b/resources/views/pages/codes/form-inputs.blade.php @@ -1,21 +1,21 @@ <div class="row"> {{-- QUANTITY --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ __('Nombre de codes à générer') }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'codeGenerationQuantity', 'label' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.quantity')), + 'field' => Str::ucfirst(__('validation.custom.quantity')), ]), 'name' => 'quantity', 'required' => true, 'model' => null, 'helper' => __('validation.min.numeric', [ 'attribute' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.quantity')), + 'field' => Str::ucfirst(__('validation.custom.quantity')), ]), 'min' => 1, ]), @@ -27,14 +27,14 @@ </div> {{-- CODE_LENGTH --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ __('Longueur des codes') }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'codeGenerationLength', 'label' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.code_length')), + 'field' => Str::ucfirst(__('validation.custom.code_length')), ]), 'name' => 'code_length', 'required' => true, @@ -43,7 +43,7 @@ 'model' => null, 'helper' => __('validation.min.numeric', [ 'attribute' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.code_length')), + 'field' => Str::ucfirst(__('validation.custom.code_length')), ]), 'min' => 1, ]), diff --git a/resources/views/pages/codes/index.blade.php b/resources/views/pages/codes/index.blade.php index de97f41..14615b3 100644 --- a/resources/views/pages/codes/index.blade.php +++ b/resources/views/pages/codes/index.blade.php @@ -3,7 +3,7 @@ @section('content') @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center mb-3 flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <button class="btn btn-success float-right" data-bs-toggle="modal" data-bs-target="#exportModal" type="button"> <i class="fas fa-file-export"></i> {{ __('Export') }} </button> diff --git a/resources/views/pages/codes/search.blade.php b/resources/views/pages/codes/search.blade.php index cefa536..f22951a 100644 --- a/resources/views/pages/codes/search.blade.php +++ b/resources/views/pages/codes/search.blade.php @@ -2,7 +2,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center mb-3 flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') </div> @include('back::pages.codes.search-form') <hr> diff --git a/resources/views/pages/contents/edit.blade.php b/resources/views/pages/contents/edit.blade.php deleted file mode 100644 index c39e83b..0000000 --- a/resources/views/pages/contents/edit.blade.php +++ /dev/null @@ -1,41 +0,0 @@ -@extends('back::layout', ['brParam' => $contentModel]) - -@section('title', __('Édition d\'une :model', ['model' => Str::singular(__('models.classes.contents'))])) -@section('description', __('Édition d\'une :model déjà existante', ['model' => Str::singular(__('models.classes.contents'))])) -@section('breadcrumb', - request()->route()->getName()) - -@section('content') - <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3"> - <div class="d-flex align-items-start flex-row"> - <a class="btn btn-primary text-decoration-none m-0 me-2" data-bs-toggle="tooltip" data-bs-placement="top" - href="{{ route('bo.contents.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.contents')]) }}"> - <i class="fa-solid fa-arrow-left"></i> - </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $contentModel]) - </div> - <div class="mb-md-0 mb-2"> - <form action="{{ route('bo.contents.update', $contentModel->id) }}" method="POST"> - @csrf - @method('PUT') - <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" - title="{{ __('crud.helpers.save_model', ['model' => Str::singular(__('models.classes.contents'))]) }}"> - {{ __('crud.actions.save') }} - </button> - </form> - </div> - </div> - <form action="{{ route('bo.contents.update', $contentModel->id) }}" method="POST" enctype="multipart/form-data"> - @csrf - @method('PUT') - @include('back::pages.contents.form-inputs') - <div class="row"> - <div class="col text-center"> - <button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" - title="{{ __('crud.helpers.save_model', ['model' => Str::singular(__('models.classes.contents'))]) }}"> - {{ __('crud.actions.save') }} - </button> - </div> - </div> - </form> -@endsection diff --git a/resources/views/pages/contents/form-inputs.blade.php b/resources/views/pages/contents/form-inputs.blade.php deleted file mode 100644 index e87e937..0000000 --- a/resources/views/pages/contents/form-inputs.blade.php +++ /dev/null @@ -1,39 +0,0 @@ -<div class="row"> - {{-- VALUE --}} - <div class="col-12 mb-3"> - <fieldset class="border bg-white p-3"> - <legend>{{ __('Texte') }}</legend> - <div class="row"> - <div class="col-12"> - @include('back::partials.inputs.text-html', [ - 'id' => 'contentValue', - 'label' => __(':field du :model', [ - 'field' => Str::ucfirst(__('validation.attributes.value')), - 'model' => Str::singular(__('models.classes.contents')), - ]), - 'name' => 'value', - 'model' => $contentModel ?? null, - 'required' => true, - 'helper' => __('crud.minicrud.text_warning', [ - 'number' => 15, - ]), - ]) - </div> - </div> - </fieldset> - </div> -</div> - -@push('scripts') - <script> - document.addEventListener("DOMContentLoaded", () => { - // Submit button clone. - const submit = document.getElementById('formSubmit') - submitClone = document.getElementById('formSubmitClone'); - submitClone.addEventListener('click', (event) => { - event.preventDefault(); - submit.click(''); - }) - }); - </script> -@endpush diff --git a/resources/views/pages/contents/index.blade.php b/resources/views/pages/contents/index.blade.php deleted file mode 100644 index 7a5d5eb..0000000 --- a/resources/views/pages/contents/index.blade.php +++ /dev/null @@ -1,43 +0,0 @@ -@extends('back::layout') - -@section('title', __('models.classes.contents')) -@section('description', __('Liste de tous les :model', ['model' => __('models.classes.contents')])) - -@section('content') - <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') - </div> - @include('back::modules.search-bar') - <table class="table-hover table"> - @if (count($contentModels) > 0) - <thead> - @include('back::modules.table-col-sorter', [ - 'cols' => [ - 'key' => Str::ucfirst(__('validation.attributes.name')), - 'value' => Str::ucfirst(__('validation.attributes.value')), - ], - ]) - </thead> - <tbody> - @foreach ($contentModels as $contentModel) - <tr class="border-bottom list-item"> - <td class="text-center align-middle">{{ $contentModel->key }}</td> - <td class="text-center align-middle">{!! Str::limit($contentModel->value, 150, '...') !!}</td> - <td class="text-end align-middle"> - <a class="btn btn-sm btn-primary" data-bs-toggle="tooltip" data-bs-placement="top" - href="{{ route('bo.contents.edit', ['content' => $contentModel->id]) }}" title="{{ __('crud.actions.update') }}"> - <i class="fa-solid fa-pencil"></i> - </a> - </td> - </tr> - @endforeach - </tbody> - @else - <tr> - <td class="fw-bold border-0 text-center"> - {{ __('crud.other.no_model_found', ['model' => Str::singular(__('models.classes.contents'))]) }}</td> - </tr> - @endif - </table> - {!! $contentModels->links() !!} -@endsection diff --git a/resources/views/pages/dashboard/index.blade.php b/resources/views/pages/dashboard/index.blade.php index 8af4ebf..9c1d1bc 100644 --- a/resources/views/pages/dashboard/index.blade.php +++ b/resources/views/pages/dashboard/index.blade.php @@ -3,7 +3,7 @@ @section('content') <div class="d-flex justify-content-between"> <h2>{{ __('Dashboard') }}</h2> - <a class="btn btn-primary text-decoration-none m-0 me-2" href="{{ route('fo.home') }}"> + <a class="btn btn-primary text-decoration-none m-0 me-2" href="{{ route('fo.homepage') }}"> {{ __('Accéder au jeu') }} </a> </div> diff --git a/resources/views/pages/faq-questions/create.blade.php b/resources/views/pages/faq-questions/create.blade.php index 32eccc9..af9e027 100644 --- a/resources/views/pages/faq-questions/create.blade.php +++ b/resources/views/pages/faq-questions/create.blade.php @@ -13,7 +13,7 @@ title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.faq-questions', 2)]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/faq-questions/edit.blade.php b/resources/views/pages/faq-questions/edit.blade.php index aa87fb2..9f551ef 100644 --- a/resources/views/pages/faq-questions/edit.blade.php +++ b/resources/views/pages/faq-questions/edit.blade.php @@ -13,7 +13,7 @@ title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.faq-questions', 2)]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.faq-questions.destroy', $faqQuestionModel->id) }}" method="POST"> diff --git a/resources/views/pages/faq-questions/form-inputs.blade.php b/resources/views/pages/faq-questions/form-inputs.blade.php index 3d3b68d..c883955 100644 --- a/resources/views/pages/faq-questions/form-inputs.blade.php +++ b/resources/views/pages/faq-questions/form-inputs.blade.php @@ -1,14 +1,14 @@ <div class="row"> {{-- QUESTION --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.question')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.question')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.varchar', [ 'id' => 'faqQuestionQuestion', 'label' => __(':field à intégrer à la faq', [ - 'field' => Str::ucfirst(__('validation.attributes.question')), + 'field' => Str::ucfirst(__('validation.custom.question')), ]), 'hasWordCounter' => true, 'name' => 'question', @@ -16,13 +16,13 @@ 'model' => $faqQuestionModel ?? null, 'helper' => __('validation.between.string', [ 'attribute' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.question')), + 'field' => Str::ucfirst(__('validation.custom.question')), ]), 'min' => 3, 'max' => 255, ]), 'placeholder' => __(':field à intégrer à la faq', [ - 'field' => Str::ucfirst(__('validation.attributes.question')), + 'field' => Str::ucfirst(__('validation.custom.question')), ]), ]) </div> @@ -31,8 +31,8 @@ </div> {{-- ANSWER --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.question')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.question')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.varchar', [ @@ -61,7 +61,7 @@ </div> {{-- THEME_ID --}} <div class="col-12 col-md-6 pb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ __('Thème') }}</legend> <div class="row"> <div class="col-12"> diff --git a/resources/views/pages/faq-questions/index.blade.php b/resources/views/pages/faq-questions/index.blade.php index 7a04579..9633488 100644 --- a/resources/views/pages/faq-questions/index.blade.php +++ b/resources/views/pages/faq-questions/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.faq-questions.create') }}" title="{{ __('crud.helpers.create_model', ['model' => trans_choice('models.classes.faq-questions', 1)]) }}"> <i class="fa-solid fa-plus"></i> @@ -17,7 +17,7 @@ <thead> @include('back::modules.table-col-sorter', [ 'cols' => [ - 'question' => Str::ucfirst(__('validation.attributes.question')), + 'question' => Str::ucfirst(__('validation.custom.question')), 'answer' => Str::ucfirst(__('validation.attributes.answer')), 'theme_id' => Str::ucfirst(__('validation.attributes.theme')), ], diff --git a/resources/views/pages/faq-themes/create.blade.php b/resources/views/pages/faq-themes/create.blade.php index 853e8ab..e17cc5e 100644 --- a/resources/views/pages/faq-themes/create.blade.php +++ b/resources/views/pages/faq-themes/create.blade.php @@ -13,7 +13,7 @@ title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.faq-themes', 2)]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/faq-themes/edit.blade.php b/resources/views/pages/faq-themes/edit.blade.php index 9d0cb9d..8d2ac9c 100644 --- a/resources/views/pages/faq-themes/edit.blade.php +++ b/resources/views/pages/faq-themes/edit.blade.php @@ -13,7 +13,7 @@ title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.faq-themes', 2)]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.faq-themes.destroy', $faqThemeModel->id) }}" method="POST"> diff --git a/resources/views/pages/faq-themes/form-inputs.blade.php b/resources/views/pages/faq-themes/form-inputs.blade.php index bccd087..6b48b7d 100644 --- a/resources/views/pages/faq-themes/form-inputs.blade.php +++ b/resources/views/pages/faq-themes/form-inputs.blade.php @@ -1,7 +1,7 @@ <div class="row"> {{-- NAME --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.name')) }}</legend> <div class="row"> <div class="col-12"> @@ -17,7 +17,7 @@ 'model' => $faqThemeModel ?? null, 'helper' => __('validation.between.string', [ 'attribute' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.question')), + 'field' => Str::ucfirst(__('validation.custom.question')), ]), 'min' => 3, 'max' => 255, diff --git a/resources/views/pages/faq-themes/index.blade.php b/resources/views/pages/faq-themes/index.blade.php index 484deff..9ea841b 100644 --- a/resources/views/pages/faq-themes/index.blade.php +++ b/resources/views/pages/faq-themes/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.faq-themes.create') }}" title="{{ __('crud.helpers.create_model', ['model' => trans_choice('models.classes.faq-themes', 1)]) }}"> <i class="fa-solid fa-plus"></i> diff --git a/resources/views/pages/gain-views/create.blade.php b/resources/views/pages/gain-views/create.blade.php index c720f73..6db163f 100644 --- a/resources/views/pages/gain-views/create.blade.php +++ b/resources/views/pages/gain-views/create.blade.php @@ -13,7 +13,7 @@ title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.gain-views', 2)]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/gain-views/edit.blade.php b/resources/views/pages/gain-views/edit.blade.php index dbe7d5b..2eaa7c3 100644 --- a/resources/views/pages/gain-views/edit.blade.php +++ b/resources/views/pages/gain-views/edit.blade.php @@ -13,7 +13,7 @@ title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.gain-views', 2)]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $gainViewModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.gain-views.destroy', $gainViewModel->id) }}" method="POST"> diff --git a/resources/views/pages/gain-views/form-inputs.blade.php b/resources/views/pages/gain-views/form-inputs.blade.php index f2d6e7a..1e250c8 100644 --- a/resources/views/pages/gain-views/form-inputs.blade.php +++ b/resources/views/pages/gain-views/form-inputs.blade.php @@ -1,7 +1,7 @@ <div class="row"> {{-- NAME --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.name')) }}</legend> <div class="row"> <div class="col-12"> @@ -31,7 +31,7 @@ </div> {{-- FILE_NAME --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.file_name')) }}</legend> <div class="row"> <div class="col-12"> diff --git a/resources/views/pages/gain-views/index.blade.php b/resources/views/pages/gain-views/index.blade.php index 8094ebd..d9cb312 100644 --- a/resources/views/pages/gain-views/index.blade.php +++ b/resources/views/pages/gain-views/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.gain-views.create') }}" title="{{ __('crud.helpers.create_model', ['model' => trans_choice('models.classes.gain-views', 1)]) }}"> <i class="fa-solid fa-plus"></i> diff --git a/resources/views/pages/prizes/create.blade.php b/resources/views/pages/prizes/create.blade.php index 1f44914..5534d33 100644 --- a/resources/views/pages/prizes/create.blade.php +++ b/resources/views/pages/prizes/create.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.prizes.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.prizes')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/prizes/edit.blade.php b/resources/views/pages/prizes/edit.blade.php index 4aa4ad5..d42ac58 100644 --- a/resources/views/pages/prizes/edit.blade.php +++ b/resources/views/pages/prizes/edit.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.prizes.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.prizes')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $prizeModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.prizes.destroy', $prizeModel->id) }}" method="POST"> diff --git a/resources/views/pages/prizes/form-inputs.blade.php b/resources/views/pages/prizes/form-inputs.blade.php index 3656e69..924a58d 100644 --- a/resources/views/pages/prizes/form-inputs.blade.php +++ b/resources/views/pages/prizes/form-inputs.blade.php @@ -1,7 +1,7 @@ <div class="row"> {{-- LABEL_ONE --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.label_one')) }}</legend> <div class="row"> <div class="col-12"> @@ -32,7 +32,7 @@ </div> {{-- LABEL_MANY --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.label_many')) }}</legend> <div class="row"> <div class="col-12"> @@ -63,7 +63,7 @@ </div> {{-- ARG --}} <div class="col-12 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.arg')) }}</legend> <div class="row"> {{-- ARG_TITLE --}} @@ -134,21 +134,21 @@ </div> {{-- QUANTITY --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.quantity')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.quantity')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'prizeQuantity', 'label' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.quantity')), + 'field' => Str::ucfirst(__('validation.custom.quantity')), ]), 'name' => 'quantity', 'required' => true, 'model' => $prizeModel ?? null, 'helper' => __('validation.min.numeric', [ 'attribute' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.quantity')), + 'field' => Str::ucfirst(__('validation.custom.quantity')), ]), 'min' => 1, ]), @@ -160,7 +160,7 @@ </div> {{-- PDF_WINNING_PROOF --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.pdf_winning_proof')) }}</legend> <div class="row"> <div class="col-12"> @@ -186,7 +186,7 @@ </div> {{-- NEED_PROOF --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.need_proof')) }}</legend> <div class="row"> <div class="col-12"> @@ -210,7 +210,7 @@ </div> {{-- GAIN_VIEW_ID --}} <div class="col-12 col-md-6 pb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ trans_choice('models.classes.gain-views', 1) }}</legend> <div class="row"> <div class="col-12"> diff --git a/resources/views/pages/prizes/index.blade.php b/resources/views/pages/prizes/index.blade.php index 8b914aa..8d633ea 100644 --- a/resources/views/pages/prizes/index.blade.php +++ b/resources/views/pages/prizes/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.prizes.create') }}" title="{{ __('crud.helpers.create_model', ['model' => Str::singular(__('models.classes.prizes'))]) }}"> <i class="fa-solid fa-plus"></i> @@ -18,7 +18,7 @@ @include('back::modules.table-col-sorter', [ 'cols' => [ 'label_one' => Str::ucfirst(__('validation.attributes.label_one')), - 'quantity' => Str::ucfirst(__('validation.attributes.quantity')), + 'quantity' => Str::ucfirst(__('validation.custom.quantity')), 'need_proof' => Str::ucfirst(__('validation.attributes.need_proof')), 'gain_view_id' => Str::ucfirst(trans_choice('models.classes.gain-views', 1)), ], diff --git a/resources/views/pages/products/create.blade.php b/resources/views/pages/products/create.blade.php index 9ed636e..b2f0c67 100644 --- a/resources/views/pages/products/create.blade.php +++ b/resources/views/pages/products/create.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.products.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.products')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/products/edit.blade.php b/resources/views/pages/products/edit.blade.php index 0aff1d8..e4d68c4 100644 --- a/resources/views/pages/products/edit.blade.php +++ b/resources/views/pages/products/edit.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.products.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.products')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $productModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.products.destroy', $productModel->id) }}" method="POST"> diff --git a/resources/views/pages/products/form-inputs.blade.php b/resources/views/pages/products/form-inputs.blade.php index c2cc30c..7911569 100644 --- a/resources/views/pages/products/form-inputs.blade.php +++ b/resources/views/pages/products/form-inputs.blade.php @@ -1,7 +1,7 @@ <div class="row"> {{-- NAME --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.name')) }}</legend> <div class="row"> <div class="col-12"> @@ -32,7 +32,7 @@ </div> {{-- NO_ART --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.no_art')) }}</legend> <div class="row"> <div class="col-12"> @@ -58,7 +58,7 @@ </div> {{-- PICTURE --}} <div class="col-12 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.picture')) }}</legend> <div class="row"> <div class="col-12"> @@ -85,7 +85,7 @@ </div> {{-- CODE_EAN --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.ean_code')) }}</legend> <div class="row"> <div class="col-12"> @@ -112,7 +112,7 @@ </div> {{-- RANGE_ID --}} <div class="col-12 col-md-6 pb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ trans_choice('models.classes.gain-views', 1) }}</legend> <div class="row"> <div class="col-12"> diff --git a/resources/views/pages/products/index.blade.php b/resources/views/pages/products/index.blade.php index fa58852..74bfb3d 100644 --- a/resources/views/pages/products/index.blade.php +++ b/resources/views/pages/products/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.products.create') }}" title="{{ __('crud.helpers.create_model', ['model' => Str::singular(__('models.classes.products'))]) }}"> <i class="fa-solid fa-plus"></i> diff --git a/resources/views/pages/ranges/create.blade.php b/resources/views/pages/ranges/create.blade.php index 976f3a6..ad4eb93 100644 --- a/resources/views/pages/ranges/create.blade.php +++ b/resources/views/pages/ranges/create.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.ranges.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.ranges')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) </div> <div class="mb-md-0 mb-2"> <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" data-bs-placement="top" type="submit" diff --git a/resources/views/pages/ranges/edit.blade.php b/resources/views/pages/ranges/edit.blade.php index 0516ce3..76d76e2 100644 --- a/resources/views/pages/ranges/edit.blade.php +++ b/resources/views/pages/ranges/edit.blade.php @@ -12,7 +12,7 @@ href="{{ route('bo.ranges.index') }}" title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.ranges')]) }}"> <i class="fa-solid fa-arrow-left"></i> </a> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $rangeModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.ranges.destroy', $rangeModel->id) }}" method="POST"> diff --git a/resources/views/pages/ranges/form-inputs.blade.php b/resources/views/pages/ranges/form-inputs.blade.php index 2b89184..d73193c 100644 --- a/resources/views/pages/ranges/form-inputs.blade.php +++ b/resources/views/pages/ranges/form-inputs.blade.php @@ -1,7 +1,7 @@ <div class="row"> {{-- NAME --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.name')) }}</legend> <div class="row"> <div class="col-12"> @@ -32,7 +32,7 @@ </div> {{-- PICTURE --}} <div class="col-12"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.picture')) }}</legend> <div class="row"> <div class="col-12"> diff --git a/resources/views/pages/ranges/index.blade.php b/resources/views/pages/ranges/index.blade.php index 52f0a34..ebcbab6 100644 --- a/resources/views/pages/ranges/index.blade.php +++ b/resources/views/pages/ranges/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') <a class="btn btn-primary float-right" data-bs-toggle="tooltip" data-bs-placement="top" href="{{ route('bo.ranges.create') }}" title="{{ __('crud.helpers.create_model', ['model' => Str::singular(__('models.classes.ranges'))]) }}"> <i class="fa-solid fa-plus"></i> diff --git a/resources/views/pages/settings/edit.blade.php b/resources/views/pages/settings/edit.blade.php index 7e7af3d..6dab752 100644 --- a/resources/views/pages/settings/edit.blade.php +++ b/resources/views/pages/settings/edit.blade.php @@ -8,7 +8,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3"> <div class="d-flex align-items-start flex-row"> - @include('breadcrumbs.breadcrumb-body', ['brParam' => $settingsModel]) + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $settingsModel]) </div> <div class="mb-md-0 mb-2"> <form class="confirmDeleteTS" action="{{ route('bo.settings.update', $settingsModel->id) }}" method="POST"> diff --git a/resources/views/pages/settings/form-inputs.blade.php b/resources/views/pages/settings/form-inputs.blade.php index 61aeb47..1f562ad 100644 --- a/resources/views/pages/settings/form-inputs.blade.php +++ b/resources/views/pages/settings/form-inputs.blade.php @@ -6,7 +6,7 @@ <div class="row"> {{-- NAME --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.name')) }}</legend> <div class="row"> <div class="col-12"> @@ -34,13 +34,13 @@ </div> {{-- START_DATE --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.start_date')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.start_date')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.timestamp-datetime', [ 'id' => 'settingsStartDate', - 'label' => Str::ucfirst(__('validation.attributes.start_date')), + 'label' => Str::ucfirst(__('validation.custom.start_date')), 'name' => 'start_date', 'defaultValue' => true, 'required' => true, @@ -53,13 +53,13 @@ </div> {{-- END_DATE --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.end_date')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.end_date')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.timestamp-datetime', [ 'id' => 'settingsEndDate', - 'label' => Str::ucfirst(__('validation.attributes.end_date')), + 'label' => Str::ucfirst(__('validation.custom.end_date')), 'name' => 'end_date', 'defaultValue' => true, 'required' => true, @@ -72,18 +72,18 @@ </div> {{-- NB_PARTICIPATION_PLAYER --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.nb_participation_player')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.nb_participation_player')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'settingsNbParticipationPlayer', - 'label' => Str::ucfirst(__('validation.attributes.nb_participation_player')), + 'label' => Str::ucfirst(__('validation.custom.nb_participation_player')), 'name' => 'nb_participation_player', 'required' => true, 'model' => $settingsModel ?? null, 'helper' => __('validation.min.numeric', [ - 'attribute' => Str::ucfirst(__('validation.attributes.nb_participation_player')), + 'attribute' => Str::ucfirst(__('validation.custom.nb_participation_player')), 'min' => 0, ]), 'min' => 0, @@ -94,18 +94,18 @@ </div> {{-- NB_PARTICIPATION_IP --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.nb_participation_ip')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.nb_participation_ip')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'settingsNbParticipationIp', - 'label' => Str::ucfirst(__('validation.attributes.nb_participation_ip')), + 'label' => Str::ucfirst(__('validation.custom.nb_participation_ip')), 'name' => 'nb_participation_ip', 'required' => true, 'model' => $settingsModel ?? null, 'helper' => __('validation.min.numeric', [ - 'attribute' => Str::ucfirst(__('validation.attributes.nb_participation_ip')), + 'attribute' => Str::ucfirst(__('validation.custom.nb_participation_ip')), 'min' => 0, ]), 'min' => 0, @@ -116,18 +116,18 @@ </div> {{-- NB_UNIQUE_CODE_USE --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.nb_unique_code_use')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.nb_unique_code_use')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'settingsNbUniqueCodeUse', - 'label' => Str::ucfirst(__('validation.attributes.nb_unique_code_use')), + 'label' => Str::ucfirst(__('validation.custom.nb_unique_code_use')), 'name' => 'nb_unique_code_use', 'required' => true, 'model' => $settingsModel ?? null, 'helper' => __('validation.min.numeric', [ - 'attribute' => Str::ucfirst(__('validation.attributes.nb_unique_code_use')), + 'attribute' => Str::ucfirst(__('validation.custom.nb_unique_code_use')), 'min' => 0, ]), 'min' => 0, @@ -138,13 +138,13 @@ </div> {{-- CODE_LENGTH --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.code_length')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.code_length')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ 'id' => 'settingsCodeLength', - 'label' => Str::ucfirst(__('validation.attributes.code_length')), + 'label' => Str::ucfirst(__('validation.custom.code_length')), 'name' => 'code_length', 'required' => false, 'disabled' => true, @@ -158,18 +158,18 @@ </div> {{-- USE_EAN_CODES --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.use_ean_codes')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.use_ean_codes')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsUseEANCodes', - 'label' => Str::ucfirst(__('validation.attributes.use_ean_codes')), + 'label' => Str::ucfirst(__('validation.custom.use_ean_codes')), 'name' => 'use_ean_codes', 'required' => false, 'model' => $settingsModel ?? null, 'helper' => __('validation.boolean', [ - 'attribute' => Str::ucfirst(__('validation.attributes.use_ean_codes')), + 'attribute' => Str::ucfirst(__('validation.custom.use_ean_codes')), ]), ]) </div> @@ -178,18 +178,18 @@ </div> {{-- ACTIVATED_TEASER --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.activated_teaser')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.activated_teaser')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsActivatedTeaser', - 'label' => Str::ucfirst(__('validation.attributes.activated_teaser')), + 'label' => Str::ucfirst(__('validation.custom.activated_teaser')), 'name' => 'activated_teaser', 'required' => false, 'model' => $settingsModel ?? null, 'helper' => __('validation.boolean', [ - 'attribute' => Str::ucfirst(__('validation.attributes.activated_teaser')), + 'attribute' => Str::ucfirst(__('validation.custom.activated_teaser')), ]), ]) </div> @@ -198,7 +198,7 @@ </div> {{-- TEASER_END_ACTIVITY --}} <div class="col-12 col-md-6 mb-3" id="teaser_end_activity"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.teaser_end_activity')) }}</legend> <div class="row"> <div class="col-12"> @@ -217,18 +217,18 @@ </div> {{-- ACTIVATED_CLOSE_PAGE --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.activated_close_page')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.activated_close_page')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsActivatedClosePage', - 'label' => Str::ucfirst(__('validation.attributes.activated_close_page')), + 'label' => Str::ucfirst(__('validation.custom.activated_close_page')), 'name' => 'activated_close_page', 'required' => false, 'model' => $settingsModel ?? null, 'helper' => __('validation.boolean', [ - 'attribute' => Str::ucfirst(__('validation.attributes.activated_close_page')), + 'attribute' => Str::ucfirst(__('validation.custom.activated_close_page')), ]), ]) </div> @@ -237,7 +237,7 @@ </div> {{-- CLOSE_PAGE_ACTIVE_DATE --}} <div class="col-12 col-md-6 mb-3" id="close_page_active_date"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.close_page_active_date')) }}</legend> <div class="row"> <div class="col-12"> @@ -256,8 +256,8 @@ </div> {{-- REDIRECT_CLOSE --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.redirect_close')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.redirect_close')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.varchar', [ @@ -276,18 +276,18 @@ </div> {{-- WINNING_PROOF --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.winning_proof')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.winning_proof')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsReductionsActivated', - 'label' => Str::ucfirst(__('validation.attributes.winning_proof')), + 'label' => Str::ucfirst(__('validation.custom.winning_proof')), 'name' => 'winning_proof', 'required' => false, 'model' => $settingsModel ?? null, 'helper' => __('validation.boolean', [ - 'attribute' => Str::ucfirst(__('validation.attributes.winning_proof')), + 'attribute' => Str::ucfirst(__('validation.custom.winning_proof')), ]), ]) </div> @@ -296,14 +296,14 @@ </div> {{-- COMPANY --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.company')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.company')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.varchar', [ 'id' => 'settingsCompany', 'label' => __('Nom de la :field', [ - 'field' => Str::ucfirst(__('validation.attributes.company')), + 'field' => Str::ucfirst(__('validation.custom.company')), ]), 'hasWordCounter' => true, 'name' => 'company', @@ -311,13 +311,13 @@ 'model' => $settingsModel ?? null, 'helper' => __('validation.between.string', [ 'attribute' => __('Nom de la :field', [ - 'field' => Str::ucfirst(__('validation.attributes.company')), + 'field' => Str::ucfirst(__('validation.custom.company')), ]), 'min' => 3, 'max' => 255, ]), 'placeholder' => __(':field', [ - 'field' => Str::ucfirst(__('validation.attributes.company')), + 'field' => Str::ucfirst(__('validation.custom.company')), ]), ]) </div> @@ -335,18 +335,18 @@ <div class="row"> {{-- REDUCTIONS_ACTIVATED --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.reductions_activated')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.reductions_activated')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.tinyint-boolean', [ 'id' => 'settingsReductionsActivated', - 'label' => Str::ucfirst(__('validation.attributes.reductions_activated')), + 'label' => Str::ucfirst(__('validation.custom.reductions_activated')), 'name' => 'reductions_activated', 'required' => false, 'model' => $settingsModel ?? null, 'helper' => __('validation.boolean', [ - 'attribute' => Str::ucfirst(__('validation.attributes.reductions_activated')), + 'attribute' => Str::ucfirst(__('validation.custom.reductions_activated')), ]), ]) </div> @@ -355,7 +355,7 @@ </div> {{-- REDUCTIONS_SITE --}} <div class="col-12 col-md-6 mb-3" id="reductions_site"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.reductions_site')) }}</legend> <div class="row"> <div class="col-12"> @@ -379,7 +379,7 @@ </div> {{-- REDUCTIONS_CAMPAIGN --}} <div class="col-12 col-md-6 mb-3" id="reductions_campaign"> - <fieldset class="h-100 border bg-white p-3"> + <fieldset class="h-100 border p-3"> <legend>{{ Str::ucfirst(__('validation.attributes.reductions_campaign')) }}</legend> <div class="row"> <div class="col-12"> @@ -437,8 +437,8 @@ <div class="row"> {{-- ANALYTICS --}} <div class="col-12 col-md-6 mb-3"> - <fieldset class="h-100 border bg-white p-3"> - <legend>{{ Str::ucfirst(__('validation.attributes.analytics')) }}</legend> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.analytics')) }}</legend> <div class="row"> <div class="col-12"> @include('back::partials.inputs.int-number', [ diff --git a/resources/views/pages/static_pages/edit.blade.php b/resources/views/pages/static_pages/edit.blade.php new file mode 100644 index 0000000..f2133de --- /dev/null +++ b/resources/views/pages/static_pages/edit.blade.php @@ -0,0 +1,39 @@ +@extends('back::layout', ['brParam' => $staticPageModel]) + +@section('title', __('Édition d\'un :model', ['model' => __('models.classes.static_page')])) +@section('description', __('Édition d\'un :model déjà existant', ['model' => __('models.classes.static_page')])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3"> + <div class="d-flex align-items-start flex-row"> + <a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.static_pages.index') }}" + title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.static_page'))]) }}"> + <i class="fa-solid fa-arrow-left"></i> + </a> + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $staticPageModel]) + </div> + <div class="mb-md-0 mb-2"> + <div class="btn-group"> + <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit" + title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.static_page')]) }}"> + {{ Str::ucfirst(__('crud.actions.save')) }} + </button> + </div> + </div> + </div> + <form action="{{ route('bo.static_pages.update', $staticPageModel) }}" method="POST" enctype="multipart/form-data"> + @csrf + @method('PUT') + @include('back::pages.static_pages.form') + <div class="row"> + <div class="col text-center"> + <button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit" + title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.static_page')]) }}"> + {{ Str::ucfirst(__('crud.actions.save')) }} + </button> + </div> + </div> + </form> +@endsection diff --git a/resources/views/pages/static_pages/form.blade.php b/resources/views/pages/static_pages/form.blade.php new file mode 100644 index 0000000..33abf29 --- /dev/null +++ b/resources/views/pages/static_pages/form.blade.php @@ -0,0 +1,171 @@ +<div class="row"> + {{-- ROLE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.static_page_type')) }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.tinyint-enum', [ + 'id' => 'userRole', + 'label' => __('Associer un rôle'), + 'name' => 'role', + 'model' => $staticPageModel ?? null, + 'required' => false, + 'disabled' => true, + 'associatedModels' => \App\Enums\StaticPageType::toArray(), + 'helper' => '', + ]) + </div> + </div> + </fieldset> + </div> + {{-- TITLE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.attributes.title')) }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.varchar', [ + 'id' => 'userFirstname', + 'label' => __('Titre de la :model', ['model' => trans_choice('models.classes.static_page', 1)]), + 'hasWordCounter' => true, + 'name' => 'title', + 'required' => true, + 'model' => $staticPageModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('titre de la :model', ['model' => trans_choice('models.classes.static_page', 1)]), + 'min' => 3, + 'max' => 255, + ]), + 'placeholder' => __('Un titre clair et concis'), + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + {{-- SEO_TITLE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.seo_title')) }}</legend> + <div class="row"> + <div class="col-12 mb-3"> + @include('back::partials.inputs.varchar', [ + 'id' => 'staticPagesSeoTitle', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'hasWordCounter' => true, + 'name' => 'seo_title', + 'required' => true, + 'model' => $staticPageModel ?? null, + 'helper' => sprintf( + '%s %s', + __('crud.helpers.seo_title'), + __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.custom.seo_title'), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'min' => 45, + 'max' => 70, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + ]) + </div> + </div> + </fieldset> + </div> + {{-- SEO_DESCRIPTION --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.seo_description')) }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.varchar-multiline', [ + 'id' => 'staticPagesSeoDescription', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'name' => 'seo_description', + 'model' => $staticPageModel ?? null, + 'required' => true, + 'helper' => sprintf( + '%s %s', + __('crud.helpers.seo_description'), + __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.custom.seo_description'), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'min' => 50, + 'max' => 160, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + {{-- CONTENT --}} + <div class="col-12 mb-3"> + <fieldset class="border p-3"> + <legend>{{ Str::ucfirst(__('validation.attributes.content')) }}</legend> + <div class="row mb-3"> + <div class="col-12"> + @include('back::partials.inputs.text-html', [ + 'id' => 'articleContent', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.attributes.content')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'name' => 'content', + 'model' => $staticPageModel ?? null, + 'required' => true, + 'helper' => __('crud.minicrud.text_warning'), + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col text-center"> + <p><b>{{ __('* Champs obligatoires') }}</b></p> + </div> +</div> + +@push('scripts') + <script nonce="{{ $nonce }}"> + document.addEventListener("DOMContentLoaded", () => { + // Submit button clone. + const submit = document.getElementById('formSubmit') + submitClone = document.getElementById('formSubmitClone'); + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + </script> +@endpush diff --git a/resources/views/pages/static_pages/index-list.blade.php b/resources/views/pages/static_pages/index-list.blade.php new file mode 100644 index 0000000..2a9a6bf --- /dev/null +++ b/resources/views/pages/static_pages/index-list.blade.php @@ -0,0 +1,45 @@ +<table class="table-hover table-fix-action m-0 table"> + @if (count($staticPageModelList) > 0) + <thead> + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'type' => Str::ucfirst(__('validation.custom.static_page_type')), + 'title' => Str::ucfirst(__('validation.attributes.title')), + 'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')), + ], + ]) + </thead> + <tbody> + @foreach ($staticPageModelList as $staticPageModel) + <tr class="border-bottom list-item"> + <td class="text-center align-middle">{{ $staticPageModel->type->label() }}</td> + <td class="text-center align-middle">{{ $staticPageModel->title }}</td> + <td class="text-center align-middle"> + <span class="badge bg-secondary">{{ $staticPageModel->updated_at->isoFormat('LLLL') }}</span> + </td> + <td class="text-end align-middle"> + @canAny(['update'], $staticPageModel) + <div class="btn-group"> + @can('update', $staticPageModel) + <a class="btn btn-sm btn-primary" data-bs-toggle="tooltip" + href="{{ route('bo.static_pages.edit', ['static_page' => $staticPageModel]) }}" + title="{{ Str::ucfirst(__('crud.actions.update')) }}"> + <i class="fa-solid fa-pencil"></i> + </a> + @endcan + </div> + @else + <span class="text-danger" data-bs-toggle="tooltip" title="{{ __('list.right') }}"> + <i class="fa-solid fa-ban"></i> + </span> + @endcan + </td> + </tr> + @endforeach + </tbody> + @else + <tr> + <td class="border-0">{{ __('crud.other.no_model_found', ['model' => __('models.classes.static_page')]) }}</td> + </tr> + @endif +</table> diff --git a/resources/views/pages/static_pages/index.blade.php b/resources/views/pages/static_pages/index.blade.php new file mode 100644 index 0000000..0652d35 --- /dev/null +++ b/resources/views/pages/static_pages/index.blade.php @@ -0,0 +1,15 @@ +@extends('back::layout') + +@section('title', Str::ucfirst(__('models.classes.static_page'))) +@section('description', __('Liste de tous les :model', ['model' => Str::plural(__('models.classes.static_page'))])) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> + @include('modules.breadcrumbs.breadcrumb-body') + </div> + @include('back::modules.search-bar') + <div class="table-responsive mb-3"> + @include('back::pages.static_pages.index-list') + </div> + {{ $staticPageModelList->links() }} +@endsection diff --git a/resources/views/pages/users/create.blade.php b/resources/views/pages/users/create.blade.php new file mode 100644 index 0000000..a7a860c --- /dev/null +++ b/resources/views/pages/users/create.blade.php @@ -0,0 +1,36 @@ +@extends('back::layout', ['brParam' => $userModel]) + +@section('title', __('Création d\'un :model', ['model' => __('models.classes.user')])) +@section('description', __('Création d\'un tout nouveau :model', ['model' => __('models.classes.user')])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3"> + <div class="d-flex align-items-start flex-row"> + <a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.users.index') }}" + title="{{ __('crud.helpers.list_all', ['model' => __('models.classes.user')]) }}"> + <i class="fa-solid fa-arrow-left"></i> + </a> + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $userModel]) + </div> + <div class="mb-md-0 mb-2"> + <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit" + title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.user')]) }}"> + {{ Str::ucfirst(__('crud.actions.save')) }} + </button> + </div> + </div> + <form action="{{ route('bo.users.store') }}" method="POST" enctype="multipart/form-data"> + @csrf + @include('back::pages.users.form') + <div class="row mt-3"> + <div class="col text-center"> + <button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit" + title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.user')]) }}"> + {{ Str::ucfirst(__('crud.actions.save')) }} + </button> + </div> + </div> + </form> +@endsection diff --git a/resources/views/pages/users/edit.blade.php b/resources/views/pages/users/edit.blade.php new file mode 100644 index 0000000..bdb3ff5 --- /dev/null +++ b/resources/views/pages/users/edit.blade.php @@ -0,0 +1,52 @@ +@extends('back::layout', ['brParam' => $userModel]) + +@section('title', __('Édition d\'un :model', ['model' => __('models.classes.user')])) +@section('description', __('Édition d\'un :model déjà existant', ['model' => __('models.classes.user')])) +@section('breadcrumb', + request()->route()->getName()) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap pb-3"> + <div class="d-flex align-items-start flex-row"> + <a class="btn btn-primary text-decoration-none m-0" data-bs-toggle="tooltip" href="{{ route('bo.users.index') }}" + title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.user'))]) }}"> + <i class="fa-solid fa-arrow-left"></i> + </a> + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $userModel]) + </div> + <div class="mb-md-0 mb-2"> + <form class="btn-group confirmDeleteTS" action="{{ route('bo.users.destroy', $userModel) }}" method="POST" novalidate> + @can('duplicate', $userModel) + <a class="btn btn-secondary" data-bs-toggle="tooltip" href="{{ route('bo.users.duplicate', ['user' => $userModel]) }}" + title="{{ Str::ucfirst(__('crud.actions.duplicate')) }}"> + <i class="fa-solid fa-copy"></i> + </a> + @endcan + <button class="btn btn-primary" id="formSubmitClone" data-bs-toggle="tooltip" type="submit" + title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.user')]) }}"> + {{ Str::ucfirst(__('crud.actions.save')) }} + </button> + @can('delete', $userModel) + @csrf + @method('DELETE') + <button class="btn btn-danger" data-bs-toggle="tooltip" type="submit" title="{{ Str::ucfirst(__('crud.actions.delete')) }}"> + <i class="fa-solid fa-trash"></i> + </button> + @endcan + </form> + </div> + </div> + <form action="{{ route('bo.users.update', $userModel) }}" method="POST" enctype="multipart/form-data"> + @csrf + @method('PUT') + @include('back::pages.users.form') + <div class="row"> + <div class="col text-center"> + <button class="btn btn-primary" id="formSubmit" data-bs-toggle="tooltip" type="submit" + title="{{ __('crud.helpers.save_model', ['model' => __('models.classes.user')]) }}"> + {{ Str::ucfirst(__('crud.actions.save')) }} + </button> + </div> + </div> + </form> +@endsection diff --git a/resources/views/pages/users/form.blade.php b/resources/views/pages/users/form.blade.php new file mode 100644 index 0000000..15f2b1d --- /dev/null +++ b/resources/views/pages/users/form.blade.php @@ -0,0 +1,173 @@ +<div class="row"> + {{-- FIRSTNAME --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Prénom') }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.varchar', [ + 'id' => 'userFirstname', + 'label' => __('Prénom de l\':model', ['model' => __('models.classes.user')]), + 'hasWordCounter' => true, + 'name' => 'first_name', + 'required' => true, + 'model' => $userModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('prénom de l\':model', ['model' => __('models.classes.user')]), + 'min' => 3, + 'max' => 255, + ]), + 'placeholder' => __('Un beau prénom'), + ]) + </div> + </div> + </fieldset> + </div> + {{-- LASTNAME --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Nom') }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.varchar', [ + 'id' => 'userLastname', + 'label' => __('Nom de l\':model', ['model' => __('models.classes.user')]), + 'hasWordCounter' => true, + 'name' => 'last_name', + 'required' => true, + 'model' => $userModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('nom de l\':model', ['model' => __('models.classes.user')]), + 'min' => 3, + 'max' => 255, + ]), + 'placeholder' => __('Un beau nom'), + ]) + </div> + </div> + </fieldset> + </div> + {{-- EMAIL --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('E-mail') }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.varchar-email', [ + 'id' => 'userEmail', + 'label' => __('E-mail de l\':model', ['model' => __('models.classes.user')]), + 'name' => 'email', + 'required' => true, + 'model' => $userModel ?? null, + 'helper' => __('validation.email', [ + 'attribute' => __('E-mail de l\':model', ['model' => __('models.classes.user')]), + ]), + 'placeholder' => __('aaaa.bbb@gmail.com'), + ]) + </div> + </div> + </fieldset> + </div> + {{-- ROLE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Rôle') }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.tinyint-enum', [ + 'id' => 'userRole', + 'label' => __('Associer un rôle'), + 'name' => 'role', + 'model' => $userModel ?? null, + 'required' => true, + 'associatedModels' => Arr::where( + \App\Enums\Users\RoleEnum::toArray(), + fn(object $role) => $role->value >= + auth('backend')->user()->role->value()), + 'helper' => __('Sélectionnez un rôle dans la liste déroulante.'), + ]) + </div> + </div> + </fieldset> + </div> + {{-- PASSWORD --}} + <div class="col-12 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Mot de passe') }}</legend> + <div class="row"> + <div class="col-12 col-md-6 mb-3"> + @include('back::partials.inputs.varchar-password', [ + 'id' => 'userPassword', + 'label' => __('Mot de passe de l\':model', ['model' => __('models.classes.user')]), + 'name' => 'password', + 'hasWordCounter' => true, + 'required' => !$userModel->exists, + 'model' => null, + 'helper' => __( + 'Doît respecter certaines contraintes (8 caractères minimum, lettres, chiffres, caractères spéciaux).'), + ]) + </div> + <div class="col-12 col-md-6 mb-3"> + @include('back::partials.inputs.varchar-password', [ + 'id' => 'userPassword_confirmation', + 'label' => __('Confirmation du mot de passe de l\':model', [ + 'model' => __('models.classes.user'), + ]), + 'name' => 'password_confirmation', + 'hasWordCounter' => true, + 'required' => !$userModel->exists, + 'model' => null, + 'helper' => __('Doît correspondre au mot de passe saisi précédemment.'), + ]) + </div> + </div> + </fieldset> + </div> + {{-- STATUS --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ __('Visibilité') }}</legend> + <div class="row"> + <div class="col-12"> + @include('back::partials.inputs.tinyint-boolean', [ + 'id' => 'userPublished', + 'name' => 'published', + 'label' => __('État de publication de l\':model', ['model' => __('models.classes.user')]), + 'helper' => __('Deux réponses possibles : oui ou non.'), + 'model' => $userModel ?? null, + ]) + </div> + </div> + </fieldset> + </div> + <div class="row"> + <div class="col text-center"> + <p><b>{{ __('* Champs obligatoires') }}</b></p> + </div> + </div> +</div> + +@push('scripts') + <script nonce="{{ $nonce }}"> + document.addEventListener("DOMContentLoaded", () => { + // Submit button clone. + const submit = document.getElementById('formSubmit') + submitClone = document.getElementById('formSubmitClone'); + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + + // If we edit the password, the confirmation is required. + const passwordInput = document.getElementById('userPassword'); + const confirmPasswordInput = document.getElementById('userPassword_confirmation'); + passwordInput.addEventListener('input', () => { + if (passwordInput.value !== '') { + confirmPasswordInput.required = true; + } else { + confirmPasswordInput.required = false; + } + }) + }); + </script> +@endpush diff --git a/resources/views/pages/users/index-list.blade.php b/resources/views/pages/users/index-list.blade.php new file mode 100644 index 0000000..5ecbd72 --- /dev/null +++ b/resources/views/pages/users/index-list.blade.php @@ -0,0 +1,70 @@ +<table class="table-hover table-fix-action m-0 table"> + @if (count($userModels) > 0) + <thead> + @include('back::modules.table-col-sorter', [ + 'cols' => [ + 'role' => Str::ucfirst(__('validation.attributes.role')), + 'first_name' => Str::ucfirst(__('validation.attributes.first_name')), + 'last_name' => Str::ucfirst(__('validation.attributes.last_name')), + 'email' => Str::ucfirst(__('validation.attributes.email')), + 'published' => Str::ucfirst(__('validation.custom.activated')), + 'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')), + ], + ]) + </thead> + <tbody> + @foreach ($userModels as $userModel) + <tr class="border-bottom list-item"> + <td class="text-center align-middle">{{ $userModel->role->label() }}</td> + <td class="text-center align-middle">{{ $userModel->first_name }}</td> + <td class="text-center align-middle">{{ $userModel->last_name }}</td> + <td class="text-center align-middle">{{ $userModel->email }}</td> + @include('back::modules.change-published-status', [ + 'routeName' => 'users', + 'model' => $userModel, + ]) + <td class="text-center align-middle"> + <span class="badge bg-secondary">{{ $userModel->updated_at->isoFormat('LLLL') }}</span> + </td> + <td class="text-end align-middle"> + @canAny(['delete', 'duplicate', 'update'], $userModel) + <form class="btn-group confirmDeleteTS" action="{{ route('bo.users.destroy', $userModel) }}" method="POST" + novalidate> + @can('duplicate', $userModel) + <a class="btn btn-sm btn-secondary" data-bs-toggle="tooltip" + href="{{ route('bo.users.duplicate', ['user' => $userModel]) }}" + title="{{ Str::ucfirst(__('crud.actions.duplicate')) }}"> + <i class="fa-solid fa-copy"></i> + </a> + @endcan + @can('update', $userModel) + <a class="btn btn-sm btn-primary" data-bs-toggle="tooltip" + href="{{ route('bo.users.edit', ['user' => $userModel]) }}" + title="{{ Str::ucfirst(__('crud.actions.update')) }}"> + <i class="fa-solid fa-pencil"></i> + </a> + @endcan + @can('delete', $userModel) + @csrf + @method('DELETE') + <button class="btn btn-sm btn-danger" data-bs-toggle="tooltip" type="submit" + title="{{ Str::ucfirst(__('crud.actions.delete')) }}"> + <i class="fa-solid fa-trash"></i> + </button> + @endcan + </form> + @else + <span class="text-danger" data-bs-toggle="tooltip" title="{{ __('list.right') }}"> + <i class="fa-solid fa-ban"></i> + </span> + @endcan + </td> + </tr> + @endforeach + </tbody> + @else + <tr> + <td class="border-0">{{ __('crud.other.no_model_found', ['model' => __('models.classes.user')]) }}</td> + </tr> + @endif +</table> diff --git a/resources/views/pages/users/index.blade.php b/resources/views/pages/users/index.blade.php new file mode 100644 index 0000000..e0e7ab4 --- /dev/null +++ b/resources/views/pages/users/index.blade.php @@ -0,0 +1,21 @@ +@extends('back::layout') + +@section('title', Str::ucfirst(__('models.classes.user'))) +@section('description', __('Liste de tous les :model', ['model' => Str::plural(__('models.classes.user'))])) + +@section('content') + <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> + @include('modules.breadcrumbs.breadcrumb-body') + @can('create', \App\Models\User::class) + <a class="btn btn-primary float-right" data-bs-toggle="tooltip" href="{{ route('bo.users.create') }}" + title="{{ __('crud.helpers.create_model', ['model' => __('models.classes.user')]) }}"> + <i class="fa-solid fa-plus"></i> + </a> + @endcan + </div> + @include('back::modules.search-bar') + <div class="table-responsive mb-3"> + @include('back::pages.users.index-list') + </div> + {{ $userModels->links() }} +@endsection diff --git a/resources/views/pages/winners-list/index.blade.php b/resources/views/pages/winners-list/index.blade.php index 5b65a7e..425a463 100644 --- a/resources/views/pages/winners-list/index.blade.php +++ b/resources/views/pages/winners-list/index.blade.php @@ -5,7 +5,7 @@ @section('content') <div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap"> - @include('breadcrumbs.breadcrumb-body') + @include('modules.breadcrumbs.breadcrumb-body') </div> <table class="table-hover table"> @if (count($participationModels) > 0) diff --git a/resources/views/partials/inputs/varchar-email.blade.php b/resources/views/partials/inputs/varchar-email.blade.php new file mode 100644 index 0000000..4a2c2e1 --- /dev/null +++ b/resources/views/partials/inputs/varchar-email.blade.php @@ -0,0 +1,33 @@ +{{-- + VARIABLE || COMMENT || TYPE || REQUIRED || DEFAULT + + $id || The id of the input tag. || string || REQUIRED || + $name || The name of the input tag. || string || REQUIRED || + $helper || The helper of the input. || string || REQUIRED || + $label || The text displayed as a label. || string || OPTIONNAL || null + $required || Is the field required ? || boolean || OPTIONNAL || false + $placeholder || The placeholder of the input. || string || OPTIONNAL || __('aaa.bbb@example.com') + $model || The model we're creating/editing || Model class || OPTIONNAL || null +--}} + +@if(!empty($label)) +<label for="{{ $id }}" class="col-form-label"> + <b>{{ $label }} {{ $required ?? false ? '*' : '' }}</b> +</label> +@endif +<input + name="{{ $name }}" + type="email" + value="{{ old($name, $model->{$name} ?? '') }}" + class="form-control @if($errors->has($name)) is-invalid @endif" + id="{{ $id }}" + aria-describedby="{{ $id }}Help" + placeholder="{{ $placeholder ?? __('aaa.bbb@example.com') }}" + @if(!empty($required)) + required + @endif> +@include('modules.input-error', [ + 'inputName' => $name, + 'helperId' => '{{ $id }}Help', + 'helper' => $helper +]) diff --git a/resources/views/partials/inputs/varchar-password.blade.php b/resources/views/partials/inputs/varchar-password.blade.php new file mode 100644 index 0000000..c779b0e --- /dev/null +++ b/resources/views/partials/inputs/varchar-password.blade.php @@ -0,0 +1,44 @@ +{{-- + VARIABLE || COMMENT || TYPE || REQUIRED || DEFAULT + + $id || The id of the input tag. || string || REQUIRED || + $name || The name of the input tag. || string || REQUIRED || + $helper || The helper of the input. || string || REQUIRED || + $label || The text displayed as a label. || string || OPTIONNAL || null + $required || Is the field required ? || boolean || OPTIONNAL || false + $placeholder || The placeholder of the input. || string || OPTIONNAL || __('Un beau mot de passe') + $hasWordCounter || Is the WordCounter needed ? || boolean || OPTIONNAL || false + $model || The model we're creating/editing || Model class || OPTIONNAL || null +--}} + +@if(!empty($label)) +<label for="{{ $id }}" class="col-form-label"> + <b>{{ $label }} {{ $required ?? false ? '*' : '' }}</b> +</label> +@endif +@if(!empty($hasWordCounter ?? false)) +<div class="word-counter" data-json='@json(['id'=> "$id"])'></div> +@endif +<div class="col-12 input-group d-flex w-100 justify-content-center"> + <input id="{{ $id }}" + name="{{ $name }}" + type="password" + value="{{ old($name, $model->{$name} ?? '') }}" + class="form-control @if($errors->has($name)) is-invalid @endif @if(!empty($hasWordCounter ?? false)) need-word-counter-password @endif" + id="{{ $id }}" + aria-describedby="{{ $id }}Help" + placeholder="{{ $placeholder ?? __('Un beau mot de passe') }}" + autocomplete="current-password" + @if(!empty($required)) + required + @endif> + @php $dataPassword = ['inputId' => $id]; @endphp + <span class="btn btn-primary password-visibility w-fit d-flex justify-content-center align-items-center p-0 @if(!empty($hasWordCounter ?? false)) need-word-counter-password-btn @endif" + data-json='@json($dataPassword)'> + </span> +</div> +@include('modules.input-error', [ + 'inputName' => $name, + 'helperId' => $id . 'Help', + 'helper' => $helper +]) diff --git a/resources/views/vendor/errors/illustrated-layout.blade.php b/resources/views/vendor/errors/illustrated-layout.blade.php index a277a37..75db5ed 100644 --- a/resources/views/vendor/errors/illustrated-layout.blade.php +++ b/resources/views/vendor/errors/illustrated-layout.blade.php @@ -7,7 +7,7 @@ <title>@yield('title') - @vite(['resources/sass/bo/bo.scss']) + @vite(['resources/sass/bo.scss']) @stack('scripts') diff --git a/resources/views/vendor/errors/minimal.blade.php b/resources/views/vendor/errors/minimal.blade.php index f20ce4d..6d5121b 100644 --- a/resources/views/vendor/errors/minimal.blade.php +++ b/resources/views/vendor/errors/minimal.blade.php @@ -13,7 +13,7 @@ } - @vite(['resources/sass/bo/bo.scss']) + @vite(['resources/sass/bo.scss']) @stack('scripts') diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index d183029..4327025 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -1,15 +1,16 @@ push(__('models.classes.contents'), route('bo.contents.index')); +Breadcrumbs::for('bo.static_pages.index', function (Generator $trail) { + $trail->push(Str::ucfirst(trans_choice('models.classes.static_page', '*')), route('bo.static_pages.index')); }); -Breadcrumbs::for('bo.contents.edit', function (Generator $trail, Content $content) { - $trail->parent('bo.contents.index'); - $trail->push(__('crud.actions.edit'), route('bo.contents.edit', $content->id)); +Breadcrumbs::for('bo.static_pages.edit', function (Generator $trail, StaticPage $page) { + $trail->parent('bo.static_pages.index'); + $trail->push(__('crud.actions.edit'), route('bo.static_pages.edit', $page)); }); // * FAQ - QUESTIONS @@ -123,7 +124,7 @@ Breadcrumbs::for('bo.winners-list', function (Generator $trail) { // * UNIQUES CODES Breadcrumbs::for('bo.codes', function (Generator $trail) { - $trail->push(__('models.classes.codes'), route('bo.codes')); + $trail->push(trans('codes uniques'), route('bo.codes')); }); Breadcrumbs::for('bo.codes.search', function (Generator $trail) { $trail->parent('bo.codes'); diff --git a/routes/web-bo.php b/routes/web-bo.php index 5270490..52ac13a 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -1,8 +1,8 @@ name('bo.')->group(function () { + // * Authenticable routes Route::namespace('\App\Http\Controllers\Bo')->group(function () { Auth::routes( [ @@ -30,47 +33,70 @@ Route::prefix('bo')->name('bo.')->group(function () { ] ); }); - Route::middleware(['auth:backend', 'is-admin', 'is-super-admin'])->group(function () { - Route::get('/', [DashboardController::class, 'index']) - ->name('dashboard')->withoutMiddleware('is-super-admin'); - // * BANNED IPS - Route::resource('/bannedips', BannedIpController::class)->except('show'); - // * CONTENTS - Route::resource('/contents', ContentController::class) - ->only(['index', 'edit', 'update']) - ->withoutMiddleware('htmlsanitize') - ->middleware(['htmlsanitize:value']); - // * FAQ - THEMES - Route::resource('/faq-themes', FaqThemesController::class)->except('show'); - // * FAQ - QUESTIONS - Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); - // * GAIN VIEWS - Route::resource('/gain-views', GainViewController::class)->except('show'); - // * PRIZES - Route::resource('/prizes', PrizesController::class) - ->except('show') - ->withoutMiddleware('htmlsanitize') - ->middleware(['htmlsanitize:arg_content']); - // * RANGES - Route::resource('ranges', RangeController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); - // * PRODUCTS - Route::resource('products', ProductsController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); - // * SETTINGS. - Route::resource('/settings', SettingsController::class) - ->only(['edit', 'update']); - // * WINNERS LIST - Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); - // * INSTANT WIN - Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); - Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); - // * UNIQUES CODES. - Route::get('/codes', [CodesController::class, 'index'])->name('codes'); - Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); - Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); - Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); + Route::middleware('auth:backend')->group(function () { + Route::get('/', [DashboardController::class, 'index'])->name('dashboard'); + + // * USERS. + Route::resource('users', UserController::class)->except('show'); + Route::patch('/users/{user}/change-published', [ + UserController::class, 'changePublished' + ])->name('users.change-published'); + Route::get('/users/{user}/duplicate', [ + UserController::class, 'duplicate' + ])->name('users.duplicate'); + + // * StaticPages + Route::resource('pages', StaticPageController::class) + ->names([ + 'index' => 'static_pages.index', + 'edit' => 'static_pages.edit', + 'update' => 'static_pages.update', + ])->parameters(['pages' => 'static_page']) + ->only(['index', 'edit', 'update']); + + Route::middleware('can:isConceptor')->group(function () { + // * ACTIVITY LOGS. + Route::resource('activity_logs', ActivityLogController::class)->only(['index', 'show']); + }); + + Route::middleware(['is-super-admin'])->group(function () { + // * FAQ - THEMES + Route::resource('/faq-themes', FaqThemesController::class)->except('show'); + // * FAQ - QUESTIONS + Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); + // * GAIN VIEWS + Route::resource('/gain-views', GainViewController::class)->except('show'); + // * PRIZES + Route::resource('/prizes', PrizesController::class) + ->except('show') + ->withoutMiddleware('htmlsanitize') + ->middleware(['htmlsanitize:arg_content']); + // * RANGES + Route::resource('ranges', RangeController::class) + ->except('show') + ->withoutMiddleware('is-super-admin'); + // * PRODUCTS + Route::resource('products', ProductsController::class) + ->except('show') + ->withoutMiddleware('is-super-admin'); + // * SETTINGS. + Route::resource('/settings', SettingsController::class) + ->only(['edit', 'update']); + // * WINNERS LIST + Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); + // * INSTANT WIN + Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); + Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); + // * UNIQUES CODES. + Route::get('/codes', [CodesController::class, 'index'])->name('codes'); + Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); + Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); + Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); + + // * BANNED IPS + Route::resource('/bannedips', BannedIpController::class)->except('show'); + }); }); + // * Others routes + Route::post('theme/set', [Controller::class, 'setTheme'])->name('theme.set'); }); diff --git a/routes/web-fo.php b/routes/web-fo.php index c0fb325..7947f2b 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -27,7 +27,7 @@ Route::middleware(['throttle:credentials'])->name('fo.')->group(function () { Route::put('/rejouer', [WinningProofController::class, 'sendWinningProof']) ->name('send-winning-proof'); }); - Route::get('/', [HomeController::class, 'home'])->name('home'); + Route::get('/', [HomeController::class, 'home'])->name('homepage'); Route::get('/reglement', [ViewContentController::class, 'reglement'])->name('reglement'); Route::get('/charte', [ViewContentController::class, 'charte'])->name('charte'); diff --git a/vite.config.ts b/vite.config.ts index fed29d1..ab0995f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -71,8 +71,8 @@ export default defineConfig({ }), laravel({ input: [ - "resources/sass/bo/bo.scss", - "resources/ts/bo/bo.ts", + "resources/sass/bo.scss", + "resources/ts/bo.ts", "resources/theme/mounted/sass/fo.scss", "resources/theme/mounted/ts/fo.ts", ], @@ -82,8 +82,6 @@ export default defineConfig({ targets: [ { src: [ - // * Logo for Bo error pages - path.normalize("resources/assets/images/engine/logo.png"), // * Engine copy (Default favicon) path.normalize("resources/favicon/android-chrome-192x192.png"), path.normalize("resources/favicon/android-chrome-512x512.png"), From b79b7dc151b760dc0867cd70716a5b39bfc2a2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Fri, 24 Nov 2023 09:52:56 +0100 Subject: [PATCH 030/145] Fixes on Bo --- app/Enums/StaticPageType.php | 10 ++- .../Controllers/Bo/Auth/LoginController.php | 2 +- .../Controllers/Bo/GainViewController.php | 2 +- app/Http/Controllers/Bo/PrizesController.php | 6 +- .../Controllers/Bo/ProductsController.php | 4 +- database/seeders/StaticPageSeeder.php | 10 +-- resources/lang/fr/validation.php | 1 + resources/views/layouts/nav-list.blade.php | 65 +++++++++++-------- .../pages/gain-views/form-inputs.blade.php | 8 +-- .../views/pages/gain-views/index.blade.php | 2 +- .../views/pages/prizes/form-inputs.blade.php | 32 ++++----- resources/views/pages/prizes/index.blade.php | 4 +- .../pages/products/form-inputs.blade.php | 14 ++-- .../views/pages/products/index.blade.php | 4 +- .../views/pages/ranges/form-inputs.blade.php | 2 +- routes/breadcrumbs-bo.php | 2 +- 16 files changed, 90 insertions(+), 78 deletions(-) diff --git a/app/Enums/StaticPageType.php b/app/Enums/StaticPageType.php index 17735c1..388da85 100644 --- a/app/Enums/StaticPageType.php +++ b/app/Enums/StaticPageType.php @@ -8,18 +8,16 @@ enum StaticPageType: int { use BaseEnum; - case contact = 1; - case legals = 2; - case rules = 3; - case confidentiality = 4; + case legals = 1; + case rules = 2; + case confidentiality = 3; /** * Optionnal labels definition. */ private const LABELS = [ - self::contact->name => 'Contact', self::legals->name => 'Mentions légales', self::rules->name => 'Règlement', - self::confidentiality->name => 'Charte de confidentialité', + self::confidentiality->name => 'Charte de confidentialité' ]; } diff --git a/app/Http/Controllers/Bo/Auth/LoginController.php b/app/Http/Controllers/Bo/Auth/LoginController.php index 314f43e..7c9aad3 100644 --- a/app/Http/Controllers/Bo/Auth/LoginController.php +++ b/app/Http/Controllers/Bo/Auth/LoginController.php @@ -40,7 +40,7 @@ class LoginController extends Controller */ public function showLoginForm(): View { - return view('bo.auth.login'); + return view('back::auth.login'); } /** diff --git a/app/Http/Controllers/Bo/GainViewController.php b/app/Http/Controllers/Bo/GainViewController.php index 95a15c9..17cebca 100644 --- a/app/Http/Controllers/Bo/GainViewController.php +++ b/app/Http/Controllers/Bo/GainViewController.php @@ -36,7 +36,7 @@ class GainViewController extends Controller $searchFields = \sprintf( '%s, %s ...', trans('validation.attributes.name'), - trans('validation.attributes.file_name'), + trans('validation.custom.file_name'), ); /** Sort columns with a query */ diff --git a/app/Http/Controllers/Bo/PrizesController.php b/app/Http/Controllers/Bo/PrizesController.php index 6d1f719..a12b8be 100644 --- a/app/Http/Controllers/Bo/PrizesController.php +++ b/app/Http/Controllers/Bo/PrizesController.php @@ -22,7 +22,7 @@ class PrizesController extends Controller public function index(Request $request): \Illuminate\Contracts\View\View { /** @var \Illuminate\Database\Eloquent\Builder $prizeModels */ - $prizeModels = Prize::query(); + $prizeModels = Prize::query()->with('gainView'); /** @var string $search Search field */ $search = $request->search; @@ -37,8 +37,8 @@ class PrizesController extends Controller } $searchFields = \sprintf( '%s, %s ...', - Str::ucfirst(__('validation.attributes.label_one')), - __('validation.attributes.label_many'), + Str::ucfirst(__('validation.custom.label_one')), + __('validation.custom.label_many'), ); /** Sort columns with a query */ diff --git a/app/Http/Controllers/Bo/ProductsController.php b/app/Http/Controllers/Bo/ProductsController.php index 4d0ea50..271fd8d 100644 --- a/app/Http/Controllers/Bo/ProductsController.php +++ b/app/Http/Controllers/Bo/ProductsController.php @@ -39,8 +39,8 @@ class ProductsController extends Controller $searchFields = \sprintf( '%s, %s, %s ...', Str::ucfirst(__('validation.attributes.name')), - __('validation.attributes.no_art'), - __('validation.attributes.ean_code'), + __('validation.custom.no_art'), + __('validation.custom.ean_code'), ); /** Sort columns with a query */ diff --git a/database/seeders/StaticPageSeeder.php b/database/seeders/StaticPageSeeder.php index eb60d6c..6752f52 100644 --- a/database/seeders/StaticPageSeeder.php +++ b/database/seeders/StaticPageSeeder.php @@ -17,13 +17,13 @@ class StaticPageSeeder extends Seeder { StaticPage::query()->updateOrCreate( [ - 'type' => StaticPageType::contact, + 'type' => StaticPageType::confidentiality, ], [ - 'seo_title' => 'Seo title pour la page contactez nous', - 'seo_description' => 'Seo description pour la page contactez nous', - 'title' => 'Contactez-nous', - 'type' => StaticPageType::contact, + 'seo_title' => 'Seo title pour la page de confidentialité', + 'seo_description' => 'Seo description pour la page de confidentialité', + 'title' => 'Page de confidentialitée', + 'type' => StaticPageType::confidentiality, 'content' => \clean(\fake()->randomHtml(6, 7)), ] ); diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index cb2ebd6..77e4b68 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -214,6 +214,7 @@ return [ 'username' => 'nom d\'utilisateur', 'year' => 'année', ], + 'ean' => 'Le champ :attribute doit être un code EAN valide (7, 8 ou 13 chiffres)', 'custom' => [ 'of_the' => [ 'male' => 'du ', diff --git a/resources/views/layouts/nav-list.blade.php b/resources/views/layouts/nav-list.blade.php index 7969996..6fdbea2 100644 --- a/resources/views/layouts/nav-list.blade.php +++ b/resources/views/layouts/nav-list.blade.php @@ -9,36 +9,45 @@ @superadmin @@ -46,52 +55,56 @@ @admin @endadmin @superadmin @@ -100,7 +113,7 @@ @canAny(['isConceptor', 'viewAny'], \App\Models\User::class) - @superadmin + @if (auth('backend')->user()->can('viewAny', \App\Models\InstantWin::class) or + auth('backend')->user()->can('viewWinnerList', \App\Models\Participation::class) or + auth('backend')->user()->can('viewAny', \App\Models\BannedIp::class) or + auth('backend')->user()->can('generate', \App\Models\Code::class)) + @endif + + @can('viewAny', \App\Models\Prize::class) - @endsuperadmin + @endcan - @admin + @if (auth('backend')->user()->can('viewAny', \App\Models\Range::class) or + auth('backend')->user()->can('viewAny', \App\Models\Product::class)) - @endadmin - @superadmin + @endif + + @can('update', \App\Models\StaticPage::class) - @endsuperadmin + @endif - @canAny(['isConceptor', 'viewAny'], \App\Models\User::class) + @if (auth('backend')->user()->can('viewAny', \App\Models\User::class) or + auth('backend')->user()->can('viewAny', \App\Models\User::class) or + auth('backend')->user()->can('isConceptor'))